搜索
bottom↓
回复: 22

不一样的按键延时思想

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入93汤圆

发表于 2013-12-10 16:12:15 | 显示全部楼层
有自己丝路就好

出130入129汤圆

发表于 2013-12-10 16:19:47 来自手机 | 显示全部楼层
没看出特别的地方

出0入0汤圆

发表于 2013-12-10 16:34:08 | 显示全部楼层
和delay延时消抖原理一致,但超越了传统延时消抖,现在不占CPU了,楼主加油
要注意的是在外部中断触发第一次后要关闭外部中断,不然抖动还会触发外部中断,定时器一直被初始化。

出0入0汤圆

发表于 2013-12-10 16:44:07 | 显示全部楼层
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

出0入54汤圆

发表于 2013-12-10 16:49:12 | 显示全部楼层
如果一般的按键,不太建议使用中断。
一般的按键使用查询即可。

出0入0汤圆

发表于 2013-12-10 16:58:04 | 显示全部楼层
说实话我觉得这样的意义不大。。

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

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

出0入0汤圆

发表于 2013-12-10 17:14:14 | 显示全部楼层
占中断口还单独占一个定时器,也太耗资源了

出0入0汤圆

发表于 2013-12-10 17:21:33 | 显示全部楼层
不错。
继续。

出0入0汤圆

发表于 2013-12-10 17:30:39 | 显示全部楼层
ciddy 发表于 2013-12-10 17:14
占中断口还单独占一个定时器,也太耗资源了

同意
字数补丁。。。。

出0入0汤圆

发表于 2013-12-10 17:32:59 | 显示全部楼层
LZ,那个三行的按钮扫描很好用

出0入0汤圆

 楼主| 发表于 2013-12-10 18:14:10 来自手机 | 显示全部楼层
cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

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

出0入0汤圆

发表于 2013-12-10 22:18:52 | 显示全部楼层
一个按键就占用一个外部中断和定时器太奢侈了吧。一个10ms定时器就够了

出0入0汤圆

发表于 2013-12-10 23:21:11 来自手机 | 显示全部楼层
用定时轮循10ms就可以了,何必那么复杂不实用。做项目就知道麻烦了。

出0入0汤圆

 楼主| 发表于 2013-12-11 01:04:53 | 显示全部楼层
woss1001 发表于 2013-12-10 17:32
LZ,那个三行的按钮扫描很好用

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

出0入0汤圆

发表于 2013-12-11 01:04:58 | 显示全部楼层
鉴定为赚积分的帖子。

出0入0汤圆

 楼主| 发表于 2013-12-11 01:06:34 | 显示全部楼层
cmheia 发表于 2013-12-10 16:44
没看出哪不一样。建议看看nxp网站上DR1159里面那段按键代码

能给个网址不呢 ?

出0入0汤圆

 楼主| 发表于 2013-12-11 01:47:37 来自手机 | 显示全部楼层
xizi 发表于 2013-12-11 01:04
鉴定为赚积分的帖子。

出0入0汤圆

发表于 2013-12-11 07:08:35 | 显示全部楼层
这个思路不错,nRF51822的官方SDK中就采取这个思路。

出0入0汤圆

发表于 2013-12-11 08:39:36 | 显示全部楼层
资源剩余多的可以用用.

出50入0汤圆

发表于 2013-12-11 08:53:08 | 显示全部楼层
还不如用状态机的方式

出0入0汤圆

发表于 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游戏机中口袋妖怪等游戏中常见的  长按变速按键。。。。等等

出0入0汤圆

发表于 2013-12-12 01:09:03 | 显示全部楼层
消灭抖动不是啥难事
多调用几次显示子代码就可以
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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