不一样的按键延时思想
最近在学习嵌入式的驱动程序,在编写按键程序时,具体思路是这样的,利用外部中断读取按键按下,在中断服务程序里面实现开启定时器,并且初始化它,当定时器到达10毫秒后按键值有效。这里技巧不管你抖动多少次,都不会立即让键值有效,必须在最后一个进入中断服务程序的都抖动延时了10毫秒才有效,这中思路与传统思路不同! 有自己丝路就好 没看出特别的地方 和delay延时消抖原理一致,但超越了传统延时消抖,现在不占CPU了,楼主加油{:tongue:}要注意的是在外部中断触发第一次后要关闭外部中断,不然抖动还会触发外部中断,定时器一直被初始化。 没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码 如果一般的按键,不太建议使用中断。
一般的按键使用查询即可。 说实话我觉得这样的意义不大。。
你完全可以定一个10ms的定时器中断,每10ms检测一次按键,如果有按键按下,那标志位置位,下次检测时如果还是按下的,那么就可以确认是按键按下了。如果连续检测到按下,还能定一个次数将其标志为长按。
我记得傻孩子有一篇专门讲按键思路的,楼主可以搜一下。 占中断口还单独占一个定时器,也太耗资源了 不错。
继续。
ciddy 发表于 2013-12-10 17:14
占中断口还单独占一个定时器,也太耗资源了
同意
字数补丁。。。。 LZ,那个三行的按钮扫描很好用 cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码
晚上回去的时候一定去看看。
一个按键就占用一个外部中断和定时器太奢侈了吧。一个10ms定时器就够了 用定时轮循10ms就可以了,何必那么复杂不实用。做项目就知道麻烦了。 woss1001 发表于 2013-12-10 17:32
LZ,那个三行的按钮扫描很好用
就是 我也看过的的确很不错,好像很久以前就有了。貌似用了状态机的。 鉴定为赚积分的帖子。 cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码
能给个网址不呢 ? xizi 发表于 2013-12-11 01:04
鉴定为赚积分的帖子。
这个思路不错,nRF51822的官方SDK中就采取这个思路。 资源剩余多的可以用用. 还不如用状态机的方式 补充一下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游戏机中口袋妖怪等游戏中常见的长按变速按键。。。。等等 消灭抖动不是啥难事
多调用几次显示子代码就可以
页:
[1]