import rp2
from rp2 import PIO
from machine import Pin
from time import sleep
@rp2.asm_pio(set_init=[PIO.IN_HIGH]*4)
def keypad():
wrap_target()
set(y, 0)
label("scan")
mov(isr, null)
set(pindirs, 1)
in_(pins, 4)
set(pindirs, 2)
in_(pins, 4)
set(pindirs, 4)
in_(pins, 4)
set(pindirs, 8)
in_(pins, 4)
mov(x, isr)
jmp(x_not_y, "changed")
jmp("scan")
label("changed")
push(block)
irq(0)
mov(y, x)
jmp("scan")
wrap()
for i in range(10, 14):
Pin(i, Pin.IN, Pin.PULL_DOWN)
key_names = "*7410852#963DCBA"
last_pressed = 0
def oninput(sm):
global last_pressed
keys = sm.get()
while sm.rx_fifo():
keys = sm.get()
new_presses = keys & ~last_pressed
last_pressed = keys
if new_presses:
pressed = []
for i in range(len(key_names)):
if new_presses & (1 << i):
pressed.append(key_names[i])
print("Key pressed:", pressed)
sm = rp2.StateMachine(0, keypad, freq=2000,
in_base=Pin(10, Pin.IN, Pin.PULL_DOWN),
set_base=Pin(6))
sm.active(1)
sm.irq(oninput)
print("Press any key on the keypad (press Ctrl+C to stop).")
while True:
sleep(0.1)