第章C的汇编语言程序设计ppt课件_第1页
第章C的汇编语言程序设计ppt课件_第2页
第章C的汇编语言程序设计ppt课件_第3页
第章C的汇编语言程序设计ppt课件_第4页
第章C的汇编语言程序设计ppt课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4 4章章 80C51 80C51的汇编言语程序设计的汇编言语程序设计程序编制的方法和技巧程序编制的方法和技巧4.1源程序的编辑和汇编源程序的编辑和汇编4.2根本程序构造根本程序构造4.3子程序及其调用子程序及其调用4.4简单简单I/O设备的并口直接驱动例如设备的并口直接驱动例如4.5v 单片机运用系统由硬件系统和运用程序构成单片机运用系统由硬件系统和运用程序构成v 汇编言语汇编言语v 高级言语高级言语v 运用程序设计方法运用程序设计方法 汇编言语,生成的目的程序占内存空间少、汇编言语,生成的目的程序占内存空间少、运转速度快,具有效率高、实时性强。运转速度快,具有效率高、实时性强。 高级言

2、语,对系统的功能描画与实现简单,程序阅高级言语,对系统的功能描画与实现简单,程序阅读、修正和移植方便,适宜于编写复杂的程序。读、修正和移植方便,适宜于编写复杂的程序。 4.1 程序编制的方法和技巧程序编制的方法和技巧4.1.1 4.1.1 程序编制的步骤程序编制的步骤v 明确义务:功能要求、技术目的明确义务:功能要求、技术目的v 运转环境调研运转环境调研v 义务分析义务分析v 将实践问题转化为计算机处置的程序算法将实践问题转化为计算机处置的程序算法v 算法比较与优化内存需求与运转速度算法比较与优化内存需求与运转速度v 算法设计算法设计v 流程描画流程描画v 流程图符号流程图符号v “ “超级循

3、环框架超级循环框架v 强化模块观念强化模块观念v 使程序占用空间减少、构造明晰使程序占用空间减少、构造明晰v 循环初值和终了条件,防止循环初值和终了条件,防止“死机景象死机景象v 子程序的现场维护留意栈平衡、存放器内容子程序的现场维护留意栈平衡、存放器内容v 程序模块主程序模块、各种子程序模块程序模块主程序模块、各种子程序模块v 模块化优点:分块设计、便于阅读、调试方便模块化优点:分块设计、便于阅读、调试方便4.1.2 4.1.2 程序编制的方法和技巧程序编制的方法和技巧v 采用循环和子程序采用循环和子程序对中断子程序还有留意维护对中断子程序还有留意维护PSWPSW的内容的内容4.1.3 4.

4、1.3 汇编言语的语句格式汇编言语的语句格式v 非数字字符开头,后跟字母、数字、非数字字符开头,后跟字母、数字、“- -、“?等?等v 不能用已定义的保管字指令助记符、伪指令等不能用已定义的保管字指令助记符、伪指令等v 后跟英文冒号后跟英文冒号“: :KeilKeil的汇编器的汇编器A51A51可以识别的语句方式为:可以识别的语句方式为:v 标号即符号地址标号即符号地址标号: 指令助记符 操作数1, 操作数2, 操作数3, ;注释v 指令助记符指令助记符是指令功能的英文缩写。是指令功能的英文缩写。v 数据:二进制数据:二进制B Bv 十进制十进制D D或省略或省略D Dv 十六进制十六进制H

5、H,留意,留意AFAF开头时要加开头时要加“0 0v ASCII ASCII码,如码,如 A A,12451245v 符号:符号名、标号或符号:符号名、标号或“$ $PCPC的当前值的当前值v 表达式:由运算符和数据构成见表表达式:由运算符和数据构成见表4.14.1v 操作数操作数v 注释注释英文分号英文分号“; ;开头开头优先级运 算 符功 能表达式及其结果示例高低()括号4*(5+6)即44NOT、HIGH、LOW取反、取高字节、取低字节NOT 55H 即AAH;HIGH 1234H 即12H、正号、负号5、6*、/、MOD乘、除(取商)、取余数17 / 5 即3; 17 MOD 5 即2

