本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析

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单片机中断系统 外部事件中断及应用
6.3 定时器/计数器的应用 初始化 初始化的内容如下:
第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系列单片机的寻址方式及 每一种寻址方式对应的寻址空间;掌 握每一条指令功能。
5-6 串列埠模式0輸出埠擴充實習.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
CPU中的专用寄存器(SFR) 一、累加器Acc 二、通用寄存器B 三、程序计数器PC 四、堆栈指针SP 五、数据指针DPTR
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:

本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析 本章采用简单例程讲解解汇编语言指令功能

3.1 指令格式 指令:即命令, 人们给计算机的命令 指令有两种表示方式: 机器码——机器语言(机器能直接识别) 助记符——汇编语言(供设计人员使用) 机器码和助记符一一对应,汇编语言可汇编为机器语言,机器语言可反汇编为汇编语言。

3.1 指令格式 [标号:] 操作码助记符 [操作数] ;[注释] 汇编语言格式: [标号:] 操作码助记符 [操作数] ;[注释] START : MOV A , #20H ; 把数20H送入累加器A 中 INC A ; (A)加一

3.1 指令格式 汇编语言指令的形式: (1)没有操作数: RET,RETI,NOP (2)有1个操作数: INC A,DEC 20H,CLR C,SJMP NEXT (3)有2个操作数: MOV R7, #DATA,ADD A, R0, DJNZ R2, LOOP (4)有3个操作数: CJNE A, #20H, NEQ

3.1 指令格式 机器语言的形式: (1)单字节指令 : INC DPTR 指令机器代码:A3 ADD A, R7 指令机器代码:2F (2) 双字节指令 : SUBB A, 2BH 指令机器代码:95 2B ORL C, /27H 指令机器代码:A0 27 (3)三字节指令: MOV 20H, #00H 指令机器代码: 75 20 00 LJMP 2000H 指令机器代码: 02 20 00

3.2 MCS-51 单片机的寻址方式 寻址方式 :CPU执行指令时获取操作数的方式 MCS-51单片机有7种不同的寻址方式 : (1)立即寻址方式 (2)直接寻址方式 (3)寄存器寻址方式 (4)寄存器间接寻址方式 (5)变址寻址方式 (6)位寻址方式 (7)相对寻址方式

3.2 MCS-51 单片机的寻址方式 (1)立即寻址方式:在指令中直接给出了参与运算的操作数。 MOV A , #20H (2)直接寻址方式:指令中给出了参与运算的操作数所在单元的地址或所在位的位地址 MOV A , 20H MOV 27H.1, C 直接寻址方式的使用范围: 1)单元地址 : 00~7FH 、21个SFR 2)对SFR的访问只能采用直接寻址方式

3.2 MCS-51 单片机的寻址方式 (3)寄存器寻址方式 指令指出了参与运算的操作数所在的寄存器。 MOV A , R0 寄存器寻址方式中的寄存器 : 1)工作(通用)寄存器R0~R7 、DPTR 2)累加器A、寄存器B(仅在乘除法时)和布 尔累加器C

3.2 MCS-51 单片机的寻址方式 (4)寄存器间接寻址方式 在指令中,指出了存放参与运算的操作数所在单元地址的寄存器。 MOV A,@R0 11100110 地址寄存器 CPU ? !! 操作数在哪儿? 它的地址在R0中 RAM 得到地址了! 找数! A ROM MOV A,@R0 11100110 11100110 (A) 地址在(R0)

3.2 MCS-51 单片机的寻址方式 可以作为地址寄存器的寄存器: 把存放操作数地址的寄存器称为地址寄存器。 可作为地址寄存器的寄存器:R0、R1、DPTR、SP(隐含) 在指令中表示为@R0、@R1、 @DPTR 寄存器间接寻址方式寻址范围: 1)片内RAM:00~7FH; 地址寄存器:@R0、@R1 2)片外RAM:0000~FFFFH; 地址寄存器:@R0、@R1、@DPTR

3.2 MCS-51 单片机的寻址方式 (5)变址寻址方式(基址寄存器+变址寄存器间接寻址) 操作数的地址由基址寄存器+变址寄存器间接寻址指出。 1)MCS-51单片机中可以作基址寄存器: 2个十六位寄存器,DPTR和PC 2)MCS-51单片机中变址寄存器: 8位寄存器:累加器A 3)操作数存放在一个由[(PC)+(A)]或[(DPTR)+(A)]指出的十六位地址所指的单元中(在ROM中。

3.2 MCS-51 单片机的寻址方式 MCS-51单片机变址寻址方式有以下3种指令: MOVC A,@A+PC MOVC A,@A+DPTR JMP @A+DPTR

3.2 MCS-51 单片机的寻址方式 (6)位寻址方式 在指令中,指出了参与运算的操作数(一位)所在的位地址或寄存器(仅有位累加器C)。 指令中位地址为: 1)20~2FH的16个单元的128 位;00~7FH 2)专用寄存器(SFR)中的某些寄存器中的位(80~FFH) CLR C MOV 00H,C MOV 20H.0, C

3.2 MCS-51 单片机的寻址方式 (7)相对寻址方式 与程序的执行顺序有关,在指令执行时改变了程序计数器PC的内容,从而改变了程序转移的目标地址。 当前的PC值加上指令中给出的地址偏移量rel(相对量)而形成的目的(标)地址。 相对量只出现在相对转移指令中。 目的地址=源地址+rel+指令的字节数 rel =目的地址—源地址—指令的字节数 rel:指令中给出的地址偏移量。-128~+127,用补码表示,大于0正向跳转(向后),小于0则反向跳转(向前)。

3.2 MCS-51 单片机的寻址方式 MCS-51单片机相对寻址方式的指令: JC rel SJMP NEXT1 JZ FIRST DJNZ R1,LOOP2 CJNE A, 20H, NEXT JNB TF0,REDO

3.3 指令系统分析 3.3.1 指令的分类 MCS-51单片机共有111条指令 (1)按指令代码的字节数 单字节指令(49条) 双字节指令(45 条) 三字节指令(17 条) (2)按指令执行的时间 单机器周期指令(64条) 双机器周期指令(45条) 四机器周期指令(2条)

3.3.1 指令的分类 (3)按照指令功能可分成五类: 数据传送类指令(29条) 算术运算类指令(24条) 逻辑运算类指令 (24条) 控制转移类指令(17条) 位操作类指令 (17条)

3.3.2 指令系统分析 一、数据传送类指令 数据传送(Data Transfers)类指令共有29条,分为以下5种类型: (1)通用传送指令 (2)堆栈操作指令 (3)交换指令 (4)访问程序存储器的指令 (5)访问外部RAM的指令

3.3.2 指令系统分析 (一)通用传送指令 通用传送指令的一般形式为 : MOV 目的操作数,源操作数   通用传送指令的一般形式为 :   MOV 目的操作数,源操作数 (1)以A为目的操作数的传送指令 (4条) MOV A,源操作数 MOV A,Rn ;(Rn)(A),n=0~7 MOV A,direct ;(direct)  (A) MOV A,@Ri ;[(Ri)]  (A),i=0, 1 MOV A,#data ; data  (A)

3.3.2 指令系统分析 例 MOV A,R2 MOV A,30H MOV A,@R0 MOV A,#36H

3.3.2 指令系统分析 (2) 以Rn为目的操作数的传送指令(3条) 一般形式: MOV Rn,源操作数 MOV Rn ,A ;(A)(Rn) MOV Rn ,direct;(direct) (Rn) MOV Rn ,#data ; data (Rn) 例:MOV R0,A MOV R3,30H MOV R7,#36H MOV R1,#30 MOV R6,#01101100B

3.3.2 指令系统分析 (3) 以直接地址为目的操作数的指令(5条) 一般形式:MOV direct,源操作数 MOV direct,A ;(A)(direct) MOV direct,Rn ;(Rn)(direct) MOV direct1,direct2;(direct2)(direct1) MOV direct,@Ri ;[(Ri)](direct) MOV direct,#data ;data(direct)

3.3.2 指令系统分析 例: MOV 30H,A MOV P1,R2 MOV 38H,60H MOV TL0,@R1 MOV 58H,#36H

3.3.2 指令系统分析 (4)以间接地址为目的操作数的指令(3条) 一般形式:MOV @Ri,源操作数 MOV @Ri,A ;(A)[(Ri)] MOV @Ri,direct ;(direct) [(Ri)] MOV @Ri,#data ;data  [(Ri)] 如:MOV @R0,A MOV @R1,36H MOV @R0,SBUF MOV @R1,#48 MOV @R0,#0D6H

