你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于Stm32按键长按与短按经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-30 21:09
第一步 : 首先在key.h定义几个变量
  1. / 按键的键值
  2. #define KEY1_Press 1
  3. #define KEY2_Press 2
  4. #define KEY3_Press 3
  5. #define KEY4_Press 4

  6. / 读取IO口的电平
  7. #define KEY1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
  8. #define KEY2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
  9. #define KEY3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
  10. #define KEY4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
复制代码

第二步: 在key.c 中编写按键扫描函数
  1. <font color = blue  size   = 5> 编写的按键扫描函数, 只需要返回键值即可, 不需要我们判断按键是否松开这些情况

  2. uint8_t KEY_Scan()
  3. {
  4.         if ((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)) 判断是否有按键按下
  5.         {
  6.                 HAL_Delay(10);  消抖
  7.                 if((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))/// 判断按键是否按下
  8.                 {
  9.                         if (!KEY1)  return KEY1_Press;/ 返回键值
  10.                         else if (!KEY2) return KEY2_Press;
  11.                         else if (!KEY3) return KEY3_Press;
  12.                         else if (!KEY4) return KEY4_Press;
  13.                 }
  14.                
  15.         }
  16.         return 0; / 如果没有按键按下 返回0
  17. }
复制代码



三 编写定时器(1ms)
这里我们认为 当按下按键的时间持续 0.8s 认为是长按 !!!!, 需要开启一个定时器和2个记录时间的变量(key_last_time, key_now_time), 为了快速配置, 这里我们使用 Stm32cubemx 配置 我们还可以设置长按的时间来设置不同的状态, 这也是实现仅一个按键可以实现控制多个状态的方法 我使用的板子时钟配置为80MHz, 配置 1ms的中断,

e1591aab2a9c4328a80b9e9bf769cdb2.png

68b29802ea884decbea7e2b31eda819a.png

6c3a1981ce9a42c8a884109d621897d0.png


接下来, 我们只需要 让key_now_time变量在这一个定时器中断里面加1即可

868249bc1ace4ff7b04497ffdc6f4bc4.png

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  1ms的中断
  2. {
  3.         key_now_time++;
  4. }
复制代码

四 编写按键处理函数


35745434387344c59c6ec20cfd09d83c.png

按键处理函数:
  1. void Deal_Key(void)
  2. {
  3.         uint8_t key_value;
  4.         key_value = KEY_Scan(); 获取键值
  5.        
  6.        
  7.         if (key_value !=key_old )
  8.                  与上一次的键值比较 如果不相等,表明有键值的变化,开始计时
  9.         {
  10.                
  11.                 key_old = key_value; 更新旧键值
  12.                 key_last_time = key_now_time; 让2者相等,
  13.         }
  14.         else
  15.                 key_value = 0; 如果没有键值的改变 说明没有按键按下或松开
  16.        
  17.        
  18.         if (key_value)/ 短按处理
  19.         {
  20.                 switch(key_value)
  21.                 {
  22.                         case 1 :   printf("KEY1 按下\r\n"); break;
  23.                         case 2 :   printf("KEY2 按下\r\n"); break;
  24.                         case 3 :   printf("KEY3 按下\r\n"); break;
  25.                         case 4 :   printf("KEY4 按下\r\n"); break;
  26.                 }
  27.                 key_value = 0; /// 该语句可有可无, 为了保险, 最好加上
  28.         }
  29.        
  30.        
  31.         if ((key_now_time- key_last_time > 800))/ 如果按键按下超过0.8s 判断按键
  32.         {
  33.                 if(key_old) / 注意 一定是判断旧键值, 因为当按键一直按下未松开时, 即key_old == key_value,
  34.                  此时key_value 0 ;
  35.                 {
  36.                         switch(key_old)
  37.                         {
  38.                         case 1 :   printf("KEY1 长按\r\n"); break;
  39.                         case 2 :   printf("KEY2 长按\r\n"); break;
  40.                         case 3 :   printf("KEY3 长按\r\n"); break;
  41.                         case 4 :   printf("KEY4 长按\r\n"); break;
  42.                         }
  43.                 }
  44.         }
  45. }
复制代码

接下来, 我们只需要把按键处理函数放入while(1) 大循环中即可!!!!

edf053d1fdda48619f88d3ec34db8fd6.png

————————————————
版权声明:YELLOW_YELLOW_YELOW
如有侵权请联系删除



收藏 评论0 发布时间:2023-4-30 21:09

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版