标题: 求助:请帮忙分析一下程序 [打印本页]
作者: 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 |