返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

单片机教程第1课  教学资料单片机教程第18课  算术指令
单片机教程第2课  好书推荐单片机教程第19课  逻辑指令
单片机教程第3课  单片机不易掌握的概念单片机教程第20课  逻辑指令
单片机教程第4课  实战一:流水灯单片机教程第21课  转移指令
单片机教程第5课  实战二:唱歌单片机教程第22课  位操作
单片机教程第6课  测试一单片机教程第23课  计数定时器
单片机教程第7课  新教程前言单片机教程第24课  计数定时器
单片机教程第8课  总体规划单片机教程第25课  中断系统
单片机教程第9课  概述单片机教程第26课  中断练习
单片机教程第10课  单片机结构单片机教程第27课  定时计数实验2
单片机教程第11课  基本概念单片机教程第28课  串行口
单片机教程第12课  延时程序分析单片机教程第29课  串口实例
单片机教程第13课  延时程序分析单片机教程第30课  数码管编程
单片机教程第14课  并口结构单片机教程第31课  动态数码管编程
单片机教程第15课  结构分析单片机教程第32课  键盘接口编程
单片机教程第16课  寻址方式单片机教程第33课  键盘扫描编程
单片机教程第17课  上机练习 单片机教程第34课  指令介绍        平凡的单片机教程

条件转移指令:

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

1.       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试试吧,看看程序执行的结果是什么?

2.       比较转移指令

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类似,但是它是判CY0,还是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比较

3.       循环转移指令

DJNZ        Rn,rel

DJNZ        direct,rel

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

  DJNZ             10HLOOP

3.调用与返回指令

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

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

1

4.       调用指令

LCALL    addr16;长调用指令

ACALL addr11 ;短调用指令

上面两条指令都是在主程序中调用子程序,两者有一定的区别,但在初学时,可以不加以区分,而且可以用LCALL 标号,ACALL 标号,来理解,即调用子程序。

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

ret

指令

4.空操作指令

nop

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