key.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #ifndef __KEY_H
  2. #define __KEY_H
  3. #include "interface.h"
  4. #define KEY_COUNT 10 /* 按键个数, 8个独立建 + 2个组合键 */
  5. /* 根据应用程序的功能重命名按键宏 */
  6. #define KEY_DOWN_K1 KEY_1_DOWN
  7. #define KEY_UP_K1 KEY_1_UP
  8. #define KEY_LONG_K1 KEY_1_LONG
  9. #define KEY_DOWN_K2 KEY_2_DOWN
  10. #define KEY_UP_K2 KEY_2_UP
  11. #define KEY_LONG_K2 KEY_2_LONG
  12. #define KEY_DOWN_K3 KEY_3_DOWN
  13. #define KEY_UP_K3 KEY_3_UP
  14. #define KEY_LONG_K3 KEY_3_LONG
  15. #define JOY_DOWN_U KEY_4_DOWN /* 上 */
  16. #define JOY_UP_U KEY_4_UP
  17. #define JOY_LONG_U KEY_4_LONG
  18. #define JOY_DOWN_D KEY_5_DOWN /* 下 */
  19. #define JOY_UP_D KEY_5_UP
  20. #define JOY_LONG_D KEY_5_LONG
  21. #define JOY_DOWN_L KEY_6_DOWN /* 左 */
  22. #define JOY_UP_L KEY_6_UP
  23. #define JOY_LONG_L KEY_6_LONG
  24. #define JOY_DOWN_R KEY_7_DOWN /* 右 */
  25. #define JOY_UP_R KEY_7_UP
  26. #define JOY_LONG_R KEY_7_LONG
  27. #define JOY_DOWN_OK KEY_8_DOWN /* ok */
  28. #define JOY_UP_OK KEY_8_UP
  29. #define JOY_LONG_OK KEY_8_LONG
  30. #define SYS_DOWN_K1K2 KEY_9_DOWN /* K1 K2 组合键 */
  31. #define SYS_UP_K1K2 KEY_9_UP
  32. #define SYS_LONG_K1K2 KEY_9_LONG
  33. #define SYS_DOWN_K2K3 KEY_10_DOWN /* K2 K3 组合键 */
  34. #define SYS_UP_K2K3 KEY_10_UP
  35. #define SYS_LONG_K2K3 KEY_10_LONG
  36. /* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
  37. typedef enum
  38. {
  39. KID_K1 = 0,
  40. KID_K2,
  41. KID_K3,
  42. KID_JOY_U,
  43. KID_JOY_D,
  44. KID_JOY_L,
  45. KID_JOY_R,
  46. KID_JOY_OK
  47. } KEY_ID_E;
  48. /*
  49. 按键滤波时间50ms, 单位10ms。
  50. 只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
  51. 即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
  52. */
  53. #define KEY_FILTER_TIME 5
  54. #define KEY_LONG_TIME 100 /* 单位10ms, 持续1秒,认为长按事件 */
  55. /*
  56. 每个按键对应1个全局的结构体变量。
  57. */
  58. typedef struct
  59. {
  60. /* 下面是一个函数指针,指向判断按键手否按下的函数 */
  61. uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */
  62. uint8_t Count; /* 滤波器计数器 */
  63. uint16_t LongCount; /* 长按计数器 */
  64. uint16_t LongTime; /* 按键按下持续时间, 0表示不检测长按 */
  65. uint8_t State; /* 按键当前状态(按下还是弹起) */
  66. uint8_t RepeatSpeed; /* 连续按键周期 */
  67. uint8_t RepeatCount; /* 连续按键计数器 */
  68. } KEY_T;
  69. /*
  70. 定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
  71. 推荐使用enum, 不用#define,原因:
  72. (1) 便于新增键值,方便调整顺序,使代码看起来舒服点
  73. (2) 编译器可帮我们避免键值重复。
  74. */
  75. typedef enum
  76. {
  77. KEY_NONE = 0, /* 0 表示按键事件 */
  78. KEY_1_DOWN, /* 1键按下 */
  79. KEY_1_UP, /* 1键弹起 */
  80. KEY_1_LONG, /* 1键长按 */
  81. KEY_2_DOWN, /* 2键按下 */
  82. KEY_2_UP, /* 2键弹起 */
  83. KEY_2_LONG, /* 2键长按 */
  84. KEY_3_DOWN, /* 3键按下 */
  85. KEY_3_UP, /* 3键弹起 */
  86. KEY_3_LONG, /* 3键长按 */
  87. KEY_4_DOWN, /* 4键按下 */
  88. KEY_4_UP, /* 4键弹起 */
  89. KEY_4_LONG, /* 4键长按 */
  90. KEY_5_DOWN, /* 5键按下 */
  91. KEY_5_UP, /* 5键弹起 */
  92. KEY_5_LONG, /* 5键长按 */
  93. KEY_6_DOWN, /* 6键按下 */
  94. KEY_6_UP, /* 6键弹起 */
  95. KEY_6_LONG, /* 6键长按 */
  96. KEY_7_DOWN, /* 7键按下 */
  97. KEY_7_UP, /* 7键弹起 */
  98. KEY_7_LONG, /* 7键长按 */
  99. KEY_8_DOWN, /* 8键按下 */
  100. KEY_8_UP, /* 8键弹起 */
  101. KEY_8_LONG, /* 8键长按 */
  102. /* 组合键 */
  103. KEY_9_DOWN, /* 9键按下 */
  104. KEY_9_UP, /* 9键弹起 */
  105. KEY_9_LONG, /* 9键长按 */
  106. KEY_10_DOWN, /* 10键按下 */
  107. KEY_10_UP, /* 10键弹起 */
  108. KEY_10_LONG, /* 10键长按 */
  109. } KEY_ENUM;
  110. /* 按键FIFO用到变量 */
  111. #define KEY_FIFO_SIZE 10
  112. typedef struct
  113. {
  114. uint8_t Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
  115. uint8_t Read; /* 缓冲区读指针1 */
  116. uint8_t Write; /* 缓冲区写指针 */
  117. uint8_t Read2; /* 缓冲区读指针2 */
  118. } KEY_FIFO_T;
  119. /* 供外部调用的函数声明 */
  120. void key_init(void);
  121. void key_scan(void);
  122. void key_put(uint8_t _KeyCode);
  123. uint8_t key_get(void);
  124. uint8_t key_get_fifo(void);
  125. uint8_t key_state(KEY_ID_E _ucKeyID);
  126. void key_set(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t _RepeatSpeed);
  127. void key_clear_fifo(void);
  128. void key_task(void);
  129. #endif
  130. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/