当前位置: 代码迷 >> 汇编语言 >> C51程序求指导,该如何解决
  详细解决方案

C51程序求指导,该如何解决

热度:399   发布时间:2013-02-26 00:00:00.0
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;


  相关解决方案