按键软件消抖自我接触单片机开始就已经存在这个问题了,网上的办法无非是延时消抖和定时轮询。对于写裸机的我来说这两种方法都不可避免的会有资源浪费掉,今天突然有了灵感,想到了一种相对高效的办法来解决消抖问题。

硬件平台:STM32F103RCT6开发板

开发环境:WIN7-64bit+MDK5+STD库

按键消抖的必要性在此我就不多说了。直接步入正题。

在使用本方法前请注意,本方法需要一个全局时间戳的支持。

第一步:初始化全局时间戳的定时器,一般采用SysTick定时器来产生,每ms一次tick即可。

第二步:初始化按键对应的IO,复用为边沿触发的外部中断。

第三步:在外部中断函数中添加按键事件处理函数。

代码如下:

typedef struct _Key_t
{u32 last_time;enum{May_Press,Release,}private_state;enum{No_Press,Short_Press,Long_Press,}state;
}Key_t;#define Is_ShortPress_Threshold   1500

简单定义一个按键状态的结构体,用于管理每个按键的状态。顺便再定义一个长短按的识别阈值,用于区分按键的长短按。

if(key_state.private_state==Release)
{if(KEY==0){key_state.private_state=May_Press;key_state.last_time=course_ms();}
}
else if(key_state.private_state==May_Press)
{if(KEY==1){if((course_ms()-key_state.last_time>10)&&(course_ms()-key_state.last_time<Is_ShortPress_Threshold)){key_state.state=Short_Press;key_state.private_state=Release;}else if(course_ms()-key_state.last_time>Is_ShortPress_Threshold){key_state.state=Long_Press;key_state.private_state=Release;}elsekey_state.private_state=Release;}
}

以上为需要添加到中断处理函数的按键事件处理函数,算法的核心是一个状态机。在本例中,按键被默认上拉,按下接地。course_ms()为获取全局时间戳的函数。

思路解释如下:按键状态结构体有一个用于识别的状态位,默认处于Release,也就是释放的状态。一旦按键被按下,中断触发,此时检查是否是Relase状态,如果是就检查按键是否被拉低,如果是,此时进入May_Press状态,也就是可能是按下的,并且记录此时的时间戳,这一步是消抖的关键。当按键被释放,由于是边沿触发,会再次进行处理,此时检查和上一次触发之间的时间戳之差,如果小于10ms我们就认为是抖动,此时不会对按键输出状态进行修改,而是直接将按键状态置回Relase状态,反之检查差值和长短按阈值之间的关系,将state置位为对应的状态。消抖的核心在于记录时间戳,而这只是一个简单的赋值操作,并不耗费时间。

效率上来说,延时消抖花费时间在无意义延时上,而相对较好的定时轮询还是不可避免的在轮询,而现在这种方式完全是中断性质的。唯一多出的开销(全局时间戳)并不是只可以用于按键消抖,另外在HAL库中存在直接获取tick的函数,这样实现就更方便了。经实际测试,消抖效果可以达到其他两种消抖算法的水平。

一种相对高效的按键消抖方法相关推荐

  1. FPGA---多按键消抖检测

    在学习了单按键消抖方法后,按键消抖的关键点就是20ms的延时,这一点和单片机按键消抖的思路是一样的.但是FPGA的延时需要通过寄存器计数,这个是比较消耗内部资源的.如果要检测4个按键时,最简单的方法就 ...

  2. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

  3. 按键消抖及原理(硬件和软件方法详解)

    在设计单片机按键输入的时候,进行按键消抖是防止按键输入被CPU误读多次的必要手段. 一.按键抖动 按键接法 抖动时间的长短由按键的机械特性决定,一般为5ms-10ms.这是一个很重要的时间参数,在很多 ...

  4. F28335矩阵键盘的3种工作方式代码及按键消抖讨论(包括利用GPIO输入量化实现按键消抖)

    文章目录 前言 1. 延时消抖 1.1 硬件电路 1.2 3种工作方式的代码 2. 利用GPIO输入量化实现按键消抖 2.1 理论分析 2.1 代码分析 前言 本文是在学习普中TMS320F28335 ...

  5. STM32按键消抖的几种实现方式-STM32 Button Debouncing

    一.按键抖动的现象 按键按下和松开的时候,按键金属片之间的贴合.分离有一个过程.给STM32输入的信号并不是理想的0和1切换的过程.而是如下图所示的,按下和松开的一小段时间内按键信号出现抖动(jitt ...

  6. 《按键消抖与LED控制》实验的个人思考与总结

    2019/01/08,第一个判断是否有按键按下的操作好像有问题,有空在修改! 红色为修改部分: 问题描述: 当三个独立按键的某一个被按下后,相应的LED被点亮:再次按下后,LED熄灭,按键控制LED亮 ...

  7. ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

    参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin ...

  8. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...

  9. 单片机按键“消抖”的思考

    初学单片机时,讲到了一个按键"消抖"概念,视屏教程中只是说到要确定按键是不是真正按下,所以需要加一个延时来判断. 附上延时消抖程序代码: 代码1 void keypros() {i ...

最新文章

  1. 说出来你可能不信,现在酒厂都在招算法工程师
  2. 串行总线---差分互连(差分线)之共模、奇模、偶模
  3. 约瑟夫问题pascal程序
  4. LeetCode OJ 之 Valid Anagram
  5. 微软Azure云之企业Exchange 2016部署12—配置负载平衡
  6. XMPP 扎金花各种网络传送之音频发送
  7. 【全网最全】一文搞定 Linux 压缩、解压哪些事儿
  8. [JavaScript] js获取Html元素的实际宽度高度
  9. OpenVINO(Version: 2021.3)系统需求
  10. java map原理_Java中的HashMap的工作原理是什么?
  11. php算数组内值的总和,怎样使用array_sum() 计算数组元素值总和
  12. 目前数据可视化工具软件的排名
  13. echarts(雷达图和中国地图)
  14. win7忘记开机密码怎么弄?
  15. 简单医药项目的疾病分类二级联动
  16. python opencv 图像大小_python使用OpenCV设置图片尺寸
  17. [Vue warn]: Property or method “throttle“ is not defined on the instance but referenced during rende
  18. 计算机地图制图成图方法,第五章 地图成图方法.ppt
  19. ERROR 1130 (HY000): Host XXX is not allowed to connect to this MySQL server
  20. 2020年华东理工大学计算机推免面试

热门文章

  1. Life begins in Beijin
  2. Kyro - To register this class use: kryo.register
  3. Mysql登录报错:Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)
  4. (自用)java博客作业3 Java抽象类
  5. flex是什么及flex布局语法
  6. QVector常见使用方法
  7. java的图片上传详解
  8. java中的super()是什么
  9. LINUX下 ssdp 实现
  10. 【迁移学习】特征空间相同、概率分布不同的概念