RETI是中断服务子程序的返回指令,RETI是中断服务子程序的最后1条指令,它使程序从中断服务子程序转到中断点继续运行。
RETI指令除了执行返回功能外,还清除内部相应的中断状态寄存器(该状态寄存器由CPU响应中断时置位,宣告CPU当前正在执行中断服务程序),因此中断服务子程序必须用RETI结束,
CPU执行RETI指令后,必须至少再执行一条其它指令才能响应新的中断。
ORG 00H 开始地址JMP MAIN跳转到主程序
ORG 03H 外部中断0地址
JMP EXT1跳转
ORG 13H 外部中断1地址
JMP EXT2跳转
MAIN:
MOV IE, #85H 使能中断 0,1
SETB TCON.2边沿触发
SETB TCON.0边沿触发
SJMP $ --没有这一句,程序,自己就去执行中断函数了
EXT1:
MOV P2, #0清0,点亮发光二极管
RETI
EXT2:
MOV P2, #0FFH 置1,关闭
RETI
END
你这是用了一个非常简单程序来说的,就这么几条指令,而且执行到最后是一个SJMP $,即死循环,这一点肯定是永远在执行这一条指令了,那中断时即是从这一条响应中断的,返回时也是返回到这一条了。可凡事不能以一个简单的特例的结果来概括全面问题,而实际上一个真正的应用程序是不可能有SJMP $指令的,更不可能只有这几条指令,这也不能叫什么程序,只不过是玩几条指令而已。一个真正的程序是很长很长的,单片机是不停地在执行着程序,那什么时候响应中断是未知的,所以,响应中断时执行到哪条指令了,根本就不可能知道的,也不需要知道啊,因为,从哪里响应中断的,中断结束就一定会回到哪里的,这一点都不用怀疑的。
可惜呀,就这么个最简单的特例,也被解释得错了,真是无知呀!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)