(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 基础教程 >> 浏览文章

14课:单片机条件转移指令

作者:佚名   来源:本站原创   点击数:x  更新时间2007年08月15日   字体

条件转移指令是指在满足一定条件时进行相对转移

判A内容是否为0转移指令

JZ rel

JNZ rel

第一指令的功能是如果(A)=0则转移不然次序执行执行本指令的下一条指令转移到什么地方去呢如果按照传统的办法就要算偏移量很麻常好在现在我们能借助于机器汇编了因此这第指令我们能这样理解JZ 标号即转移到标号处下面举一例说明

MOV A,R0

JZ L1

MOV R1,#00H

AJMP L2

L1: MOV R1,#0FFH

L2: SJMP L2

END

在执行上面这段程序前如果R0中的值是0的话就转移到L1执行因此最终的执行结果是R1中的值为0FFH而如果R0中的值不等于0则次序执行也就是执行 MOV R1#00H指令最终的执行结果是R1中的值等于0

第一条指令的功能清楚了第二条当然就好理解了如果A中的值不等于0就转移把上面的那个例程中的JZ改成JNZ试试吧看看程序执行的结果是什么?

比较转移指令

CJNE A,#data,rel

CJNE A,direct,rel

CJNE Rn,#data,rel

CJNE @Ri,#data,rel

第一条指令的功能是将A中的值和立即数data比较如果两者相等就次序执行执行本指令的下一条指令如果不相等就转移同样地我们能将rel理解成标号即CJNE A#data,标号这样利用这条指令我们就能判断两数是否相等这在很多场合是非常有用的但有时还想得知两数比现后哪个大哪个小本条指令也具有这样的功能如果两数不相等则CPU还会反映出哪个数大哪个数小这是用CY进位位来实现的如果前面的数A中的大则CY=0不然CY=1因此在程序转移后再次利用CY就可判断出A中的数比data大还是小了

MOV A,R0

CJNE A,#10H,L1

MOV R1,#0FFH

AJMP L3

L1: JC L2

MOV R1,#0AAH

AJMP L3

L2: MOV R1,#0FFH

L3: SJMP L3

上面的程序中有一条单片机指令我们还没学过即JC这条指令的原型是JC rel,作用和上面的JZ类似但是它是判CY是0还是1进行转移如果CY=1则转移到JC后面的标号处执行如果CY=0则次序执行执行它的下面一条指令

分析一下上面的程序如果A=10H则次序执行即R1=0如果A不等于10H则转到L1处继续执行在L1处再次进行判断如果A>10H则CY=1将次序执行即执行MOV R1#0AAH指令而如果A<10H则将转移到L2处指行即执行MOV R1#0FFH指令因此最终结果是本程序执行前如果R0=10H则R1=00H如果R0>10H则R1=0AAH如果R0<10H则R1=0FFH

弄懂了这条指令其它的几条就类似了第二条前A当中的值和直接地址中的当较第三条则是将直接地址中的值和立即数比较第四条是将间址寻址得到的数和立即数比较这里就不详谈了下面给出几个对应的例程

CJNE A,10H ;把A中的值和10H中的当较注意和上题的区别

CJNE 10H#35H ;把10H中的值和35H中的当较

CJNE @R0,#35H ;把R0中的值作为地址从此地址中取数并和35H比较

循环转移指令

DJNZ Rn,rel

DJNZ direct,rel

第一条指令在前面的例程中有详细的分析这里就不多谈了第二条指令只是将Rn改成直接地址其它一样也不多说了给一个例程

DJNZ 10HLOOP

3调用与返回指令

1主程序与子程序 在前面的灯的实验中我们已用到过了子程序只是我们并没有明确地介绍子程序是干什么用的为什么要用子程序技术呢举个例程我们数据老师布置了10道算术题经过观察每一道题中都包含一个3*5+2*3的运算我们能有两种选择第一种每做一道题都把这个算式算一遍第二种选择我们能先把这个结果算出来也就是51放在一边然后要用到这个算式本将51代进去这两种办法哪指好呢不必多言设计程序时也是这样有时一个功能会在程序的不一样地方反复使用我们就能把这个功能做成一段程序每次需要用到这个功能本“调用”一下

2调用及回过程主程序调用了子程序子程序执行完之后必须再回到主程序继续执行不能“一去不回头”那么回到什么地方呢是回到调用子程序的下面一条指令继续执行当然啦要是还回到这条指令不又要再调用子程序了吗那可就没完没了了……参考图1

调用指令

LCALL addr16 ;长调用指令

ACALL addr11 ;短调用指令

上面两条指令都是在主程序中调用子程序两者有一定的区别但在开始学习单片机的这些指令时能不加以区别而且能用LCALL 标号ACALL 标号来理解即调用子程序

5返回指令则说了子程序执行完后必须回到主程序如何返回呢只要执行一条返回指令就能了即执行  ret指令

4空操作指令

nop   就是 空操作就是什么事也不干停一个周期一般用作短时间的延时

发表评论告诉好友收藏此文关闭窗口

文章评论

һ֮Ƶ