3.3.2 指令系统分析 例1:已知(PSW)= 00H,(A)=11H,(20H) =22H,分析下列程序的执行结果 MOV R0,A MOV R1,20H MOV R2,#33H 分析: PSW CY AC F0 RS0 OV P RS1 - 00H BANK 0 R0~R1:00H~07H

3.3.2 指令系统分析 MOV R0,A ; (A)(R0),即 (A)(00H) MOV R1,20H ; (20H)(R1),即 (20H) (00H) MOV R2,#33H ; 33H(R2) 分析结果如下: (R0)=(00H)=11H (R1)=(01H)=22H (R2)=(02H)=33H 26

3.3.2 指令系统分析 例2:已知(PSW)=00H,(A)=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,分析下列程序的执行结果。 MOV 30H,A; MOV 31H,R0; MOV 32H,33H; MOV 34H,@R1; MOV 35H,#55H 11 A 33 36H XX 35H XX 34H 44 33H XX 32H XX 31H 36 01H 22 00H 27

3.3.2 指令系统分析 例2:已知(PSW)=00H,(A)=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,分析下列程序的执行结果。 MOV 30H,A; (A)(30H) MOV 31H,R0; (R0)(31H), (00H)(31H), MOV 32H,33H; (33H)(32H) MOV 34H,@R1; [(R1)](34H), [36H](34H), MOV 35H,#55H; (35H)=55H 分析结果如下:(30H)=11H,(31H)=22H,(32H)=44H,(34H)=33H,(35H)=55H。 33 36H 55 35H 34H 44 33H 32H 22 31H 11 30H 36 01H 00H A

3.3.2 指令系统分析 (5) 十六位数据传送指令(1条) MOV DPTR,#data16 (5) 十六位数据传送指令(1条) MOV DPTR,#data16 ; data8~15(DPH),data0~7 (DPL) 如:MOV DPTR,#2368H MOV DPTR,#35326 上述操作同: MOV DPH,#23H MOV DPL,#68H

3.3.2 指令系统分析 在使用通用数据传送指令时,应注意以下几点 : (1)MCS-51单片机不支持工作寄存器R0~R7内容直接传送给由地址寄存器内容指定的单元,或由地址寄存器内容指定单元的内容送给工作寄存器R0~R7,如果需要传送,可采用其他方式间接实现。 例如:希望把地址寄存器R1内容指定的单元内容传送给工作寄存器R5,可以采用 MOV A, @R1 MOV R5, A

3.3.2 指令系统分析 (2)在通用数据传送指令中,地址寄存器只能由工作寄存器R0和R1担当,其他工作寄存器没有这个功能。 (3)虽然MCS-51单片机由2个16位的寄存器:PC和DPTR,但只有DPTR用户可以用指令方式直接设置其内容。 MOV DPTR,#5678H

3.3.2 指令系统分析 (二)堆栈操作指令 堆栈是在内部RAM中开辟的一个先进后出(后进先出)的区域,用来保护CPU执行程序的现场 1.入栈指令    PUSH direct;  CPU操作:(SP)+1  (SP),修改堆栈指针;       (direct)  [(SP)],入栈:  例如:MOV SP, #70H     PUSH 60H A8 69 FE C6 CA 片内RAM 60 61 (SP) 70 71 72 (SP) A8

3.3.2 指令系统分析 2 .出栈指令 POP direct CPU操作:  [(SP)]  (direct),出栈,把堆栈中由(SP)所指          单元的内容传送到指定单元direct。  (SP)-1  (SP),修改堆栈指针 例如: MOV SP, #71H POP 60H 片内RAM 60 61 70 71 72 A8 69 FE C6 CA C6 (SP) (SP)

3.3.2 指令系统分析 在使用堆栈时,应注意以下几点 : (1)PUSH和POP指令的操作数必须是单元地址。  PUSH指令中指定的单元地址是被保护单元的地址(源操作数),指令隐含了目的操作数;而POP指令中指定的单元地址是内容要恢复的单元地址(目的操作数),指令隐含了源操作数。 (2)MCS-51单片机的堆栈建在内部RAM中,单片机复位后,(SP)=07H,从08H单元开始的区域均为栈区。在应用系统中,一般把栈区开辟在内部RAM的30~7FH这一区域,栈区最好靠近内部RAM的末端,以避免堆栈加1向上增长时覆盖有效数据。

3.3.2 指令系统分析 (3)在使用堆栈操作指令时,入栈指令PUSH和出栈指令POP应成对出现,保护指定单元内容时,必须遵循先进后出的步骤,否则,单元内容在出栈恢复时会发生改变。 (4)MCS-51单片机不支持对工作寄存器R0~R7直接使用堆栈操作指令。如果要用堆栈操作保护某一寄存器Rn(n=0~7)的状态,可用该工作寄存器对应单元进行操作。如当(PSW.4)=1、(PSW.3)=0时,把R5的内容入栈 PUSH 15H; 出栈时 POP 15H; 恢复R5原来的内容。

3.3.2 指令系统分析 例: 已知(30H)=11H,(31H)=22H,则下列程序段的操作过程为: MOV SP, #60H ;开辟栈区 PUSH 30H ;(SP)+1  (SP),30H单元内容进栈61H单元 PUSH 31H ;(SP)+1  (SP),31H单元内容进栈62H单元, ;(SP)=62H POP ACC ;[(SP)](ACC),62H单元内容弹出到累加器 ;ACC,(SP)-1(SP),(SP)=61H。 POP B ;[(SP)](B),栈顶61H单元内容弹出寄存器B, ;(SP)-1(SP),(SP)=60H。

3.3.2 指令系统分析 (三)交换指令 (1)字节交换指令 将源操作数的内容与A累加器的内容互换。 XCH A,源 源——Rn,direct,@Ri 指令: XCH A,Rn ; (A)(Rn) XCH A,direct ; (A)(direct) XCH A,@Ri ; (A)[(Ri)]

3.3.2 指令系统分析 例:将内RAM的20H单元的内容与40H单元交换。 方法1: MOV A, 20H XCH A, 40H MOV 20H, A 方法2: MOV 20H, 40H MOV 40H, A

XCHD A,@Ri ; (A0~3) [(Ri)0~3] 3.3.2 指令系统分析 (2)半字节交换指令 XCHD A,@Ri ; (A0~3) [(Ri)0~3] 将某一单元内容的低四位与累加器A的低四位互换,而二者的高四位保持不变。 D0 D1 D2 D3 D4 D5 D6 D7 (A) D0 D1 D2 D3 D4 D5 D6 D7 [(R0)] 执行过程 XCHD A,@Ri D4 D5 D6 D7 (A) D0 D1 D2 D3 D4 D5 D6 D7 [(R0)] D0 D1 D2 D3

3.3.2 指令系统分析 例:两个单元的低四位互换。 MOV A, 20H XCHD A, 40H MOV 20H, A

3.3.2 指令系统分析 (3)高低四位互换指令 将累加器A的高四位和低四位互换。 SWAP A ;(A0~3)(A4~7) (A) D0 D1 D2 D3 D4 D5 D6 D7 (A) 1 D0 D1 D2 D3 D4 D5 D6 D7 (A) (A) D0 D1 D2 D3 D4 D5 D6 D7 (A) 1 1 如:设(A)=5BH SWAP A ; D0 D1 D2 D3 D4 D5 D6 D7 (A)=B5H

3.3.2 指令系统分析 (四)访问程序存储器的指令(查表指令) MOVC A,@A+DPTR ; [(A)+(DPTR)](A) DPTR放表的首地址,A放所查数据在表中的偏移;查表范围为64KB空间。 MOVC A,@A+PC ;(PC)+1  (PC) [(A)+(PC)](A) PC的值为下一条指令的地址, A放所查数据相对PC值的偏移;查表范围为最大为256B空间

3.3.2 指令系统分析 (五)访问外部RAM和外部I/O口的数据传送指令 1 .以DPTR为地址寄存器的指令 (1)读(输入)指令:   MOVX A,@DPTR ;[(DPTR)] (A)   说明: 上述指令以DPTR为片外RAM单元的16位地址指 针,寻址范围为寻址范围为0000~FFFFH,即64K 。

3.3.2 指令系统分析 MOVX A, @DPTR 被访问单元 (DPTR) A DPL DPH

CPU执行读外部数据存储器和外部I/O口指令的时序 3.3.2 指令系统分析 CPU执行读外部数据存储器和外部I/O口指令的时序

