在很多实际问题中,都需要根据不同的情况进行不同的处理。这种思想体现在程序设计中,就是根据不同条件而转到不同的程序段去执行,这就构成了分支程序。分支程序的结构有两种,如图4-2所示。
图4-2(a)结构是用条件转移指令来实现分支,当给出的条件成立时,执行程序段A否则执行程序段B。
图4-2(b)结构是用散转指令JMP来实现多分支转移,它首先将分支程序按序号排列然后按照序号的值来实现多分支转移。
分支程序的特点是改变程序的执行顺序,跳过一些指令,去执行另外一些指令。
注意:对每一个分支都要单独编写一段程序,并且将每一分支的开始地址赋给一个标号。在编写分支程序时,关键是如何判断分支的条件。在MCS-51系列单片机中可以直接用来判断分支条件的指令并不多,只有累加器为零(或不为零)、比较条件转移指令CJNE等,MCS-51单片机还提供了位条件转移指令,如JC,JB等。把这些指令结合在一起使用,就可以完成各种各样的条件判断。分支程序设计的技巧,就在于正确而巧妙地使用这些指令。
图4-2 分支程序结构
【例4-3】 设变量X存放在30H单元,函数值Y存入31 H单元。试编程,按照下式的要求给Y赋值。
图4-3 例4-3流程图
解 X是有符号数,因此可以根据它的符号位来决定其正负,判别符号位是0还是1可利用JB或JNB指令。而判别X是否等于零则可以直接使用累加器判零JZ指令。把这两种指令结合使用就可以完成本题的要求。程序流程图如图4-3所示。
程序清单如下:
上述例子,采用条件转移指令实现分支结构,下面介绍利用散转指令JMP实现多分支程序转移。
所谓散转程序,就是使用散转指令“JMP @A+DPTR”来实现多分支程序的转移。散转指令的操作是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成16位地址(即转移的目的地址),装入程序计数器PC,因而使程序发生转移。在编写散转程序时,一般是将散转表的首地址送DPTR,分支序号送A,根据序号查找相应的转移指令或入口地址,从而实现多分支的转移。
利用JMP指令实现多分支转移时,首先应在ROM中建立一个散转表,表中可以存放无条件转移指令、地址偏移量或各分支入口地址(该表亦可称转移表、偏移量表、地址表)。表中存放的内容不同,所编写的散转程序也就不同。
下而根据表中所存放的不同内容来编写不同的散转程序。
(1)采用转移指令组成表
在许多实际应用中,往往要根据某标志单元的内容(键盘输入或运算结果)是0,1,2,…,n,分别转向操作程序0,操作程序l,操作程序2,……,操作程序n。(www.daowen.com)
针对上述要求,可以先用无条件转移指令(如AJMP)按顺序组成一个转移表,将转移表首地址装到数据指针DPTR中,将分支序号装入累加器A,执行“JMP @A+DPTR”指令进入转移表后,再由“AJMP”指令转入对应程序段的入口,从而实现散转。
【例4-4】 试编程根据R7的内容(即分支序号),转向相应的操作程序。
解 散转程序清单如下:
程序中,转移表TABl是由绝对转移指令AJMP组成,每条AJMP指令占2个字节,即每条转移指令的地址依次相差2个字节,所以累加器A中的值必须做乘2修正。若转移表是由3字节长转移指令“LJMP”组成,则累加器A中的值必须乘3。
转移表中使用“AJMP”指令,这就限制了转移的入口OPR0,OPR1,…OPRn必须和散转表首地址TABl位于同一个2KB空间范围内。另外,分支数n最大为128。
(2)采用地址偏移量组成表
如果分支序号较少,所有分支程序均处在256B之内时,可使用地址偏移量组成表。
【例4-5】 编程根据R7的内容,转向相应的操作程序,设(R7)=0~4。
解 程序清单如下:
使用这种方法,偏移量表的长度加上各程序段的长度必须在256B之内。
(3)采用各分支入口地址组成表
前面讨论的采用地址偏移量组成表的方法,其转向范围在256B之内,在使用时受到较大限制。若需要转向较大的范围,可以建立一个转移地址表,即将所要转移的各分支入口地址(16位地址),组成一个表,在散转之前,先用查表方法获得表中的转移地址,然后将该地址装入DPTR,最后按DPTR中的内容进行散转。
【例4-6】 试编程根据R7的内容(即分支序号),转向相应的操作程序。设各分支转移入口地址为OPR0,OPR1,…,OPRn,
解 散转程序清单如下:这种方法显然可以实现以64KB地址空间的转移,分支数最大为128。
分支程序在单片机应用中极为重要,在编程方法上有许多技巧,可通过阅读一些典型的程序逐渐增加这方面的能力。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。