第三章 指令系统.

Slides:



Advertisements
Similar presentations
第7章 AT89S51单片机的 串行口 1.
Advertisements

第三章 计算机系统 的组成与工作原理 本章学习目标 理解模型机的结构及工作过程 掌握单片机的结构 掌握单片机I/O口的使用
第5章 中断系统 5.1 中断的概念 5.2 MCS-51单片机的中断流程 5.3 MCS-51的中断响应条件和中断处理
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第四章 指令系统及汇编语言程序设计.
8051 指令.
第四章 指令系统及汇编语言程序设计.
本章分为四节,主要介绍: 4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 常用程序举例.
项目2 2个LED发光二极管控制 知识与能力目标 熟悉单片机的I/O口功能与特性。
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
本章小结 C51单片机指令系统概述 C51单片机寻址方式 C51单片机指令系统
单片机原理与应用.
第9章 串行扩展技术 (课时:6学时).
第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用.
第2章 MCS-51单片机指令系统与汇编语言程序设计
報告者:朱耿育 紀翔舜 組員:詹以群 張永傑 指導老師:梁新潁
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
第二部分 微机原理 第4章 汇编语言 程序设计 主讲教师:喻红.
单片机应用技术 项目一 循环彩灯装置 第6讲 指令功能及汇编语言程序设计(一) 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第8章 模拟接口 8.1 模拟接口概述 8.2 DAC及其接口 8.3 ADC及其接口.
第二部分 微机原理 第3章 MCS-51的 指令系统 主讲教师:喻红.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第14章 单片机应用系统抗干扰 与可靠性设计 1.
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
本章分为三节,主要介绍: 6.1 计算机串行通信基础 C51的串行口 6.3 单片机串行口应用举例.
第七章 MCS-51系统扩展 一、程序存储器扩展
第3章 AT89C51指令系统 3.1基本概念内部结构和引脚功能 指令、指令系统、机器代码
逻辑运算类指令 包括与、或、非、异或、清0及移位等共24条;一般不影响PSW中的标志位;助记符有:ANL、ORL、XRL、RL、RLC、RR、RRC、CLR和CPL共9种。 一、逻辑与指令 ANL A,Rn ;A←(A)∧( Rn) ANL A,direct;A←(A)∧(direct)
单片机原理及应用 MCS-51系列单片机的基本硬件结构 MCS-51指令系统 MCS-51单片机的系统扩展与应用.
第七章 MCS-51并行口的扩展 MCS51单片机内部有4个并行口,当内部并行口不够用时可以外扩并行口芯片。可外扩的并行口芯片很多,分成2类:不可编程的并行口芯片(74LS3734和74LS245)和可编程的并行口芯片(8255)。 7.1 不可编程并行口芯片的扩展 7.2 可编程并行口芯片的扩展.
单片机原理及应用 ——基于Proteus与Keil C 哈工大出版社
4.A/D与D/A转换器 1).DAC0832与MCS-51接口
第2章 单片机的结构原理与 简单应用 (课时:10学时).
第八章 MCS-51与数码显示器和键盘的接口 一、MCS-51与数码显示器接口 数码显示器是单片机应用产品中最常用的廉价的输 出设备,它由8个发光二极管按一定规律排列而成, 当某一发光二极管导通时,则会被点亮,控制不同 组合的二极管导通,就能显示出各种字符。 1.显示器的结构.
本 章 重 点 单片机的简单I/O扩展 8255A可编程并口芯片 8279可编程键盘/显示器接口芯片 单片机键盘接口技术
单片机原理 单 片 机 单片机接口技术 单片机应用技术.
第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第8章 MCS-51串行口 8.1 串行口及其通信方式 8.2 IBM-PC系列机与 单片机 的通信技术.
第2章 单片机系统组成原理 2.1 MCS-51单片机组成原理 2.2 单片机复位电路设计 2.3 MCS-51存储器配置
6.1 输入/输出 6.2 CPU与外设数据传送方式 6. 3 MCS-51中断系统 6. 4 中断应用举例
单元五 MCS-51单片机内部资源 5.1 任务九 单片机计数并显示 5.2 任务十 单片机流水灯控制 5.3 任务十一 两台单片机数据互传
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第四章 指令系统及汇编语言程序设计.
第4章 中断技术 一个完整的微机系统是由硬件和软件共同构成的。微机系统的硬件有CPU、存储器和I/O口,外设组成。CPU与存储器之间的信息交换比较简单,而CPU与外设之间进行信息交换之前必须确定外设是否准备好,即选择I/O传送方式。I/O传送方式有4种:无条件、查询、中断和DMA。本章学习中断传送方式的有关内容。
单片机系统设计 教师:朱华贵 2016年03月01日
数码管数字时钟电路的设计 1. 系统硬件电路的设计
第3章 MCS-51指令系统 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统
第4章 80C51系列指令系统 教学目的:熟悉80C51系列单片机的寻址方式及 每一种寻址方式对应的寻址空间;掌 握每一条指令功能。
本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析
5-6 串列埠模式0輸出埠擴充實習.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
CPU中的专用寄存器(SFR) 一、累加器Acc 二、通用寄存器B 三、程序计数器PC 四、堆栈指针SP 五、数据指针DPTR
第五讲:AT89C51单片机存储器结构 一、半导体存储器 二、存储器空间划分方法 三、数据存储器(RAM) 四、程序存储器(ROM)
3.1 指令系统简介 一、几个概念 二、汇编语言指令格式 三、指令的分类 四、指令的符号说明 主讲:吴政江 下一页.
第三章 计算机系统的组成与工作原理.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
2. MCS-51单片机的组成及结构分析 2.1 MCS-51单片机的内部结构及结构特点
四、手工汇编 完成汇编的方法有两种:手工汇编和汇编程序汇编 1.手工汇编步骤 A
单片机原理与应用.
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
简单芯片扩展I/O接口 8155可编程接口芯片及其使用 键盘及显示器接口设计 A/D和D/A转换接口技术
单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计
第二章 MCS-51单片机程序设计 第一章 8086程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第2章 80C51单片机的硬件结构 教学基本要求: (1)、熟悉单片机的定义、名称、分类方法;
第1章 微型计算机基础.
Presentation transcript:

