import rp2
from rp2 import PIO
from machine import Pin
from time import sleep
# Определение PIO программы для сканирования матрицы 4x12
@rp2.asm_pio(set_init=PIO.IN_HIGH*12)
def keypad():
wrap_target()
set(y, 0) # Инициализация регистра y
label("scan")
mov(isr, null) # Очистка регистра
# Сканирование первой строки
set(pindirs, 1)
in_(pins, 12)
# Сканирование второй строки
set(pindirs, 2)
in_(pins, 12)
# Сканирование третьей строки
set(pindirs, 4)
in_(pins, 12)
# Сканирование четвертой строки
set(pindirs, 8)
in_(pins, 12)
mov(x, isr)
jmp(x_not_y, "key_pressed")
jmp("scan")
label("key_pressed")
push()
irq(0)
mov(y, x)
jmp("scan")
wrap()
# Настройка пинов для столбцов (input)
for i in range(4, 16): # Примерные пины для столбцов
Pin(i, Pin.IN, Pin.PULL_DOWN)
print("column:", i)
# Настройка пинов для строк (output)
row_pins = [Pin(16, Pin.OUT), Pin(17, Pin.OUT), Pin(18, Pin.OUT), Pin(19, Pin.OUT)]
# Массив символов для клавиш
key_names = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890@#$%^&*()+-="
def on_key(sm):
print("on_key")
keys = sm.get()
pressed = []
for i in range(len(key_names)):
if keys & (1 << i):
pressed.append(key_names[i])
print("Нажаты клавиши:", pressed)
# Создание StateMachine
sm = rp2.StateMachine(0, keypad, freq=2000,
in_base=Pin(4, Pin.IN, Pin.PULL_DOWN),
set_base=Pin(16))
sm.active(1)
sm.irq(on_key)
print("Ожидание нажатий клавиш...")
while True:
sleep(0.1)