|
发现一个问题,在没有按动按键的情况下,会自动往串口发送按键状态。我只有一个实体按键K1,并没有设置组合按键,并把长按键时间设置为0。
- #ifndef __BSP_KEY_H
- #define __BSP_KEY_H
- /* 根据应用程序的功能重命名按键宏 */
- #define KEY_DOWN_K1 KEY_1_DOWN
- #define KEY_UP_K1 KEY_1_UP
- #define KEY_LONG_K1 KEY_1_LONG
- /* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
- typedef enum
- {
- KID_K1 = 0,
- }KEY_ID_E;
- /*
- 按键滤波时间50ms, 单位10ms。
- 只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
- 即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
- */
- #define KEY_FILTER_TIME 10
- #define KEY_LONG_TIME 0 /* 单位10ms, 持续1秒,认为长按事件 */
- /*
- 每个按键对应1个全局的结构体变量。
- */
- typedef struct
- {
- /* 下面是一个函数指针,指向判断按键是否按下的函数 */
- uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */
- uint8_t Count; /* 滤波器计数器 */
- uint16_t LongCount; /* 长按计数器 */
- uint16_t LongTime; /* 按键按下持续时间, 0表示不检测长按 */
- uint8_t State; /* 按键当前状态(按下还是弹起) */
- uint8_t RepeatSpeed; /* 连续按键周期 */
- uint8_t RepeatCount; /* 连续按键计数器 */
- }KEY_T;
- /*
- 定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
- 推荐使用enum, 不用#define,原因:
- (1) 便于新增键值,方便调整顺序,使代码看起来舒服点
- (2) 编译器可帮我们避免键值重复。
- */
- typedef enum
- {
- KEY_NONE = 0, /* 0 表示按键事件 */
- KEY_1_DOWN, /* 1键按下 */
- KEY_1_UP, /* 1键弹起 */
- KEY_1_LONG, /* 1键长按 */
- }KEY_ENUM;
- /* 按键FIFO用到变量 */
- #define KEY_FIFO_SIZE 10
复制代码 主循环代码如下:- int main(void)
- {
- bsp_Init(); /* 硬件初始化 */
-
- PrintfLogo(); /* 打印例程名称和版本等信息 */
-
- uint8_t cmd;
- uint8_t ucKeyCode;
- bsp_StartAutoTimer(0, 500);
-
- while(1)
- {
- bsp_Idle();
-
- if(bsp_CheckTimer(0))
- {
- bsp_LedToggle(1);
- }
-
- ucKeyCode = bsp_GetKey();
- if(ucKeyCode != KEY_NONE)
- {
- switch(ucKeyCode)
- {
- case KEY_DOWN_K1:
- printf("K1按键按下\r\n");
- break;
-
- case KEY_UP_K1:
- //bsp_ClearKey();
- printf("K1按键弹起\r\n");
- break;
-
- default:
- break;
-
- }
- }
-
- if(comGetChar(COM1,&cmd))
- {
- printf("\r\n");
- switch (cmd)
- {
- case '1':
- printf("【1 - 停止定时器,关闭LED1】\r\n");
- bsp_StopTimer(0);
- bsp_LedOff(2);
- break;
-
- case '2':
- printf("【2 - 启动定时器】\r\n");
- bsp_StartAutoTimer(0, 500);
- break;
-
- default:
- break;
- }
-
- }
- }
-
复制代码
如图所示,在40分06秒按下一次按键,后续没有按下,也会自动产生按键信息。
|
|