硬汉嵌入式论坛

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

[技术讨论] 基于硬汉的F1按键教程基础上添加双击

  [复制链接]

3

主题

7

回帖

16

积分

新手上路

积分
16
发表于 2019-9-18 12:04:14 | 显示全部楼层 |阅读模式
本帖最后由 夜乄歌 于 2019-9-19 09:31 编辑

工作中一直借鉴使用的安富莱的代码,感觉相当好用,思路也明确移植也方便,正好最近新搞了个STC8A的设备控制板,就将部分代码移植上去,跑的也比较顺畅,看了论坛几个关于按键的帖子,想着能不能再去添加点按键的功能,就在原F1按键的基础上修改,过滤掉了长按之后的短按事件(延时发送键值或者说松手发送键值),添加了双击使能功能(依旧要延时判断短按),所以在此献丑了,代码如下
  1. #include "bsp.h"

  2. sbit KEY1 = P5 ^ 5;

  3. sbit KEY2 = P2 ^ 0;
  4. //sbit KEY3 = P2 ^ 1;
  5. //sbit KEY4 = P2 ^ 2;
  6. //sbit KEY5 = P2 ^ 3;
  7. //sbit KEY6 = P2 ^ 4;
  8. //sbit KEY7 = P2 ^ 5;
  9. //sbit KEY8 = P2 ^ 6;
  10. //sbit KEY9 = P2 ^ 7;


  11. static KEY_T s_tBtn[KEY_COUNT];
  12. static KEY_FIFO_T s_tKey;                /* 按键FIFO变量,结构体 */

  13. static void bsp_InitKeyVar(void);
  14. static void bsp_InitKeyHard(void);

  15. /*
  16. *********************************************************************************************************
  17. *        函 数 名: IsKeyDownX
  18. *        功能说明: 判断按键是否按下
  19. *        形    参: 无
  20. *        返 回 值: 返回值1 表示按下,0表示未按下
  21. *********************************************************************************************************
  22. */
  23. static uint8_t IsKeyDown1(void)
  24. {
  25.         if (KEY1 == 0)
  26.                 return 1;
  27.         else
  28.                 return 0;
  29. }

  30. static uint8_t IsKeyDown2(void)
  31. {
  32.         if (KEY2 == 0)
  33.                 return 1;
  34.         else
  35.                 return 0;
  36. }

  37. //static uint8_t IsKeyDown3(void)
  38. //{
  39. //        if (KEY3 == 0)
  40. //                return 1;
  41. //        else
  42. //                return 0;
  43. //}

  44. //static uint8_t IsKeyDown4(void)
  45. //{
  46. //        if (KEY4 == 0)
  47. //                return 1;
  48. //        else
  49. //                return 0;
  50. //}


  51. //static uint8_t IsKeyDown5(void)
  52. //{
  53. //        if (KEY5 == 0)
  54. //                return 1;
  55. //        else
  56. //                return 0;
  57. //}

  58. //static uint8_t IsKeyDown6(void)
  59. //{
  60. //        if (KEY6 == 0)
  61. //                return 1;
  62. //        else
  63. //                return 0;
  64. //}

  65. //static uint8_t IsKeyDown7(void)
  66. //{
  67. //        if (KEY7 == 0)
  68. //                return 1;
  69. //        else
  70. //                return 0;
  71. //}

  72. //static uint8_t IsKeyDown8(void)
  73. //{
  74. //        if (KEY8 == 0)
  75. //                return 1;
  76. //        else
  77. //                return 0;
  78. //}

  79. //static uint8_t IsKeyDown9(void)
  80. //{
  81. //        if (KEY9 == 0)
  82. //                return 1;
  83. //        else
  84. //                return 0;
  85. //}
  86. /*
  87. *********************************************************************************************************
  88. *        函 数 名: bsp_InitKey
  89. *        功能说明: 初始化按键. 该函数被 bsp_Init() 调用。
  90. *        形    参:  无
  91. *        返 回 值: 无
  92. *********************************************************************************************************
  93. */
  94. void bsp_InitKey(void)
  95. {
  96.         bsp_InitKeyVar();                /* 初始化按键变量 */
  97.         bsp_InitKeyHard();                /* 初始化按键硬件 */
  98. }

  99. /*
  100. *********************************************************************************************************
  101. *        函 数 名: bsp_PutKey
  102. *        功能说明: 将1个键值压入按键FIFO缓冲区。可用于模拟一个按键。
  103. *        形    参:  _KeyCode : 按键代码
  104. *        返 回 值: 无
  105. *********************************************************************************************************
  106. */
  107. void bsp_PutKey(uint8_t _KeyCode)
  108. {
  109.         s_tKey.Buf[s_tKey.Write] = _KeyCode;

  110.         if (++s_tKey.Write  >= KEY_FIFO_SIZE)
  111.         {
  112.                 s_tKey.Write = 0;
  113.         }
  114. }

  115. /*
  116. *********************************************************************************************************
  117. *        函 数 名: bsp_GetKey
  118. *        功能说明: 从按键FIFO缓冲区读取一个键值。
  119. *        形    参:  无
  120. *        返 回 值: 按键代码
  121. *********************************************************************************************************
  122. */
  123. uint8_t bsp_GetKey(void)
  124. {
  125.         uint8_t ret;

  126.         if (s_tKey.Read == s_tKey.Write)
  127.         {
  128.                 return KEY_NONE;
  129.         }
  130.         else
  131.         {
  132.                 ret = s_tKey.Buf[s_tKey.Read];

  133.                 if (++s_tKey.Read >= KEY_FIFO_SIZE)
  134.                 {
  135.                         s_tKey.Read = 0;
  136.                 }
  137.                 return ret;
  138.         }
  139. }

  140. /*
  141. *********************************************************************************************************
  142. *        函 数 名: bsp_GetKey2
  143. *        功能说明: 从按键FIFO缓冲区读取一个键值。独立的读指针。
  144. *        形    参:  无
  145. *        返 回 值: 按键代码
  146. *********************************************************************************************************
  147. */
  148. uint8_t bsp_GetKey2(void)
  149. {
  150.         uint8_t ret;

  151.         if (s_tKey.Read2 == s_tKey.Write)
  152.         {
  153.                 return KEY_NONE;
  154.         }
  155.         else
  156.         {
  157.                 ret = s_tKey.Buf[s_tKey.Read2];

  158.                 if (++s_tKey.Read2 >= KEY_FIFO_SIZE)
  159.                 {
  160.                         s_tKey.Read2 = 0;
  161.                 }
  162.                 return ret;
  163.         }
  164. }

  165. /*
  166. *********************************************************************************************************
  167. *        函 数 名: bsp_GetKeyState
  168. *        功能说明: 读取按键的状态
  169. *        形    参:  _ucKeyID : 按键ID,从0开始
  170. *        返 回 值: 1 表示按下, 0 表示未按下
  171. *********************************************************************************************************
  172. */
  173. uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID)
  174. {
  175.         return s_tBtn[_ucKeyID].State;
  176. }

  177. /*
  178. *********************************************************************************************************
  179. *        函 数 名: bsp_SetKeyParam
  180. *        功能说明: 设置按键参数
  181. *        形    参:_ucKeyID : 按键ID,从0开始
  182. *                        _LongTime : 长按事件时间
  183. *                         _RepeatSpeed : 连发速度
  184. *        返 回 值: 无
  185. *********************************************************************************************************
  186. */
  187. void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t  _RepeatSpeed)
  188. {
  189.         s_tBtn[_ucKeyID].LongTime = _LongTime;                        /* 长按时间 0 表示不检测长按键事件 */
  190.         s_tBtn[_ucKeyID].RepeatSpeed = _RepeatSpeed;        /* 按键连发的速度,0表示不支持连发 */
  191.         s_tBtn[_ucKeyID].RepeatCount = 0;                                /* 连发计数器 */
  192. }


  193. /*
  194. *********************************************************************************************************
  195. *        函 数 名: bsp_ClearKey
  196. *        功能说明: 清空按键FIFO缓冲区
  197. *        形    参:无
  198. *        返 回 值: 按键代码
  199. *********************************************************************************************************
  200. */
  201. void bsp_ClearKey(void)
  202. {
  203.         s_tKey.Read = s_tKey.Write;
  204. }

  205. /*
  206. *********************************************************************************************************
  207. *        函 数 名: bsp_InitKeyVar
  208. *        功能说明: 初始化按键变量
  209. *        形    参:  无
  210. *        返 回 值: 无
  211. *********************************************************************************************************
  212. */
  213. static void bsp_InitKeyVar(void)
  214. {
  215.         uint8_t i;

  216.         /* 对按键FIFO读写指针清零 */
  217.         s_tKey.Read = 0;
  218.         s_tKey.Write = 0;
  219.         s_tKey.Read2 = 0;

  220.         /* 给每个按键结构体成员变量赋一组缺省值 */
  221.         for (i = 0; i < KEY_COUNT; i++)
  222.         {
  223.                 s_tBtn[i].LongTime = KEY_LONG_TIME;                        /* 长按时间 0 表示不检测长按键事件 */
  224.                 s_tBtn[i].Count = KEY_FILTER_TIME / 2;                /* 计数器设置为滤波时间的一半 */
  225.                 s_tBtn[i].State = 0;                                                /* 按键缺省状态,0为未按下 */
  226.         
  227.                 s_tBtn[i].RepeatSpeed = 0;                                        /* 按键连发的速度,0表示不支持连发 */
  228.                 s_tBtn[i].RepeatCount = 0;                                        /* 连发计数器 */
  229.         
  230.         s_tBtn[i].DoubleClickLongTime = KEY_DOUBLE_CLICK_TIME;/* 双击间隔时间,0表示不支持双击 */
  231.         s_tBtn[i].DoubleClickCount = 0;             /* 双击计数器 */
  232.         }

  233.         /* 判断按键按下的函数 */
  234.         s_tBtn[0].IsKeyDownFunc = IsKeyDown1;
  235.     s_tBtn[1].IsKeyDownFunc = IsKeyDown2;
  236. //        s_tBtn[2].IsKeyDownFunc = IsKeyDown3;
  237. //    s_tBtn[3].IsKeyDownFunc = IsKeyDown4;   
  238. //        s_tBtn[4].IsKeyDownFunc = IsKeyDown5;
  239. //    s_tBtn[5].IsKeyDownFunc = IsKeyDown6;
  240. //        s_tBtn[6].IsKeyDownFunc = IsKeyDown7;
  241. //    s_tBtn[7].IsKeyDownFunc = IsKeyDown8;   
  242. //    s_tBtn[8].IsKeyDownFunc = IsKeyDown9;   
  243. }

  244. /*
  245. *********************************************************************************************************
  246. *        函 数 名: bsp_InitKeyHard
  247. *        功能说明: 配置按键对应的GPIO
  248. *        形    参:  无
  249. *        返 回 值: 无
  250. *********************************************************************************************************
  251. */
  252. static void bsp_InitKeyHard(void)
  253. {
  254.     P5M0 &= ~(1<<5);
  255.     P5M1 &= ~(1<<5);   
  256. }

  257. /*
  258. *********************************************************************************************************
  259. *        函 数 名: bsp_DetectKey
  260. *        功能说明: 检测一个按键。非阻塞状态,必须被周期性的调用。
  261. *        形    参:  按键结构变量指针
  262. *        返 回 值: 无
  263. *********************************************************************************************************
  264. */
  265. static void bsp_DetectKey(uint8_t i)
  266. {
  267.         KEY_T *pBtn;

  268.         /*
  269.                 如果没有初始化按键函数,则报错
  270.                 if (s_tBtn[i].IsKeyDownFunc == 0)
  271.                 {
  272.                         printf("Fault : DetectButton(), s_tBtn[i].IsKeyDownFunc undefine");
  273.                 }
  274.         */

  275.         pBtn = &s_tBtn[i];
  276.         if (pBtn->IsKeyDownFunc())
  277.         {
  278.                 if (pBtn->Count < KEY_FILTER_TIME)
  279.                 {
  280.                         pBtn->Count = KEY_FILTER_TIME;
  281.                 }
  282.                 else if(pBtn->Count < 2 * KEY_FILTER_TIME)
  283.                 {
  284.                         pBtn->Count++;
  285.                 }
  286.                 else
  287.                 {
  288.             /*
  289.                 无按键按下状态,设置按键状态为短按,因短按比较特殊,
  290.                 之后需要判断长按以及双击,所以延时发送键值
  291.             */
  292.                         if (pBtn->State == 0)
  293.             {                  
  294.                                 pBtn->State = SMALL_CLICK;/* 状态为1时代表的是短按 */                                                
  295.                         }   /* 如果之前有个短按状态,并且允许了双击功能,且计数值不为0(有过段时间松手),标记按键状态为双击 */
  296.             else if(pBtn->State == SMALL_CLICK && (pBtn->DoubleClickLongTime != 0 && pBtn->DoubleClickCount > 0))
  297.             {
  298.                 pBtn->State = DOUBLE_CLICK;
  299.             }

  300.             /* 只有允许长按时才可以进行连发 */
  301.                         if (pBtn->LongTime > 0)
  302.                         {
  303.                 /* 先触发长按之后进行连发的触发 */
  304.                                 if (pBtn->LongCount < pBtn->LongTime)
  305.                                 {
  306.                                         /* 发送按钮持续按下的消息 */
  307.                                         if (++pBtn->LongCount == pBtn->LongTime)
  308.                                         {
  309.                                                 /* 键值放入按键FIFO */
  310.                                                 bsp_PutKey((uint8_t)(4 * i + 3));
  311.                         pBtn->State = LONG_CLICK;/* 触发长按改变按键状态 */
  312.                                         }
  313.                                 }
  314.                                 else
  315.                                 {
  316.                                         if (pBtn->RepeatSpeed > 0)
  317.                                         {
  318.                                                 if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
  319.                                                 {
  320.                                                         pBtn->RepeatCount = 0;
  321.                                                         /* 常按键后,每隔10ms发送1个按键 */
  322.                                                         bsp_PutKey((uint8_t)(4 * i + 1));
  323.                                                 }
  324.                                         }
  325.                                 }
  326.                         }
  327.                 }
  328.         }
  329.         else
  330.         {
  331.                 if(pBtn->Count > KEY_FILTER_TIME)
  332.                 {
  333.                         pBtn->Count = KEY_FILTER_TIME;
  334.                 }
  335.                 else if(pBtn->Count != 0)
  336.                 {
  337.                         pBtn->Count--;
  338.                 }
  339.                 else
  340.                 {   /* 按键松手之后的一些处理 */         
  341.             switch(pBtn->State)
  342.             {
  343.                 case SMALL_CLICK:/* 短按 */
  344.                     if(pBtn->DoubleClickLongTime == 0)/* 不支持双击立即发送键值 */
  345.                     {
  346.                         pBtn->State = 0;      

  347.                         /* 短按键值存入FIFO */
  348.                         bsp_PutKey((uint8_t)(4 * i + 1));

  349.                         /* 发送按钮弹起的消息 */
  350.                         bsp_PutKey((uint8_t)(4 * i + 2));  
  351.                     }
  352.                     else                            /* 支持双击延时发送键值 */
  353.                     {
  354.                         if(++pBtn->DoubleClickCount == pBtn->DoubleClickLongTime)
  355.                         {
  356.                             pBtn->DoubleClickCount = 0;
  357.                            
  358.                             pBtn->State = 0;      

  359.                             /* 短按键值存入FIFO */
  360.                             bsp_PutKey((uint8_t)(4 * i + 1));

  361.                             /* 发送按钮弹起的消息 */
  362.                             bsp_PutKey((uint8_t)(4 * i + 2));                           
  363.                         }                       
  364.                     }                        
  365.                     break;
  366.                 case LONG_CLICK: /* 长按 */               
  367.                     pBtn->State = 0;  
  368.                     bsp_PutKey((uint8_t)(4 * i + 2));
  369.                     break;
  370.                 case DOUBLE_CLICK: /* 双击 */
  371.                     pBtn->State = 0;  
  372.                     bsp_PutKey((uint8_t)(4 * i + 4));   
  373.                     bsp_PutKey((uint8_t)(4 * i + 2));
  374.                     pBtn->DoubleClickCount = 0;//计时赋值                    
  375.                     break;
  376.                 default:
  377.                     break;
  378.             }
  379.                 }

  380.                 pBtn->LongCount = 0;
  381.                 pBtn->RepeatCount = 0;
  382.         }
  383. }

  384. /*
  385. *********************************************************************************************************
  386. *        函 数 名: bsp_KeyScan
  387. *        功能说明: 扫描所有按键。非阻塞,被systick中断周期性的调用
  388. *        形    参:  无
  389. *        返 回 值: 无
  390. *********************************************************************************************************
  391. */
  392. void bsp_KeyScan(void)
  393. {
  394.         uint8_t idata i;

  395.         for (i = 0; i < KEY_COUNT; i++)
  396.         {
  397.                 bsp_DetectKey(i);
  398.         }
  399. }




