AVRmega8汇编指令汇总.

合集下载

一个AVR(mega8)上非常好用的串口程序

一个AVR(mega8)上非常好用的串口程序

一个A VR(mega8)上非常好用的串口程序当然这个程序也可以很容以的移植到其他avr芯片上。

接受发送都使用中断。

编译程序使用GCC(winavr)uart.h/************************************************* ** 作者:望望** 2005年1月23日** 目标MCU:MEGA8 晶振:外部(EXT) *************************************************/#ifndef _W_UART_H_#define _W_UART_H_#include <avr/io.h>#define REC_CAP 20 //接收缓冲区大小#define SEND_CAP 200 //发送缓冲区大小//标志位#define SEND_OVER 0 //发送结束extern volatile unsigned char FLAG_UART;extern unsigned int rec_tail,rec_head;extern unsigned char rec_buf[];extern unsigned int send_tail,send_head;extern unsigned char send_buf[];extern int i_uart_getchar(void);extern int i_uart_add2buf(char c);extern void i_uart_pstr(unsigned char *buf);extern void i_uart_sendbuf(void);extern int i_uart_putchar(char c);extern void i_uart_putstr(unsigned char *buf,unsigned char size);/* UART初始化*/extern void uart_init(void);#endifuart.c/************************************************* ** 作者:望望** 2005年1月23日** 目标MCU:MEGA8 晶振:外部(EXT) *************************************************/#include <avr/io.h>#include <avr/signal.h>#include "uart.h"typedef void (*voidFun08)(unsigned char);volatile static voidFun08 UartRxFunc;volatile unsigned char FLAG_UART=0;//---------环形buf特性-----------------////--放入数据从头指针,取数据从尾指针---//unsigned int rec_tail=0,rec_head=0;unsigned char rec_buf[REC_CAP];unsigned int send_tail=0,send_head=0;unsigned char send_buf[SEND_CAP];void uartSetRxHandler(void (*rx_func)(unsigned char c)) {UartRxFunc = rx_func;}//-------------UART接收完成中断----------------------// SIGNAL(SIG_UART_RECV){unsigned char c;// get received charc = UDR;// if there's a user function to handle this receive eventif(UartRxFunc){UartRxFunc(c);}else{rec_buf[rec_head]=c;rec_head=(rec_head<(REC_CAP-1))?(rec_head+1):0;}}int i_uart_getchar(void){unsigned char c;if(rec_tail!=rec_head){c=rec_buf[rec_tail];rec_tail=(rec_tail<(REC_CAP-1))?(rec_tail+1):0;return c;}else{return -1;}}//------------UART发送完成中断----------------------// SIGNAL(SIG_UART_TRANS)if(send_tail!=send_head){UDR=send_buf[send_tail];send_tail=(send_tail<(SEND_CAP-1))?(send_tail+1):0;}else{FLAG_UART|=_BV(SEND_OVER); //置标志位,表示发送缓冲区完成;}}int i_uart_add2buf(char c){send_buf[send_head]=c;send_head=(send_head<(SEND_CAP-1))?(send_head+1):0;return 0;}void i_uart_pstr(unsigned char *buf){unsigned char i;i=0;while(*(buf+i)!=0){i_uart_add2buf(*(buf+i));i++;}}void i_uart_sendbuf(void){if(((FLAG_UART&_BV(SEND_OVER))==_BV(SEND_OVER))&&(send_tail!=send_head)) {FLAG_UART&=~_BV(SEND_OVER);UDR=send_buf[send_tail];send_tail=(send_tail<(SEND_CAP-1))?(send_tail+1):0;}}int i_uart_putchar(char c){if((FLAG_UART&_BV(SEND_OVER))!=_BV(SEND_OVER)){send_buf[send_head]=c;send_head=(send_head<(SEND_CAP-1))?(send_head+1):0;}else{UDR=c;FLAG_UART&=~_BV(SEND_OVER);}return 1;void i_uart_putstr(unsigned char *buf,unsigned char size){unsigned char i;for(i=0;i<size;i++){i_uart_putchar(*(buf+i));}}/*----------------设置奇偶校验---------------*//* 0:N无1:E偶2:O奇*//*----------------设置停止位------------------*//* 0:1位1:2位*/void set_verify(unsigned char sc,unsigned char sd){sc=(sc>0)?(sc+1):0;UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0)|(sc<<4)|(sd<<3);}// set the uart baud ratevoid uartSetBaudRate(unsigned long baudrate){// calculate division factor for requested baud rate, and set itunsigned int bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);UBRRL = bauddiv;#ifdef UBRRHUBRRH = bauddiv>>8;#endif}/* UART初始化*/void uart_init(void){UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE)|_BV(TXCIE);//允许发送和接收//8位数据+1位STOP位偶校验uartSetBaudRate(9600); //设定波特率set_verify(0,0); //无校验,1位停止位#ifdef INTERRUPT_SEND_AND_RECFLAG_UART|=_BV(SEND_OVER);//打开发送完成标志位UartRxFunc = 0; //接收函数初始化#endif}。

AVR指令集

AVR指令集

间接转移(Z)
LD Rd, Z
Z 间接取数
SET
置位 T
RCALL k 相对调用
LD Rd, Z+ Z 间接取数后
CLT
清零 T
ICALL
间接调用(Z)
LD Rd,–Z
Z 间接取数先
SEH
置位 H
RET
子程序返回
LDD Rd, Z+q Z 间接取数 q
CLH
清零 H
RETI
中断返回
LDS Rd,K
从 SRAM 装入 NOP
AVR 单片机指令系统
3
AVR 单片机指令系统简介
4.4 算术和逻辑指令
4.4.1 加法指令 1 ADD 不带进位加法 说明 两个寄存器不带进位 C 标志加 结果送目的寄存器 Rd 操作 ADD Rd,Rr RdßRd+ Rr O d 31 0 r 31 2 ADC 带进位加法 说明 两个寄存器和 C 标志的内容相加 结果送目的寄存器 Rd 操作 ADC Rd,Rr Rd Rd Rr C 0 d 31 0 r 31 3 ADIW 立即数据加法 字 说明 寄存器对于立即数值 0 63 相加 结果放到寄存器对 操作 ADIW Rdl K Rdh:RdlßRdh:Rdl+K d { 24 26 28 30 } UJ 4 INC 加 1 指令 说明 寄存器 Rd 的内容加 1 结果送目的寄存器 Rd 中 操作 INC Rd RdßRd 1 0 d 31 4.4.2 减法指令 1 SUB 不带进位减法 说明 两个寄存器相减 结果送目的寄存器 Rd 中 操作 SUB Rd,Rr RdßRd Rr 0 d 31 0 r 31 2 SUBI 立即数减法 字节 说明 一个寄存器和常数相减 结果送目的寄存器 Rd 操作 SUBI Rd,K RdßRd—K 16 d 31 0 k 255 3 SBC 带进位减法 说明 两个寄存器随着 C 标志相减 结果放到目的寄存器 Rd 中 4 SBCI 带进位立即数减 说明 寄存器和立即数随着 C 标志相减 结果放到目的寄存器 Rd 中 操作 SBCI Rd K RdßRd K C 16 d 31 0 K 255

mega8AVR3