6、、加、减 54 即 9; 54 =即1SHL、SHR左移、右移2 SHL 2即8;8 SHR 2 即 2AND、OR、XOR与、或、异或45H AND 0FH即05H、=、=比较运算符MOV A,X8;若X8为真,则为MOV A,01H若X8为假,则为MOV A,00H表表4.14.14.2 源程序的编辑和汇编源程序的编辑和汇编目的程序的产生过程如以下图:目的程序的产生过程如以下图:v 源程序的汇编源程序的汇编v 汇编源程序转为目的程序的过程叫汇编汇编源程序转为目的程序的过程叫汇编v 汇编通常在汇编通常在WindowsWindows下的集成开发环境完成下的集成开发环境完成v 用用A51.EXE

7、A51.EXE汇编生成汇编生成.OBJ.OBJ、.LIB.LIB及及.LST.LSTv 目的程序的衔接目的程序的衔接v .OBJ.OBJ、.LIB.LIB经经BL51.EXEBL51.EXE生成无扩展名的绝对地址目的文件生成无扩展名的绝对地址目的文件v 绝对地址目的文件可以用于仿真器调试绝对地址目的文件可以用于仿真器调试v 调试无误的目的文件用调试无误的目的文件用OH51.EXEOH51.EXE转换为转换为.HEX.HEX文件文件v .HEX.HEX文件经编程器写入单片机存储器文件经编程器写入单片机存储器4.2.1 4.2.1 源程序的编辑和汇编源程序的编辑和汇编v 源程序的编辑源程序的编辑

8、ORG 0000H ORG 0000H LJMP MAIN LJMP MAIN ORG 0003H ORG 0003H LJMP INT0 LJMP INT0 ORG 0030H ORG 0030HMAIN:MOV SP,#60HMAIN:MOV SP,#60HMlop:.Mlop:. SJMP MLOP SJMP MLOPINT0:.;INT0:.;中断效力程序中断效力程序 RETI RETI SUBP1: ;SUBP1: ;子程序子程序 ret ret END ENDv 根据汇编言语规那根据汇编言语规那么么v 用好伪指令用好伪指令v 符号不用中文符号不用中文v SJMP $ SJMP $

9、用于调试用于调试v 以以 .ASM .ASM存盘存盘评价程序质量的规范:评价程序质量的规范: 程序的执行时间程序的执行时间 程序所占用的内存字节数目程序所占用的内存字节数目 程序的逻辑性、可读性程序的逻辑性、可读性 程序的兼容性、可扩展性程序的兼容性、可扩展性 程序的可靠性程序的可靠性时时 间间空空 间间概概念念4.2.2 4.2.2 伪指令伪指令v 伪指令,也叫汇编命令。仅对汇编过程进展指示伪指令,也叫汇编命令。仅对汇编过程进展指示v 伪指令无对应的单片机可执行代码伪指令无对应的单片机可执行代码v 起始地址设定伪指令起始地址设定伪指令ORGORGORG ORG 表达式表达式表达式通常为十六进

10、制地址,例:表达式通常为十六进制地址,例: ORG 8000H ORG 8000HSTART:MOV A,#30HSTART:MOV A,#30H ORGORG可多次运用,但地址值的顺序要由小到大可多次运用,但地址值的顺序要由小到大v 终了汇编伪指令终了汇编伪指令ENDENDEND该伪指令位于源程序的最后一行。该伪指令位于源程序的最后一行。v 定义字节数据表伪指令定义字节数据表伪指令DBDBv定义字数据表伪指令定义字数据表伪指令DWDW1000H 标号:标号: DB DB 字节数据表字节数据表如:如:ORG 1000HORG 1000HDB -2,-4,-6,8,10,18DB -2,-4,-

11、6,8,10,18FEH FCHFAH08H0AH12H1001H 标号:标号: DW DW 字数据表字数据表 ORG 1400H ORG 1400HDATA1:DW 324AH,3CHDATA1:DW 324AH,3CH 1400H32H 4AH00H3CH1401H1402H1403H大端方式v 定义常值为符号名伪指令定义常值为符号名伪指令EQUEQU符号名符号名 EQU EQU 常值表达式常值表达式 LEN EQU 10 SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7,

12、LOOP MOV SUM,A 符号名为:符号名为:地址地址常数常数段名段名字符串字符串存放器名存放器名位名位名比较:标号只能是地址比较:标号只能是地址v 定义位地址为符号名伪指令定义位地址为符号名伪指令BITBIT符号名符号名 BIT BIT 位地址表达式位地址表达式如:如:ST BIT P1.0 ;ST BIT P1.0 ;将将P1.0P1.0的位地址赋给符号名的位地址赋给符号名STSTCF BIT 0D7H ;CF BIT 0D7H ;将位地址为将位地址为D7HD7H的位定义为符号名的位定义为符号名用用BITBIT定义的定义的“符号名一经定义便不能重新符号名一经定义便不能重新定义和改动定义