3.3.2 指令系统分析 例:把外部RAM的2000H单元的内容存入单片机内部RAM的30H单元。 MOV DPTR, #2000H MOVX A, @DPTR MOV 20H, A 注意: 1、外部RAM单元和外部I/O口的地址为16位; 2、外部RAM单元和外部I/O口的信息必须通过A累加器才能进入单片机的CPU。

3.3.2 指令系统分析 (2)写(输出)指令: 将单片机的累加器A的内容输出到外部RAM某一单元或外部I/O口。 MOVX @DPTR,A ; (A)  [(DPTR)] 说明: 上述指令以DPTR为片外RAM单元的16位地址指针,寻址范围为寻址范围为0000~FFFFH ,即64K

3.3.2 指令系统分析 MOVX @DPTR, A 被访问单元 (DPTR) A DPL DPH

CPU执行写外部数据存储器和外部I/O口指令的时序 3.3.2 指令系统分析 CPU执行写外部数据存储器和外部I/O口指令的时序

3.3.2 指令系统分析 例:把单片机内部RAM的20H单元的内容转存到外部RAM的8000H单元。 MOV DPTR, #8000H MOV A, 20H MOVX @DPTR, A 注意: 1、外部RAM单元和外部I/O口的地址为16位;而单片机内部RAM的单元地址为8位。 2、单片机片内RAM单元的信息输出到外部RAM单元或外部I/O口,必须通过A累加器实施。

3.3.2 指令系统分析 2 .以R0和R1为地址寄存器的指令 (1)读(输入)指令 MOVX A,@Ri ;[(P2)(Ri)]  (A),Ri=0, 1; 说明: 上述指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为00~FFH ,256B空间,高8位由当前的P2口状态提供。

3.3.2 指令系统分析 MOVX A, @R0 被访问单元 A R0

3.3.2 指令系统分析 (2)写(输出)指令 MOVX @Ri,A ;(A)  [(P2)(Ri)],Ri=0, 1; 说明: 上述指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为256B空间,高8位由当前的P2口状态提供。 注意: (1)上述2种指令的操作时序与前面访问外部RAM的指令相同。 (2)采用R0或R1作为地址寄存器指出的是外部RAM和外部I/O口的低八位地址,当扩展的数据存储器单元和I/O口的空间不大于256个时,P2口可以作为I/O口使用。

3.3.2 指令系统分析 MOVX @R0, A 被访问单元 A R0

3.3.3 算术运算指令 (一) 二进制加法指令 (1)不带进位位的加法指令 ADD A,源 ; (A)+源(A) (一) 二进制加法指令 (1)不带进位位的加法指令 ADD A,源 ; (A)+源(A) 源—— #data,Rn,direct,@Ri   指令: ADD A,#data ; (A)+ data (A) ADD A,Rn ; (A)+ (Rn) (A) ADD A,direct ; (A)+ (direct) (A) ADD A,@Ri ; (A)+[(Ri)] (A) 影响标志位Cy,AC,OV,P

3.3.3 算术运算指令——加法指令 加法指令执行过程与标志位之间的关系 +) D6与D7两位其中一位在运算中有进位,而另一位 3.3.3 算术运算指令——加法指令 加法指令执行过程与标志位之间的关系 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 +) 结果 进位 (AC)=1 (Cy)=1 (Cy) D6与D7两位其中一位在运算中有进位,而另一位 没有,则(OV)=1,否则,(OV)=0. 运算结果(A)中1的个数为偶数,(P)=0,否则,(P)=1

3.3.3 算术运算指令——加法指令 (2)带进位位的加法指令 ADDC A,源 ; (A)+源+(Cy)(A) 3.3.3 算术运算指令——加法指令 (2)带进位位的加法指令 ADDC A,源 ; (A)+源+(Cy)(A) 源—— #data,Rn,direct,@Ri   指令: ADDC A,#data ADDC A,Rn ADDC A,direct ADDC A,@Ri 影响标志位Cy,AC,OV,P

3.3.3 算术运算指令——加法指令 带进位位加法指令执行过程 +) (A) 源 结果 进位 (Cy)=1 (AC)=1 Cy D0 D1 3.3.3 算术运算指令——加法指令 带进位位加法指令执行过程 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 +) 结果 Cy 进位 (AC)=1 (Cy)=1 58

3.3.3 算术运算指令——加法指令 例1:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y(设z小于0FFH) D0 D1 D2 D3 D4 D5 D6 D7 +) (Cy) 程序: MOV A,20H ADD A,21H MOV 22H,A ;结果存22H单元 如果z=x+y的结果大于255,势必会产生进位,进位如何处理?

3.3.3 算术运算指令——加法指令 例2:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y 进位位处理 +) D0 3.3.3 算术运算指令——加法指令 例2:单字节二进制加法:x存放在20H单元,y存放在21H单元,求 z=x+y D0 D1 D2 D3 D4 D5 D6 D7 +) Cy 进位位处理

3.3.3 算术运算指令——加法指令 程序: MOV A, 20H ADD A, 21H MOV 23H, A;和的低八位 3.3.3 算术运算指令——加法指令 程序: MOV A, 20H ADD A, 21H MOV 23H, A;和的低八位 MOV A, #00 ADDC A, #00 ;处理进位 MOV 22H, A ;和的高八位 D0 D1 D2 D3 D4 D5 D6 D7 +) Cy 进位位处理

3.3.3 算术运算指令——加法指令 例3:双字节二进制加法:x存放在20H、21H单元(高8位在20H单元),y存放在22H、23H单元(高8位在20H单元) ,求 z=x+y 20H 21H 23H 22H +) 32H 31H 33H XX 20H 21H 22H 23H 24H 25H 26H 27H 内RAM x y 多字节二进制加法与双字节原理相同,可以将此算法推广到多字节!

3.3.3 算术运算指令——加法指令 程序: MOV A, 21H ADD A, 23H MOV 31H, A;结果的低8位 ADDC A, 22H MOV 32H, A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 MOV 33H, A ;结果的高8位 20H 21H 23H 22H +) 32H 31H 33H

3.3.3 算术运算指令——加法指令 (3)加1指令 INC 源; 源+1 源 源——A,Rn,direct,@Ri 指令 INC A 3.3.3 算术运算指令——加法指令 (3)加1指令 INC 源; 源+1 源 源——A,Rn,direct,@Ri 指令 INC A INC Rn INC direct INC @Ri INC DPTR 以上指令不影响标志CY、AC和OV

3.3.3 算术运算指令——加法指令 例4:(R7)=0FFH,执行“INC R7”,(R7)为多少? R7 +) R7 丢弃 3.3.3 算术运算指令——加法指令 例4:(R7)=0FFH,执行“INC R7”,(R7)为多少? 1 D0 D1 D2 D3 D4 D5 D6 D7 +) R7 R7 1 丢弃 (R7)=00H,向上溢出!

3.3.3 算术运算指令——加法指令 例5:双字节二进制加法:x存放在21H 、20H单元(高8位在21H单元),y存放在31H 、 30H单元(高8位在31H单元) ,求 z=x+y XX 20H 21H 22H 23H 30H 31H 32H 内RAM Cy Cy 21H 20H 30H 31H +) 32H (R0) 00 (R0) 00 (R1) (R1) (R1)

3.3.3 算术运算指令——加法指令 21H 20H 30H 31H +) 32H MOV R0, #20H; 指向被加数的低8位 3.3.3 算术运算指令——加法指令 MOV R0, #20H; 指向被加数的低8位 MOV R1, #30H;指向加数的低8位 MOV A, @R0 ADD A, @R1 MOV @R1, A;结果的低8位 INC R0; 修改单元地址 INC R1 ADDC A, @R1 MOV @R1, A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 MOV @R1, A ;结果的高8位 21H 20H 30H 31H +) 32H

3.3.3 算术运算指令——加法指令 (4)十进制加法调整指令 DA A ; 影响标志位Cy、AC、OV、P 说明: 3.3.3 算术运算指令——加法指令 (4)十进制加法调整指令 DA A ; 影响标志位Cy、AC、OV、P 说明: 1)该指令必须与加法指令联合使用!将A中的和调整为BCD码,并且ADD或ADDC的两个操作数是BCD码; 2)调整方法: 若(A0~3)>9或(AC)=1,则(A0~3) +6(A0~3); 若(A4~7)>9或(Cy)=1,则(A4~7) +6  (A4~7); 68

