AVR单片机指令表

合集下载

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单片机指令集

avr单片机指令集

avr单片机指令集AVR单片机指令集指令集概述指令,操作数,说明,操作标志# ,时钟数算数和逻辑指令ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd ? Rr Z,N,V 1ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd ? K Z,N,V 1OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1COM Rd 1 的补码Rd ← 0xFF ? Rd Z,C,N,V 1NEG Rd 2 的补码Rd ← 0x00 ? Rd Z,C,N,V,H 1SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1CBR Rd,K 寄存器位清零Rd ← Rd ? (0xFF - K) Z,N,V 1INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1DEC Rd 减一操作Rd ← Rd ? 1 Z,N,V 1TST Rd 测试是否为零或负Rd ← Rd ? Rd Z,N,V 1CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1SER Rd 寄存器置位Rd ← 0xFF None 1MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2MULSU Rd, Rr 有符号数与无符号数乘法R1:R0 ← Rd x Rr Z,C 2 FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr) << 1 Z,C 2跳转指令RJMP k 相对跳转PC ← PC + k + 1 无2IJMP 间接跳转到(Z) PC ← Z 无2RCALL k 相对子程序调用PC ← PC + k + 1 无3ICALL 间接调用(Z) PC ← Z 无3RET 子程序返回PC ← STACK 无4RETI 中断返回PC ← STACK I 4CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr) PC ← PC + 2 or 3 无1 /2 / 3CP Rd,Rr 比较Rd ? Rr Z, N,V,C,H 1CPC Rd,Rr 带进位比较Rd ? Rr ? C Z, N,V,C,H 1CPI Rd,K 与立即数比较Rd ? K Z, N,V,C,H 1SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b)=0) PC ← PC + 2 or 3 无1 / 2 / 3SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令if (P(b)=1) PC ← PC + 2 or 3 无1 / 2 / 3BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s) = 1) then PC←PC+k + 1 无1 / 2BRBC s, k 状态寄存器位为"0” 则跳过下一条指令if (SREG(s) =0) then PC←PC+k + 1 无1 / 2BREQ k 相等则跳转if (Z = 1) then PC ← PC + k + 1 无1 / 2BRNE k 不相等则跳转if (Z = 0) then PC ← PC + k + 1 无1 / 2 BRCS k 进位位为"1” 则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2 BRCC k 进位位为"0” 则跳转if (C = 0) then PC ← PC + k + 1 无1 / 2 BRSH k 大于或等于则跳转if (C = 0) then PC ← PC + k + 1 无1 / 2 BRLO k 小于则跳转if (C = 1) then PC ← PC + k + 1 无1 / 2BRMI k 负则跳转if (N = 1) then PC ← PC + k + 1 无1 / 2BRPL k 正则跳转if (N = 0) then PC ← PC + k + 1 无1 / 2BRGE k 有符号数大于或等于则跳转if (N ⊕ V= 0) then PC ← PC + k + 1 无1 / 2BRLT k 有符号数负则跳转if (N ⊕ V= 1) then PC ← PC + k + 1 无1 / 2 BRHS k 半进位位为"1” 则跳转if (H = 1) then PC ← PC + k + 1 无1 / 2 BRHC k 半进位位为"0” 则跳转if (H = 0) then PC ← PC + k + 1 无1 / 2 BRTS k T 为"1” 则跳转if (T = 1) then PC ← PC + k + 1 无1 / 2 BRTC k T 为"0” 则跳转if (T = 0) then PC ← PC + k + 1 无1 / 2 BRVS k 溢出标志为"1” 则跳转if (V = 1) then PC ← PC + k + 1 无1 / 2 BRVC k 溢出标志为"0” 则跳转if (V = 0) then PC ← PC + k + 1 无1 / 2 274 ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数BRIE k 中断使能再跳转if ( I = 1) then PC ← PC + k + 1 无1 / 2 BRID k 中断禁用再跳转if ( I = 0) then PC ← PC + k + 1 无1 / 2数据传送指令MOV Rd, Rr 寄存器间复制Rd ← Rr 无1MOVW Rd, Rr 复制寄存器字Rd+1:Rd ← Rr+1:Rr 无1LDI Rd, K 加载立即数Rd ← K 无1LD Rd, X 加载间接寻址数据Rd ← (X) 无2LD Rd, X+ 加载间接寻址数据,然后地址加一Rd ← (X), X ← X + 1 无2 LD Rd, - X 地址减一后加载间接寻址数据X ← X - 1, Rd ← (X) 无2LD Rd, Y 加载间接寻址数据Rd ← (Y) 无2LD Rd, Y+ 加载间接寻址数据,然后地址加一Rd ← (Y), Y ← Y + 1 无2 LD Rd, - Y 地址减一后加载间接寻址数据Y ← Y - 1, Rd ← (Y) 无2LDD Rd,Y+q 加载带偏移量的间接寻址数据Rd ← (Y + q) 无2LD Rd, Z 加载间接寻址数据Rd ← (Z) 无2LD Rd, Z+ 加载间接寻址数据,然后地址加一Rd ← (Z), Z ← Z+1 无2LD Rd, -Z 地址减一后加载间接寻址数据Z ← Z - 1, Rd ← (Z) 无2LDD Rd, Z+q 加载带偏移量的间接寻址数据Rd ← (Z + q) 无2 LDS Rd, k 从SRAM 加载数据Rd ← (k) 无2ST X, Rr 以间接寻址方式存储数据(X) ← Rr 无2ST X+, Rr 以间接寻址方式存储数据,然后地址加一(X) ← Rr, X ← X + 1 无2ST - X, Rr 地址减一后以间接寻址方式存储数据X ← X - 1, (X) ← Rr 无2 ST Y, Rr 加载间接寻址数据(Y) ← Rr 无2ST Y+, Rr 加载间接寻址数据,然后地址加一(Y) ← Rr, Y ← Y + 1 无2ST - Y, Rr 地址减一后加载间接寻址数据Y ← Y - 1, (Y) ← Rr 无2 STD Y+q,Rr 加载带偏移量的间接寻址数据(Y + q) ← Rr 无2ST Z, Rr 加载间接寻址数据(Z) ← Rr 无2ST Z+, Rr 加载间接寻址数据,然后地址加一(Z) ← Rr, Z ← Z + 1 无2ST -Z, Rr 地址减一后加载间接寻址数据Z ← Z - 1, (Z) ← Rr无2 STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q) ← Rr 无2STS k, Rr 从SRAM 加载数据(k) ← Rr 无2LPM 加载程序空间的数据R0 ← (Z) 无3LPM Rd, Z 加载程序空间的数据Rd ← (Z) 无3LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z), Z ← Z+1 无3 SPM 保存程序空间的数据(Z) ← R1:R0 无-IN Rd, P 从I/O 端口读数据Rd ← P 无1OUT P, Rr 输出端口P ← R r 无1PUSH Rr 将寄存器推入堆栈STACK ← Rr 无2POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无2位和位测试指令SBI P,b I/O 寄存器位置位I/O(P,b) ← 1 无2CBI P,b I/O 寄存器位清零I/O(P,b) ← 0 无2LSL Rd 逻辑左移Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V 1LSR Rd 逻辑右移Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1ROL Rd 带进位循环左移Rd(0)←C,Rd(n+1)← Rd(n),C←Rd(7) Z,C,N,V 1ROR Rd 带进位循环右移Rd(7)←C,Rd(n)← Rd(n+1),C←Rd(0) Z,C,N,V 1 ASR Rd 算术右移Rd(n) ← Rd(n+1), n=0..6 Z,C,N,V 1 SWAP Rd 高低半字节交换Rd(3..0)←Rd(7..4),Rd(7..4)←Rd(3..0) 无1 BSET s 标志置位SREG(s) ← 1 SREG(s) 1BCLR s 标志清零SREG(s) ← 0 SREG(s) 1BST Rr, b 从寄存器将位赋给T T ← Rr(b) T 1 BLD Rd, b 将T 赋给寄存器位Rd(b) ← T 无1 SEC 进位位置位C ← 1 C 1CLC 进位位清零C ← 0 C 1SEN 负标志位置位N ← 1 N 1CLN 负标志位清零N ← 0 N 1SEZ 零标志位置位Z ← 1 Z 1CLZ 零标志位清零Z ← 0 Z 1SEI 全局中断使能I ← 1 I 1CLI 全局中断禁用I ← 0 I 1SES 符号测试标志位置位S ← 1 S 1CLS 符号测试标志位清零S ← 0 S 1SEV 2 的补码溢出标志置位V ← 1 V 1CLV 2 的补码溢出标志清零V ← 0 V 1SET SREG 的T 置位T ← 1 T 1指令集概述275ATmega8(L)2486N–AVR–07/04指令操作数说明操作标志# 时钟数CLT SREG 的T 清零T ← 0 T 1SEH SREG 的半进位标志置位H ← 1 H 1CLH SREG 的半进位标志清零H ← 0 H 1MCU 控制指令NOP 空操作无1SLEEP 休眠( 见对睡眠功能的特殊说明) 无1WDR 复位看门狗( 见对WDR/timer 的特殊说明) 无1。

AVRmega8汇编指令汇总.

AVRmega8汇编指令汇总.