13、和改动其它一些伪指令参见教材表其它一些伪指令参见教材表4.2 4.2 ORG 0040H ORG 0040HSTART:MOV A,21H ;START:MOV A,21H ;取十位取十位ASCIIASCII码码 ANL A,#0FH ; ANL A,#0FH ;保管低半字节保管低半字节 SWAP A ; SWAP A ;移至高半字节移至高半字节 MOV 20H,A ; MOV 20H,A ;存于存于20H20H单元单元 MOV A,22H ; MOV A,22H ;取个位取个位ASCIIASCII码码 ANL A,#0FH ; ANL A,#0FH ;保管低半字节保管低半字节 ORL 20H

14、,A ; ORL 20H,A ;合并到结果单元合并到结果单元 SJMP $ SJMP $ END END【例【例4-14-1】片内】片内RAMRAM的的21H21H单元存放一个十进制数据十位的单元存放一个十进制数据十位的ASCIIASCII码,码,22H22H单元存放该数据个位的单元存放该数据个位的ASCIIASCII码。编写程序将该数据转换成紧缩码。编写程序将该数据转换成紧缩BCDBCD码存放在码存放在20H20H单元。单元。4.3.1 4.3.1 顺序程序顺序程序无分支、无循环无分支、无循环根本程序构造根本程序构造4.34.3.2 4.3.2 分支程序分支程序单分支、双分支、多分支单分支、

15、双分支、多分支【例【例4-24-2】设变量】设变量x x以补码的方式存放在片内以补码的方式存放在片内RAMRAM的的30H30H单元,变单元,变量量y y与与x x的关系是的关系是: :当当x x大于大于0 0时时,y=x;,y=x;当当x=0 x=0时时,y=20H;,y=20H;当当x x小于小于0 0时时,y=x+5,y=x+5。编制程序。编制程序, ,根据根据x x的大小求的大小求y y并送回原单元。并送回原单元。 ORG 0040H ORG 0040HSTART:MOV A,30H ;START:MOV A,30H ;取取x x至累加器至累加器 JZ NEXT ;x = 0, JZ

16、NEXT ;x = 0,转转NEXTNEXT ANL A,#80H ; ANL A,#80H ;否,保管符号位否,保管符号位 JZ DONE ;x 0, JZ DONE ;x 0,转终了转终了 MOV A,#05H ;x 0 MOV A,#05H ;x 0处置处置 ADD A,30H ADD A,30H MOV 30H,A ;X+05H MOV 30H,A ;X+05H送送Y Y SJMP DONE SJMP DONE NEXT:MOV 30H,#20H ;x = 0,20H NEXT:MOV 30H,#20H ;x = 0,20H送送Y Y DONE:SJMP DONE DONE:SJMP

17、DONE END END JNB ACC.7JNB ACC.7,DONEDONE ADD A,#5 ADD A,#5【例【例4-34-3】根据】根据R7R7的内容的内容x x转移序号转向相应的处置程序。转移序号转向相应的处置程序。设设R7R7内容为内容为0 04 4,对应的处置程序入口地址分别为,对应的处置程序入口地址分别为PP0PP0PP4PP4。 START:MOV R7,#3 ; START:MOV R7,#3 ;以转移序号以转移序号3 3为例为例 ACALL JPNUM ACALL JPNUM AJMP START AJMP START【例【例4-34-3】根据】根据R7R7的内容的内

18、容x x转移序号转向相应的处置程序。转移序号转向相应的处置程序。设设R7R7内容为内容为0 04 4,对应的处置程序入口地址分别为,对应的处置程序入口地址分别为PP0PP0PP4PP4。 JPNUM:MOV DPTR,#TAB MOV A,R7 ADD A,R7 MOV R3,A MOVC A,A+DPTR XCH A,R3 INC A MOVC A,A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP A+DPTR TAB:DW PP0 DW PP1 DW PPN PUSH ACCMOV A,R3PUSH ACCRET PP0:. RET PP1: RET PP2:.

