注册 登录
编程论坛 汇编论坛

关于51单片机汇编中中断的问题,小弟写的程序出现了一些错误,没有找到准确的解决办法,求指导

a616781689 发布于 2016-02-21 10:06, 5260 次点击
下面是程序的源代码:
程序代码:

//**************************************************************************************
//程序名称:汇编语言的基础运用,中断打断数码管
//调试环境:proteus仿真
//作    者:CAIN
//预期效果:当开关按下的时候数码管会停止变化,led灯流水显示,之后继续执行数码管程序
//创建日期:2016.2.19
//**************************************************************************************
//                           中断程序位置的配置
//**************************************************************************************
           ORG    0000H
           AJMP   MAIN
           ORG    0003H
           LJMP   IN0
           ORG    0030H
//**************************************************************************************
//                                                         主函数
//**************************************************************************************
MAIN:      SETB   EA
           SETB   EX0
           SETB   IT0
START:     MOV    A,#01H
           MOV    R3,#9H
           MOV    R4,#1H
L1:        MOV    DPTR,#TABLE
           MOV    A,R4   
           MOVC   A,@A+DPTR
           MOV    P2,A
           INC    R4   
           ACALL  DELAY
           DJNZ   R3,L1
           AJMP   START
//**************************************************************************************
//                                                         延时函数
//**************************************************************************************
DELAY:
           MOV    R5,#0AH
L4:        MOV    R6,#64H
L3:        MOV    R7,#0C8H
L2:        NOP
           NOP
           NOP
           DJNZ   R7,L2
           DJNZ   R6,L3  
           DJNZ   R5,L4
           RET
//**************************************************************************************
//                                                         外部中断0服务函数
//**************************************************************************************
IN0:   
           PUSH   ACC
           PUSH   DPH
           PUSH   DPL
           PUSH   PSW
           MOV    R2,#8H
           MOV    A,#01H
L5:        MOV    P1,A
           ACALL  DELAY
           RL     A
           DJNZ   R2,L5
           POP    PSW
           POP    DPL
           POP    DPH
           POP    ACC
           RETI  
//**************************************************************************************
//                                                         数码管段选数组
//**************************************************************************************
TABLE:  DB    3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
        END
//**************************************************************************************
//                                                                          END
//**************************************************************************************



程序中有以下问题:
接通单片机电源后,按下开关,执行完中断程序后会有两种错误情况,第一种是需要等待一段时间后数码管才会继续变化,另一种是执行完中断之后数码管会从1(设定的初值)开始变话
本人认为问题可能在的地方,我觉得问题是处在延时函数上,具体原因没有找到,请大神们找一找是什么原因
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2016-2-21 10:28编辑过]

1 回复
#2
a6167816892016-02-21 12:53
经过几天的调试,发现我忽略了一个问题,当我在中断中调用延时函数时,最后将几个通用寄存器清零了,导致回到主函数调用的延时函数时进行-1后判断时出现了负数,而负数的补码十分大,所以导致延时时间超长,导致需要等待很久。
修正方法为切换寄存器区域(RS0 RS1)
1