指令集概述指令操作数说明操作标志 # 时钟数算数和逻辑指令ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2 SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd • Rr Z,N,V 1ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd • K Z,N,V 1OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1COM Rd 1 的补码Rd ← 0xFF − Rd Z,C,N,V 1NEG Rd 2 的补码Rd ← 0x00 − Rd Z,C,N,V,H 1SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1CBR Rd,K 寄存器位清零Rd ← Rd • (0xFF - K Z,N,V 1INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1DEC Rd 减一操作Rd ← Rd − 1 Z,N,V 1TST Rd 测试是否为零或负Rd ← Rd • Rd Z,N,V 1CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1SER Rd 寄存器置位Rd ← 0xFF None 1MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2MULSU Rd, Rr 有符号数与无符号数乘法 R1:R0 ← Rd x Rr Z,C 2FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2跳转指令RJMP k 相对跳转PC ← PC + k + 1 无 2IJMP 间接跳转到(Z PC ← Z 无 2RCALL k 相对子程序调用PC ← PC + k + 1 无 3ICALL 间接调用(Z PC ← Z 无 3RET 子程序返回PC ← STACK 无 4RETI 中断返回PC ← STACK I 4CPSE Rd,Rr 比较,相等则跳过下一条指令if (Rd = Rr PC ← PC + 2 or 3 无 1 / 2 / 3CP Rd,Rr 比较Rd − Rr Z, N,V,C,H 1CPC Rd,Rr 带进位比较Rd − Rr − C Z, N,V,C,H 1CPI Rd,K 与立即数比较Rd − K Z, N,V,C,H 1SBRC Rr, b 寄存器位为"0” 则跳过下一条指令if (Rr(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBRS Rr, b 寄存器位为"1” 则跳过下一条指令if (Rr(b=1 PC ← PC + 2 or 3 无1 / 2 / 3 SBIC P, b I/O 寄存器位为"0” 则跳过下一条指令if (P(b=0 PC ← PC + 2 or 3 无 1 / 2 / 3 SBIS P, b I/O 寄存器位为"1” 则跳过下一条指令 if (P(b=1 PC ← PC + 2 or 3 无 1 / 2 / 3BRBS s, k 状态寄存器位为"1” 则跳过下一条指令if (SREG(s = 1 then PC←PC+k + 1 无 1 / 2 BRBC s, k 状态寄存器位为"0” 则跳过下一条指令 if (SREG(s = 0 then PC← PC+k + 1 无 1 / 2 BREQ k 相等则跳转if (Z = 1 then PC ← PC + k + 1 无 1 / 2BRNE k 不相等则跳转 if (Z = 0 then P C ← PC + k + 1 无 1 / 2BRCS k 进位位为"1” 则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRCC k 进位位为"0” 则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRSH k 大于或等于则跳转if (C = 0 then PC ← PC + k + 1 无 1 / 2BRLO k 小于则跳转if (C = 1 then PC ← PC + k + 1 无 1 / 2BRMI k 负则跳转if (N = 1 then PC ← PC + k + 1 无 1 / 2BRPL k 正则跳转if (N = 0 then PC ← PC + k + 1 无 1 / 2BRGE k 有符号数大于或等于则跳转 if (N ⊕ V= 0 then PC ← PC + k + 1 无 1 / 2 BRLT k 有符号数负则跳转 if (N ⊕ V= 1 then PC ← PC + k + 1 无 1 / 2BRHS k 半进位位为"1” 则跳转if (H = 1 then PC ← PC + k + 1 无 1 / 2BRHC k 半进位位为"0” 则跳转if (H = 0 then PC ← PC + k + 1 无 1 / 2BRTS k T 为"1” 则跳转if (T = 1 then PC ← PC + k + 1 无 1 / 2BRTC k T 为"0” 则跳转if (T = 0 then PC ← PC + k + 1 无 1 / 2BRVS k 溢出标志为"1” 则跳转if (V = 1 then PC ← PC + k + 1 无 1 / 2BRVC k 溢出标志为"0” 则跳转if (V = 0 then PC ← PC + k + 1 无 1 / 2← Z - 1, (Z ← Rr 无 2STD Z+q,Rr 加载带偏移量的间接寻址数据(Z + q ← Rr 无 2STS k, Rr 从 SRAM 加载数据(k ← Rr 无 2LPM 加载程序空间的数据R0 ← (Z 无 3LPM Rd, Z 加载程序空间的数据Rd ← (Z 无 3LPM Rd, Z+ 加载程序空间的数据,然后地址加一Rd ← (Z, Z ← Z+1 无 3SPM 保存程序空间的数据(Z ← R1:R0 无 -IN Rd, P 从 I/O 端口读数据Rd ← P 无 1OUT P, Rr 输出端口P ← Rr 无 1PUSH Rr 将寄存器推入堆栈STACK ← Rr 无 2POP Rd 将寄存器从堆栈中弹出Rd ← STACK 无 2位和位测试指令SBI P,b I/O 寄存器位置位I/O(P,b ← 1 无 2CBI P,b I/O 寄存器位清零I/O(P,b ← 0 无 2LSL Rd 逻辑左移Rd(n+1 ← Rd(n, Rd(0 ← 0 Z,C,N,V 1LSR Rd 逻辑右移Rd(n ← Rd(n+1, Rd(7 ← 0 Z,C,N,V 1ROL Rd 带进位循环左移Rd(0← C,Rd(n+1← Rd(n,C← Rd(7 Z,C,N,V 1 ROR Rd 带进位循环右移Rd(7← C,Rd(n← Rd(n+1,C← Rd(0 Z,C,N,V 1 ASR Rd 算术右移Rd(n ← Rd(n+1, n=0..6 Z,C,N,V 1SWAP Rd 高低半字节交换Rd(3..0← Rd(7..4,Rd(7..4← Rd(3..0 无 1 BSET s 标志置位SREG(s ← 1 SREG(s 1BCLR s 标志清零SREG(s ← 0 SREG(s 1BST Rr, b 从寄存器将位赋给T T ← Rr(b T 1BLD Rd, b 将 T 赋给寄存器位Rd(b ← T 无 1SEC 进位位置位C ← 1 C 1CLC 进位位清零C ← 0 C 1SEN 负标志位置位N ← 1 N 1CLN 负标志位清零N ← 0 N 1SEZ 零标志位置位Z ← 1 Z 1CLZ 零标志位清零Z ← 0 Z 1SEI 全局中断使能I ← 1 I 1CLI 全局中断禁用I ← 0 I 1SES 符号测试标志位置位S ← 1 S 1CLS 符号测试标志位清零S ← 0 S 1SEV 2 的补码溢出标志置位V ← 1 V 1CLV 2 的补码溢出标志清零V ← 0 V 1SET SREG 的 T 置位T ← 1 T 1CLT SREG 的 T 清零T ← 0 T 1SEH SREG 的半进位标志置位H ← 1 H 1CLH SREG 的半进位标志清零H ← 0 H 1MCU 控制指令NOP 空操作无 1SLEEP 休眠 ( 见对睡眠功能的特殊说明无 1WDR 复位看门狗 ( 见对 WDR/timer 的特殊说明无 1。

AVR单片机汇编指令合集-

AVR单片机汇编指令合集-