3.3.3 算术运算指令——加法指令 低四位调整 高四位调整 “DA A” 调整方法: 3.3.3 算术运算指令——加法指令 “DA A” 调整方法: 若(A0~3)>9或(AC)=1,则(A0~3) +6(A0~3); 若(A4~7)>9或(Cy)=1,则(A4~7) +6  (A4~7); CPU执行DA A的流程 低四位调整 高四位调整

3.3.3 算术运算指令——加法指令 使用DA A指令时,必须注意以下几点: 3.3.3 算术运算指令——加法指令 使用DA A指令时,必须注意以下几点: (1)该指令的前提是两个2位十进制数(BCD码)的加法,对加法运算的结果进行调整,使结果为十进制数,即将A中的和调整为BCD码。 (2)必须与加法指令联合使用! (3)单独使用该指令是不能把累加器A中的数据转换为BCD码形式的,因为,DA A的调整结果不仅依赖于累加器A的内容,而且与标志位Cy和AC的状态有关。

3.3.3 算术运算指令——加法指令 00011001 01010011 例6: 已知在30H和31H单元中分别存储两个BCD码表 示的十进制数19和53。求两个数之和,并把结果存到32H单元。 程序如下: MOV A, 30H ; (A)=19H ADD A, 31H ; (A)=19H+53H=6CH DA A ; 十进制调(A)=72H MOV 32H, A ; (32 H)=72H

3.3.3 算术运算指令——加法指令 例7:4位十进制数x和y,x存放在21H 、20H单元(高8位在21H单元),y存放在31H 、 30H单元(高8位在31H单元) ,求 z=x + y XX 20H 21H 22H 23H 30H 31H 32H 内RAM Cy Cy 21H 20H 30H 31H +) 32H (R0) 00 (R0) 00 DA A DA A (R1) (R1) (R1)

3.3.3 算术运算指令——加法指令 21H 20H 30H 31H +) 32H MOV R0, #20H; 指向被加数的低8位 3.3.3 算术运算指令——加法指令 MOV R0, #20H; 指向被加数的低8位 MOV R1, #30H;指向加数的低8位 MOV A, @R0 ADD A, @R1 DA A MOV @R1, A;结果的低8位 INC R0; 修改单元地址 INC R1 ADDC A, @R1 MOV @R1, A;结果的中8位 MOV A, #00 ADDC A, #00 ;处理进位 MOV @R1, A ;结果的高8位 21H 20H 30H 31H +) 32H

3.3.3 算术运算指令——减法指令 (二)二进制减法指令 (1)带借位的减法指令 SUBB A,源; (A)-源-(Cy)(A) 源—— #data,Rn,direct,@Ri   指令: SUBB A,#data SUBB A,Rn SUBB A,direct SUBB A,@Ri 影响标志位Cy,AC,OV,P

3.3.3 算术运算指令——减法指令 减法指令执行过程 — (A) 源 结果 借位 (Cy)=1 (AC)=1 Cy D0 D1 D2 D3 3.3.3 算术运算指令——减法指令 减法指令执行过程 D0 D1 D2 D3 D4 D5 D6 D7 (A) 源 — 结果 Cy 借位 (AC)=1 (Cy)=1 75

3.3.3 算术运算指令——减法指令 例8: 设累加器A的内容为0C9H,寄存器R2的内容为54H,当前Cy的状态为1,执行指令“SUBB A,R2”,A的内容及标志位的状态是多少? 结果:A的内容为74H,(Cy)=0,(AC)=0,(OV)=1,(P)=0。 减法指令的执行结果与当前进位位的状态有关,因此,在计算时,首次使用减法指令,进位位Cy应清零。 1 D0 D1 D2 D3 D4 D5 D6 D7 A R2 — Cy 1 1 1 1 (A) Cy

3.3.3 算术运算指令——减法指令 (2)减1指令 DEC 源;源-1 源 源——A,Rn,direct,@Ri 指令: DEC A DEC Rn DEC direct DEC @Ri 以上指令不影响标志CY、AC和OV

3.3.3 算术运算指令——减法指令 例9:(R7)=00H,执行“DEC R7”,(R7)为多少? R7 −) R7 丢弃 3.3.3 算术运算指令——减法指令 例9:(R7)=00H,执行“DEC R7”,(R7)为多少? D0 D1 D2 D3 D4 D5 D6 D7 1 −) R7 R7 1 1 1 1 1 1 1 1 1 丢弃 (R7)=0FFH,向下溢出!

3.3.3 算术运算指令——减法指令 例10: 设R0的内容为7EH,内部RAM的7DH和7EH单元的内容分别为00H和40H,P1口的内容为55H,执行下列指令后,R0、P1、7EH单元的内容分别是多少? DEC @R0 DEC R0 DEC 7EH DEC P1 XX 7FH 40 7EH 00 7DH 7CH 02H 01H 7E 00H 内RAM

3.3.3 算术运算指令——减法指令 DEC @R0; [(R0)]-1 [(R0)], [7EH]-1 [7EH], [7EH]=3FH DEC R0 ; (R0)-1(R0), (R0)= 7DH DEC @R0 ; [(R0)]-1 [(R0)] [7DH]-1 [7DH], [7DH]=0FFH DEC 7EH ; [7EH]-1 [7EH], [7EH]=3EH DEC P1 ; [P1]-1 [P1], [P1]=54H XX 7FH 40 7EH 00 7DH 7CH 02H 01H 7E 00H 内RAM 3E 3F FF 7D 80

3.3.3 算术运算指令——减法指令 例11:双字节二进制x存放在20H 、21H单元(高8位在20H单元),y存放在22H 、 23H单元(高8位在22H单元) ,求 z = x - y XX 21H 20H 1FH 1EH 31H 30H 2FH 内RAM Cy 20H 21H 23H 22H -) (R0) (R0) (R1) (R1)

3.3.3 算术运算指令——减法指令 MOV R0, #21H; 指向被减数的低8位 MOV R1, #23H; 指向减数的低8位 3.3.3 算术运算指令——减法指令 MOV R0, #21H; 指向被减数的低8位 MOV R1, #23H; 指向减数的低8位 MOV A, @R0 CLR Cy SUBB A, @R1 MOV @R0, A ;结果的低8位 DEC R0 ;修改单元地址 DEC R1 MOV @R0, A ;结果的高8位 20H 21H 23H 22H -)

3.3.3 算术运算指令——乘法指令 (三)乘法指令 MUL AB (A)×(B)的乘积高八位存储在(B),低八位存储在(A)。 说明: 3.3.3 算术运算指令——乘法指令 (三)乘法指令 MUL AB (A)×(B)的乘积高八位存储在(B),低八位存储在(A)。 说明: (1)此指令为无符号数乘法; (2) 指令执行后,(Cy)=0。若乘积大于255,则(OV)=1。

3.3.3 算术运算指令——乘法指令 例12: 已知x存放在(20H)中,y存放在(21H),求x*y. MOV A, 20H ;取被乘数 3.3.3 算术运算指令——乘法指令 例12: 已知x存放在(20H)中,y存放在(21H),求x*y. MOV A, 20H ;取被乘数 MOV B, 21H ;取乘数 MUL AB MOV 22H, A ;乘积的低8位 MOV 23H, B ;乘积的高8位  20H 21H 22H 23H 84

3.3.3 算术运算指令——乘法指令 例13:多字节乘以单字节的乘法算法。 十进制数乘法运算会给我们什么启示? 8 9 8 9  1 7 3.3.3 算术运算指令——乘法指令 例13:多字节乘以单字节的乘法算法。 十进制数乘法运算会给我们什么启示? 8 9 8 9  1 7 2  9  8 1 8 1

3.3.3 算术运算指令——乘法指令 多字节乘以单字节的实现算法  高8位 低8位 部分积 高8位 低8位 部分积 高8位 中8位 低8位

3.3.3 算术运算指令——乘法指令  MOV A, R3 ;的低八位 MOV B, R1 ;乘数 MUL AB 3.3.3 算术运算指令——乘法指令 MOV A, R3 ;的低八位 MOV B, R1 ;乘数 MUL AB MOV R6, A ;乘积的低8位 MOV R5, B ;暂存中间结果 MOV A, R2 ;的高八位 ADD A, R5 ;求乘积的中八位 MOV R5, A ;存储乘积的中八位 MOV A, #00 ADDC A, B ;计算乘积的高八位 MOV R4, A ;存储乘积的高八位  R2 R3 R1 R5 R6 R4 R5 R6 B A

