题目大意:实现8个发光二极管亮点流动,在流动过程中,如果按下单脉冲键,8个发光二极管改为同时闪烁。
程序结构如下:
ORG 0000H
LJMP START
ORG 0003H
LJMP INT
ORG 000BH
LJMP T0INT
ORG 0100H
START: .........
..........
SETB PX0
SJMP $
T0INT: ........
........
RL A
RETI
INT: ............
.........
CPL A
.........
RETI
问题是刚开始题目中说的是亮点流动啊,怎么会设SETB PX0外部中断为高优先级呢,这样的话不是先同时闪烁了嘛?
还有个问题为什么中断程序中有语句如MOV SP,#30,有的中断程序中有入栈,有的没有也加这个语句的。。
你按键按下时不管流动点亮的执行到到哪了都改变为8灯齐闪,说明这个8灯齐闪的子程序的优先级比流动点亮的优先级高,并且你外部中断是8灯齐闪的子程序,而定时中断是流动点亮子程序,所以当然得设置外部中断为高优先级了。
关于SP给你举个例子吧:比如你的主程序有加减乘除法,中断子程序中也有,那么你就必须对ACC,PSW进行保护,因为你在执行中断程序的加减法时可能已经改变了某些进位标志位,而回到主程序中时若主程序的没有进位就可能出错了。所以在进入中断子程序时要首先把这些标志位(即ACC和PSW)保存起来,以便回到主程序时能正确的继续运行。而MOV SP,#50H等只是你设置的堆栈所在的存储区域,是为了避免和你的工作寄存器重叠的,因为复位后堆栈指针SP的初值是07H,你的程序结构稍大的话就能把它给覆盖了,所以要向后推,一般的程序50H,60H就足够用了。
关于SP给你举个例子吧:比如你的主程序有加减乘除法,中断子程序中也有,那么你就必须对ACC,PSW进行保护,因为你在执行中断程序的加减法时可能已经改变了某些进位标志位,而回到主程序中时若主程序的没有进位就可能出错了。所以在进入中断子程序时要首先把这些标志位(即ACC和PSW)保存起来,以便回到主程序时能正确的继续运行。而MOV SP,#50H等只是你设置的堆栈所在的存储区域,是为了避免和你的工作寄存器重叠的,因为复位后堆栈指针SP的初值是07H,你的程序结构稍大的话就能把它给覆盖了,所以要向后推,一般的程序50H,60H就足够用了。
温馨提示:答案为网友推荐,仅供参考
第1个回答 2009-05-19
MOV SP,#30H这个语句是象征性的初始化语句,入用到push pop等与堆栈有关的语句,那么这句话就有意义了,即设置了栈顶和栈底地址(不设置默认为07H),根据具体的程序有时为了避免地址重叠会将栈顶设置的高一些。。
至于优先级问题是这样的,再设置优先级后CPU会优先执行外部中断0,等执行完后再执行次优先级的程序,是不会冲突的~
至于优先级问题是这样的,再设置优先级后CPU会优先执行外部中断0,等执行完后再执行次优先级的程序,是不会冲突的~
第2个回答 2009-05-19
外部中断0的优先级本来就比定时器0高,所以你不需要去设置了。
MOV SP,#30,说明30后的地址都可以压栈使用,一般小程序是不会这样设置成30的。堆栈一般在call、中断的时候自动压pc,除此之外,就是你自己写的中断保护,比如push acc,push psw,一般用不了几个字节的,所以mov sp,70h就可以了,这样就是70h到7fh为堆栈区间。上电的时候初始值是07h的,一般都要设置一下,否则,你使用07h后面的单元,容易和堆栈冲突。
MOV SP,#30,说明30后的地址都可以压栈使用,一般小程序是不会这样设置成30的。堆栈一般在call、中断的时候自动压pc,除此之外,就是你自己写的中断保护,比如push acc,push psw,一般用不了几个字节的,所以mov sp,70h就可以了,这样就是70h到7fh为堆栈区间。上电的时候初始值是07h的,一般都要设置一下,否则,你使用07h后面的单元,容易和堆栈冲突。