复制代码

头文件如下
  1. #ifndef __KEY_H__
  2. #define __KEY_H__

  3. #define KEY_COUNT    2                                                   /* 按键个数, 按键增加需要修改 */

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

  10. #define SMALL_CLICK     1
  11. #define LONG_CLICK      2
  12. #define DOUBLE_CLICK    3

  13. /*
  14.         按键滤波时间50ms, 单位10ms。
  15.         只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
  16.         即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
  17. */
  18. #define KEY_FILTER_TIME         5
  19. #define KEY_LONG_TIME           200                        /* 单位10ms, 持续2秒,认为长按事件 */
  20. #define KEY_DOUBLE_CLICK_TIME   20
  21. typedef struct
  22. {
  23.         /* 下面是一个函数指针,指向判断按键手否按下的函数 */
  24.         uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */

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

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

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

  44.         KEY_1_DOWN,                                /* 1键按下 */
  45.         KEY_1_UP,                                /* 1键弹起 */
  46.         KEY_1_LONG,                                /* 1键长按 */
  47.         KEY_1_DOUBLE,                        /* 1键长按 */
  48.    
  49.         KEY_2_DOWN,                                /* 2键按下 */
  50.         KEY_2_UP,                                /* 2键弹起 */
  51.         KEY_2_LONG,                                /* 2键长按 */
  52.     KEY_2_DOUBLE,   

  53.         KEY_3_DOWN,                                /* 3键按下 */
  54.         KEY_3_UP,                                /* 3键弹起 */
  55.         KEY_3_LONG,                                /* 3键长按 */
  56.     KEY_3_DOUBLE,
  57.    
  58.         KEY_4_DOWN,                                /* 4键按下 */
  59.         KEY_4_UP,                                /* 4键弹起 */
  60.         KEY_4_LONG,                                /* 4键长按 */
  61.     KEY_4_DOUBLE,

  62.         KEY_5_DOWN,                                /* 4键按下 */
  63.         KEY_5_UP,                                /* 4键弹起 */
  64.         KEY_5_LONG,                                /* 4键长按 */
  65.     KEY_5_DOUBLE,

  66.         KEY_6_DOWN,                                /* 4键按下 */
  67.         KEY_6_UP,                                /* 4键弹起 */
  68.         KEY_6_LONG,                                /* 4键长按 */
  69.     KEY_6_DOUBLE,

  70.         KEY_7_DOWN,                                /* 4键按下 */
  71.         KEY_7_UP,                                /* 4键弹起 */
  72.         KEY_7_LONG,                                /* 4键长按 */   
  73.     KEY_7_DOUBLE,

  74.         KEY_8_DOWN,                                /* 4键按下 */
  75.         KEY_8_UP,                                /* 4键弹起 */
  76.         KEY_8_LONG,                                /* 4键长按 */   
  77.     KEY_8_DOUBLE,

  78.         KEY_9_DOWN,                                /* 4键按下 */
  79.         KEY_9_UP,                                /* 4键弹起 */
  80.         KEY_9_LONG,                                /* 4键长按 */  
  81.     KEY_9_DOUBLE,

  82.         KEY_K1K2_DOWN,                        /* k1k2组合键键按下 */
  83.         KEY_K1K2_UP,                        /* k1k2键弹起 */
  84.         KEY_K1K2_LONG,                        /* k1k2键长按 */   
  85.     KEY_K1K2_DOUBLE,

  86.         KEY_K2K3_DOWN,                        /* K2K3组合键键按下 */
  87.         KEY_K2K3_UP,                        /* K2K3键弹起 */
  88.         KEY_K2K3_LONG,                        /* K2K3键长按 */     
  89.     KEY_K2K3_DOUBLE,   
  90. }KEY_ENUM;

  91. /* FIFO缓存事件大小 */
  92. #define KEY_FIFO_SIZE        10
  93. typedef struct
  94. {
  95.         uint8_t Buf[KEY_FIFO_SIZE];                /* 键值缓冲区 */
  96.         uint8_t Read;                                        /* 缓冲区读指针1 */
  97.         uint8_t Write;                                        /* 缓冲区写指针 */
  98.         uint8_t Read2;                                        /* 缓冲区读指针2 */
  99. }KEY_FIFO_T;


  100. /* 供外部调用的函数声明 */
  101. void bsp_InitKey(void);
  102. void bsp_KeyScan(void);
  103. void bsp_PutKey(uint8_t _KeyCode);
  104. uint8_t bsp_GetKey(void);
  105. uint8_t bsp_GetKey2(void);
  106. uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID);
  107. void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t  _RepeatSpeed);
  108. void bsp_ClearKey(void);
  109. #endif





