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
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT
74HC595