19、RET PP3: RET PP4: RETJPNUM:MOV DPTR,TAB MOV A,R7 ADD A,R7 JNC NOAD INC DPH NOAD: JMP A+DPTRTAB: AJMP PP0 AJMP PP1 AJMP PPN PP0:. PP0:. RET RETPP1:PP1: RET RETPP2:.PP2:. RET RETPP3: PP3: RET RETPPN:PPN: RET RET4.3.3 4.3.3 循环程序循环程序2种:先执行,后判别;先判别,后执行种:先执行,后判别;先判别,后执行【例【例4-44-4】将内部】将内部RAMRAM的的30H30H至至3F

20、H3FH单元初始化为单元初始化为00H00H。MAIN:MOV R0,#30H ;MAIN:MOV R0,#30H ;置初值置初值 MOV A,#00H ; MOV A,#00H ; MOV R7,#16 ; MOV R7,#16 ; LOOP:MOV R0,A ;LOOP:MOV R0,A ;循环处置循环处置 INC R0 ; INC R0 ; DJNZ R7,LOOP ; DJNZ R7,LOOP ;循环修正,判终了循环修正,判终了 SJMP $ ; SJMP $ ;终了处置终了处置【例【例4-54-5】将内部】将内部RAMRAM起始地址为起始地址为60H60H的数据串传送到外部的数据串传

21、送到外部RAMRAM中中起始地址为起始地址为1000H1000H的存储区域,直到发现的存储区域,直到发现$ $ 字符停顿传送。字符停顿传送。 MAIN:MOV R0,#60H ; MAIN:MOV R0,#60H ;置初值置初值 MOV DPTR,#1000H MOV DPTR,#1000HLOOP0:MOV A,R0 ;LOOP0:MOV A,R0 ;取数据取数据 CJNE A,#24H,LOOP1 ; CJNE A,#24H,LOOP1 ;循环终了?循环终了? SJMP DONE ; SJMP DONE ;是是LOOP1:MOVX DPTR,A ;LOOP1:MOVX DPTR,A ;循环

22、处置循环处置 INC R0 ; INC R0 ;循环修正循环修正 INC DPTR INC DPTR SJMP LOOP0 ; SJMP LOOP0 ;继续循环继续循环 DONE:SJMP DONE ; DONE:SJMP DONE ;终了处置终了处置例例:50ms:50ms延时程序。延时程序。fosc=12MHz.Tc=1sfosc=12MHz.Tc=1sDEL2:DJNZ R6DEL2:DJNZ R6,DEL2DEL2 ;2;2s sDEL1:MOV R6DEL1:MOV R6,#123#1232 2123123=246s=246s;1s;1sDJNZ R7DJNZ R7,DEL1DEL1

23、 ;1s;1sNOPNOP;1s;1s246s+1+1+2246s+1+1+2DEL:MOV R7DEL:MOV R7,#200#200(246s+1+1+2)(246s+1+1+2)200200(246s+1+1+2)(246s+1+1+2)200+1+2=500003s200+1+2=500003s;1s;1s;2s;2sRETRETP110P110有其他的延时子程序有其他的延时子程序4.4 子程序及其调用子程序及其调用 完成通用功能、反复运用的程序设计成子程序。使运用完成通用功能、反复运用的程序设计成子程序。使运用程序构造明晰紧凑,便于阅读和调试程序构造明晰紧凑,便于阅读和调试 v 执行

24、要由其它程序来调用,执行完后要前往到调执行要由其它程序来调用,执行完后要前往到调用程序用程序 构造上依然采用普通程序的构造上依然采用普通程序的3 3种构造种构造 调用时留意:调用时留意:一是现场的维护和恢复;一是现场的维护和恢复;二是主程序与子程序间的参数传送。二是主程序与子程序间的参数传送。4.4.1 4.4.1 现场维护与恢复现场维护与恢复v在主程序中实现构造灵敏在主程序中实现构造灵敏 PUSH PSW ;PUSH PSW ;维护现场维护现场 含当前任务存放器组号含当前任务存放器组号PUSH ACC ;PUSH ACC ;PUSH B ;PUSH B ;MOV PSW,#10H ;MOV