mega8AVR3
22
by wky
3.2
立即数寻址
在指令的机器码中包含操作数 例:LDI Rd, K ;机器码 1110 kkkk dddd kkkk
23
by wkndirect Addressing
的数据作为操作数, 以SRAM的数据作为操作数,以16位寄存器 的数据作为操作数 位寄存器 X/Y/Z的形式间接给出数据地址,寻址范围 的形式间接给出数据地址, 的形式间接给出数据地址 64KB(0x0000~ 0xFFFF) ( ~ ) 机器码为1个字, 机器码为 个字,例: 个字 LD Rd, Y
机器码 1000 000d dddd 1000
by wky
24
3.2
数据间接寻址
带后增量的数据存储器间接寻址
(with Post-increment) 先完成数据存储器间接寻址操作, 先完成数据存储器间接寻址操作,然后 的内容加1 把X, Y 或 Z 的内容加 例如: 例如:LD Rd, Y+ + 相当于C语言中: 相当于 语言中: char Rd; char ∗Y; 语言中 Rd = ∗ ( (Y+ +);
3
by wky
3.1 汇编语言指令格式
指令字节数
MCS-51单片机的 条指令的机器码长度为 单片机的1条指令的机器码长度为 单片机的 1个字节(单字节指令)、 个字节(双字 个字节( )、2个字节 个字节 单字节指令)、 个字节( 节指令)、 个字节 三字节指令) 个字节( 节指令)、 3个字节(三字节指令) AVR单片机的 条指令的机器码长度为 单片机的1条指令的机器码长度为 单片机的 条指令的机器码长度为16 位二进制(单字指令)、 位二进制( )、32位二进制 位二进制(单字指令)、 位二进制(双 字指令) 所以程序存储器Flash按照 字指令)——所以程序存储器 所以程序存储器 按照 16位二进制(字)进行组织 位二进制( 位二进制

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

第五章A V R单片机指令系统计算机的指令系统是一套控制计算机操作的代码,称之为机器语言。

计算机只能识别和执行机器语言的指令。

为了便于人们理解、记忆和使用,通常用汇编语言指令来描述计算机的指令系统。

汇编语言指令可通过汇编器翻译成计算机能识别的机器语言。

AVR单片机指令系统是RISC结构的精简指令集,是一种简明易掌握﹑效率高的指令系统。

SL-DIY02-3开发实验器使用AT90S8535单片机,有118条指令,而我们所做的11个实验程序仅用了34条指令,我们重点讲这34条指令,其余指令就可自学了。

AVR器件(指令速查表)118条指令器件1.不带进位加法ADD一不带进位加说明:两个寄存器不带进位C标志加,结果送目的寄存器Rd。

操作:Rd✍Rd+Rr语法:操作码:程序计数器:ADDRd,RrO≤d≤31,0≤r≤31PC✍PC+1例子:。

(实践操作程序4411.ASM)实践操作例子*.ASM,必须编译生成*.OBJ文件才可调试,如要修改*.ASM,必须修改文件属性,去掉*.ASM只读文件属性2.带进位加法ADC-一带进位加说明:两个寄存器和C标志的内容相加,结果送目的寄存器Rd。

操作:Rd←Rd+Rr+C语法:操作码:程序计数器:ADCRd,Rr0≤d≤31,0≤r≤31PC←PC+1例子:(实践操作程序4412.ASM)3.减1指令DEC一减1说明:寄存器Rd的内容减1,结果送目的寄存器Rd中。

操作:Rd✍Rd-l语法:操作码:程序计数器:DECRd0≤d≤31PC✍PC十1例子:(实践操作程序4426.ASM)4.立即数比较CPI——带立即数比较说明:该指令完成寄存器Rd和常数的比较操作。

寄存器的内容不改变。

该指令后能使用所有条件转移指令。

操作:Rd-K语法:操作码:程序计数器:CPIRd,K16≤d≤31,0≤K≤255PC✍PC+1例子:(实践操作程序4463.ASM)5.带立即数与ANDI——立即数逻辑与;全1为1,有0即0说明:寄存器Rd的内容与常数逻辑与,结果送目的寄存器Rd。

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。 無動作指令。 睡覺指令 重設看門狗指令。

ATmega8寄存器资料整理

ATmega8寄存器资料整理

ATmega8寄存器资料整理ATmega8各模塊及相關寄存器功能ADC模塊1.ADMUX--ADC多路選擇寄存器:REFS1,REFS0: = 0,0 關閉內部的參考電壓0,1 Avcc利用AREF腳的外接電容1,0 保留1,1 開啟內部的2.56V參考電壓, AREF腳外接電容.ADLAR: = 1對ADC轉換結果進行左調節, = 0對ADC轉換結果進行右調節,詳見IC spec,我要ADLAR=0.MUX3~0: =0000~0111分別選擇ADC0~ADC7作為輸入, =1110 1.23V(VBG), =1111 0V(GND).2.ADCSR--ADC控制和狀態寄存器ADEN: ADC使能ADSC: ADC工作于單次模式時,’ADSC=1’啟動一次轉換,轉換結束后ADSC由硬件清0.ADC工作于連續模式時,’ADSC=1’啟動轉換,只需一次.對該位寫0沒有意義.注意:每一次對該位寫’1’都會有一次啞轉換.ADFR: =1選擇ADC連續模式. =0則終止連續模式.ADIF: ADC中斷標識位.執行中斷程序后由硬件清0,對該位寫’1’也可以將其清0ADIE:ADC中斷使能.ADPS2..ADPS0: =000~111時ADC的分頻系數分別為2,2,4,8,16,32,64,1283. ADCH/ADCL:ADC結果數據寄存器,讀取時要先讀ADCL.USART模塊1.UDR--USART數據接收/發射寄存器.2.UCSRA--USART控制和狀態寄存器A.RXC: 接收數據完成標識位, RXC在读UDR时自动被清除, 如果采用中断方式则中断例程必须读一次UDR.TXC: 發送數據結束標識位, TXC 置位表示数据已经从发送移位寄存器发送出去且UDR 中没有新的要发送的数据,在半双工通信应用中,由于发送器在发送完数据之后要立即转换到接收模式,所以这个标志位特别有用.如果TXCIE 已置位则TXC 置位将引发发送结束中断,进入中断例程后TXC 自动清零,或者用户可以对其写1清零. UDRE: UART数据寄存器空当数据从UDR 传送到发送移位寄存器后,UDRE 置位,表明发送器已经准备好接收新的要发送的数据.当UDRIE 置位,则只要UDRE 为’1’, UART 发送结束中断就可以执行.写UDR 将复位UDRE. 如果利用中断方式发送数据,则在UART 数据寄存器空中断例程里必须写UDR 以清除UDRE, 否则中断将连续发生.复位后UDRE 的初始值为’1’, 表明发送器就绪.FE: 接收帧错误標識位,MCU 检测到帧错误如检测到停止位为0 时FE 置位,当检测到数据停止位为1 时FE 复位.讀接收緩沖器清除該標識.DOR: 數據過速標識位, 如果UDR 未读而新接收的数据又已进入移位寄存器,则OR 置位. 讀接收緩沖器清除該標識. PE: (?UPE)接收數據奇偶校驗錯誤標識位,讀接收緩沖器清除該標識.U2X: 對異步通訊, U2X=1時波特率加倍.對同步通訊,該位無效,必須寫0.MPCM: =1時為多處理器通訊模式,在該模式下,接收到的未包含地址的楨數據被忽略,不影響發送數據.3.UCSRB-- USART控制和狀態寄存器B.RXCIE: 接收結束中斷使能.TXCIE: 發送結束中斷使能.UDRIE: 數據寄存器空中斷使能.RXEN: =1時接收使能.同時自動設置RXD引腳為接收腳.接收禁能將導致TXC/DOR/FE無法置位,同時也不能復位已經置位的標識位.TXEN: =1時接收接收.同時自動設置TXD引腳為發送腳.UCSZ2: 與UCSRC中的UCSZ1/UCSZ0位一起決定接收和發送數據的楨格式(8/9/10位)RXB8/TXB8: 接收/發送數據的第9位.4. UCSRC-- USART控制和狀態寄存器C.(UCSRC與UBRRH共用一個IO地址)URSEL: =1時讀/寫UCSRC寄存器,=0時讀/寫UBRRH寄存器.UMSEL: =1選擇UART, =0選擇USARTUPM1..UPM0: =0, 0 禁止奇偶校驗,=0,1 保留, =1,0 使能偶校驗, =1,1 使能奇校驗.USBS: =0 發送1位停止位, =1 發送2位停止位. 該位的設置與接收無關.UCSZ1..UCSZ0: 與UCSZ2一起決定數據楨的位數UCSZ2..UCSZ0 = 0,0,0~0,1,1 分別為5/6/7/8位.= 1,0,0~1,1,0 保留= 1,1,1 9位(復位后的缺省值為0,1,1即8位)UCPOL: =0 在時鐘脈沖的上升沿發送一位數據,下降沿接收一位數據. =1則反之.5.UBRRH/UBRRL: UBRRH的低4位和UBRRL組成12位波特率寄存器.(見IC spec.)WDT模塊1.WDTCR—看門狗定時器控制寄存器WDCE: 看門狗關閉使能.WDE: =1使能看門狗.關閉看門狗的步驟為: 1. 在同一个指令内对WDCE 和WDE 写逻辑1,即使WDE 已经为12. 在4 个时钟之内对WDE 写逻辑0WDP2..WDP0: 選擇WDT的溢出時間.TWI模塊1.TWBR—TWI位傳輸率寄存器.SCL頻率=CPU時鐘/(16+2*TWBR*4TWPS)主機模式下要求TWBR>10.2.TWCR—TWI控制寄存器TWINT: TWI中斷標識位該位必須由軟件清0.另外清0該位時會啟動TWI,因此清0該位之前需先設置好TWAR/TWSR/TWDR TWEA: TWI應答信號時能.TWSTA: TWI啟動條件位. 該位置’1’時向總線發送一個啟動信號,然后該位要用軟件清0.TWSTO: TWI停止條件位. 該位置’1’時向總線發送一個停止信號,然后該位自動清0.TWWC: TWI寫沖突標識位. 當TWIBT=0時寫TWDR,該位置位; 當TWIBT=1時寫TWDR,該位清0. TWEN: TWI使能位. 只要將該位置’1’,TWI就對SDA和SCL腳具有控制權.TWIE: TWI中斷使能.3.TWSR—TWI狀態寄存器.TWS7..TWS3: 指示TWI的狀態.TWPS1..TWPS0: 位傳輸速率的預分頻值. =0,0~1,1對應的預分頻值分別為1,4,16,644.TWDR-- TWI數據寄存器.5.TWAR: TWI(slave) 地址寄存器.TWA6..TWA0: TWI(slave) 地址TWGCE: TWI通用呼叫識別使能位.T0模塊1.TIMSK—T/C中斷屏蔽寄存器TOIE0: T/C0溢出中斷使能.2.TIFR—T/C中斷標識寄存器.TOV0: T/C0溢出中斷標識位.3.TCCR0--T/C控制寄存器.CS02…CS00: = 0,0,0 T/C停止.=0,0,1~1,0,1 時鐘分別為I/O時鐘, I/O時鐘/8, I/O時鐘/64, I/O 時鐘/256, I/O時鐘/1024,=1,1,0 T0腳的時鐘,下降沿=1,1,1 T0腳的時鐘,上升沿4.TCNT0—T/C計數寄存器.T1模塊1. TIMSK—T/C中斷屏蔽寄存器TICIE1: T/C1輸入捕獲中斷使能.OCIE1A: T/C1輸出比較匹配A中斷使能.OCIE1B: T/C1輸出比較匹配B中斷使能.TOIE1: T/C1溢出中斷使能.2.TIFR—T/C中斷標識寄存器.ICF1: T/C1輸入捕獲中斷標識位.OCF1A: T/C1輸出比較匹配A中斷標識位.OCF1B: T/C1輸出比較匹配B中斷標識位.TOV1: T/C1溢出中斷標識位.3.TCCR1A—T/C1控制寄存器A./doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): 决定T/C1 的比较匹配发生时输出引脚OC1A(OC1B)的动作,對I/O口的控制權最高,相应的方向控制位要设置为1, 以便将其配置为输出.WGM13..0=正常模式或CTC模式時:/doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 比较匹配发生时OC1A(OC1B) 輸出反相.=1,0 比较匹配发生时OC1A(OC1B)=0; OC1A(OC1B)=1 at TOP =1,1 比较匹配发生时OC1A(OC1B)=1; OC1A(OC1B)=0 at TOPWGM13..0=快速PWM模式時:/doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 WGM13..0=15: 比较匹配发生时OC1A/OC1B反相輸出. OC1B斷開=1,0 比较匹配发生时OC1A(OC1B)=0; OC1A(OC1B)=1 at TOP =1,1 比较匹配发生时OC1A(OC1B)=1; OC1A(OC1B)=0 at TOP WGM13..0=相位校正模式/相頻校正模式或PWM模式時: /doc/4b8ab1dbce2f0066f533228e.html1A0(/doc/4b8ab1dbce2f0066f533228e.html1B0): =0,0 T/C1與输出引脚OC1A(OC1B)斷開=0,1 WGM13..0=15: 比较匹配发生时OC1A/OC1B反相輸出. OC1B斷開=1,0 比较匹配发生时,若是向上計數OC1A(OC1B)=0; 若是向下計數則OC1A(OC1B)=1=1,1 比较匹配发生时,若是向上計數OC1A(OC1B)=1; 若是向下計數則OC1A(OC1B)=0FOS1A/FOC1B: 写’1’ 后按照COM1A0/1 的设置在引脚PD5 强迫产生一次比较匹配输出,如果COM的值与FOC 的值在同一写入周期更新,本次功能将被忽略.强迫输出比较功能使得MCU可以不用等待比较匹配的发生就变换引脚的输出,由FOC 置位产生的比较匹配不会引发中断,也不会清除TCNT1. 读FOC 的返回值总为零,在PWM 模式下FOC 没有意義.WGM11/WGM10: 與TCCR1B中的WGM13/WGM12位決定波形產生模式Mode WGM13..WGM10 Timer/Counter Mode TOP UpdateofOCR1x TOV1 Flag Set on0 0 0 0 0 Normal 0xFFFF Immediate MAX1 0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM2 0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM3 0 0 1 1 PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM4 0 1 0 0 CTC OCR1A Immediate MAX5 0 1 0 1 Fast PWM, 8-bit 0x00FF TOP TOP6 0 1 1 0 Fast PWM, 9-bit 0x01FF TOP TOP7 0 1 1 1 Fast PWM, 10-bit 0x03FF TOP TOP8 1 0 0 0 PWM, Phase&Frequency Correct ICR1 BOTTOM BOTTOM9 1 0 0 1 PWM, Phase& Frequency Correct OCR1A BOTTOM BOTTOM10 1 0 1 0 PWM, Phase Correct ICR1 TOP BOTTOM11 1 0 1 1 PWM, Phase Correct OCR1A TOP BOTTOM12 1 1 0 0 CTC ICR1 Immediate MAX13 1 1 0 1 (Reserved) –––14 1 1 1 0 Fast PWM ICR1 TOP TOP15 1 1 1 1 Fast PWM OCR1A TOP TOP3.TCCR1B—T/C1控制寄存器B.ICNC1: 输入捕捉抑制器(4个时钟)ICNC1 高有效,输入捕捉在ICP输入捕捉引脚的第一个上升/下降沿触发,当ICNC1 =1时ICP信号要进行4次连续采样,只有4个采样值都有效时,输入捕捉标志才置位.采样频率为XTAL 时钟.ICES1:输入捕捉1 边沿选择当ICES1=0 时,T/C1 的值在ICP 引脚电平的下降沿被传送到输入捕捉寄存器ICR1.若ICES1=1 则T/C1 的值在ICP 引脚电平的上升沿被传送到ICR1 WGM13/WGM12: 見上面的表格.CS11..CS10: T/C1的時鐘源選擇=000 停止,=001~101 分別為CK, CK/8,CK/64,CK/256,CK/1204. =110 T1腳下降沿. =111 T1腳上升沿.4.TCNT1H/TCNT1L—T/C1計數器此16 位寄存器包含了T/C1 的值,当CPU 访问这两个寄存器时,为了保证高字节和低字节能够同时读写,要用到一个8 位的临时寄存器TEMP, 此寄存器在访问OCR1A/ OCR1B 和ICR1 的时候也要用到,如果主程序和中断程序在访问寄存器时都要用到TEMP, 那么在适当的时候需要关闭中断使能,防止出错.写TCNT1: 当CPU 写TCNT1H 时数据将被放置在TEMP 寄存器,当CPU 写低字节TCNT1L 时,此数据及TEMP 中的数据一并写入TCNT1, 因此在写TCNT1 16 位时首先要写TCNT1H读TCNT1:当CPU 读取TCNT1L 时,TCNT1L 的数据将送入CPU, 同时TCNT1H 将送入TEMP寄存器,等到CPU 读取TCNT1H 时,TEMP 中的数据送入CPU, 因此在读16 位的TCNT1 时首先要读TCNT1L T/C1 是向上记数器或上/下记数器,在PWM 模式下,若T/C1 被置数,则T/C1 将在预置数的基础上记数.5.OCR1AH / OCR1AL-- T/C1輸出比較寄存器1A.OCR1BH / OCR1BL-- T/C1輸出比較寄存器1BT/C1 输出比较寄存器包含与T/C1 值连续比较的数据,如果T/C1 的值与OCR 相等则比较匹配发生,用软件写操作将TCNT1 和OCR1A 或OCR1B 设置为相等不会引发比较匹配,由于OCR1A/OCR1B为16 位寄存器,所以在访问时要用到TEMP 寄存器,以保证两个字节的同步更新,其读写过程与读写TCNT1 相同.访问TCNT1 和ICR1 同样要用到TEMP 寄存器,如果主程序和中断例程都要用到TEMP,则在主程序访问这些寄存器时要禁止中断.6. ICR1H / ICRAL—輸入捕獲寄存器按照ICES1 的设定,输入捕捉引脚ICP 发生上跳变或下跳变时,TCNT1 被送入ICR1, 同时ICF1 置位,由于ICR1 为16 位寄存器,所以在访问时要用到TEMP 寄存器,以保证同时读取两个字节. 读写过程与读写TCNT1 相同.T2模塊1. TIMSK—T/C中斷屏蔽寄存器OCIE2: T/C2輸出比較匹配中斷使能.TOIE2: T/C2溢出中斷使能.2.TIFR—T/C中斷標識寄存器.OCF2: T/C2輸出比較匹配中斷標識位.TOV2: T/C2溢出中斷標識位.3. TCCR2—T/C2控制寄存器FOC2: 强迫输出比较写1 后按照COM21/20 的设置,在引脚强迫产生一次比较匹配输出,如果COM 的值与FOC 的值在同一写入周期更新,本次功能将被忽略.由FOC 置位产生的比较匹配不会产生中断.读FOC 的返回值总为零.在PWM 模式下FOC没有任何意义.WGM21/WGM20: 波形產生模式Mode WGM21/WGM20 Timer/Counter Mode TOP Update of OCR2 TOV2 FlagSet0 0 0 Normal 0Xff Immediate MAX1 0 1 PWM, Phase Correct 0xFF TOP BOTTOM2 1 0 CTC OCR2 Immediate MAX3 1 1 Fast PWM 0xFF TOP MAXCOM21/COM20: 比較輸出模式Non-PWM模式時:COM21/COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Toggle OC2 on Compare Match1 0 Clear OC2 on Compare Match1 1 Set OC2 on Compare Matchfast-PWM模式時:COM21/ COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Reserved1 0 Clear OC2 on Compare Match, set OC2 at TOP1 1 Set OC2 on Compare Match, clear OC2 at TOPPhase Correct PWM模式時:COM21 COM20 Description0 0 Normal port operation, OC2 disconnected.0 1 Reserved1 0 Clear OC2 on Compare Match when up-counting. Set OC2 on Compare Match when downcounting.1 1 Set OC2 on Compare Match when up-counting. Clear OC2 on Compare Match when downcounting.CS22/CS21/CS20: 選擇T/C2的預分頻值CS22/CS21/CS20 Description0 0 0 No clock source (Timer/Counter2 stopped).0 0 1 clk T2S (No prescaling)0 1 0 clk T2S/8 (From prescaler)0 1 1 clk T2S/32 (From prescaler)1 0 0 clk T2S/64 (From prescaler)1 0 1 clk T2S/128 (From prescaler)1 1 0 clk T2S/256 (From prescaler)1 1 1 clk T2S/1024 (From prescaler)4. TCNT2—T/C2計數器5. OCR2—T/C2輸出比較寄存器6.ASSR—T/C2異步狀態寄存器AS2: AS2=0,T/C2的時鐘為clk i/o, AS2=1, T/C2的時鐘為TOSC1腳的晶體時鐘.改變AS2的值,可能破壞TCNT2/ORC2/TCCR2的內容.TCN2UB: T/C2 更新忙標識T/C2 工作于异步模式时,写TCNT2 将引起TCN2UB置位,当TCNT2从暂存寄存器更新完毕后,TCN2UB 由硬件清零.TCN2UB为0 表明TCNT2可以写入新值了.OCR2UB: 输出比较寄存器更新忙T/C2 工作于异步模式时,写OCR2将引起OCR2UB置位,当OCR2从暂存寄存器更新完毕后,OCR2UB由硬件清零,OCR2UB为0 表明OCR2可以写入新值了.TCR2UB: T/C2 控制寄存器更新忙T/C2 工作于异步模式时写TCCR2将引起TCR2UB置位,当TCCR2从暂存寄存器更新完毕后,TCR2UB由硬件清零.TCR2UB为0表明TCCR2可以写入新值了.如果在’更新忙标志’置位的时候写上述任何一个寄存器,都将引起数据的破坏并引发不必要的中断!7.SFIOR—特殊功能IO寄存器PSR2: T/C2 分频器复位置位后,T/C2 的预分频器复位,操作完成后硬件对其清零,软件写零并不真正执行清零工作.如果T/C2 由内部CPU 时钟驱动,读取这一位的结果为零.如果T/C2 工作于异步模式,由自己的晶振驱动,则这一位将一直保持为1, 直到异步操作完成.SPI 模塊1.SPDR—SPI數據寄存器2.SPSR—SPI狀態寄存器SPIF: SPI中斷標識串行发送结束后SPIF置位,即使此时/SS 被拉低(作为输入口).进入中断例程后SPIF自动复位,或者可以通过先读SPSR, 紧接着读SPDR来对SPIF清零.WCOL: 写碰撞标志在SPI 发送当中对SPI 数据寄存器SPDR写数据将置位WCOL, WCOL可以通过先读SPSR,紧接着读SPDR来清零SPI2X: 双速置位后SPI 的速度加倍,若作为主机则SPI 频率可达CPU频率的一半,若为从机只能保证f C L/4.3.SPCR—SPI控制寄存器SPIE: SPI 中斷使能SPE: SPI 使能DORD: 数据發送次序, DORD=1 LSB先发送;DORD=0 MSB先发送.MSTR: 主从选择MSTR 置位时选择主机模式,否则为从机.如果MSTR为1, /SS 为输入,但被拉低,则MSTR被清零,SPIF置位.用户必须重新设置MSTR进入主机模式.CPOL: 时钟极性CPOL置位表明总线空闲时SCK为高.CPHA: 时钟相位SPR1/SPR0: SPI 时钟速率选择位=00~11 时钟速率分別為f OSC/4, f OSC/16, f OSC/64, f OSC/128端口B / 端口C / 端口D 模塊1.PORTB / PORTC / PORTD--端口數據寄存器2.DDRB / DDRC / DDRD—端口數據方向寄存器3.PINB / PINC / PIND—端口輸入引腳地址PINB/PINC/PIND 不是寄存器,这个地址用来访问端口的物理值,读取PORTB/PORTC/PORTD时,读到的是端口锁存的数据,而读取PINB/PINC/PIND时,读到的是施加于引脚上的逻辑数值.外部中斷模塊1.GICR—通用中斷控制寄存器INT1/INT0:外部中斷1/0使能IVSEL: 中斷向量選擇=1 中斷向量放置在flash存儲區的開始. =0中斷向量放置在BOOT LOADER區的開始.IVCE: 中斷向量改變使能.2.GIFR—外部中斷標識位寄存器.INTF1/INTF0: 外部中斷1/0標識3.MCUCR—MCU控制寄存器ISC11/ISC10 / ISC01/ISC00: 外部中斷觸發信號選擇ISC11( ISC01)/ ISC10 (ISC00) Description0 0 The low level of INT1(INT0) generates an interrupt request.0 1 Any logical change on INT1(INT0) generates an interrupt request.1 0 The falling edge of INT1(INT0) generates an interrupt request.1 1 The rising edge of INT1(INT0) generates an interrupt request.EEPROM 模塊1.EEARH/EEARL--EEPROM地址寄存器.(對Atmega8為9位)2.EEDR—EEPROM數據寄存器3.EECR—EEPROM控制寄存器EERIE: EEPROM准備好中斷使能EEMWE: EEPROM主写使能EEMWE 决定是否设置EEWE 为1 以写EEPROM, 当EEMWE 为1 时置位EEWE,将把数据写入EEPROM 的指定地址,若EEMWE 为0 则EEWE 不起作用.EEMWE 置位后4个周期硬件对其清零.EEWE: EEPROM写使能当EEPROM数据和地址设置好之后,需置位EEWE以便将数据写入EEPROM, 写时序如下,第2和第3步不是必须的:1 等待EEWE为0.2 将EEPROM的新地址写入EEAR.3 将新数据写入EEDR.4 置位EEMWE.5 在置位EEMWE 的4个周期内对EEWE 写逻辑1.经过写访问时间(VCC=2.7V 时为4ms左右,VCC=5V时为2.5ms 左右)之后,EEWE硬件清零,用户可以凭此位判断写时序是否已经完成.EEWE置位后CPU要停止2 个周期.注意: 发生在步骤4和5之间的中断将导致写操作失败,如果一个操作EEPROM的中断打断了EEPROM操作,EEAR或EEDR寄存器可能被修改,引起EEPROM操作失败,建议此时关闭全局中断标志I.EERE: EEPROM读使能当EEPROM地址设置好之后,需置位EERE以便将数据读入EEDR, EERE清零表示EEPROM的数据已经读入EEDR, EEPROM数据的读取只需要一条指令,且无需等待.EERE置位后,CPU要停止2个周期.用户在读取EEPROM时应该检测EEWE, 如果一个写操作正在进行,写EEAR 和EEDR将中断EEPROM的写入,使得结果无法预测.防止EEPROM数据毁坏由于电源电压过低,CPU和EEPROM有可能工作不正常造成EEPROM数据的毁坏,这种情况在使用独立的EEPROM 器件时也会遇到.由于电压过低造成EEPROM数据损坏有两种可能:一是电压低至EEPROM写操作所需要的最低电压二是CPU本身已经无法正常工作.EEPROM数据损坏的问题可以通过以下3 种方法解决:1 当电压过低时保持/RESET信号为低,这可以通过外加复位电路(BOD-Brown-out Detection)来完成,有些AVR产品本身就内含BOD电路,详情请看有关数据手册.2 当VCC过低时使AVR内核处于掉电休眠状态,这可以防止CPU 对程序解码和执行代码,有效防止对EEPROM的误操作.3 将那些不需修改的常数存储于FLASH 之中.模擬比較器模塊1. SFIOR--特殊功能IO寄存器ACME: 模擬比較器多路使能ACME=0,AIN1腳作為模擬比較器的負輸入端.ACME=1,ADEN/MUX2..0選擇模擬比較器的負輸入端.2.ACSR--模擬比較器控制和狀態寄存器ACD: 模拟比较器禁止当ACD 为1 时,模拟比较器的电源将切断,可以在任何时候对其置位以关闭模拟比较器,这样可以减少器件的功耗.改变ACD 时要注意禁止模拟比较器的中断,否则有可能引发不必要的中断.ACBG: 模拟比较器帶隙選擇=1 使用內部的參考電壓作為模拟比较器的正輸入.=0 使用AIN0腳的電壓作為模拟比较器的正輸入.ACO:模拟比较器的輸出. ACO與比较器的輸出端直接相連.ACI: 模拟比较器中断标志位当比较器输出触发中断时,ACI 将置位,中断方式由ACIS1 和ACIS0 决定.如果ACI 和I 都为1, 则CPU 执行比较器中断例程,进入中断例程后ACI 被硬件清零.此外ACI 也可以通过对此位写1 来达到清零的目的.要注意的是如果ACSR 的另一些位被SBI 或CBI 指令修改时ACI 亦被清零.ACIE: 模拟比较器中斷使能.ACIC: 模拟比较器输入捕捉使能ACIC为1 时T/C1 的输入捕捉功能由比较器中断触发,此时比较器的输出与T/C1的输入捕捉前端直接相连.T/C1 的输入捕捉噪声抑制和边沿选择仍然适用.如果ACIC 为0 则模拟比较器与T/C1 没有关联,为了使能比较器驱动的T/C1 输入捕捉中断,TICIE1必须置位.ACIS1/ACIS0: 模拟比较器中断模式选择=00 电平切换引发中断=01 保留=10 ACO 下降沿中断=11 ACO 上升沿中断注意: 改变ACIS1/ACIS0 时要注意禁止模拟比较器的中断,否则有可能引发不必要的中断.CPU 模塊1.SREG—CPU狀態寄存器位7---I(R/W): I=1, 允许全局中断; I=0, 不允许全局中断; 在中断发生后I位由硬件清除,并由RETI(中断返回)指令设置,从而允许子序列的中断.位6---T(R/W):位复制存储位5---H(R/W):半进位标志位位4---S(R/W):标志位,S=N⊕V,S位是负数标志位N 和2 的补码溢出标志位V 两者异或值.位3---V(R/W):2的补码溢出标志位,2的补码溢出标志位V支持2的补码运算.位2---N(R/W):负数标志位.指示在不同的运算和逻辑操作之后的负数结果.位1---Z(R/W):零值标志位.指示在不同的运算和逻辑操作之后的零值结果.位0---C(R/W):进位标志位.指示在某一运算和逻辑操作中的某一进位.2.SPH/SPL—堆棧指針3.MCUCR—MCU控制寄存器SE: 睡眠使能SM2..SM0: 睡眠模式選擇SM2/ SM1/ SM0 Sleep Mode0 0 0 Idle0 0 1 ADC Noise Reduction0 1 0 Power-down0 1 1 Power-save1 0 0 Reserved1 0 1 Reserved1 1 0 StandbyNote: Standby mode is only available with external crystals or resonators.ISC11/ISC10 / ISC01/ISC00:見’外部中斷模塊’4.MCUCSR—MCU控制和狀態寄存器WDRF: 看門狗復位標識.BORF: brown-out reset flag (?電壓淡出復位標識?)EXTRF: 外部復位標識PORF: 上電復位標識5.OSCCAL—內部振蕩器頻率調整寄存器6.SPMCR—儲存程序存儲器寄存器SPMIE: SPM中斷使能RWWSB: Read-While-Write Section BusyWhen a Self-Programming (page erase or page write) operation to the RWW section is initiated, the RWWSB will be set (one) by hardware. When the RWWSB bit is set, the RWW section cannot be accessed. The RWWSB bit will be cleared if the RWWSRE bit is written to one after a Self-Programming operation is completed. Alternatively the RWWSB bit will automatically be cleared if a page load operation is initiated.RWWSRE: Read-While-Write Section Read EnableWhen programming (page erase or page write) to the RWW section, the RWW section is blocked for reading (the RWWSB will be set by hardware). To re-enable the RWW section, the user software must wait until the programming is completed (SPMEN will be cleared). Then, if the RWWSRE bit is written to one at the same time as SPMEN, the next SPM instruction within four clock cycles re-enables the RWWsection. The RWW section cannot be re-enabled while the Flash is busy with a page erase or a page write (SPMEN is set). If the RWWSRE bit is written while the Flash is beingloaded, the Flash load operation will abort and the data loaded will be lost (The page buffer will be cleared when the Read-While-Write section is re-enabled).BLBSET: 置位BOOT锁定位若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将R0的数据写入到BOOT锁定位,R1 及Z寄存器的数据不参与此项操作.锁定位改变完成后,或者在4个时钟内SPM未执行,BLBSET自动清零.锁定位改变过程当中CPU 停止,只有片擦除操作才可以清除锁定位.BLBSET和SPMEN置位后4个时钟内执行的LPM将把锁定位或熔丝位(依赖于Z寄存器的Z0)读到目的寄存器. PGWRT: 页写若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将把临时缓冲区的数据写入到FLASH.页地址位于Z 寄存器的高位,页写完成后或者在4个时钟内SPM未执行,PGWRT自动清零.页写过程当中CPU停止.PGERS: 页擦除若此位与SPMEN一起置位,则在其后4个时钟内执行的SPM将擦除一页.页地址位于Z寄存器的高位.页擦除完成后或者在4个时钟内SPM未执行,PGERS自动清零.页擦除过程当中CPU 停止.SPMEN: 儲存程序存储器使能使能其后4个时钟内执行的SPM,如果与BLBSET/PGWRT/PGERS 的其中之一一起置位,则SPM将执行特殊命令.如果仅置位SPMEN则其后的SPM指令仅把R1:R0 的值保存到由Z寄存器指定的临时缓冲区.SPM完成后或者在4个时钟内SPM未执行,SPMEN自动清零.如果在低4 位写入除1001/ 0101/ 0011/ 0001 之外的值,或是在任一位已置位后,再对SPMCR操作将无效.写EEPROM将阻止对FLASH的编程以及读熔丝位和锁定位.所以在写SPMCR之前最好先检查EECR的EEWE位, 等EEWE为0 后再操作SPMCR.7.SFIOR—特殊功能IO寄存器PUD: 上拉電阻禁能。

