第四章指令系统及汇编语言程序设计

上传人:m**** 文档编号:570064315 上传时间:2024-08-01 格式:PPT 页数:70 大小:2.91MB
返回 下载 相关 举报
第四章指令系统及汇编语言程序设计_第1页
第1页 / 共70页
第四章指令系统及汇编语言程序设计_第2页
第2页 / 共70页
第四章指令系统及汇编语言程序设计_第3页
第3页 / 共70页
第四章指令系统及汇编语言程序设计_第4页
第4页 / 共70页
第四章指令系统及汇编语言程序设计_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《第四章指令系统及汇编语言程序设计》由会员分享,可在线阅读,更多相关《第四章指令系统及汇编语言程序设计(70页珍藏版)》请在金锄头文库上搜索。

1、刘忠国:刘忠国:刘忠国:刘忠国:电话电话电话电话:18764171197:18764171197:18764171197:18764171197 微信号微信号微信号微信号: : : :jnliuzhgjnliuzhgjnliuzhgjnliuzhg山东大学生物医学工程山东大学生物医学工程山东大学生物医学工程山东大学生物医学工程微机原理与接口技术微机原理与接口技术第四章第四章 指令系统及汇编语言程序设计指令系统及汇编语言程序设计任课教师:刘忠国刘忠国山东大学课程中心网站: http:/ stc15系列单片机器件手册等 keil vision软件下载及指导手册(Helpvision Help) h

2、ttp:/ (2015/6/29更新)2第四章第四章 指令系统及汇编语言程序设计指令系统及汇编语言程序设计 本章学习目标本章学习目标了解助记符、指令格式了解助记符、指令格式掌握单片机寻址方式掌握单片机寻址方式 掌握单片机指令系统掌握单片机指令系统掌握单片机汇编语言程序设计及开发环境掌握单片机汇编语言程序设计及开发环境参考资料参考资料: keil Vision软件的帮助文件3*第四章第四章 指令系统及汇编语言程序设计语言指令系统及汇编语言程序设计语言4.1 编程语言简介编程语言简介 4.2 指令和伪指令指令和伪指令 4.3 汇编语言程序调试汇编语言程序调试4.4 利用利用STC-ISP工具将程序

3、下载到单片机中验证程序工具将程序下载到单片机中验证程序4.5各类指令详解各类指令详解4.5.1 数据传送类指令数据传送类指令4.5.2 逻辑操作类指令逻辑操作类指令4.5.3 算术运算类指令算术运算类指令4.5.4 位操作指令位操作指令4.5.5 控制类转移指令控制类转移指令4.6 汇编语言程序设计汇编语言程序设计4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架4.6.2 汇编语言程序设计举例汇编语言程序设计举例4*4.6 汇编语言程序设计汇编语言程序设计汇编语言程序设计的一般步骤是:汇编语言程序设计的一般步骤是:分析课题,确定算法或解题思路。分析课题,确定

4、算法或解题思路。根据算法或思路根据算法或思路画出流程图画出流程图。根据算法要求分配资源,包括内部根据算法要求分配资源,包括内部RAM、定时器、定时器、中断等资源的分配。中断等资源的分配。根据流程图编写程序根据流程图编写程序。上机调试源程序上机调试源程序,进而确定源程序。,进而确定源程序。 对复杂的程序可对复杂的程序可按功能分为不同的模块按功能分为不同的模块, 按模块功能按模块功能确定结构确定结构, 编写程序时应采用模块化的程序设计方法。编写程序时应采用模块化的程序设计方法。5*4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架4.6.1 汇编语言程序设计的一般

5、步骤和基本框架汇编语言程序设计的一般步骤和基本框架6*$INCLUDE (STC15.INC) ;下面是下面是汇编语言程序的框架汇编语言程序的框架 ;本语句包含本语句包含IAP15W4K58S4单片机寄存器定义头文件单片机寄存器定义头文件 ;-这里可以编写程序中用到的一些符号定义这里可以编写程序中用到的一些符号定义(使用使用EQU, DATA, BIT等伪指令等伪指令) ORG0000HSTART: LJMPMAIN ;跳转到主程序跳转到主程序 ORG0003H LJMPINT0_ISR ;外部中断外部中断0入口入口 ORG000BH LJMPT0_ISR ;定时器定时器0中断入口中断入口 O

6、RG0013H LJMPINT1_ISR ;外部中断外部中断1入口入口 ORG001BH LJMPT1_ISR ;定时器定时器1中断入口中断入口 ORG0023H LJMPUART1_ISR ;串口串口1中断入口中断入口COLUMN EQU 32H BUFFER DATA 40H4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架 ORG002BH LJMPADC_ISR ;ADC中断服务程序入口中断服务程序入口 ORG0033H LJMPLVD_ISR ;低电压检测中断服务程序入口低电压检测中断服务程序入口 ORG003BH LJMPPCA_ISR ;PCA中

7、断服务程序入口中断服务程序入口 ORG0043H LJMPUART2_ISR ;串口串口2中断服务程序入口中断服务程序入口 ORG004BH LJMPSPI_ISR ;SPI中断服务程序入口中断服务程序入口 7*4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架 ORG0053H LJMPINT2_ISR ;INT2中断服务程序入口中断服务程序入口 ORG005BH LJMPINT3_ISR ;INT3中断服务程序入口中断服务程序入口 ORG0063H LJMPT2_ISR ;定时器定时器2中断服务程序入口中断服务程序入口 ORG0083H LJMPINT4_

8、ISR ;INT4中断服务程序入口中断服务程序入口8*IAP15W4K58S4的以上中断与的以上中断与STC15F2K60S2的相同的相同 4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架9/198 ORG 008BHLJMP UART3_ISR ; UART3中断服务程序入口中断服务程序入口 ORG 0093HLJMP UART4_ISR ;UART4中断服务程序入口中断服务程序入口ORG 009BHLJMP T3_ISR ;T3中断服务程序入口中断服务程序入口ORG 00A3HLJMP T4_ISR ;T4中断服务程序入口中断服务程序入口ORG 00AB

9、HLJMP COMP_ISR ;比较器中断服务程序入口比较器中断服务程序入口ORG 00B3HLJMP PWM_ISR ;PWM中断服务程序入口中断服务程序入口ORG 00BBHLJMP PWMFD_ISR ;PWM异常检测异常检测(PWM Fault Detection)IAP15W4K58S4的以下中断对的以下中断对STC15F2K60S2不存在不存在4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架 ORG0100HMAIN: MOVSP, #70H ;设置堆栈指针(可根据实际情况进行修改)设置堆栈指针(可根据实际情况进行修改) ;初始化内存区域内容初始

