[应用方案] 按键处理

[复制链接]
 楼主| sesefadou 发表于 2025-4-16 23:52 | 显示全部楼层 |阅读模式
按键处理原则上必须遵循:
1,不可以有硬延时,消抖用变量++或者硬件处理掉!
2,多按键预防卡键,有一个按键不好使了,不能影响其它按键工作!
  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    key.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  fengwu yang
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    2019/10/12
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   按键检测模板
  8.   ******************************************************************************
  9.   一,使用说明:检测引脚(PB5)
  10.         1,把以下程序放在1ms定时器中断中
  11.             if(KeySmartConfig[1])
  12.                 KeySmartConfig[5]++;
  13.             else
  14.                 KeySmartConfig[5]=0;

  15.             if(KeySmartConfig[2])
  16.                 KeySmartConfig[6]++;
  17.             else
  18.                 KeySmartConfig[6]=0;
  19.         
  20.         2,主循环调用使用
  21.             while(1)
  22.             {
  23.                 SmartConfigKey();
  24.                
  25.                 //例1:检测到按键按下执行某段代码
  26.                 if(KeySmartConfig[3] == 1)
  27.                 {
  28.                     KeySmartConfig[3] = 0;//清零以后,只有按键松开再按下的时候才会进入
  29.                     //执行的代码
  30.                 }

  31.                 //例2:检测到按键按下,然后根据按下时间执行某段代码
  32.                 if(KeySmartConfig[3] == 1)
  33.                 {
  34.                     if(KeySmartConfig[5]>=3000)//按下时间大于3S
  35.                     {
  36.                         KeySmartConfig[3] = 0;//清零以后,只有按键松开再按下的时候才会进入
  37.                         //执行的代码
  38.                     }
  39.                 }
  40.                
  41.                 //例3:检测到按键松开执行某段代码
  42.                 if(KeySmartConfig[4] == 1)
  43.                 {
  44.                     KeySmartConfig[4] = 0;//清零以后,只有按键按下然后松开的时候才会进入
  45.                     //执行的代码
  46.                 }
  47.                
  48.                 //例4:检测到按键松开,然后根据松开时间执行某段代码
  49.                 if(KeySmartConfig[4] == 1)
  50.                 {
  51.                     if(KeySmartConfig[6]>=3000)//松开时间大于3S
  52.                     {
  53.                         KeySmartConfig[4] = 0;//清零以后,只有按键按下再松开的时候才会进入
  54.                         //执行的代码
  55.                     }
  56.                 }
  57.             }
  58.   ******************************************************************************
  59.   */

  60. #define __KEY_C_
  61. #include "include.h"

  62. int KeySmartConfig[7]={0};//消抖变量 按下标记 松开标记 按下标记拷贝  松开标记拷贝 按下时间(Ms) 松开时间(Ms)
  63.    
  64. /**
  65. * @brief  按键处理
  66. * @param  
  67. * @param  None
  68. * @param  None
  69. * @retval None
  70. * [url=home.php?mod=space&uid=389923]@example[/url]
  71. **/
  72. void SmartConfigKey(void)
  73. {
  74.   if(SmartConfigKeyPinIn == KeySmartConfigDown)
  75.     {
  76.         if(KeySmartConfig[1] == 0)
  77.         {
  78.             KeySmartConfig[0]++;
  79.             if(KeySmartConfig[0]>=500)//按下以后进入
  80.             {
  81.                 KeySmartConfig[0] = 0;//Cnt
  82.                 KeySmartConfig[2] = 0;//UP
  83.                 KeySmartConfig[1] = 1;//Down
  84.                 KeySmartConfig[3] = 1;//DownCopy
  85.                 KeySmartConfig[4] = 0;//UpCopy
  86.             }
  87.         }
  88.     }
  89.     else
  90.     {
  91.         KeySmartConfig[0]++;
  92.         if(KeySmartConfig[0]>2000)
  93.         {
  94.             KeySmartConfig[0]=0;
  95.             if(KeySmartConfig[1]==1)//按下后松开后进入
  96.             {
  97.                 KeySmartConfig[2] = 1;//UP
  98.                 KeySmartConfig[1] = 0;//Down
  99.                 KeySmartConfig[3] = 0;//DownCopy
  100.                 KeySmartConfig[4] = 1;//UpCopy
  101.             }
  102.         }
  103.     }
  104. }




#ifnde
  1. f __KEY_H_
  2. #define __KEY_H_
  3. #include "stm32f10x.h"
  4. #ifndef __KEY_C_
  5. #define __KEY_C_  extern
  6. #else
  7. #define __KEY_C_
  8. #endif


  9. #define KeySmartConfigDown 0  //0- 低电平认为是按下  1-高电平认为是按下
  10. #define SmartConfigKeyPinIn PBin(5)  //检测的按键引脚
  11. __KEY_C_ int KeySmartConfig[7];//消抖变量 按下标记 松开标记 按下标记拷贝  松开标记拷贝 按下时间(Ms) 松开时间(Ms)
  12. void SmartConfigKey(void);
  13.    
  14. #endif




二,添加文件到工程









二,.h 包含

















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

本版积分规则

25

主题

1845

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

25

主题

1845

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部