有关MEGA8在应用编程(IAP)的使用说明

有关MEGA8在应用编程(IAP)的使用说明

有关MEGA8在应用中编程只有在加载了BOOT引导程序后才可能进行IAP应用如飞利浦对BOOT程序按自己需要进行剪裁那么全部BOOT程序区也可以全部提供给用户程序使用1°²×°P onyProg程序启动PonyProg程序通信协议在WIN98下可选择AVRISP API或AVRISP IO OK从芯片(DEVICE)下拉列表框中选择AVR micro 和AT mega8 4BOOT程序文件名为self.hexÈ»ºó´Ó²Ëµ¥Command->Write Program(FLASH)进行编程以下熔丝位应该是被选中的CKSEL1按Write按钮即可二按动RESET按钮一次可以进行IAP 编程注意第一步是不可少的用BROWSE(浏览)按钮选4择需有装入MCU的HEX文件进行IAP编程4步可实现EEPROM数据的编程连机失败答2²»ÄÜÑ¡ÔñƬÍâRC振荡或外部时钟应该使用SL-MEGA8开发板上的有源晶振4a使用并口通信下载线重新编译后可以连机一般是由于ATMEGA8被加密引起的装BOOT程序失败答2广州天河双龙电子有限公司 广州双龙:广州天河路561号新赛格电子城331室(510630)电话*************62653785 传真*************上海双龙:上海北京东路668号科技京城东搂12H2室(200031) 电话*************。

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单片机ATMEGA48的C程序举例

