XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。
XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。
XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。
XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。
XRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行
逻辑异或操作。结果存在累加器A中。
如任务中的 XRL A,P2 指令。 3. 逻辑运算指令应用举例
【例3.9】 16位数的算术左移。16位数在内存中低8位存放在M1单元,高8位存放在M1+1单元。
解:所谓算术左移就是将操作数左移一位,并使最低位补充0,相当于完成 16位数的乘务员操作,故称算术左移。参考程序如下:
CLR C ;进位CY清零 MOV R1,#M1 ;操作数地址M1送R1 MOV A,@ R1 ;低8位数送A
RLC A, ;低8位左移,最低位补0 MOV @ R1 ,A ;低8位左移后,回送M1存放 INC R1 ;指向16位高8位地址M1+1 MOV A,@ R1 ;低8位送A
RLC A, ;高8位带低8位进位左移 MOV @ R1 ,A ;高8位左移后回送M1+1存放
若要对16位数进行循环移位,则应首先设法把最高位(D15)的值置入CY,然后再参照以上程序编写即可。利用以后介绍的位操作指令可以很容易地实现将某一位的值置入CY。
3.4 按键控制灯
〖学习目标〗: 通过学习任务五的完成方法,掌握MCS-51单片机的控制转移指令的功能。
123〖任务描述〗: 用S1~S4组成的键盘分别控制P1口发光二极管发光,按住S1键红色发光二极管(假定为P1.0)亮,按住S2键黄色发光二极(P1.1)管亮,按住S3键绿色发光二极管(假定为P1.2)亮。S4 用于控制三组灯之间的切换。 3.4.1 硬件电路 硬件电路采用实验开发板上的电路,如图3.6所示。用S1~S4组成的键盘分别控制P1口发光二极管发光。 VCCRP1VCC1D112345678S2S1S4R56D5S3XTAL11.0592MS2S1S4S313121514VCC31191891716P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRRXDTXDALE/PPSEN10113029U3P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P273938373635343332212223242526272812345678SD1R12R23D2R34D3R45D4R67D612345678SD2R78D7C133PC233PR89D8 图3.6 AT89S51单片机P1口外接8只LED发光二极管 3.4.2 程序设计 ORG 0000H LJMP MAIN ORG 0030H MAIN: ORL P3,#3CH MOV A,P3 Title ANL A,#3CH SizeNumber MOV R0,A 12 CJNE A,#3CH,MAIN1 3LetterDate:File:15-Jul-2005C:\\Documents and S SJMP MAIN MAIN1: MOV R1,#10 PDO: LCALL DELAY DJNZ R1,PDO MOV A,P3 CJNE A,R0,DODO K_S1: JB P3.2,K_S2 LJMP KEY_1 K_S2: JB P3.3,K_S3
LJMP KEY_2 K_S3: JB P3.4,K_S4 LJMP KEY_3 K_S4: JB P3.5,DODO LJMP KEY_4 DODO: SJMP MAIN KEY_1: MOV P1,#0FDH SJMP MAIN
KEY_2: MOV P1,#0FBH SJMP MAIN
KEY_3: MOV P1,#0FEH SJMP MAIN KEY_4: MOV R1,#10 SPK2: MOV R2,#50H SPK1: CPL P3.2
LCALL DELAY ;调用延时程序 DJNZ R2,SPK1 DJNZ R1,SPK2 SJMP MAIN DELAY: MOV R3,#10 DEL: MOV R4,#50 DJNZ R4,$ DJNZ R3,DEL END
3.4.3 源程序的编辑、编译、下载
打开“伟福”模拟仿真软件进行程序的编辑、编译。
打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。
3.4.4 相关知识 1. 如何用按键控制灯?
按键是单片机常用的输人控制设备,用于信息和命令的输人,当按键与灯的对应关系建立后,单片机程序不断轮流检测S1~S4按键是否有键按下,当有某键按下时,单片机点亮相应的灯。也就是说,每个按键都对应了一个程序段,按下不同按键,程序就执行相应程序段,怎样才能实现这种转移呢?原来单片机中专门有一类控制转移类指令。
2. MCS-51单片机有哪些控制转移指令?
控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。
(1)无条件转移指令(4条)
这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。
LJMP addr16 ;addr16→(PC),给程序计数器赋予新值的16位地址。 AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变。
SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值。
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数
据指针的值给程序计数器赋予新值。
如:任务中的 LJMP MAIN 指令,就属无条件转移指令。 (2)条件转移指令(8条)
程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行。
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行。
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行。
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。
相关推荐: