avr汇编百例 晋级篇 参考程序
AVR指令表
(-2K 28KB)(-2K 28KB) 执行同功能的程序 8MHzAVR 224MHz C5不再有作废的产品; 不需要5分钟的紫外线擦除时间;再也用不着因为掩模而无法入睡了;没有10周订货交货时间; 添加新特性易如反掌;容易调试;容易在线升级,几秒钟搞定;AVR指令表2000/5耿德根编数据传送指令位指令和位测试指令MOV Rd,Rr寄存器拷贝LSL Rd逻辑左移LDI Rd,K装入立即数LSR Rd逻辑右移LDS Rd,K直接从SRAM装入ROL Rd通过进位左循环LD Rd,X X变址间接装入R ROR Rd通过进位右循环LD Rd,X+X变址ASR Rd算术右移LD Rd,-X X变址SWAP s半字节交换LD Rd,Y Y变址BSET s置状态寄存器的位LD Rd,Y+Y变址BCLR s SREG中的位清除LD Rd,-Y Y变址SBI P,b置I/O寄存器的位LDD Rd,Y+q Y变址间接装入R CBI P,b清I/O寄存器的位LD Rd,Z Z变址BST Rr,b R中位到SREG中T标志LD Rd,Z+Z变址BLD Rd,b SREG中T标志到R某位LD Rd,-Z Z变址SEC置位进位标志LDD Rd,Z+q Z变址CLC清除进位标志STS K,Rr R数据直接送SRAM SEN置位负数标志ST X,Rr X变址间接装入SRAM CLN清除负数标志ST X+,Rr X变址SEZ置位零标志ST-X,Rr X变址CLZ清零标志位ST Y,Rr Y变址SEI置位全局中断标志ST Y+,Rr Y变址CLI清除全局中断标志ST-Y,Rr Y变址SES置位符号标志STD Y+q,Rr变址间接装入SRAM CLS清除符号标志ST Z,Rr Z变址SEV置位溢出标志位ST Z+,Rr Z变址CLV清除溢出标志ST-Z,Rr Z变址SET置位T标志STD Z+q,Rr Z变址CLT清除T标志LPM装入程序存储器SEH置位半进位标志IN Rd,P I/O口数据装入到R CLH清除半进位标志OUT P,Rr寄存器数据送I/O口NOP空操作PUSH Rr压寄存器到堆栈SLEEP休眠POP Rd堆栈弹出到寄存器WDR看门狗复位汇编器伪指令(伪指令前必须加“ ..” ).BYTE-- 保存寄节到变量.CSEG-- 代码段.DB-- 字节常数.EXIT-- 退出文件.DEF-- 设置寄存器的符号名.INCLUDE--包括号外的文件.DEVICE--定义被汇编的器件.LIST-- 打开列表文件生成器.DSEG-- 数据段.LISTMAC--打开宏表达式.DW-- 字常数.MACR O-- 宏开始.ENDMACRO--宏结束.NOLIST-- 关闭列表文件生成器.EQU-- 设置符号相等于一个表达式.ORG-- 设置程序起始位置.ESEG-- EPROM段.SET-- 设置一个与表达式相等的符号A VR ICE200在线仿真器双龙电子为中国大陆总代理ICE200可仿真的器件为A T90S1200/2313/2333/4433/4414/8515/4434/8535及A Ttiny10/11/12由于仿真器的电源不对外所以ICE200也支持低电压器件A T90S I/O空间定义十六进制地址名称AT90SMEG103名称AT90S1200名称AT90S8515功能(对应8515名称,*为对应MEG103)$3F($5F)SREG SREG SREG状态寄存器$3E($5E)SPH SPH堆栈指针高$3D($5D)SPL SPL堆栈指针低$3C($5C)XDIV XTAL分频控制器 *$3B($5B)RAMPZ GIMSK GIMSK通用中断屏蔽寄存器$3A($5A)EICR GIFR通用中断标态寄存器$39($59)EIMSK TIMSK TIMSK定时器/计数器中断屏敝寄存器$38($58)EIFR TIFR TIFR定时器/计数器中断标志寄存器$37($57)TIMSK定时器/计数器中断屏敝寄存器 * $36($56)TIFR定时器/计数器中断标志寄存器 * $35($55)MCUCR MCUCR MCUCR MCU通用控制寄存器$34($54)MCUSR MCU通用控制寄存器 *$33($53)TCCR0TCCR0TCCR0定时器/计数器0控制寄存器$32($52)TCNT0TCNT0TCNT0定时器/计数器0(8位)$31($51)OCR0定时器/计数器0输出比较寄存器 * $30($50)ASSR异步方式状态寄存器 *$2F($4F)TCCR1A TCCR1A定时器/计数器1控制寄存器A$2E($4E)TCCR1B TCCR1B定时器/计数器1控制寄存器B$2D($4D)TCNT1H TCNT1H定时器/计数器1高字节$2C($4C)TCNT1L TCNT1L定时器/计数器1低字节$2B($4B)OCR1AH OCR1AH定时器/计数器1输出比较寄存器A高字节$2A($4A)OCR1AL OCR1AL定时器/计数器1输出比较寄存器A低字节$29($49)OCR1BH OCR1BH定时器/计数器1输出比较寄存器B高字节$28($48)OCR1BL OCR1BL定时器/计数器1输出比较寄存器B低字节$27($47)ICR1H定时器/计数器1输入捕获寄存器高字节 * $26($46)ICR1L定时器/计数器1输入捕获寄存器低字节 * $25($45)TCCR2ICR1H T/C1输入捕获寄存器高字节$24($44)TCNT2ICR1L T/C1输入捕获寄存器低字节$23($43)OCR2定时器/计数器2输出比较寄存器 * $22($42)$21($41)WDTCR WDTCR WDTCR看门狗定时控制寄存器$20($40)$1F($3F)EEARH EEARH EPROM地址寄存器高字节$1E($3E)EEARL EEAR EEARL EPROM地址寄存器低字节$1D($3D)EEDR EEDR EEDR EPROM数据寄存器$1C($3C)EECR EECR EECR EPROM控制寄存器$1B($3B)PORTA PORTA A口数据寄存器$1A($3A)DDRA DDRA A口数据方向寄存器$19($39)PINA PINA A口输入脚$18($38)PORTB PORTB PORTB B口数据寄存器$17($37)DDRB DDRB DDRB B口数据方向寄存器$16($36)PINB PINB PINB B口输入脚$15($35)PORTC PORTC C口数据寄存器$14($34)ODRC C口数据方向寄存器$13($33)PINC C口输入脚$12($32)P0RTD PORTD PORTD D口数据寄存器$11($31)DDRD DDRD DDRD D口数据方向寄存器$10($30)PIND PIND PIND D口输入脚$0F($2F)SPOR SPOR SPI I/O数据寄存器$0E($2E)SPSR SPSR SPI状态寄存器$0D($2D)SPCR SPCR SPI控制寄存器$0C($2C)UDR UDR UART I/O数据寄存器$0B($2B)USR USR UART状态寄存器$0A($2A)UCR UCR UART控制寄存器$09($29)UBRR UBRR UART波特率寄存器$08($28)ACSR ACSR ACSR模拟比较控制和状态寄存器$07($27)ADMUX ADC多路选择寄存器 *$06($26)ADCSR ADC状态和控制寄存器 *$05($25)ADCH ADC数据寄存器高 *$04($24)ADCL ADC数据寄存器低 *$03($23)PORIE E口数据寄存器 *$02($22)DDRE E口数据方向寄存器 *$01($21)PINE E口输入脚 *$00($20)PINF F口输入脚 *复位和中断向量向量号程序地址源源中断定义1$000/RESET/RESET硬件脚和看门狗复位2$001INT0INT0外部中断请求03$002INT1INT1外部中断请求14$003TIMER1 CAPT TIMER1 CAPT定时器/计数器1捕获事件5$004TIMER1 COMPA TIMER1 COMPA定时器/计数器1比较匹配A6$005TIMER1 COMPB TIMER1 COMPB定时器/计数器1比较匹配B7$006TIMER1 OVF TIMER1 OVF定时器/计数器1溢出8$007TIMER0 OVF TIMER0 OVF定时器/计数器0溢出9$008SPI,STC SPI,STC串行传送完成10$009UART,RX UART,RX UART,RX完成11$00A UART,UDRE UART,UDRE UART数据寄存器空12$00B UART,TX UART,TX UART,TX完成13$00C ANA_COMP ANA_COMP模拟比较器OK-AVR万用串行下载开发实验板OK-AVR万用串行下载开发实验板,采用双龙电子公司的专利技术(专利号:98226094.6),是为ATMEL公司的AVR单片机特别研制的廉价的万用串行下载开发实验工具该板适用于ATMEL公司所有具有串行下载功能的AVR单片机,同时还可做AVR单片机的I/O口A/D D/A音频输出等实验本公司随机提供了ATMEL的集成模拟仿真调试软件,对初学AVR 单片机的设计者,可暂时节省购买较昂贵的实时仿真器及万用编程器的费用; OK-AVR万用串行下载开发实验板有CZ1电源及通讯下载用插座,LED电源指示,下载通讯工作指示;附AVR单片机8根下载信号线; AVR单片机四种DIP封装器件下载锁紧插座;WR划线电位器可作为模拟信号输入用,有音响器,另有用户器件扩展区,焊接你实验需要的器件;AVR集成软件包包括: AVR Assembler 1.30编译器; AVR Studio 3.00; AVR Prog;送一片AT90S1200单片机及集成软件AVR单片机数据资料OK-AVR下载开发实验板使用说明等光盘AVR单片机可下载器件:90S120090S231390S2323/90LS232390S2343/90LS234390S2333/90LS233390S4433/90LS443390S441490LS851590S4434/90LS443490S8535/90LS853590S8555ATtiny10/11/12/15MEGA103/603/161/163(适用所有串行下载信号线的AVR单片机)。
AVR汇编百例 - 实用程序
;范例19 ;等步距线性内插计算子程序.EQU TBLGTH=10CHETA: LDI R16,TBLGTH-1 ;r16<--表长(即字数)-1LDI R31,HIGH(chtbl*2);y0(函数初值)在r14r15,STEP(步长)在r10r11,自变量X 在r12r13LDI R30,LOW(chtbl*2+1);查表指针,首指数据表第1字之高位字节!RCALL CPMR1 ;X与表中第一个字型数据(X0)比较BRCC CHRET ;X<X0 查表结束,Y=Y0CHET1: RCALL CMPR1 ;X与表中下一个数据比较BRCC NX33 ;X<X(i+1) 找到插值区间ADD R15,R11 ;否则Y0中加入一个STEP:Yk=Y0+k*step(步距为负时则;减去|STEP|)ADC R14,R10DEC R16BRNE CHET1 ;未查到表格终值,循环;否则结束,Y取得最大值Yn CHRET: RETNX33: SBIW R30,5 ;指针退回(-5),指向XiMOV R8,R14MOV R9,R15 ;保存Y0+i*STEPRCALL SUBS ;(X-Xi)-->r16r17MOV R15,R17MOV R14,R16 ;转入r14r15RCALL MUL16 ;(X-Xi)*STEP-->r12r13r14r15MOV R10,R12MOV R11,R13 ;保存乘积高位字LPM ;X(i+1)低位字节MOV R13,R0ADIW R30,1LPM ;X(i+1)高位字节MOV R12,R0SBIW R30,3 ;指针指向XiRCALL SUBS ;X(i+1)-Xi-->r16r17MOV R12,R10MOV R13,R11 ;取回乘积高位字MOV R10,R16MOV R11,R17 ;X(i+1)-Xi-->r10r11RCALL DIV165 ;(X-Xi)*STEP/[X(i+1)-Xi]-->r14r15ADD R15,R9ADC R14,R8 ;Y0+i*STEP+(X-Xi)*STEP/[X(i+1)-Xi]-->r14r15RET ;若STEP为负值则改为计算(r8r9)减去(r14r15)之值CMPR1: LPM ;取数据高位字节ADIW R30,2 ;指向下一数据的高位字节CP R0,R12 ;与X高位字节相比较BRNE CPRT1 ;不相等即转出SBIW R30,3 ;否则调整指针LPM ;取数据低位字节ADIW R30,3 ;指向下一数据的高位字节CP R0,R13 ;与X低位字节相比较CPRT1: RET ;以进位C带回比较结果SUBS: LPM ;计算(X-Xi)或[X(i+1)-Xi]并送入r16r17MOV R5,R0 ;取Xi低位字节ADIW R30,1LPM ;取Xi高位字节SBIW R30,1 ;仍指向Xi低位字节SUB R13,R5MOV R17,R13SBC R12,R0MOV R16,R12 ;计算差并将其转入R16R17RET;自变量x表长为12字CHTBL:DW 19214,23404,27600,32799,37009,40211,45414,48618,51821,55029,57787,60070 ;步距表长为11字STEPT: DW 356,366,379,395,415,440,471,509,555,603,657;不等步距线性内插计算子程序,步距表首址在R6R7中;自变量X在R12R13之中,函数初值Y0在R14R15中;范例20 ;表长(字个数)-1在R16中CHTSTP: LDI R31,HIGH(chtbl*2)LDI R30,LOW(chtbl*2+1);查表指针LDI R16,LOW(stept*2)MOV R7,R16LDI R16,HIGH(stept*2)MOV R6,R16 ;步距表指针LDI R16,TBLGTH-1 ;r16<--表长(字个数)-1RCALL CMPR1 ;X与表首数据比较BRCC CHSTPT ;X<X0 查表结束,有Y=Y0CHSTP1: RCALL CMPR1 ;否则与表中下一数据比较BRCC CHSTP3 ;X<X(i+1),找到插值区间!RCALL GTSTP ;查表取STEP字型变量ADD R15,R11 ;Y0<--Y0+STEPkADC R14,R10DEC R16BRNE CHSTP1 ;未查到表格终值循环;否则结束,Y取得最大值Yn CHSTPT: RETCHSTP3: SBIW R30,5 ;指针退回,指向Xi低位字节MOV R8,R14MOV R9,R15 ;Y0+∑STEPk送入r14 r15RCALL SUBS ;(X-Xi)->r16r17MOV R14,R16 ;(X-Xi)转入R14R15RCALL GTSTP ;查表取STEPi-->R10R11RCALL MUL16 ;(X-Xi)*STEPi-->R12R13R14R15MOV R10,R12MOV R11,R13 ;保存积高位字LPMMOV R13,R0ADIW R30,1LPMMOV R12,R0SBIW R30,3RCALL SUBS ;(X(i+1)-Xi)-->r16 r17MOV R12,R10MOV R13,R11MOV R10,R16MOV R11,R17 ;取回积高位字&(X(i+1)-Xi)-->r10r11RCALL DIV165 ;(X-Xi)*STEPi/[X(i+1)-Xi]-->r14r15ADD R15,R9 ;ADC R14,R8 ;Y0+∑STEPk+(X-Xi)*STEPi/[X(i+1)-Xi]-->r14r15 RETGTSTP: MOV R5,R6 ;查取STEP字型变量/POINTER in r6r7!MOV R6,R30MOV R30,R5MOV R5,R7MOV R7,R31MOV R31,R5 ;(r6r7)<-->ZLPMMOV R11,R0ADIW R30,1LPMMOV R10,R0 ;STEPk取到r10r11ADIW R30,1MOV R5,R6MOV R6,R30MOV R30,R5MOV R5,R7MOV R7,R31MOV R31,R5 ;指针增2后送回r6r7RET;范例21 ;功能表程序FUNC2: LDS R16,$A3 ;use r0,r8,r9,r10,r11,r16&r17/& subprogram dspa SBR R16,$80 ;功能表程序标志LDI YH,2LDI YL,0 ;功能内容表SRAM地址RCALL FLFUNC ;CLR r27!LDI R16,2ST X,R16 ;显示'FUNC.2'RCALL DL2SCLR R9 ;功能内容寻址偏移量R9!CLR R8 ;功能名称寻址偏移量(R8)=(r9)*3FFUNC0: RCALL DSF_ ;显示'F- 'FF0: RCALL DSPA ;in subprogram dspy clr. r27!CPI R16,11 ;回车键按下?BRNE FF2PFF0C: RCALL COMBNO ;合成功能名称送入r16 CPI R16,20 ;是最后一个功能名称?BRNE FF1CLR R9 ;是,两偏移量初始化!CLR R8FF1: LDI ZH,HIGH(FTABL*2)LDI ZL,LOW(FTABL*2);功能名称表指针ADD ZL,R8ADC ZH,R27 ;(r27)=0 ALWAYSLPMMOV R16,R0RCALL BRA3A ;分解新功能名称到$6E/$6FFF0G: LDI R28,0ADD R28,R9 ;功能内容指针加偏移量LD R16,YLDI R26,$72RCALL BRAX ;将新功能内容分解到$72/$73FF0A: RCALL DSPA ;显示新功能名称/内容CPI R16,11BRNE FF0B ;回车键按下?INC R8INC R8INC R8 ;是,功能名称寻址偏移量加3INC R9 ;功能内容寻址偏移量加1RJMP FF0C ;转回FF2P: RJMP FF2FF0B: CPI R16,10BRNE FF0DRCALL DSF_ ;清除键按下,清除显示区后,显示‘F-’FF1B: RCALL DSPACPI R16,11BREQ FF1 ;转恢复当前显示CPI R16,10BRCC FF1BRJMP FF2D ;只有数字键按下才转出去处理FF0D: CPI R16,10BRCC FF0AFF1D: LDI R17,$24 ;STS $73,R17 ;数字键处理,先在缓存区内放一空白FF0E: LDS R17,$73STS $72,R17 ;键入数字左移STS $73,R16 ;存入新数字FF0F: RCALL DSPACPI R16,10BREQ FF0G ;清除键按下,恢复显示旧功能内容BRCS FF0E ;键入数字左移更新CPI R16,11BRNE FF0FLDS R26,$72 ;回车键按下RCALL COMBA ;合成新功能内容(combin $72&$73 into binary(r16)) MOV R17,R8INC R17LDI ZH,HIGH(FTABL*2)LDI ZL,LOW(FTABL*2)ADD ZL,R17 ;取当前功能内容下限ADC ZH,R27FF1F: LPMCP R16,R0BRCS DSER2 ;新功能内容小于下限,错误INC R17LDI ZH,HIGH(FTABL*2)LDI ZL,LOW(FTABL*2)ADD ZL,R17 ;取当前功能内容上限ADC ZH,R27LPMCP R0,R16BRCS DSER3 ;新功能内容大于上限,错误FF7: LDI R28,0ADD R28,R9 ;功能内容表首地址为$200!ST Y,R16 ;合法的新功能内容进入功能内容表INC R9INC R8INC R8INC R8 ;调整偏移量,进入下一个功能显示RJMP FF0CFF1P: RJMP FF1DSER2: RCALL FERR2 ;显示'F Err.2'2秒RCALL EXCH0RJMP FF0G ;恢复原数据显示DSER3: RCALL FERR3 ;显示'F Err.3'2秒RCALL EXCH0RJMP FF0G ;恢复原数据显示FF2: CPI R16,10BRCS FF2D ;功能键按下,转初始RJMP FF0FF2D: LDI R17,$24 ;数字键按下,在显示缓存区内左移STS $6F,R17 ;FF3: LDS R17,$6FSTS $6E,R17STS $6F,R16FF4: RCALL DSPACPI R16,10BRNE FF41RCALL DSF_ ;清除数字,显示‘F-’FF40: RCALL DSPACPI R16,11BREQ FF1P ;转回显示当前功能名称及内容CPI R16,10BRCC FF40 ;无效键按下,转回RJMP FF2D ;否则转数字处理FF41: BRCS FF3CPI R16,11BRNE FF4RCALL COMBNO ;合成新功能名称CLR R10 ;功能名称偏移量计数器清除CLR R11 ;功能内容偏移量计数器清除SFFLP: LDI ZH,HIGH(FTABL*2)LDI ZL,LOW(FTABL*2)ADD ZL,R10ADC ZH,R27LPMCP R0,R16 ;BREQ SFFND ;在功能名称表中找到新名称INC R11 ;INC R10INC R10INC R10 ;调整偏移量LDI R17,60CP R10,R17 ;功能名称指针偏移量超过59?BRCS SFFLP ;否,继续查功能名称表RCALL FERR1 ;查完功能名称表未查到键入功能名称!RJMP FFUNC0 ;转回恢复原显示SFFND: MOV R9,R11 ;得到功能内容指针偏移量MOV R8,R10 ;得到功能名称指针偏移量RJMP FF0G ;转显示新功能名称及内容FTABL: .DB 1,0,1,2,1,8,3,0,2,4,0,1 5,1,2,6,0,4,7,1,4,8,1,2,9,2,7,10,1,5,11,1 .DB 5,12,0,5,13,1,2,14,1,7,15,1,10,16,1,4,17,2,4,18,2,5,19,1,2,20,1,3 COMBNO: LDI XL,$6E ;取$6E$6F中的BCD码,合成新功能名称子程序COMBA: LD R16,X+CPI R16,$24BRNE CMBACLR R16CMBA: MOV R0,R16LSL R16LSL R16ADD R16,R0LSL R16 ;高位BCD乘10LD R0,XADD R16,R0 ;加低位BCDRETDSF_: RCALL FIL8 ;准备显示'F- 'LDI R16,$0FSTS $6C,R16LDI R16,$14STS $6D,R16RETBRA3A: LDI XL,$6E ;二进制数转换为两位BCD码并显示BRAX: LDI R17,$24 ;十位为0时显示空白ST X,R17BRHOUR: CLR R0 ;BRX0: SUBI R16,10 ;减10BRCS BRX2INC R0RJMP BRX0BRX2: SUBI R16,-10 ;不够减恢复出十位BCDTST R0BREQ BRX1ST X,R0 ;放入显示区BRX1: INC R26ST X,R16BRART: RETFERR1: LDI XL,$71 ;显示'F Err.1'LDI R16,1ST X,R16RJMP FER123FERR2: RCALL MOVE1 ;显示'F Err.2' LDI R16,2STS $71,R16RJMP FER123FERR3: RCALL MOVE1 ;显示'F Err.3' LDI R16,3STS $71,R16FER123: LDI XL,$6CLDI R16,$0FST X+,R16LDI R16,$24ST X+,R16LDI R16,$0EST X+,R16LDI R16,$1BST X+,R16LDI R16,$3BST X+,R16 ;显示'F Err.1/2/3'LDI R16,$24 ;2秒STS $72,R16STS $73,R16RCALL DL2SRETFIL8: LDI R26,8 ;将显示缓存区充空白MOV R10,R26LDI R26,$6CCLR R27LDI R16,$24FILP: ST X+,R16DEC R10BRNE FILPRETFLFUNC: RCALL FIL8 ;准备显示'Func.' LDS R26,$6CLDI R16,$0F ;'F'ST X+,R16LDI R16,$1E ;'u'ST X+,R16LDI R16,$17 ;'n'ST X+,R16LDI R16,$40 ;'c.'ST X+,R16RETEXCH0: LDI ZL,$14 ;将显示缓存区内容转移$6C-$73<-->$214-$21B LDI ZH,2LDI XL,$6CEXL: LD R16,XLD R17,ZST X+,R17ST Z+,R16CPI R26,$74BRNE EXLRETMOVE1: LDI ZL,$14 ;将显示缓存区内容传送到$214-$21BLDI ZH,2LDI XL,$6CMV1: LD R16,X+ST Z+,R16CPI R26,$74BRNE MV1RET;范例22 ;读出EEPROM子程序REEP: LDI YH,1LDI YL 0 ;EEPROM 读出首地址:$100LDI XL,$60 ;读出数据存放首地址:$60CLR XHREEP1: SBIC $1C,1 ;查EEWE位,EEWE=1为当前尚有写入操作未结束RJMP REEP1 ;等待EEWE=0OUT $1F,YHOUT $1E,YL ;读出地址写入EEPRO地址寄存器SBI $1C,0 ;设置读出使能位(EERE)IN R16,$1D ;从EEPROM数据寄存器中读出数据ST X+R16 ;存入缓存区INC YLBRNE REEP1 ;INC YHCPI YH,2 ;EEPROM最末数据(地址为$1FF)读完?BRNE REEP1RET;范例23 ;写入EEPROM子程序WEEP: LDI YH,1LDI YL 0 ;EEPROM 写入之首地址:$100LDI XL,$60 ;写入数据存储区首地址:$60CLR XHWEEP1: SBIC $1C,1 ;查EEWE位,EEWE=1为当前尚有写入操作未结束RJMP WEEP1 ;等待EEWE=0OUT $1F,YHOUT $1E,YL ;送写入地址到EEPRO地址寄存器LD R16,X+ ;取写入数据并调整数据指针OUT $1D,R16 ;送到EEPROM数据寄存器SBI $1C,2 ;设置EEPROM写入总使能位EEMWESBI $1C,1 ;设置EEPROM写入使能位EEWEINC YLBRNE WEEP1INC YHCPI YH,2 ;EEPROM最末写入单元地址为$1FFBRNE WEEP1RET。
嵌入式系统入门—03—AVR的指令与汇编系统
数据优化
合理使用寄存器和内存,减少数据传输开销。
并行处理
利用AVR的并行处理能力,实现多任务并发 执行。
性能评估与优化建议
性能评估
通过性能测试和基准测试,评估程序的执行效率和性能。
优化建议
根据性能评估结果,提出针对性的优化建议,如采用更高效的算法、优化数据结构等。
THANKS FOR WATCHING
来执行这组指令。
宏展开
02
在宏定义后,可以使用宏展开将宏符号替换为相应的指令序列。
宏参数
03
在宏定义中可以定义参数,并在宏展开时将参数替换为相应的
值。
汇编语言程序结构
程序入口
程序从入口点开始执行,通常在程序的开头定义入口点。
程序主体
程序主体包含程序的逻辑和算法,由一系列指令和数据组成。
程序结束
程序结束时需要返回操作系统或返回到调用程序中。
控制流类指令
用于控制程序的流程,如JMP、CALL、RET等。
02 AVR指令详解
数据传输指令
数据传输指令用于在寄存器和内存之 间、寄存器和寄存器之间传输数据。
例如:MOV, LDS, STS等指令可以实 现数据的传输。
算术指令
算术指令用于执行加、减、乘、除等 算术运算。
例如:ADD, SUB, MUL, 语言的基础,汇编语言是使用助记 符表示机器指令的符号化语言。
指令集与机器码
指令集最终被转换为机器码,由计算机硬件执行。
AVR指令集的特点
精简高效
AVR指令集设计简洁,功能强大,适用于嵌入式系统。
丰富的寻址模式
AVR指令集支持多种寻址模式,如直接寻址、间接寻 址、相对寻址等,方便编程。
VR虚拟现实-AVR汇编百例 晋级篇 参考程序 精品
; 以下提供几个补充参考程序,都带有详细说明和指令注释.它们是主从多机通讯程序,采;用中断方式写入EEPROM,直接对晶振分频产生0.1秒和秒号的精确定时程序,以及RS-232/ ;RS-485标准转换程序,A VR频率计程序,串行时锺日历芯片DS1302读写,共享时基的PWM 输出、;输入捕获测周期程序和定时信号获取,以及DS18B20测温等程序.多机通讯主要用8和9位数;据模式区分被选分机(9位)和其它分机(8位),达到主机只与被选分机交换数据之目的.以中;断方式写EEPROM的优点是可与系统运行同时进行(即在线写入),占用很少机时.;精确定时用定时/计数器1(或0)直接对MCU主频(不设分频)设定时间常数,分频精度可达到;1HZ.RS-232/RS-485标准转换程序中AVR不作中转,使两种器件相关脚位直接连接.以TT0 ;定时,以T0引脚接收RS-232数据.以收到RS-232字符起始位下跳沿或结束符($03)为依据, ;控制切换RS-485的收发使能.(系统中的主A VR可兼做对通信标准之监控转换,即只是在完成;主要工作任务的同时'附带'进行).具体过程不再细述.串行时锺日历芯片DS1302具体积小, ;可靠性高,与单片机连接方便等优点.; 以下程序请参看有关章节或程序中的注释。
;范例91 ;多机通讯主机程序/晶振4MHZ.ORG 0 ;以8/9位数据模式区分被选/未被选分机通讯.EQU DTPINT=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ;主机对1#,2#,3#,4#分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BFSTRT38: RJMP RST38 ;主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF.ORG $00B ;RJMP STRT38.ORG $00CRJMP STRT38 ;主机不设串口中断,只以查询接收.ORG $011RST38: LDI R16,12OUT UBRR,R16 ;设波特率:[BAUD RATE=FCP/16(UBRR+1)]CLR R15 ;初始化分机号LDI R27,HIGH(DTPINT)LDI R26,LOW(DTPINT);发送数据指针(首指$180)LDI R29,HIGH(DRPINT)LDI R28,LOW(DRPINT);接收数据指针(首指$1C0)NEXTNO: LDI R16,$18OUT UCR,R16 ;允许UART接收和发送,8位数据模式INC R15 ;指向1#分机OUTLP: OUT UDR,R15 ;呼分机号,1:1#/2:2#/03:3#/04:4#...TSLOP: IN R16,USRSBRS R16,7RJMP TSLOP ;分机返回机号?IN R16,UDRCP R16,R15 ;分机号正确返回?BRNE OUTLPLDI R16,$1C ;改为9位数据模式TXB8=0OUT UCR,R16 ;TXLOP: LD R16,X+OUT UDR,R16 ;向分机发送数据块TESTL: IN R17,USRSBRS R17,5RJMP TESTL ;等待发送完成CPI R16,$0ABRNE TXLOP ;RXTST: IN R17,USRSBRS R17,7 ;RXC=1 收到数据RJMP RXTST ;等待接收分机返回数据块IN R16,UDRST Y+,R16 ;存储接收数据CPI R16,$0A ;分机数据块发完?BRNE RXTSTMOV R16,R15CPI R16,4 ;与分机轮询通讯完毕?BRNE NEXTNO ;未完转对下一分机通信HH38: RJMP HH38 ;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询).DSEG.ORG $180DTPINT:.BYTE $40;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;$42 $4F $66 $78 $47 $45 $44 $63 $32 $48 $60 $7C $6D $45 $0D $0A;$43 $56 $55 $53 $4D $4F $40 $2E $31 $42 $67 $4C $47 $4A $0D $0A;$45 $54 $59 $63 $3D $4B $48 $2F $35 $48 $69 $3C $77 $43 $0D $0A.ORG $1C0DRPINT:.BYTE $40;范例92.ORG 0 ;多机通讯1#分机程序/晶振4MHZ.EQU DTPIT1=$180 ;(UBRR)=12 波特率为19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT39: RJMP RST39.ORG $00BRJMP UARXC ;8535UART接收完成中断.ORG $00CRJMP UATXC ;UART发送完成中断.ORG $011RST39: CLR R18 ;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7) LDI R16,12OUT UBRR,R16 ;设波特率[BAUD RATE=4000000/16*(12+1)=19200]LDI R16,HIGH(DRPNT1)MOV R8,R16LDI R16,LOW(DRPNT1)MOV R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0)LDI R16,$98 ;允许UART中断接收,8位数据模式OUT UCR,R16SEIRXDTS: SBRS R18,6 ;主机呼号已收到(若收到,在R17中)?RJMP RXDTSOUT UDR,R17 ;返还该机号TXDON: IN R16,USRSBRS R16,5RJMP TXDON ;该机号发送完成?LDI R16,$9C ; 允许UART中断接收,9位数据模式,TXB8=0OUT UCR,R16RCVBLK: SBRS R18,7RJMP RCVBLK ;主机发来数据块已接收完毕?LDI R16,HIGH(DTPIT1)MOV R6,R16LDI R16,LOW(DTPIT1)MOV R7,R16 ;设发送数据指针r6r7,首指$180LDI R16,$3C ;允许UART中断发送,9位数据模式,TXB8=0OUT UCR,R16TXDN: SBIC UCR,5RJMP TXDN ;发送完毕?RJMP RST39 ;:UART中断接收程序UARXC: SBIC USR,4RETI ;祯错误(主机正与其它分机进行9位数据模式通信),不予接收IN R14,SREG ;保存当前状态TST R18BREQ NUMB ;(R18)=0时收到数据,只可能是机号,转去核实PUSH R16 ;否则为主机向本分机发来数据块(9位模式,机号已符合)PUSH R26PUSH R27IN R17,UDR ;接收数据MOV XH,R8MOV XL,R9 ;取接收数据指针ST X+,R17 ;转入RAMMOV R8,XHMOV R9,XL ;存数据指针CPI R17,$0A ;是数据块结束符LF?BRNE RS1SBR R18,$80 ;收到完整数据块标志RS1: POP R27POP R26POP R16DRETI: OUT SREG,R14RETINUMB: IN R17,UDR ;取出数据CPI R17,1 ;是1#分机?2#分机与$02比较/3#分机与$03比较...BRNE DRETI ;机号不符合,转!SBR R18,$40 ;建机号符合标志RJMP DRETI; UART中断发送程序UA TXC: PUSH R16 ;r6 r7:发送数据指针,首指$180IN R16,SREGPUSH R16PUSH R26PUSH R27MOV XH,R6MOV XL,R7 ;取出发送指针LD R16,X+ ;取数据,调指针MOV R6,XHMOV R7,XLOUT UDR,R16 ;送入发送寄存器CPI R16,$0ABRNE SDCBI UCR,5 ;发送最后1个字符后,禁止发送寄存器空中断(CLR UDRIE) LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;接收数据指针初始化(POINT TO $1C0)SD: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPIT1:.BYTE $40.ORG $1C0DRPNT1:.BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;范例93;以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,;并可在线写入;运作过程特点如下:;(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位;(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成;(3)本程序为一写入特例,写入地址为$100--$1FF,可作适当修改(如设块长计数器等);(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序;(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分. STWEEP: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,LOW(ramend)OUT SPL,R16SBI EECR,3 ;设置EEPROM就绪(ready)中断使能位SEI ;中断总使能RJMP SRTW.ORG $00FRJMP EEPRDY ;8535 EEPROM就绪(ready)中断向量SRTW: LDI YH,1LDI YL 0 ;EEPROM 写入首地址:$100LDI XL,$60 ;欲写入数据块首地址:$60CLR XHWEEP0: SBIC EECR,1 ;当前有EEPROM写入操作,有则等待写入完成RJMP WEEP0RCALL WREEP ;写入第一个字节,($60)->$100,写入完成后,EEWE=0时引发EEPROM就绪中断INC YL ;调整写入地址指针HHWEEP: TST YLBRNE HHWEEPCPI YH,2 ;写入地址达到$200后,写入完成BRNE HHWEEPCBI EECR,3 ;禁止EEPROM就绪(ready)中断WDON: RJMP WDON ;踏步EEPRDY: IN R6,SREGPUSH R16RCALL WREEP ;写入一个字节INC YLBRNE WRETIINC YH ;EEPROM末地址为$1FFWRETI: POP R16OUT SREG,R6RETIWREEP: OUT EEARH,YH ;OUT EEARL,YL ;写入地址送入EEARLD R16,X+ ;取数据,调指针OUT EEDR,R16 ;数据写入EEPROM数据寄存器SBI EECR,2 ;设置EEPROM写入总使能位EEMWESBI EECR,1 ;设置EEPROM写入使能位EEWERET;范例94 ;精确定时产生0.1秒信号;用定时/计数器1定时,不分頻定出0.1秒信号,由PC5脚输出正脉冲。
AVR汇编运算
sub16: sub r16,r18 ; r17:r16-r19:r18 r17:r16
sbc r17,r19
;******************************************************************************
步的处理
4.2.1 乘法运算子程序
列出了 mpy8u 8 位*8 位无符号乘法 mpy8 s 8 位*8 位带符号乘法 mpy 16u 16 位
*16 位无符号乘法 mpy 16s 16 位*16 位带符号乘法 mpy32u 32 位*32 位无符号乘法
;******************************************************************************
32 位运算与 16 位运算相似 例 32 位加法程序和 32 位减法程序如下
是整数运算程序 另外 定点数又可分为无符号数和有符号数 无符号数是明确为正数的数
其符号省略了 带符号数可能是正数 也可能是负数 一般负数以补码表示 最高位为符号位
整数乘以 10-n 或 2-n 来表示 例 十进制数 12.56=1256*10-2
十六进制数 1A.F8=1AF8*2 - 16
这样 可以将定点数先按整数运算 最后再考虑小数点的位置 所以下面所讲的程序主要
dec r19 ;循环计数器减 1
brne m8u_1 ; 如没完成 再循环
ret
4.2.1.2 mpy8s 8 位*8 位带符号乘法
1 程序功能 r1 6 (被乘数) *r17(乘数) r18 r17( 结果)
addi16: subi r16,low(-addi2) ; r17:r16+addi2 r17:r16
20个简单汇编语言程序 -回复
20个简单汇编语言程序-回复简明了解汇编语言,让我们先了解一下汇编语言的基本概念和特点。
汇编语言是一种低级语言,用于与计算机硬件进行沟通和交互,它是由一系列指令组成的。
与高级语言相比,汇编语言更加接近计算机的硬件和操作,因此它的指令更直观,更加底层。
下面我们来看一下20个简单的汇编语言程序:1. [将两个数相加并存储到一个寄存器中]2. [将两个数相加并存储到内存中]3. [将一个寄存器的值存储到内存中]4. [从键盘输入一个数并存储到内存中]5. [从内存中读取一个数并输出到屏幕上]6. [将两个寄存器的值进行逻辑与操作]7. [将两个寄存器的值进行逻辑或操作]8. [将两个寄存器的值进行逻辑非操作]9. [将一个寄存器的值左移一位]10. [将一个寄存器的值右移一位]11. [将一个寄存器的值加一]12. [将一个寄存器的值减一]13. [将一个寄存器的值与一个常数相加]14. [将一个寄存器的值与一个常数进行逻辑与操作]15. [将一个寄存器的值与一个常数进行逻辑或操作]16. [将一个寄存器的值与一个常数进行逻辑非操作]17. [将一个寄存器的值与一个常数左移一位]18. [将一个寄存器的值与一个常数右移一位]19. [将一个寄存器的值与一个常数进行加一]20. [将一个寄存器的值与一个常数进行减一]现在,我们将一步一步地回答这个问题,写一篇1500-2000字的文章,帮助读者更好地理解这些汇编语言程序。
第一步:介绍汇编语言在这一步,我们将介绍汇编语言的基本概念、应用领域和优缺点。
我们将解释汇编语言与高级语言之间的区别,并讨论为什么学习汇编语言对于理解计算机系统和进行底层开发非常重要。
第二步:汇编语言基础知识在这一步,我们将介绍汇编语言的基本知识和概念。
我们将解释什么是指令、寄存器、内存等,并讨论它们在汇编语言中的作用和用法。
第三步:编写简单的汇编语言程序在这一步,我们将逐个介绍这20个简单的汇编语言程序,并提供详细的说明和示例代码。
AVR 100个汇编范例
SBC R16,R9
RCALL SUDAA
MOV R13,R16
MOV R16,R12
SBC R16,R8
RCALL SUDAA
ADLOP: LD R16,-X ;X-1指向被加数;
LD R6,-Y ;Y-1指向加数
ADC R16,R6
RCALL ADDAA ;相加后调整
ST X,R16 ;返还调整后结果
RET ;否则返回
LDI R17,255
SUB R13,R17
SBC R12,R17 ;以减去-1($FFFF)替代加1
RET
RET
;范例2
SUDAA: BRCC SBD1 ;bcd码减法调整子程序,差在R16中
BRHC SBD3
SUBI R16,$66 ;进位半进位都置位,将差减去立即数$66
DEC R7
BRNE ADLOP
RET
;范例6
SUBCD4: MOV R16,R15 ;4字节压缩bcd码减法子程序
SUB R16,R11 ;R12,R13,R14,R15内为被减数,R8,R9,R10,R11内为减数
SUBLP: LD R16,-X ;X-1指向被减数
LD R6,-Y ;Y-1指向减数
SBC R16,R6
RCALL SUDAA ;相减后调整
ST X,R16 ;返还调整后结果
;范例10 ;32位被除数/16位除数-->16位商,精确到1
DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15
DLOOP: LSL R15
AVR汇编指令
AVR汇编指令AVR指令算术指令:加法(4)ADD Rd,Rr (Rd)<- (Rd)+(Rr);d,r =【0-31】ADC Rd,Rr (Rd)<- (Rd)+ (Rr)+ C ;d,r =【0-31】ADIW Rdl,K (Rdh:Rdl)<- (Rdh:Rdl)+K ;d =【24,26,28,30】K =【0-63】INC Rd (Rd)<- (Rr)+ 1 ;d =【0-31】减法(6)SUB Rd,Rr (Rd)<- (Rd)- (Rr);d,r =【0-31】SUBI Rd,K (Rd)<- (Rd)- K ;d =【16-31】K =【0-255】SBC Rd,Rr (Rd)<- (Rd)- (Rr)- C ;d,r =【0-31】SBCI Rd,K (Rd)<- (Rd)- K - C ;d =【16-31】K =【0-255】 SBIW Rdl,K (Rdh:Rdl)<- (Rdh:Rdl)- K ;d=【24,26,28,30】 K =【0-63】DEC Rd (Rd)<- (Rr)- 1 ;d =【0-31】乘法(1)MUL Rd,Rr (R1)<-H(Rd*Rr)(R0)<-L(Rd*Rr);d,r =【2-31】逻辑运算与(4)AND Rd,Rr (Rd)<- (Rd)&(Rr);d,r =【0-31】ANDI Rd,K (Rd)<- (Rd)& K ;d =【16-31】K =【0-255】CBR Rd,K (Rd)<- (Rd)& (FF- K);d =【16-31】K=【0-255】 TST Rd (Rd)<- (Rd)&(Rr);d =【16-31】Z标记位或(4)OR Rd,Rr (Rd)<- (Rd)|(Rr);d,r =【0-31】ORI Rd,K (Rd)<- (Rd)| K ;d =【16-31】K =【0-255】SBR Rd,K (Rd)<- (Rd)| K ;d =【16-31】K =【0-255】SER Rd (Rd)<- FF ;d =【16-31】异或(2)EOR Rd,Rr (Rd)<- (Rd)⊕(Rr);d,r =【0-31】CLR Rd (Rd)<- 00 ;d =【0-31】⽐较(3)CP Rd,Rr (Rd)- (Rr);d,r =【0-31】CPI Rd,K (Rd)- K ;d =【16-31】K =【0-255】CPC Rd,Rr (Rd)- (Rr)- C ;d,r =【0-31】取反(1)COM Rd (Rd)<- FF -(Rd);d =【0-31】取补(1)NEG Rd (Rd)<- 00 -(Rd);d =【0-31】⽆条件跳转(3)RJMP K (PC)<- (PC)+1+K ;K =【-2k - 2k】IJMP (PC)<- (Z);Z : 16BITJMP K (PC)<- K ;K =【0-4M】条件跳转(20)BRBS S , K BRBC S , K 状态寄存器判断位;S =【0-7】K =【-64,63】BREQ K BRNE K 为零标记不为零BRIE K BRID K 全局中断开关BRTS K BRTC K 标记位为零BRHS K BRHC K 半进位置位为零BRGM K BRLT K 带符号⼤于等于⼩于BRSH K BRLO K ⽆符号⼤于等于⼩于BRCS K BRCC K 进位置位为零BRVS K BRVC K 补码溢出置位为零BRMI K BRPL K 负数正数条件跳⾏(5)CPSE Rd,Rr 相等时跳⾏;d,r =【0-31】SBRS Rd,b 该为置位时跳⾏;d =【0-31】S =【0-7】 SBRC Rd,b 该为零时跳⾏;d =【0-31】S =【0-7】SBIC P,b 该为零时跳⾏;P =【0-31】S =【0-7】 SBIS P,b 该为置位时跳⾏;P =【0-31】 S =【0-7】调⽤(5)RCALL K (PC)<- (PC)+1+K ;K =【-2k - 2k】ICALL 跳转到Z指向地址;16 bitCALL K 0-4MRET ⼦程序返回RETI 中断返回栈(2)PUSH Rd 进⼊堆栈;d =【0-31】POP Rd 出栈;d =【0-31】直接数据传送(4)MOV Rd,Rr (Rd)<-(Rr);d,r =【0-31】LDS Rd,K (Rd)<-(K);d =【0-31】STS K,Rd (K)<-(Rd);d =【0-31】LDI Rd,K (Rd)<- K ;d =【16-31】K =【0-255】间接数据传送(22)X寄存器:LD Rd,X (Rd)<-((X));d =【0-31】LD Rd,X+ (Rd)<-((X)),(X)+=1 ;d =【0-31】LD Rd,-X (X)- =1,(Rd)<-((X));d =【0-31】ST X,Rd ((X))<-(Rd);d =【0-31】ST X+,Rd ((X))<-(Rd),(X)+=1 ;d =【0-31】ST -X,Rd (X)- =1,((X))<-(Rd);d =【0-31】Y寄存器:LD Rd,YLD Rd,Y+LD Rd,-YLDD Rd,Y+Q (Rd)<-((Y+Q));d =【0-31】Q =【0-63】 ST Y,RdST Y+,RdST -Y,RdSTD Y+Q,RdZ寄存器:LD Rd,ZLD Rd,Z+LD Rd,-ZLDD Rd,Z+QST Z,RdST Z+,RdST -Z,RdSTD Z+Q,Rd寻址(1)LMP 利⽤Z寄存的地址寻址(注意lsb位要为0读低8位数1读⾼8位数)I/O⼝(2)IN Rd,P (Rd)<- (P);d =【0-31】 P =【0-63】 OUT P,Rd (P)<- (Rd);d =【0-31】 P =【0-63】移位(6)LSL Rd (Rd)<<1, C<-MSB ,LSB<-0 ;d =【0-31】LSR Rd (Rd)>>1, C<-LSB ,MSB<-0 ;d =【0-31】ROL Rd (Rd)<<1 ,LSB<-C , C<-MSB ;d =【0-31】ROR Rd (Rd)>>1 ,MSB<-C , C<-LSB ;d =【0-31】SWAP Rd 半字节交换;d =【0-31】ASR Rd 7位不变,其余右移 , C<-LSB ;d =【0-31】T标记位(2)BLD Rd,b 将位读⼊T标记;d =【0-31】 b =【0-7】BST Rd,b 将T标记写⼊位;d =【0-31】 b =【0-7】状态位设置(20)BSET S BCLR S 设置状态寄存器指定位; S =【0-7】SEI CLI 状态标记设置或清除SEH CLHSET CLTSES CLSSEN CLNSEV CLVSEZ CLZSEC CLCSBI P,b CBI P,b 32IO⼝指定位设置清楚;P =【0-31】 b =【0-7】其他WDR 看门狗复位SLEEP 休眠NOP 空指令。
AVR学习大全
写在前面的话大家好!初次见面请多关照。
欢迎大家来到羽良,这是一个充满阳光,聚集智慧,共享求职经验的平台。
感谢您的参与,在这里,您可以认识更多新的朋友,衷心祝愿大家能够和我们共同度过一段美好的学习时光。
在这个嵌入式产业群雄争霸的今天,不懂单片机对于一个工科学生来说无疑是一场输在起跑线上的比赛。
我们希望的是每个工科生都可以熟练掌握它,这样可以给成功天平的一侧添加厚重的砝码。
但是我们不赞成趋之若鹜,一切以兴趣为出发点。
首先,我觉得有必要介绍羽良,这样便于大家了解自己学习环境,以及自己所处的高度。
2007年——在摧残式教育和掠夺式启发依然横行的年份,本着自由呼吸大学空气的念头,李雨轩,梁冲,程戎翰,刘培勋童鞋“究天人之际,通古今之变”,创立了羽良。
作为羽良的鼻祖,他们经历了创业之苦。
没有空间,他们与学校争取,经过多次的唾沫横飞,争取到了大家现在看到的实验室(江湖传言程童鞋打开门的一刻留下了一克拉的眼泪,hold不住了)。
经费不足,大家共同解决,从一穷二白到现在的物质比较丰富。
代代羽良人秉承“坚持不懈,自力更生”的理念,锻炼自己,建设团队。
从这里走出了一批又一批优秀的职场达人。
这就是平台的力量!!!接着,大家看到的学习板是一个叫刘宇龙的大童鞋,在一个蛋疼的中午绘制的学习图,并联系工厂制版的结果。
它以ATmega16为基础,外设了N多个设备(相当给力啊),便于大家的学习与进一步深入。
让大家在自主学习的同时巩固自己的课本知识,一举两得。
这样学习有高屋建瓴的感觉。
进而,大家看到的资料是三个牺牲国庆陪mm时间的大二孩纸(伤不起)钻在工作室里纠结反应后的结果。
资料里有各位同学需要学习的课程以及对这款单片机的详细介绍,还有一些内部程序资料(谢绝外传)。
资料是为了广大学员在寝宫里便可以学习,一方面便于复习和预习,另一方面便于学员的自主深入学习。
我们坚信实践才是对理论的升华,以及对能力的提高的唯一途径。
所以我们大家只要是有时间就练习,这样进步的很快(谦孩纸的经验)。
AVR单片机汇编语言编程实验报告
AVR单片机汇编语言编程实验学院:自动化专业:测控技术与仪器一、实验名称:AVR单片机汇编语言编程实验二、实验目的:熟悉并掌握AVR单片机指令系统、汇编语言常用伪指令,掌握单片机汇编语言编程技术,编程实现指定功能,加深对计算机汇编指令的理解。
三、实验仪器:计算机,VMware,Windows7虚拟机,AtmelStudio开发环境,Proteus仿真开发环境四、实验内容、实验过程及结果分析:1. Flash 单元赋值创建汇编语言工程,目标机型选为Mega128。
使用汇编语言伪指令进行编程,将下述32 字节的常数数据存入首地址为$0160 的连续flash 存储单元照片中。
数据如下:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x070x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7;0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf80x80,0x90,0x88,0x83,0xc6,0xa,0x86,0x8e;前后16 字节分别是字符0-F 对应的共阴极和共阳极LED 数码管的字形显示段码。
随后使用IDE 自带的调试工具,进入debug 调试。
在调试过程中,在Flash 存储器映像中查找上述存入的数据块所对应的地址,记录Flash 存储器映像。
图1.1.0如图1所示,数据3f的首地址为$002C0的内存单元中,为$的二倍,因此说明数据成功存入该段存储单元2. DATA RAM 内存块赋值使用汇编语言指令,将上述存储在 Flash 中的 32 个字节单元的数据块依次赋值给起始地址为$0230 的 SRAM 内存块的相应内存单元,流程如图2.1.0 所示。
图2.1.0寄存器初始状态如图2.2.0所示。
将Z指针指向先前第一位数据的首地址,并进行一个次数为16的循环,通过LPM指令将储存在Flash中16字节的数据拷贝至起始地址为$0230的内存单元中,如图2.2.1所示,数据存储状态如2.2.3 所示。
单片机汇编语言经典一百例
51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。
用汇编语言编写AVR单片机程序入门教程
用汇编语言编写AVR单片机程序入门教程作者:伟纳电子 Gguoqing原文发表在伟纳电子论坛:/forum_view.asp?forum_id=25&view_id=54381.硬件准备实验系统:ME300全系列单片机开发板。
实验芯片: ATmega8515L或Atmega8515。
2.软件准备AVRStudio V4.11 AVRStudio 是一个完整的开发工具,包括编辑、仿真功能,利用这个工具我们可以编辑源程序代码,并在AVR器件上运行。
ME300_V3.1版控制软件/down_view.asp?id=315上述软件有收录在ME300随机光盘中3.AVR 汇编语言学习环境的建立安装AVRStudio和ME300_V3.1版控制软件。
1)创建一个新项目:打开AVR Studio软件,选择“Project”菜单中的“New project”命令,弹出下面窗口。
这里新建一个名为work1的项目。
并在“Location”栏目中确定存放文件的路径与相应的文件夹。
点击“Finish”存盘后出现下面界面。
2)编辑汇编源程序:用汇编语言编写的源程序如下:;8只LED的跑马灯演示程序.INCLUDE "8515DEF.INC" ;CPU配置文件.ORG $0000RJMP RESET ;上电复位跳转到主程序.ORG $0013 ;代码段定位,跳过中断区RESET:LDI R16,LOW(RAMEND) ;设置堆栈指针OUT SPL,R16LDI R16,HIGH(RAMEND)OUT SPH,R16LDI R16,0B11111111 ;设置PA口为输出端口OUT DDRA,R16START:LDI R17,0B11111110 ;PA0输出低电平,LED0亮。
OUT PORTA,R17LDI R16,50 ;延时1秒RCALL DELAYLDI R17,0B11111101 ;PA1输出低电平,LED1亮。
C语言实用程序设计100例流程图之欧阳歌谷创作
C语言实用程序100例欧阳歌谷(2021.02.01)第一篇基础与提高实例1利用库函数编写基本显示程序实例2变量属性实例3运算符与类型实例4关于程序结构实例5显示函数曲线图实例6二分法选代的应用实例7多变的立方体实例8一维整型数组应用(1)实例9一维整型数组应用(2)实例10一维整型数组应用(3)实例11一维整型数组应用(4)实例12二维数组应用(1)——显示杨辉三角实例13二维数组应用(2)——魔方阵实例14字符数组应用(1)——逻辑判断实例15字符数组应用(2)——数据模拟实例16二维数组应用——字符比较实例17利用指针进行数据处理实例18指针与字符串实例19利用指针处理二维数组欧阳歌谷创编 2021年2月1实例20一级指针实例21利用指针传递参数值实例22结构体的应用实例23链表的应用(1)实例24链表的应用(2)实例25链表的应用(3)实例26共用体的应用实例27枚举类型应用实例28位运算买例29义件加密实例30文件的按记录随机读写第二篇图形与多媒体实例31改变文字背景色实例32及本颜色设置实例33制作表格实例34制作多样的椭圆实例35美丽的透视图形实例36错位窗口实例37能移动的矩形实例38多变的填充矩形实例39黄黑相间的矩形与圆实例40六叶图案实例41特殊图案欧阳歌谷创编 2021年2月1实例42国际象棋棋盘实例43制作楼梯实例44使用线类型函数设置多个汉字实例45彩色群点实例46饼图买例47产品折线图实例48直方图实例49变大变色的拒形与国实例50多变的填充多边形实例51流星球实例52小球动态碰撞买倒53多,曲线实例54多变的圆与环实例55优美的球体实例56运动的小车实例57统计动画消失次数实例58运行的时钟实例59直升飞机实例60演绎“生命游戏”实例61猜猜看买例62艺术清屏买倒63制作火焰实例64动态绘制256条不同颜色的直线欧阳歌谷创编 2021年2月1实例65红绿蓝三原色渐变第三篇综合小程序实例66两个矩阵相乘实例67艺术钟实例68家庭财务管理小程序实例69用系统时间实现随机数实例70闪动的多彩圆实例71检查系统有无鼠标实例72圆形光盘与矩形实例73动态渐变图案实例74往返两地间的小车实例75飘扬的红旗实例76显示蓝天白云图形实例77百叶窗第四篇计算机等级考试上机试题(二级)第五篇计算机等级考试上机试题(三级)部分流程图实例1实例3实例4实例5实例7递归函数实例8实例9实例实例实例13实例实例实例实例实例实例实例实例211实例实例实例实例实例实例实例实例29欧阳歌谷创编 2021年2月1实86实例87实例91实例实例93 实例94实例95欧阳歌谷创编 2021年2月1实例96实例97(1)实例97(2)实例98实例99实例。
AVR的指令与汇编系统 马潮课件
第3章AVR的指令与汇编系统传统的8位单片机(如最典型的8051结构的单片机)大都采用复杂指令CISC(Complex Instruction Set Computer)系统体系。
由于CISC结构存在指令系统不等长,指令数多,CPU利用效率低,执行速度慢等缺陷,已不能满足和适应设计高档电子产品和嵌入式系统应用的需要。
作为8位的AVR单片机来讲,除了其具备比较完善和功能强大的硬件结构和组成外,其更重要的是它的内核和指令系统为先进的RISC体系结构,采用了大型快速存取寄存器组(32个通用工作寄存器)、快速的单周期指令系统以及单级流水线等先进技术。
因此,AVR 内核核指令系统的显著特点有:1.16/32位定长指令AVR的一个指令字为16位或32位,其中大部分的指令为16位。
采用定长指令,不仅使取指操作简单,提高了取指令的速度;同时也降低了在取指操作过程中的错误,提高了系统的可靠性。
2.流水线操作AVR采用流水线技术,在前一条指令执行的时候,就取出现行的指令,然后以一个周期执行指令。
大大提高了CPU的运行速度。
3.大型快速存取寄存器组传统的基于累加器的结构单片机(如8051),需要大量的程序代码来完成和实现在累加器和存储器之间的数据传送。
而在AVR单片机中,采用32个通用工作寄存器构成大型快速存取寄存器组,用32个通用工作寄存器代替了累加器(相当有32个累加器),从而避免了传统结构中累加器和存储器之间数据传送造成的瓶颈现象。
由于AVR单片机采用RISC结构,使得它具有高达1MIPS/MHz的高速运行处理能力。
同时也能更好地适合采用高级语言(例如C语言、BASIC语言)来编写系统程序,高效地开发出目标代码,以加快产品进入市场的时间和简化系统的设计、开发、维护和支持。
3.1ATmega16指令综述指令是CPU用于控制各功能部件完成某一指定动作或操作的指示和命令。
指令不同,CPU和各个功能部件完成的动作也不一样,指令的功能也不同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
; 以下提供几个补充参考程序,都带有详细说明和指令注释.它们是主从多机通讯程序, 采;用中断方式写入EEPROM,直接对晶振分频产生0.1秒和秒号的精确定时程序,以及RS-232/ ;RS-485 标准转换程序,AVR 频率计程序,串行时锺日历芯片DS1302 读写,共享时基的PWM 输出、;输入捕获测周期程序和定时信号获取,以及DS18B20 测温等程序.多机通讯主要用8 和9位数;据模式区分被选分机(9 位)和其它分机(8 位),达到主机只与被选分机交换数据之目的.以中;断方式写EEPROM 的优点是可与系统运行同时进行(即在线写入),占用很少机时.;精确定时用定时/计数器1(或0)直接对MCU 主频(不设分频)设定时间常数,分频精度可达到;1HZ.RS-232/RS-485 标准转换程序中AVR 不作中转,使两种器件相关脚位直接连接.以TCNT0 淀时,以T0引脚接收RS-232数据•以收到RS-232字符起始位下跳沿或结束符($03)为依据, ;控制切换RS-485 的收发使能.(系统中的主AVR 可兼做对通信标准之监控转换,即只是在完成;主要工作任务的同时'附带'进行).具体过程不再细述.串行时锺日历芯片DS1302 具体积小, ;可靠性高,与单片机连接方便等优点.; 以下程序请参看有关章节或程序中的注释。
;范例91 ;多机通讯主机程序/晶振4MHZ.ORG 0 ;以8/9 位数据模式区分被选/未被选分机通讯.EQU DTPINT=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ; 主机对1#,2#,3#,4# 分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BFSTRT38: RJMP RST38 ; 主机从1#,2#,3#,4# 分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF.ORG $00B ;RJMP STRT38.ORG $00CRJMP STRT38 ;主机不设串口中断,只以查询接收.ORG $011RST38: LDI R16,12OUT UBRR,R16 ;设波特率:[BAUD RATE=FCP/16(UBRR+1)]CLR R15 ; 初始化分机号LDI R27,HIGH(DTPINT)LDI R26,LOW(DTPINT); 发送数据指针(首指$180)LDI R29,HIGH(DRPINT)LDI R28,LOW(DRPINT);接收数据指针(首指$1C0)NEXTNO: LDI R16,$18OUT UCR,R16 ;允许UART 接收和发送,8 位数据模式INC R15 ; 指向1#分机OUTLP: OUT UDR,R15 ;呼分机号,1:1#/2:2#/03:3#/04:4#...TSLOP: IN R16,USRSBRS R16,7RJMP TSLOP ; 分机返回机号?IN R16,UDR CP R16,R15;分机号正确返回? BRNE OUTLPLDI R16,$1C ;改为 9 位数据模式 TXB8=0 OUT UCR,R16JTXLOP: LDR16,X+OUT UDR,R16;向分机发送数据块TESTL: INR17,USRSBRS R17,5RJMP TESTL ; 等待发送完成CPI R16,$0ABRNE TXLOPJRXTST: INR17,USRSBRS R17,7 ;RXC=1 收到数据RJMP RXTST ;等待接收分机返回数据块IN R16,UDRST Y+,R16 ;存储接收数据 CPI R16,$0A ;分机数据块发完?BRNE RXTSTMOVR16,R15CPI R16,4 ;与分机轮询通讯完毕? BRNE NEXTNO ;未完转对下一分机通信 HH38: RJMP HH38;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询).DSEG.ORG $180DTPINT:.BYTE $40;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A ;$42 $4F $66 $78 $47 $45 $44 $63 $32 $48 $60 $7C $6D $45 $0D $0A;$43 $56 $55 $53 $4D $4F $40 $2E $31 $42 $67 $4C $47 $4A $0D $0A ;$45 $54 $59 $63 $3D $4B $48 $2F $35 $48 $69 $3C $77 $43 $0D $0A .ORG $1C0 DRPINT:.BYTE $40;范例 92.ORG 0 ;多机通讯 1#分机程序 /晶振 4MHZ.EQU DTPIT1=$180 ;(UBRR )=12 波特率为 19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0 STRT39: RJMP RST39;8535UART 接收完成中断 ;UART 发送完成中断.ORG $00B RJMP UARXC .ORG $00C RJMPUATXCOUT UCR,R16RCVBLK: SBRS R18,7RJMP RCVBLK ;主机发来数据块已接收完毕? LDI R16,HIGH(DTPIT1) MOV R6,R16 LDI R16,LOW(DTPIT1)MOV R7,R16 ;设发送数据指针r6r7,首指$180LDI R16,$3C;允许 UART 中断发送, 9位数据模式, TXB8=0OUT UCR,R16 TXDN: SBIC UCR,5RJMP RJMPTXDN RST39; 发送完毕? J:UART 中断接收程序UARXC: SBICUSR,4RETI; 祯错误(主机正与其它分机进行 9 位数据模式通信) ,不予接收IN R14,SREG ; 保存当前状态TST R18BREQ NUMB ;(R18)=0 时收到数据,只可能是机号,转去核实PUSH R16 ; 否则为主机向本分机发来数据块( 9 位模式,机号已符合)PUSH R26 PUSH R27IN R17,UDR ;接收数据MOV XH,R8MOVXL,R9 ;取接收数据指针 STX+,R17; 转入 RAMLDI R16,12 OUT UBRR,R16 ;设波特率 [BAUD RATE=4000000/16* ( 12+1)=19200]LDI R16,HIGH(DRPNT1)MOV R8,R16LDI R16,LOW(DRPNT1) MOV R9,R16 丁8,r9:接收数据指针(FIRST POINT TO $1C0)LDI R16,$98;允许 UART 中断接收, 8位数据模式OUTUCR,R16SEIRXDTS: SBRS R18,6; 主机呼号已收到(若收到,在 R17 中)?RJMP RXDTSOUT UDR,R17; 返还该机号TXDON: INR16,USRSBRSR16,5RJMP TXDON ; 该机号发送完成?LDI R16,$9C ; 允许 UART 中断接收, 9 位数据模式, TXB8=0;清除分机被选中( R18, 6)和主机数据块接收完毕标志 (R18,7).ORG $011 RST39:CLR R18SDCOM: POP R27POP R26POP R16 OUT SREG,R16 POP R16RETI.DSEG .ORG$180DTPIT1:.BYTE $40 .ORG $1C0 DRPNT1:.BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0AMOV R8,XH MOV R9,XL; 存数据指针 CPI R17,$0A ;是数据块结束符 LF? BRNE RSCOM1SBR R18,$80 ; 收到完整数据块标志RSCOM1: POP R27POP R26 POP R16DRETI: OUT SREG,R14 RETI NUMB: IN R17,UDR ; 取出数据CPI R17,1 ;是 1#分机? 2#分机与 $02比较/3#分机与$03比较 BRNEDRETI; 机号不符合,转 ! SBR R18,$40 ; 建机号符合标志RJMP DRETI; UART 中断发送程序 UA TXC : PUSHR16;r6 r7:发送数据指针,首指$180IN R16,SREG PUSH R16PUSH R26PUSH R27MOV XH,R6MOV XL,R7 ;取出发送指针 LD R16,X+ ; 取数据,调指针MOV R6,XH MOV R7,XLOUTUDR,R16; 送入发送寄存器CPI R16,$0A BRNE SDCOMCBI UCR,5; 发送最后 1 个字符后,LDI R16,HIGH(DRPINT) MOVR8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ; 接收数据指针初始化 禁止发送寄存器空中断 (CLR UDRIE)POINT TO $1C0);范例93;以中断方式写入EEPROM (仅对8535,8515 无此功能) ,克服查询方式占用过多机时的缺点,;并可在线写入;运作过程特点如下:;(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位;(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成;(3)本程序为一写入特例,写入地址为$100--$仆F,可作适当修改(如设块长计数器等) ;(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序;(6)如能确信当前系统没有EEPROM 正在写入,可删除对其进行查询部分.STWEEP: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,LOW(ramend)OUT SPL,R16SBI EECR,3 设置EEPROM就绪(ready)中断使能位SEI ;中断总使能RJMP SRTW.ORG $00FRJMP EEPRDY ;8535 EEPROM就绪(ready)中断向量SRTW: LDI YH,1LDI YL 0 ;EEPROM 写入首地址:$100LDI XL,$60 ;欲写入数据块首地址:$60CLR XHWEEP0: SBIC EECR,1 ;当前有EEPROM 写入操作,有则等待写入完成RJMP WEEP0RCALL WREEP ;写入第一个字节,($60)->$100 ,写入完成后,EEWE=0 时引发EEPROM 就绪中断INC YL ;调整写入地址指针HHWEEP: TST YLBRNE HHWEEPCPI YH,2 ;写入地址达到$200后,写入完成BRNE HHWEEPCBI EECR,3 ;禁止EEPROM 就绪(ready)中断WDON: RJMP WDON ;踏步EEPRDY: IN R6,SREGPUSH R16RCALL WREEP ;写入一个字节INC YLBRNE WRETIINC YH ;EEPROM 末地址为$1FF WRETI: POP R16OUT SREG,R6RETIWREEP: OUT EEARH,YH ;OUT EEARL,YL ;写入地址送入EEARLD R16,X+ ;取数据,调指针OUT EEDR,R16 ;数据写入EEPROM 数据寄存器SBI EECR,2 ;设置EEPROM 写入总使能位EEMWESBI EECR,1 ;设置EEPROM 写入使能位EEWERET;范例94 ;精确定时产生0.1 秒信号;用定时/计数器1定时,不分頻定出0.1秒信号,由PC5 脚输出正脉冲。