1066950103 发表于 2013-12-10 16:02:54

不一样的按键延时思想

最近在学习嵌入式的驱动程序,在编写按键程序时,具体思路是这样的,利用外部中断读取按键按下,在中断服务程序里面实现开启定时器,并且初始化它,当定时器到达10毫秒后按键值有效。这里技巧不管你抖动多少次,都不会立即让键值有效,必须在最后一个进入中断服务程序的都抖动延时了10毫秒才有效,这中思路与传统思路不同!

tim 发表于 2013-12-10 16:12:15

有自己丝路就好

68336016 发表于 2013-12-10 16:19:47

没看出特别的地方

binaimei2007 发表于 2013-12-10 16:34:08

和delay延时消抖原理一致,但超越了传统延时消抖,现在不占CPU了,楼主加油{:tongue:}
要注意的是在外部中断触发第一次后要关闭外部中断,不然抖动还会触发外部中断,定时器一直被初始化。

cmheia 发表于 2013-12-10 16:44:07

没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

lusson 发表于 2013-12-10 16:49:12

如果一般的按键,不太建议使用中断。
一般的按键使用查询即可。

sco518 发表于 2013-12-10 16:58:04

说实话我觉得这样的意义不大。。

你完全可以定一个10ms的定时器中断,每10ms检测一次按键,如果有按键按下,那标志位置位,下次检测时如果还是按下的,那么就可以确认是按键按下了。如果连续检测到按下,还能定一个次数将其标志为长按。

我记得傻孩子有一篇专门讲按键思路的,楼主可以搜一下。

ciddy 发表于 2013-12-10 17:14:14

占中断口还单独占一个定时器,也太耗资源了

Excellence 发表于 2013-12-10 17:21:33

不错。
继续。

brahen 发表于 2013-12-10 17:30:39

ciddy 发表于 2013-12-10 17:14
占中断口还单独占一个定时器,也太耗资源了

同意
字数补丁。。。。

woss1001 发表于 2013-12-10 17:32:59

LZ,那个三行的按钮扫描很好用

1066950103 发表于 2013-12-10 18:14:10

cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

晚上回去的时候一定去看看。

fzkqi 发表于 2013-12-10 22:18:52

一个按键就占用一个外部中断和定时器太奢侈了吧。一个10ms定时器就够了

Eiman 发表于 2013-12-10 23:21:11

用定时轮循10ms就可以了,何必那么复杂不实用。做项目就知道麻烦了。

1066950103 发表于 2013-12-11 01:04:53

woss1001 发表于 2013-12-10 17:32
LZ,那个三行的按钮扫描很好用

就是 我也看过的的确很不错,好像很久以前就有了。貌似用了状态机的。

xizi 发表于 2013-12-11 01:04:58

鉴定为赚积分的帖子。

1066950103 发表于 2013-12-11 01:06:34

cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

能给个网址不呢 ?

1066950103 发表于 2013-12-11 01:47:37

xizi 发表于 2013-12-11 01:04
鉴定为赚积分的帖子。

overheat 发表于 2013-12-11 07:08:35

这个思路不错,nRF51822的官方SDK中就采取这个思路。

phone 发表于 2013-12-11 08:39:36

资源剩余多的可以用用.

wangrwnyan123 发表于 2013-12-11 08:53:08

还不如用状态机的方式

wear778899 发表于 2013-12-11 09:30:18

补充一下7搂的思路   假设按键 抬起为1按下为0    则按键按下一次的采样值可以大致描述为(想象成一个按下的波形经过IO读取高低点平这时抖动波形被IO自动比较成1或者0-数字化)   111111111010110000000101010111111111(假设N毫秒等间隔采样一次)

全部是1时为抬起   全部是0时为按下   10穿插存在时为抖动

于是可以认为一直采样到1时没有按键   连续采样到X个0时有按键(X的大小用于确定按键按下)采样到一堆混合的0 1说明在抖动

则可定义 变量 key = 0   当IO=1时令 key = 0
当IO=0 时key++

于是发生111111时key = 0
发生 10101001010 时 key 被间隔的 IO=1 清零

发生00000时key++   key 的最大值取决于 连续0的个数

if key>x 时认为按键按下    X取决于采样间隔合适的X值 可以实现非常灵敏 并且消抖完美的按键体验

另外长按按键也可以通过 X 积累到更大的值 实现   还有例如NDS游戏机中口袋妖怪等游戏中常见的长按变速按键。。。。等等

lxa0 发表于 2013-12-12 01:09:03

消灭抖动不是啥难事
多调用几次显示子代码就可以
页: [1]
查看完整版本: 不一样的按键延时思想