《AVR单片机》PPT课件.ppt

上传人:san****019 文档编号:17253129 上传时间:2020-11-16 格式:PPT 页数:35 大小:258.76KB
返回 下载 相关 举报
《AVR单片机》PPT课件.ppt_第1页
第1页 / 共35页
《AVR单片机》PPT课件.ppt_第2页
第2页 / 共35页
《AVR单片机》PPT课件.ppt_第3页
第3页 / 共35页
点击查看更多>>
资源描述
AVR单片机原理及应用 陈渊睿 Tel: 13002086301 E-mail: 华南理工大学电力学院 第四章 汇编语言程序设计 4.1 汇编语言基础 汇编语言 源文件 是由汇编语言代码和汇编 程序指令所组成的 ASCII 字符文件。 汇编语言源文件包括 指令助记符 、 标号 和 伪指令 。指令助记符和伪指令常带 操作数 4.1.1 汇编 语句格式 程序输入行有下列种形式: 【标号】伪指令【操作数】【注释】。 【标号】指令【操作数】【注释】。 注释。 空行。 例子: Label: .EQU Var1=100 ;置 Var1 等于 100 伪指令 .EQU Var2=200 ;置 Var2 等于 200 test: rjmp test ;无限循环指令 ;纯注释行 注意:不限制有关标号伪指令注释或指令的 列位置 4.1.2汇编器伪指令 伪指令 并不直接转换成操作数,而是用于调整存储 器中程序的位置,定义宏,初始化存储器等 伪指令表 序号 伪指令 说 明 序号 伪指令 说 明 1 BYTE 在 RAM中定义预留存储单元 10 EXIT 退出文件 2 CSEG 声明代码段 11 INCLUDE 包含指定的文件 3 DB 定义字节常数 12 MACRO 宏定义开始 4 DEF 定义寄存器符号名 13 ENDMACRO 宏定义结束 5 DEVICE 指定为何器件生成汇编代码 14 LISTMAC 列表宏表达式 6 DSEG 声明数据段 15 LIST 列表文件生成允许器 7 DW 定义字常数 16 NOLIST 关闭列表文件生成 8 EQU 定义标识符常量 17 ORG 设置程序起始位置 9 ESEG 声明 E2PROM段 18 SET 赋值给标识符 表达式 汇编器的表达式 由操作数、运算符和函数组成。 所有的表达式内部为 32位 (二进制 ) 操作数 (1)用户定义的标号,该标号给出了放置标号位置的 定位计数器 的值 (2)用户用 SET伪指令定义的变量 (3)用户用 EQU伪指令定义的常数 (4)整数常数,包括下列几种形式 十进制缺省值 10 255 十六进制数二进制表示法 0 x0a,$0a,0 xff.$ff 二进制数 0b00001010,0b11111111 (5)PC, 程序存储器定位计数器的当前值 汇编器的函数 (而非单片机内的函数 ) 有 LOW、 HIGH、 BYTE2、 BYTE3 汇编器所认的运算符 部分运算符表 序 号 运算符 名 称 优先级 说 明 1 ! 逻辑非 14 单目运算符,表达式是 0则返回 1, 表达式是 1则返回 0 2 逐位非 14 单目运算符,将表达式的值按位取反 3 - 负号 14 单目运算符,使表达式为算术负 4 * 乘法 13 双目运算符,两个表达式相乘 5 / 除法 13 双目运算符,左边表达式除以右边表达式, 得整数的商值 6 + 加法 12 双目运算符,两个表达式相加 7 减法 12 双目运算符,左边表达式减去右边表达式 8 右移 11 双目运算符,左边表达式值右移右边表达式给出的次数 10 小于 10 双目运算符,左边带符号表达式值小于 右边带符号表达式值,则为 1,否则为 0 11 大于 10 双目运算符,左边带符号表达式值大于 右边带符号表达式值,则为 1,否则为 0 13 = 大于等于 10 双目运算符,左边带符号表达式值大于或 等于右边带符号表达式值,则为 1,否则为 0 14 = 等于 9 双目运算符,左边带符号表达式值等于 右边带符号表达式值,则为 1,否则为 0 15 != 不等于 9 双目运算符,左边带符号表达式值不等于 右边带符号表达式值,则为 1,否则为 0 16 R16 -1 RJMP DONE POSI:LDI R16,$01 DONE:STS FUNC,R16 HERE: RJMP HERE .EXIT 4.3 循环与查表程序设计 4.3.1 循环程序设计 例 4.9:已知 SRAM ADDR($0062)为起始地址的数据块的数 据是 无符号数 ,块长在 LEN($0061)单元。求最大值并存 入 MAX($0060)单元 .include “ m8def.inc” .SET LEN=$0061 .SET ADDR=$0062 .SET MAX=$0060 .ORG $000 RJMP START .ORG 0X0013 START:LDS R20,LEN CLR R16 LDI XL,LOW(ADDR) LDI XH,HIGH(ADDR) LOOP: LD R18,X+ CP R18,R16 BRCS NEXT ;BRLO MOV R16,R18 NEXT: DEC R20 BRNE LOOP STS MAX,R16 here: rjmp here .exit 例 4.9 :已知 SRAM ADDR($0062)为起始地址的 数据块的数据是 符号数 ,块长在 LEN($0061)单元。 求最大值并存入 MAX($0060)单元 .include “ m8def.inc” .SET LEN=$0061 .SET ADDR=$0062 .SET MAX=$0060 .ORG $000 RJMP START .ORG 0X0013 START:LDS R20,LEN LDI R16,$80 LDI XL,LOW(ADDR) LDI XH,HIGH(ADDR) LOOP: LD R18,X+ CP R18,R16 BRLT NEXT MOV R16,R18 NEXT: DEC R20 BRNE LOOP STS MAX,R16 here: rjmp here .exit 4.3.2 查表程序设计 用于 不便于计算的函数 (如平方、立方、三角函数 )、 固定的 编码 (如 ASCII码、数码管显示 )等,表格存于 FLASH中,用 LPM指令来取出对应项的值 例:设 SRAM的 0 x60开始的 40个单元字节存放有 40个取值为 0 9的二进制整数。将它们求平方值后存放到 SRAM的 0 x100开始的存储区。 .include “ m8def.inc” rjmp Main Tab: .db 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 Main: ldi yl, 0 x00 ;SRAM存储基址 ldi yh, 0 x01 ldi xl, 0 x60 ;SRAM取数基址 ldi xh, 0 x00 ldi r18, 40 ;计数用 loop: ld r16, x+ ;从 SRAM取数,地址增 1 ldi zl, low(Tab*2) ldi zh, high(Tab*2) clr r17 add zl, r16 adc zh,r17 lpm ;查平方值 st y+, r0 ;保存到 SRAM 并且地址增 1 dec r18 ;计数减 1 brne loop ;未查完,循环 HERE: RJMP HERE .EXIT 例 4.13:已知 SRAM中起始地址为 BLOCK1的数据块(其长 度存放在 LEN单元),每个存储单元中高、低 4位为两个十 六进制数,将它们转换为 ASCII码后存放在 BLOCK2开始的 连续存储单元。 .include “ m8def.inc” .SET LEN=$0060 .SET BLOCK1=$0061 .SET BLOCK2=$0168 .ORG $000 RJMP MAIN .ORG 0X0013 MAIN: LDS R25,LEN LDI 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 R18 LD R17,X ANDI R17,$0F ADD ZL,R17 ADC ZH,R18 LPM R17,Z ST Y+,R17 LD R17,X+ ANDI R17,$F0 SWAP R17 LDI ZL,LOW(ASTAB*2) LDI ZH,HIGH(ASTAB*2) ADD ZL,R17 ADC ZH,R18 LPM R17,Z ST Y+,R17 DEC R25 BRNE LOOP HERE:RJMP HERE ASCTAB:.DB $30,$31, ,$39 .DB $41,$42, ,$46 4.4 代码转换与子程序设计 4.4.1 子程序设计 子程序:完成确定任务、反复调用 入口地址(第一条指令地址,常用标号) 返回( RET) 状态保护 (如 SREG等 ) 参数传递 (R0R31,或者堆栈方式 ) 例 4.15 SRAM中 HEX单元的两个十六进制数,分别转 成 ASCII码存入 ASC和 ASC+1单元 .INCLUDE “ M8DEF.INC” .SET HEX=$0060 .SET ASC=$0061 LDI R17,LOW(RAMEND) OUT SPL,R17 LDI R17,HIGH(RAMEND) OUT SPH,R17 LDS R16,HEX PUSH R16 RCALL HASC POP R16 STS ASC,R16 LDS R16,HEX SWAP R16 PUSH R16 RCALL HASC POP R16 STS ASC+1,R16 HERE:RJMP HERE HASC:POP R16 POP R16 POP R16 ANDI R16,$0F LDI ZL,LOW(ASCTAB*2) LDI,ZH,HIGH(ASCTAB*2) ADD ZL,R16 LPM R16,Z PUSH R16 IN R16,SPL SBCI R16,2 OUT SPL,R16 RET ASCTAB:.DB $30,$31,$39 .DB $41,$42,$46 4.4.2代码转换子程序 BCD码 (Binary-Coded Decimal),用二进制编码 的十进制代码。这种编码形式 利用了四个位元来 储存一个十进制的数码 ,使二进制和十进制之间 的转换得以快捷地进行。这种编码技巧,最常用 于会计系统的设计里,因为会计制度经常需要对 很长的数字串作准确的计算。相对于一般的浮点 式记数法,采用 BCD码,既可保存数值的精确度, 又可免却使电脑作浮点运算时所耗费的时间。此 外,对于其他需要高精确度的计算, BCD编码亦 很常用 最常用的 BCD编码,就是使用“ 0” 至“ 9” 这十 个数值的二进码来表示。常称之为“ 8421码”。 补充知识 1、 16位二进制数转换成 BCD码 程序功能 : 将 (r17:r16) 中 16位二进制转换 成 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,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 ;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位二进制数 程序功能 : 将个、十、百、千和万位分别放 在 r16, r17, r18, r19和 r20中的 5位 BCD 码 ( r16 r20高 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 程序清单 : ;(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 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 ret 3、 5位压缩 BCD码转换成 16位二进制数 压缩 BCD码与非压缩 BCD码的区别:压缩 BCD码 的每一位用 4位二进制表示, 一个字节表示两位十 进制数 。例如 10010110B表示十进制数 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 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 4.5 运算程序设计 4.5.1 加减运算程序设计 1、无符号多字节加减运算程序 16位加法 add16: add r16,r18 ;r17:r16+r19:r18r17:r16 adc r17,r19 ret 16 位带立即数加法 addi16: subi r16,low(-addi2) ;无立即数 (字节 )加法 ;r17:r16+addi2r17:r16 sbci r17,high(-addi2) ;addi2 为 16 位立即数 ret 16位减法 sub16: sub r16,r18 ; r17:r16-r19:r18r17:r16 sbc r17,r19 ret 16 位带立即数减法 subi16: subi r16,low(subi2) ; r17:r16-subi2r17:r16 sbci r17,high(subi2) ;subi2 为 16 位立即数 ret 16位比较 cp16: cp r16,r18 ; r17:r16 与 r19:r18 相比较 cpc r17,r19 ret 16 位带立即数比较 cpi16: cpi r16,low(cp2) ; r17:r16 与 16 位立即数 cp2 相比较 ldi r18, high(cp2) cpc r17,r18 ret 16位取补程序 (求补码方法:取反后再加 1) beg16: com r16 ;r17:r16 取补并回存 (先取反 ) com r17 subi r16,low(-1) ;再加 1(通过减去 -1实现) sbci r17,high(-1) ret 32位加法程序 ADD32: ;32 位加法程序 ADD R16,R20 ADC R17,R21 ADC R18,R22 ADC R19,R23 ret 32位带立即数加法程序 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,R23 ret 2、带符号加减运算程序 例: 16位二进制符号数(补码表示)加法 R17:R16 + R20:R19 R18:R17:R16 思路:先扩展为 3字节,再加 SADD16: TST R17 BRMI NT1 CLR R18 RJMP NEXT1 NT1:LDI R18,$FF NEXT1:TST R20 BRMI NT2 CLR R21 RJMP NEXT2 NT2: SER R21 NEXT2:ADD R16,R19 ADC R17,R20 ADC R18,R21 RET
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!