标题: 求助:请帮忙分析一下程序 [打印本页]

作者: phevos    时间: 2009-4-21 23:55
标题: 求助:请帮忙分析一下程序
ORG 0000H ;程序功能平时8个LED闪烁,外中断0时左移流水灯3次
LJMP MAIN
ORG 0003H
LJMP EXT0
ORG 0030H
MAIN:     MOV IE,#81H
             CLR IT0
             MOV SP,#70H
START:  MOV P1,#0FFH
             LCALL DELAY
             MOV P1,#00H
             LCALL DELAY
             LJMP START
EXT0:    PUSH ACC
             PUSH PSW
             CLR RS0   ;更换工作寄存器组
             SETB RS1

             MOV R1,#3
LOOP:    MOV A,#0FEH
LOOP1:  MOV P1,A
             LCALL DELAY
             RL A
             CJNE A,#0FEH,LOOP1
             DJNZ R1,LOOP
             POP ACC
             POP PSW
             RETI
DELAY:  MOV R5,#2
L1:        MOV R6,#0
L2:        MOV R7,#0
             DJNZ R7,$
             DJNZ R6,L2
             DJNZ R5,L1
             RET
             END
这个程序不明白为什么要在外部中断中更换工作寄存器组(R0~R7)。
如果不更换的话满足不了功能要求,加上就好了。
可是怎么都分析不出来,望高人解答!!

作者: xushiming    时间: 2009-4-22 23:48
中断有调用delay子程序,执行中断程序之后,R5,R6,R7全部被清0,中断若从delay程序里面产生,返回后R6,R7在延时程序的内循环里,R6,R7赋值为0,产生的延时同设置为255等同(只相差2个循环周期),而R5清零之后产生的效果共R6=2相比则相差128倍了,故程序返回之后的第一次延时会很长,之后便正常了。更换寄存器组,中断时不改变原有的值,中断返回之前pop psw指令又将寄存器组调回使用了。

解释有点啰嗦。
作者: chzfmx    时间: 2009-4-23 00:09

不对啊,即使加上 CLR RS0   ;更换工作寄存器组
                       SETB
RS1                            , 外中断0时左移流水灯大部分时候是3次,但不是恒定的3次,我也没想得通是哪里的问题,另外你既然用的是电平触发方式(CLR IT0),在中断返回前要撤除/INT0的低电平的,同样希望有哪个高手指点,感激……


作者: phevos    时间: 2009-4-23 16:32
以下是引用xushiming在2009-4-22 23:48:08的发言:
中断有调用delay子程序,执行中断程序之后,R5,R6,R7全部被清0,中断若从delay程序里面产生,返回后R6,R7在延时程序的内循环里,R6,R7赋值为0,产生的延时同设置为255等同(只相差2个循环周期),而R5清零之后产生的效果共R6=2相比则相差128倍了,故程序返回之后的第一次延时会很长,之后便正常了。更换寄存器组,中断时不改变原有的值,中断返回之前pop psw指令又将寄存器组调回使用了。

解释有点啰嗦。

很明白的解释,真是高人阿,谢谢咯!


作者: lixiaol03    时间: 2009-4-24 21:08

呵呵,学会了一点,又进步了一下,谢谢。






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1