微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之十二:按键控制跑马灯(中断)

单片机学习之十二:按键控制跑马灯(中断)

时间:11-18 来源:互联网 点击:

del3: mov r1,#0ffh

del4: djnz r1,del4

djnz r2,del3

ret

end

大家把这个程序下载到学习板上看看,会发现每次按下按键的时候,程序进入中断后,在返回的时候,会回到那个位置继续开始左右循环。这就是由于我们在进入中断的时候保护了现场的缘故。

五、几点说明

主程序是左右跑马灯,其中用到了r7,r6寄存器,还调用了100ms延时,所以也用到了r2,r1寄存器。所以我们要特别注意,在中断服务程序中,要避免使用这几个寄存器。否则,就会导致在中断程序中,修改了r寄存器的内容,导致返回主程序的时候出现问题。

在中断服务程序中,用到了10ms延时程序,这个延时程序使用的寄存器是r4,r3。另外,还调用了light2子程序,其中用到了r5寄存器。所以。主程序和中断服务程序用到的寄存器r就没有冲突。

那么如果由于条件的限制,使得主程序和中断程序的寄存器的数量较多,一组8个寄存器不够,该怎么办呢?

我们也可以象保护a寄存器一样,在进入中断之后,首先把某一个在中断服务程序中也要用到的r寄存器的内容压入堆栈,在退出中断之前再弹出来。

或者我们就重新选择寄存器区吧,由于我们缺省使用的是0区的寄存器组,所以我们就改变psw程序状态字中的rs1和rs0,就可以换另外的一组寄存器区了。例如,我们在进入中断服务程序之后,写这样的两条指令:

clr rs1

setb rs0

这样,我们就用了1区的8个寄存器,这样就没有问题啦。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top