第三章 指令系统

3.1 指令格式和常用标识符 3.1.1 指令系统概述 指令是使计算机完成某种操作的命令。 指令系统是全部指令的集合。 MCS-51系列单片机指令系统功能强、指令短、执行快,共有111条指令。

存储空间 单字节指令:49条 双字节指令:45条 三字节指令:17条 运算速度 单周期指令: 64条 双周期指令: 45条 四周期指令: 2 条 功能 数据传送类: 29条 算术运算类: 24条 逻辑运算及移位类:24条 控制转移类: 17条 位操作类: 17条

3.1.2 指令的机器码 一、单字节指令 计算机操作的直接代码。一般用十六进制数表示。 1. 8位编码仅为操作码 1. 8位编码仅为操作码 如:INC A 功能是累加器A的内容加1。 该指令的编码为:0000 0100B,十六进制表示为04H,累加器A隐含在操作码中。

高5位为操作码,低3位为存放操作数的寄存器编码。 2.8位编码含有操作码和寄存器编码 高5位为操作码,低3位为存放操作数的寄存器编码。 如:MOV A,R0 功能是将当前工作寄存器R0中的数据传送到累加器A中。 编码为1110 1000B, 低3位000为寄存器R0的编码。 其十六进制表示为E8H。

二、双字节指令 第一字节表示操作码,第二个字节表示参与操作的数据或数据存放的地址。 如:MOV A,#50H 功能是将立即数“50H”传送到累加器A中。 编码为0111 0100B , 0101 0000B。 其十六进制表示为74H,50H。

三、三字节指令 第一字节表示该指令的操作码,后两个字节表示参与操作的数据或数据存放的地址。 如:MOV 20H,#50H 功能是将立即数“50H”传送到内部RAM 的20H单元中。 编码为0111 0101B,0010 0000B,0101 0000B。 其十六进制表示为75H,20H,50H。

3.1.3 指令的格式 操作码助记符 操作数 ;注释 操作码助记符 ● 表示指令的操作功能 ● 为便于记忆,通常用与操作相应的英文缩写表示,如加法用ADD,减法用SUBB,传送用MOV等,编译时还原成一定的二进制代码。

操作数 无操作数 单操作数 两操作数 三操作数 ● 指参加操作的数据或数据的地址 ● 操作数的个数 ● 在两操作数的指令中,通常目的操作数写在左边,源操作数写在右边。 ● 操作数之间用逗号隔开。

注释 ● 是对指令所做的简要说明 ● 可有可无,不是必备的 ● 便于阅读、理解和使用指令 ● 以分号开始,其后为注释部分

3.1.4 指令中所用到的标识符 Rn (n=0~7):当前选中的工作寄存器组中的寄存器 R0、R1…R7之一; 3.1.4 指令中所用到的标识符 Rn (n=0~7):当前选中的工作寄存器组中的寄存器 R0、R1…R7之一; Ri (i=0,1) :当前选中的工作寄存器组中的寄存器 R0或R1; #data :8位立即数,00~FFH中的一个; #data16 :16位立即数;

direct :片内低128个RAM或SFR的地址; addr11 :11位目的地址,用于ACALL和AJMP指令; addr16 :16位目的地址,用于LCALL和LJMP指令; rel :补码形式表示的8位带符号地址偏移量, 偏移范围为-128~+127; bit:片内RAM或SFR的位地址; / :该位求反后参与操作,不影响该位原值;

@ :间接寻址寄存器的前缀; @Ri : 寄存器间接寻址,Ri为R0或R1; @DPTR : 间接寻址,对外部RAM/ROM寻址。 (×) :表示由×所指的地址单元的内容 ; ← :箭头右边的内容送入箭头左边的单元内; $ :当前指令的地址。

3.2 MCS-51单片机寻址方式 寻址 寻址方式 CPU到不同的地址空间寻找操作数的过程。 寻找操作数地址的方法。 寻址方式有哪些呢?

寄存器寻址 直接寻址 寄存器间接寻址 立即寻址 变址寻址 相对寻址 位寻址 注意: 下面所提到的寻址方式均指源操作数的寻址方式。

1、寄存器寻址 寻址空间为 操作数存放在寄存器中,指令中直接给出寄存器名称。 当前选中的通用寄存器R0~R7; 部分SFR。如累加器A,寄存器B,数据指针DPTR等。

MOV A,R5 ;A←R5,即R5里面的数送到A中 若R5中的数为4AH,则指令执行后A 中的数也是4AH。 指令代码为EDH(1110 1101) ,低3位中的101表示操作数在R5中。

2、直接寻址 寻址空间为 操作数在存储单元中,指令中直接提供存储单元地址。 片内RAM128个单元; 所有特殊功能寄存器(SFR)。

注意1 低128单元,在指令中应以单元地址的形式出现。 MOV A,direct ;A←(direct),即直接地址单元中的内容送到A中 MOV direct ,direct ; (direct) ←(direct) 即直接地址单元中的内容送到另一个直接地址单元中 MOV A, 65H ;A ← (65H) 即将65H单元中的数送到A中

注意2 对特殊功能寄存器,在指令中可以SFR的名称出现,也可以SFR所在的单元地址出现,但通常都以SFR的名称出现。 MOV A, P0 ; A ← P0,将P0中的数送到A中 MOV A, 80H;A ←(80H),将80H单元的内容送到A中。 汇编后机器码完全一样,都是E5H,80H

