RESTART:
JB START,$ ;第一次检测(检测的位置在抖动的过程中)
DELAY(延时程序) 延时消抖
JB START,RESTART再次检测(检测位置在稳定阶段)
……
第一次检测有可能会检测到抖动的波峰“尖点”处,信号为1,此时第一条语句会原地踏步,不往下执行,直到检测到波谷“地点”处,信号为0,才开始执行第二条语句,调用延时子程序,延时子程序会持续一段时间(当然这时间自己定,大概就行),来到第三条语句,再次检测信号(稳定阶段),信号为0(前后检测一致),继续往下执行……如果第二次检测是高电平1,说明(①按键没有被按下,只是信号单纯地抖动而已)或者(②延时太短,第二次检测的位置还在前沿抖动阶段)或者(③延时太长,检测位置在后沿抖动阶段)此时就执行跳转回RESTART,继续重新扫描信号,看按键有没有被按下。
看了n多解释,没有一个是我(新手)觉得通俗易懂的,想了很久才恍然大悟,虽然是18年提出的问题,还是希望能帮助到不理解的同学。不喜勿喷,谢谢!
去抖就是检测到中断电平后需要隔一段时间(几十个ms)再去检测一次。因为IO的抖动也可能有高低电平变化而被单片机检测到,而真正的按键是持续100ms以上的,所以通过延时去抖可以判别出来。这其实是用一个计数器来判断输入的脉冲的宽度,如果宽度大于3个脉冲,则认为这次输入有效,输出一个脉冲宽度的脉冲来替代输入信号,否则认为该次输入无效!library ieee
use ieee.std_logic_1164.all
entity xiaodou is
port(clk,input: in std_logic
output: out std_logic)
end xiaodou
architecture xiaodou_arc of xiaodou is
signal cp:std_logic
signal count:integer range 0 to 3
begin
process(clk)
begin
if(clk'event and clk='1') then 检测上升沿
if(input='1')then 如果有输入信号
if(count=3)then count<=count当计数达到3时,保持计数值不变
else count<=count+1 当其小于3时,进行加1处理
end if
if(count=2)then cp<='1' 如果计数达到2,cp置1
else cp<='0'其余情况全部为0
end if
else count<=0 如果计数出现非法状况,进行清零复位
end if
end if
output<=cp 信号输出
end process
end xiaodou_arc
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)