10、化内存区域内容 ;设置有关特殊功能寄存器(设置有关特殊功能寄存器(SFR)的控制字)的控制字;根据需要开放相应的中断控制根据需要开放相应的中断控制MAINLOOP: ;主程序主程序循环循环 LJMP MAINLOOP10*(键盘扫描、数码管(键盘扫描、数码管-液晶刷新显示)液晶刷新显示)4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架;下面是各个中断服务子程序的入口下面是各个中断服务子程序的入口INT0_ISR: ;外部中断外部中断0服务子程序服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIINT1_ISR: ;外部中断外部中断1服务子程序

11、服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIT0_ISR: ;定时器定时器0中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIT1_ISR: ;定时器定时器1中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIUART1_ISR: ;串口串口1中断服务子程序中断服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETI11*4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架12*UART2_ISR:;串口串口2中断服务子程

12、序中断服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETIADC_ISR: ;ADC中断服务子程序中断服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETISPI_ISR:;SPI通信中断服务子程序通信中断服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETILVD_ISR:;低电压检测服务子程序低电压检测服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETIPCA_IS

13、R:;PCA和和PWM中断服务子程序中断服务子程序 ;根据需要填入适当内容根据需要填入适当内容(注意中断请求标志位清零注意中断请求标志位清零)RETI4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架INT2_ISR: ;INT2中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容 RETIINT3_ISR: ;INT3中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容 RETIT2_ISR: ;定时器定时器2中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容 RETIINT4_ISR

14、: ;INT4中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容 RETI; IAP15W4K58S4的以上中断服务程序同的以上中断服务程序同STC15F2K60S213*14/1984.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架T3_ISR: ;定时器定时器3中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIT4_ISR: ;定时器定时器4中断服务子程序中断服务子程序 ;根据需要填入适当的内容根据需要填入适当的内容RETIUART3_ISR: ;串口串口3中断服务子程序中断服务子程序 ;根据需要

