一、试验现象
最右面的数码管初始显现0,每次按下外部按键K1履行加一,计数到九时从头回零。
二、试验意图
把握读取外部按键时分应该留意的事项,把握查询办法呼应按键的办法
把握读取按键去颤动的办法
把握判直接寻址位搬运指令jb,jnb的用法。
三、试验任务分析
单片机呼应外部按键的办法有两种,一种是查询办法,一种是中止办法。
查询办法的呼应进程如下:单片机不断的查询是否有按键按下,假如有按键按下的话,就履行相应的程序,不然持续查询。
中止办法的呼应进程如下:单片机处理自己的作业,假如有按键按下,向单片机宣布中止恳求。单片机停下现在正在处理的作业,转去履行中止程序,履行之后回来持续方才的作业。
本试验程序咱们选用查询办法完结,下一个试验咱们选用中止办法完结。
仍是先看看电路图吧,当JMP4跳线拔下的时分,电路图如下图6-1所示。
(注:假如JMP4跳线插上,则按键和中止树立联络。在本试验中,JMP4跳线能够插也能够不插。因为咱们选用查询办法,没有开中止。详细情况下一个试验介绍。)
从图上咱们能够看到,当按键k1按下的时分,对应P1.0输入低电平。因而,咱们要查询k1是否按下,只需检测到p1.0是低电平就能够拉。
留意,在查询按键是否按下时分,特别需求留意按键的去颤动问题,为什么呢?
因为按键或许键盘都是使用机械触点的合、断效果。因为机械触点的弹性效果,在闭合和断开的瞬间都会呈现颤动问题。因为这种颤动,使得电压信号在机械触点的闭合、断开瞬间会呈现一系列的脉冲信号,如下图所示。颤动的时刻长短,与开关的机械特性有关,一般为5~10ms。
按键的安稳闭合期,由操作人员的按键动作确认,一般为十分之几秒至几秒。为了确保按下一次按键,单片机只对按键作一次处理,就必须经曩昔颤动处理。
通常去颤动的办法有硬件和软件两种。
硬件去抖是使用根本RS触发器或许单稳态电路构成,咱们能够参阅相关数电教材。
软件处理的办法是:在检测到按键按下时,履行一个10ms左右的延时程序后,再次检测该按键是否按下。假如仍然是按下状况,就确以为键真实按下,然后消除了颤动的影响。
依照这个思路编写的程序如下:
四、试验程序
org 0000h
start: clr p1.5
mov p0,#48h
mov p2,#01h ;初始状况最右面的数码管显现0
main: mov r7,#0ffh
wait1: jb p1.0,wait1 ;假如P1.0为1,转回wait1持续查询。不然调用延时程序
lcall del10ms ;调用10ms延时
jb p1.0,wait1 ;再次查询P1.0,假如是1,表明是颤动,转回wait1
ljmp play1 ;确认按键按下,转去数码显现程序
play1: inc r7
mov a,r7
mov dptr,#tab
movc a,@a+dptr ;使用查表指令找欲显现的数字,
mov p0,a ;把 这个数字送到P0显现
cjne a,#48h,wait1 ;假如没有显现到最后一个数字,就持续查询按键状况
ljmp main ;假如显现到最后一个数字就从头开始
tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h ;寄存欲显现数字的表格
del10ms:mov r6,#14h ;10ms延时子程序
del1: mov r5,#0ffh
del2: djnz r4,del2
djnz r3,del1
ret
end
把这个程序下载到学习板上,按下k1,发现了什么?
咱们发现这个程序运转不是很安稳,假如咱们按下的时刻略微长一点,显现的数字就会改换几回。
这是为什么呢?
因为数字显现之后,单片时机回来从头查询P1.0的状况,假如按下的时刻很长,就会导致单片机又检测到低电平,所以就持续显现。因而就会呈现过错。
假如咱们期望按下一次按键,不管时刻长短,单片机只作一次按键处理,应该怎么办呢?
咱们能够这样作:在数字显现之后,回来从头查询之前,咱们参加一条指令,让单片机检测P1.0是否回到高电平。假如是,就表明按键按下了一次,程序能够回来持续查询,不然等候,一直到P1.0回到高电平。这样就确保了按键按下一次,不管时刻长短,单片机只作一次按键处理。
详细的做法是在本来的程序中添加如下的赤色句子,改善后的程序如下:
org 0000h
start:clr p1.5
mov p0,#48h
mov p2,#01h ;初始状况右面数码管显现0
main: mov r7,#0ffh
wait1:jb p1.0,wait1 ;按键没有按下,等候
call del10ms ;调用延时
jb p1.0,wait1 ;持续查询
ljmp play1
play1: inc r7
mov a,r7
mov dptr,#tab
movc a,@a+dptr
mov p0,a ;查表显现数字
wait2: jnb p1.0,wait2 ;等候按键弹起
cjne a,#48h,wait1 ;判别是否显现到最后一个数字
ljmp main
ret
tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h
del10ms:mov r6,#14h
del1: mov r5,#0ffh
del2: djnz r4,del2
djnz r3,del1
ret
end