AVR单片机ATMEGA48的C程序举例

AVR单片机ATMEGA48的EEPROM操作例子/***************************************************** CodeWizardAVR Panxiaoyi快速PWM,也可以叫单斜率PWM*****************************************************/#include <mega48.h>unsigned char eeprom i=0; //把变量放保存在EEPROM上/赋值与否并不影响i的值void main(void){TCCR0A=0b10000011; //比较匹配时OC0A=0,计数到比较值时OC0A=1,TOP固定等于255TCCR0B=0b00000001; //时钟=1分频DDRD.6=1; //PD6必须设置为输出时OC0A 输出的PWM才有效DDRD.2=0;PORTD.2=1; //PD2接按键输入/上拉电阻使能while(1){if(PIND.2==0) //如果按键按下/简单的按键防抖动{while(PIND.2==0); //等待按键松开i+=10; //更新EEPROM的数据i/重新来电后数据不变}OCR0A = i ; //刷新比较值,PWM占空比随之改变}}ATMEGA48的USART串口与PC通讯例子/***************************************************** CodeWizardAVRChip type : ATmega48VClock frequency : 7.372800 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128波特率9600/8个数据位 /1个停止位 /无校验M8V20实验板硬件设置1: J5的2个跳线帽短接,使用外部晶振7.3728MHz2: J6与J7的4个跳线帽短接,使用MAX232,其他跳线开路3: DB9接口连接到电脑请配合串口调试软件SSCOM32或者comdebug进行调试*/#include <mega48.h>#include <stdio.h>#include <delay.h>void main(void){UCSR0B=0x18; //下面是3条语句是串口初始化语句UCSR0C=0x06;UBRR0L=0x2F;while(1) //循环{unsigned char data; //定义一个局部变量data=getchar(); //等待,直到接收到一个数据putchar(data); //将接收到的数据发送出去}} //endATMEGA48的T/C2与精确时钟例子/*****************************************************CodeWizardAVR V1.25.6 ProfessionalChip type : ATmega48Clock frequency : 7.372800 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128计算: 1秒= 时钟/ ( 分频* 计数)假设时钟= 7372800 Hz 那么: 1秒= 7372800 / ( 分频* 计数)得: 计数=7372800/分频由于分频只有1/8/32/64/128/256/1024 供我们选择,而计数最高只有8位(255)为了不占用资源,中断次数尽量少一点比较好,并且中断时间越短越好所以我们可以选择计数= 时钟7372800 / 分频1024 / 30次中断= 240这个240就是T/C2的计数上限TOP*****************************************************/#include <mega48.h>unsigned char TC2A=0;interrupt [TIM2_COMPA] void timer2_compa_isr(void){TC2A++;if(TC2A>=30) TC2A=0;if(TC2A>25) PORTD.3=1; else PORTD.3=0;}void main(void){TCCR2A|=2; //工作于CTC模式(比较匹配时计算器清零)OCR2A=240; //设置TOP的值(计算器的上限值)TCCR2B|=7; //取系统时钟1024分频作为T/C2时钟TIMSK2=2; //使能计数器的值达到TOP 时产生中断DDRD.3=1; //使用PD3每秒驱动蜂鸣器"嘀"一次#asm("sei") //插入汇编语句,打开全局中断while (1){#asm("nop") //空操作的汇编代码,等待中断发生};}/****************************************************假设程序还有一个3位数码管动态扫描任务,这时我们就可以这样计算1:数码管的扫描频率在75-85Hz比较合适,太低会闪烁,太高占用资源2:每扫描一次就必须分3次显示,分别是个位/十位/百位3:这时我们可以计数出显示频率是225-255Hz(中断频率),在这里假设=240Hz 4:这时我们就可以顺便使用这个T/C2定数中断来保证扫描的可靠运行了5:计算: 计数= 时钟7372800 / 分频128 / 240次中断= 240 ***/ATMEGA48外部电平变化中断PCINT例子/***************************************************** CodeWizardAVRChip type : ATmega48VClock frequency : 1.000000 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128外部PCINT0-PCINT7共享一个中断源PCINT0外部PCINT8-PCINT14共享一个中断源PCINT1外部PCINT16-PCINT23共享一个中断源PCINT2没有使用延时/通信语句,所以使用内部/外部时钟都可以每按动INT0按键一次,PD3的电平就翻转一次本例子没有考虑太多的按键防抖动功能*******************/#include <mega48.h>//外部PCINT16-PCINT23共享一个中断源PCINT2//请参考M48数据手册的48页/75页interrupt [PCINT2] void PCINT2_isr(void){PORTB.0=~PORTB.0; //电平取反PCIFR|=4; //清除PCINT2中断触发标记,防止按键抖动}void main(void){PORTD=255;DDRD=0; //设置PCINT16-PCINT23端口为输入,上拉电阻有效PORTB.0=0;DDRB.0 =1; //设置PB0输出低电平,准备驱动蜂鸣器PCICR|=4; //使能PCINT16-PCINT23外部电平变化中断PCMSK2|=4; //使能PCINT18有效#asm("sei") //插入汇编语句,打开全局中断while (1) //循环,等待中断{#asm("nop") //空操作的汇编代码,等待中断发生};}ATMEGA48外部中断INT0例子/***************************************************** CodeWizardAVRChip type : ATmega48VClock frequency : 1.000000 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128INT0最好接一个4.7K的上拉电阻,按键对地有效没有使用延时/通信语句,所以使用内部/外部时钟都可以每按动INT0按键一次,PD3的电平就翻转一次本例子没有考虑太多的按键防抖动功能*******************/#include <mega48.h>interrupt [2] void INT0_isr(void) //INT0的中断向量是2,请参考M48数据手册的48页{PORTD.3=~PORTD.3; //电平取反EIFR|=1; //清除INT0中断触发标记,防止按键抖动}void main(void){PORTD.2=1;DDRD.2=0; //设置INT0端口为输入,上拉电阻有效PORTD.3=0;DDRD.3 =1; //设置PD3输出低电平,准备驱动蜂鸣器EIMSK|=1; //打开INT0中断EICRA|=3; //INT0上升沿触发#asm("sei") //插入汇编语句,打开全局中断while (1) //循环,等待中断{#asm("nop") //空操作的汇编代码,等待中断发生};}ATMEGA48的ADC模数转换例子////ADC结果由串口输出到电脑显示#include <mega48.h>#include <stdio.h>#include <delay.h>void main(void){//外部时钟 7.3728MHz (请取消时钟8分频)//串口初始化,波特率9600Hz,8个数据位,1个停止位,无奇偶校验,无中断使能UCSR0B=8;UCSR0C=6;UBRR0L=47;//**************************************************************** *ADMUX=96; //设置参考电压为AVCC,结构左对齐(就是8位精度)ADCSRA|=135; //使能ADC,ADC时钟=系统时钟128分频while (1){unsigned char adc;ADMUX=ADMUX&240|2; //清除已选择的ADC通道,选择新的ADC通道(0-7)ADCSRA|=64; //启动单次ADC转换while((ADCSRA&16)==0); //等待ADC转换结束adc=ADCH; //结果左对齐只需读取高8位数据ADCSRA|=16; //清除ADC转换结束标记putchar(adc/100+48); //从串口输出ADC的百位数putchar(adc/10%10+48); //从串口输出ADC的十位数putchar(adc%10+48); //从串口输出ADC的个位数delay_ms(500); //延时putchar(13); //回车putchar(10); //换行}}ATMEGA8/ATMEGA16多机通讯例子下面是一个M16的多机通讯例子,也适合M8,只需要修改头文件就可以了,本例子在3台机上测试并稳定通过主机代码/* AVR单片机DIY网潘小艺 CVAVR1.25.9通讯规则:01:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/02:通讯连接采用硬件MAX485,双向单工03:MAX485的RE/DE并联接到单片机的PD2脚(高电平发送/低电平接收)04:所有MAX485的A脚并联/B脚并联/D脚接TXD/R脚接RXD05:每个上行/下行的数据包的字节个数都是一样的(通讯数据量)06:数据包格式: 地址_数据1_数据2_数据3_数据n_CRC8校验码07:所有单元的数据接收都是采用中断+查询的方式08:总是由主机向从机下发一个数据包,从机收到数据包并校验正确后向主机回复一个数据包09:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收10:通讯采用主机轮询方式,从机之间不能相互通讯,必须通过主机才能交换数据11:无效地址是0,主机地址是1,从机地址是11.12.13...广播地址是255 */#include <mega16.h>#include <delay.h>#include <usart.h>#include <crc8.h>#define amount 10//设定通讯数据量#define address1//请在这里设定本机地址#define max485_out PORTD.2=1#define max485_in PORTD.2=0#define max485_RW_ok DDRD.2=1unsignedchar send[amount];//发件箱unsigned charinbox[amount];//收件箱unsigned charn=0;//记忆接收中断的次数unsigned char x=0;//******************************************************************* *******************void usart_out(unsigned char *datas,unsigned char n){unsigned char i=0;max485_out;//使MAX485处于发送状态while(i<n)//一共发送n个数据{if(i==0) UCSRB|=1; else UCSRB&=254;UDR=*(datas+i);//装载数据开始发送while((UCSRA&64)==0);//等待发送结束UCSRA|=64;//清除发送结束标志i++;//发送次数统计}max485_in;//使MAX485处于接收状态}//******************************************************************* *******************interrupt[12]Rxd_isr(void)//接收中断{if( UCSRA&28 ){ n=UDR; n=0; UCSRA|=0x01; } else //接收出错就重新打开地址帧筛选功能{if( UCSRB&2 )n=0;//检测到地址信息时计数清零inbox[n]=UDR; n++;//把接收到的数据保存到收件箱if( inbox[0]==address ) UCSRA&=254; else UCSRA|=0x01; //地址筛选}}//******************************************************************* *******************void main(void){usart_init();max485_in;max485_RW_ok;DDRA=7;//通讯状态指示#asm("sei");while(1){x=~x;//测试用的变量PORTA.0=~PORTA.0;//观察单片机是否死机(供电一定要好)//************************************与从机11对话****************************************if(x) send[3]=0; elsesend[3]=255; //更新发件箱的数据(测试代码)send[0]=11;//指向从机地址send[amount-1]=crc8(send,amount-1);//计算发件箱数据的crc8校验码usart_out(send,amount);//将发件箱的数据send[]发送出去;n=0;//计数复位,准备接收新数据 delay_ms(15);//等待从机回复数据,这个时间要计算好if(n==amount && inbox[amount-1]==crc8(inbox,amount-1)) //接收正确处理与测试{PORTA.1=1; delay_ms(10); PORTA.1=0;}else//接收错误处理与测试 {PORTA.2=1; delay_ms(10); PORTA.2=0;}//************************************与从机12对话****************************************if(x) send[3]=50; elsesend[3]=200; //更新发件箱的数据(测试代码)send[0]=12;//指向从机地址send[amount-1]=crc8(send,amount-1);//计算发件箱数据的crc8校验码usart_out(send,amount);//将发件箱的数据send[]发送出去;n=0;//计数复位,准备接收新数据 delay_ms(15);//等待从机回复数据,这个时间要计算好if(n==amount && inbox[amount-1]==crc8(inbox,amount-1)) //接收正确处理与测试{PORTA.1=1; delay_ms(10); PORTA.1=0;}else//接收错误处理与测试 {PORTA.2=1; delay_ms(10); PORTA.2=0;}}} //end从机(需要增加多个从机时可以修改从机的地址就可以了)//从机11#include <mega16.h>#include <usart.h>#include <crc8.h>#define amount 10//设定通讯数据量#define address11//请在这里设定本机地址#define max485_out PORTD.2=1#define max485_in PORTD.2=0#define max485_RW_ok DDRD.2=1unsignedchar send[amount];//发件箱unsigned charinbox[amount];//收件箱unsigned charn=0;//记忆中断次数//******************************************************************* *******************void usart_out(unsigned char *datas,unsigned char n){unsigned char i=0;max485_out;//使MAX485处于发送状态while(i<n)//一共发送n个数据{if(i==0) UCSRB|=1; else UCSRB&=254;UDR=*(datas+i);//装载数据开始发送while((UCSRA&64)==0);//等待发送结束UCSRA|=64;//清除发送结束标志i++;//发送次数统计}max485_in;//使MAX485处于接收状态}//******************************************************************* *******************interrupt[12]Rxd_isr(void)//接收中断{if( UCSRA&28 ){ n=UDR; n=0; UCSRA|=0x01; } else //接收出错就重新打开地址帧筛选功能{if( UCSRB&2 )n=0;//检测到地址信息时计数清零inbox[n]=UDR; n++;//把接收到的数据保存到收件箱if( inbox[0]==address ) UCSRA&=254; else UCSRA|=0x01; //地址筛选if( n==amount )//如果接收到完整的数据包{if( inbox[amount-1]==crc8(inbox,amount-1) )//如果crc8校验正确就...{send[0]=1;//发件箱地址指向主机//send[1]=?//请更新发件箱的数据//send[n]=?send[amount-1]=crc8(send,amount-1);//产生发件箱的crc8校验码usart_out(send,amount);//发送发件箱的数据包/查询方式比较耗时OCR1A=inbox[3];//收件箱测试(控制T/C1的PWM驱动LED)}}}}//******************************************************************* *******************void main(void){usart_init();max485_in;max485_RW_ok;TCCR1A =0B10000001;//OCR1A/PD5/8位快速PWMTCCR1B =0B00001001;//时钟1分频DDRD |=0b00100000;//输出使能OCR1A =255;//初始化PWM输出100%占空比#asm("sei")while (1){};}USART.h文件内容//波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断/地址过滤void usart_init(void){UCSRA=0x01;UCSRB=0x9C;UCSRC=0xB6;UBRRH=0x00;UBRRL=47;}CRC8.h文件内容unsigned char crc8(unsigned char *ptr, unsigned char len){unsigned char i;unsigned char crc=0;while(len--!=0){for(i=1; i!=0; i*=2){if((crc&1)!=0) {crc/=2; crc^=0x8C;}else crc/=2;if((*ptr&i)!=0) crc^=0x8C;}ptr++;}return(crc);}ATMEGA48多机通讯例子主机程序********************************************************************* ********************************/* AVR单片机DIY网潘小艺 CVAVR1.24.8d通讯规则:1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/2:通讯连接采用硬件MAX485,双向单工3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量)4:每个上行/下行的数据包都采用CRC8校验5:数据接收采用中断+查询的方式6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收8:从机之间不能相互通讯,必须通过主机才能交换数据9:无效地址是0,主机地址是1,从机地址是2.3.4......广播地址是255*/#include <mega48.h>#include <delay.h>#define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧)#include <usart.h>#include <1wire.h> //CRC校验函数就在这个文件里面unsigned char send[amount]; //发件箱unsigned char inbox[amount]; //收件箱unsigned char n=0; //记忆中断次数//--------------------------------------------------------------------interrupt[19] Rxd_isr(void) //接收中断{unsigned char ERROR=0;if( UCSR0A&4 || UCSR0A&16 ) ERROR=1; //奇偶效验错误或者帧错误就记录下来inbox[n]=UDR0; //保存到收件箱n++;//记忆中断次数if(ERROR) inbox[0]=0; //如果通讯有错,收件箱的地址帧就标记成无效地址0}//---------------------------------------------------------------------void main(void){USARTinit(); //串口初始化UCSR0A=0; //主机关闭地址筛选功能(多机通讯功能)#asm("sei") //打开全局中断while(1){//-------------与从机2对话,与其他从机对话与下面的程序类似-------------------n=0;//中断次数清0inbox[0]=0; //收件箱地址清0send[0]=2; //改变这个地址就可以实现与某个从机对话send[amount-1]=w1_dow_crc8(send,amount-1); //计算发件箱的crc8校验码TXD(send); //将发件箱的数据send[]发送出去;//等待,从机接收到数据后会回复数据的,如果是10个字节数据量,不能少于13ms//这个时间由人工计算,要考虑从机由于各种中断延长回复时间的可能 delay_ms(30);//如果收件箱已经收到amount个数据,并且crc8校验成功就...if(n==amount && inbox[amount-1]==w1_dow_crc8(inbox,amount-1)) {if(inbox[0]==1) //如果收件箱地址帧属于本机就运行下面的测试代码{DDRD.3=1;PORTD.3=1; delay_ms(50);PORTD.3=0; delay_ms(950);}if(inbox[0]==255){//请在这里添加收到广播数据的处理程序}}}} //end//******************************************************************* *******************************从机程序//******************************************************************* *******************************#include <mega48.h>#include <delay.h>#define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧)#include <usart.h>#include <1wire.h>#define address 2 //请在这里设定本机地址unsigned char send[amount]; //发件箱unsigned char inbox[amount]; //收件箱unsigned char n=0; //记忆中断次数//--------------------------------------------------------------------interrupt[19] Rxd_isr(void) //接收中断{unsigned char ERROR=0;if( UCSR0A&4 || UCSR0A&16 ) ERROR=1; //记录奇偶效验错误或者帧错误inbox[n]=UDR0;//把接收到的数据保存到收件箱n++;//记忆接收的次数if(ERROR)//如果通讯有错....{n=0;//接收计数清0inbox[0]=0;//把地址改为无效地址0UCSR0A|=0x01;//重新打开接收器的地址帧筛选功能}//如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能if(inbox[0]==address ||inbox[0]==255) UCSR0A&=254;if(n==amount)//接收到amount个数据以后...{n=0;//接收计数清0UCSR0A|=0x01;//重新打开接收器的地址帧筛选功能if(inbox[amount-1]==w1_dow_crc8(inbox,amount-1)) //如果crc8校验正确就...{if(inbox[0]==address) //如果地址匹配本机就回复数据{send[0]=1;//发件箱地址指向主机send[amount-1]=w1_dow_crc8(send,amount-1); //产生发件箱的crc8校验码TXD(send);//发送发件箱的数据包send[]//请在这里备份你的收件箱信息}if(inbox[0]==255) //如果是广播地址就...{//请在这里添加你的代码//收到广播数据请不要回复}}}}//---------------------------------------------------------------------void main(void){USARTinit();//串口初始化UCSR0A=0x01;//从机打开地址帧筛选功能(多机通讯模式)#asm("sei")//打开全局中断while(1){//请在这里添加你的代码}} //end//******************************************************************* **************************<usart.h> 头文件//******************************************************************* **************************//波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断void USARTinit(void){UCSR0B=0x9C;UCSR0C=0x36;UBRR0L=0x2F;PORTD.4=0; //M AX485平时工作在接收状态DDRD.4=1;}//-----------------------------------------------------------//从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧void TXD(unsigned char *datas){unsigned char i=0;PORTD.4=1; //使MAX485处于发送状态while(i<amount) //一共发送amount个数据{if(i==0) UCSR0B|=1; else UCSR0B&=254;UDR0=*(datas+i); //装载数据开始发送while((UCSR0A&64)==0); //等待发送结束UCSR0A|=64; //清除发送结束标志i++;//发送次数统计}PORTD.4=0; //使MAX485处于接收状态}//******************************************************************* **************************ATMEGA48中T/C0的相位修正PWM与快速PWM例子/***************************************************** CodeWizardAVR V1.25.3 Professional相位修正PWM,也可以叫双斜率PWM*****************************************************/。

