单片机键盘消抖,用延时消抖,汇编语言
4个回答
展开全部
RESTART:
JB START,$ ;第一次检测(检测的位置在抖动的过程中)
DELAY(延时程序) ;延时消抖
JB START,RESTART;再次检测(检测位置在稳定阶段)
……
第一次检测有可能会检测到抖动的波峰“尖点”处,信号为1,此时第一条语句会原地踏步,不往下执行,直到检测到波谷“地点”处,信号为0,才开始执行第二条语句,调用延时子程序,延时子程序会持续一段时间(当然这时间自己定,大概就行),来到第三条语句,再次检测信号(稳定阶段),信号为0(前后检测一致),继续往下执行……如果第二次检测是高电平1,说明(①按键没有被按下,只是信号单纯地抖动而已)或者(②延时太短,第二次检测的位置还在前沿抖动阶段)或者(③延时太长,检测位置在后沿抖动阶段)此时就执行跳转回RESTART,继续重新扫描信号,看按键有没有被按下。
看了n多解释,没有一个是我(新手)觉得通俗易懂的,想了很久才恍然大悟,虽然是18年提出的问题,还是希望能帮助到不理解的同学。不喜勿喷,谢谢!
意法半导体(中国)投资有限公司
2020-01-15 广告
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
一般是延时40ms到80ms之间,你可以取60ms试一下。用汇编或者C语言写一个延时程序就行,如果系统还要干别的时,比如扫描数码管显示什么的,等不了这么常时间,为了提高CPU的利用效率,你可以用定时器中断来延时,这样在定时器计数的时间内只要把键盘扫描使能关了,就可以让处理器干别的事了。延时到了再打开键盘使能就行了。
下边普通延时程序,晶振12M,一个时钟周期是12个机器周期的情冲下的延时60ms汇编子程序如下:
DELAY: ;延时60ms误差 0us
MOV R7,#07H
DL1:
MOV R6,#0A8H
DL0:
MOV R5,#18H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
下边同样硬件的情况下,C语言的延时子程序:
void delay(void) //延时60ms误差 0us
{
unsigned char a,b,c;
for(c=7;c>0;c--)
for(b=168;b>0;b--)
for(a=24;a>0;a--);
}
下边普通延时程序,晶振12M,一个时钟周期是12个机器周期的情冲下的延时60ms汇编子程序如下:
DELAY: ;延时60ms误差 0us
MOV R7,#07H
DL1:
MOV R6,#0A8H
DL0:
MOV R5,#18H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
下边同样硬件的情况下,C语言的延时子程序:
void delay(void) //延时60ms误差 0us
{
unsigned char a,b,c;
for(c=7;c>0;c--)
for(b=168;b>0;b--)
for(a=24;a>0;a--);
}
追问
延时程序我会编,只是我想知道具体怎么消抖
追答
就是只取开始的第一个值,中间的60ms之间不取任何值,60ms之后再取的值就认为是下一次按键的值,不用两次比较。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般按键按下时,往往会出现所按的按键在闭合和断开位置之间跳几下才稳定在闭合状态这就是按键抖动。抖动持续时间不一,一般不会大于10MS。
据此,在按下按键时,延时10MS,就可消除抖动。
程序可以这样:
JB KEY1,$ ;等待按键按下,这只是个例子,用了$。如果几个按键,KEY1没按下,可以转到判断第2 个键
ACALL DL10MS
JNB KEY1,$-2 ;等待释放,未释放跳到上一条继续延时
.... ;键 按下,执行按键处理程序
据此,在按下按键时,延时10MS,就可消除抖动。
程序可以这样:
JB KEY1,$ ;等待按键按下,这只是个例子,用了$。如果几个按键,KEY1没按下,可以转到判断第2 个键
ACALL DL10MS
JNB KEY1,$-2 ;等待释放,未释放跳到上一条继续延时
.... ;键 按下,执行按键处理程序
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
KEYVAL EQU 30H
GETKEY:
LCALL KEYSCAN
MOV B,A
LCALL DELAY
LCALL KEYSCAN
CJNE A,B,GETKEY
MOV KEYVAL,A
RET
GETKEY:
LCALL KEYSCAN
MOV B,A
LCALL DELAY
LCALL KEYSCAN
CJNE A,B,GETKEY
MOV KEYVAL,A
RET
更多追问追答
追问
具体这这延时怎么用,延时程序我会,只是不知道怎么用这个延时
追答
当检测到有键按下时,延时10~30毫秒(具体多少可以自己定),再检测键值,与上次键值比较看是否一致,如果相同则OK,如果不同则ERROR,重检测。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询