# ЛР2601, п. 22 порядка выполнения: перебор таблицы истинности 0000..1111 # с частотой 10 кГц (новый входной набор каждые 100 мкс). # Плата: ESP32-C3 Super Mini, MicroPython. # # Подключение (разъём J1): # X1 (младший разряд) -> GPIO6 (J1, конт. 8) # X2 -> GPIO7 (J1, конт. 7) # X3 -> GPIO8 (J1, конт. 6) # X4 (старший разряд) -> GPIO10 (J1, конт. 4) # GPIO20/21 не используем: это UART, через него работает консоль MicroPython. from machine import Pin import time PINS = [6, 7, 8, 10] # X1, X2, X3, X4 STEP_US = 100 # 10 кГц -> 100 мкс на один набор x = [Pin(n, Pin.OUT, value=0) for n in PINS] SIMULTANEOUS = True # True - все 4 бита меняются одной записью в регистр # Регистр выходов GPIO ESP32-C3 (Technical Reference Manual, глава GPIO): GPIO_OUT_REG = 0x60004004 MASK = 0 for n in PINS: MASK |= 1 << n def write_code(code): if SIMULTANEOUS: from machine import mem32 v = mem32[GPIO_OUT_REG] & ~MASK for i, n in enumerate(PINS): if code >> i & 1: v |= 1 << n mem32[GPIO_OUT_REG] = v # все выводы переключаются одновременно else: for i, p in enumerate(x): # по очереди X1, X2, X3, X4 (как в Приложении 3) p.value(code >> i & 1) t = time.ticks_us() code = 0 while True: write_code(code) code = (code + 1) & 0x0F # 0000 -> 0001 -> ... -> 1111 -> 0000 t = time.ticks_add(t, STEP_US) while time.ticks_diff(t, time.ticks_us()) > 0: pass