25、PSW,#10H ;切换当前任务存放器组切换当前任务存放器组LCALL addr16 ;LCALL addr16 ;子程序调用,子程序调用, POP B ;POP B ;恢复现场恢复现场POP ACC ;POP ACC ;POP PSW ;POP PSW ;含当前任务存放器组切换含当前任务存放器组切换v在子程序中实现程序规范、明晰在子程序中实现程序规范、明晰SUB1:PUSH PSW ;SUB1:PUSH PSW ;维护现场维护现场 含当前任务存放器组号含当前任务存放器组号 PUSH ACC ; PUSH ACC ; PUSH B ; PUSH B ; MOV PSW,#10H ; MOV P

26、SW,#10H ;切换当前任务存放器组切换当前任务存放器组 POP B ; POP B ;恢复现场恢复现场 POP ACC ; POP ACC ; POP PSW ; POP PSW ;内含当前任务存放器组切换内含当前任务存放器组切换 RET RET4.4.2 4.4.2 参数传送参数传送v 利用累加器或存放器简单、快速,但参数个数不多利用累加器或存放器简单、快速,但参数个数不多【例4-6】实现两个8位的十六进制无符号数求和的子程序。SADD:MOV A,R3 ;SADD:MOV A,R3 ;取加数在取加数在R3R3中中 CLR C CLR C ADD A,R4 ; ADD A,R4 ;被加数

27、在被加数在R4R4中加中加A A JC PP1 JC PP1 MOV R3,#00H ; MOV R3,#00H ;结果小于结果小于255255时,高字节时,高字节R3R3内容为内容为00H00H SJMP PP2 SJMP PP2 PP1:MOV R3,#01H ; PP1:MOV R3,#01H ;结果大于结果大于255255时,高字节时,高字节R3R3内容为内容为01H01H PP2:MOV R4,A ; PP2:MOV R4,A ;结果的低字节在结果的低字节在R4R4中中 RET RET入口入口: :R3R3= =加数;加数; R4R4= =被加数。被加数。出口出口: :R3R3= =

28、和的高字节;和的高字节; R4R4= =和的低字节。和的低字节。v 利用存储器个数多,用利用存储器个数多,用R0R0或或R1R1及及DPTRDPTR为参数表指针为参数表指针【例【例4-74-7】将内部】将内部RAM RAM 中两个中两个4 4字节无符号整数相加,和的高字节无符号整数相加,和的高字节由字节由R0R0指向。数据采用大端方式存储。指向。数据采用大端方式存储。入口入口: :R0R0= =加数低字节地址;加数低字节地址; R1R1= =被加数低字节地址。被加数低字节地址。出口出口: :R0R0= =和的高字节起始地址。和的高字节起始地址。 NADD:MOV R7,#4 ; NADD:MO

29、V R7,#4 ;字节数字节数4 4送计数器送计数器 CLR C ; CLR C ;NADD1:MOV A,R0 ;NADD1:MOV A,R0 ;利用指针利用指针, ,取加数低字节取加数低字节 ADDC A,R1 ; ADDC A,R1 ;利用指针利用指针, ,被加数低字节加被加数低字节加A A MOV R0,A ; MOV R0,A ; DEC R0 DEC R0 DEC R1 DEC R1 DJNZ R7,NADD1 DJNZ R7,NADD1 INC R0 ; INC R0 ;调整指针,指向出口调整指针,指向出口 RET RET 经过堆栈传送参数经过堆栈传送参数例例 在在HEX单元存放

30、两个十六进制数,将它们分别单元存放两个十六进制数,将它们分别 转换成转换成ASCII码并存入码并存入ASC和和ASC+1单元单元解:解: 由于要进展两次转换,故可调用查表子程序完成由于要进展两次转换,故可调用查表子程序完成MAIN:.PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.;转子转子;压入压入 被转换数被转换数;ASCLASC;取被转换数取被转换数;处置高四位处置高四位;压入压入;转子程序转子程序;ASCASC+1主程序主程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底*PC 断

31、点地址断点地址MOVC A,A+PC HASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F;弹出弹出;修正修正SP指向指向HEX;屏蔽高四位屏蔽高四位;变址调整变址调整;查表查表;结果入栈结果入栈;修正修正SP指向断点位置指向断点位置;子程序子程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底AHEXResultResultSP+1SP+2SP+3PC HEX SPSPSPSP .PUSH HEX LCALL HASCPOP ASCMOV A,

32、 HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.MOVC A,A+PCHASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F60H61H62H63H64H HEX *PCL *PCHPC断点断点SP0000 HEXL ASCAASCSPSPSPSP主程序主程序子程序子程序v 利用堆栈利用堆栈 【例【例4-84-8】 将内部将内部RAMRAM中中20H20H单元中的单元中的1 1个字节十六进制数转换为个字节十六进制数转换为2 2位位A