15、填入适当的内容(注意中断请求标志位的清根据需要填入适当的内容(注意中断请求标志位的清0)RETIUART4_ISR: ;串口串口4中断服务子程序中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清根据需要填入适当的内容(注意中断请求标志位的清0)RETICOMP_ISR: ;比较器中断服务子程序比较器中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清根据需要填入适当的内容(注意中断请求标志位的清0)RETIPWM_ISR: ;PWM中断服务子程序中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清根据需要填入适当的内容(注意中断请求标志位的清0)RETIP

16、WMFD_ISR: ;PWM异常检测中断服务子程序异常检测中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清根据需要填入适当的内容(注意中断请求标志位的清0)RETI;下面可以编写其他子程序或者定义程序中所用的常数下面可以编写其他子程序或者定义程序中所用的常数 ENDIAP15W4K58S4的以的以下中断中断服务程序下中断中断服务程序对对STC15F2K60S2不不存在存在4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架注意:注意:由于地址由于地址0003H、000BH、0013H、001BH、0023H 、002BH、0033H、003BH、

17、0043H、004BH、0053H、005BH、0063H、0083H、0033H、008BH、0093H、009BH、00A3H、00ABH、00B3H和和00BBH是是专门为中断处理子程序分别预留的入专门为中断处理子程序分别预留的入口地址口地址,所以所以第一条指令第一条指令是一条是一条长跳转指令长跳转指令,跳到跳到避开上述中避开上述中断处理子程序入口地址的断处理子程序入口地址的0100H的地址的地址,主程序,主程序MAIN从这个地址开始存放;从这个地址开始存放;MAIN 语句前面的伪指令语句前面的伪指令“ORG 0100H”表示,以标号表示,以标号MAIN表示的主程序放在表示的主程序放在0

18、100H开始的区域,当然也可开始的区域,当然也可以是跳到能够避开上述入口地址的其他地址。以是跳到能够避开上述入口地址的其他地址。 15*4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架如果用户系统根本没有任何中断源,或者没有使用如果用户系统根本没有任何中断源,或者没有使用全部中断源,就可以不用或者少用中断的功能;全部中断源,就可以不用或者少用中断的功能;0003H到到00BBH的区域也就无须全部或部分用于中的区域也就无须全部或部分用于中断处理。没有任何中断的情况下,主程序甚至可以断处理。没有任何中断的情况下,主程序甚至可以从从0000H开始连续存放下去。开始

19、连续存放下去。主程序的末尾是一条长跳转指令主程序的末尾是一条长跳转指令,跳转到某个合适,跳转到某个合适的地方反复执行主程序。的地方反复执行主程序。一般的子程序不可形成死循环一般的子程序不可形成死循环,但是,但是作为整个主程作为整个主程序却应该是一个最大的死循环。序却应该是一个最大的死循环。无论执行哪个子程无论执行哪个子程序,之后都要回到主程序,反复循环运行。序,之后都要回到主程序,反复循环运行。 16*4.6.1 汇编语言程序设计的一般步骤和基本框架汇编语言程序设计的一般步骤和基本框架程序流程图程序流程图在程序编制以前,先根据系统方案绘制程序流程图在程序编制以前,先根据系统方案绘制程序流程图是

20、一个很好的方法。是一个很好的方法。程序流程图可以简洁清晰地程序流程图可以简洁清晰地将程序的分支走向标示将程序的分支走向标示清楚,清楚,尤其是在程序复杂,编写人员较多相互衔接尤其是在程序复杂,编写人员较多相互衔接容易出错的的情况下,利用流程图理顺各部分关系容易出错的的情况下,利用流程图理顺各部分关系显得尤为重要。显得尤为重要。17*画流程图有两个常用的结构:画流程图有两个常用的结构:顺序执行的矩形框顺序执行的矩形框和和条条件分支的菱形框件分支的菱形框。画流程图两结构:顺序执行矩形框和条件分支菱形框画流程图两结构:顺序执行矩形框和条件分支菱形框顺序执行顺序执行:某个局部功能或者顺序执行的语句使用:

21、某个局部功能或者顺序执行的语句使用矩形矩形方框方框表示,矩形方框内注明程序的功能,各方框之间用表示,矩形方框内注明程序的功能,各方框之间用箭头表示执行顺序,一目了然;箭头表示执行顺序,一目了然;条件分支条件分支: 遇到需要根据条件判断是否转移时遇到需要根据条件判断是否转移时,使用使用菱形菱形方框方框表示表示, 菱形框内注明分支条件菱形框内注明分支条件, 不同出口表明分支的不同出口表明分支的去向去向: 可以可以向后跳转向后跳转, 也可向前跳转。也可向前跳转。18*存储单元清零存储单元清零堆栈指针赋初值堆栈指针赋初值调用延时子程序调用延时子程序顺序结构顺序结构计数单元-1=0?退出循环退出循环YN

22、循环体循环体分支结构分支结构YN循环体循环体R0-1R0=0?分支结构另种画法分支结构另种画法例例: DJNZ R0, L1图4-47 典型循典型循环程序程序结构的流程构的流程图 程序流程图程序流程图循环程序设计循环程序设计当程序处理的对象当程序处理的对象具有重复性规律时,具有重复性规律时,可以使用循环程序可以使用循环程序设计。一个循环表设计。一个循环表示示重复执行一组指重复执行一组指令令(程序段程序段)。19*画流程图两结构:顺序执行矩形框和条件分支菱形框画流程图两结构:顺序执行矩形框和条件分支菱形框条件分支条件分支: 菱形框内注明分支条件菱形框内注明分支条件, 不同出口表明分支不同出口表明

23、分支的去向的去向: 可以向后跳转可以向后跳转, 也可也可向前跳转向前跳转。一般框图如下。一般框图如下所示所示:20*二分支结构二分支结构多分支结构多分支结构用用: CJNZ, JZ, J(N)C, J(N)B等等 4.6.2 典型汇编语言程序设计举例典型汇编语言程序设计举例1、分支程序设计分支程序设计2、查表程序设计查表程序设计3、循环程序设计循环程序设计4、定点数运算子程序设计定点数运算子程序设计5、数据排序程序设计数据排序程序设计6、代码转换程序设计代码转换程序设计21*1、分支程序设计、分支程序设计程序分支是通过条件转移指令实现程序分支是通过条件转移指令实现的,即根据条件进的,即根据条件

24、进行判断后决定程序的走向。条件满足则进行程序转移,行判断后决定程序的走向。条件满足则进行程序转移,不满足就顺序执行程序。不满足就顺序执行程序。通过条件判断实现单分支程序转移的指令有通过条件判断实现单分支程序转移的指令有JZ、JNZ、CJNE (4条条)和和DJNZ(2条条)等。等。以位状态为条以位状态为条件,进行程序分支的指令件,进行程序分支的指令JC、JNC、JB、JNB和和JBC等。等。22*1、分支程序设计、分支程序设计【例例4-10】编程实现下面的比较函数。设变量编程实现下面的比较函数。设变量x存放存放在在R0,求得的,求得的y 值存入值存入SIGN单元单元。23*解:可以利用比较转移

25、解:可以利用比较转移CJNE指令指令和进位位和进位位C状态控制状态控制转移(转移(JC指令指令)来实现三分支转移。)来实现三分支转移。【例例4-10】程序程序 SIGN EQU 50H ;求得的求得的y 值存入值存入SIGN单元单元ORG 0000HLJMP MAINORG 0100HMAIN: CJNE R0, #37, NOTEQ ;R0与与37比较比较, 不相等则转不相等则转NOTEQMOV SIGN, #00H ;若比较相等若比较相等,则则SIGN0LJMP ENDM ;转到程序结束转到程序结束NOTEQ:JC NEG ;两数不相等两数不相等, 若若R037则则C=1, 转转NEG处理

26、处理MOV SIGN,#01H ;R037时时,SIGN+1LJMP ENDM ;转到程序结束转到程序结束NEG:MOV SIGN, #0FFH ;R037时时, SIGN-1ENDM:NOPEND25*设变量设变量x值存放在值存放在R02、查表程序设计、查表程序设计查表法产生的背景查表法产生的背景参数的计算非常复杂;参数的计算非常复杂;公式计算法计算程序长,难于计算;公式计算法计算程序长,难于计算;需要耗费大量时间;需要耗费大量时间;非线性参数,无法用一般算术运算就可以计算出来,非线性参数,无法用一般算术运算就可以计算出来,如指数、对数、三角函数以及积分、微分等运算;如指数、对数、三角函数以

27、及积分、微分等运算;数学计算无法建立相应的数学模型。数学计算无法建立相应的数学模型。查表法定义查表法定义 就是把事先计算或测得的数据按一定顺序编制成表格就是把事先计算或测得的数据按一定顺序编制成表格,查表程序根据被测参数的值或中间结果查表程序根据被测参数的值或中间结果, 查出最终所需查出最终所需的结果。的结果。它具有程序简单它具有程序简单, 执行速度快等优点。执行速度快等优点。26*(用(用DB, DW伪指令)伪指令)2、查表程序设计、查表程序设计应用:应用:在键盘处理程序中,查找在键盘处理程序中,查找按键按键相应的命令处理子程相应的命令处理子程序的入口地址序的入口地址;在一些快速计算的场合,

28、根据在一些快速计算的场合,根据自变量的值自变量的值,从函数,从函数表上查找出相应的表上查找出相应的函数值函数值以及实现非线性修正、代以及实现非线性修正、代码转换等等。码转换等等。常用常用MOVC A,ADPTR查找程序存储器空间的查找程序存储器空间的代码或常数,每次传送一个字节。代码或常数,每次传送一个字节。举例举例: 在在LED显示程序中显示程序中, 获得获得LED数码管显示字模数码管显示字模;27*2、查表程序设计、查表程序设计28* 例如例如, 假如要显示的假如要显示的数据需放到累加器数据需放到累加器A中中, 采用共阳极采用共阳极LED显显示示, 则可采用下面查表法程序获得则可采用下面查

29、表法程序获得LED显示字模:显示字模: MOVDPTR, #SEGTAB;获得字模表的首地址获得字模表的首地址 MOVC A, A+DPTR;查表获得字模查表获得字模 MOVC P1, A ; 送出字模进行显示送出字模进行显示SEGTAB: DB 0C0H ;0的字模的字模 DB 0F9H ;1的字模的字模 DB 0A4H ;2的字模的字模 DB 0B0H ;3的字模的字模 DB 99H ;4的字模的字模 DB 92H ;5的字模的字模 DB 82H ;6的字模的字模 DB 0F8H ;7的字模的字模 DB 80H ;8的字模的字模 DB 90H ;9的字模的字模D7D6D5D4D3D2D1D

30、0h g fe d c b a1 1 0 0 0 0 0 01 1 1 1 1 0 0 1h gfed cb aA中存要显示的中存要显示的09的数字的数字如何转换如何转换?数字数字的的字模各位字模各位设设由由P1口口8条口线条口线P1.7P1.0输出要输出要显示的数据显示的数据P1.0P1.1P1.7P1.2P1.3P1.4P1.5P1.63、循环程序设计、循环程序设计29*延时程序是典型的循环程序延时程序是典型的循环程序。下下面面就就以以延延时时程程序序为为例例, 说说明明循环程序的设计方法。循环程序的设计方法。流程图如图所示。流程图如图所示。图图4-48 延时程序流程图延时程序流程图LOO

31、P: DJNZ R7, LOOP MOV R7, #218H 3、循环程序设计、循环程序设计简单延时子程序如下简单延时子程序如下(注释部分为指令的时钟周期数注释部分为指令的时钟周期数):DELAY100US : ;11.0592MHz PUSH 30H ;指令的时钟周期数指令的时钟周期数3T MOV 30H, #218 ;3TDLY_LOOP: DJNZ 30H, DLY_LOOP ; 5T ;30H(30H)-1, 若若(30H)0, 则转到则转到DLY_LOOP执行执行 POP 30H ;2T RET ;4T IAP15W4K58S4为为1T的的8051单片机单片机, 当系统时钟为当系统时

32、钟为11.0592MHz时时, 上述程序可延时约上述程序可延时约0.1ms。若需加长延。若需加长延时时间时时间, 可采用多重循环延时程序方法。可采用多重循环延时程序方法。30*R7R73、循环程序设计、循环程序设计创建延时程序最简单的方法是利用宏晶公司的下载工具创建延时程序最简单的方法是利用宏晶公司的下载工具STC-ISP的的“软件延时计算器软件延时计算器”获得延时程序代码获得延时程序代码, 如图如图4-49所示。上述延时所示。上述延时0.1ms的程序即可用此法得到。的程序即可用此法得到。在工具中选择在工具中选择“软件延时计算器软件延时计算器”标签页标签页, 设置系统频率,设置系统频率,定时长

33、度和定时长度和8051指令集指令集, 最后最后单击单击“生成生成ASM代码代码”按钮按钮即可生成延时子程序汇编代码。也可生成即可生成延时子程序汇编代码。也可生成C程序代码。程序代码。31*4、定点数运算子程序设计、定点数运算子程序设计多字节无符号加法子程序和减法子程序设计较简单,多字节无符号加法子程序和减法子程序设计较简单,在此介绍有代表性的多字节在此介绍有代表性的多字节BCD码减法码减法程序和多字程序和多字节乘法程序的设计。节乘法程序的设计。(1)多字节十进制)多字节十进制BCD码减法码减法因指令系统中只有因指令系统中只有十进制加法调整指令十进制加法调整指令DA A, 也即该也即该指令只有在

