若一按键需要连续按下如何消抖动?

[复制链接]
3169|8
 楼主| 昂首向前 发表于 2007-8-28 17:39 | 显示全部楼层 |阅读模式
请指教!
maychang 发表于 2007-8-28 18:02 | 显示全部楼层

软件去抖动一般是延时若干ms

然后再读键,两次相同则判断健已稳定。<br />长按键当然就是一定时间内持续按下。<br />连续按键的意思,是在短时间内(秒数量级)按下若干次。因为手的动作比消抖动慢得多,手再快也不可能每秒按下20次,据此判断即可。
 楼主| 昂首向前 发表于 2007-8-28 19:16 | 显示全部楼层

谢谢maychang,真是个热心人!

可是我是这样判断的啊,但是还是会出现有时候按键无作用,或者重复动作的现象,难道还有其他原因?
 楼主| 昂首向前 发表于 2007-8-28 19:28 | 显示全部楼层

譬如这样

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;P2.0,NEXT&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这中间搁了很多条指令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NEXT:ACALL&nbsp;D10MS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;P2.0,NEXT1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..............<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这中间也搁了很多条指令<br />&nbsp;&nbsp;&nbsp;&nbsp;NEXT1:.............<br />这样写会不会出现上述问题呢?
风... 发表于 2007-8-29 01:22 | 显示全部楼层

俺是这么干的:

用数字示波器捕获按键的跳动,对按键按动时的跳动多观察,多测几个键,<br />然后看跳动时间大概是多长(一般应该都在ms级)<br />然后根据这个值进行软件延时!<br /><br />俺一般都是这么干的,不知还有没有更方便的方法,老师多指点啊
computer00 发表于 2007-8-29 03:00 | 显示全部楼层

参考:我以前在ARM_00_OS中的按键处理

/**********************************************************************************************<br />功能:键盘扫描程序。每隔离10ms调用一次。<br />入口参数:无。<br />返回:无。<br />备注:按键相关信息保存在Key中。请参看KEYBoard结构体。<br />**********************************************************************************************/<br />void&nbsp;ScanKey(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//键盘扫描<br />{<br />&nbsp;if(Key.Value)return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果上次按键还未处理,则直接返回,不扫描新的按键<br />&nbsp;<br />&nbsp;if(KEY1IN&nbsp;&&&nbsp;KEY2IN&nbsp;&&&nbsp;KEY3IN&nbsp;&&&nbsp;KEY4IN)&nbsp;&nbsp;&nbsp;&nbsp;//如果输入全部是高,则按键处于释放状态<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;if(!(Key.OldValue))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果上次无按键按下<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果上次有按键按下<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Key.PressedTime&gt100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按键时间超过一秒,长按键码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.Value=Key.OldValue+0x80;&nbsp;&nbsp;&nbsp;//长按键码等于普通按键码加0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(Key.PressedTime&gt1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.Value=Key.OldValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按键值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.OldValue=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br />&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按键按下<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Key.NewValue=0;<br />&nbsp;&nbsp;&nbsp;if(!KEY1IN)Key.NewValue=KEY1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//KEY1键按下<br />&nbsp;&nbsp;&nbsp;if(!KEY2IN)Key.NewValue=KEY2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//KEY2键按下<br />&nbsp;&nbsp;&nbsp;if(!KEY3IN)Key.NewValue=KEY3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//KEY3键按下<br />&nbsp;&nbsp;&nbsp;if(!KEY4IN)Key.NewValue=KEY4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//KEY4键按下<br /><br />&nbsp;&nbsp;&nbsp;if(Key.NewValue==Key.OldValue)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果连续两次扫描到一样的键,即按键按下长于10ms<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Key.PressedTime&gt200)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果按键按下超过2s<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.PressedTime-=4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//则自动按键。相当于每隔50ms按一次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.Value=Key.NewValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.PressedTime++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按键按下计时加一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key.PressedTime=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果本次按下跟上次按下不一样,则按键按下时间清零<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;Key.OldValue=Key.NewValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存本次按键值<br />&nbsp;&nbsp;}<br />}<br />///////////////////////////////////////////////////////////////////////////////////////////////
maychang 发表于 2007-8-29 08:38 | 显示全部楼层

回楼主

问题可能的原因,有软件硬件两种。<br />软件方面,可能是:<br />“这中间搁了很多条指令”<br />有多条指令,&nbsp;D10MS&nbsp;&nbsp;延时10ms,总时间就不是10ms了。再说,执行这些指令时还可能发生中断,那检查两次按键的时间间隔就更长了。<br />比较好的方法是在定时中断里检查按键。一般总要使用定时中断的,例如2ms调用一次显示,那么可以每四次定时中断检查一次按键。这要求检查按键程序写得短小精悍,占用时间尽可能少。<br />硬件方面,可能按键接触不好,或时断时续。<br /><br />
gjg191 发表于 2007-8-29 08:55 | 显示全部楼层

dd

俺以前做家电控制板的时候一般要求1s按3次有反应就ok,人不可能反映那么快的,你可以把延时作的长点
 楼主| 昂首向前 发表于 2007-8-31 12:07 | 显示全部楼层

谢谢楼上各位!

问题解决了,在按键放开的时候也需要放一条判断按键是否松开的指令!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

109

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部