OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10450|回复: 4

基于时间戳的按键去抖(中断方式)

[复制链接]

5

主题

14

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2012-9-7
在线时间
3 小时
发表于 2013-9-9 17:23:01 | 显示全部楼层 |阅读模式

最近做项目时在做键盘去抖时想到一个新方法与大家分享下。

其实很简单就是为每个按键定义一个存放时间戳(上次按键中断)的变量dwTsOld,在中断处理程序中首先获取当前时间戳(可用内核时钟计数DWT_CYCCNT寄存器的值作为时间戳),计算与上次中断时记录的时间戳的差值。如果小于设定的去抖时间(如20ms)就视为无效中断(抖动部分)直接return退出中断处理,否则为有效中断,判断中断的触发类型(上下边沿)可得知是按键按下还是弹起,之后进行进一步处理(如ucos系统下向其他任务发送消息表明有按键按下或弹起需要进一步处理),最后将新时间戳保存到dwTsOld变量并退出中断。

此方法就是将按键按下或弹起时的第一个边沿作为有效按键事件,此后去抖时间(如20ms)的中断全部丢掉。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-9-9 17:39:58 | 显示全部楼层
回复【楼主位】cqzww:
---------------------------------
不对吧,你这种去抖只能解决按下时,里面有跳回来的情况,但是不能处理比如有个干扰串进线路引起中断的情况。
一般要中断+定时吧,因为这种中断处理时间不敏感(>=20),定时可以与其它定时合并使用(如usos的定时,在后面处理)

当然,如果你只是在按键抬起时算一个,这样的话,你这处理还是可以的,但长按的连发如何处理?
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-9-9 18:53:58 | 显示全部楼层
很常用的一种方法,我之前弄智能小车的码盘计数是也会有抖动,用时间间隔可以解决抖动
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-9-9 19:04:52 | 显示全部楼层
实际应用中,去抖的话肯定不能用延时查询。
实现的方法有多种,不过发生第一次中断后就应该关闭中断,而改用定时器超时查询,超时后(比如20ms)如果到时候电平没有恢复,就认为按键被稳定按下了。然后可以再开启按键释放中断(如果有需要的话)。
业余程序玩家。
回复 支持 反对

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2013-9-9 19:28:56 | 显示全部楼层
很简单啊,在定时器周期中断里检查按键状态,按下则计数变量+1,否则清零,这样既可以去抖还可以判别长按键,还能实现组合键,我在帖子咧写过一个框架。组合按键先后顺序还可以确定,挺好用的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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