import time # Import time module for delay
import board # Import board module to access GPIO pins
import digitalio # Import digital I/O control library
bcd_tens = [board.GP2, board.GP3, board.GP4, board.GP5] # Define BCD pins for tens digit
bcd_ones = [board.GP6, board.GP7, board.GP8, board.GP9] # Define BCD pins for ones digit
class CD4511: # Create class to control CD4511 IC
def __init__(self, pins): # Constructor to initialize pins
self.bcd = [] # Create list to store pin objects
for pin in pins: # Loop through each pin
p = digitalio.DigitalInOut(pin) # Create DigitalInOut object
p.direction = digitalio.Direction.OUTPUT # Set pin as output
self.bcd.append(p) # Add pin to list
def display(self, num): # Function to display number
num = max(0, min(9, num)) # Limit number between 0 and 9
for i in range(4): # Loop through 4 bits (A, B, C, D)
self.bcd[i].value = (num >> i) & 1 # Send BCD value to CD4511
tens_disp = CD4511(bcd_tens) # Create object for tens display
ones_disp = CD4511(bcd_ones) # Create object for ones display
sw_up = digitalio.DigitalInOut(board.GP15) # Define UP button pin
sw_up.direction = digitalio.Direction.INPUT # Set as input
sw_up.pull = digitalio.Pull.UP # Enable internal pull-up resistor
sw_down = digitalio.DigitalInOut(board.GP16) # Define DOWN button pin
sw_down.direction = digitalio.Direction.INPUT # Set as input
sw_down.pull = digitalio.Pull.UP # Enable internal pull-up resistor
count = 0 # Initialize counter value
while True: # Infinite loop to keep program running
if not sw_up.value: # Check if UP button is pressed (LOW)
count = (count + 1) % 100 # Increase counter from 0 to 99
print("UP:", count) # Print value to serial monitor
time.sleep(0.2) # Small delay to avoid multiple counts
if not sw_down.value: # Check if DOWN button is pressed
count = (count - 1) % 100 # Decrease counter with wrap-around
print("DOWN:", count) # Print value to serial monitor
time.sleep(0.2) # Delay for debounce
tens = count // 10 # Get tens digit using integer division
ones = count % 10 # Get ones digit using modulus
tens_disp.display(tens) # Send tens digit to first display
ones_disp.display(ones) # Send ones digit to second display