在单片机汇编程序中,如果LJMP到子程序(如果不是调用且用RET返回的话就不能叫子程序了,)那么必须再用LJMP跳回来才行,如果是LCALL调用,但LJMP跳回,那么将破还堆栈结构,程序就会出现混乱了。有如下关系:
LCALL
RET
这必须成对出现。
首先纠正上面回答的错误,#0FFH和#0C0H是表示数据,不是地址!地址前面不加“#”的!!因为你这个程序时按一下健,数码管显示一位数字,当第一次按时,要显示TAB区的第一个数据,这样,必须使movc a,@a+dptr指向第一个数据,就是0F9H,因为DPTR的值就是0F9H的地址,就是说,A要等于零才行,第一次按,A=0,第二次,A=1,以此类推,就是比按键次数少1那么怎么实现呢?程序中是这样的,让R7达到最大值#0FFH,第一次按,R7加一,就变成了0(进位自动丢弃),再把R7赋给A,这样就实现了!!
至于判断是否显示到最后一位,是这样的:你不停的按键,按了九下,数码管显示九,你再按,他该显示什么?该显示0了吧?如果想显示零,必须使movc a,@a+dptr重新指回0F9H。单片机没有眼睛,如何知道已经能够显示到9了,下面该重头显示0了呢?看看TAB区最后一个数据,他不是可以显示的数据,而是一个标记数据,当movc a,@a+dptr指向这个数据时,通过cjne a,#0C0h,wait1 指令,单片机知道显示到头了,该回头显示零了,回头显示,就得将刚才的事重做一遍,就得跳回MAIN函数,再把R7变成#0FFH,这样,就可以不停的按键了。
另外,这段程序似乎有个问题,我不知道你用的什么片子。有条指令貌似是多余的:ljmp main
ret
这个RET指令在LJMP MAIN的后面,指令时顺次从上向下执行的(遇到跳转指令时除外),当执行到LJMP时,程序跳回主程序开始处,貌似这个RET指令这辈子也得不到执行,所以,我个人认为他是多余的,可以去掉。。。
1、用汇编编写程序。CPU只会忠实执行代码的意图,而不是程序员的“意图”。
2、什么是跳出循环?直接LJMP当然可以。永远不再执行RETI,没有RETI,当然也可以。
3、但是你需要明确这样做,是否符合你的真实意愿。回顾一下中断的概念。
a、当相关中断源及总中断被允许,有中断源请求时。CPU停止主程序执行,保护断点及PSW。跳转至中断入口地址。
b、如果没有RETI,将不会自动返回到之前的断点,及断点时刻的PSW恢复等。而且当前的中断源再次触发将不再理会。有时候,程序员会直接让程序复位,如LJMP 0,或者中断入口堆栈处理。但这种热重启还需要更多的初始化SFR设置,如PSW,SP等。
以上就是关于单片机汇编时,子程序的LJMP问题全部的内容,包括:单片机汇编时,子程序的LJMP问题、单片机汇编程序的问题、51汇编中 中断程序中 可以自定义跳出循环么 即不通过reti 返回等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)