34、加法指令指令只有在加法指令(ADD、ADDC)后后, 才能得到正才能得到正确的结果。确的结果。为了用十进制加法调整指令对十进制减法进行调整,为了用十进制加法调整指令对十进制减法进行调整,必须采用补码相加的办法,用必须采用补码相加的办法,用9AH (100)减去减数即减去减数即得以得以10(100)为模的减数的补码为模的减数的补码。34*参考例参考例4-9GO(1)多字节十进制)多字节十进制BCD码减法码减法求求BCD码码8943H - 7649H=? 编程前由实例测算计算过程编程前由实例测算计算过程。先对低位字节运算先对低位字节运算43H - 49H: 1001 1010 模模9A-) 010

35、0 1001 减数减数49 0101 0001 得得49对对100补码补码51+)0100 0011 加被减数加被减数43 0 1001 0100 差差9435*再对高字节运算再对高字节运算89H -76H - C: 1001 1010 9A -) 0111 0110 76 0010 0100 得得76对对100补码为补码为24 -)0000 0001 减去借位位减去借位位C=1 0010 0011 减减借位借位1后的值为后的值为23+)1000 1001 加被减数加被减数89 1010 1100 结果结果0AC+) 0110 0110 对结果加对结果加66修正修正 10001 0010 差为

36、差为12 C=0无进位无进位, 表示二者相减有表示二者相减有借位借位。应对借位。应对借位C求反使求反使C=1。DA A 调整调整 高字节减数变补与高字节减数变补与被被减数减数相加调整后有进位相加调整后有进位1, 表示两者相减无借位表示两者相减无借位, 为正确反映借位情况为正确反映借位情况应对进位应对进位C求反求反使使C=0(减法时减法时C=1,表示有借位表示有借位; C=0, 表示无借位表示无借位)。最后结果为。最后结果为1294H, 且无借位且无借位, 计算正确。计算正确。43向高位借位与向高位借位与49相减的结果相减的结果应理解为应理解为以十六以十六进制形式表示制形式表示 后后C=0(1)

37、多字节十进制)多字节十进制BCD码减法码减法程序说明程序说明(减法运算减法运算化成化成100的补码加法运算的补码加法运算)程序中,程序中,减数求补后与被减数相加减数求补后与被减数相加,方可利用方可利用DA A指令进行调整指令进行调整; 若二者若二者相加调整相加调整(DA A)后结果无进位后结果无进位(C=0),实际上实际上表示表示二者相减有借位;二者相减有借位;若二者相加调整若二者相加调整(DA A)后有进位后有进位(C=1),实际上表示实际上表示二者相减没有借位二者相减没有借位(教材加文字教材加文字); 参考例参考例4-9因此因此, 都需对进位位都需对进位位C进行求反操作进行求反操作。36*

38、BCD码减法程序举例:采用补码相加的办法,用码减法程序举例:采用补码相加的办法,用9AH(100)减去减数即得以减去减数即得以10(100)为模的减数的补码为模的减数的补码。(1)多字节十进制)多字节十进制BCD码减法码减法 编程代码编程代码:38*R1: 被减数低字节被减数低字节地址地址; R2: 字节数字节数; R3: 差的差的字节数。字节数。 R0: 减数低字节减数低字节地址;地址;也是也是最后结果最后结果差差(BCD码码)的低字节地址的低字节地址07H位地址存最终结果符号位位地址存最终结果符号位。0表示结果为正表示结果为正,1表示结果为负表示结果为负。SUBCD: MOV R3, #0

39、0H ;差的字节数置差的字节数置0 CLR 07H ;符号位单元清符号位单元清0 CLR C ;下面用带进位减法指令下面用带进位减法指令SUBB, 借位位借位位C清清0SUBCD1: MOV A, #9AH SUBB A, R0 ;求求减数减数的的100的补码的补码 ADD A, R1 ;补码与补码与被减数被减数相加相加 DA A ;十进制加法调整指令十进制加法调整指令 MOV R0, A ;结果结果差差送到送到R0间接寻址单元间接寻址单元 INC R0 ;减数减数地址值增地址值增1, 指向高字节指向高字节 INC R1 ;被减数被减数地址值增地址值增1, 指向高字节指向高字节 INC R3

