123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- .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);
- }
- %}
|