ORG 0000H ;复位入口
LJMP MAIN
ORG 0003H ;外部中断0服务子程序入口
LJMP Loop1 ;转外部中断0服务程序
ORG 0030H
MAIN:MOV SP,#6FH ;总初始化。设定栈底指针
MOV 48H,#04H ;置计次数单元的初值4
MOV 50H,#00H ;置控制码初值
MOV P1,50H ;输出初始控制码
CLR P1.7 ;P1.7初始清0
SETB IT0 ;设INT0中断信号输入下降沿有效
SETB EA ;开中断总允许
SETB EX0 ;开外部INT0中断允许
LOOP:LCALL D05S ;主工作程序。调用延时0.5S子程序
CPL P1.7 ;令P1.7求反,所驱动LED闪烁
SJMP LOOP ;反复循环主工作流程
Loop1: ;外部中断0服务子程序。保护现场
DJNZ 48H,LR ;计次数,未满4次则跳过
MOV 48H,#04H ;重置4次计数单元的初值
INC 50H ;控制码加1
MOV P1,50H ;输出新的控制码
LR:RETI ;中断返回
D05S:MOV R7,#8 ;软件延时约0.5S子程序
D05S2:MOV R6,#200
D05S1:MOV R5,#100
D05S0:NOP
DJNZ R5,D05S0
DJNZ R6,D05S1
DJNZ R7,D05S2
RET ;子程序返回
END
上面这段程序是INT0中断四次,P1口加1。但是如果加入保护现场程序,中断四次,P1口不加1.请帮我分析一下下面的保护现场程序错在哪里
ORG 0000H ;复位入口
LJMP MAIN
ORG 0003H ;外部中断0服务子程序入口
LJMP Loop1 ;转外部中断0服务程序
ORG 0030H
MAIN:MOV SP,#6FH ;总初始化。设定栈底指针
MOV 48H,#04H ;置计次数单元的初值4
MOV 50H,#00H ;置控制码初值
MOV P1,50H ;输出初始控制码
CLR P1.7 ;P1.7初始清0
SETB IT0 ;设INT0中断信号输入下降沿有效
SETB EA ;开中断总允许
SETB EX0 ;开外部INT0中断允许
LOOP:LCALL D05S ;主工作程序。调用延时0.5S子程序
CPL P1.7 ;令P1.7求反,所驱动LED闪烁
SJMP LOOP ;反复循环主工作流程
Loop1: ;外部中断0服务子程序。保护现场
PUSH ACC ;保护现场
PUSH PSW
DJNZ 48H,LR ;计次数,未满4次则跳过
MOV 48H,#04H ;重置4次计数单元的初值
INC 50H ;控制码加1
MOV P1,50H ;输出新的控制码
POP ACC ;恢复现场
POP PSW
LR:RETI ;中断返回
D05S:MOV R7,#8 ;软件延时约0.5S子程序
D05S2:MOV R6,#200
D05S1:MOV R5,#100
D05S0:NOP
DJNZ R5,D05S0
DJNZ R6,D05S1
DJNZ R7,D05S2
RET ;子程序返回
END
------解决方案--------------------------------------------------------
PUSH ACC ;保护现场
PUSH PSW
DJNZ 48H,LR ;计次数,未满4次则跳过
MOV 48H,#04H ;重置4次计数单元的初值
INC 50H ;控制码加1
MOV P1,50H ;输出新的控制码
POP ACC ;恢复现场
POP PSW
------------------------------------------------------------
ACC先进的栈,应该后出
所以先 POP PSW;
然后再 POP ACC;