收藏 分销(赏)

AVR单片机4_20100326.ppt

上传人:pc****0 文档编号:13745360 上传时间:2026-04-08 格式:PPT 页数:35 大小:161KB 下载积分:10 金币
下载 相关 举报
AVR单片机4_20100326.ppt_第1页
第1页 / 共35页
AVR单片机4_20100326.ppt_第2页
第2页 / 共35页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,AVR,单片机原理及应用,陈渊睿,Tel:13002086301,E-mail:,ep02,华南理工大学电力学院,第四章,汇编语言程序设计,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,声明,E,2,PROM,段,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,&,逐位与,8,双目运算符,两个表达式值之间逐位与,17,逐位异或,7,双目运算符,两个表达式值之间逐位异或,18,|,逐位或,6,双目运算符,两个表达式值之间逐位或,19,&,逻辑与,5,双目运算符,两个表达式值之间逻辑与,,全非,0,则为,1,,否则为,0,20,|,逻辑或,4,双目运算符,两个表达式值之间逻辑或,,非,0,则为,1,,全,0,为,0,4.2,简单与分支程序设计,4.2.,1,简单程序设计,也称,顺序程序,或,直接程序,.include,“,m8def.inc,”,ldi,xl,$61,ldi,xh,$00,lds,r16,$0060,mov,r17,r16,andi,r16,$0f,ori,r16,$30,st,x+,r16,swap r17,andi,r17,$0f,ori,r17,$30,st,x+,r17,here:,rjmp,here,.exit,4.2.,1,分支程序设计,又称,散转程序,.include,“,m8def.inc,”,.SET VAR=0X0070,.SET FUNC=0X0071,.ORG$000,RJMP MAIN,.ORG 0X0013,MAIN:LDS R16,VAR,TST R16,BREQ DONE,BRPL POSI,LDI R16,$FF;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+addi2 r17: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-subi2 r17: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,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服