硬汉嵌入式论坛

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

[有问必答] 按键FIFO模块会自动产生按键状态?

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-1-25 15:58:35 | 显示全部楼层 |阅读模式
发现一个问题,在没有按动按键的情况下,会自动往串口发送按键状态。我只有一个实体按键K1,并没有设置组合按键,并把长按键时间设置为0。
  1. #ifndef __BSP_KEY_H
  2. #define __BSP_KEY_H

  3. /* 根据应用程序的功能重命名按键宏 */
  4. #define KEY_DOWN_K1                KEY_1_DOWN
  5. #define KEY_UP_K1                KEY_1_UP
  6. #define KEY_LONG_K1                KEY_1_LONG


  7. /* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
  8. typedef enum
  9. {
  10.         KID_K1 = 0,

  11. }KEY_ID_E;

  12. /*
  13.         按键滤波时间50ms, 单位10ms。
  14.         只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
  15.         即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
  16. */
  17. #define KEY_FILTER_TIME   10
  18. #define KEY_LONG_TIME     0                        /* 单位10ms, 持续1秒,认为长按事件 */

  19. /*
  20.         每个按键对应1个全局的结构体变量。
  21. */
  22. typedef struct
  23. {
  24.         /* 下面是一个函数指针,指向判断按键是否按下的函数 */
  25.         uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */

  26.         uint8_t  Count;                        /* 滤波器计数器 */
  27.         uint16_t LongCount;                /* 长按计数器 */
  28.         uint16_t LongTime;                /* 按键按下持续时间, 0表示不检测长按 */
  29.         uint8_t  State;                        /* 按键当前状态(按下还是弹起) */
  30.         uint8_t  RepeatSpeed;        /* 连续按键周期 */
  31.         uint8_t  RepeatCount;        /* 连续按键计数器 */
  32. }KEY_T;

  33. /*
  34.         定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件

  35.         推荐使用enum, 不用#define,原因:
  36.         (1) 便于新增键值,方便调整顺序,使代码看起来舒服点
  37.         (2) 编译器可帮我们避免键值重复。
  38. */
  39. typedef enum
  40. {
  41.         KEY_NONE = 0,                        /* 0 表示按键事件 */

  42.         KEY_1_DOWN,                                /* 1键按下 */
  43.         KEY_1_UP,                                /* 1键弹起 */
  44.         KEY_1_LONG,                                /* 1键长按 */
  45. }KEY_ENUM;

  46. /* 按键FIFO用到变量 */
  47. #define KEY_FIFO_SIZE        10
复制代码
主循环代码如下:
  1. int main(void)
  2. {

  3.         bsp_Init();                /* 硬件初始化 */
  4.        
  5.         PrintfLogo();        /* 打印例程名称和版本等信息 */
  6.        
  7.         uint8_t cmd;

  8.         uint8_t ucKeyCode;

  9.         bsp_StartAutoTimer(0, 500);
  10.        
  11.         while(1)
  12.         {
  13.                 bsp_Idle();
  14.                
  15.                 if(bsp_CheckTimer(0))
  16.                 {
  17.                         bsp_LedToggle(1);
  18.                 }
  19.                
  20.                 ucKeyCode = bsp_GetKey();
  21.                 if(ucKeyCode != KEY_NONE)
  22.                 {
  23.                         switch(ucKeyCode)
  24.                         {
  25.                                 case KEY_DOWN_K1:
  26.                                         printf("K1按键按下\r\n");
  27.                                         break;
  28.                                
  29.                                 case KEY_UP_K1:
  30.                                         //bsp_ClearKey();
  31.                                         printf("K1按键弹起\r\n");
  32.                                         break;               
  33.                                
  34.                                 default:
  35.                                         break;
  36.                                        
  37.                         }
  38.                 }
  39.                                                
  40.                 if(comGetChar(COM1,&cmd))
  41.                 {
  42.                         printf("\r\n");
  43.                         switch (cmd)
  44.                         {
  45.                                 case '1':
  46.                                         printf("【1 - 停止定时器,关闭LED1】\r\n");
  47.                                         bsp_StopTimer(0);
  48.                                         bsp_LedOff(2);
  49.                                         break;
  50.                                
  51.                                 case '2':
  52.                                         printf("【2 - 启动定时器】\r\n");
  53.                                         bsp_StartAutoTimer(0, 500);
  54.                                         break;
  55.                                
  56.                                 default:
  57.                                         break;
  58.                         }
  59.                                
  60.                 }
  61.         }
  62.        
复制代码


如图所示,在40分06秒按下一次按键,后续没有按下,也会自动产生按键信息。


屏幕截图 2022-01-25 155159.jpg




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2022-1-26 10:30:41 | 显示全部楼层
示波器捕获下,看看是按键有损坏,自己误触发了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 01:48 , Processed in 0.039639 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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