40、;差的差的字节数增字节数增1CPL C ;进位求反进位求反,以形成正确借位以形成正确借位DJNZ R2, SUBCD1 ;每字节减法算法相同每字节减法算法相同,未完循环未完循环, 减完顺序执行减完顺序执行, JNC SUBCD2 ;无借位去无借位去SUBCD2返主返主, 否则继续否则继续SETB 07H ;差为负置差为负置符号位符号位07H为为“1” SUBCD2: RET ;返回返回(2)多字节乘法运算子程序)多字节乘法运算子程序单片机指令系统中只有单字节乘法指令单片机指令系统中只有单字节乘法指令MUL AB, 而工而工程应用中常需程应用中常需8位乘位乘16位位、两个两个16位数相乘位数相乘

41、的运算。的运算。39*以两个以两个16位无符号数相乘位无符号数相乘为例说明多字节乘法程序设计。为例说明多字节乘法程序设计。设设被乘数被乘数放在放在R2、R3两单元两单元(高字节在前高字节在前), 乘数乘数放在放在R6、R7两单元两单元, 两个双字节无符号数相乘两个双字节无符号数相乘, 结果送结果送33H、32H、31H、30H。(R3R7)L表示表示R3R7的低的低8位位,(R3R7)H表示表示R3R7的高的高8位位,其余几项的含义类似。其余几项的含义类似。程序如下:程序如下:算法示意图如图所示。算法示意图如图所示。GO(2)多字节乘法运算子程序)多字节乘法运算子程序DMUL: MOV A,

42、R3MOV B, R7MUL AB ;R3R7MOV 30H, A ;(30H) (R3R7)LMOV 31H, B ;(31H) (R3R7)HMOV A, R2MOV B, R7MUL AB ;R2R7 ADD A, 31H ;(R3R7)H+(R2R7)LMOV 31H, ACLR AADDC A, B ;进位位进位位C与与(R2R7)H加加MOV 32H, A ;(32H) (R2R7)H40*(2)多字节乘法运算子程序)多字节乘法运算子程序MOV A, R3MOV B, R6MUL AB ;R3R6ADD A, 31HMOV 31H, AMOV A, BADDC A, 32H ;(R

43、2R7)H+(R3R6)HMOV 32H, AMOV F0, C ;暂存暂存Cy ;因下面乘法使因下面乘法使C清清0 ;也可也可CLR A, ADDC A, #0, MOV 33H, A;下面程序相应修改下面程序相应修改41*程序程序状态标志寄存器状态标志寄存器PSW 位号位号 D7 D6 D5 D4D3 D2 D1D0符号符号 CY AC F0 RS1 RS0OVF1 PF0: 用户标志位用户标志位(2)多字节乘法运算子程序)多字节乘法运算子程序42*MOV A, R2MOV B, R6MUL AB ;R2R6ADD A, 32HMOV 32H, ACLR AMOV ACC.0, C ;或或

44、 ADDC A, #0MOV C, F0 ;前次加法进位送前次加法进位送C, 为为ADDC加加(R2R6)H准备准备ADDC A, BMOV 33H, ARETMOV F0, C ;暂存暂存Cy程序程序状态标志寄存器状态标志寄存器PSW 位号位号 D7 D6 D5D4D3D2D1 D0符号符号 CY AC F0 RS1 RS0 OV F1PF0: 用户标志位用户标志位5、数据排序程序设计、数据排序程序设计数据排序是将数据块中的数据按升序或降序排列。下面数据排序是将数据块中的数据按升序或降序排列。下面以数据升序排序为例以数据升序排序为例, 说明数据排序程序设计方法。说明数据排序程序设计方法。数据

45、升序排列数据升序排列常采用常采用冒泡法冒泡法。冒泡法是一种相邻数据互。冒泡法是一种相邻数据互换的排列方法,同查找极大值方法一样,换的排列方法,同查找极大值方法一样,一次冒泡即找一次冒泡即找到数据块的极大值放到数据块最后到数据块的极大值放到数据块最后,43*例例, 将片内将片内RAM 30H37H中的数据从小到大升序排列中的数据从小到大升序排列。设设R6为循环次数计数器为循环次数计数器, R7为比较次数计数器为比较次数计数器。F0为冒泡过程中是否有数据交换的状态标志为冒泡过程中是否有数据交换的状态标志,F0=0表表示无交换发生,示无交换发生,F0=1表示有互换发生表示有互换发生,须继续循环。,须

46、继续循环。R0为指向为指向RAM单元的地址指针单元的地址指针初值为初值为30H。 再一次冒泡再一次冒泡,次大数排在倒数第二位置次大数排在倒数第二位置,多次冒泡实现升序排列。,多次冒泡实现升序排列。冒泡法数据排序程序流程图冒泡法数据排序程序流程图44*数据在数据在30H37H中中;R6为循环次数计数器为循环次数计数器R7为比较次数计数器为比较次数计数器;F0为数据交换状态标志为数据交换状态标志;R0地址指针地址指针.30H56H31H50H32H46H33H36H34H25H35H16H36H13H37H06H比较次数比较次数循环次数循环次数冒泡法数据排序程序冒泡法数据排序程序SORT: MOV

47、 R6,#07H ;循环次数送到循环次数送到R6GOON: CLR F0 ;交换标志清交换标志清0 MOV R0, #30H ;数据首址送数据首址送R0 MOV A, R6 MOV R7, A ;各次冒泡比较次数送各次冒泡比较次数送R7LOOP: MOV A, R0 ;取前数取前数 MOV 3BH, A ; 3BH单元单元存前数存前数 INC R0 MOV 3AH, R0 ;取后数取后数送送3AH单元单元 CLR C CJNE A, 3AH, EXCH LJMP NEXT45*A3AH时时清清C, A3AH 时时置置C冒泡法数据排序程序冒泡法数据排序程序EXCH: JC NEXT ;前数前数(

48、3BH)小于后数小于后数(3AH)不交换不交换 MOV R0, 3BH ;3BH单元内单元内前数前数存存后数地址后数地址 DEC R0 ; R0指向指向前数前数 MOV R0, 3AH ; 3AH单元后数单元后数存存前数地址前数地址 INC R0 ; R0指向后指向后数数地址地址 SETB F0 ;置交换标志位置交换标志位NEXT: DJNZ R7, LOOP ;未比较完未比较完, 进行下一次比较进行下一次比较 JNB F0, DONE ;一次也没交换一次也没交换, 说明已按顺序排列说明已按顺序排列 DJNZ R6, GOON ; 循环次数减循环次数减1, 不为不为0进进下一轮循环下一轮循环D

49、ONE: RET ;返回返回46*CJNE A, 3AH, EXCHLJMP NEXTA3AH清清C, A3AH置置C6、代码转换程序设计、代码转换程序设计在汇编语言程序设计中,数据输入在汇编语言程序设计中,数据输入/输出、输出、A/D、D/A转换等常采用转换等常采用BCD码,字符的存储用码,字符的存储用ASCII码,算术码,算术逻辑运算又采用二进制数。逻辑运算又采用二进制数。除了用硬件逻辑实现转换外,可采用除了用硬件逻辑实现转换外,可采用算法处理算法处理和和查表查表方法方法软件实现。软件实现。47*(1)4位二进制数转换为位二进制数转换为ASCII代码代码从从ASCII编码表可知,若编码表可

