import time
import board
import digitalio
# -------------------------
# Keypad setup (4x4 Matrix)
# -------------------------
rows = [board.GP13, board.GP12, board.GP11, board.GP10]
cols = [board.GP9, board.GP8, board.GP7, board.GP6]
row_pins = []
col_pins = []
for r in rows:
pin = digitalio.DigitalInOut(r)
pin.direction = digitalio.Direction.OUTPUT
pin.value = True
row_pins.append(pin)
for c in cols:
pin = digitalio.DigitalInOut(c)
pin.direction = digitalio.Direction.INPUT
pin.pull = digitalio.Pull.UP
col_pins.append(pin)
keys = [
['1','2','3','A'],
['4','5','6','B'],
['7','8','9','C'],
['*','0','#','D']
]
def scan_keypad():
for row_num, row_pin in enumerate(row_pins):
row_pin.value = False
for col_num, col_pin in enumerate(col_pins):
if not col_pin.value:
row_pin.value = True
return keys[row_num][col_num]
row_pin.value = True
return None
# -------------------------
# 7-Segment & BCD Setup
# -------------------------
# Pins matching your logic: A=GP2, B=GP3, C=GP4, D=GP5
A = digitalio.DigitalInOut(board.GP2)
B = digitalio.DigitalInOut(board.GP3)
C = digitalio.DigitalInOut(board.GP4)
D = digitalio.DigitalInOut(board.GP5)
for pin in [A, B, C, D]:
pin.direction = digitalio.Direction.OUTPUT
bcd_pins = [A, B, C, D]
s72 = digitalio.DigitalInOut(board.GP0) # TENS
s71 = digitalio.DigitalInOut(board.GP1) # ONES
s72.direction = s71.direction = digitalio.Direction.OUTPUT
def send_bcd(value):
for i in range(4):
bcd_pins[i].value = (value >> i) & 1
def latch(pin):
pin.value = 0 # Active Low
time.sleep(0.001)
pin.value = 1
def turn_off():
send_bcd(15) # 15 (1111) usually blanks the CD4511
latch(s72)
latch(s71)
def display_number(num):
tens = num // 10
ones = num % 10
send_bcd(tens)
latch(s72)
send_bcd(ones)
latch(s71)
# -------------------------
# User Input Logic
# -------------------------
def get_user_input():
value = ""
print("\n--- Enter Countdown Value (0-99) ---")
print("Press # to confirm")
turn_off() # Clear display for new input
while True:
key = scan_keypad()
if key:
if key.isdigit():
if len(value) < 2:
value += key
print("Input:", value)
display_number(int(value)) # Show number as you type
elif key == '#':
if value == "":
print("Error: Enter digits first!")
else:
return int(value)
time.sleep(0.3) # Debounce
time.sleep(0.01)
# -------------------------
# Main Program Loop
# -------------------------
print("System Initialized (No Switch/No LEDs)")
while True:
# 1. Get the time from user via keypad
x = get_user_input()
# 2. Run the countdown on 7-segment only
print(f"Starting Countdown: {x}")
for i in range(x, -1, -1):
display_number(i)
print("Time remaining:", i)
time.sleep(1)
print("Countdown Finished!")
time.sleep(1) # Short pause before asking again