C51程序求指导
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;