33、SCIIASCII码,存放在码,存放在R0R0指示的两个单元中。指示的两个单元中。入口:预转换数据低半字节在栈顶入口:预转换数据低半字节在栈顶 出口:转换结果出口:转换结果ASCIIASCII码在栈顶码在栈顶 HEASC:MOV R1,SP ; HEASC:MOV R1,SP ;借用借用R1R1为堆栈指针为堆栈指针 DEC R1 DEC R1 DEC R1 ;R1 DEC R1 ;R1指向被转换数据指向被转换数据 XCH A,R1 ; XCH A,R1 ;取被转换数据取被转换数据 ANL A,#0FH ; ANL A,#0FH ;取一位十六进制数取一位十六进制数 ADD A,#2 ; ADD

34、A,#2 ;偏移调整偏移调整, ,所加值为所加值为MOVCMOVC与与DBDB间间总字节数总字节数 MOVC A,A+PC ; MOVC A,A+PC ;查表查表 XCH A,R1 ;1 XCH A,R1 ;1字节指令字节指令, ,存结果于堆栈中存结果于堆栈中 RET ;1 RET ;1字节指令字节指令ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37HASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H DB 38H,39H,41H,42H,43H,44H,45H

35、,46H验证程序段验证程序段 MAIN:MOV A,20H ;MAIN:MOV A,20H ; SWAP A SWAP A PUSH ACC ; PUSH ACC ;预转换的数据在低半字节入栈预转换的数据在低半字节入栈 ACALL HEASC ACALL HEASC POP ACC ; POP ACC ;弹出栈顶结果于弹出栈顶结果于ACCACC中中 MOV R0,A ; MOV R0,A ;存转换结果高字节存转换结果高字节 INC R0 ; INC R0 ;修正指针修正指针 PUSH 20H ; PUSH 20H ;预转换的数据在低半字节入栈预转换的数据在低半字节入栈 ACALL HEASC

36、ACALL HEASC POP ACC ; POP ACC ;弹出栈顶结果于弹出栈顶结果于ACCACC中中 MOV R0,A ; MOV R0,A ;存转换结果低字节存转换结果低字节 SJMP $ SJMP $4.4.3 4.4.3 常用子程序例如常用子程序例如一算术运算程序一算术运算程序 例:多字节数例:多字节数的加、减运算的加、减运算; ;入口参数入口参数(R0)=(R0)=被减数低字节地址被减数低字节地址; (R1)=; (R1)=减数低字节地址减数低字节地址; (R7)=; (R7)=字节数字节数; ;出口参数出口参数(R1)=(R1)=差的高字节地址差的高字节地址( (起始地址起始地

37、址) )NSUBNSUB CLR C CLR C NSUB1NSUB1:MOV AMOV A,R0R0 SUBB A SUBB A,R1R1 MOV R1 MOV R1,A A DEC R0 DEC R0 DEC R1 DEC R1 DJNZ R7 DJNZ R7, LOOP LOOP INC R1 INC R1 RET RET0CY0CY (R0)-(R1)-CY (R0)-(R1)-CYR0R0RETRETNSUBNSUBR7R7-1=0?-1=0?R0R0+1R0+1R0,R1+1R1R1+1R1 N NMOV R7MOV R7,#16#16MOV R0MOV R0,#3FH#3FHMO

38、V R1MOV R1,#4FH#4FHACALL NUSB ACALL NUSB 例例4-10 4-10 双字节无符号数快速乘法子程序双字节无符号数快速乘法子程序MULDMULDR0R0= = 有定义的内部有定义的内部RAMRAM地址地址编程思绪与手乘法类似:编程思绪与手乘法类似: R3 b R5 d R2 a R4 cBMUL:MOV A,R3 ; MOV B,R5 ; MUL AB ;低位乘 ACALL RADD; MOV A,R3; MOV B,R4; MUL AB ;交叉乘 DEC R0 ; ACALL RADD; MOV A,R8; MOV B,R5; MUL AB ;交叉乘 DEC