50、知,若4位二进制数小于位二进制数小于10,则此,则此二进制数加上二进制数加上30H即变为相应的即变为相应的ASCII码码,若大于,若大于10 (包括等于包括等于10, 是字符是字符ABCDEF),则应加,则应加37H。入口入口: 转换前转换前4位二进制数存位二进制数存R2。出口出口: 转换后的转换后的ASCII码存码存R2。41H A 42H B 43H C 44H D 45H E 46H F 37H+0AH=41H(1)4位二进制数转换为位二进制数转换为ASCII代码代码ASCB1: MOV A, R2 ANL A,#0FH;取出取出4位二进制数位二进制数 CJNE A, #0AH, NOT

51、A ;影响影响CY标志标志, 但是不改变但是不改变A中的值中的值NOTA: JC LOOP ;该数该数10去去LOOP ADD A, #07H ;否则加否则加37H(下面还加下面还加30H)LOOP: ADD A, #30H ;加加30H MOV R2, A ;转换之转换之ASCII码送码送R2中中 RET ;返回返回49*(3)BCD码转换为二进制码子程序码转换为二进制码子程序例例: 设设有用有用BCD码表示的码表示的4位十进制数分别存于位十进制数分别存于R1, R2中中, 其中其中R2存千位和百位数存千位和百位数, R1存拾位和个位数存拾位和个位数, 要把要把其转换成二进制码。其转换成二进

52、制码。解决思路解决思路:可用由高位到低位逐位检查:可用由高位到低位逐位检查BCD码的数值,码的数值,然后累加各然后累加各十进制位十进制位(乘权值乘权值)对应的二进制数对应的二进制数来实现。来实现。其中其中, 100003E8H, 100=0064H, 10=000AH (个位数的个位数的BCD码与二进制码相同)。码与二进制码相同)。50*入口入口: 待转换的待转换的BCD码存于码存于R1, R2中中, 分配如下:分配如下: 低位字节低位字节 : R1 ; 高位字节高位字节 : R2 出口出口: 结果存在结果存在20H, 21H单元中单元中, 其中其中20H存低字节存低字节, 21H存高字节存高

53、字节。R1十位数十位数个位数个位数R2千位数千位数百位数百位数(3)BCD码转换为二进制码子程序码转换为二进制码子程序BCDB11:MOV 20H, #00H MOV 21H, #00H ;存结果单元清存结果单元清0 MOV R3, #0E8H MOV R4, #03H ;1千的二进制数千的二进制数03E8H送送R3, R4 MOV A, R2 ANL A, #0F0H ;取千位数取千位数 SWAP A ;将千位数移至低四位将千位数移至低四位 JZ BRAN1 ;千位数为千位数为0则转则转BRAN1, 去处理百位数去处理百位数LOOP1: DEC A LCALL ADDT ;千位数不为千位数不

54、为0, 加千位数二进制权码加千位数二进制权码 ;千位数是千位数是n, 就加就加n次千位数次千位数二进制码二进制码03E8H JNZ LOOP1 ;本循环即实现千位数本循环即实现千位数n乘权值乘权值03E8H51*BRAN1:MOV R3, #64H ;下面实现百位数转二进制码下面实现百位数转二进制码 MOV R4, #00H ;百位数的二进制码百位数的二进制码64H送送R3, R4 MOV A, R2 ANL A, #0FH ;取百位数取百位数 JZ BRAN2 ;百位数是百位数是0转转BRAN2, 去处理十位数去处理十位数LOOP2: DEC A LCALL ADDT ;加百位数二进制权码加

55、百位数二进制权码 JNZ LOOP2 ;百位数是百位数是n, 就加就加n次次64H52*BRAN2: MOV R3, #0AH ;十位数权值十位数权值0AH送送R3, R4=00H MOV A, R1 ;下面实现十位数转二进制码下面实现十位数转二进制码 ANL A, #0F0H ;取十位数取十位数 SWAP A JZ BRAN3 ;十位数为十位数为0转转BRAN3, 去处理个位数去处理个位数LOOP3: DEC A LCALL ADDT ;十位数不为十位数不为0, 加十位数二进制权码加十位数二进制权码 JNZ LOOP3 ;十位数是十位数是n, 就加就加n次次0AH53*BRAN3: MOV

56、A, R1 ANL A, #0FH ;取个位数取个位数 MOV R3, A ;个位数个位数(权值是自身权值是自身)送送R3, R4=00H LCALL ADDT ;加个位数二进制码加个位数二进制码 RETADDT: PUSH PSWPUSH ACCCLR CMOV A, 20H ;20H(低低), 21H单元存累加的转换结果单元存累加的转换结果ADD A, R3 ;累加转换结果累加转换结果MOV 20H, AMOV A, 21HADDC A, R4MOV 21H, APOP ACCPOP PSWRET; R3, R4存存1千千(百百, 十十)的二进制的二进制数权值数权值03E8H(0064H,

57、 000AH)7、IAP15W4K58S4单片机双数据指针的使用单片机双数据指针的使用两个两个16位的数据指针:位的数据指针:DPTR0和和DPTR1。它们的逻。它们的逻辑地址相同,但是物理上是独立的。辑地址相同,但是物理上是独立的。功能:功能:利用这两个数据指针,可以方便地进行数据的利用这两个数据指针,可以方便地进行数据的迁移和拷贝。迁移和拷贝。使用方法使用方法:这两个数据指针在指令中只能以:这两个数据指针在指令中只能以DPTR的的形式出现,因此,在使用中,需进行切换。这种切换形式出现,因此,在使用中,需进行切换。这种切换是通过设置辅助寄存器是通过设置辅助寄存器AUXR1中的中的DPS位位实

58、现的。实现的。当当DPS选择位为选择位为0时时, 选择选择DPTR0;当当DPS选择位为选择位为1时时, 选择选择DPTR1。54*位号位号D7D6D5D4D3D2D1 D0位名称位名称 S1_S1 S1_S0 CCP_S0 CCP_S1SPI_S1 SPI_S0 0 DPSAUXR1各位定义:各位定义:7、IAP15W4K58S4单片机双数据指针的使用单片机双数据指针的使用DPS:DPTR寄存器选择位。寄存器选择位。0:选择:选择DPTR0; 1:选择:选择DPTR155*位号位号D7D6D5D4D3D2D1 D0位名称位名称 S1_S1 S1_S0 CCP_S0 CCP_S1SPI_S1

