版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 指令系统及汇编语言程序设计任课教师:刘忠国山东大学课程中心网站:/G2S/Template/View.aspx?action=view&courseType=0&courseId=5819宏晶官方网站:/ stc15系列单片机器件手册等 keil vision软件下载及指导手册(Helpvision Help) /STC15系列单片机器件手册-1473页 (2015/6/29更新)2第四章 指令系统及汇编语言程序设计 本章学习目标了解助记符、指令格式掌握单片机寻址方式 掌握单片机指令系统掌握单片机汇编语言程序设计及开发环境参考资料: keil Vision软件的帮助文件300:07:1
2、4第四章 指令系统及汇编语言程序设计语言4.1 编程语言简介 4.2 指令和伪指令 4.3 汇编语言程序调试4.4 利用STC-ISP工具将程序下载到单片机中验证程序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 汇编语言程序设计举例400:07:14作业4.6 汇编语言程序设计汇编语言程序设计的一般步骤是:分析课题,确定算法或解题思路。根据算法或思路画出流程图。分配资源: 内部RAM、定时器、中断等资源的分配。根据
3、流程图编写程序。上机调试源程序,进而确定源程序。对复杂的程序可按功能分为不同的模块, 按模块功能确定结构, 编写程序时应采用模块化的程序设计方法。500:07:144.6.1 汇编语言程序设计的一般步骤和基本框架4.6.1 汇编语言程序设计的一般步骤和基本框架600:07:14$INCLUDE (STC15.INC) ;自此以下是汇编语言程序的框架 ; 包含IAP15W4K58S4寄存器定义头文件 ;-这里可以编写程序中用到的一些符号定义(使用EQU, DATA, BIT等伪指令) ORG0000HSTART: LJMPMAIN ;跳转到主程序 ORG0003H LJMPINT0_ISR ;外
4、部中断0入口 ORG000BH LJMPT0_ISR ;定时器0中断入口 ORG0013H LJMPINT1_ISR ;外部中断1入口 ORG001BH LJMPT1_ISR ;定时器1中断入口 ORG0023H LJMPUART1_ISR ;串口1中断入口COLUMN EQU 32H BUFFER DATA 40H(例: P0 DATA 80H) ORG0100HMAIN: MOV SP, #70H ;设置堆栈指针 ;初始化内存区域内容MAINLOOP: ;主程序循环 LJMP MAINLOOP4.6.1 汇编语言程序设计的一般步骤和基本框架 ORG002BH LJMPADC_ISR ;AD
5、C中断服务程序入口 ORG0033H LJMPLVD_ISR ;低电压检测中断服务程序入口 ORG003BH LJMPPCA_ISR ;PCA中断服务程序入口 ORG0043H LJMPUART2_ISR ;串口2中断服务程序入口 ORG004BH LJMPSPI_ISR ;SPI中断服务程序入口 700:07:144.6.1 汇编语言程序设计的一般步骤和基本框架 ORG0053H LJMPINT2_ISR ;INT2中断服务程序入口 ORG005BH LJMPINT3_ISR ;INT3中断服务程序入口 ORG0063H LJMPT2_ISR ;定时器2中断服务程序入口 ORG0083H L
6、JMPINT4_ISR ;INT4中断服务程序入口800:07:14IAP15W4K58S4的以上中断与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 00ABHLJMP COMP_ISR ;比较器中断服务程序入口ORG 00B3HLJMP PWM_ISR ;PW
7、M中断服务程序入口ORG 00BBHLJMP PWMFD_ISR ;PWM异常检测(PWM Fault Detection)IAP15W4K58S4的以下中断对STC15F2K60S2不存在4.6.1 汇编语言程序设计的一般步骤和基本框架 ORG0100HMAIN: MOVSP, #70H ;设置堆栈指针(可根据实际情况进行修改) ;初始化内存区域内容 ;设置有关特殊功能寄存器(SFR)的控制字;根据需要开放相应的中断控制MAINLOOP: ;主程序循环 LJMP MAINLOOP1000:07:14(键盘扫描、数码管-液晶刷新显示)4.6.1 汇编语言程序设计的一般步骤和基本框架;下面是各个
8、中断服务子程序的入口INT0_ISR: ;外部中断0服务子程序 ;根据需要填入适当的内容RETIINT1_ISR: ;外部中断1服务子程序 ;根据需要填入适当的内容RETIT0_ISR: ;定时器0中断服务子程序 ;根据需要填入适当的内容RETIT1_ISR: ;定时器1中断服务子程序 ;根据需要填入适当的内容RETIUART1_ISR: ;串口1中断服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零)RETI1100:07:144.6.1 汇编语言程序设计的一般步骤和基本框架1200:07:14UART2_ISR:;串口2中断服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零
9、)RETIADC_ISR: ;ADC中断服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零)RETISPI_ISR:;SPI通信中断服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零)RETILVD_ISR:;低电压检测服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零)RETIPCA_ISR:;PCA和PWM中断服务子程序 ;根据需要填入适当内容(注意中断请求标志位清零)RETI4.6.1 汇编语言程序设计的一般步骤和基本框架INT2_ISR: ;INT2中断服务子程序 ;根据需要填入适当的内容 RETIINT3_ISR: ;INT3中断服务子程序 ;根据需要填入适当
10、的内容 RETIT2_ISR: ;定时器2中断服务子程序 ;根据需要填入适当的内容 RETIINT4_ISR: ;INT4中断服务子程序 ;根据需要填入适当的内容 RETI; IAP15W4K58S4的以上中断服务程序同STC15F2K60S21300:07:1414/1984.6.1 汇编语言程序设计的一般步骤和基本框架T3_ISR: ;定时器3中断服务子程序 ;根据需要填入适当的内容RETIT4_ISR: ;定时器4中断服务子程序 ;根据需要填入适当的内容RETIUART3_ISR: ;串口3中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清0)RETIUART4_ISR:
11、;串口4中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清0)RETICOMP_ISR: ;比较器中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清0)RETIPWM_ISR: ;PWM中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清0)RETIPWMFD_ISR: ;PWM异常检测中断服务子程序 ;根据需要填入适当的内容(注意中断请求标志位的清0)RETI;这里可以编写其他子程序或者定义程序中所用的常数 ENDIAP15W4K58S4的以下中断中断服务程序对STC15F2K60S2不存在4.6.1 汇编语言程序设计的一般步骤和基本框架注意: 由于地
12、址0003H、000BH、0013H、001BH、0023H 、002BH、0033H、003BH、0043H、004BH、0053H、005BH、0063H、0083H、008BH、0093H、009BH、00A3H、00ABH、00B3H和00BBH是专为中断处理子程预留的入口地址,所以第一条指令是一条长跳转指令, 避开上述中断矢量表, 跳到0100H地址, 主程序MAIN从这个地址开始;1500:07:14 ORG 0000HSTART: LJMP MAIN ;跳转到主程序 ; 中断服务程序入口地址(中断矢量表) ORG 0100HMAIN: MOV SP, #70H ;初始化内存区域内
13、容4.6.1 汇编语言程序设计的一般步骤和基本框架主程序的末尾是一条长跳转指令,跳转到某个合适的地方反复执行主程序。一般的子程序不可形成死循环,但是作为整个主程序却应该是一个最大的死循环。无论执行哪个子程序,之后都要回到主程序,反复循环运行。 1600:07:14 ORG0100HMAIN: MOVSP, #70H MAINLOOP: ;主程序循环 LJMP MAINLOOP4.6.1 汇编语言程序设计的一般步骤和基本框架程序流程图编程之前,根据系统方案绘制程序流程图是一个好方法。程序流程图可简洁地将程序的分支走向标示清楚,尤其是在程序复杂,分工编写时,利用流程图理顺各部分关系显得尤为重要。1
14、700:07:14画流程图有两个常用的结构:顺序执行的矩形框和条件分支的菱形框。流程图的两种结构:顺序执行:顺序执行的语句使用矩形方框表示,矩形框内注明程序的功能, 各方框之间用箭头表示执行顺序;条件分支: 需要根据条件判断是否转移时,使用菱形方框表示, 菱形框内注明分支条件, 不同出口表明分支的去向。1800:07:14存储单元清零堆栈指针赋初值调用延时子程序顺序结构计数单元-1=0?退出循环YN循环体分支结构YN循环体R0-1R0=0?分支结构另种画法例: DJNZ R0, L1流程图的两种结构:条件分支: 一般框图如下所示:1900:07:14二分支结构多分支结构条件指令有CJNZ, J
15、Z, J(N)C, J(N)B 等 图4-47 典型循环程序结构的流程图 程序流程图循环程序设计当程序处理的对象具有重复性规律时,可以使用循环程序设计。2000:07:144.6.2 典型汇编语言程序设计举例1、分支程序设计2、循环程序设计3、查表程序设计4、定点数运算子程序设计5、数据排序程序设计6、代码转换程序设计2100:07:14作业1、分支程序设计程序分支是通过条件转移指令实现的,即根据条件进行判断后决定程序的走向。条件满足则进行程序转移,不满足就顺序执行程序。通过条件判断实现单分支程序转移的指令有JZ、JNZ、CJNE (4条)和DJNZ(2条)等。以位状态为条件,进行程序分支的指
16、令JC、JNC、JB、JNB和JBC等。2200:07:141、分支程序设计【例4-10】编程实现下面的比较函数。设变量x存放在R0,求得的y 值存入SIGN单元。2300:07:14解:可以利用比较转移CJNE指令和进位位C状态控制转移(JC指令)来实现三分支转移。2)比较转移指令(4条)CJNE (目的字节), (源字节),rel2400:07:14比较转移指令有4条:CJNE A, #data8,rel CJNE A, addr8,relCJNE Ri, #data8, relCJNE Rn, #data8, rel 该指令比较前面两个操作数的大小,如果它们的值不相等则转移,相等则继续执
17、行。三字节指令,PC当前值(PC3 PC)与指令第三字节带符号的偏移量相加即得到转移地址。对进位位CY有影响: 如果目的字节的无符号整数值小于源字节的无符号整数值,则置位进位标志,否则清“0”进位位,指令不影响任何一个操作数。机器码:B8BF【例4-10】程序 SIGN EQU 50H ;求得的y 值存入SIGN单元ORG0000HLJMPMAINORG 0100HMAIN: CJNE R0, #37, NOTEQ ;R0与37比较, 不相等则转NOTEQMOV SIGN, #00H ;若比较相等,则SIGN0LJMP ENDM ;转到程序结束NOTEQ:JC NEG ;两数不相等, 若R03
18、7则C=1, 转NEG处理MOV SIGN,#01H ;R037时,SIGN+1LJMP ENDM ;转到程序结束NEG:MOV SIGN, #0FFH ;R037时, SIGN-1ENDM:NOPEND2500:07:14设变量x值存放在R02、循环程序设计2600:07:14延时程序是典型的循环程序。下面就以延时程序为例, 说明循环程序的设计方法。流程图如图所示。图4-48 延时程序流程图LOOP: DJNZ R7, LOOP MOV R7, #218 可把 R7换成一个存储单元30H2、循环程序设计简单延时子程序如下(注释部分为指令的时钟周期数):DELAY100US : ;11.059
19、2MHz 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的单片机, 当时钟为11.0592MHz时, 上述程序可延时约0.1ms。2700:07:14R7R72、循环程序设计创建延时程序最简单的方法是利用下载工具STC-ISP的“软件延时计算器”获得延时程序代码, 如图4-49所示。在工具中选择“软件延时计算器”标签页, 设置系统频率,定时长度和8051指令
20、集, 单击“生成ASM代码”按钮即可生成延时子程序汇编代码。也可生成C程序代码。2800:07:14作业3、查表程序设计查表法产生的背景:参数的计算非常复杂;公式计算法计算程序长,难于计算;非线性参数,无法用一般算术运算就可以计算出来,如指数、对数、三角函数以及积分、微分等运算;查表法定义 把事先计算或测得的数据按一定顺序编制成表格,查表程序根据被测参数的值或中间结果, 查出最终所需结果。2900:07:14(用DB, DW伪指令)3、查表程序设计应用:在一些快速计算的场合,根据自变量的值,从表格上查找相应的函数值(正弦值) 、代码转换值等。常用MOVC A,ADPTR查找程序存储器空间的表格
21、数据。举例: 在LED显示程序中, 获得LED数码管显示字模;3000:07:143、查表程序设计3100:07:14 假如要显示的数据需放到累加器A中, 采用共阳极LED显示, 则可采用下面查表法程序获得LED显示字模: MOVDPTR, #SEGTAB;获得字模表的首地址 MOVC A, A+DPTR;查表获得字模 MOV P1, A ; 送出字模进行显示SEGTAB: DB 0C0H ;0的字模 DB0F9H ;1的字模 DB0A4H ;2的字模 DB0B0H ;3的字模 DB99H ;4的字模 DB92H ;5的字模 DB82H ;6的字模 DB0F8H ;7的字模 DB80H ;8的
22、字模 DB90H ;9的字模D7D6D5D4D3D2D1D0hgfedcba1100000011111001hgfedcbaA中存要显示的09的数字如何转换?数字的字模各位设由P1口8条口线P1.7P1.0输出要显示的数据P1.0P1.1P1.7P1.2P1.3P1.4P1.5P1.6作业4、定点数运算子程序设计多字节无符号加法子程序和减法子程序设计较简单,在此介绍有代表性的多字节BCD码减法程序和多字节乘法程序的设计。(1)多字节十进制BCD码减法因指令系统中只有十进制加法调整指令DA A, 也即该指令只有在加法指令(ADD、ADDC)后, 才能得到正确的结果。为了用十进制加法调整指令对十进
23、制减法进行调整,必须采用补码相加的办法,用9AH (100)减去减数即得以10(100)为模的减数的补码。3200:07:14参考例4-9GO(1)多字节十进制BCD码减法求BCD码8943H - 7649H=? 编程前由实例测算计算过程。先对低位字节运算43H - 49H: 1001 1010 模9A-) 0100 1001 减数49 0101 0001 得49对100补码51+)0100 0011 加被减数43 0 1001 0100 差943300:07:14再对高字节运算89H -76H - C: 1001 1010 9A -) 0111 0110 76 0010 0100 得76对1
24、00补码为24 -)0000 0001 减去借位位C=1 0010 0011 减借位1后的值为23+)1000 1001 加被减数89 1010 1100 结果0AC+) 0110 0110 对结果加66修正 10001 0010 差为12 C=0无进位, 表示二者相减有借位。应对借位C求反使C=1。DA A 调整 高字节减数变补与被减数相加调整后有进位1, 表示两者相减无借位, 为正确反映借位情况应对进位C求反使C=0(减法时C=1,表示有借位; C=0, 表示无借位)。最后结果为1294H, 且无借位, 计算正确。43向高位借位与49相减的结果应理解为以十六进制形式表示 后C=0(1)多字
25、节十进制BCD码减法程序说明(减法运算化成100的补码加法运算)程序中,减数求补后与被减数相加,方可利用DA A指令进行调整; 若二者相加调整(DA A)后结果无进位(C=0),实际上表示二者相减有借位;若二者相加调整(DA A)后有进位(C=1),实际上表示二者相减没有借位(教材加文字); 参考例4-9因此, 都需对进位位C进行求反操作。3400:07:14BCD码减法程序举例:采用补码相加的办法,用9AH(100)减去减数即得以10(100)为模的减数的补码。(1)多字节十进制BCD码减法入口:被减数低字节地址存放于R1,减数低字节地址存放于R0,字节数存放于R2。出口:差 (补码) 的低
26、字节地址存放于R0,字节数存放于R3。 07H为符号位。0表示结果为正,1表示结果为负。3500:07:14多字节十进制BCD码在RAM中存放地址:(1)多字节十进制BCD码减法 编程代码:3600:07:14R1: 被减数低字节地址; R2: 字节数; R3: 差的字节数。 R0: 减数低字节地址;也是最后结果差(BCD码)的低字节地址07H位地址存最终结果符号位。0表示结果为正,1表示结果为负。SUBCD: MOV R3, #00H ;差的字节数置0 CLR 07H ;符号位单元清0 CLR C ;下面用带进位减法指令SUBB, 借位位C清0SUBCD1: MOV A, #9AH SUBB
27、 A, R0 ;求减数的100的补码 ADD A, R1 ;补码与被减数相加 DA A ;十进制加法调整指令 MOV R0, A ;结果差送到R0间接寻址单元 INC R0 ;减数地址值增1, 指向高字节 INC R1 ;被减数地址值增1, 指向高字节 INC R3 ;差的字节数增1CPL C ;进位求反,以形成正确借位DJNZ R2, SUBCD1 ;每字节减法算法相同,未完循环, 减完顺序执行, JNC SUBCD2 ;无借位去SUBCD2返主, 否则继续SETB 07H ;差为负置符号位07H为“1” SUBCD2: RET ;返回(2)多字节乘法运算子程序单片机指令系统中只有单字节乘法
28、指令MUL AB, 而工程应用中常需8位乘16位、两个16位数相乘的运算。3700:07:14以两个16位无符号数相乘为例说明多字节乘法程序设计。设被乘数放在R2、R3两单元(高字节在前), 乘数放在R6、R7两单元, 两个双字节无符号数相乘, 结果送33H、32H、31H、30H。(R3R7)L表示R3R7的低8位,(R3R7)H表示R3R7的高8位,其余几项的含义类似。程序如下:算法示意图如图所示。GO(2)多字节乘法运算子程序DMUL: MOV A, R3MOV B, R7MUL AB ;R3R7MOV 30H, A ;(30H) (R3R7)LMOV 31H, B ;(31H) (R3
29、R7)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)H3800:07:14(2)多字节乘法运算子程序MOV A, R3MOV B, R6MUL AB ;R3R6ADD A, 31HMOV 31H, AMOV A, BADDC A, 32H ;(R2R7)H+(R3R6)HMOV 32H, AMOV F0, C ;暂存Cy ;因下面乘法使C清0 ;也可CLR A, ADDC A, #0, MOV 33
30、H, A;下面程序相应修改3900:07:14程序状态标志寄存器PSW 位号D7D6D5D4D3D2D1D0符号CYACF0RS1RS0OVF1PF0: 用户标志位(2)多字节乘法运算子程序4000:07:14MOV A, R2MOV B, R6MUL AB ;R2R6ADD A, 32HMOV 32H, ACLR AMOV ACC.0, C ;或 ADDC A, #0MOV C, F0 ;前次加法进位送C, 为ADDC加(R2R6)H准备ADDC A, BMOV 33H, ARETMOV F0, C ;暂存Cy程序状态标志寄存器PSW 位号D7D6D5D4D3D2D1D0符号CYACF0RS
31、1RS0OVF1PF0: 用户标志位5、数据排序程序设计数据排序是将数据块中的数据按升序或降序排列。下面以数据升序排序为例, 说明数据排序程序设计方法。数据升序排列常采用冒泡法。冒泡法是一种相邻数据互换的排列方法,同查找极大值方法一样,一次冒泡即找到数据块的极大值放到数据块最后,4100:07:14例, 将片内RAM 30H37H中的数据从小到大升序排列。设R6为循环次数计数器, R7为比较次数计数器。F0为冒泡过程中是否有数据交换的状态标志,F0=0表示无交换发生,F0=1表示有互换发生,须继续循环。R0为指向RAM单元的地址指针初值为30H。 再一次冒泡,次大数排在倒数第二位置,多次冒泡实
32、现升序排列。冒泡法数据排序程序流程图4200:07:14数据在30H37H中;R6为循环次数计数器R7为比较次数计数器;F0为数据交换状态标志;R0地址指针.30H56H31H50H32H46H33H36H34H25H35H16H36H13H37H06H比较次数循环次数冒泡法数据排序程序SORT: MOV 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
33、3AH, R0 ;取后数送3AH单元 CLR C CJNE A, 3AH, EXCH LJMP NEXT4300:07:14A3AH时清C, A3AH 时置C冒泡法数据排序程序EXCH: JC NEXT ;前数(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,
34、 GOON ; 循环次数减1, 不为0进下一轮循环DONE: RET ;返回4400:07:14CJNE A, 3AH, EXCHLJMP NEXTA3AH清C, A3AH置C6、代码转换程序设计在汇编语言程序设计中,数据输入/输出、A/D、D/A转换等常采用BCD码,字符的存储用ASCII码,算术逻辑运算又采用二进制数。除了用硬件逻辑实现转换外,可采用算法处理和查表方法软件实现。4500:07:14(1)4位二进制数转换为ASCII代码从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变为相应的ASCII码,若大于10 (包括等于10, 是字符ABCDEF),则应加37
35、H。入口: 转换前4位二进制数存R2。出口: 转换后的ASCII码存R2。41H A 42H B 43H C 44H D 45H E 46H F 37H+0AH=41HASCII字码表4600:07:14(1)4位二进制数转换为ASCII代码ASCB1: MOV A, R2 ANL A,#0FH;取出4位二进制数 CJNE A, #0AH, NOTA ;影响CY标志, 但是不改变A中的值NOTA: JC LOOP ;该数10去LOOP ADD A, #07H ;否则加37H(下面还加30H)LOOP: ADD A, #30H ;加30H MOV R2, A ;转换之ASCII码送R2中 RET
36、 ;返回4700:07:14(3)BCD码转换为二进制码子程序例: 设有用BCD码表示的4位十进制数分别存于R1, R2中, 其中R2存千位和百位数, R1存拾位和个位数, 要把其转换成二进制码。解决思路:可用由高位到低位逐位检查BCD码的数值,然后累加各十进制位(乘权值)对应的二进制数来实现。其中, 100003E8H, 100=0064H, 10=000AH (个位数的BCD码与二进制码相同)。4800:07:14入口: 待转换的BCD码存于R1, R2中, 分配如下: 低位字节 : R1 ; 高位字节 : R2 出口: 结果存在20H, 21H单元中, 其中20H存低字节, 21H存高字
37、节。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 ;千位数不为0, 加千位数二进制权码 ;千位数是n, 就加n次千位数二进制码03E8H JNZ LOOP1 ;本循环即实现千位数n乘权值03E8
38、H4900:07:14BRAN1:MOV R3, #64H ;下面实现百位数转二进制码 MOV R4, #00H ;百位数的二进制码64H送R3, R4 MOV A, R2 ANL A, #0FH ;取百位数 JZ BRAN2 ;百位数是0转BRAN2, 去处理十位数LOOP2: DEC A LCALL ADDT ;加百位数二进制权码 JNZ LOOP2 ;百位数是n, 就加n次64H5000:07:14BRAN2: MOV R3, #0AH ;十位数权值0AH送R3, R4=00H MOV A, R1 ;下面实现十位数转二进制码 ANL A, #0F0H ;取十位数 SWAPA JZ BRA
39、N3 ;十位数为0转BRAN3, 去处理个位数LOOP3: DEC A LCALL ADDT ;十位数不为0, 加十位数二进制权码 JNZ LOOP3 ;十位数是n, 就加n次0AH5100:07:14BRAN3: MOV 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, R4
40、MOV 21H, APOP ACCPOP PSWRET; R3, R4存1千(百, 十)的二进制数权值03E8H(0064H, 000AH)7、IAP15W4K58S4单片机双数据指针的使用两个16位的数据指针:DPTR0和DPTR1。它们的逻辑地址相同,但是物理上是独立的。功能:利用这两个数据指针,可以方便地进行数据的迁移和拷贝。使用方法:这两个数据指针在指令中只能以DPTR的形式出现,因此,在使用中,需进行切换。这种切换是通过设置辅助寄存器AUXR1中的DPS位实现的。当DPS选择位为0时, 选择DPTR0;当DPS选择位为1时, 选择DPTR1。5200:07:14位号D7D6D5D4D
41、3D2D1D0位名称S1_S1S1_S0CCP_S0CCP_S1SPI_S1SPI_S00DPSAUXR1各位定义:7、IAP15W4K58S4单片机双数据指针的使用DPS:DPTR寄存器选择位。0:选择DPTR0; 1:选择DPTR15300:07:14位号D7D6D5D4D3D2D1D0位名称S1_S1S1_S0CCP_S0CCP_S1SPI_S1SPI_S00DPS例4-11编程实现将单片机内部扩展RAM中0000H000FH单元中内容传送到0040H004FH单元中。思路:可以分别由DPTR0和DPTR1分别指向源数据地址和目的数据地址。AUXR1各位定义7、IAP15W4K58S4单
42、片机双数据指针的使用编程如下:AUXR1 DATA 0A2H ;定义辅助寄存器AUXR1直接地址 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP, #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=40H5400
43、:07:14或$INCLUDE (STC15.INC); 包含STC15寄存器定义头文件7、IAP15W4K58S4单片机双数据指针的使用LOOP: ANL AUXR1, #0FEH ;该句可用INC DEC AUXR1代替MOVX A, DPTR ; A (DPTR0) INC DPTR ;修正源数据地址指针DPTR0+1 ORL AUXR1, #01H ;该句可用INC AUXR1代替, MOVX DPTR, A ; (DPTR1) A INC DPTR ;修正目的数据地址指针DPTR1+1 DJNZ R2, LOOP ;传送字节数16没完, 继续循环传送 SJMP $ ;$表示本条语句地
44、址, 本指令是死循环等待 ;SJMP $ 相当于HERE: SJMP HERE END5500:07:14选DPTR1选DPTR03-2-1单片机的内部结构 2、存储器的结构(3)数据Flash存储器 1)相关特殊功能寄存器ISP/IAP命令寄存器IAP_CMDISP/IAP命令寄存器IAP_CMD(地址C5H,复位值xxxx x000B)的各位定义如下:00:07位号D7D6D5D4D3D2D1D0位名称-MS1MS0MS1和MS0组合形成不同的命令。MS1MS0命令/操作00待机模式,无ISP操作表4-6 ISP/IAP命令选择01对“Data Flash/EEPROM区”进行字节读10对
45、“Data Flash/EEPROM区”进行字节编程11对“Data Flash/EEPROM区”进行扇区擦除56ISP/IAP控制寄存器IAP_CONTRISP/IAP控制寄存器IAP_CONTR(地址:C7H, 复位值为0000 x000B)各位的定义如下:00:07位号D7D6D5D4D3D2D1D0位名称IAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0IAPEN: ISP/IAP功能允许位。0:禁止IAP读/写/擦除Data Flash/EEPROM1: 允许IAP读/写/擦除Data Flash/EEPROMSWBS和SWRST用于设置单片机的软件复位。(见11章)I
46、APENSWBSSWRST57CMD_FAIL: 若送了ISP/IAP命令, 并对IAP_TRIG送5AH/A5H触发失败, 则为1, 需由软件清零。CMD_FAILISP/IAP控制寄存器IAP_CONTRWT2WT0设置IAP/ISP时的, CPU等待时间, CPU读数据Flash的等待时间固定为2个时钟。其他等待时间见表4-7。00:07位号D7D6D5D4D3D2D1D0位名称IAPENSWBSSWRSTCMD_FAIL-WT2WT1WT0WT2WT1WT058表4-7 IAP/ISP时的CPU等待时间WT2WT1WT0CPU等待时间与等待参数对应的推荐系统时钟编程时间(55us)扇区
47、擦出(21ms)11155个时钟21012个时钟 1MHz110110个时钟42024个时钟 2MHz101165个时钟63036个时钟 3MHz100330个时钟126072个时钟 6MHz011660个时钟252144个时钟 12MHz0101100个时钟420240个时钟 20MHz0011320个时钟504288个时钟 24MHz0001760个时钟672384个时钟 30MHz8、IAP15W4K58S4单片机数据Flash(EEPROM)的使用IAP15W4K58S4单片机片内集成1KB的数据Flash存储器, 可作为EEPROM使用, 用来保存程序的设置参数。5900:07:14
48、【例4-12】一个完整的数据Flash操作实例。$INCLUDE (STC15.INC) ;包含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单元的测试值,如正确应等于该值START_ADDR
49、ESS 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数据指针 LCALL Byte_Read ;调子程读数据经IAP_DATA送入累加器A MOV 40H, A ;将EEPROM 的值送40H 单元保存 CJNE A, #DEBU
50、G_DATA, NOT_EQU_DEBUG_DATA ;若数据不正确(非5AH),就跳转;数据正确(5AH)时, 顺序执行 LCALL Delay ;延时 SJMP $ ;数据正确, CPU在此无限循环执行此句6000:07:14例4-12 一个完整的数据Flash操作实例(续)NOT_EQU_DEBUG_DATA: ;下面代码是当EEPROM里的数据错误时, 需进行的处理程序 ;即将该EEPROM所在的扇区整个擦除,将正确的数据写入 LCALL Delay ;延时 MOV DPTR, #START_ADDRESS ;将EEPROM测试起始地址0H送DPTR数据指针 LCALL Sector_
51、Erase ;调擦除整个扇区子程序 MOV DPTR, #START_ADDRESS ;将EEPROM测试起始地址送DPTR数据指针 MOV A, #DEBUG_DATA ;写入 EEPROM 数据 #DEBUG_DATA(5A) LCALL Byte_Program ;字节编程 SJMP $ ;字节编程后,CPU在此无限循环执行此句6100:07:14例4-12 一个完整的数据Flash操作实例(续) ;下面程序是读一字节, 调用前需打开IAP功能, Byte_Read: ;入口: DPTR=字节地址, 返回: A=读出字节 MOV IAP_CONTR, #ENABLE_IAP ; IAP_
52、CONTR82H, 打开IAP功能,设置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命令即被触发启动 NOP MOV A, IAP_DATA ;读出数据在IAP_DATA单元,送累加器A
53、LCALL IAP_Disable ;关闭IAP功能, 清相关特殊功能寄存器 RET 6200:07:14字节读操作也可用MOVC指令, 用MOVC访问数据Flash存储器时, 其地址范围为F000HF3FFH。例4-12 一个完整的数据Flash操作实例(续) ;下面程序是字节编程, 调用前需打开IAP功能, Byte_Program: ;入口:DPTR=字节地址, 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, DP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位管理制度范例合集【职员管理】
- 单位管理制度呈现大合集【职员管理篇】
- 2024河北安装工程消耗量定额计算规则
- 《广告的社会责任》课件
- 2024年反贪局 个人总结
- 九年级数学世纪金榜教师用书配套课件
- TTT企业内部讲师速成训练营
- 某铜矿项目监理大纲
- 2016年高考语文试卷(新课标Ⅰ卷)(解析卷)
- 2022销售员辞职报告范文
- 2025年上半年河南省西峡县部分事业单位招考易考易错模拟试题(共500题)试卷后附参考答案-1
- 深交所创业板注册制发行上市审核动态(2020-2022)
- 手术室护理组长竞聘
- 电力系统继电保护试题以及答案(二)
- 小学生防打架斗殴安全教育
- 2024-2025学年九年级英语上学期期末真题复习 专题09 单词拼写(安徽专用)
- 网络运营代销合同范例
- 2024年新人教版七年级上册历史 第14课 丝绸之路的开通与经营西域
- 《临床放射生物学》课件
- 植保无人机安全飞行
- 医疗纠纷事件汇报
评论
0/150
提交评论