3.3.3 算术运算指令——除法指令 (四)除法指令 DIV AB (A)/(B)的商存储在(A),余数存储在(B) 说明: 3.3.3 算术运算指令——除法指令 (四)除法指令 DIV AB (A)/(B)的商存储在(A),余数存储在(B) 说明: (1)此指令为无符号数除法; (2)若除数(B)=0,则(OV)=1,若(B)≠ 0,则(OV)=0;(Cy)=0。

3.3.3 算术运算指令——除法指令 例14: 已知x存放在(20H)中,y存放在(21H),求x/y. MOV A, 20H ;取被除数 3.3.3 算术运算指令——除法指令 例14: 已知x存放在(20H)中,y存放在(21H),求x/y. MOV A, 20H ;取被除数 MOV B, 21H ;取除数 DIV AB MOV 22H, A ;商存在22H单元

3.3.3 算术运算指令——除法指令 例15:2位十进制数以压缩BCD码的形式存储在R4中,把该数转化为分离式BCD码的形式,存储在30H和31H单元。 BCD码:十进制数符的四位二进制编码。 压缩形式BCD码:一个单元存储2位十进制数符的BCD编码。 分离形式BCD码:一个单元存储1位十进制数符的BCD编码。 如79的BCD编码:0111 1001 压缩形式: 0111 1001 20H 压缩形式: 0000 0111 20H 0000 1001 21H

3.3.3 算术运算指令——除法指令 例15:2位十进制数以压缩BCD码的形式存储在R4中,把该数转化为分离式BCD码的形式,存储在30H和31H单元。 MOV A, R4 ;取压缩BCD码 MOV B, #10H ; DIV AB MOV 31H, A ;低位存在31H单元 MOV 30H, B ;高位存在30H单元

3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 假设:R7中的二进制数为0FEH 0FEH对应的十进制数为254, 把254的百、十、个位分开可用以下方法: (1)提取百位2:254/100的商,余数为54 (2)提取十位5:余数/10的商,它的余数为4 (3)提取十位4:本次的余数 (1)提取百位2:254/100的商,用除法指令“DIV AB”可以实现,0FE/64H,商在A中为02H,余数在B中,

3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 3.3.3 算术运算指令——除法指令 例16:把R7中的二进制数转换为十进制数,并以压缩BCD码的格式存放到R4和R5中 。 上述过程可用除法指令“DIV AB”可以实现 (1)提取百位:254/100的商,0FE/64H,商在A中为02H,余数在B中。 (2)提取十位:余数/10的商,(B)/0AH,商在A中为05H,余数在B为04,即为个位。 (3)把十位和个位合并成一个压缩BCD码格式

3.3.3 算术运算指令——除法指令 MOV A, R7 ;取被转换的二进制数 MOV B, #100 ; 3.3.3 算术运算指令——除法指令 MOV A, R7 ;取被转换的二进制数 MOV B, #100 ; DIV AB ;被转换数除以100,商为百位数 MOV R4, A ;转换的百位数存到R4, MOV A, B ;取余数 MOV B, #10 ; DIV AB ;商为十位数,余数为个位数, SWAP A ; ADD A, B ;变换成压缩BCD码格式 MOV R5, A ;十进制数的十位个位

3.3.4 逻辑运算指令 逻辑运算指令包括与、或、异或、清除、求反、移位等操作。这类指令一般不影响标志位CY、AC和OV。 (1)清零 CLR A 说明:执行结果同“ MOV A,#00H”,只影响标志位P。 (2)累加器A取反指令(按位取反) CPL A ;(/A) ( A) 说明:不影响标志位。 例1: 设(A)=56H (01010110) CPL A ;结果为0A9H(10101001)

3.3.4 逻辑运算指令——逻辑操作指令 (3)循环左移 RL A ; 说明: (1)每次只移动一位; D0 D1 D2 D3 D4 D5 D6 D7 说明: (1)每次只移动一位; (2)在(A)07FH时,左移一位相当于(A)乘以2;

3.3.4 逻辑运算指令——逻辑操作指令 例2 若(A)=33H, (Cy) =1,执行指令: RL A (A)=? RL A 1 D0 D1 D2 D3 D4 D5 D6 D7 A D0 D1 D2 D3 D4 D5 D6 D7 RL A 1 D0 D1 D2 D3 D4 D5 D6 D7 A (A)=66H

3.3.4 逻辑运算指令——逻辑操作指令 (4)带进位位循环左移 RLC A ; 说明: (1)每次只移动一位;左移一位相当于(A)乘以2; D0 D1 D2 D3 D4 D5 D6 D7 Cy 说明: (1)每次只移动一位;左移一位相当于(A)乘以2; (3)带进位位移动时,影响标志位Cy和P。

3.3.4 逻辑运算指令——逻辑操作指令 例3: 若(A)=33H, (Cy) =1,执行指令: RLC A (A)=? RLC A 1 D0 D1 D2 D3 D4 D5 D6 D7 A 1 Cy D0 D1 D2 D3 D4 D5 D6 D7 Cy RLC A 1 D0 D1 D2 D3 D4 D5 D6 D7 A (A)=67H Cy

3.3.4 逻辑运算指令——逻辑操作指令 在二进制中,最低位补0左移一位,其结果为原数的2倍。 RLC A RLC A RLC A 例4:双字节数x二进制数乘2。 x存于(R5)(R6) 在二进制中,最低位补0左移一位,其结果为原数的2倍。 D8 D9 D10 D11 D12 D13 D14 D15 D0 D1 D2 D3 D4 D5 D6 D7 双字节数x D16 D8 D9 D10 D11 D12 D13 D14 D15 2*x D0 D1 D2 D3 D4 D5 D6 D7 RLC A Cy Cy D8 D9 D10 D11 D12 D13 D14 D15 RLC A Cy Cy D16 RLC A

3.3.4 逻辑运算指令——逻辑操作指令 CLR A ; 例4:多字节二进制数乘2。 RLC A ;处理进位 MOV A, R6 ; MOV R4, A ;结果的高8位 例4:多字节二进制数乘2。 MOV A, R6 ; CLR Cy RLC A MOV R6, A ;结果的低8位 MOV A, R5 ; MOV R5, A;结果的中8位

3.3.4 逻辑运算指令——逻辑操作指令 (5)循环右移 RR A ; 说明: (1)每次只移动一位; D0 D1 D2 D3 D4 D5 D6 D7 说明: (1)每次只移动一位; (2)在(A)为偶数时,右移一位相当于(A)除以2;

3.3.4 逻辑运算指令——逻辑操作指令 (6)带进位位循环右移 RRC A ; 说明: (1)每次只移动一位;移一位相当于(A)除以2; D0 D1 D2 D3 D4 D5 D6 D7 Cy 说明: (1)每次只移动一位;移一位相当于(A)除以2; (2)带进位位移动时,影响标志位Cy和P。

3.3.4 逻辑运算指令——逻辑操作指令 RLC A RLC A 例5:多字节二进制数除以2。 在二进制中,最高位补0右移一位,其结果为原数的1/2。 分解为2个单字节右移 RLC A RLC A 余数

3.3.4 逻辑运算指令——逻辑操作指令 例5:多字节二进制数除以2。 设二进制数存放在R5和R6中,结果仍存放在原处: MOV A, R5 ;高8位 CLR C RRC A MOV R5, A ;商的高8位 MOV A, R6 ;低8位 MOV R6, A ;商的低8位

3.3.4 逻辑运算指令—与操作指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (1) 以累加器A为目的操作数的与逻辑运算指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (1) 以累加器A为目的操作数的与逻辑运算指令 ANL A,#data ; (A)∧data (A) ANL A,Rn ; (A) ∧(Rn) (A) , n=0~7 ANL A,direct ; (A)∧(direct) (A) ANL A,@Ri; ; (A)∧[(Ri)] (A) , i=0,1 这4条指令执行时仅影响标志位P

3.3.4 逻辑运算指令—与操作指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (2)以某个单元为目的操作数的与逻辑运算指令 (二) 与逻辑操作指令 ANL 目的操作数,源操作数 (2)以某个单元为目的操作数的与逻辑运算指令 ANL direct,#data ;(direct)∧data (direct) ANL direct,A ;(direct)∧(A)  (direct) 指令执行时不会影响任何标志位 107

3.3.4 逻辑运算指令—与操作指令 用途:与逻辑操作指令用于实现屏蔽。 设某位数值为di = 0, 1,与运算法则如下: di ∧ 1 = di (保留) 屏蔽码 x D0 D1 D2 D3 D4 D5 D6 D7 1 单元