39、 R0 ; DEC R0 ; ACALL RADD; MOV A,R2; MOV B,R4; MUL AB ;高字节乘 DEC R0 ; ACALL RADD; DEC R0 RETADD AADD A,R0 R0 MOV R0MOV R0,A AMOV AMOV A,B BINC R0INC R0ADDC AADDC A,R0R0MOV R0MOV R0,A AINC R0INC R0MOV AMOV A,R0R0ADDC AADDC A,#00H #00H MOV R0MOV R0,A ARETRETRADDRADD:例例:16:16位位88位无符号数除法。被除数存放在位无符号数除法。被除

40、数存放在R6R6、R5(R6R5(R6高高8 8位,位,R5R5低低8 8位位) )中,除数存放在中,除数存放在R2R2中,商存放在中,商存放在R5R5中,余数存放在中,余数存放在R6R6中。中。 商 数 除 数被除数 -除数;试做减法,够减商上1 余数 - 除数 不够减,商上0,并恢复减法前的余数余数 - 除数 ;再做减法 (2);(2);程序名:程序名:DDIVDDIV ; ;功能:功能:1616位位88位无符号数除法位无符号数除法 ; ;入口参数:被除数入口参数:被除数R6R6、R5,R5,除数在除数在R2R2中中 ; ;出口参数:商出口参数:商R5R5,余数,余数R6R6 ; ;占用资

41、源:占用资源:F0F0作为标志位暂存单元作为标志位暂存单元 DDIV:PUSHPSW MOVR7,#08H;R7次数DDIV1:CLRC;清CY MOVA,R5;余数左移1位第1次为被除数) RLCA;CYR5R60 MOVR5,A MOVA,R6 RLCA MOVF0,C;CLRCSUBB A,R2;高位余数-除数JBF0,NEXT;假设标志位为1,那么够减JNCNEXT;没有借位,也阐明够减 ADDA,R2;否那么,不够减,恢复余数 SJMPNEXT1NEXT: INCR5;够减,商上1NEXT1:MOV R6,A;保管余数DJNZR7,DDIV1POPPSW RET例例4-114-11利

42、用子程序利用子程序c=a2+b2c=a2+b2; ;入口参数入口参数(A)=(A)=预平方数预平方数; ;出口参数出口参数(A)=(A)=平方值平方值 SQRSQR:MOV DPTRMOV DPTR,#TAB#TAB MOVC A MOVC A,A+DPTR A+DPTR RET RETTABTAB:DB 1,4,9,16,25,36,49,64,81DB 1,4,9,16,25,36,49,64,81操操作作码码PCPCDPTRDPTR2000HA A 03H 09H ALU 93H 93HROMROM00H00H 2000H01H01H04H04H09H09H 2019H 2019H 20

43、19H2019H2019H2021H2019H2019H2019H10H10H19H19H24H24H31H31H40H40H51H51H; ;入口参数入口参数(A)=(A)=预平方数预平方数; ;出口参数出口参数(A)=(A)=平方值平方值 SQRSQR:MOV DPTRMOV DPTR,#TAB#TAB MOVC A MOVC A,A+DPTRA+DPTR RET RETTABTAB:DB 1,4,9,16,25,36,49,64,81DB 1,4,9,16,25,36,49,64,81MAIN:MOV 30H,#4MAIN:MOV 30H,#4 MOV 31H,#5 MOV 31H,#5

44、 MOV A,30H MOV A,30H ACALL SQR ACALL SQR MOV R1 MOV R1,A A MOV A,31H MOV A,31H ACALL SQR ACALL SQR ADD A,R1 ADD A,R1 MOV 32H,A MOV 32H,A SJMP $ SJMP $例例4-114-11利用子程序利用子程序(32H)=(30H)2+(31H)2(32H)=(30H)2+(31H)2v三、码型转换三、码型转换1 1、十六进制数与、十六进制数与ASCIIASCII码间的转换码间的转换HASCHASC:MOV AMOV A,R0R0;取;取4 4位二进制数位二进制数

45、ANL A ANL A,#0FH#0FH;屏蔽掉高;屏蔽掉高4 4位位 PUSH ACC PUSH ACC;4 4位二进制数入栈位二进制数入栈 CLR C CLR C ;清进借位位;清进借位位 SUBB A SUBB A,#0AH#0AH POP ACC POP ACC ;弹出原;弹出原4 4位二进制数位二进制数 JC LOOP JC LOOP ;借位位为;借位位为1 1,跳转至,跳转至LOOPLOOP ADD A ADD A,#07H#07H;借位位为;借位位为0 0,该数在,该数在A AF F之间,加之间,加37H37HLOOPLOOP:ADD AADD A,#30H#30H;该数在;该数

