我刚开始学习
单片机AT89S51,正在练习外部中断,有一个问题不明白请大家指教,当外部中断INT1发生并执行相应的中断子程序时,外部中断INT0如果发生的话,会执行相应的中断子程序吗?汇编程序如下:
ORG 00H;
JMP READY;
ORG 03H;
JMP INT_0;
ORG 13H;
JMP INT_1;
READY:
MOV IE,#85H;
MOV A,#80H;
MAIN:
MOV P0,#0F0H;
JMP MAIN;
INT_0: ;向右的流水灯
RR A;
MOV P0,A;
CALL DELAY;
JMP INT_0;
RE
ti
INT_1: ;向左的流水灯
RL A;
MOV P0,A;
CALL DELAY;
JMP INT_1;
RETI
DELAY: ;延时
MOV R5,#50;
D1:
MOV R4,#20;
D2:
MOV R3,#248;
DJNZ R3,$
DJNZ R4,D2
DJNZ R5,D1
RET
END
我的实验现象是:分别响应外部中断INT0和INT1时均能实现设定的目标,但当我先响应外部中断INT1,再响应外部中断INT0时,向左的流水灯无法变为向右。
JMP READY; ;两个字节空间
MOV IE,#85H; ;两个字节空间
MOV A,#80H; ;两个字节空间
这3句占用6个字节 把外部中断0服务程序入口地址覆盖了吧。
ORG 03H; ;03H外部中断0服务程序入口
JMP INT_0;
你把第一行改成ORG 0100H 试试保护现场就是为了使中断服务子程序运行的时候不破话某些寄存器或者寄存单元的数据。以免在中断返回后主程序的运行受到影响。堆栈操作指针主要是用于“保护现场”和“现场恢复”的、希望对你有帮助。(PUSH --->入栈 POP--->出栈 太多了你百度吧。。。。。)
一周热门 更多>