第三章 AVR汇编指令

第三章   AVR汇编指令

Rd,Rr Rd,K Rd,K Rd Rd,Rr 或指令

AVR指令系统-算术和逻辑运算指令

逻辑异或指令

寄存器异或 寄存器清零
EOR CLR
Rd,Rr Rd

乘法指令

无符号数乘法 MUL 有符号数乘法 MULS 有符号数与无符号数乘法 MULSU 无符号定点小数乘法 FMUL 有符号定点小数乘法 FMULS 有符号定点小数和无符号定点小数乘 FMULSU
AVR指令系统

ATmega16 共有131 条指令,按功能可 分为五大类,



算术和逻辑运算指令(28 条) 比较和跳转指令(36 条) 数据传送指令(35 条) 位操作和位测试指令(28 条) MCU 控制指令(4 条)
AVR指令系统

AVR 指令的寻址方式和寻址空间

单寄存器直接寻址 双寄存器直接寻址方式 I/O 寄存器直接寻址 数据空间直接寻址 后增量数据空间寄存器间接寻址 带位移的数据空间寄存器间接寻址 程序空间取常量寻址 程序空间写数据寻址 程序空间相对寻址 数据空间的寄存器间接寻址 预减量数据空间寄存器间接寻址 数据空间堆栈寄存器SP 间接寻址 程序空间直接寻址 程序空间Z 寄存器间接寻址 后增量程序空间取常量寻址
BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRTS BRTC BRVS BRVC BRIE BRID
k k k k k k k k k k k k k k
AVR指令系统-比较和跳转指令