注意3 通用寄存器Rn是内存单元的一部分,在指令中若以Rn的名称出现,则属于寄存器寻址方式;若以Rn所在的单元地址出现,则属于直接寻址方式。 设通用寄存器选择第0组,则R0就是片内 RAM 00H单元 MOV A,R0 ;A←R0,即R0里面的数送到A中 MOV A,00H ;A←(00H),即00H单元中的数送到A中

这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去。 区别:机器码不同 第一个指令为E8H,第二个为E5H,00H。

注意4 累加器有A、ACC、E0H三种表示形式,指令的执行结果相同,但分属于两种不同的寻址方法。 INC A ; 寄存器寻址,机器码为04H INC ACC 直接寻址,机器码为05H,E0H INC 0E0H 说明:在指令中,多数情况下累加器用“A”表示,仅在直接寻址方式中,用“ACC”表示累加器在SFR区的具体地址E0H。

3、立即寻址 操作数是常数,包含在指令当中,位于操作码之后,与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找。常数又称为立即数,故又称为立即寻址。 寻址空间为 ROM

说明 在汇编指令中,立即数前面以“#”符号作前缀。 立即数可以是1个字节,也可以是两个字节。 由于立即数是一个常数,故只能作为源操作数。 在程序中通常用于给寄存器或存储器单元赋初值。

MOV A,#20H ; A←20H MOV R7, #0F5H ;R7←F5H MOV P1, #80H ;P1 ←80H MOV DPTR,#3FA6H ;DPH ←3FH, DPL ←A6H

4、寄存器间接寻址 —— 间址 可用的间址寄存器为 以某寄存器的内容为地址,从该地址去取操作数。 @为间址提示符。 R0或R1 —— 用于寻址片内RAM低128字节及片外RAM低256字节。 DPTR —— 用于寻址片外RAM 64K字节。

注意 “间址”不能用来访问SFR。 片内RAM访问用MOV指令; 片外RAM访问用MOVX指令。

MOV A,@R0 ; A←(R0), 操作数在片内RAM中. MOVX A,@R0 ; A←(R0), 操作数在片外RAM中. MOVX A,@DPTR ; A←(DPTR), 操作数在片外RAM中. 以DPTR的内容为地址,将该地址中的内容送到A中。

5、变址寻址 寻址空间为 基址寄存器+变址寄存器 间接寻址 以DPTR或PC为基址寄存器,累加器A为变址寄存器。 把两者内容相加,结果作为操作数的地址。 寻址空间为 ROM , 用于访问ROM中的数据表格

JMP @ A+DPTR ; 无条件转移指令 A+DPTR 作为一个地址,程序跳转到该地址执行。 MOVC A, @ A+DPTR ; A←(A+DPTR) MOVC A, @ A+PC ; A←(A+PC)

MOVC A, @ A+DPTR ; A←(A+DPTR) 设DPTR=2000H,A=E0H 程序存储区 E0 A DPH 20 DPL 00 2040H 93 20E0H 47 2041H … … … 47 指令代码 ALU 20E0H

MOVC A, @ A+PC ; A←(A+PC) 设A=E0H 当前PC 程序存储区 指令代码 A E0 2040H 83 45 … … 2120H 47 45 当前PC ALU 2121H

MOVC A, @ A+DPTR ; A←(A+DPTR) MOVC A, @ A+PC ; A←(A+PC) 查表操作 ,功能一样,区别是 DPTR在使用前可以赋值,查表范围可达64K。 PC的值是固定的,A的内容为无符号数,因此只能在当前指令下256个地址单元范围内进行查表。

6、相对寻址 注意 PC的当前值与指令中给出的偏移量rel相加,结果作为跳转指令的目标地址。 PC的当前值是跳转指令执行时的PC值,即转移指令的下一条地址。 偏移量rel是8位带符号数。以补码表示,它的取值范围为-128~+127。当为负值时,向前转移,当为正数时向后转移。

如: SJMP rel ; 转移指令 设rel=23H 当前PC 程序存储区 指令代码 1000H 80 1001H 23 1002H ×× … … 1024H ×× 1002H ×× 23H 1002H 当前PC ALU 1025H

6、位寻址 寻址空间为 MCS-51单片机具有位处理功能,因此有相应的位寻址方式。 片内RAM 20H~2FH,共16个单元,128个位地 址,范围为 00H~7FH。 11个可位寻址的SFR,83个位地址。

位地址的表示方式 1、直接使用位地址(00~7FH,SFR的83个位地址) 如: SETB 3DH; 将27H.5位置1 MOV C,30H; C ← 26H.0 CLR 0D7H; 将PSW.7位清零 2、字节地址带位号 如: SETB 27H.5; MOV C, 26H.0 ; CLR 0D0H.7;

例如: CLR PSW.7 ;PSW.7 表示 PSW的第7位 ; SETB P0.1 ; P0.1表示P0口的第1位。 3、特殊功能寄存器名带位号 例如: CLR PSW.7 ;PSW.7 表示 PSW的第7位 ; SETB P0.1 ; P0.1表示P0口的第1位。 4、特殊功能寄存器所含位的位名称 例如: PSW.0 PSW.1 PSW.2 PSW.3 PSW.4 PSW.5 PSW.6 PSW.7 CY AC F0 RS1 RS0 OV — P CLR C; MOV 30H,C

3.3 数据传送指令 数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。 这类指令可分为三组: 指令助记符: MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 普通传送指令; 数据交换指令; 堆栈操作指令。

源操作数可以是:累加器A、通用寄存器Rn、直接地址direct、间接地址和立即数;

一、普通传送指令(22条) 普通传送指令以助记符MOV为基础。 分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。 源操作数可为:A、Rn、@Ri、direct、#data; 目的操作数可为:A、Rn、@Ri、direct。