Instruction mnemonicsThe Assembler accepts mnemonic instructions from the instruction set.A summary of the instruction set mnemonics and their parameters is given here.For a detailed description of the Instruction set,refer to the AVR Data Book.Arithmetic and Logic InstructionsMnemonic Operands Description Operation Flags CyclesADD聽Rd,Rr聽Add without Carry聽Rd=Rd+Rr聽Z,C,N,V,H,S聽1ADC Rd,Rr Add with Carry Rd=Rd+Rr+CZ,C,N,V,H,S1ADIW Rd,K Add Immediate ToWordRd+1:Rd,K Z,C,N,V,S2SUB Rd,Rr Subtract without Carry Rd=Rd-Rr Z,C,N,V,H,S1 SUBI Rd,K8Subtract Immediate Rd=Rd-K8Z,C,N,V,H,S1SBC Rd,Rr Subtract with Carry Rd=Rd-Rr-CZ,C,N,V,H,S1SBCI Rd,K8Subtract with CarryImmedtiateRd=Rd-K8-CZ,C,N,V,H,S1AND Rd,Rr Logical AND Rd=Rd路Rr Z,N,V,S聽1ANDI Rd,K8Logical AND withImmediateRd=Rd路K8Z,N,V,S1OR Rd,Rr Logical OR Rd=Rd V Rr Z,N,V,S1ORI Rd,K8Logical OR withImmediateRd=Rd V K8Z,N,V,S1EOR Rd,Rr Logical Exclusive OR Rd=Rd EORRrZ,N,V,S1COM Rd One's Complement Rd=$FF-Rd Z,C,N,V,S1 NEG Rd Two's Complement Rd=$00-Rd Z,C,N,V,H,S1 SBR Rd,K8Set Bit(s)in Register Rd=Rd V K8Z,C,N,V,S1CBR Rd,K8Clear Bit(s)in Register Rd=Rd路($FF-K8)Z,C,N,V,S1INC Rd Increment Register Rd=Rd+1Z,N,V,S1 DEC Rd Decrement Register Rd=Rd-1Z,N,V,S1TST Rd Test for Zero orNegativeRd=Rd路Rd Z,C,N,V,S1CLR Rd Clear Register Rd=0Z,N,V,S1 SER Rd Set Register Rd=$FF None1SBIW Rdl,K6Subtract Immediatefrom WordRdh:Rdl=Rdh:Rdl-K6Z,C,N,V,S2MUL Rd,Rr Multiply Unsigned R1:R0=Rd*RrZ,C2MULS Rd,Rr Multiply Signed R1:R0=Rd*RrZ,C2MULSU Rd,Rr Multiply Signed withUnsignedR1:R0=Rd*RrZ,C2FMUL Rd,Rr Fractional MultiplyUnsignedR1:R0=(Rd*Rr)<<1Z,C2FMULS Rd,Rr Fractional MultiplySignedR1:R0=(Rd*Rr)<<1Z,C2FMULSU Rd,Rr Fractional MultiplySigned with UnsignedR1:R0=(Rd*Rr)<<1Z,C2聽Branch InstructionsMnemonic Operands Description Operation Flags Cycles RJMP k Relative Jump PC=PC+k+1None2IJMP None Indirect Jump to(Z)PC=Z None2EIJMP None Extended IndirectJump(Z)STACK=PC+1,PC(15:0)=Z,PC(21:16)=EINDNone2JMP k Jump聽PC=k None3RCALL k Relative CallSubroutineSTACK=PC+1,PC=PC+k+1None3/4*ICALL None Indirect Call to(Z)STACK=PC+1,PC=Z聽None3/4*EICALL None Extended IndirectCall to(Z)STACK=PC+1,PC(15:0)=Z,PC(21:16)=EINDNone4*CALL k Call Subroutine STACK=PC+2,PC=kNone4/5*RET None SubroutineReturnPC=STACK None4/5*RETI None Interrupt Return PC=STACK I4/5*CPSE Rd,Rr Compare,Skip ifequal聽if(Rd==Rr)PC=PC2or3None1/2/3CP Rd,Rr Compare Rd-Rr Z,C,N,V,H,S1CPC Rd,Rr Compare withCarryRd-Rr-C Z,C,N,V,H,S1CPI Rd,K8Compare withImmediateRd-K Z,C,N,V,H,S1SBRC Rr,b Skip if bit inregister clearedif(Rr(b)==0)PC=PC+2or3None1/2/3SBRS Rr,b Skip if bit inregister setif(Rr(b)==1)PC=PC+2or3None1/2/3SBIC P,b Skip if bit in I/Oregister clearedif(I/O(P,b)==0)PC=PC+2or3None1/2/3SBIS P,b Skip if bit in I/Oregister setif(I/O(P,b)==1)PC=PC+2or3None1/2/3BRBC s,k Branch if Statusflag clearedif(SREG(s)==0)PC=PC+k+1None1/2BRBS s,k Branch if Statusflag setif(SREG(s)==1)PC=PC+k+1None1/2BREQ k Branch if equal if(Z==1)PC=PC+k+1None1/2BRNE k Branch if notequalif(Z==0)PC=PC+k+1None1/2BRCS k Branch if carry set if(C==1)PC=PC+k+1None1/2BRCC k Branch if carryclearedif(C==0)PC=PC+k+1None1/2BRSH k Branch if same orhigherif(C==0)PC=PC+k+1None1/2BRLO k Branch if lower if(C==1)PC=PC+k+1None1/2BRMI k Branch if minus if(N==1)PC=PC+k+1None1/2BRPL k Branch if plus if(N==0)PC=PC+k+1None1/2BRGE k Branch if greaterthan or equal(signed)if(S==0)PC=PC+k+1None1/2BRLT k Branch if lessthan(signed)if(S==1)PC=PC+k+1None1/2BRHS k Branch if halfcarry flag setif(H==1)PC=PC+k+1None1/2BRHC k Branch if halfcarry flag clearedif(H==0)PC=PC+k+1None1/2BRTS k Branch if T flagsetif(T==1)PC=PC+k+1None1/2BRTC k Branch if T flagclearedif(T==0)PC=PC+k+1None1/2BRVS k Branch if overflowflag setif(V==1)PC=PC+k+1None1/2BRVC k Branch if overflowflag clearedif(V==0)PC=PC+k+1None1/2BRIE k Branch if interrupt if(I==1)PC=PC+k+None1/2enabled1BRID k Branch if interruptdisabledif(I==0)PC=PC+k+1None1/2*Cycle times for data memory accesses assume internal memory accesses,and are not valid for accesses through the external RAM interface.For the instructions CALL,ICALL,EICALL,RCALL,RET and RETI,add three cycles plus two cycles for each wait state in devices with up to16bit PC(128KB program memory).For devices with more than128KB program memory,add five cycles plus three cycles for each wait state.Data Transfer InstructionsMnemonic Operands Description Operation Flags Cycles MOV Rd,Rr Copy register Rd=Rr None1MOVW Rd,Rr Copy register pair Rd+1:Rd=Rr+1:Rr,r,d evenNone1LDI Rd,K8Load Immediate Rd=K None1 LDS Rd,k Load Direct Rd=(k)None2* LD Rd,X Load Indirect Rd=(X)None2*LD Rd,X+Load Indirect andPost-IncrementRd=(X),X=X+1None2*LD Rd,-X Load Indirect andPre-DecrementX=X-1,Rd=(X)None2*LD Rd,Y Load Indirect Rd=(Y)None2*LD Rd,Y+Load Indirect andPost-IncrementRd=(Y),Y=Y+1None2*LD Rd,-Y Load Indirect andPre-DecrementY=Y-1,Rd=(Y)None2*LDD Rd,Y+q Load Indirect withdisplacementRd=(Y+q)None2*LD Rd,Z Load Indirect聽Rd=(Z)None2*LD Rd,Z+Load Indirect andPost-IncrementRd=(Z),Z=Z+1None2*LD Rd,-Z Load Indirect and Z=Z-1,Rd=(Z)None2*Pre-DecrementLDD Rd,Z+q Load Indirect withdisplacementRd=(Z+q)None2*STS k,Rr Store Direct(k)=Rr None2* ST X,Rr Store Indirect(X)=Rr None2*ST X+,Rr Store Indirect andPost-Increment(X)=Rr,X=X+1None2*ST-X,Rr Store Indirect andPre-DecrementX=X-1,(X)=Rr None2*ST Y,Rr Store Indirect(Y)=Rr None2*ST Y+,Rr Store Indirect andPost-Increment(Y)=Rr,Y=Y+1None2ST-Y,Rr Store Indirect andPre-DecrementY=Y-1,(Y)=Rr None2ST Y+q,Rr Store Indirect withdisplacement(Y+q)=Rr None2ST Z,Rr Store Indirect(Z)=Rr None2ST Z+,Rr Store Indirect andPost-Increment(Z)=Rr,Z=Z+1None2ST-Z,Rr Store Indirect andPre-DecrementZ=Z-1,(Z)=Rr None2ST Z+q,Rr Store Indirect withdisplacement(Z+q)=Rr None2LPM None Load Program Memory R0=(Z)None3 LPM Rd,Z Load Program Memory Rd=(Z)None3LPM Rd,Z+Load Program Memory andPost-IncrementRd=(Z),Z=Z+1None3ELPM None Extended Load ProgramMemoryR0=(RAMPZ:Z)None3ELPM Rd,Z Extended Load ProgramMemoryRd=(RAMPZ:Z)None3ELPM Rd,Z+Extended Load ProgramMemory and Post IncrementRd=(RAMPZ:Z),Z=Z+1None3SPM None Store Program Memory(Z)=R1:R0None-ESPM None Extended Store ProgramMemory(RAMPZ:Z)=R1:R0None-IN Rd,P In Port Rd=P None1OUT P,Rr Out Port P=Rr None1 PUSH Rr Push register on Stack STACK=Rr None2POP Rd Pop register from Stack Rd=STACK None2*Cycle times for data memory accesses assume internal memory accesses and are not valid for accesses through the external RAM interface.For the LD,ST,LDD,STD,LDS,STS,PUSH and聽POP instructions, add one cycle plus one cycle for each wait state.Bit and Bit-test InstructionsMnemonic Operands Description Operation Flags CyclesLSL Rd Logical shift left Rd(n+1)=Rd(n),Rd(0)=0,C=Rd(7)Z,C,N,V,H,S1LSR Rd Logical shift right Rd(n)=Rd(n+1),Rd(7)=0,C=Rd(0)Z,C,N,V,S1ROL Rd Rotate leftthrough carryRd(0)=C,Rd(n+1)=Rd(n),C=Rd(7)Z,C,N,V,H,S1ROR Rd Rotate rightthrough carryRd(7)=C,Rd(n)=Rd(n+1),C=Rd(0)Z,C,N,V,S1ASR Rd Arithmetic shiftrightRd(n)=Rd(n+1),n=0,...,6Z,C,N,V,S1SWAP Rd Swap nibbles Rd(3..0)=Rd(7..4),Rd(7..4)=Rd(3..0)None1BSET聽s Set flag SREG(s)=1SREG(s)1 BCLR s Clear flag SREG(s)=0SREG(s)1SBI P,b Set bit in I/OregisterI/O(P,b)=1None2CBI P,b Clear bit in I/O I/O(P,b)=0None2registerBST Rr,b Bit store fromregister to TT=Rr(b)T1BLD Rd,b Bit load fromregister to TRd(b)=T None1SEC None Set carry flag C=1C1 CLC None Clear carry flag C=0C1 SEN None Set negative flag N=1N1CLN None Clear negativeflagN=0N1SEZ None Set zero flag Z=1Z1 CLZ None Clear zero flag Z=0Z1 SEI None Set interrupt flag I=1I1CLI None Clear interruptflagI=0I1SES None Set signed flag S=1S1 CLN None Clear signed flag S=0S1 SEV None Set overflow flag V=1V1CLV None Clear overflowflagV=0V1SET None Set T-flag T=1T1 CLT None Clear T-flag T=0T1SEH None Set half carryflagH=1H1CLH None Clear half carryflagH=0H1NOP None No operation None None1 SLEEP None Sleep See instruction manual None1 WDR None Watchdog Reset See instruction manual None1 BREAK None Execution Break See instruction manual None1The Assembler is not case sensitive.The operands have the following forms:Rd:Destination(and source)register in the register fileRr:Source register in the register fileb:Constant(0-7),can be a constant expressions:Constant(0-7),can be a constant expressionP:Constant(0-31/63),can be a constant expressionK6;Constant(0-63),can be a constant expressionK8:Constant(0-255),can be a constant expressionk:Constant,value range depending on instruction.Can be a constant expression q:Constant(0-63),can be a constant expressionRdl:聽R24,R26,R28,R30.For ADIW and SBIW instructions。

