from machine import Pin
import time
# Pin definitions
SHCP_PIN = Pin(26, Pin.OUT) # Clock pin for 74HC595
STCP_PIN = Pin(27, Pin.OUT) # Latch pin for 74HC595
DS_PIN = Pin(28, Pin.OUT) # Data pin for 74HC595
# Create list of bar graph pins
BAR_PINS = [Pin(i, Pin.OUT) for i in range(4, 14)] # GP4 to GP13
# LEDs for even/odd indication
LED_EVEN = Pin(2, Pin.OUT)
LED_ODD = Pin(3, Pin.OUT)
# 7-segment display codes for digits 0-9 (common anode)
SEGMENT_CODES = [
0b11000000, # 0
0b11111001, # 1
0b10100100, # 2
0b10110000, # 3
0b10011001, # 4
0b10010010, # 5
0b10000010, # 6
0b11111000, # 7
0b10000000, # 8
0b10010000 # 9
]
current_number = 0
last_update = time.ticks_ms()
def shift_out(data_pin, clock_pin, bit_order, value):
"""Shift out a byte of data to the shift register."""
for i in range(8):
if bit_order == 0: # LSBFIRST
bit = (value >> i) & 1
else: # MSBFIRST
bit = (value >> (7 - i)) & 1
data_pin.value(bit)
clock_pin.value(1)
clock_pin.value(0)
def update_bar_graph(num):
"""Update the bar graph LEDs based on the current number."""
for i in range(10):
BAR_PINS[i].value(1 if i < num else 0)
def update_leds(is_even):
"""Update the even/odd indicator LEDs."""
LED_EVEN.value(1 if is_even else 0)
LED_ODD.value(0 if is_even else 1)
# Initialize
for pin in BAR_PINS:
pin.value(0)
# Display initial 0 on 7-segment display
shift_out(DS_PIN, SHCP_PIN, 1, SEGMENT_CODES[0]) # 1 for MSBFIRST
STCP_PIN.value(1)
STCP_PIN.value(0)
# Set initial LED state (0 is even)
update_leds(True)
# Main loop
while True:
current_time = time.ticks_ms()
if time.ticks_diff(current_time, last_update) >= 2000:
current_number = (current_number + 1) % 10
# Update 7-segment display
shift_out(DS_PIN, SHCP_PIN, 1, SEGMENT_CODES[current_number]) # 1 for MSBFIRST
STCP_PIN.value(1)
STCP_PIN.value(0)
# Update bar graph
update_bar_graph(current_number)
# Update even/odd LEDs
update_leds(current_number % 2 == 0)
last_update = current_time