按目的操作数的寻址方式划分为五组: (1)以A为目的操作数(4条) MOV A,Rn ;A←Rn,Rn的内容送给A MOV A,direct ; A←(direct) MOV A,@Ri ;A←(Ri) MOV A,#data ;A← #data (2)以Rn为目的操作数(3条) MOV Rn,A ;Rn←A MOV Rn,direct ;Rn←(direct) MOV Rn,#data ;Rn←#data

(3)以直接地址direct为目的操作数(5条) MOV direct,A ;(direct)←A MOV direct,Rn ;(direct)←Rn MOV direct,direct ;(direct)←(direct) MOV direct,@Ri ;(direct)←(Ri) MOV direct,#data ;(direct)← #data 例: MOV 20H,A ;20H←A MOV 20H,R1 ;20H ← R1 MOV 20H,30H ;20H←(30H) MOV 20H,@R1 ;20H←(R1) MOV 0A0H,#34H ; A0H←34H MOV P2,#34H ; P2←34H

(4)以间接地址@Ri为目的操作数(3条) MOV @Ri,A ;(Ri)←A MOV @Ri,direct ;(Ri)←(direct) MOV @Ri,#data ;(Ri)← #data 功能:把源操作数指定的内容送入以R0或R1为地址指针 的片内存储单元中。 例: MOV @R0,A MOV @R1,20H MOV @R0,#34H

(5)以DPTR为目的操作数(1条) MOV DPTR,#data16 ;DPTR← #data16 8051是8位机,这是唯一的一条16位立即数传送指令。 功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。 例:MOV DPTR,#1234H ;DPH=12H, DPL= 34H 等同于分别向DPH,DPL送数,即 MOV DPH,#12H MOV DPL,#34H

注意 源操作数和目的操作数中的Rn和@Ri不能相互配对。 即在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。 例如,不允许下面的指令 MOV Rn,Rn MOV @Ri,Rn

例:顺序执行下列指令序列,求每一步执行结果。 MOV A,#30H MOV 4FH,A MOV R0,#20H MOV @R0,4FH MOV 21H,20H ;A=30H ;(4FH)=30H ;R0=20H ;(20H)=30H ;(21H)=30H 练习题:用两种寻址方式实现,将片内RAM 60H单元的 数据传送给累加器A。 解: MOV A,60H MOV R0,#60H MOV A,@R0

说 明: ① 一条指令中不能同时出现两个工作寄存器。 非法指令: MOV R1,R2 MOV R2,@R0 ② 间址寄存器只能使用 R0、R1。 非法指令: MOV A,@R2 ③ SFR区只能直接寻址,不能用寄存器间接寻址。 非法指令: MOV R0,#80H MOV A,@R0

④ 目的操作数不能为立即数。 非法指令: MOV #data,A ⑤ 除了以A为目的操作数的指令影响PSW中的奇偶标志P外,一般不影响标志位。 ⑥ 关注指令表中指令字节数、机器周期数。除操作码外,直接地址或立即数要占一个字节。 ⑦ 只有指令表中的指令才有对应机器码,计算机才能执行。编程时,不能自己随意发明创造指令。

课堂练习 ;(23H)=30H MOV 23H,#30H ;(12H)=34H MOV 12H,#34H ;R0=23H Sub title 课堂练习 ;(23H)=30H ;(12H)=34H ;R0=23H MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV A,@R0 MOV 34H,@R1 MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL ;R7=34H ;R1=12H ;A=30H ;(34H)=34H ;(45H)=34H ;DPTR=6712H ;(12H)=67H ;R0=12H ;A=67H

2.片外数据存储器传送指令MOVX (4条) (1) DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX A,@DPTR ; A←(DPTR) (读) MOVX @DPTR,A ;(DPTR)←A (写) (2) Ri作8位数据指针,寻址256B片外RAM空间: MOVX A,@Ri ;A←(Ri) (读) MOVX @Ri,A ;(Ri)←A (写)

说 明: ① 在51单片机中,与外部存储器RAM打交道的只能是累加器A。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 例:实现片外数据存储器数据传送(2000H) →(2100H)。 MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#2100H MOVX @DPTR,A ;DPTR←2000H ;A←X ;DPTR←2100H ;(2100H)←X

② 片外数据存储器不能直接寻址。 使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 非法指令: MOVX A,2000H MOVX 2100H,2000H ③ 访问片外、片内数据存储器的指令是不同的。 MOVX A,@Ri;片外 MOV A,@Ri;片内

3.程序存储器传送指令MOVC(2条) ——查表指令 (1) DPTR为基址寄存器: MOVC A,@A+DPTR ; A ← (A+DPTR) (读) 使用前,A为偏移量,DPTR为表格首地址; DPTR可任意被赋值,故可访问整个ROM的64KB空间,表格可放在ROM的任何位置,与MOVC指令无 必然的关系。

(2) PC为基址寄存器: MOVC A,@A+PC ; A ← (A+PC) (读) 表格只能存放在查表指令以下的256个单元内。 当表格首地址与本指令间有其它指令时,必须调整偏移量,调整量等于当前程序计数器PC值到表格首址之间的字节数。 注意:查表指令的长度为1个字节,当前程序计数器PC值应为查表指令的地址加1。

课堂练习 写出完成下列功能的程序段。 (1) 将R0的内容送R6中。 (2) 将片内RAM 30H单元的内容送片外60H单元。 Sub title 课堂练习 写出完成下列功能的程序段。 (1) 将R0的内容送R6中。 (2) 将片内RAM 30H单元的内容送片外60H单元。 (3) 将片外RAM 1000H单元的内容送片内20H单元。 (4) 将ROM 2000H单元的内容送片内RAM的30H单元。