AVR汇编指令集

AVR汇编指令集

算术和逻辑指令•ADD 加法•ADC 带进位加•ADIW 加立即数•SUB 减法•SUBI 减立即数•SBC 带进位减•SBCI 带C 减立即数•SBIW 减立即数•AND 与•ANDI 与立即数•OR 或•ORI 或立即数•EOR 异或•COM 取反•NEG 取补•SBR 寄存器位置位•CBR 寄存器位清零•INC 加1•DEC 减1•TST 测试零或负•CLR 寄存器清零•SER 寄存器置FF•MUL 乘法•MULS 有符号数乘法•MULSU 有(无)符号数乘法•FMUL 小数乘法•FMULS 有符号数乘法•FMULSU 有(无)符号小数乘法条件转移指令•RJMP 相对转移•IJMP 间接转移•JMP 长转移•RCALL 相对调用•ICALL 间接调用•CALL 长调用•RET 子程序返回•RETI 中断返回•CPSE 比较相等跳行•CP 比较•CPC 带进位比较•CPI 带立即数比较•SBRC 位清零跳行•SBRS 位置位跳行•SBIC I/O 位清零跳行•SBIS I/O 位置位跳行•BRBS SREG 位置位转•BRBC SREG 位清零转•BREQ 相等转移•BRNE 不相等转移•BRCS C 置位转•ELPM 扩展装载程序存储器•EIJMP 扩展间接跳转•ESPM 扩展存储程序存储器•EICALL延长间接调用子程序•BRCC C 清零转•BRSH 转•BRLO 小于转(无符号)•BRMI 负数转移•BRPL 正数转移•BRGE 转(带符号)•BRLT 小于转(带符号)•BRHS H 置位转移•BRHC H 清零转移•BRTS T 置位转移•BRTC T 清零转移•BRVS V 置位转移•BRVC V 清零转移•BRIE 中断位置位转移•BRID 中断位清零转移数据传送指令•MOV 寄存器传送•MOVW 拷贝寄存器字•LDI 装入立即数•LD X X 间接取数•LD X+ X 间接取数后•LD -X X 间接取数先•LD Y Y 间接取数•LD Y+ Y 间接取数后+•LD –Y Y 间接取数先•LDD Yq Y 间接取数 q•LD Z Z 间接取数•LD Z+ Z 间接取数后•LD –Z Z 间接取数先•LDD Zq Z 间接取数 q•LDS 从SRAM 装入•ST X X 间接存数•ST X+ X 间接存数后•ST –X X 间接存数先•ST Y Y 间接存数•ST Y+ Y 间接存数后•ST –Y Y 间接存数先•STD Yq Y 间接存数 q•ST Z Z 间接存数•ST Z+ Z 间接存数后•ST –Z Z 间接存数先•STD Zq Z 间接存数 q•STS 数据送SRAM•LPM 装程序存储器•LPM Z Z•LPM Z+ Z+•SPM 存储程序存储器•IN I/O 口输入•OUT 送I/O 口•PUSH 压栈•POP 出栈位指令和位测试指令•SBI 置位I/O 位•CBI 清零I/O 位•LSL 左移•LSR 右移•ROL 带进位左循环•ROR 带进位右循环•ASR 算术右移•SWAP 半字节交换•BSET 置位SREG•BCLR 清零SREG•BST Rr 的b 位送T•BLD T 送Rr 的b 位•SEC 置位C•CLC 清零C•SEN 置位N•CLN 清零N•SEZ 置位Z•CLZ 清零Z•SEI 置位I•CLI 清零I•SES 置位S•CLS 清零S•SEV 置位V•CLV 清零V•SET 置位T•CLT 清零T•SEH 置位H•CLH 清零H•NOP 空操作•SLEEP 休眠•WDR 看门狗复位90 条指令器件:Attiny11/12/15/2289 条指令器件:AT90S1200118 条指令器件:AT90S2313/2323/2343/2333 AT90S4414/4433/4434/8515 AT90S8534/8535 121 条指令器件:ATmega603/103130 条指令器件:ATmega161。

AVR 指令说明

AVR 指令说明


影響旗標 Z,C,N,V,H Z,C,N,V,H Z,C,N,V,S Z,C,N,V,H Z,C,N,V,H Z,C,N,V,S Z,C,N,V,H Z,C,N,V,H Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V Z,C,N,V Z,C,N,V,H Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V None None None None None None I None Z,C,N,V,H Z,C,N,V,H Z,C,N,V,H None None None None None None None None None None None None None None None None None None None None None None None None None None None
X暫存器內容當地址,取該地址內的資料放入Rd暫存器後X加1。 X暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Y暫存器內容當地址,取該地址內的資料放入Rd暫存器。 Y暫存器內容當地址,取該地址內的資料放入Rd暫存器後Y加1。 Y暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Y暫存器內容加 q當地址,取該地址內的資料放入Rd暫存器。 將Z暫存器內容當地址,取該地址內的資料放入Rd暫存器。 Z暫存器內容當地址,取該地址內的資料放入Rd暫存器後Z加1。 Z暫存器內容先減1當地址,取該地址內的資料放入Rd暫存器。 將Z暫存器內容加 q當地址,取該地址內的資料放入Rd暫存器。 直接讀進地址為K的SRAM內容,放入Rd暫存器。 儲存Rr暫存器內容到X所指的RAM地址內。 儲存Rr暫存器內容到X所指的RAM地址內,後X加1。。 X先減1後,儲存Rr暫存器內容到X所指的RAM地址。。 儲存Rr暫存器內容到Y所指的RAM地址內。 儲存Rr暫存器內容到Y所指的RAM地址內,後Y加1。。 Y先減1後,儲存Rr暫存器內容到Y所指的RAM地址。。 儲存Rr暫存器內容到Y+q所指的RAM地址內。 儲存Rr暫存器內容到Z所指的RAM地址內。 儲存Rr暫存器內容到Z所指的RAM地址內,後Z加1。。 Z先減1後,儲存Rr暫存器內容到Z所指的RAM地址。。 儲存Rr暫存器內容到Z+q所指的RAM地址內。 將Rr內容存入地址為K的SRAM內。 由程式記憶體載入資料到R0,地址在Z暫存器內。 由I/O記憶體地址P載入資料到Rd暫存器。 將Rd暫存器內容送出到I/O記憶體地址P上。 將Rr暫存器內容壓到堆疊內,堆疊地址在SPL暫存器。 由堆疊中取出資料到Rr暫存器內,堆疊地址在SPL暫存器。 位 元 及 位 元 測 試 指 令 將I/O記憶體地址中的b位元設定1。 將I/O記憶體地址中的b位元清除。 將Rd暫存器內容左移一位元,並在右端輸入補 0。 將Rd暫存器內容右移一位元,並在左端輸入補 0。 將Rd暫存器內容與C旗標一起左旋一位元,C旗標由右端送入。 將Rd暫存器內容與C旗標一起右旋一位元,C旗標由左端送入。 將Rd暫存器內容作算術右移,MSB不動,其餘右移一位並補0。 將Rd暫存器內容之高4位元(4~7)與低4位元(0~3)互換。 將SREG暫存器內第s位元設定(1)。 將SREG暫存器內器第s位元清除。 將Rr暫存器內第b個位元存入SREG暫存器內之T位元內。 將SREG暫存器內之T位元放入Rr暫存器內第b個位元內。 設定進位位元C。 清除進位位元C。 設定負值位元N。 清除負值位元N。 設定零旗標Z。 清除零旗標Z。 設定總中斷旗標I。 清除總中斷旗標I。 設定正負值旗標S。 清除正負值旗標S。 設定溢位旗標V。 清除溢位旗標V。 設定SREG暫存器內之T位元。 清除SREG暫存器內之T位元。 設定半進位旗標H。 清除半進位旗標H。 無動作指令。 睡覺指令 重設看門狗指令。

avr单片机应用代码