复制代码
脑仁比较小,暂时想到只有这么多,有更好的方法也希望大家多多分享讨论

bsp_key_drive.c

11.6 KB, 下载次数: 54

bsp_key_drive.h

3.35 KB, 下载次数: 40

回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-9-18 13:26:29 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

103

回帖

106

积分

初级会员

积分
106
发表于 2019-9-18 17:46:13 | 显示全部楼层
能否上传.C和.H文件
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2019-9-18 18:54:30 | 显示全部楼层
谢谢分享,其实可以不用改,直接在应用程序里面实现也比较方便。
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2019-9-19 08:42:50 | 显示全部楼层
eric2013 发表于 2019-9-18 18:54
谢谢分享,其实可以不用改,直接在应用程序里面实现也比较方便。

当时有想过应用中实现,结果感觉没有直接驱动上再加个使能方便就放弃了
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2019-9-19 09:32:02 | 显示全部楼层

已经上传了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2019-9-19 11:16:26 | 显示全部楼层
夜乄歌 发表于 2019-9-19 08:42
当时有想过应用中实现,结果感觉没有直接驱动上再加个使能方便就放弃了

我们这个是标准的PC键盘驱动,其它的方式可以直接在这个上面实现。
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2019-9-19 12:06:20 | 显示全部楼层
eric2013 发表于 2019-9-19 11:16
我们这个是标准的PC键盘驱动,其它的方式可以直接在这个上面实现。