二、数据交换指令 普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。 数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。

数据交换指令(5条) 字节交换 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct) 1 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct) XCH A,@Ri ;A←→(Ri) 练习:若R0 =80H,A =20H。 执行指令 XCH A,R0 后,A= ,R0= 。

XCHD指令的功能是间址操作数的低半字节与A的低半字节内容互换。 SWAP指令的功能是累加器A的高低4位互换。 半字节交换 2 XCHD A,@Ri ;A3~0←→(Ri)3~0 SWAP A ;A3~0←→A7~4 XCHD指令的功能是间址操作数的低半字节与A的低半字节内容互换。 SWAP指令的功能是累加器A的高低4位互换。 练习 (1) 若R0=30H,(30H)=67H, A=20H。 XCHD A,@R0 ;A= , (30H)= (2)若A=30H, 则 SWAP A; A =

三、堆栈操作指令(2条) 入栈 PUSH direct ;SPSP+1,(SP)(direct) 将direct中的内容送入堆栈中。 出栈 2 POP direct ; (direct)  (SP), SPSP-1 将堆栈中的内容送回direct中。

注意: 例:若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A ◆ 入栈时SP指针先加1,再入栈; ◆ 出栈时内容先出栈,SP指针再减1; ◆ 用堆栈存取数据的规律是 “先进后出”或“后进先出”。 例:若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A

例:设 A=02H,B=56H,执行下列指令后, SP= ? ,A= ? ,B= ? 。 30H 02H 56H SBR: MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H … POP B POP A SP→ B 00H × 56H 02H A SP→ B 02H × 56H A SP→ B 02H × 56H A SP→ B 02H × 56H A SP→ B 00H × 56H 02H 01H A B 02H 56H A SP→ ×

课堂练习 说明程序执行过程中,SP的内容及堆栈中内容的改变过程。程序如下: MOV SP,#30H MOV A,#20H ;SP=30H Sub title 课堂练习 说明程序执行过程中,SP的内容及堆栈中内容的改变过程。程序如下: MOV SP,#30H MOV A,#20H MOV B,#30H PUSH A PUSH B … … POP A POP B ;SP=30H ;A=20H ;B=30H ;SP=31H (31H)=20H ;SP=32H (32H)=30H … … ;A=30H SP=31H ;B=20H SP=30H

3.4 算术运算类指令 主要对8位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加1、减1运算指令 影响PSW有关位。

一、加法 1.不带进位的加法指令(4条) ADD A,Rn ;A←A + Rn ADD A,direct ;A←A +(direct) ADD A,@Ri ;A←A +(Ri) ADD A,#data ;A←A + #data 用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。

注意 (1) 参加运算的两个操作数必须是8位二进制数,操作结果也是一个8位二进制数。 (2) 用户根据编程需要既可把参加运算的两个操作数看作时无符号数(0~255),又可看作带符号数。若看作带符号数,一般采用补码形式(-128~127)。 例如:11010011B看作无符号数,其十进制值为211; 若看作带符号数,则其为补码形式,其值为- 45。

(3) ADD 指令对PSW中所有标志位产生影响 ◆ CY: 和的D7位有进位时,CY=1;否则,CY=0; ◆ AY: 和的D3位有进位时,AY=1;否则,AY=0; ◆ OV: 和的D7、D6位只有一个有进位时,OV=1; 即 OV=D7位进位⊕D6位进位; 溢出表示运算的结果超出了数值所允许的范围。 对带符号数的运算,当OV=1,结果是错误的。 如:两个正数相加结果为负数或两个负数相加结果为正数时属于错误结果,此时(OV)=1。

例:下面指令执行后A及PSW中各标志位的值是? MOV A,#19H ADD A,#66H ◆ P:累加器ACC中“1”的个数为奇数时,P=1; 为偶数时,P=0。 例:下面指令执行后A及PSW中各标志位的值是? MOV A,#19H ADD A,#66H A中的值为7FH; C=1,AC=0,OV=0,P=1。 对无符号数:结果为7FH; 对带符号数运算:因为OV=0,结果7FH是正确的;

例:下面指令执行后A及PSW中各标志位的值是? MOV A,#5AH ADD A,#6BH A中的值为C5H; C=0,AC=1,OV=1,P=0; 对无符号数:结果为C5H,正确; 对带符号数运算:因为OV=1,结果错误。

例:下面指令执行后A及PSW中各标志位的值是? MOV A,#0AEH ADD A,#81H A中的值为2FH; C=1,AC=0,OV=1,P=1; 对无符号数:结果为12FH,正确; 对带符号数运算:因为OV=1,结果错误。 0AEH、81H为补码,都是负数,而和2FH也是补码,却为正数,结果就是错的。

总结 ◆ 对于无符号运算,要注意检查进位C的值; ◆ 对于有符号运算,要注意检查OV的值,OV=1,表示溢出,计算结果错误;OV=0,无溢出,结果正确。

2. 带进位的加法指令(4条) ADDC A,Rn ;A←A+Rn+C ADDC A,direct ;A←A +(direct)+ C ADDC A,@Ri ;A←A +(Ri)+ C ADDC A,#data ;A←A + #data + C 用途:将A中的值与其后面的值以及进位C中的值相加,最终结果存在A,常用于多字节数运算中。 加的进位C的值是在该指令执行之前C里面的值,而不是执行该指令过程中产生的进位 。

说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。

1067H+30A0H 例: 0001 0000 0110 0111 1067H 0011 0000 1010 0000 30A0H 0100 0001 0000 0111 4107H 67+A0 CY=1, AC=0 , OV=0,P=1 10+30+1 CY=0, AC=0 , OV=0,P=0 R1 R0 R3 R2 R5 R4 C + ADD ADDC MOV A,R0 ADD A,R2 MOV R4,A MOV A,R1 ADDC A,R3 MOV R5,A

