返回主页 单片机教程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课  指令介绍        平凡的单片机教程

 逻辑与指令

ANL     A,Rn        ;A与Rn中的值按位'与',结果送入A中

ANL     A,direct;A与direct中的值按位'与',结果送入A中

ANL     A,@Ri;A与间址寻址单元@Ri中的值按位'与',结果送入A中

ANL     A,#data;A与立即数data按位'与',结果送入A中

ANL     direct,A;direct中值与A中的值按位'与',结果送入direct中

ANL     direct,#data;direct中的值与立即数data按位'与',结果送入direct中。

这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与

例:71H和56H相与则将两数写成二进制形式:

71H) 01110001

56H) 00100110

结果 00100000 即20H,从上面的式子可以看出,两个参与运算的值只要其中有一个位上是0,则这位的结果就是0,两个同是1,结果才是1。

理解了逻辑与的运算规则,结果自然就出来了。看每条指令后面的注释

下面再举一些例子来看。

MOV     A,#45H;(A)=45H

MOV     R1,#25H;(R1)=25H

MOV     25H,#79H;(25H)=79H

ANL     A,@R1;45H与79H按位与,结果送入A中为 41H (A)=41H

ANL     25H,#15H;25H中的值(79H)与15H相与结果为(25H)=11H)

ANL     25H,A;25H中的值(11H)与A中的值(41H)相与,结果为(25H)=11H

在知道了逻辑与指令的功能后,逻辑或和逻辑异或的功能就很简单了。逻辑或是按位“或”,即有“1”为1,全“0”为0。例:

10011000

01100001

结果 11111001

而异或则是按位“异或”,相同为“0”,相异为“1”。例:

10011000

异或 01100001

结果 11111001

而所有的或指令,就是将与指仿中的ANL 换成ORL,而异或指令则是将ANL   换成XRL。即

或指令:

ORL     A,Rn        ;A和Rn中的值按位'或',结果送入A中

ORL     A,direct;A和与间址寻址单元@Ri中的值按位'或',结果送入A中

ORL     A,#data;A和立direct中的值按位'或',结果送入A中

ORL     A,@Ri;A和即数data按位'或',结果送入A中

ORL     direct,A;direct中值和A中的值按位'或',结果送入direct中

ORL     direct,#data;direct中的值和立即数data按位'或',结果送入direct中。

异或指令:

XRL     A,Rn        ;A和Rn中的值按位'异或',结果送入A中

XRL     A,direct;A和direct中的值按位'异或',结果送入A中

XRL     A,@Ri;A和间址寻址单元@Ri中的值按位'异或',结果送入A中

XRL     A,#data;A和立即数data按位'异或',结果送入A中

XRL     direct,A ;direct中值和A中的值按位'异或',结果送入direct中

XRL     direct,#data;direct中的值和立即数data按位'异或',结果送入direct中。

练习:

MOV     A,#24H

MOV     R0,#37H

ORL         A,R0

XRL         A,#29H

MOV     35H,#10H

ORL         35H,#29H

MOV     R0,#35H

ANL     A,@R0

四、控制转移类指令

1.无条件转移类指令

1.短转移类指令

AJMPaddr11

2.长转移类指令

LJMPaddr16

3.相对转移指令

SJMPrel

上面的三条指令,如果要仔细分析的话,区别较大,但初学时,可不理会这么多,统统理解成:JMP        标号,也就是跳转到一个标号处。事实上,LJMP     标号,在前面的例程中我们已接触过,并且也知道如何来使用了。而AJMP和SJMP也是一样。那么他们的区别何在呢?在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K这么远(当然近了更没关系了)。而AJMP  最多只能跳2K距离,而SJMP则最多只能跳256这么远。原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。因此在初学时,需要跳转时可以全用LJMP,除了一个场合。什么场合呢?先了解一下AJMP,AJMP是一条双字节指令,也就说这条指令本身占用存储器(ROM)的两个单元。而LJMP则是三字节指令,即这条指令占用存储器(ROM)的三个单元。下面是第四条跳转指令。

4.     间接转移指令

JMP      @A+DPTR

这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。让我们从一个实际的例子入手吧。

MOV   DPTR,#TAB      ;将TAB所代表的地址送入DPTR

MOV   A,R0           ;从R0中取数(详见下面说明)

MOV   B,#2              

MUL   A,B            ;A中的值乘2(详见下面的说明)

JMP   A,@A+DPTR  ;跳转

TAB:    AJMP    S1          ;跳转表格

    AJMP    S2

    AJMP    S3

        .

        .

        .

 

2

3

应用背景介绍:在单片机开发中,经常要用到键盘,见上面的9个按键的键盘。我们的要求是:当按下功能键A………..G时去完成不同的功能。这用程序设计的语言来表达的话,就是:按下不同的键去执行不同的程序段,以完成不同的功能。怎么样来实现呢?

看图2,前面的程序读入的是按键的值,如按下'A'键后获得的键值是0,按下'B'键后获得的值是'1'等等,然后根据不同的值进行跳转,如键值为0就转到S1执行,为1就转到S2执行。。。。如何来实现这一功能呢?

先从程序的下面看起,是若干个AJMP语句,这若干个AJMP语句最后在存储器中是这样存放的(见图3),也就是每个AJMP语句都占用了两个存储器的空间,并且是连续存放的。而AJMP   S1存放的地址是TAB,到底TAB等于多少,我们不需要知道,把它留给汇编程序来算好了。

下面我们来看这段程序的执行过程:第一句MOV DPTR,#TAB执行完了之后,DPTR中的值就是TAB,第二句是MOV A,R0,我们假设R0是由按键处理程序获得的键值,比如按下A键,R0中的值是0,按下B键,R0中的值是1,以此类推,现在我们假设按下的是B键,则执行完第二条指令后,A中的值就是1。并且按我们的分析,按下B后应当执行S2这段程序,让我们来看一看是否是这样呢?第三条、第四条指令是将A中的值乘2,即执行完第4条指令后A中的值是2。下面就执行JMP@A+DPTR了,现在DPTR中的值是TAB,而A+DPTR后就是TAB+2,因此,执行此句程序后,将会跳到TAB+2这个地址继续执行。看一看在TAB+2这个地址里面放的是什么?就是AJMP   S2这条指令。因此,马上又执行AJMP     S2指令,程序将跳到S2处往下执行,这与我们的要求相符合。

请大家自行分析按下键“A”、“C”、“D”……之后的情况。

这样我们用JMP    @A+DPTR就实现了按下一键跳到相应的程序段去执行的这样一个要求。再问大家一个问题,为什么取得键值后要乘2?如果例程下面的所有指令换成LJMP,即:

LJMP    S1,LJMP     S2……这段程序还能正确地执行吗?如果不能,应该怎么改?