main.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2020-12-12 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #include <rtdevice.h>
  14. #if defined(RT_USING_PIN)
  15. #include <drv_gpio.h>
  16. /* defined the INDICATOR_LED pin: PH2 */
  17. #define INDICATOR_LED NU_GET_PININDEX(NU_PH, 2)
  18. #define MATRIX_COL_NUM 2
  19. #define MATRIX_ROW_NUM 3
  20. /* defined the KEY_COl_0 pin: PB4 */
  21. #define KEY_COL_0 NU_GET_PININDEX(NU_PB, 4)
  22. /* defined the KEY_COl_1 pin: PB5 */
  23. #define KEY_COL_1 NU_GET_PININDEX(NU_PB, 5)
  24. /* defined the KEY_ROW_0 pin: PF10 */
  25. #define KEY_ROW_0 NU_GET_PININDEX(NU_PF, 10)
  26. /* defined the KEY_ROW_1 pin: PE15 */
  27. #define KEY_ROW_1 NU_GET_PININDEX(NU_PE, 15)
  28. /* defined the KEY_ROW_2 pin: PE14 */
  29. #define KEY_ROW_2 NU_GET_PININDEX(NU_PE, 14)
  30. uint32_t au32KeyMatrix_Col[MATRIX_COL_NUM] = { KEY_COL_0, KEY_COL_1 };
  31. uint32_t au32KeyMatrix_Row[MATRIX_ROW_NUM] = { KEY_ROW_0, KEY_ROW_1, KEY_ROW_2 };
  32. const char *szKeyLabel[] =
  33. {
  34. "K1",
  35. "K2",
  36. "K3",
  37. "K4",
  38. "K5",
  39. "K6"
  40. };
  41. static void nu_key_matrix_cb(void *args)
  42. {
  43. uint32_t ri = (uint32_t)args;
  44. int ci;
  45. for (ci = 0; ci < MATRIX_COL_NUM; ci++)
  46. {
  47. /* Find column bit is low. */
  48. if (!rt_pin_read(au32KeyMatrix_Col[ci]))
  49. {
  50. break;
  51. }
  52. }
  53. rt_kprintf("[%d %d] Pressed %s button.\n", ci, ri, szKeyLabel[(ci) + MATRIX_COL_NUM * ri]);
  54. }
  55. static void nu_key_matrix_switch(uint32_t counter)
  56. {
  57. int i;
  58. for (i = 0; i < MATRIX_COL_NUM; i++)
  59. {
  60. /* set pin value to high */
  61. rt_pin_write(au32KeyMatrix_Col[i], PIN_HIGH);
  62. }
  63. /* set pin value to low */
  64. rt_pin_write(au32KeyMatrix_Col[counter % MATRIX_COL_NUM], PIN_LOW);
  65. }
  66. #endif
  67. int main(int argc, char **argv)
  68. {
  69. #if defined(RT_USING_PIN)
  70. uint32_t counter = 1;
  71. int i = 0;
  72. for (i = 0; i < MATRIX_ROW_NUM; i++)
  73. {
  74. /* set pin mode to input */
  75. rt_pin_mode(au32KeyMatrix_Row[i], PIN_MODE_INPUT_PULLUP);
  76. rt_pin_attach_irq(au32KeyMatrix_Row[i], PIN_IRQ_MODE_FALLING, nu_key_matrix_cb, (void *)i);
  77. rt_pin_irq_enable(au32KeyMatrix_Row[i], PIN_IRQ_ENABLE);
  78. }
  79. for (i = 0; i < MATRIX_COL_NUM; i++)
  80. {
  81. /* set pin mode to output */
  82. rt_pin_mode(au32KeyMatrix_Col[i], PIN_MODE_OUTPUT);
  83. }
  84. /* set INDICATOR_LED pin mode to output */
  85. rt_pin_mode(INDICATOR_LED, PIN_MODE_OUTPUT);
  86. /* Toggle column pins in key matrix. */
  87. while (counter++ > 0)
  88. {
  89. rt_pin_write(INDICATOR_LED, PIN_HIGH);
  90. rt_thread_mdelay(200);
  91. rt_pin_write(INDICATOR_LED, PIN_LOW);
  92. rt_thread_mdelay(200);
  93. nu_key_matrix_switch(counter);
  94. }
  95. #endif
  96. return 0;
  97. }