测试条件符合跳行跳转指令



相等跳行 CPSE Rd,Rr 寄存器位为“0”跳行 SBRC Rr,b 寄存器位为“1”跳行 SBRS Rr,b I/O 寄存器位为“0”跳行 SBIC P,b I/O 寄存器位为“1”跳行 SBIS P,b

ARM汇编指令集详解大汇总

ARM汇编指令集详解大汇总

ARM汇编指令集详解大汇总——《常用ARMv4指令集及汇编》和《ARM汇编指令集》前言零零散散用了大概一周的时间,在《常用ARM指令集及汇编》(2003年12月1日)的基础上,大致学习了一遍ARM指令集和汇编,看的过程当中更正了一些错误的地方,并结合其它资料适当添加了一些内容,也做了一些删减,现分享出来,希望能帮助到需要的人。

文中必然还有一些错误还有待改进,有些地方还需要解释的更加详细,本人精力有限,希望有心的读者,订正并增加注释,最好也分享出来,以方便大家对ARM指令的深入理解。

作为刚入行的新手,不谦虚的推荐几本书:《ARM体系结构与编程-杜春雷》,《嵌入式系统体系结构、编程与设计-Raj Kamal著,贾建斌译》,《嵌入式系统:采用公开源代码和StrongARM_XScale处理器-毛德操》。