1602LED液晶/**********************************************液晶1602实验晶振: 内部8.0000Mhz连接:RS PA2,RW PA1,EN PA0,DATA PD0-PD7***********************************************//******************头文件**********************/#include <iom16v.h>#include <macros.h>#include "delay.h"/******************宏定义**********************/#define uchar unsigned char#define uint unsigned int#define mode 0x38 //功能设置//DL=1 八位数据接口//N=1 两行显示//F=0 5*7点阵字符#define cursor 0x0f //显示开/关设置//D=1 显示屏开//C=1 光标开//B=1 闪烁开#define shift_off 0x06 //输入方式设置//ID=1 读写一个字符后,地址和光标加1//S=0 屏幕视窗停留在1-16列寄存器不移动#define shift_on 0x07 //输入方式设置//ID=1 读写一个字符后,地址和光标加1//S=1 每次写完一个字符屏幕视窗从左边的寄存器向右边的寄存器移动实现字符左移的效果#define run 0x1c //光标、画面移动,不影响DDRAM//S/C=1 屏幕视窗向右平移一个字符//R/L=1 右移#define clean 0x01 //清屏指令#define enter 0x02 //归位指令AC=0 光标,画面回HOME位#define RS_H PORTA|=BIT(2) //RS=1,选择数据#define RS_L PORTA&=~BIT(2) //RS=0,选择命令#define RW_H PORTA|=BIT(1) //R/W=1,读#define RW_L PORTA&=~BIT(1) //R/W=0,写#define EN_H PORTA|=BIT(0) //EN=1,使能关#define EN_L PORTA=~BIT(0) //EN=0,使能开const uchar table1[]="ji shu wu li xi"; //定义数据在flash中const uchar table2[]="dianzixiaozu507";/******************函数声明******************/void port_init(void); //M16初始化void n1602_init(void); //1602初始化void write_com(uchar com); //写指令void write_dat(uchar dat); //写数据void set_xy(uchar x,uchar y); //设置行列void show(uchar x,uchar y,uchar *str); //显示函数,x行,y列,*str字符串/*****************M16初始化******************/void port_init(void){PORTA = 0x00;//设置端口数据、方向DDRA = 0xFF;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0xFF;}/*****************1602初始化*****************/void n1602_init(void){EN_L;write_com(mode); //功能设置DelayMS(1);write_com(clean); //清屏DelayMS(1);write_com(cursor); //显示开/关设置DelayMS(1);write_com(shift_off); //每写完一个字符地址指针加+1,屏幕视窗不移动DelayMS(1);}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();n1602_init();SEI();//开全局中断}/******************写指令********************/void write_com(uchar com){RS_L; //选择命令RW_L; //写PORTD=com; //送命令EN_H;DelayMS(1); //延时不可少,否则数据丢失EN_L; //下降沿写入}/******************写数据********************/void write_dat(uchar dat){RS_H; //选择数据RW_L; //写PORTD=dat; //送数据EN_H;DelayMS(1); //延时不可少,否则数据丢失EN_L; //下降沿写入}/******************设置行列******************/void set_xy(uchar x,uchar y) //x从1-2,y从1-40{if(x==1){write_com(0x80+y-1);} //对y调整为寄存器地址else{write_com(0x80+0x40+y-1);}}/*******************主函数********************/void main(){uchar i;init_devices(); //单片机、1602初始化///***********************************第一种方法**************************************set_xy(1,1); //数据放入第1行第18列以后的寄存器DelayMS(1); //若出现乱码,可加适当延时for(i=0;i<15;i++) //循环table1的字符数{write_dat(table1[i]); //写入第i个字符DelayMS(1); //若出现乱码,可加适当延时}set_xy(2,1); //数据放入第2行第20列以后的寄存器DelayMS(1); //若出现乱码,可加适当延时for(i=0;i<15;i++) //循环table2的字符数{write_dat(table2[i]); //写入第i个字符DelayMS(1); //若出现乱码,可加适当延时}}按键//内部晶振8M//包含所需头文件#include <ioM16v.h>#include <macros.h>#include"delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned intuchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管段位uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选uchar key_board[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,0xbe,0x77,0x7b,0x7d,0x7e}; //按键键值uchar anjianzhi;//端口初始化void port_init(void){PORTA = 0x00;//A口数据置0DDRA = 0xFF;//A口方向设为输出PORTB = 0x00;//B口数据置0DDRB = 0xFF;//B口方向设为输出PORTC = 0xFF;DDRC = 0xFF;PORTD = 0xFF;DDRD = 0xFF;}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//外部中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();//SEI();//开全局中断}uchar keyboard(void) //读取键盘{uchar i=0;uchar a=0;uchar b=0;uchar key=0;DDRC=0x0f;//D口前四位输入,后四位输出//DelayUS(10);PORTC=0xf0;//D口前四位置1,后四位置0DelayUS(10);a=PINC&0xf0; //读取D口前四位数值DDRC=0xf0;//D口前四位输出,后四位输入//DelayUS(10);PORTC=0x0f;//D口后四位置1,前四位置0DelayUS(10);b=PINC&0x0f; //读取D口后四位数值key=a+b;//D口八位数据赋予keyreturn key;}void jianzhi(void)//取得键值{uchar m1,m2,i=0;if (keyboard()!=0xff){m1=keyboard();//调用读取键盘程序DelayMS(10);m2=keyboard();//调用两次if (m1==m2){for (i=0;i<16;i++){if (m1==key_board[i])//循环判断读取数值与按键键值是否同{anjianzhi=i;//数值赋予变量}}}}}//主函数void main(void){init_devices();while(1){jianzhi();//调用取得键值函数PORTA=led_date[anjianzhi];//数码管显示按键键值PORTB=0xfe;//片选数码管DelayMS(100);}}ADC//内部晶振8M#include <ioM16v.h>#include <macros.h>#include"delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned intuchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段位uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选uchar vol,vol1=0,vol2=0,i;//端口初始化void port_init(void){PORTA = 0x00;//设置端口数据和方向DDRA = 0x00;PORTB = 0x00;DDRB = 0xFF;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0xFF;}void adc_init(void){//adc转换初始化ADCSRA = 0x00; //禁止AD转换ADMUX = 0xe0;//ADC0单端输入,2.56V片内基准电源,转换结果左对齐SFIOR |= 0x00;//自动触发源禁止ACSR = 0x80; //禁止模拟比较器ADCSRA = 0x8F;//ADC使能,中断使能,128分频}unsigned int adc_calc(void){//计算实际电压unsigned long value=0;unsigned int voltage=0; //电压单位为(mV)value=ADCL>>6; //首先读低位value|=(int)ADCH << 2; //然后读高位voltage=(value*2560)>>10;return voltage;}#pragma interrupt_handler adc_isr:15void adc_isr(void)if(i==5)vol1=adc_calc();if(i==10)vol2=adc_calc();if(vol1==vol2)vol=vol1;i++;if(i>10)i=0;ADCSRA|=BIT(ADSC);//ADC开始转换}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//外部中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();adc_init();SEI();//开全局中断ADCSRA|=BIT(ADSC);//ADC开始转换}//主函数void main(void){init_devices();//在这继续添加你的代码while(1){PORTB=led_date[vol%10];PORTD=0xf7;DelayUS(500);PORTB=led_date[vol/10%10]; PORTD=0xfb;DelayUS(500);PORTB=led_date[vol/100%10]; PORTD=0xfd;DelayUS(500);PORTB=led_date[vol/1000%10]; PORTD=0xfe;DelayUS(500);}}DS1302//内部晶振8M#include <iom16v.h>#include <macros.h>#include"delay.h"#define uchar unsigned char#define uint unsigned int#define DS1302_RESET 6 //定义1302的RST接在PORTX.6#define DS1302_IO 5 //定义1302的IO接在PORTX.5#define DS1302_CLK 4 //定义1302的时钟接在PORTX.4#define DDRX DDRD#define PORTX PORTD#define PINX PIND#define DS1302_RESET_OUT DDRX|=1<<DS1302_RESET //复位端置为输出#define SET_DS1302_RESET PORTX|=1<<DS1302_RESET //复位端置1#define CLR_DS1302_RESET PORTX&=~(1<<DS1302_RESET) //复位端清0#define DS1302_IO_OUT DDRX|=1<<DS1302_IO //数据端置为输出#define DS1302_IO_IN DDRX&=~(1<<DS1302_IO) //数据端置为输入#define SET_DS1302_IO PORTX|=1<<DS1302_IO //数据端置1#define CLR_DS1302_IO PORTX&=~(1<<DS1302_IO) //数据端清0#define IN_DS1302_IO PINX&(1<<DS1302_IO) //数据端输入数据#define DS1302_CLK_OUT DDRX|=1<<DS1302_CLK //时钟端置为输出#define SET_DS1302_CLK PORTX|=1<<DS1302_CLK //时钟端置1#define CLR_DS1302_CLK PORTX&=~(1<<DS1302_CLK) //时钟端清0#define DS1302_Sec_Write 0x80 //秒数据写地址#define DS1302_Sec_Read 0x81 //秒数据读地址#define DS1302_Min_Write 0X82 //分数据写地址#define DS1302_Min_Read 0X83 //分数据读地址#define DS1302_Hour_Write 0X84 //时数据写地址#define DS1302_Hour_Read 0X85 //时数据读地址#define DS1302_Day_Write 0X86 //日数据写地址#define DS1302_Day_Read 0X87 //日数据读地址#define DS1302_Month_Write 0X88 //月数据写地址#define DS1302_Month_Read 0X89 //月数据读地址#define DS1302_Week_Write 0X8A //星期数据写地址#define DS1302_Week_Read 0X8B //星期数据读地址#define DS1302_Year_Write 0X8C //年数据写地址#define DS1302_Year_Read 0X8D //年数据读地址#define DS1302_Control 0x8e //控制数据地址#define DS1302_Charger 0x90 //充电控制地址const Position[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选//const Led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管0~9 const Led[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳数码管0~9uchar time[8]={0x00,0x09,0x03,0x25,0x03,0x13,0x55,0x00}; //时钟初始写入数据uchar second; //秒uchar minute; //分uchar hour; //时uchar day; //日uchar month; //月uchar year; //年uchar week; //周uchar disbuff[16]; //显示缓冲uchar TimeSign=0; //时钟显示标志为0时,数码管显示周时秒分,为1时,显示年月日//端口初始化void port_init(void){PORTA = 0xFF; //设定端口状态DDRA = 0xFF;PORTB = 0xFF;DDRB = 0xFF;PORTC = 0x00;DDRC = 0x00;PORTD = 0xFF;DDRD = 0xF0;}//定时器T0初始化void timer0_init(void){TCCR0 = 0x00;//停止定时器TCNT0 = 0x00;//初始值OCR0 = 0x50;//匹配值TIMSK |= 0x02;//中断允许TCCR0 = 0x0B;//启动定时器}//外中断初始化void int_init(void){MCUCR |= 0x03;//上升沿触发中断MCUCSR|= 0x00;//取消异步模式GICR |= 0x40;//允许外部中断0}void init_devices(void){SREG=0x00;; //禁止所有中断MCUCR = 0x00;MCUCSR = 0x80;//禁止JTAGGICR = 0x00;port_init();timer0_init();int_init();}/************************************** DS1302操作函数组**************************************///写入1302数据函数://入口:addr为写入地址码,data为写入数据//返回:无void DS1302_Write(uchar addr,uchar data){uchar i;DS1302_IO_OUT; //配置IO为输出CLR_DS1302_RESET; //清复位,停止所有操作CLR_DS1302_CLK; //清时钟,准备操作SET_DS1302_RESET; //置复位,开始操作for(i=8;i>0;i--) //此循环写入地址码{{if(addr&0x01)SET_DS1302_IO; //当前位为1,置数据位elseCLR_DS1302_IO; //当前位为0,清数据位}SET_DS1302_CLK; //产生时钟脉冲,写入数据CLR_DS1302_CLK;addr>>=1; //移位,准备写入下1位}for(i=8;i>0;i--) //此循环写入数据码{{if(data&0x01) //数据为1时SET_DS1302_IO; //置高电平else //数据为0时CLR_DS1302_IO; //置低电平}SET_DS1302_CLK; //置时钟为高CLR_DS1302_CLK; //置时钟为低data>>=1; //数据右移}CLR_DS1302_RESET; //清复位,停止所有操作DS1302_IO_IN; //清输出状态}//从1302中读出数据://入口:addR为读数据所在地址//返回:读出的数据datachar DS1302_Read(uchar addr){uchar data,i;DS1302_IO_OUT; //配置IO为输出CLR_DS1302_RESET; //清复位,停止所有操作CLR_DS1302_CLK; //清时钟,准备操作SET_DS1302_RESET; //置复位,开始操作for(i=8;i>0;i--) //此循环写入地址码{{if(addr&0x01)SET_DS1302_IO; //当前位为1,置数据位elseCLR_DS1302_IO;} //当前位为0,清数据位SET_DS1302_CLK; //产生时钟脉冲,写入数据CLR_DS1302_CLK;addr>>=1; //移位,准备写入下1位}DS1302_IO_IN; //端口输入for(i=8;i>0;i--) //此循环读出1302的数据{data>>=1; //数据右移if(IN_DS1302_IO) //判断端口是否读出高电平data|=0x80; //读高电平,数据最高位置1SET_DS1302_CLK; //置时钟为高CLR_DS1302_CLK; //置时钟为低}CLR_DS1302_RESET; //清复位,停止所有操作return(data); //返回变量值}/*/检查1302状态uchar Check_DS1302(void){DS1302_Write(DS1302_Control,0x80);if(DS1302_Read(DS1302_Control)==0x80) return 1;return 0;}*///向1302中写入时钟数据void DS1302_Write_Time(void){DS1302_Write(DS1302_Control,0x00); //关闭写保护DS1302_Write(DS1302_Sec_Write,0x80); //振荡器暂停//DS1302_Write(DS1302_Charger,0xA9); //涓流充电DS1302_Write(DS1302_Year_Write,time[1]); //年DS1302_Write(DS1302_Month_Write,time[2]); //月DS1302_Write(DS1302_Day_Write,time[3]); //日DS1302_Write(DS1302_Week_Write,time[4]); //周DS1302_Write(DS1302_Hour_Write,time[5]); //时DS1302_Write(DS1302_Min_Write,time[6]); //分DS1302_Write(DS1302_Sec_Write,time[7]); //秒DS1302_Write(DS1302_Control,0x80); //打开写保护}//从1302中读出当前时钟void DS1302_Read_Time(void){time[1]=DS1302_Read(DS1302_Year_Read); //年time[2]=DS1302_Read(DS1302_Month_Read); //月time[3]=DS1302_Read(DS1302_Day_Read); //日time[4]=DS1302_Read(DS1302_Week_Read); //周time[5]=DS1302_Read(DS1302_Hour_Read); //时time[6]=DS1302_Read(DS1302_Min_Read); //分time[7]=DS1302_Read(DS1302_Sec_Read); //秒//BCD码到二进制的调整second=((time[7]&0x70)>>4)*10+(time[7]&0x0f);minute=((time[6]&0x70)>>4)*10+(time[6]&0x0f);hour=((time[5]&0x30)>>4)*10+(time[5]&0x0f);week=time[4]&0x07;day=((time[3]&0x30)>>4)*10+(time[3]&0x0f);month=((time[2]&0x10)>>4)*10+(time[2]&0x0f);year=((time[1]&0x70)>>4)*10+(time[1]&0x0f);}void Time_Disbuffer(void) //显示缓冲{disbuff[0]=second%10;disbuff[1]=second/10;disbuff[2]=minute%10;disbuff[3]=minute/10;disbuff[4]=hour%10;disbuff[5]=hour/10;disbuff[6]=week;disbuff[7]=0;disbuff[8]=day%10;disbuff[9]=day/10;disbuff[10]=month%10;disbuff[11]=month/10;disbuff[12]=year%10;disbuff[13]=year/10;disbuff[14]=0;disbuff[15]=2;}#pragma interrupt_handler time0:20 //T0比较匹配中断void time0(void){static uchar posit=0;if(TimeSign==0) //数码管显示周时分秒{if((posit==2)|(posit==6)) //数据显示第三位和第五位时{PORTA=Led[disbuff[posit]]&0x7F; //0x7F的作用是使要显示的数字加上一个点}else{PORTA=Led[disbuff[posit]]; //给A口数据}PORTB=Position[posit]; //给B口位选}if(TimeSign==1) //数码管显示年月日{PORTA=Led[disbuff[posit+8]]; //给A口数据PORTB=Position[posit]; //给B口位选}posit++; //自加if(posit>7)posit=0; //清零}#pragma interrupt_handler INT_0:2 //外部中断0void INT_0(void){switch(TimeSign){case 0:TimeSign=1;break;case 1:TimeSign=0;break;}}//主函数void main(void){init_devices();DS1302_Write_Time(); //写入初始时间SREG=0x80;;//开全局中断while(1){DS1302_Read_Time();Time_Disbuffer();}}LED点阵//内部晶振8M//包含所需头文件#include <ioM16v.h>#include <macros.h>#include"delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned intuchardianzi[]={0xFF,0xC3,0xEB,0x81,0x6B,0x63,0x7F,0xFF,0xFF,0xEF,0xED,0x05,0xE9,0xE D,0xEF,0xFF,0xFF,0xBF,0xBB,0x83,0xBB,0xBB,0xBD,0xFF,0xdb,0xc1,0x5B,0x9B,0xE1,0x6B,0x8B,0 xFF};//汉字字模//端口初始化void port_init(void){PORTA = 0xFF;//A口数据置0DDRA = 0xFF;//A口方向设为输出PORTB = 0xFF;//B口数据置1 DDRB = 0xFF;//B口方向设为输出PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//外部中断触发方式MCUCSR = 0x80;//禁止JTAG GICR = 0x00;//外部中断使能port_init();//SEI();//开全局中断}//主函数void main(void){uchar i,j,a=0;//定义变量init_devices();//初始化while(1){for(j=0;j<200;j++)//每个字显示次数{for (i=0;i<8;i++)//逐列式扫描每个汉字字模{PORTA=dianzi[i+a];//调用每列字模数据PORTB=~(1<<i);//选通每列DelayUS(600);//延迟//PORTC=0xFF;}}a=a+8;//切换下一个字if(a>24)//判断所有字是否显示a=0;}}LED流水灯//内部晶振8M//包含所需头文件#include <ioM16v.h>#include <macros.h>#include "delay.h"/*------宏定义------*/#define uchar unsigned char #define uint unsigned int//端口初始化void port_init(void){PORTA = 0x00;//A口数据置0 DDRA = 0xFF;//A口设为输出PORTB = 0x00;//B口数据置1 DDRB = 0x00;//B口设为输入PORTC = 0x00;DDRC = 0xFF;PORTD = 0x00;DDRD = 0xFF;}void init_devices(void)CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();//SEI();//开全局中断}//主函数void main(void){uint n=0;uchar j=0xfe;//定义变量初值init_devices();//调用初始函数while(1){for(n=0;n<7;n++)//设置循环{PORTA=j;j=(j<<1)|(j>>7);//LED左移DelayMS(500);//延时程序for(n=0;n<7;n++){PORTA=j;j=(j>>1)|(j<<7);//LED右移DelayMS(500);}}}串口通信//内部晶振8M#include <ioM16v.h>#include <macros.h>#include"delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned int//端口初始化void port_init(void){PORTA = 0x00;//设置端口方向、数据DDRA = 0x00;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x03;}//串口通信初始化void usart_init(void){UCSRB = 0x00;//禁止中断UCSRA = 0x00;//数据发送、接受位、数据帧错误、奇偶校验、溢出、多机模式UCSRC = BIT(URSEL) | 0x06;//使用UBRRH寄存器、数据位数8位UBRRL = 0x19;//设置波特率UBRRH = 0x00;UCSRB = 0x98;//接受中断使能、接受、发送使能、不使用第9数据位}void uart_putchar(char x){while (!(UCSRA&0x20))//查询发送区是否为空;UDR=x; //发送数据}//串行接收结束中断服务程序#pragma interrupt_handler usart_rx_isr:12void usart_rx_isr(void){char y;y=UDR;uart_putchar(y);//把接收到的数据返回给上位机}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();usart_init();SEI();//开全局中断}//主函数void main(void){init_devices();//在这继续添加你的代码while(1){NOP();}}低频频率计//内部晶振8M#include <ioM16v.h>#include <macros.h>#include "delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned intuint m,value;const ucharled_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA 1,0x86,0x8E};const uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//端口初始化void port_init(void){PORTA = 0xFF;//设置端口数据、方向DDRA = 0xFF;PORTB = 0xFF;DDRB = 0xFF;PORTC = 0x00;DDRC = 0x00;PORTD = 0x40;DDRD = 0x00;}//定时T1初始化void timer1_init(void){TCCR1B = 0x00;//停止定时器TIMSK |= 0x20;//中断允许TCNT1H = 0x00;TCNT1L = 0x00;//初始值OCR1AH = 0x00;OCR1AL = 0x00;//匹配A值OCR1BH = 0x00;OCR1BL = 0x00;//匹配B值ICR1H = 0xFF;ICR1L = 0xFF;//输入捕捉匹配值TCCR1A = 0x00;TCCR1B = 0x42;//启动定时器}//定时器T1输入捕捉中断服务程序#pragma interrupt_handler timer1_capt_isr:6void timer1_capt_isr(void){//timer 1 input capture event, read (int)value in ICR1 using; TCNT1=0;value=ICR1L; //Read low byte first (important) value|=(int)ICR1H << 8; //Read high byte and shift into top byte m=1000000/value;TIFR|=BIT(ICF1);//软件写1清中断标志}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();timer1_init();SEI();//开全局中断}//主函数void main(void){init_devices();//在这继续添加你的代码while(1){PORTB=led_date[m%10];//设置数码管数据PORTA=0xfe;//设置数码管片选DelayUS(100);PORTB=led_date[m/10%10];PORTA=0xfd;DelayUS(100);PORTB=led_date[m/100%10]; PORTA=0xfb;DelayUS(100);PORTB=led_date[m/1000%10]; PORTA=0xf7;DelayUS(100);PORTB=led_date[m/10000%10]; PORTA=0xef;DelayUS(100);PORTB=led_date[m/100000%10]; PORTA=0xdf;DelayUS(100);PORTB=led_date[m/1000000%10]; PORTA=0xbf;DelayUS(100);PORTB=led_date[m/10000000%10]; PORTA=0x7f;DelayUS(100);}}方波//内部晶振8M#include <ioM16v.h>#include <macros.h>#include "delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned int//端口初始化void port_init(void){PORTA = 0x00;//设置端口方向、数据DDRA = 0x00;PORTB = 0x08;DDRB = 0x08;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x00;//定时器T0初始化void timer0_init(void){TCCR0 = 0x00;//停止定时器TCNT0 = 0x00;//初始值OCR0 = 0x7F;//匹配值TIMSK |= 0x00;//中断允许TCCR0 = 0x6C;//启动定时器}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();timer0_init();SEI();//开全局中断}//主函数void main(void){init_devices();//在这继续添加你的代码while(1){NOP();}}蜂鸣器//内部晶振8M//包含所需头文件#include <ioM16v.h>#include <macros.h>#include "delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned int//端口初始化void port_init(void){PORTA = 0x00;//A口数据置0DDRA = 0xFF;//A口设为输出PORTB = 0x00;//B口数据置1DDRB = 0x00;//B口设为输入PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();//SEI();//开全局中断}//主函数void main(void)init_devices();//调用初始函数while(1){PORTA^=BIT(PA0);//PA0每次取反DelayMS(3000);}}高频频率计//内部晶振8M#include <ioM16v.h>#include <macros.h>#include "delay.h"/*------宏定义------*/#define uchar unsigned char#define uint unsigned intuint m;const uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA 1,0x86,0x8E};const uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//端口初始化void port_init(void){PORTA = 0xFF;//设置端口数据、方向DDRA = 0xFF;PORTB = 0x02;DDRB = 0x00;PORTC = 0x00;DDRC = 0x00;PORTD = 0xFF;DDRD = 0xFF;}//定时T1初始化void timer1_init(void){TCCR1B = 0x00;//停止定时器TIMSK |= 0x00;//中断允许TCNT1H = 0x00;TCNT1L = 0x00;//初始值OCR1AH = 0xFF;OCR1AL = 0xFF;//匹配A值OCR1BH = 0xFF;OCR1BL = 0xFF;//匹配B值ICR1H = 0xFF;ICR1L = 0xFF;//输入捕捉匹配值TCCR1A = 0x00;TCCR1B = 0x07;//启动定时器}//定时器T2初始化void timer2_init(void){TCCR2 = 0x00;//停止定时器ASSR = 0x00;//异步时钟模式TCNT2 = 0x3D;//初始值OCR2 = 0x3C;//匹配值TIMSK |= 0x40;//中断允许TCCR2 = 0x07;//启动定时器}//T2溢出中断服务程序#pragma interrupt_handler timer2_ovf_isr:5 void timer2_ovf_isr(void){TCNT2 = 0x3D;m=TCNT1*40;//延迟25MS进入中断程序TCNT1=0;}void init_devices(void){CLI(); //禁止所有中断MCUCR = 0x00;//INT0、INT1中断触发方式MCUCSR = 0x80;//禁止JTAGGICR = 0x00;//外部中断使能port_init();timer1_init();timer2_init();SEI();//开全局中断}//主函数void main(void){init_devices();//在这继续添加你的代码while(1){PORTD=led_date[m%10];//设置数码管数据PORTA=0xfe;//设置数码管片选DelayUS(100);PORTD=led_date[m/10%10];PORTA=0xfd;DelayUS(100);PORTD=led_date[m/100%10];PORTA=0xfb;DelayUS(100);PORTD=led_date[m/1000%10];PORTA=0xf7;DelayUS(100);PORTD=led_date[m/10000%10];PORTA=0xef;DelayUS(100);PORTD=led_date[m/100000%10];。