3.3.4 逻辑运算指令—与操作指令 例6: 设累加器A的内容为0CBH(11001011B),30H单元的内容为0AAH(10101010B),执行指令: ANL A,30H 累加器A的内容为多少? 1 D0 D1 D2 D3 D4 D5 D6 D7 A 30H 1 1 累加器A的内容为8AH

3.3.4 逻辑运算指令—或操作指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (1)以累加器A为目的操作数的或逻辑运算指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (1)以累加器A为目的操作数的或逻辑运算指令 ORL A,#data ;(A) ∨data (A) ORL A,Rn ;n = 0~7,(A) ∨(Rn)(A) ORL A,direct ; (A) ∨(direct) (A) ORL A,@Ri; ;i=0,1,(A) ∨[(Ri)] (A) 指令执行时仅影响标志位P

3.3.4 逻辑运算指令—或操作指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (2) 以某个单元为目的操作数的或逻辑运算指令 (三) 或逻辑运算指令 ORL 目的操作数,源操作数 (2) 以某个单元为目的操作数的或逻辑运算指令 ORL direct,#data ;(direct) ∨data(direct) ORL direct,A ;(direct)∨(A) (direct) 指令执行时不会影响任何标志位 111

3.3.4 逻辑运算指令—与操作指令 用途:或逻辑操作指令用于实现置位。 设某位数值为di = 0, 1,或运算法则如下: di ∨ 0 = di (保留) di ∨ 1 = 1(置位) 置位码 单元 x D0 D1 D2 D3 D4 D5 D6 D7 1

3.3.4 逻辑运算指令—与操作指令 例7:设累加器A的内容为0D5H,执行指令 ORL A,#0FH 累加器A的内容为 ? 1 D0 D1 D2 D3 D4 D5 D6 D7 A 码 1 1 累加器A的内容为0DFH 113

3.3.4 逻辑运算指令—异或操作指令 (四)异或逻辑运算指令 XRL 目的操作数,源操作数 (1)以累加器A为目的操作数的异或逻辑运算指令 XRL A,#data ;(A)data(A) XRL A,Rn ;n=0~7,(A)  (Rn) (A) XRL A,direct ;(A)  (direct) (A) XRL A,@Ri; ;i=0, 1,(A)  [(Ri)] (A) 指令执行时仅影响标志位P。

3.3.4 逻辑运算指令—异或操作指令 (四)异或逻辑运算指令 XRL 目的操作数,源操作数 (2)以某个单元为目的操作数的异或逻辑运算指令 XRL direct,#data ;(direct) data (direct) XRL direct,A ;(direct)  (A) (direct) 指令执行时不会影响任何标志位 115

3.3.4 逻辑运算指令—与操作指令 用途:异或逻辑操作指令用于实现取反。 设某位数值为di = 0, 1,异或运算法则如下: di  0 = di (保留) di  1 = di (取反) 取反码 单元 x D0 D1 D2 D3 D4 D5 D6 D7 1

3.3.4 逻辑运算指令—与操作指令 例8:累加器A的内容为0C3H(11000011B),寄存器R0的内容为0AAH,执行指令:XRL A, R0, 累加器A的内容为? 1 D0 D1 D2 D3 D4 D5 D6 D7 A R0 1 1 累加器A的内容为69H 117

3.3.4 逻辑运算指令—与操作指令 例9:一个负数的原码存放在30H单元,求其补码 。 原码: 原码: 反码: 反码: 补码: 补码: 1 x D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 原码: 原码:  1 1 x D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 反码: 反码: + 1 + 1 补码: 补码: y y 118

3.3.4 逻辑运算指令—与操作指令 MOV A, 30H 原码: XRL A, #7FH ADD A, #01H MOV 30H, A  1 1 x D0 D1 D2 D3 D4 D5 D6 D7 反码: + 1 补码: y

3.3.4 逻辑运算指令—与操作指令 例10:求16位二进制负数(双字节)的补码。 原码: 反码: 补码: 1 x 1 x  1 1 1 D0 D1 D2 D3 D4 D5 D6 D7 1 x D0 D1 D2 D3 D4 D5 D6 D7 原码:  1 1 反码: 1 x + 1 补码: y y

3.3.5 位操作指令 位操作指令包括位变量传送、逻辑运算、控制转移等指令,共17条。 适用范围:位地址空间 指令中,位地址的表示方法: (1)直接用位地址 如:D4H (2)用特殊功能寄存器名加位数 如:PSW.4 (3)用位名称 如:RS1 (4)用伪指令bit定义的有名字的位地址 如:SUB.REG bit RS1, FLAGRUN bit 02H

3.3.5 位操作指令—位数据传送指令 (1)位数据传送指令(2条) MOV C,bit ;(bit)(C) MOV bit,C ;(bit) ( C) 说明: 位与位之间的状态传送必须通过C来进行,2个位地址的位不能直接传送。 例:MOV C,TR0 MOV 08H,C

3.3.5 位操作指令—位修正指令 2、位修正指令(6条) ( 1)位清0 CLR C ; 0 (C) CLR bit ; 0  (bit) ( 2)位置1 SETB C ; 1 (C) SETB bit ; 1  (bit) ( 3)位取反 CPL C ; (/C) (C) CPL bit ; (/bit)  (bit) (C) (C)

3.3.5 位操作指令—位逻辑运算指令 3、位逻辑运算指令(4条) (1) 位逻辑与运算指令 ANL C,bit ; (C) ∧(bit)(C)  (C) (bit) ANL C,/bit ; (C)∧( / bit)  C  (C) (bit)

3.3.5 位操作指令—位逻辑运算指令 (2) 位逻辑或运算指令 ORL C,bit ; (C) ∨ (bit)(C) ≥1 (C) (bit) ORL C,/bit ; (C) ∨ ( / bit)  C ≥1 (C) (bit)

3.3.5 位操作指令 例1:采用位操作指令实现下列逻辑表达式。假设 U—P1.1,V—P1.2,W—P1.3,X—27H.1,Y—27H.0, Z—TF0,Q—P1.5,编制程序实现下列逻辑表达式:

3.3.5 位操作指令 MOV C, P1.2 ;取V ORL C, P1.3 ANL C, P1.1 MOV 20H.0, C ;暂存中间结果 MOV C, 27H.1 ;取X ANL C, /27H.0 CPL C ORL C, /TF0 ORL C, 20H.0 MOV P1.5 C ;输出

3.3.6 控制转移指令 CPU控制转移指令将改变程序的执行顺序,这类指令有以下几种: (1)无条件转移指令 (2)条件转移指令 (3)循环控制转移指令 (4)调用/返回指令 本节主要从编程角度出发,根据指令的功能介绍控制转移指令的使用方法。 128

3.3.6 控制转移指令—无条件转移 非正式MCS-51单片机指令 一、 无条件转移指令 这组指令相当于高级语言的 “GOTO 标号”语句, CPU在执行程序的过程中,碰到该类型指令将“无条件”地改变PC的内容,改变程序执行的流向。 AJMP addr11 LJMP addr16 SJMP rel JMP 标号 非正式MCS-51单片机指令 JMP LABEL 129

3.3.6 控制转移指令—无条件转移 (1) 转移指令 AJMP addr11 CPU的执行过程 ;(PC)+2 (PC) ;addr11  (PC)10~0 ,(PC15~11)不变 (1) 转移指令 AJMP addr11 转移范围:含有下一条指令首地址的同一个2KB范围,即高5位地址相同; 使用方式: AJMP LABEL 例1: AJMP NEXT

3.3.6 控制转移指令—无条件转移 (2)长转移指令 LJMP addr16 addr16  ( PC ) CPU的执行过程 addr16  ( PC ) (2)长转移指令 LJMP addr16 说明: 转移范围:64KB全程序空间任何单元 使用方式: LJMP LABEL 例2:长转移指令应用 … ; INC A ; …; LJMP LOOP1 ; 无条件转移到LOOP1执行程序 131

3.3.6 控制转移指令—无条件转移 (3)短转移指令(相对转移指令) SJMP rel (PC)+2  (PC), 对应rel值为:00H~7FH(0~+127)、80H~FFH( -128~ -1); CPU的执行过程 (PC)+2  (PC), (PC)+rel  (PC) 用法: SJMP LABEL 例3: SJMP NEXT 132

3.3.6 控制转移指令—无条件转移 (4)间接转移指令 JMP @A+DPTR ;(A)+(DPTR)  (PC) 说明: (1)具有多分支转移功能,即散转功能,又叫散转指令; (2)转移范围:是以DPTR为首地址的256B。 133

