keypad_scanner.pio 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. .program keypad_scanner
  2. mov y,null
  3. mov isr, null
  4. set pins, 0
  5. .wrap_target
  6. loop_start:
  7. set pins, 0b1000 [1]
  8. in pins, 4
  9. set pins, 0b0100 [1]
  10. in pins, 4
  11. set pins, 0b0010 [1]
  12. in pins, 4
  13. set pins, 0b0001 [1]
  14. in pins, 4
  15. mov x, isr
  16. jmp x!=y state_changes
  17. mov isr, null
  18. jmp loop_start
  19. state_changes:
  20. mov y,x
  21. push
  22. irq 0
  23. .wrap
  24. % c-sdk {
  25. #include "hardware/clocks.h"
  26. void keypad_scanner_program_init(PIO pio, uint sm, uint offset, uint rowBase, uint columnBase, float freq) {
  27. // ピン入出力方向の設定
  28. pio_sm_set_consecutive_pindirs(pio, sm, rowBase, 4, true);
  29. pio_sm_set_consecutive_pindirs(pio, sm, columnBase, 4, false);
  30. // 使用するGPIOをPIOに割当
  31. pio_gpio_init(pio, rowBase);
  32. pio_gpio_init(pio, rowBase+1);
  33. pio_gpio_init(pio, rowBase+2);
  34. pio_gpio_init(pio, rowBase+3);
  35. pio_gpio_init(pio, columnBase);
  36. pio_gpio_init(pio, columnBase+1);
  37. pio_gpio_init(pio, columnBase+2);
  38. pio_gpio_init(pio, columnBase+3);
  39. pio_sm_config c = keypad_scanner_program_get_default_config(offset);
  40. // set命令のポート設定
  41. sm_config_set_set_pin_base(&c, rowBase);
  42. sm_config_set_set_pin_count(&c, 4);
  43. // in命令のポート設定
  44. sm_config_set_in_pin_base(&c, columnBase);
  45. sm_config_set_in_pin_count(&c, 4);
  46. // in命令自動左シフト
  47. sm_config_set_in_shift(&c, false, false, 32);
  48. // SMのクロック設定
  49. float clkdiv = (float)clock_get_hz(clk_sys) / freq;
  50. sm_config_set_clkdiv(&c, clkdiv);
  51. pio_sm_init(pio, sm, offset, &c);
  52. }
  53. %}