这个知道,很好用,第一次看到的时候当即感叹道,还有这种好方法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2019-9-21 01:55:16 | 显示全部楼层
忘了给楼主一个赞,已经加上。
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2019-12-27 09:43:53 | 显示全部楼层
喜欢跟你交流一下按键检测,本人小白,刚刚学习STM32,多指教
对于本程序的疑问:
1:如果不支持长按,也不支持双击的话,按键按下时刻,需要立刻触发一个短按按下的消息,最好是按键按下,立刻产生这个消息。长按和双击这两个选项不冲突,双击之后的长按也可以根据需要自己定义按键码。
2:本程序不支持双击的长按以及三连击四连击(没必要支持的,哈哈),所以第二次按键按下,如果满足双击,就需要立刻产生双击的消息,不应该在第二次按键弹起之后判断,用户体验不好,这个跟对双击的定义,理解有关。
交流:
1:对于双击个人理解:
     定义:双击的判断,很多人都有不同的方法,本程序是判断第一次按键弹出后到第二次按键按下,这段时间的间隔,也有朋友增加判断第一次按键按下的时间,感觉这样定义,都不够准确,或者容易乱。哈哈。
    我觉得从用户角度来看,双击就是两次按键按下的时间间隔,只要这个时间间隔满足我们设置的阈值,就是双击,这样判断更加准确。
    何时生产双击这个消息:很多朋友是在第二次按键弹起之后,判断是否是双击,这个也不够准确,应该在第二按键按下之后,立刻产生双击消息(如果你不支持3连击及以上)。
    双击之后,如果用户按键不松开,可以根据具体需求,是否增加双击的长按,或者双击的连发。