46、在0 09 9之间,加之间,加30H30H MOV R2 MOV R2,A A;ASCIIASCII码存于码存于R2R2 RET RET 入口参数入口参数(R0)=16(R0)=16进制进制出口参数出口参数(R2)=ASCII(R2)=ASCIIMAIN:MOV R0MAIN:MOV R0,#0BH#0BH ACALL HASC ACALL HASC SJMP $ SJMP $2 2、二进制数与十进制转换、二进制数与十进制转换将某8位二进制数转换为BCD码。HTBCD:MOV A,R2 MOV B,#100 DIV AB;除100 MOV R2,A XCH A,B MOV B,#10 DIV

47、AB;除10 MOV R3,A MOV R4,B RET入口参数:R2出口参数:R2R3R4253=2*100+5*10+3将某8位二进制数转换为BCD码。DCDTHDCDTH:CLR A CLR A ; MOV R2 MOV R2,A A ;R4R4清清0 0 MOV R3 MOV R3,A A ;R5R5清清0 0 MOV R7 MOV R7,#8#8;计数初值;计数初值LOOPLOOP: CLR C CLR C ; MOV A MOV A,R2R2; RLC A RLC A ; MOV R2 MOV R2,A A;R2R2左移一位并送回左移一位并送回 MOV A MOV A,R4R4;

48、ADDC A ADDC A,R4R4; DA A DA A ; MOV R4 MOV R4,A A;R3R3乘乘2 2并调整后送回并调整后送回 MOV A MOV A,R3R3; ADDC A ADDC A,R3R3; DA A DA A ; MOV R3 MOV R3,A A;R4R4乘乘2 2并调整后送回并调整后送回 DJNZ R7 DJNZ R7,LOOP LOOP ; RET RET入口参数:R2出口参数:R3R4B727B727B626B626B525B525B424B424B323B323B222B222B121B121B020B020=(B72=(B72B6)26B6)26B52

49、5B525B424B424B323B323B222B222B121B121B020B020(02+B7)2(02+B7)2B6)2B6)2B5)2B5)2B4)2B4)2B3)2B3)2B2)2B2)2B1)2B1)2B0B0(02+B7)(02+B7)(02+B7)2(02+B7)2B6B6(02+B7)2(02+B7)2B6)2B6)2B5B5(02+B7)2(02+B7)2B6)2B6)2B5)2B5)2B4B4(02+B7)2(02+B7)2B6)2B6)2B5)2B5)2B4)2B4)2B3B3(02+B7)2(02+B7)2B6)2B6)2B5)2B5)2B4)2B4)2B3)2B

50、3)2B2B2(02+B7)2(02+B7)2B6)2B6)2B5)2B5)2B4)2B4)2B3)2B3)2B2)2B2)2B1B1= =4.5 简单简单I/O设备的并口直接驱动例如设备的并口直接驱动例如4.5.1 4.5.1 独立式键盘与独立式键盘与LEDLED显示例如显示例如【例【例4-174-17】数据端与】数据端与P0P0口正序衔接。编写程序,分别实现口正序衔接。编写程序,分别实现功能:上电后数码管显示功能:上电后数码管显示“P“P,按下任何键后,显示从,按下任何键后,显示从“0“0开场每隔开场每隔1 1秒加秒加1 1,加至,加至“F“F后,数码管显示后,数码管显示“P“P,进入等待

51、按键形状。进入等待按键形状。 TEMP EQU 30H TEMP EQU 30HORG 0000HORG 0000HJMP STARTJMP START ORG 0100H ORG 0100HSTART:MOV SP,#5FHSTART:MOV SP,#5FH MOV P0,#8CH ; MOV P0,#8CH ;显示显示PPMOV P3,#0FFHMOV P3,#0FFHNOKEY:MOV A,P3NOKEY:MOV A,P3CPL ACPL AJZ NOKEY ;JZ NOKEY ;无键按下无键按下MOV TEMP,P3 ;MOV TEMP,P3 ;有键按下有键按下CALL D10msCALL D10msMOV A,P3MOV A,P3CJNE A,TEMP,NOKEY;CJNE A,TEMP,NOKEY;去抖去抖MOV R7,#16MOV R7,#16MOV R2,#0MOV R2,#0LOOP:MOV A,R2LOOP:MOV A,R2 MOV D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论