河海物理系AVR单片机实验程序代码汇总

第一个实验:闪烁灯$regfile = "m16def.dat" '定义单片机型号$crystal = 8000000 '定义时钟频率8Mhz Config Portc.0 = OutputConfig Portc.1 = OutputDoPortc = 1Waitms 1Portc = 2Waitms 1LoopEnd第二个实验:LED管跑马灯实验$regfile = "m16def.dat" '定义单片机型号$crystal = 8000000 '定义时钟频率8MhzConfig Portc = Output '定义端口portc为输出端口Dim I As BytePortc = 1Wait 1DoFor I = 1 To 7Rotate Portc , LeftWait 1NextFor I = 1 To 7Rotate Portc , RightWait 1NextLoopEnd第三个实验:6个数码管扫描实验$regfile = "m16def.dat" '明确工作芯片型号$crystal = 2000000 '晶振频率Config Porta = Output 'PA口为数码管选通口Config Portc = Output 'PC口为数字显示段码输出口Dim A As Byte , X As Byte , I As ByteA = 0 : X = 0 : I = 0Dim B0 As Byte , B1 As Byte , B2 As Byte , B3 As Byte , B4 As Byte , B5 As ByteB0 = 0 : B1 = 0 : B2 = 0 : B3 = 0 : B4 = 0 : B5 = 0Dim C(16) As ByteRestore Duanma '让READ指针指向Duanma标号后的第一个数据For I = 1 To 10Read C(i) '让数组C(I)内依次存放共阴数码管的数字显示段码Next IDoX = X + 1B5 = B4 : B4 = B3 : B3 = B2 : B2 = B1 : B1 = B0 : B0 = C(x) '对即将在各位数码管显示的数字的设定,控制显示的数字的左移If X > 9 Then X = 0For I = 1 To 55 '数码管动态扫描的循环控制,循环的次数控制每个数字移动时间约为1秒左右Portc = B0 : Porta = &B01111111 : Waitms 3 '依次控制从右到左的6个数码管的显示,Portc送出显示段码,Porta从右到左依次选通各位数码管Portc = B1 : Porta = &B10111111 : Waitms 3Portc = B2 : Porta = &B11011111 : Waitms 3Portc = B3 : Porta = &B11101111 : Waitms 3Portc = B4 : Porta = &B11110111 : Waitms 3Portc = B5 : Porta = &B11111011 : Waitms 3Next ILoopEndDuanma: '数码管段码Data &HED , &H81 , &HF4 , &HB5 , &H99 '数字0,1,2,3,4的段码Data &H3D , &H7D , &H85 , &HFD , &HBD '数字5,6,7,8,9的段码第四个程序:8通道AD转换+LCD显示实验'不连4.2伏时,可以短路一下R13,再次观察Channel 0 的采集值,并调节WE1,观察有没有反应。

