.program keypad_scanner mov y,null mov isr, null set pins, 0 .wrap_target loop_start: set pins, 0b1000 [1] in pins, 4 set pins, 0b0100 [1] in pins, 4 set pins, 0b0010 [1] in pins, 4 set pins, 0b0001 [1] in pins, 4 mov x, isr jmp x!=y state_changes mov isr, null jmp loop_start state_changes: mov y,x push irq 0 .wrap % c-sdk { #include "hardware/clocks.h" void keypad_scanner_program_init(PIO pio, uint sm, uint offset, uint rowBase, uint columnBase, float freq) { // ピン入出力方向の設定 pio_sm_set_consecutive_pindirs(pio, sm, rowBase, 4, true); pio_sm_set_consecutive_pindirs(pio, sm, columnBase, 4, false); // 使用するGPIOをPIOに割当 pio_gpio_init(pio, rowBase); pio_gpio_init(pio, rowBase+1); pio_gpio_init(pio, rowBase+2); pio_gpio_init(pio, rowBase+3); pio_gpio_init(pio, columnBase); pio_gpio_init(pio, columnBase+1); pio_gpio_init(pio, columnBase+2); pio_gpio_init(pio, columnBase+3); pio_sm_config c = keypad_scanner_program_get_default_config(offset); // set命令のポート設定 sm_config_set_set_pin_base(&c, rowBase); sm_config_set_set_pin_count(&c, 4); // in命令のポート設定 sm_config_set_in_pin_base(&c, columnBase); sm_config_set_in_pin_count(&c, 4); // in命令自動左シフト sm_config_set_in_shift(&c, false, false, 32); // SMのクロック設定 float clkdiv = (float)clock_get_hz(clk_sys) / freq; sm_config_set_clkdiv(&c, clkdiv); pio_sm_init(pio, sm, offset, &c); } %}