硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3635|回复: 4
收起左侧

[有问必答] 按键检测

[复制链接]

2

主题

11

回帖

17

积分

新手上路

积分
17
发表于 2017-10-24 12:28:15 | 显示全部楼层 |阅读模式
typedef enum
{
    KID_K1 = 0,
    KID_K2,
    KID_K3,
    KID_JOY_U,
    KID_JOY_D,
    KID_JOY_L,
    KID_JOY_R,
    KID_JOY_OK
}KEY_ID_E;


#define KEY_UP_K1        KEY_1_UP
#define KEY_UP_K2        KEY_2_UP
#define KEY_UP_K3        KEY_3_UP
#define JOY_UP_U                KEY_4_UP
#define JOY_UP_D                KEY_5_UP
#define JOY_UP_L               KEY_6_UP
#define JOY_UP_R               KEY_7_UP
#define JOY_UP_OK        KEY_8_UP
#define SYS_UP_K1K2         KEY_9_UP
#define SYS_UP_K2K3          KEY_10_UP
大家好,有个问题不太清楚,枚举定义的按键ID为什么不定义我例举的所有按键ID,而是定义其中一部分
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2017-10-25 10:59:44 | 显示全部楼层
我知道是那样的,但是我说的是按键ID的定义,为什么定义的是一部分,不是定义所有按键ID
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2017-10-25 11:14:24 | 显示全部楼层

回 wtyiyou 的帖子

wtyiyou:我知道是那样的,但是我说的是按键ID的定义,为什么定义的是一部分,不是定义所有按键ID
 (2017-10-25 10:59) 
这个枚举没用,删掉就好了,还有用它的那个函数,也要一起删掉。

所有状态在另一个枚举中进行了定义。
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2017-10-25 16:41:24 | 显示全部楼层
好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 04:42 , Processed in 0.268475 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表