AVR单片机指令入门

AVR指令中使用的符号1、状态寄存器与标志位SREG: 8位状态寄存器,其中每一位的定义为:C:进位标志位Z:结果为零标志位N:结果为负数标志位V: 2的补码溢出标志位S: N⊕V,用于符号测试的标志位H:操作中产生半进位的标志位T:用于和BLD、BST指令进行位数据交换的位I:全局中断触发/禁止标志位2、寄存器和操作码Rd:目的(或源)寄存器,取值为R0~R31或R16~R31(取决于指令)。

Rr:源寄存器,取值为R0~R31。

A:I/O寄存器,取值为0~63或0~31(取决于指令)。

b: I/O寄存器中的指定位,常数(0~7)。

s:状态寄存器SREG中的指定位,常数(0~7)。

K:立即数,常数(0~255)。

k:地址常数,取值范围取决于指令。

q:地址偏移量常数(0~63)。

X、Y、Z:地址指针寄存器(X=R27:R26;Y=R29:R28;Z=R31:R30)。

3、堆栈STACK:作为返回地址和压栈寄存器的堆栈SP:堆栈STACK的指针AVR指令的寻址方式和寻址空间1、单寄存器直接寻址由指令指定一个寄存器的内容作为操作数,在指令中给出寄存器的直接地址,这种寻址方式称为单寄存器直接寻址。

