版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、AVR单片机原理及应用第三章(2)指令的应用(汇编语言程序设计)汇编语言程序设计步骤 一个应用程序的编制,通常可以分成以下6个步骤:(1)拟制设计任务书 (2)建立数学模型 (3)确立算法 (4)绘制程序流程图 (5)编制汇编语言源程序 (6)上机调试 拟制设计任务书建立或修改数学模型确立算法编制或修改流程图编制或修改程序汇编通过?上机调试完成调试通过?试运行通过?程序有大问题?YYYNNNNY3.8.1 简单程序设计也称顺序程序或直接程序例:编程把SRAM中$0060单元内两个BCD数变换成ASCII码,并放在$0061和$0062单元(低4位BCD数的ASCII码放在$0061单元) .i
2、nclude “m16def.inc”ldi xl,$61ldi xh,$00lds r16,$0060mov r17,r16andi r16,$0fori r16,$30st x+,r16swap r17andi r17,$0fori r17,$30st x+,r17here:rjmp here.exit3.8.2 分支程序设计又称散转程序.include “m16def.inc”.SET VAR=0X0070.SET FUNC=0X0071.ORG $000RJMP MAIN.ORG 0X002AMAIN:LDS R16,VARTST R16BREQ DONEBRPL POSILDI R1
3、6,$FF ;R16 -1RJMP DONEPOSI:LDI R16,$01DONE:STS FUNC,R16HERE:RJMP HERE.EXIT例:求16位二进制符号数的绝对值(设此数的低、高字节分别存于SRAM的$0060,$0061单元,求绝对值后存回原处).include “m8def.inc”.SET VAR=0X0060.ORG $000RJMP MAIN.ORG 0X0013MAIN:LDS R17,VAR+1TST R17BRPL HERELDS R16,VARSUBI R16,1SBCI R17,0COM R16COM R17STS VAR,R16STS VAR+1,R17
4、HERE:RJMP HERE.EXIT3.8.3 循环程序设计例:把通用寄存器R0R29置0 xFF.include “m8def.inc”LDI ZL,0LDI ZH,0LDI R29,$FFLOOP:ST Z+,R29CPI ZL,29BRNE LOOPhere:rjmp here.exit例:已知SRAM ADDR($0062)为起始地址的数据块的数据是无符号数,块长在LEN($0061)单元。求最大值并存入MAX($0060)单元.include “m16def.inc”.SET LEN=$0061.SET ADDR=$0062.SET MAX=$0060.ORG $000RJMP S
5、TART.ORG 0X002ASTART:LDS R20,LENCLR R16LDI XL,LOW(ADDR)LDI XH,HIGH(ADDR)LOOP:LD R18,X+CP R18,R16BRCS NEXT ;BRLOMOV R16,R18NEXT:DEC R20BRNE LOOPSTS MAX,R16here:rjmp here.exit例:已知SRAM ADDR($0062)为起始地址的数据块的数据是符号数,块长在LEN($0061)单元。求最大值并存入MAX($0060)单元.include “m16def.inc”.SET LEN=$0061.SET ADDR=$0062.SET
6、MAX=$0060.ORG $000RJMP START.ORG 0X002ASTART:LDS R20,LENLDI R16,$80LDI XL,LOW(ADDR)LDI XH,HIGH(ADDR)LOOP:LD R18,X+CP R18,R16BRLT NEXTMOV R16,R18NEXT:DEC R20BRNE LOOPSTS MAX,R16here:rjmp here.exit3.8.4 查表程序设计用于不便于计算的函数(如平方、立方、三角函数)、固定的编码(如ASCII码、数码管显示)等,表格存于FLASH中,用LPM指令来取出对应项的值例:设SRAM的0 x60开始的40个单元字
7、节存放有40个取值为09的二进制整数。将它们求平方值后存放到SRAM的0 x100开始的存储区。 .include “m16def.inc”rjmp MainTab: .db 0, 1, 4, 9, 16, 25, 36, 49, 64, 81Main:ldi yl, 0 x00 ;SRAM存储基址ldi yh, 0 x01ldi xl, 0 x60 ;SRAM取数基址ldi xh, 0 x00ldi r18, 40 ;计数用loop:ld r16, x+ ;从SRAM取数,地址增1ldi zl, low(Tab*2)ldi zh, high(Tab*2)clr r17add zl, r16a
8、dc zh,r17lpm ;查平方值st y+, r0 ;保存到SRAM并且地址增1dec r18 ;计数减1brne loop ;未查完,循环HERE:RJMP HERE.EXIT例:已知SRAM中起始地址为BLOCK1的数据块(其长度存放在LEN单元),每个存储单元中高、低4位为两个十六进制数,将它们转换为ASCII码后存放在BLOCK2开始的连续存储单元。 .include “m16def.inc”.SET LEN=$0060.SET BLOCK1=$0061.SET BLOCK2=$0168.ORG $000RJMP MAIN.ORG 0X002AMAIN:LDS R25,LENLDI
9、 XL,LOW(BLOCK1)LDI XH,HIGH(BLOCK1)LDI YL,LOW(BLOCK2)LDI YH,HIGH(BLOCK2)LOOP:LDI ZL,LOW(ASTAB*2)LDI ZH,HIGH(ASTAB*2)CLR R18LD R17,XANDI R17,$0FADD ZL,R17ADC ZH,R18LPM R17,ZST Y+,R17LD R17,X+ANDI R17,$F0SWAP R17LDI ZL,LOW(ASTAB*2)LDI ZH,HIGH(ASTAB*2)ADD ZL,R17ADC ZH,R18LPM R17,ZST Y+,R17DEC R25BRNE LO
10、OPHERE:RJMP HEREASCTAB:.DB $30,$31,$39.DB $41,$42,$463.8.5 子程序设计子程序:完成确定任务、反复调用入口地址(第一条指令地址,常用标号)返回(RET)状态保护(如SREG等)参数传递(R0R31,或者堆栈方式)例: SRAM中HEX单元的两个十六进制数,分别转成ASCII码存入ASC和ASC+1单元.INCLUDE “M16DEF.INC”.SET HEX=$0060.SET ASC=$0061LDI R17,LOW(RAMEND)OUT SPL,R17LDI R17,HIGH(RAMEND)OUT SPH,R17LDS R16,HEX
11、PUSH R16RCALL HASCPOP R16STS ASC,R16LDS R16,HEXSWAP R16PUSH R16RCALL HASCPOP R16STS ASC+1,R16HERE:RJMP HEREHASC:POP R16POP R16POP R16ANDI R16,$0FLDI ZL,LOW(ASCTAB*2)LDI,ZH,HIGH(ASCTAB*2)ADD ZL,R16LPM R16,ZPUSH R16IN R16,SPLSBCI R16,2OUT SPL,R16RETASCTAB:.DB $30,$31,$39.DB $41,$42,$463.8.6 代码转换子程序BCD
12、码(Binary-Coded Decimal),用二进制编码的十进制代码。这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷地进行。这种编码技巧,最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用 最常用的BCD编码,就是使用“0”至“9”这十个数值的二进码来表示。常称之为“8421码”。 补充知识1、 16位二进制数转换成BCD码程序功能: 将(r17:r16) 中16位二进制转换成
13、 BCD 码, 个、十、百、千和万位分别存放于 r16, r17, r18, r19和r20中程序思想: (r17:r16)10000 够减 X 次, 则万位为 X; 差值1000 够减 Y 次; 则千位为 Y;差值100 够减 Z 次; 则百位为 Y;差值10 够减 U 次; 则十位为 U;最后的差值为个位程序清单:b16td5: ser r20 ;r20 先送 -1 loop1: inc r20 ;r20 增 1 subi r16,low(10000) ;(r17:r16)10000 sbci r17,high(10000) brcc loop1 ;够减则返回 loop1 subi r16
14、,low(-10000) ;不够减,加10000 恢复余数 sbci r17,high(-10000)程序清单: ;(Continued) ser r19 ;r19 先送 -1 loop2: inc r19 ;r19 增 1 subi r16,low(1000) ;(r17:r16)1000 sbci r17,high(1000) brcc loop2 ;够减则返回 loop2 subi r16,low(-1000) ;不够减,加1000 恢复余数 sbci r17,high(-1000)程序清单: ;(Continued) ser r18 ;r18 先送 -1 loop3: inc r18
15、;r18 增 1 subi r16,low(100) ;(r17:r16)100 sbci r17,high(100) brcc loop3 ;够减则返回 loop3 subi r16,low(-100) ;不够减,加100 恢复余数 sbci r17,high(-100) 程序清单: ;(Continued) ser r17 ;r17 先送 -1 loop4: inc r17 ;r17 增 1 subi r16,10 ;(r17:r16)10 brcc loop4 ;够减则返回 loop4 subi r16,-10 ;不够减,加10 恢复余数 ret ;至此,r16即为个位2、 5位BCD码
16、转换成16位二进制数程序功能: 将个、十、百、千和万位分别放在r16, r17, r18, r19和r20中的5位BCD 码(r16r20高4位为0000)转换成16位二进制, 存放于(r17:r16) 中转换公式为: (r17:r16)= r16+10*r17+100*r18+1000*r19+10000*r20程序清单:d5tb16: tst r17 ;测试 r17 rjmp d5tb16_2 d5tb16_1: subi r16,-10 ;r16 加 10,不会发生进位dec r17 ;r17 减 1 d5tb16_2: brne d5tb16_1 ;非 0 转 d5tb16_1程序清单
17、: ;(Continued) tst r18 ;测试 r18 rjmp d5tb16_4 d5tb16_3: subi r16,low(-100) ;(r17:r16)加 100 sbci r17,high(-100) dec r18 ;r18 减 1 d5tb16_4: brne d5tb16_3 ;非 0 转 d5tb16_3 程序清单: ;(Continued) tst r19 ;测试 r19 rjmp d5tb16_6 d5tb16_5: subi r16,low(-1000) ;(r17:r16)加 1000 sbci r17,high(-1000) dec r19 ;r19 减 1
18、 d5tb16_6: brne d5tb16_5 ;非 0 转 d5tb16_5程序清单: ;(Continued) tst r20 ;测试 r20 rjmp d5tb16_8 d5tb16_7: subi r16,low(-10000) ;(r17:r16)加 10000 sbci r17,high(-10000) dec r20 ;r20 减 1 d5tb16_8: brne d5tb16_7 ;非 0 转 d5tb16_7 ret3、 5位压缩BCD码转换成16位二进制数压缩BCD码与非压缩BCD码的区别:压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如1001011
19、0B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的00001001表示09.例如00001000B表示十进制数8 程序功能:将五位压缩BCD码转换为16位二进制。五位压缩BCD码存于r18:r17:r16 (r18 高四位为 0), 二进制存放于(r17:r16) 程序思想: 先将压缩 BCD 码转换为 BCD 码, 放到 r16(个)、r17(十)、r18(百)、r19(千)、r20(万) 5个字节中, 再调用d5tb16子程序即可程序清单:yd5tb16: mov r20,r18 ;取出万位 mov r19,r17 ;令 r19=r17 mov
20、r18,r17 ;令 r18=r17 mov r17,r16 ;令 r17=r16 andi r16,$0f ;取出个位 andi r17,$f0 swap r17 ;取出十位 andi r18,$0f ;取出百位 andi r19,$f0 swap r19 ;取出千位 rcall d5tb16 ;调用d5tb16五位BCD到16位二进制的转换 ret 3.8.7 运算程序设计加减运算程序设计1、无符号多字节加减运算程序16位加法add16: add r16,r18 ; r17:r16+r19:r18r17:r16 adc r17,r19 ret16 位带立即数加法addi16: subi r
21、16,low(-addi2) ;无立即数(字节)加法 ; r17:r16+addi2 r17:r16 sbci r17,high(-addi2) ;addi2 为 16 位立即数ret16位减法sub16: sub r16,r18 ; r17:r16-r19:r18r17:r16 sbc r17,r19 ret16 位带立即数减法subi16: subi r16,low(subi2) ; r17:r16-subi2 r17:r16 sbci r17,high(subi2) ;subi2 为 16 位立即数ret16位比较cp16: cp r16,r18 ; r17:r16 与 r19:r18
22、相比较 cpc r17,r19ret16 位带立即数比较cpi16: cpi r16,low(cp2) ; r17:r16 与 16 位立即数 cp2 相比较 ldi r18, high(cp2) cpc r17,r18ret16位取补程序 (求补码方法:取反后再加1)beg16: com r16 ;r17:r16 取补并回存 (先取反) com r17 subi r16,low(-1) ;再加1(通过减去-1实现) sbci r17,high(-1) ret32位加法程序ADD32: ;32 位加法程序 ADD R16,R20 ADC R17,R21 ADC R18,R22 ADC R19,
23、R23ret32位带立即数加法程序SUBI32: ; SUBI R16,low(-data) SBCI R17,high (-data) SBCI R18,byte3 (-data) SBCI R19,byte4 (-data)ret 32位减法程序SUB32: ;32 位减法程序 SUB R16,R20 SBC R17,R21 SBC R18,R22 SBC R19,R23ret2、带符号加减运算程序例:16位二进制符号数(补码表示)加法R17:R16 + R20:R19 R18:R17:R16思路:先扩展为3字节,再加SADD16:TST R17BRMI NT1CLR R18RJMP NE
24、XT1NT1:LDI R18,$FFNEXT1:TST R20BRMI NT2CLR R21RJMP NEXT2NT2: SER R21NEXT2:ADD R16,R19ADC R17,R20ADC R18,R21RET综合例题: 动态扫描五位数码管显示静态显示 1 位数码需占 8 位口(包括小数点),要显示 5 位数码需 40 位输出口,这显然是不实用的。为了节省输出口,可采用动态扫描方式,显示五位数码只需 13 位输出口电路如下图,B 口作字线, D 口低 5 位作位线,动态扫描显示五位数码,利用人眼的视觉暂留效应,可看到稳定的数字程序:16位二进制数(r17:r16)转换为5位BCD码(
25、个万位分别存于r18r22),并用数码管显示.include 8535def.inc .org $0000 rjmp reset tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f reset: ldi r16,low(ramend) ;栈指针置初值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定义 PB PD 为输出口 out ddrb,r16 out ddrd,r16 ldi r16,$ff ;设待显示数为$ffff(即65535) ldi r17,$ff rcall b16td5 ;调二转十子程见 4.3.1 mov r22,r20 ;将 BCD 码送 r18r22 m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026北科大招聘面试题及答案
- 2025年中国玻璃纤维格栅土工布市场调查研究报告
- 2025年中国烤漆面油墨市场调查研究报告
- 2025年中国润滑油专用滤油机市场调查研究报告
- 2025年中国汽车铸造部件市场调查研究报告
- 2025年中国拆托槽钳市场调查研究报告
- 2025年中国乔其市场调查研究报告
- 《传感器与检测技术》课件 第十章光纤传感器
- 机械产品数字化设计 课件 模块三项目九零件工程图绘制
- 排痰护理中的呼吸肌训练
- 钢筋混凝土蓄水池施工方案
- 掘进机的维护保养
- 挤压模具抛光培训
- 软件合同技术协议模板3篇
- (高清版)DB41∕T 1640-2018 桥(门)式起重机司机实际操作考试细则
- 高三化学一轮复习 物质的分离提纯 课件
- T-CRHA 046-2024 标准手术体位安置技术规范
- (正式版)FZ∕T 80014-2024 洁净室服装 通 用技术规范
- (正式版)QB∕T 4900-2024 超级电容器纸
- 纺织非遗:让世界读懂中国之美智慧树知到期末考试答案章节答案2024年天津工业大学
- 侵犯隐私权起诉状范本
评论
0/150
提交评论