AVR程序释疑.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR程序释疑

把寄存器R0~R29置$FF,把SRAM $0060 ~ $006F单元清0, 把$0070~$007F单元置$FF, 把$0080~$008F单元分别设置为0~F.includem8def.inc;包含m8def.inc文件.org $0000 ;代码起始端定位rjmp MAIN ;跳转到主程序.equ data1=$00ff ;设置符号项等于一个表达式.org $0013 ;代码段定位,跳过中断向量区MAIN:;初始化堆栈指针,对所有带SRAM的AVR单片机,堆栈指针必须设置在SRAM最后的地址ldi r16,high(RAMEND) ;取 RAMEND 的高位字节到r16out SPH,r16 ;将RAMEND的高位送堆栈寄存器SP高位字节中ldi r16,low(RAMEND) ;取 RAMEND 的低位字节到r16out SPL,r16 ;将RAMEND的低位送堆栈寄存器SP低位字节中;把寄存器R0~R29置0xFFLdi r16,low(data1) ;取data1的低位字节到r16part1:st z+,r16 ;加载间接寻址数据,然后地址加一,即(Z) ←Rr, Z ← Z + 1。Z的初始指向是R0cp r29,r16 ;比较,r29-r16brne part1 ; 如果不相等,转到part1;把SRAM 0x60 ~ 0x6F单元清0。为什么这里的X寄存器需要分高位和低位?.set datad=$0060 ;设置一个与表达式值相等的符号,能在后面的程序中重新改变设置.set datau=$006fldi r30,high(data1) ;取data1的高位字节到r30,r30是Z寄存器低字节ldixl,low(datad) ;取datad低位字节到X寄存器低字节,就是r26ldixh,high(datad) ;取datad高位字节到X寄存器高字节,就是r27ldi r16,low(datau) ;取datau的低位字节到r16part2:cp xl,r16 ;比较xl和r16st x+,r30 ;以间接寻址方式存储数据,然后地址加一,(X) ←Rr, X ← X + 1brne part2 ;如果不相等转到part2;把0x70~0x7F单元置0xFF.set datad=$0070.set datau=$007fldi r31,low(data1) ;R31是Z寄存器高字节,纯粹用作数据寄存,因为R0~R29已被设置了ldiyl,low(datad)ldiyh,high(datad)ldi r17,low(datau)part3:cp yl,r17st y+,r31brne part3;nop;0x80~0x8F单元分别设置为0~F .set datad=$0080.set datau=$0090Ldi r16,$00 ldizl,low(datad)ldizh,high(datad)ldi r17,low(datau)part4:st z+,r16 ;加载间接寻址数据,然后地址加一,即(Z)←Rr, Z ← Z + 1。Z的初始地址是R0inc r16 ;r16←r16+1cp zl,r17brne part4;nophere: rjmp here把SRAM地址为$0060开始的256个单元内容依次复制到地址为$0100开始的单元(注意两数据区有部分重叠)includem8def.inc.org $0000rjmp MAIN.set srm1=$0160 ;注意这是十六进制.set srm2=$0200.org $0013MAIN:;初始化堆栈指针ldi r16,low(ramend)out spl,r16ldi r16,high(ramend)out sph,r16;设置指针地址ldizl,low(srm1)ldizh,high(srm1)ldixl,low(srm2)ldixh,high(srm2)ldi r16,-1 ;因为立即数最大只能设255,要复制256个数据,只能初始设为-1rcall subroutinehere: rjmp here;调用子程序完成复制subroutine:ld r0,-z ;地址减一后加载间接寻址数据Z ← Z - 1, R0 ← (Z).;为什么减一呢,因为复制的数据有重叠,为了完整复制,就从末尾往前,避免遗失数据。st -x,r0 ;地址减一后以间接寻址方式存储数据X ← X - 1, (X) ← R0inc r16cpi r16,255brne subroutineret把Flash程序存储器中地址为0

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档