一、试验现象:
进入程序后,程序作双向跑马灯;按下k0键,程序作左向跑马灯;按下k1按键程序作右向跑马灯;按下k2键两个亮点从两头向中心移动;按下k3键两个亮点从中心向两头移动。
二、试验意图
把握在中止程序中处理多个按键动作的呼应办法
三、试验使命分析:
(留意:在作这个试验的时分,不要忘了把JMP0跳线置于1、2的方位,挑选二极管显现单元。)
在前面的两个中止方法呼应按键动作的试验中,咱们只对一个按键动作做出呼应,难度比较小。
而在这个程序中,咱们的中止程序要对多个按键动作进行呼应, 灯火改换的把戏有4种,用不同的按键切换。那么,这种问题又应该怎么处理呢?
咱们能够这样作:主程序中,咱们作左右跑马灯,信任咱们现已很熟啦。
在中止服务程序中,咱们首要读取按键状况,然后延时10ms,再次读取按键状况。把两次取得的按键状况比较,假如不同,就表明是颤动,退出中止;不然,就去判别是哪个按键按下。假如是k0,就履行左跑马灯;假如是k1,就履行右跑马灯;假如是k2,就履行亮点向中心移动;假如是k3,就履行亮点向两头移动。
这样的思路整体是对的,但是有一点需求留意:咱们在写程序的时分,在中止服务程序中,应该尽量的使得使命简化,不要让中止服务程序作过多杂乱的使命,而要尽量把这些杂乱的使命放到主程序中心去完结。
依照这样的一个思路,咱们的做法如下:
在主程序中设5个标志,然后不断的对这几个标志进行查询:假如是标志1,就履行双向跑马灯;假如是标志2,就履行左向跑马灯;假如是标志3,就履行右向跑马灯,顺次类推。
而在中止服务程序中,咱们只需求进行如下作业:去颤动,键辨认,改动标志,就能够啦。
该程序中,咱们用寄存器r0中的内容作为标志,当它里边的内容是0ffh时,履行左右跑马灯程序;为00h时,履行左跑马灯;01h时履行右跑马灯;02h时履行两个亮点向中心移动;03h时履行两个亮点象两头移动。
现在来看看主程序和中止服务程序的流程图吧:
下面便是依照这个思路编写的程序,这个程序的结构稍微杂乱,咱们要留意。
四、试验程序如下:
org 0000h
ajmp start
org 0013h
ajmp ext1
org 0020h
start: clr p1.5
mov r0,#0ffh ;对r0赋初值,r0即为咱们设的标志,
setb ea ;开中止
setb ex1 ;答应外部中止1请求中止
setb it1 ;设置外部中止1跳变方法触发
mov sp,#70h ;设置仓库
loop0: cjne r0,#0ffh,loop1 ; 假如r0中的内容不是0ffh,转去loop1
ajmp main_light ;不然,履行左右跑马灯
loop1: cjne r0,#00h,loop2 ;假如r0中的内容不是00h,转去loop2
ajmp k0_light ;不然,履行左向跑马灯
loop2: cjne r0,#01h,loop3 ;假如r0中的内容不是01h,转去loop3
ajmp k1_light ;不然,履行右向跑马灯
loop3: cjne r0,#02h,loop4 ;假如r0中的内容不是02h,转去loop4
ajmp k2_light ;不然,履行双亮点向中心移动
loop4: cjne r0,#03h,loop5 ;假如r0中的内容不是03h,回来重新开端查询
ajmp k3_light ;不然,履行双亮点向两头移动
loop5: ajmp loop0 ;回来重新开端查询
ext1: clr ea ;封闭中止
push acc ;现场维护
push psw
mov a,p1 ;读入按键状况
anl a,#0fh ;屏蔽高四位
mov 30h,a ;把键盘状况值保存在30h
mov a,p1 ;再次读入按键状况
anl a,#0fh ;屏蔽高四位
cjne a,30h,pass ;两次的按键值假如不持平,表明是颤动,退出中止
ajmp k0_check ;假如持平,转去键辨认程序
;以下是按键辨认程序
k0_check: cjne a,#0dh,k1_check ;假如不是k0按下,转去判别是否k1按下
ajmp k0_manage ;不然,转去k0的按键处理程序
k1_check: cjne a,#0eh,k2_check ;假如不是k1按下,转去判别是否k2按下
ajmp k1_manage ;不然,转去k1的按键处理程序
k2_check: cjne a,#0bh,k3_check ;假如不是k2按下,转去判别是否k3按下
ajmp k2_manage ;不然,转去k2的按键处理程序
k3_check: cjne a,#07h,pass ;假如不是k3按下,退出中止
ajmp k3_manage ;不然,转去k3的按键处理程序
;以下是各按键相应的处理程序,
k0_manage: mov r0,#00h ;置标志2
ajmp pass
k1_manage: mov r0,#01h ;置标志3
ajmp pass
k2_manage: mov r0,#02h ;置标志4
ajmp pass
k3_manage: mov r0,#03h :置标志5
ajmp pass
pass: pop psw ;康复现场
pop acc
setb ea ;开中止
reti ;中止回来
main_light: mov r7,#08h ;main_light是左右跑马灯程序
mov r6,#06h
mov a,#0feh
l_loop: mov r1,a ;用r1保存现在的亮点方位,便于改换灯火时从该方位开端
mov p0,a
lcall del100ms
rl a
djnz r7,l_loop
mov a,#0bfh
r_loop: mov r1,a
mov p0,a
lcall del100ms
rr a
djnz r6,r_loop
ljmp loop0
k0_light: mov a,r1 ;k0_light是左向跑马灯程序
mov p0,a
lcall del100ms
rl a
mov r1,a
ajmp loop0
k1_light: mov a,r1 ;k1_light是右向跑马灯程序
mov p0,a
lcall del100ms
rr a
mov r1,a
ajmp loop0
k2_light: mov p0,#7eh ;k2_light是双亮点向中心程序
lcall del100ms
mov p0,#0bdh
lcall del100ms
mov p0,#0dbh
lcall del100ms
mov p0,#0e7h
lcall del100ms
ajmp loop0
k3_light: mov p0,#0e7h ;k3_light是双亮点向两头程序
lcall del100ms
mov p0,#0dbh
lcall del100ms
mov p0,#0bdh
lcall del100ms
mov p0,#7eh
lcall del100ms
ajmp loop0
del10ms: mov r5,#20 ;10ms延时程序
del1: mov r4,#0ffh
del2: djnz r4,del2
djnz r5,del1
ret;
del100ms: mov r3,#200 ;100ms延时程序
del3: mov r2,#0ffh
del4: djnz r2,del4
djnz r3,del3
ret
end;