59、SPI_S0 0 DPS例例4-11编程实现将单片机内部扩展编程实现将单片机内部扩展RAM中中0000H000FH单元中内容传送到单元中内容传送到0040H004FH单元中。单元中。思路:思路:可以分别由可以分别由DPTR0和和DPTR1分别指向源数据地分别指向源数据地址和目的数据地址。址和目的数据地址。AUXR1各位定义各位定义7、IAP15W4K58S4单片机双数据指针的使用单片机双数据指针的使用编程如下:编程如下:AUXR1 DATA 0A2H ;定义定义辅助寄存器辅助寄存器AUXR1直接地址直接地址 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP,

60、#30H;设置堆栈指针设置堆栈指针 MOV R2, #10H;设置计数值设置计数值(传送的字节数传送的字节数16) ANL AUXR1, #0FEH;令令DPS.0=0,选择选择DPTR0 MOV DPTR, #0000H;置源数据地址指针置源数据地址指针DPTR0=0H ORL AUXR1, #01H;令令DPS.0=1,选择选择DPTR1 ;该句可用该句可用INC AUXR1代替代替(思考思考: 为何?为何?) MOV DPTR, #0040H ;置目的数据地址指针置目的数据地址指针DPTR1=40H56*或或$INCLUDE (STC15.INC); 包含包含STC15寄存器定义头文件寄

61、存器定义头文件7、IAP15W4K58S4单片机双数据指针的使用单片机双数据指针的使用LOOP: ANL AUXR1, #0FEH ;该句可用该句可用INC DEC AUXR1代替代替MOVX A, DPTR ; A (DPTR0) INC DPTR ;修正源数据地址指针修正源数据地址指针DPTR0+1 ORL AUXR1, #01H ;该句可用该句可用INC AUXR1INC AUXR1代替代替, , MOVX DPTR, A ; (DPTR1) A INC DPTR ;修正目的数据地址指针修正目的数据地址指针DPTR1+1 DJNZ R2, LOOP ;传送字节数传送字节数16没完没完,

62、继续循环传送继续循环传送 SJMP $ ;$表示本条语句地址表示本条语句地址, 本指令是死循环等待本指令是死循环等待 ;SJMP $ 相当于相当于HERE: SJMP HERE END57*选选DPTR1选选DPTR08、IAP15W4K58S4单片机数据单片机数据Flash(EEPROM)的使用的使用IAP15W4K58S4单片机片内集成单片机片内集成1KB的数据的数据Flash存储存储器器, 可作为可作为EEPROM使用使用, 用来保存程序的设置参数。用来保存程序的设置参数。61*【例例4-12】一个完整的数据一个完整的数据Flash操作实例。操作实例。$INCLUDE (STC15.IN

63、C) ;包含包含IAP15W4K58S4寄存器定义文件寄存器定义文件;定义定义ISP/IAP命令命令 ISP_IAP_BYTE_READ EQU 1H ;字节读字节读ISP_IAP_BYTE_PROGRAM EQU 2H ;字节编程字节编程ISP_IAP_SECTOR_ERASE EQU 3H ;扇区擦除扇区擦除;定义定义Flash操作等待时间及允许操作等待时间及允许IAP/ISP操作的常数操作的常数(设置设置IAP_CONTR)ENABLE_IAP EQU 82H ;系统工作时钟系统工作时钟20MHz时时DEBUG_DATA EQU 5AH ;EEPROM单元的测试值,如正确应等于该值单元的

64、测试值,如正确应等于该值START_ADDRESS EQU 0000H ;EEPROM测试起始地址测试起始地址GO例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例(续续) ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP, #70H ;堆栈指针指向堆栈指针指向 70H单元单元 LCALL Delay ;延时延时 ;下面程序读出下面程序读出EEPROM测试起始地址单元的内容测试起始地址单元的内容MAIN1: MOV DPTR, #START_ADDRESS ;将将EEPROM测试起始地址测试起始地址0H送送DPTR数据指针数据指针 LCAL

65、L Byte_Read ;调子程读数据经调子程读数据经IAP_DATA送入累加器送入累加器A MOV 40H, A ;将将EEPROM 的值送的值送40H 单元保存单元保存 CJNE A, #DEBUG_DATA, NOT_EQU_DEBUG_DATA ;若数据不正确若数据不正确(非非5AH),就跳转就跳转;数据正确数据正确(5AH)时时, 顺序执行顺序执行 LCALL Delay ;延时延时 SJMP $ ;数据正确数据正确, CPU在此无限循环执行此句在此无限循环执行此句62*例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例(续续)NOT_EQU_DEBUG_DATA:

66、 ;下面代码是当下面代码是当EEPROM里的数据错误时里的数据错误时, 需进行的处理程序需进行的处理程序 ;即将该即将该EEPROM所在的扇区整个擦除所在的扇区整个擦除,将正确的数据写入将正确的数据写入 LCALL Delay ;延时延时 MOV DPTR, #START_ADDRESS ;将将EEPROM测试起始地址测试起始地址0H送送DPTR数据指针数据指针 LCALL Sector_Erase ;调调擦除整个扇区子程序擦除整个扇区子程序 MOV DPTR, #START_ADDRESS ;将将EEPROM测试起始地址送测试起始地址送DPTR数据指针数据指针 MOV A, #DEBUG_D

67、ATA ;写入写入 EEPROM 数据数据 #DEBUG_DATA(5A) LCALL Byte_Program ;字节编程字节编程 SJMP $ ;字节编程后字节编程后,CPU在此无限循环执行此句在此无限循环执行此句63*例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例(续续) ;下面程序是读一字节下面程序是读一字节, 调用前需打开调用前需打开IAP功能功能, Byte_Read: ;入口入口: DPTR=字节地址字节地址, 返回返回: A=读出字节读出字节 MOV IAP_CONTR, #ENABLE_IAP ; IAP_CONTR82H, 打开打开IAP功能功能,设置

68、设置Flash操作等待时间操作等待时间 MOV IAP_CMD, #ISP_IAP_BYTE_READ ; IAP_CMD01H,设置为设置为IAP/ISP字节读模式命令字节读模式命令 MOV IAP_ADDRH, DPH ;设置目标单元地址的高设置目标单元地址的高8位地址位地址0H MOV IAP_ADDRL, DPL ;设置目标单元地址的低设置目标单元地址的低8位地址位地址0H MOV IAP_TRIG, #5AH ;先送先送5AH,再送再送A5H到到ISP/IAP触发寄存器触发寄存器 MOV IAP_TRIG, #0A5H ;送送A5H后后,ISP/IAP命令即被触发启动命令即被触发启动

