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

13课:单片机逻辑与或异或指令祥解

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

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 AR0

XRL A#29H

MOV 35H#10H

ORL 35H#29H

MOV R0#35H

ANL A@R0

四控制转移类指令

无条件转移类指令

短转移类指令

AJMP addr11

长转移类指令

LJMP addr16

相对转移指令

SJMP rel

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

间接转移指令

JMP @A+DPTR

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

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

MOV AR0 ;从R0中取数详见下面说明

MOV B#2

MUL AB ;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 AR0我们假设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……这段程序还能正确地执新如果不能应该怎么改

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

文章评论

Ƶ