单寄存器寻址的地址范围限制为通用工作寄存器组中的32个寄存器R0~R31,或后16个寄存器R16~R31。

例:INC Rd;操作:Rd←Rd+1。

INC R5;将寄存器R5内容加1回放。

2、双寄存器直接寻址双寄存器直接寻址方式与单寄存器直接寻址方式相似,它是将指令指出的两个寄存器Rd和Rr的内容作为操作数,而结果存放在Rd寄存器中。

指令中同时给出两个寄存器的直接地址,这种寻址方式称为双寄存器直接寻址。

双寄存器寻址的地址范围限制为通用工作寄存器组中的32个寄存器R0~R31,或后16个寄存器R16~R31,或后8个寄存器R16~R23(取决于不同指令)。

例:ADD Rd,Rr;操作:Rd←Rd+Rr。

ADD R0,R1;将R0和R1寄存器内容相加,结果回放R0。

AVR单片机指令表

AVR单片机指令综合ATmega161指令,包括所有AVR单片机指令指令说明:AVR单片机的指令系统对不同器件有不用指令他们关系如下:(详情见本附录)(1) 89条指令器件:AT90S1200,最基本指令,附录:各种A V R器件指令比较表中无标记(2) 90条指令器件(+89条基本指令(3) 118条指令器件(+ 90条;(4) 121条指令器件(+ 118 条;(5) 130条指令器件(+121条附录C-1: AVR AT90S1200器件指令速查表(89条指令)算术和逻辑指令条件转移指令位指令和位测试指令ADD Rd,Rr加法SBRC Rr,b位清零跳行SBI P,b置位I/O位ADC Rd,Rr带进位加SBRS Rr,b位置位跳行CBI P,b清零I/O位SUB Rd,Rr减法SBIC P,b I/O位清零跳行LSL Rd左移SUBI Rd,K减立即数SBIS P,b I/O位置位跳行LSR Rd右移SBC Rd,Rr带进位减BRBS s,k SREG位置位转ROL Rd带进位左循环SBCI Rd,K带C减立即数BRBC s,k SREG位清零转ROR Rd带进位右循环AND Rd,Rr与BREQ k相等转移ASR Rd算术右移ANDI Rd,K与立即数BRNE k不相等转移SWAP Rd半字节交换OR Rd,Rr或BRCS k C置位转BSET s置位SREGORI Rd,K或立即数BRCC k C清零转BCLR s清零SREG EOR Rd,Rr异或BRSH k 附录C-2: AVR器件(指令速查表) 118条指令器件AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/8515,AT90S8534/8535算术和逻辑指令BRCC k C 清零转位指令和位测试指令ADD Rd,Rr 加法BRSH k ADIW Rdl,K 加立即数BRMI k 负数转移LSL Rd 左移SUB Rd,Rr 减法BRPL k 正数转移LSR Rd 右移SUBI Rd,Rr减立即数BRGE kSBIW Rdl,K 减立即数BRHC kH 清零转移SWAP Rd半字节交换AND Rd,Rr 与BRTS k T 置位转移BSET s 置位SREG ANDI Rd,K 与立即数BRTC k T清零转移BCLR s 清零SREG OR Rd,Rr或BRVS k V 置位转移BST Rr,b Rr 的b 位送T ORI Rd,K 或立即数BRVC k V 清零转移BLD Rd T 送Rr 的b位EOR Rd,Rr 异或BRIE k 中断位置位转移SEC 置位C COM Rd 取反BRID k 中断位清零转移CLC 清零C NEG Rd 取补数据传送指令SEN 置位N SBR Rd,K 寄存器位置位MOV Rd,Rr 寄存器传送CLN 清零NCBR Rd,K 寄存器位清零LD Rd, XX间接取数CLZ 清零Z DEC Rd 减1SEI 置位I TST Rd 测试零或负CLI清零ICLR Rd寄存器清零LD Rd,Y+Y间接取数后LD Rd,–Y Y 间接取数先LDD Rd,Y+q Y间接取数IJMP间接转移(Z)LD Rd, Z Z 间接取数SET 置位TLD Rd, Z+Z 间接取数后LD Rd,–Z Z 间接取数先ICALL间接调用(Z)qCLH 清零H LDS Rd,K 从SRAM 装入NOP 空操作RET 子程序返回ST X ,RrX 间接存数SLEEP 休眠指令RETI 中断返回WDR 看门狗复位CPSE Rd,Rr 比较相等跳行CP Rd,Rr比较ST Y+ ,Rr Y 间接存数后ST –Y ,Rr Y 间接存数先STD Y+q ,RrY 间接存数+89条基本指令是AT90S1200SBIC P,b I/O 位清零跳行ST –Z ,RrZ 间接存数先-BRBS s,k SREG 位置位转+ 90条指令器件BRBC s,k SREG 位清零转LPM 从程序区取数BRNE k 不相等转移IN Rd,P 从/O 口取数BRCS kC 置位转OUT P, Rdr 存数I/O 口PUSH Rr 压栈POP Rd,出栈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVR单片机指令综合
ATmega161指令,包括所有AVR单片机指令指令
说明:AVR单片机的指令系统对不同器件有不用指令他们关系如下:(详情见本附录)
(1) 89条指令器件:AT90S1200,最基本指令,附录:各种A V R器件指令比较表中无标记
(2) 90条指令器件(+89条基本指令
(3) 118条指令器件(
+ 90条;
(4) 121条指令器件(+ 118 条;
(5) 130条指令器件(+121条
附录C-1: AVR AT90S1200器件指令速查表(89条指令)
算术和逻辑指令条件转移指令位指令和位测试指令ADD Rd,Rr加法SBRC Rr,b位清零跳行SBI P,b置位I/O位
ADC Rd,Rr带进位加SBRS Rr,b位置位跳行CBI P,b清零I/O位
SUB Rd,Rr减法SBIC P,b I/O位清零跳行LSL Rd左移
SUBI Rd,K减立即数SBIS P,b I/O位置位跳行LSR Rd右移
SBC Rd,Rr带进位减BRBS s,k SREG位置位转ROL Rd带进位左循环SBCI Rd,K带C减立即数BRBC s,k SREG位清零转ROR Rd带进位右循环AND Rd,Rr与BREQ k相等转移ASR Rd算术右移
ANDI Rd,K与立即数BRNE k不相等转移SWAP Rd半字节交换
OR Rd,Rr或BRCS k C置位转BSET s置位SREG
ORI Rd,K或立即数BRCC k C清零转BCLR s清零SREG EOR Rd,Rr异或BRSH k
附录C-2: AVR器件(指令速查表) 118条指令器件
AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/8515,AT90S8534/8535
算术和逻辑指令BRCC k C 清零转
位指令和位测试指令
ADD Rd,Rr 加法BRSH k ADIW Rdl,K 加立即数BRMI k 负数转移LSL Rd 左移SUB Rd,Rr 减法BRPL k 正数转移LSR Rd 右移
SUBI Rd,Rr
减立即数
BRGE k
SBIW Rdl,K 减立即数BRHC k
H 清零转移SWAP Rd
半字节交换AND Rd,Rr 与BRTS k T 置位转移
BSET s 置位SREG ANDI Rd,K 与立即数BRTC k T
清零转移BCLR s 清零SREG OR Rd,Rr
或BRVS k V 置位转移BST Rr,b Rr 的b 位送T ORI Rd,K 或立即数BRVC k V 清零转移BLD Rd T 送Rr 的b

EOR Rd,Rr 异或BRIE k 中断位置位转移SEC 置位
C COM Rd 取反BRI
D k 中断位清零转移
CLC 清零C NEG Rd 取补数据传送指令
SEN 置位
N SBR Rd,K 寄存器位置位MOV Rd,Rr 寄存器传送CLN 清零
N
CBR Rd,K 寄存器位清零LD Rd, X
X间接取数
CLZ 清零
Z DEC Rd 减1SEI 置位
I TST Rd 测试零或负CLI
清零
I
CLR Rd
寄存器清零
LD Rd,Y+Y间接取数后LD Rd,–Y Y 间接取数先LDD Rd,Y+q Y
间接取数IJMP间接转移(Z)
LD Rd, Z Z 间接取数SET 置位T
LD Rd, Z+Z 间接取数后LD Rd,–Z Z 间接取数先ICALL间接调用(Z)q
CLH 清零H LDS Rd,K 从SRAM 装入NOP 空操作RET 子程序返回ST X ,Rr
X 间接存数
SLEEP 休眠指令RETI 中断返回WDR 看门狗复位
CPSE Rd,Rr 比较相等跳行
CP Rd,Rr
比较
ST Y+ ,Rr Y 间接存数后ST –Y ,Rr Y 间接存数先STD Y+q ,Rr
Y 间接存数
+89条基本指令是
AT90S1200
SBIC P,b I/O 位清零跳行
ST –Z ,Rr
Z 间接存数先-BRBS s,k SREG 位置位转+ 90条指令器件
BRBC s,k SREG 位清零转LPM 从程序区取数BRNE k 不相等转移IN Rd,P 从/O 口取数BRCS k
C 置位转
OUT P, Rdr 存数I/O 口PUSH Rr 压栈POP Rd,
出栈。

相关文档
最新文档