3. 加1指令(5条) INC A ;A←A+1 INC Rn ;Rn←Rn+1 INC direct ;(direct)←(direct)+ 1 INC @Ri ;(Ri)←(Ri)+ 1 INC DPTR ;DPTR←DPTR+1 功能简单,将后面目标中的值加1。 仅 INC A 影响P标志。其余指令都不影响标志位。

例:A=12H,R0=33H,(21H)=32H,(34H)=22H,DPTR=1234H。 连续执行下面的指令: INC A INC R0 INC 21H INC @R0 INC DPTR ; A=13H ; R0=34H ;(21H)=33H ;(34H)=23H ; DPTR=1235H

二、十进制调整指令 DA A 在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。 例:A=(15H)BCD(代表十进制数15) ADD A,#8 ; A=1DH,按二进制规律加 DA A ; A=23H, 按十进制规律加

例:在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。 MOV A, R3 ; A=R3=67 ADD A, R2 ; R2=85,A=0ECH DA A ; A =52H MOV R5, A ; R5=52H 程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。

三、减法 1. 带借位的减法指令(4条) SUBB A,Rn ;A←A - Rn - C SUBB A,direct ;A←A -(direct)- C SUBB A,@Ri ;A←A -(Ri)- C SUBB A,#data ;A←A - #data - C 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。

P:累加器ACC中“1”的个数为奇数时,P=1;为偶数时,P=0。 SUBB指令在执行时要影响CY、AC、OV和P标志位 CY:差的D7位需借位时,(CY)=1;否则,(CY)=0。 AC:差的D3位需借位时,(AC)=1;否则,(AC)=0。 OV:差的D7、D6位只有一个需借位时,OV=1; 对于带符号数的计算,要注意OV的值: OV=1,计算结果出错。 P:累加器ACC中“1”的个数为奇数时,P=1;为偶数时,P=0。 没有不带借位的减法指令,如果要做不带借位的减法,还是用SUBB指令,只要将CY预先清零即可。

课堂练习 试编写1234H-0FA3H的程序段,将结果高8位存入 51H, 低8位存入50H单元。 CLR C MOV A, #34H SUBB A, #0A3H MOV 50H, A MOV A, #12H SUBB A, #0FH MOV 51H, A

2. 减1指令 DEC A ;A←A - 1 DEC Rn ;Rn←Rn - 1 DEC direct ;direct←(direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1 与加1指令类似,但没有“DEC DPTR”指令。 除第一条“DEC A”指令影响P标志外,其它指令不影响任何标志位 。

OV:当积大于FFH(255)时(即B中不为0),OV为1;否则,OV为0。 四、乘法指令 MUL AB ; BA ←A×B 将A和B中的两个8位无符号数相乘,积的高8位放在B中,低8位放在A中。 指令执行后将影响CY和OV标志: CY清0; OV:当积大于FFH(255)时(即B中不为0),OV为1;否则,OV为0。

五、除法指令 DIV AB ; A ←商,B ←余数 将A和B中的两个8位无符号数相除(A÷B),商的整数部分放在A中,余数部分放在B中。 指令执行后将影响CY和OV标志: 一般情况下CY、OV都清0; 当除数为0时,则结果的A和B的内容不定,且溢出标志位(OV)=1,表示除数为0结果无意义。

3.5 逻辑运算类指令 主要用于对2个操作数按位进行逻辑操作,结果送到 A或直接寻址单元。 主要操作 与、或、异或、移位、取反、清零等。 对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志 P外,一般不影响标志位。

一、逻辑与指令 ANL A,Rn ;A←A  Rn ANL A,direct ;A←A (direct) ANL A,@Ri ;A←A  (Ri) ANL A,#data ; A←A  data ANL direct,A ;(direct)←(direct) A ANL direct,#data ;(direct)←(direct) data 影响P标志

二、逻辑或指令 ORL A,Rn ;A←A  Rn ORL A,direct ;A←A (direct) ORL A,@Ri ;A←A  (Ri) ORL A,#data ;A←A  data ORL direct,A ;(direct)←(direct) A ORL direct,#data ;(direct)←(direct) data 影响P标志

三、逻辑或指令 XRL A,Rn ;A← A⊕ Rn XRL A,direct ;A← A⊕(direct) XRL A,@Ri ; A← A⊕(Ri) XRL A,#data ;A← A⊕data XRL direct,A ;(direct)← (direct)⊕A XRL direct,#data ;(direct)←(direct)⊕data 影响P标志

例:71H和56H相与: 01110001 ∧)01010110 01010000 清0:与0 不变:与1 例:71H和56H相或: 01110001 ∨) 01010110 01110111 置1:或1 不变:或0 例:71H和56H相异或: 01110001 ⊕) 01010110 00100111 取反:异或1 不变:异或0

逻辑与用于实现对指定位清0,其余位不变; 逻辑或用于实现对指定位置1,其余位不变; 逻辑异或用于实现指定位取反,其余位不变。 例 写出完成下列功能的指令段。 1.对累加器A中的1、3、5位清0,其余位不变 ANL A,#11010101B 2.对累加器A中的2、4、6位置1,其余位不变 ORL A,#01010100B 3.对累加器A中的0、1位取反,其余位不变 XRL A,#00000011B

四、累加器清零和取反指令 清零指令:CLR A ;A← 0 求反指令:CPL A ;A← Ā 在MCS-51系统中,只能对累加器A中的内容进行清零和取反,如要对其它的寄存器或存储单元进行清零和取反,则须放在累加器A进行,运算后再放回原位置。 例: 写出对R0寄存器内容取反的程序。 MOV A,R0 CPL A MOV R0,A