这几本书到底好不好,看个人需求和喜好吧,仁者见仁智者见智。

最后,感谢《常用ARM指令集及汇编》的原作者和其它资料的作者让我有机会学习我不熟悉的东西,谢谢。

learllp2015-11-09目录常用ARM v4指令集及汇编........................................................................ 错误!未定义书签。

前言................................................................................................................................................ I I 目录. (IV)ARM v4指令集及汇编 (1)一、ARM处理器寻址方式 (1)寄存器寻址 (1)立即寻址 (1)寄存器偏移寻址 (1)寄存器间接寻址 (2)基址寻址 (2)多寄存器寻址 (3)堆栈寻址 (3)块拷贝寻址 (3)相对寻址 (3)二、指令集介绍 (4)ARM指令集 (4)指令格式 (4)基本格式 (4)第2个操作数 (4)1.#immed_8r常数表达式 (5)2.Rm 寄存器方式 (5)3.Rm,shift寄存器移位方式 (5)条件码 (6)ARM 存储器访问指令 (6)◆LDR和STR (7)◆LDM和STM (9)◆SWP (12)ARM 数据处理指令 (12)数据传送指令 (13)算术逻辑运算指令 (13)比较指令 (15)乘法指令 (16)ARM 跳转指令 (17)ARM 协处理器指令 (18)ARM 杂项指令 (19)ARM 伪指令 (21)Thumb 指令集 (23)Thumb 指令集与ARM 指令集的区别 (23)跳转指令 (24)数据处理指令 (24)单寄存器加载和存储指令 (24)批量寄存器加载和存储指令 (24)Thumb 存储器访问指令 (24)伪指令 (26)符号定义伪指令 (26)数据定义伪指令 (28)报告伪指令 (32)汇编控制伪指令 (33)杂项伪指令 (35)◆AREA (36)◆CODE16 和CODE32 (37)◆END (37)◆ENTRY (37)◆EQU (37)◆EXPORT 和GLOBAL (38)◆IMPORT 和EXTERN (38)◆GET 和INCLUDE (38)◆INCBIN (39)◆KEEP (39)◆NOFP (39)◆REQUIRE (39)◆PEQUIRE8 和PRESERVE8 (39)◆RN (39)◆ROUT (40)ARM 伪指令 (40)◆ADR (40)◆ADRL (40)◆LDR (40)◆NOP (41)◆LDFD (41)◆LDFS (41)三、ARM汇编程序设计 (41)文件格式 (41)ARM 汇编的一些规范 (41)汇编语句格式 (41)标号 (42)基于PC 的标号 (42)基于寄存器的标号 (42)绝对地址 (42)局部标号 (43)符号 (43)常量 (43)数字常数 (43)字符常量 (44)布尔常量 (44)段定义 (44)宏定义及其作用 (44)子程序的调用 (45)数据比较跳转 (45)循环 (46)数据块复制 (46)栈操作 (46)特殊寄存器定义及应用 (47)散转功能 (47)查表操作 (47)长跳转 (47)对信号量的支持 (48)伪指令使用 (48)一个完整的例子 (48)外围部件控制 (48)四、C与汇编混合编程 (49)内嵌汇编 (49)内嵌汇编的指令用法 (50)内嵌汇编器与armasm 汇编器的差异 (51)内嵌汇编注意事项 (51)访问全局变量 (52)C与汇编相互调用 (53)寄存器的使用规则 (53)堆栈使用规则 (53)参数传递规则 (54)C程序调用汇编程序 (54)调用汇编的C函数: (54)汇编程序调用C程序 (55)五、ARM 指令集列表 (55)ARM 存储器访问指令表列表 (55)ARM 数据处理指令列表 (57)ARM 乘法指令列表 (58)ARM 跳转指令列表 (59)ARM 协处理器指令列表 (60)ARM 杂项指令列表 (61)ARM 伪指令列表 (62)六、Thumb 指令集列表 (120)Thumb 存储器访问指令列表 (120)Thumb 数据处理指令列表 (121)Thumb 跳转指令及软中断指令列表 (122)Thumb 伪指令列表 (123)七、汇编预定义变量及伪指令 (124)预定义的寄存器和协处理器名 (124)通用寄存器 (124)程序状态寄存器 (124)浮点数寄存器 (124)协处理器及协处理器寄存器 (125)八、内置变量列表 (125)九、伪指令列表 (126)十、指令条件码列表 (128)十一、CPSR 和S PSR 分配图 (129)ARM v4指令集及汇编ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,具有32 位ARM 指令集和16 位Thumb 指令集。