3.3.6 控制转移指令—无条件转移 例4: 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。 CLR C RLC A MOV DPTR,#JPTAB JMP @A+DPTR JPTAB: AJMP CCS0 AJMP CCS1 AJMP CCS2 : 134

3.3.6 控制转移指令—无条件转移 例4: 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。 CLR C MOV R2, A RLC A ADD A, R2 MOV DPTR,#JPTAB JMP @A+DPTR JPTAB: LJMP CCS0 LJMP CCS1 LJMP CCS2 : 135

条件转移指令相当于高级语言的“ IF 条件 THEN 标号” 3.3.6 控制转移指令—条件转移 二、 条件转移指令 条件转移指令相当于高级语言的“ IF 条件 THEN 标号” (一)以 累加器A内容为判别条件的转移指令 (1)判(A)为零转移 JZ rel ; (PC)+2(PC) 当(A)=0时,(PC)+rel(PC)转移; 当(A)≠0时,顺序执行。 (PC)+2 (PC) (A)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JZ LABEL (A)=0? 下一条指令 LABEL N Y 136

3.3.6 控制转移指令—条件转移 (2)判(A)不为零转移 JNZ rel ; (PC)+2(PC) 当(A) ≠ 0时,(PC)+rel(PC)转移; 当(A) = 0时,顺序执行。 (PC)+2 (PC) (A)0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNZ LABEL (A)  0? 下一条指令 LABEL Y N 137

3.3.6 控制转移指令—条件转移 程序设计时,JZ和JNZ指令建立判断条件的途径如下: (1)数据传送,累加器A作为目的操作数的指令。 (2)算术运算,加、减、乘、除指令。 (3)逻辑运算,与累加器A有关的与、或、异或指令。 (4)移位指令,与累加器A有关移位指令。

3.3.6 控制转移指令—条件转移 例5:设无符号数存放于20H单元,存放于21H单元,比较两个数、是否相等,若相等置标志位F0位1,否则,F0清0。 139

3.3.6 控制转移指令—条件转移 MOV A, 20H ;取x CLR C SUBB A, 21H ;x-y JZ EQU ;相等 CLR F0 ;不相等,清F0 RET ;返回 EQU: SETB F0 ;相等,F0置1