四、循环移位指令 不带进位的循环移位: RL A ;A循环左移一位 RR A ;A循环右移一位 A A 带进位循环移位: RLC A ;带CY循环左移一位 RRC A ;带CY循环右移一位 A C A C

例:若A=5CH,CY=1,执行 RLC A 后, 结果:A=B9H,CY=0,P=1 0101 1100 1 1011 1001

利用带进位的循环移位指令实现多字节移位: 例:编程将寄存器 R6R5中的双字节数X左移一位。 CLR C MOV A,R5 RLC A MOV R5,A MOV A,R6 MOV R6,A ;CY=0,设 R6=55H,R5=0AAH ;R6=01010101B,R5=10101010B,CY=0 ;A=01010100B,CY=1 ;R6=01010101B,R5=01010100B,CY=1 1 CY R6 R5 ;R6=10101011B,R5=01010100B,CY=0

对RLC、RRC指令,在CY=0时,RLC相当于乘以2,RRC相当于除以2; 例:若A= BDH = 1011 1101B,CY=0。 执行指令RLC A 后,CY=1,A= 0111 1010B = 7AH。 结果为:17AH(378)=2×BDH(189)。

3.6 控制转移类指令 通常情况下,程序的执行是顺序进行的,但也可以根据需要改变程序的执行顺序,这种情况称作程序转移。 无条件转移指令 子程序调用及返回指令

一、无条件转移指令 无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。 LJMP addr16 长转移指令 AJMP addr11 绝对转移指令 SJMP rel 相对转移指令 JMP @A+DPTR 间接转移指令

1、长转移指令(64KB范围内转移指令) LJMP addr16 ; PC←addr16 ◇ 把指令码中的目标地址addr16装入PC,使机器执行下一条指令时无条件转移addr16到处执行,不影响标志位。 ◇ addr16是一个16位地址(范围0000H~FFFFH),可在64KB范围内转移。 ◇ 为编程方便,addr16常用标号地址表示,如LOOP、LOOP1、MAIN、START、NEXT……, 最后通过编译软件汇编成16位二进制地址。

2、绝对转移指令(2KB范围内的转移指令) AJMP addr11 ; PC← PC+2 ; PC10~0 ← addr11 ; PC15~11 不变 ◇ 执行时,先将PC的值加2(该指令长度为2字节), 再把指令中的11位地址addr11送给PC的低11位, 而PC的高5位不变,执行后转移到PC所指向的新位置。 ◇由于addr11是11位地址的,转移范围为2KB。 ◇ 在程序中, addr11可用标号代替。

例:若AJMP指令地址为3000H,addr11为123H, 则执行指令AJMP addr11后转移的目的位置是多少? AJMP指令的PC值加2 =3000H+2=3002H=00110 000 0000 0010B 指令中的addr11=123H=001 0010 0011B 转移的目的地址为 00110 001 0010 0011B=3123H

3、相对转移指令 SJMP rel ;PC ← PC+2+rel ◇ rel 为偏移量, 8位带符号补码数,取值范围为 -128~+127。 ◇ 转移的目的地址= SJMP指令所在地址+2+rel ◇ 两字节指令。 ◇ 在程序中,rel 可用标号代替,由汇编软件自动编译成具体的数值。

注意:在程序设计中,通常用到一条SJMP指令: 该指令等效于 HERE: SJMP HERE 功能是在自己本身上循环,进入等待状态。其中符号 $ 表示转移到本身,它的机器码为80 FEH。 程序的最后一条指令通常用它,可使程序固定下来,不再向后执行,以避免执行后面的内容而出错。

4、间接转移指令(又称为散转指令) JMP @A+DPTR ;PC ← A+DPTR ◇ 转移地址由数据指针DPTR的16位数和累加器A的8位数进行无符号数相加形成,并直接装入PC。指令对A、DPTR和标志位均无影响。 ◇数据指针DPTR的内容为基址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移。根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。

例: MOV DPTR,#TAB ;将TAB代表的地址送入DPTR JMP @A+DPTR ;跳转 TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段 AJMP ROUT1 ;跳转ROUT1开始的程序段 AJMP ROUT2 ;跳转ROUT2开始的程序段 AJMP ROUT3 ;跳转ROUT3开始的程序段 ... ROUT0: ROUT1: ROUT2: ROUT3: 执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行----散转。 A=0,转ROUT0 A=2,转ROUT1 A=4,转ROUT2 A=6,转ROUT3

二、条件转移指令 条件转移指令是指当条件满足时,程序转移到指定位置,条件不满足时,程序将继续顺次执行。 MCS-51系统中,条件转移指令有三种: 累加器A判零条件转移指令 比较不等转移指令 减1不为零转移指令

1、累加器A判零条件转移指令 JZ rel ;如果A=0,则转移,否则顺序执行。 JNZ rel ;如果A≠0,就转移。 转移到相对于当前PC值的8位移量的地址去。即:新的PC值 = 指令所在的地址+2+偏移量rel 编程时,用 JZ 标号 ,即转移到标号处。

例:把片外RAM的30H单元开始的数据块传送到片 内RAM的40H开始的位置,直到出现零为止。 程序如下: MOV R0,#30H MOV R1,#40H LOOP: MOVX A,@R0 MOV @R1,A INC R1 INC R0 JNZ LOOP SJMP $

2、比较不等转移指令 CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。

因此,程序转移后再次利用CY就可判断出哪个数大,哪个数小了。 编程时,我们可以将rel写成标号,即: CJNE A,#data,标号 CJNE A,direct,标号 CJNE Rn,#data,标号 CJNE @Ri,#data,标号 利用这些指令,可以判断两数是否相等。 若两数不相等,用CY反映哪个数大,哪个数小。 如果前面的数大,则CY=0,否则CY=1。 因此,程序转移后再次利用CY就可判断出哪个数大,哪个数小了。

