您的位置 首页 方案

单片机学习之十三:流水灯把戏改换(中止)

一、实验现象:进入程序后,程序作双向跑马灯;按下k0键,程序作左向跑马灯;按下k1按键程序作右向跑马灯;按下k2键两个亮点从两边向中间…

一、试验现象:

进入程序后,程序作双向跑马灯;按下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;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/266865.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部