3.3.6 控制转移指令—比较转移 (二)比较转移指令 (1)累加器A与指定单元比较的转移指令 CJNE A,direct,rel ; (PC)+3(PC) ;若(A) > (direct),则(PC)+rel (PC),且0 (Cy); ;若(A) < (direct),则(PC)+rel  PC,且1  (Cy); ;若(A) = (direct),则顺序执行,且0  (Cy)。 (PC)+3 (PC) (A) (direct)? (A) > (direct), 0 (Cy) (A) < (direct),1 (Cy) (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: CJNE A,direct,LABEL (A) (direct)? (A) > (direct), 0 (Cy) (A) < (direct),1 (Cy) 下一条指令 LABEL Y N 141

3.3.6 控制转移指令—比较转移 (2)累加器A内容与常数比较的转移指令 CJNE A,#data,rel ; ;(PC)+3(PC) ;若(A) > #data ,则(PC)+rel(PC) ,且0(Cy); ;若(A) < #data ,则(PC)+rel(PC) ,且1(Cy); ;若(A) = #data ,则顺序执行,且0(Cy) 。 使用方式:CJNE A,#data,LABEL; 142

3.3.6 控制转移指令—比较转移 (3)工作寄存器内容与常数比较的转移指令 CJNE Rn,#data,rel ; ;(PC)+3(PC) ;若(Rn) >#data ,则(PC)+rel (PC) ,且0 (Cy); ;若(Rn) < #data ,则(PC)+rel (PC) ,且1 (Cy); ;若(Rn) = #data ,则顺序执行,且0 (Cy) 。 使用方式:CJNE Rn,#data,LABEL 143

3.3.6 控制转移指令—比较转移 (4)指定单元内容与常数比较的转移指令 CJNE @Ri,#data,rel ; ;(PC)+3(PC) ;若[(Ri)] >#data ,则(PC)+rel (PC) ,且0 (Cy); ;若[(Ri)] <#data ,则(PC)+rel (PC) ,且1 (Cy); ;若[(Ri)] =#data ,则顺序执行,且0 (Cy) 。 使用方式:CJNE @Ri,#data,LABEL 144

3.3.6 控制转移指令—比较转移 例6:比较两个数x、y是否相等,若相等置标志位F0位1,否则,F0清0。 MOV A, 20H CJNE A, 21H, NEQ SETB F0 RET NEQ: CLR F0 145

3.3.6 控制转移指令—比较转移 例7:从内部RAM的30H单元开始连续存储20个无符号8位二进制数。统计这组数据中00H的个数,结果存入60H单元。 146

3.3.6 控制转移指令—比较转移 MOV A, #20 ;数据长度 MOV 60H, #00H ;统计个数清0 MOV R0, #30H ;设置数据块首地址 NEXT: CJNE @R0, #00H, GOON;逐个比较 INC 60H ;统计00H的个数 GOON:INC R0 ;修改地址 DEC A ;数据长度减1 JNZ NEXT ;比较完否? RET 147

3.3.6 控制转移指令—比较转移指令 (三)以进位位Cy状态为判别条件的转移指令 (1)以Cy状态是1为判别条件的转移指令 JC rel ; (PC) +2 (PC) ; ;(Cy)=1,则(PC) +rel (PC) ; (Cy) =0,则顺序向下执行 (PC)+2 (PC) (Cy)=1? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JC LABEL (Cy) =1 下一条指令 LABEL Y N 148

3.3.6 控制转移指令—比较转移指令 (2)以Cy状态是0为判别条件的转移指令 JNC rel ; (PC) +2 (PC) ; ;(Cy)=0,则(PC) +rel (PC) ; (Cy) =1,则顺序向下执行 (PC)+2 (PC) (Cy)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNC LABEL (Cy) = 0? 下一条指令 LABEL Y N 149

3.3.6 控制转移指令—比较转移指令 在程序设计时,建立Cy判断条件的途径如下: (1)位传送;MOV C, bit。 (2)算术运算(加、减法指令);ADD/ADDC/SUBB。 (3)带进位移位的指令:RLC A;RRC A。 (4)位逻辑运算:与、或运算。

3.3.6 控制转移指令—比较转移指令 例8:比较两个数x、y的大小,将大数存放在MAX单元,若相等置标志位F0位1,否则,F0清0。 151

3.3.6 控制转移指令—比较转移指令 MOV A, 20H ;取x CLR C SUBB A, 21H ;减法 JZ EQU ;差为0,相等 CLR F0 ;不相等 JNC GRT ;没有借位,x大于y MOV MAX, 21H ;y大于x, RET ;返回 EQU: SETB F0 ;和相等 GRT: MOV MAX, 20H ;存大数 RET 152

3.3.6 控制转移指令—比较转移指令 MOV A, 20H ;取x CJNE A, 21H, NEQ ;比较 SETB F0 ;相等 MOV MAX, A ;存大数 RET ;返回 NEQ: CLR F0 ;不相等, F0清0 JC LESS ;(Cy)=1,y大于x MOV MAX, A ;存大数 RET LESS: MOV MAX, 21H ;y大于x 153

3.3.6 控制转移指令—比较转移指令 (四)以位状态为判别条件的转移指令 (1)以位状态为1作为判别条件 JB bit,rel ; ; (PC)+3 (PC)   ;若(bit)=1,则(PC)+rel (PC)  ;若(bit)=0,则顺序向下执行 (PC)+3 (PC) (bit)=1? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JB bit, LABEL (bit)=1? 下一条指令 LABEL Y N 154

3.3.6 控制转移指令—比较转移指令 (2)以位状态为0作为判别条件 JNB bit,rel ; (PC)+3 (PC) ;若(bit)=0,则(PC)+rel (PC) ;若(bit)=1,则顺序向下执行 (PC)+3 (PC) (bit)=0? (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JNB bit ,LABEL (bit)=0? 下一条指令 LABEL Y N 155

3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 1 按第一次 156

3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 1 按第二次 1 157

3.3.6 控制转移指令—比较转移指令 例9:利用标志位实现控制键的多重定义。 需要记忆电机的运行状态 1 按第三次 158

3.3.6 控制转移指令—比较转移指令 159

3.3.6 控制转移指令—比较转移指令 SETB P1.0 ;置P1.0为输入口 CLR P1.3 ;关电机 CLR 20H.7 ;电机为停机状态 NO_PRESS: JB P1.0, NO_PRESS; S按下? JNB 20H.7, ON;S按下,启动 CLR P1.3 ; (20H.7)=1,停机 CLR 20H.7 ;状态:停机 SJMP NO_PRESS ;等待S按 ON: SETB P1.3 ;启动电机, SETB 20H.7 ;状态:启动 SJMP NO_PRESS ;等待S按下 160

3.3.6 控制转移指令—比较转移指令 (3) 判断位值并清0 JBC bit,rel ; (PC)+3 (PC) ;若(bit)=1,则(PC)+rel (PC), (bit)=0 ;若(bit)=0,则顺序向下执行 (PC)+3 (PC) (bit)=1? (bit)=0 (PC)+rel (PC) 下一条指令 目标地址 CPU执行过程 Y N 用法: JBC bit, LABEL (bit)=1? 下一条指令 (bit)=0 Y N LABEL 161

3.3.6 控制转移指令—比较转移指令 例10: 已知累加器A的内容为56H (01010110B),执行下列指令序列:   JBC ACC.3, LABEL1   JBC ACC.2, LABEL2  程序将转移到LABEL2处,并且累加器A的内容变为52H (01010010B) 162

3.3.6 控制转移指令—循环控制转移 (五)循环控制转移指令 (1)以工作寄存器内容作为循环控制变量 DJNZ Rn,rel   (1)以工作寄存器内容作为循环控制变量 DJNZ Rn,rel ;(PC)+2(PC) ;(Rn)-1 (Rn); ;若(Rn)≠0, 则(PC)+rel (PC); ;若(Rn) = 0, 则结束循环, 顺序执行 CPU执行过程 (Rn)-1 (Rn) (Rn)0? (PC)+rel (PC) 下一条指令 目标地址 Y N (PC)+2 (PC) 用法:DJNZ Rn, LABEL (Rn)-1 (Rn) (Rn)0? 下一条指令 LABEL Y N 163

3.3.6 控制转移指令—循环控制转移 (2)以指定单元的内容作为循环控制变量 DJNZ direct,rel ; (PC)+3 (PC); ;(direct) -1  (direct) ; ;若(direct)≠0,则(PC)+rel (PC); ;若(direct) = 0,则结束循环, 顺序执行 用法:DJNZ direct, LABEL 例11: 把内部RAM从20H单元开始的20个单元清0。 164

3.3.6 控制转移指令—循环控制转移 例11: 把内部RAM从20H单元开始的20个单元清0。 MOV R0, #20H;数据区首地址 DO: MOV @R0, #00H ;清0 INC R0 ;修改地址指针 DJNZ R5, DO ;循环结束否? RET 165

3.3.6 控制转移指令—循环控制转移 例12:把外部数据RAM中的从ADDRESS_X单元开始存储的LEN个字节数据块传送到内部数据RAM。在内部RAM中数据块从BUFFER单元开始存放。

3.3.6 控制转移指令—循环控制转移 MOV DPTR, #ADDRESS_X;源首址 MOV R0, #BUFFER ;目首地址 MOV 20H, #LEN ;数据长度 TRANSFER: MOVX A, @DPTR;取数据 MOV @R0, A ;存数据 INC DPTR ;修改源地址指针 INC R0 ;修改目地址指针 DJNZ 20H, TRANSFER ;传送结束? RET ;返回

3.3.6 控制转移指令 三、子程序调用及返回指令 主程序调用子程序是通过调用指令实现的 主程序调用和子程序返回过程 主程序 子程序 SUB: 返回(RET) 主程序 MAIN: NEXT: DISP: CALL SUB 主程序调用和子程序返回过程 CALL SUB 返回(RET) 168

3.3.6 控制转移指令—调用指令 (一) 调用指令 (1) 长调用指令 LCALL addr16 ;(PC)+3  (PC) (一) 调用指令 (1) 长调用指令 LCALL addr16 ;(PC)+3  (PC) ;(SP)+1 (SP), (PC 0~7) [(SP)] ;(SP)+1 (SP), (PC 8~15) [(SP)] ;addr0~15 (PC) 说明:(1)该指令执行后PC值为下一条指令的首地址; (2)转移范围:整个程序存储空间,64KB范围。 用法: LCALL 子程序名 如:LCALL SUBJIA 169

3.3.6 控制转移指令—调用指令 (2)短调用指令 ACALL addr11 ;(PC)+2 (PC) ;(SP)+1  (SP), (PC 0~7) [(SP)] ;(SP)+1  (SP), (PC 8~15) [(SP)] ;addr0~10  (PC)0~10, (PC)11~15不变 说明: (1)该指令执行后PC值为下一条指令的首地址; (2)转移范围:含有下一条指令首地址的同一个2KB范围,即高5位地址相同。 用法: ACALL 子程序名 如:ACALL SUBJIA 170

3.3.6 控制转移指令—返回指令 (二)返回指令 在程序设计时,子程序的最后一条指令必须是RET,它标志子程序结束。 (1)子程序返回指令 ;[(SP)]  (PC) 8~15 , (SP)-1 (SP) ; [(SP)]  (PC) 0~7, ,(SP) -1 (SP) 用法: RET ;子程序最后一条指令 在程序设计时,子程序的最后一条指令必须是RET,它标志子程序结束。 171

3.3.6 控制转移指令—返回指令 172

3.3.6 控制转移指令—返回指令 单元地址 标号 机器码(H) 主程序 注释 2000H START : E5 30 MOV A,30H ; 30H单元内容送A 2002H 11 30 ACALL SUB1 调用子程序1 2004H 12 30 00 LCALL SUB2 调用子程序2 2007H 80 FE SJMP $ 暂停 … 子程序1 ; 2030H SUB1 : F4 CPL A A求反 22 RET 子程序返回 子程序2 3000H SUB2 : 23 RL A A左循环一位 173

3.3.6 控制转移指令—返回指令 例13:编写内部RAM多个单元清0的子程序,并把从 20H单元开始的20个单元清0。 (1) 子程序名:CLR_RAM (2)子程序入口条件:R0中存放待清0的内部RAM区首地址,R2中存放待清0的单元个数。 (3)出口条件:无。 (4)子程序功能:把从固定起始单元开始的多个单元清0。 CLR_RAM: MOV @R0, #00H ;单元内容清0 INC R0 ;修改地址指针 DJNZ R2, CLR_RAM ;结束否? RET 174

3.3.6 控制转移指令—返回指令 例13:编写内部RAM多个单元清0的子程序,并把从 20H单元开始的20个单元清0。 主程序: MOV R0, #20H ;设置数据区首地址 MOV R5, #20 ;单元个数 ACALL CLR_RAM RET 175

3.3.6 控制转移指令—返回指令 (2)中断返回指令 RETI ;(PC)+ 1  (PC) ; [(SP)]  (PC) 8~15 , (SP)-1 (SP) ; [(SP)]  (PC) 0~7, ,(SP) -1 (SP) ; 该指令用于中断服务程序中,每一个中断服务程序的最后一条指令必然是RETI指令。RETI指令与RET指令的区别在于RETI指令在实现中断返回的同时,告知CPU本次中断处理已经结束。 用法: RETI ;中断处理程序最后一条指令 176

3.3.6 控制转移指令——空操作指令 四 空操作指令 NOP ;(PC)+1 (PC) 四 空操作指令 NOP ;(PC)+1 (PC) 这是一条单字节指令。执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序。这条指令常用来产生一个机器周期的时间延迟。 177

3.3.6 控制转移指令——空操作指令 40×500µs=20000µs=20ms 50×5TM=50×10µs=500µs 例14: 一个能延时1秒钟的软件延时子程序。假设振荡 频率为6 MHz (机器周期TM为2µs) 。 20ms子程序: DL20MS: MOV R6, #40 ; DL1MS: MOV R5, #50 ; DL0: NOP ;TM NOP ;TM DJNZ R5, DL0 ;2TM DJNZ R6, DL1MS RET 40×500µs=20000µs=20ms 50×5TM=50×10µs=500µs 178

3.3.6 控制转移指令——空操作指令 例14: 一个能延时1秒钟的软件延时子程序。假设振荡 频率为6 MHz (机器周期TM为2µs) 。 DL1S: MOV R7, #50 ; DL1: ACALL DL20MS DJNZ R7, DL1 ;50×20ms=1000ms RET 179

本章内容结束! 谢谢大家! 180