举例: MOV R0,#0FH MOV A,R0 CJNE A,#10H,L1;A<#10,CY=1,A>10H,CY=0 MOV R1,#0 ;如R0=10H,则不转移R1=00H; AJMP L3 L1:JC L2 ;如CY=1即 R0<10H,则转移 MOV R1,#0AAH ;否则CY=0即 R0>10H,则转移 L2:MOV R1,#0FFH L3:SJMP L3 因此最终结果是:本程序执行前, 如果R0=10H,则R1=00H; 如果R0>10H,则R1=0AAH; 如果R0<10H,则R1=0FFH。

3、减1不为0转移指令 DJNZ Rn,rel DJNZ direct,rel 执行过程: 它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。

该程序执行后: A=10+9+8+7+6+5+4+3+2+1=37H 例 有一段程序如下: MOV 23H, #0AH CLR A 例 有一段程序如下: MOV 23H, #0AH CLR A LOOPX: ADD A, 23H DJNZ 23H, LOOPX SJMP $ 该程序执行后: A=10+9+8+7+6+5+4+3+2+1=37H

例:利用DJNZ设计循环延时程序,已知fosc=12MHz。 T=12/12MHz=1µs 1)  单循环延时: DELAY: MOV R7,#10 ;1T DJNZ R7,$ ;2T △t=2×1µs×10+1×1µs=21µs 2)  双重循环延时: DELAY: MOV R7,#0AH ;1T DL: MOV R6,#64H ;1T DJNZ R6,$ ;2T DJNZ R7,DL ;2T △t=(2µs×100+2+1)×10+1=2031µs

3) 三重循环延时: =1006031µs ≈ 1 秒 DELAY:MOV R7,#10 DL2: MOV R6,#200 3)  三重循环延时: DELAY:MOV R7,#10 DL2: MOV R6,#200 DL1: MOV R5,#250 DJNZ R5,$ DJNZ R6,DL1 DJNZ R7,DL2 △t=(((2us×250+2+1)×200)+2+1)×10+1 =1006031µs ≈ 1 秒

三、调用与返回指令 1、子程序调用指令(2条) ACALL addr11 ;短调用指令(2字节) LCALL addr16 ;长调用指令(3字节) 对ACALL指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内,即它们的高5位地址相同。 对LCALL指令,被调用的子程序的首址可以设在64K字节范围内的程序存储器空间的任何位置。

为方便编程,通常用标号来表示子程序的首地址: LCALL 标号 ACALL 标号 指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。

2、子程序返回指令(2条) 子程序执行完后必须回到主程序,如何返回呢? 只要执行一条返回指令就可以了。 RET ;子程序返回指令 RETI ;中断子程序返回指令 两者不能互换使用。

四、空操作指令 NOP ; PC ←PC+ 1 不产生任何控制操作,只是将程序计数器PC的内容加1。该指令在执行时间上要消耗1个机器周期,在存储空间上可以占用一个字节。因此,常用来实现较短时间的延时。

3.7 位操作指令 位操作又称布尔操作,是以位为单位进行的各种操作。 操作对象是 片内RAM的位寻址区 字节地址为 20H-2FH,共16个字节单元; 共128个位单元,位地址为00~7FH。 SFR中的11个可位寻址的寄存器。 P0、P1、P2、P3、TCON、SCON、IE、IP、 PSW、A、B

位地址表达方式 例如,PSW中的第5位可用下列方式表达: 直接地址方式:如 0D5H 点操作符方式:如 0D0H.5、PSW.5等 位名称方式:如 F0 伪指令定义方式:如 MYFLAG BIT F0,定义后可 用MYFLAG代替F0。

一、位传送指令 MOV C,bit ; C ←bit MOV bit,C ; bit ← C 实现位运算器(CY)和其它位地址间的数据传递。 例:MOV C,P1.0 ;将P1.0的状态送给C。 MOV P1.0,C ;将C中的状态送到P1.0 引脚。 例:把片内RAM20H位的内容传送到30H位。 MOV C,20H MOV 30H,C

二、位清零和位置位指令 CLR C ; Cy ← 0 CLR bit ; bit ← 0 SETB C ; Cy ← 1 SETB bit ; bit ← 1 CLR 05H ;位清零 MOV 05H,# 00H ; 字节操作 CLR P1.0 ; 使P1.0变为0 SETB P1.0 ;使P.0变为1

三、位逻辑运算指令 ANL C,bit ;Cy ← Cy∧(bit) ANL C, /bit ;Cy ← Cy∧/(bit) ORL C,bit ;Cy ← Cy∨(bit) ORL C, /bit ;Cy ← Cy∨/(bit) 注意:上述指令中bit中的值本身并不发生变化。 CPL C ;Cy ← /Cy CPL bit ;bit ← /bit

四、位条件转移指令 1、以C为条件 JC rel ; CY=1转移,否则顺序执行 JNC rel ; CY=0转移,否则顺序执行 2、以bit为条件 JB bit,rel ; 若(bit)=1,转移;否则顺序执行 JNB bit,rel ; 若(bit)=0,转移;否则顺序执行 JBC bit,rel ; 若(bit)=1,转移,且(bit)←0; 否则顺序执行

举例: +5V P3.2和P3.3上各接有一只按键, 要求它们分别按下时 (P3.2=0 或P3.3=0),分别使P1口为0或 FFH。 8051 举例: P3.2和P3.3上各接有一只按键, 要求它们分别按下时 (P3.2=0 或P3.3=0),分别使P1口为0或 FFH。 START: MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L2 ; JNB P3.3,L3 ; P3.2=1, P3.3=1,等待 LJMP L1 L2: MOV P1,#00H ; P3.2=0,使P1口全为“0” L3: MOV P1,#0FFH ; P3.3=0,使P1口全为“1”

Have a Break