关于组合按键,我理解双击就是一种最简单的组合按键,同一个按键的组合,如果是不同的按键组合,不建议用这种软件架构,因为会产生一个我们不希望看到的一个按键按下(或弹起),这个按键其实是组合按键中的一个。
说的不对的地方,忘交流指正,共同进步,多谢。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
QQ
发表于 2019-12-30 19:53:21 | 显示全部楼层
czm_hyt@163.com 发表于 2019-12-27 09:43
喜欢跟你交流一下按键检测,本人小白,刚刚学习STM32,多指教
对于本程序的疑问:
1:如果不支持长按 ...

可以的,主要当时项目用的时候临时的一个想法,可能有很多不足,但是满足项目需求了,就没再改(脑仁小,懒得在思考!!!),你说的双击的判断,也是一种方法,后续有时间了优化下试试,其实51的控制板一直都是用的状态机的方式,感觉可能那种结构实现起来会好很多,不过也正如硬汉说的,这些其实可以自己根据键值在二次处理下,具体的还真没试过
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2020-3-22 11:33:53 | 显示全部楼层
夜歌 发表于 2019-12-30 19:53
可以的,主要当时项目用的时候临时的一个想法,可能有很多不足,但是满足项目需求了,就没再改(脑仁 ...

我把按键检测做完了,非常高大上,哈哈,可以看我发帖子,
回复

使用道具 举报

73

主题

1200

回帖

1419

积分

至尊会员

积分
1419
发表于 2020-3-22 13:25:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-7-18 00:35:23 | 显示全部楼层
eric2013 发表于 2019-9-19 11:16
我们这个是标准的PC键盘驱动,其它的方式可以直接在这个上面实现。

感觉处理起来也不太方便,有可以参考的应用代码吗?PC是这么处理按键值的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-7-18 00:40:07 | 显示全部楼层
哈哈哈哈嘻嘻 发表于 2020-7-18 00:35
感觉处理起来也不太方便,有可以参考的应用代码吗?PC是这么处理按键值的呢?


H7-TOOL添加了双击支持,是修改驱动代码做的,或者直接复制粘贴楼主做的即可。

H7-TOOL开源项目的GitHub地址,当前版本V1.21,含论坛方式下载原理图,上位机,固件等(2020-06-12)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-7-19 20:22:38 | 显示全部楼层
eric2013 发表于 2020-7-18 00:40
H7-TOOL添加了双击支持,是修改驱动代码做的,或者直接复制粘贴楼主做的即可。

H7-TOOL开源项目的Gi ...

谢谢,硬汉哥
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2020-8-7 10:43:42 | 显示全部楼层
MARK 按键双击
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 01:20 , Processed in 0.221961 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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