亚搏电子

软件消除抖动

wmodavis

wmodavis

2010年10月23日加入
739
在相对较短的时间内连续多次读取端口,只有在多次读取的结果没有变化时,您才认为按钮的状态发生了更改。
Erniem.

Erniem.

2011年4月24日加入
8,132
我的按钮端口每25mS读取一次。如果连续两次读取一致,我就声明它是稳定的,并将其放在一个全局变量中。当前的读数也被放置在之前的读数变量中,所以我可以反复执行这个操作。

对于我使用的按钮,这还没有故障是相当响应用户。
takao21203

takao21203

2012年4月28日加入
3702年
从技术上讲,你需要一个低通,它可以非常有效地完成,并且使用很少的codespace。

最好的方法是定期调用代码,通常是20mS左右,可能会慢得多,但如果它太快,您就不能捕获所有的反弹。

我将数字读数放入全局标志,并将关键变量传递给关键测试函数,之后对所有关键变量进行测试。对于许多键,这只产生很少的代码。
joeyd999

joeyd999

2011年6月6日加入
4477年
这里有一些PIC18F代码,我有一个按钮。

功能包括完全脱壳,按,释放,按&释放,保持,重复,双击

代码:
; ******************************************; **民意调查 - 民意调查按钮开关**; ****************************************** pollswitch bcf fswp;清除按压标志BCF FSWR;清除释放标志BCF FSWPR;清除和释放标志BCF FSWWP;清除和保持标志BCF FSWRP;清除按下并重复标志BCF FSWDC;每次8ms MOVF SWDTIMER,f,1;双击计时器运行?SKPZ DECF SWDTIMER,F,1;是的,更新它CLRC;预清载BTFSS按钮;开关按下?setc;是的,设置携带rlcf swhist,w,1;旋转到历史和lw b'1111';只保留4个测试Movwf Swhist,1;保存历史Bz pswup; z标志设置如果Swithc为历史XORLW B'1111'。测试全历史BZ PSWDN; Z如果关闭历史记录;从上次通过PSWTRAN BBC FSWST,PSWSUP的位置;切换仍在上升(释放)BRA PSWSDN;切换仍然下降(按下);在当前通行证中切换PSWUP BBC FSWST,PSWSUP;切换仍然;切换刚转换到上升(释放的)位置BCF FSWST;清除开关电流状态BSF FSWR;表示开关已发布的MOVF SWHTimer,F,1;键压力时间运行skpz; z如果不是bsf fswpr;是的,表示按和释放(否则,按下并按住)CLRF SWHTimer,1;清除开关按住定时器CLRF SWRTimer,1;清除开关按下并重复定时器返回;完成(没有计时器到过程);切换仍然释放(自上次通过以来没有变化)PSWSUP返回;无所事事;在当前通过PSWDN BBS FSWST,PSWSDN的位置下;切换仍然下降;切换刚刚跨越(按下的位置)BSF FSWST;设置切换电流状态BSF FSWP;表示开关只按下BSF FSWRP;第一脉冲重复,也是MOVLFB SWHTimer,CSWHT;设置按下并保持定时器MOVF SWDTimer,F,1;双击计时器运行? skpz bsf fswdc ;yes, signal double click movlfb swdtimer,cswdct+1 ;and reset double-click timer return ;and get out ;switch is still pressed (no change since last pass) pswsdn movf swhtimer,f,1 ;is hold timer already zero? bz pswrpt ;yes, process repeat timer decfsz swhtimer,f,1 ;decrement hold timer return ;nothing to do if not expired bsf fswph ;indicate switch pressed and held bsf fswrp ;and second pulse of repeat bra pswsrpt ;go set repeat timer pswrpt decfsz swrtimer,f,1 ;decrement repeat timer return ;nothing to do if not expired bsf fswrp ;nth pulse of repeat pswsrpt movlfb swrtimer,cswprt ;reload press & repeat timer return
ke5nnt

线程启动

ke5nnt

2009年3月1日加入
384
谢谢你的回复和对这个主题的投入。我以前看过Ganssle的那篇文章,并仔细阅读过。我发现我在这一点上的知识限制了我对他的软件方法的整体理解,尽管我确信如果花更多的时间查找一些我遗漏的细节,我可以弄清楚。

当你用谷歌进行软件开关调试时,你的所有软件方法似乎都符合一般结果。至少我们知道对输入进行轮询以寻找一致性的一般实践。再次感谢你们的洞察力。

问候,
takao21203

takao21203

2012年4月28日加入
3702年
低通滤波器

代码:
Unsigned char key_tst(Unsigned char k){if(k==0){if(!(v_leds&0x04))k++;返回(k);}如果(k = = 1){如果(v_leds&0x04) k + +;返回(k);}}
在适当的间隔调用,传递关键变量

它是2键被按下+再次发布时。
需要重置为零+需要初始化为零之前,第一次使用。

v_leds&0x04是IO位的表达式
线程启动 类似的线程 论坛 回复 日期
Pushkar1 编程和语言 4
一个 PCB布局,EDA和仿真 3.
D 编程和语言 0
R 微控制器 32
b1u3sf4n09 软件& ide 11