69、 NOP MOV A, IAP_DATA ;读出数据在读出数据在IAP_DATA单元单元,送累加器送累加器A LCALL IAP_Disable ;关闭关闭IAP功能功能, 清相关特殊功能寄存器清相关特殊功能寄存器 RET 64*字节读操作也可用字节读操作也可用MOVC指令指令, 用用MOVC访问数据访问数据Flash存储器时存储器时, 其地址范围为其地址范围为F000HF3FFH。例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例(续续) ;下面程序是字节编程下面程序是字节编程, 调用前需打开调用前需打开IAP功能功能, Byte_Program: ;入口入口:DPTR=字

70、节地址字节地址, A=需写入的数据需写入的数据 MOV IAP_CONTR, #ENABLE_IAP ; IAP_CONTR82H, 打开打开IAP功能功能,设置设置Flash操作等待时间操作等待时间 MOV IAP_CMD, #ISP_IAP_BYTE_PROGRAM ; IAP_CMD02H, 设置为设置为IAP/ISP字节读模式命令字节读模式命令 MOV IAP_ADDRH, DPH ;设置目标单元地址的高设置目标单元地址的高8位地址位地址0H MOV IAP_ADDRL, DPL ;设置目标单元地址的低设置目标单元地址的低8位地址位地址0H MOV IAP_DATA, A ;要编程的数

71、据先送进要编程的数据先送进ISP_DATA寄存器寄存器 MOV IAP_TRIG, #5AH ;先送先送5AH,再送再送A5H到到ISP/IAP触发寄存器触发寄存器 MOV IAP_TRIG, #0A5H ;送完送完A5H后后,ISP/IAP命令即被触发启动命令即被触发启动 NOP LCALL IAP_Disable ;关闭关闭 IAP功能功能, 清相关特殊功能寄存器清相关特殊功能寄存器 RET 65*例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例(续续)Sector_Erase: ;下面程序擦除扇区下面程序擦除扇区, 入口入口: DPTR =扇区地址扇区地址 MOV I

72、AP_CONTR, #ENABLE_IAP;打开打开IAP功能功能,设置设置 等待时间等待时间 MOV IAP_CMD, #03H ;设置为设置为IAP/ISP扇区擦除模式命令扇区擦除模式命令 MOV IAP_ADDRH, DPH ;设置目标单元地址的高设置目标单元地址的高8位地址位地址 MOV IAP_ADDRL, DPL ;设置目标单元地址的低设置目标单元地址的低8位地址位地址 MOV IAP_TRIG, #5AH ;先送先送5AH,再送再送A5H到到ISP/IAP触发寄触发寄存器存器 MOV IAP_TRIG, #0A5H ;送送A5H 后后,ISP/IAP命令即被触发启动命令即被触发启

73、动 NOP LCALL IAP_Disable ;关闭关闭IAP功能功能, 清相关特殊功能寄存器清相关特殊功能寄存器 RET66*IAP_Disable: ;下面程序关闭下面程序关闭IAP功能功能, 清相关特殊功能寄存器清相关特殊功能寄存器 ;一次连续的一次连续的IAP操作完成之后建议关闭操作完成之后建议关闭IAP功能功能,不需每次都关不需每次都关 MOV IAP_CONTR, #0 ;关闭关闭 IAP 功能功能 MOV IAP_ADDRH, #0FFH ;送地址高字节单元送地址高字节单元,指向非指向非EEPROM区区 MOV IAP_ADDRL, #0FFH ;送地址低字节单元为送地址低字节

74、单元为FFH,防止误操作防止误操作 RET 例例4-12 一个完整的数据一个完整的数据Flash操作实例操作实例 (续续) ;- - 延时子程序延时子程序-Delay: CLR A MOV R0, A MOV R1, A MOV R2, #20H Delay_Loop: DJNZ R0, Delay_Loop DJNZ R1, Delay_Loop DJNZ R2, Delay_Loop RET END67*延时时间延时时间: 256*256*32(20H) *时钟周期时钟周期基本基本: 4-1; 4-2; 4-3; 4-4; 4-5; 4-6; 综合综合: 4-14;68*第第4 4章章 作

75、业作业习题习题4-14根据下列程序段回答问题根据下列程序段回答问题(1)至至(5) , 其中其中BUF1、BUF2均为字节存储区首址。均为字节存储区首址。MOV R0, #BUF1MOV R1, #BUF2MOV R2, #16LOOPA: MOV A, R0MOV R1, AINC R0INC R1DJNZ R2, LOOPA(1)该程序段完成了什么工作?)该程序段完成了什么工作?(2)若将指令)若将指令“MOV R2,#16”误写成误写成“MOV R2,#0”,循环体被执,循环体被执行多少次?行多少次?(3)若漏掉了)若漏掉了MOV R2, #16,循环体执行次数能确定吗循环体执行次数能确

76、定吗,为什么为什么?(4)若漏掉了指令)若漏掉了指令“INC R0”,程序运行结果如何?,程序运行结果如何?(5)若不小心将标号)若不小心将标号LOOPA上移了一行,即将标号标在了指令上移了一行,即将标号标在了指令“MOV R0,#16”这句指令上,程序运行情况如何?这句指令上,程序运行情况如何?答:答:(1)将以)将以BUF1为首址的为首址的16个字节内容对应存到以个字节内容对应存到以BUF2为首址的为首址的16个字节中。个字节中。(2)256次。次。(3)若程序其他部分中没有用到)若程序其他部分中没有用到R2,则能确定,因为,则能确定,因为R2初始化为初始化为0,则循环体执行次数为,则循环

77、体执行次数为256次;若程序其他次;若程序其他部分中有用到部分中有用到R2,则循环体执行次数不能确定。,则循环体执行次数不能确定。(4)以)以BUF2为首址的为首址的16个字节中都存放个字节中都存放BUF1的字节内的字节内容。容。(5)程序将形成死循环。)程序将形成死循环。69*MOV R0, #BUF1MOV R1, #BUF2MOV R2, #16LOOPA: MOV A, R0MOV R1, AINC R0INC R1DJNZ R2, LOOPA答答: (1) 将以将以BUF1为首址的为首址的16个字节内容对应存到以个字节内容对应存到以BUF2为首址的为首址的16个字节中。个字节中。 (2) 256次。次。 (3)若程序其他部分中没有用到若程序其他部分中没有用到R2,则能确定,因为,则能确定,因为R2初始化为初始化为0,则循环体执行次数为,则循环体执行次数为256次;若程序其他次;若程序其他部分中有用到部分中有用到R2,则循环体执行次数不能确定。,则循环体执行次数不能确定。(4)以以BUF2为首址的为首址的16个字节中都存放个字节中都存放BUF1的字节内容。的字节内容。(5)程序将形成死循环。程序将形成死循环。*习题习题4-1470

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号