汇编指令

汇编指令
───────────────────────────────────────
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两**作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.

汇编指令大全

汇编指令大全

汇编汇编指令大全指令大全指令大全零、状态寄存器1MOVE 数据传送指令 MOV 格式: MOV OPRD1,OPRD2 功能: 本指令将一个源操作数送到目的操作数中,即OPRD1<--OPRD2.说明:1. OPRD1 为目的操作数,可以是寄存器、存储器、累加器.OPRD2 为源操作数,可以是寄存器、存储器、累加器和立即数.2. MOV 指令以分为以下四种情况:<1> 寄存器与寄存器之间的数据传送指令<2> 立即数到通用寄存器数据传送指令<3> 寄存器与存储器之间的数据传送指令<4> 立即数到存储器的数据传送3. 本指令不影响状态标志位2PUSH 堆栈操作指令 PUSH和POP 格式: PUSH OPRD POP OPRD 功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令.说明:1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数.2. PUSH的操作过程是: (SP)<--(SP)-2,((sp))<--OPRD 即先修改堆栈指针SP(压入时为自动减2),然后,将指定的操作数送入新的栈顶位置.此处的((SP))<--OPRD,也可以理解为: [(SS)*16+(SP)]<--OPRD或 [SS:SP]<--OPRD3POP 堆栈操作指令 PUSH和POP 格式: PUSH OPRD POP OPRD 功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令.说明:1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数.2. POP指令的操作过程是: POPOPRD:OPRD<--((SP)),(SP)<--(SP)+2它与压入操作相反,是先弹出栈顶的数顶,然后再修改指针SP的内容.3. 示例: POP AXPOP DSPOP DATA1 POP ALFA[BX][DI]4. PUSH和POP指令对状态标志位没有影响.4XCHG 数据交换指令 XCHG 格式: XCHG OPRD1,OPRD2 其中的OPRD1为目的操作数,OPRD2为源操作数 功能: 将两个操作数相互交换位置,该指令把源操作数OPRD2与目的操数OPRD1交换.说明:1. OPRD1及OPRD2可为通用寄存器或存储器,但是两个存储器之间是不能用XCHG指令实现的.2. 段寄存器内容不能用XCHG指令来交换.3. 若要实现两个存储器操作数DATA1及DATA2的交换,可用以下指令实现:示例: PUSH DATA1PUSH DATA2POP DATA1POP DATA24. 本指令不影响状态标志位.5XLAT查表指令 XLAT格式: XLAT TABLE其中TABLE为一待查表格的首地址.功能: 把待查表格的一个字节内容送到AL累加器中.说明:1. 在执行该指令前,应将TABLE 先送至BX寄存器中,然后将待查字节与在表格中距表首地址位移量送AL,即 (AL)<--((BX)+ (AL)).2. 本指令不影响状态标位,表格长度不超过256字节.6LAHF标志传送指令 LAHF格式: LAHF功能: 取FLAG标志寄存器低8位至AH寄存器.(AH)<--(FLAG)7~0说明: 该指令不影响FLAG的原来内容,AH只是复制了原FLAG的低8位内容.7SAHF标志传送指令 SAHF格式: SAHF功能: 将AH存至FLAG低8位说明: 本指令将用AH的内容改写FLAG标志寄存器中的SF、ZF、AF、PF、和CF标志,从而改变原来的标志位.8PUSHF标志传送指令 PUSHF格式: PUSHF功能: 本指令可以把标志寄存器的内容保存到堆栈中去9POPF标志传送指令 POPF格式: POPF功能: 本指令的功能与PUSHF相反,在子程序调用和中断服务程序中,往往用PUSHF指令保护FLAG的内容,用POPF指令将保护的FLAG内容恢复.说明: 如果对堆栈中的原FLAG内容进行修改,如对TF等标志位进行修改,然后再弹回标志位寄存器FLAG.这是通过指令修改TF标志的唯一方法.10LEA有效地址传送指令 LEA格式: LEA OPRD1,OPRD2功能: 将源操作数给出的有效地址传送到指定的的寄存器中.说明:1. OPRD1 为目的操作数,可为任意一个16位的通用寄存器.OPRD2 为源操作数,可为变量名、标号或地址表达式.示例: LEA BX,DATA1LEA DX,BETA[BX+SI]LEA BX BX,[BP],[DI]2. 本指令对标志位无影响。

AVR的指令与汇编系统 马潮课件

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和各个功能部件完成的动作也不一样,指令的功能也不同。

AVR汇编指令

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】 SERRd (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+,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 状态标记设置或清除SET CLTSES CLSSEN CLNSEV CLVSEZ CLZSEC CLCSBI P,b CBI P,b 32IO口指定位设置清楚;P =【0-31】 b =【0-7】其他WDR 看门狗复位SLEEP 休眠NOP 空指令。

mega8课程总结

mega8课程总结

数据存储器(SRAM): 1024 字节 0x0060 ~ 0x045F
EEPROM(I/O设备) : 512 字节 0x000 ~ 0x1FF
mega8课程总结
by2wky
单片机课程总结
•AVR单片机(ATmega8)的典型寄存器: 通用寄存器 R0—R31,16位寄存器(指针) X/Y/Z 专用寄存器 SREG, SP(SPH, SPL), PC 其他I/O寄存器:并行端口、外部中断、定时器0
• 定点小数乘法指令: FMUL /FMULS /FMULSU mega8课程总结
by7wky
单片机课程总结
第三章(指令系统): 算逻运算和移位指令
• 逻辑与指令:AND/ ANDI / CBR / TST • 逻辑或指令:OR/ ORI / SBR / SER • 逻辑异或指令:EOR/ CLR • 循环和移位指令:LSL/ LSR/ ROL/ ROR/ ASR/ SWAP
mega8课程总结
by9wky
单片机课程总结
第三章(指令系统): 位操作和MCU控制指令
•寄存器位T标志:BST、BLD • I/O寄存器某位置位/清0:SBI/ CBI •进位标志置位清0指令:SEC/ CLC •全局中断标志置位清0指令: SEI/ CLI •MCU控制指令:NOP、SLEEP、WDR
寻址方式
•寄存器直接寻址(寄存器寻址)
•数据直接寻址(直接寻址)
•立即数寻址
•寄存器间接寻址(间接寻址)
•变址寻址、相对寻址、位寻址
mega8课程总结
by5wky
单片机课程总结
第三章(指令系统): 数据传送类指令
•寄存器之间:MOV/ MOVW/ LDI •寄存器和SRAM之间:LDS/ STS、LD/ ST、LDD/ STD •从程序存储器读数: LPM •寄存器和I/O之间(输入输出指令):IN/ OUT •堆栈操作指令:PUSH/ POP
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指令集概述指令操作数说明操作标志 # 时钟数算数和逻辑指令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。

相关文档
最新文档