没有合适的资源?快使用搜索试试~ 我知道了~
AVR单片机指令入门.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 162 浏览量
2023-07-03
15:18:52
上传
评论
收藏 138KB DOC 举报
温馨提示
试读
15页
AVR单片机指令入门.doc
资源推荐
资源详情
资源评论
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。
3、I/O寄存器直接寻址
由指令指定一个I/O寄存器的内容作为操作数。在指令中直接给出I/O寄存器的地址,这种寻址方式称为I/O寄存
器直接寻址。I/O寄存器直接寻址的地址使用I/O寄存器空间的地址$00~$3F,共64个,取值为0~63或0~31。
例:IN Rd,P;操作:Rd←P。
IN R5,$3E;读I/O空间地址为$3E寄存器(SPH)的内容,放入寄存器R5。
4、数据存储器空间直接寻址
数据存储器空间直接寻址方式用于直接CPU从SRAM存储器中存取数据。数据存储器空间直接寻址为双字指令,在
指令的低字中指出一个16位的SRAM地址。
例:LDS Rd,K;操作:Rd←(K)。
LDS R18,$100;读地址为$100的SRAM中内容,传送到R18中。
指令中16位SRAM的地址字长度限定了SRAM的地址空间为64K字节,该地址空间实际包含了32个通用寄存器和64个
I/O寄存器。因此,也可使用数据存储器空间直接寻址的方式读取通用寄存器或I/O寄存器中的内容,此时应使用这
些寄存器在SRAM空间的映射地址,而且其效率也比使用寄存器直接寻址的方式要低。原因在于数据存储器空间直接
寻址的指令为双字指令,指令周期为2个系统时钟。
5、数据存储器空间的寄存器间接寻址
由指令指定某一个16位寄存器的内容作为操作数在SRAM中的地址,该寻址方式称为数据存储器空间的寄存器间
接寻址。AVR单片机中使用16位寄存器X、Y或Z作为规定的地址指针寄存器,因此操作数的SRAM地址在间址寄存器X、
Y或Z中。
例:LD Rd,Y;操作:Rd ←(Y),把以Y为指针的SRAM的内容送Rd。
LD R16,Y;设Y=$0567,即把SRAM地址为$0567的内容传送到R16中。
6、带后增量的数据存储器空间的寄存器间接寻址
这种寻址方式类似于数据存储器空间的寄存器间接寻址方式,间址寄存器X、Y、Z中的内容仍为操作数在SRAM空
间的地址,但指令在间接寻址操作后,再自动把间址寄存器中的内容加1。这种寻址方式特别适用于访问矩阵、查表
等应用。
例:LD Rd,Y+;操作:Rd←(Y),Y=Y+1,先把以Y为指针的SRAM的内容送Rd,再把Y增1。
LD R16,Y+;设原 Y=$0567,指令把 SRAM 地址为$0567 的内容传送到 R16 中,再将 Y 的值加 1,操作完成后 Y=$0568。
7、带预减量的数据存储器空间寄存器间接寻址
这种寻址方式类似于数据存储器空间的寄存器间接寻址方式,间址寄存器X、Y、Z中的内容仍为操作数在SRAM空
间的地址,但指令在间接寻址操作之前,先自动将间址寄存器中的内容减1,然后把减1后的内容作为操作数在SRAM
空间的地址。这种寻址方式也特别适用于访问矩阵、查表等应用。
例:LD Rd,-Y;操作:Y=Y-1,Rd←(Y),先把Y减1,再把以Y为指针的SRAM的内容送Rd。
LD R16,-Y;设原Y=$0567,指令即先把Y减1,Y=$0566,再把SRAM地址为$0566的内容传送到R16中。
8、带位移的数据存储器空间寄存器间接寻址
带位移的数据存储器空间寄存器间接寻址方式是:由间址寄存器(Y或Z)中的内容和指令字中给出的地址偏移
量共同决定操作数在SRAM空间的地址,偏移量的范围为0~63。
例:LDD Rd,Y+q;操作:Rd←(Y+q),其中0≤q≤63,即把以Y+q为地址的SRAM的内容送Rd,而Y寄存器的内容
不变。
LDD R16,Y+31;设Y=$0567,把SRAM地址为$0598的内容传送到R16中,Y寄存器的内容不变。
9、程序存储器空间取常量寻址
程序存储器空间取常量寻址主要从程序存储器Flash中读取常量,此种寻址方式只用于指令LPM。程序存储器中
常量字节的地址由地址寄存器Z的内容确定。Z寄存器的高15位用于选择字地址(程序存储器的存储单元为字),而Z
寄存器的最低位Z(d0)用于确定字地址的高/低字节。若d0=0,则选择字的低字节;d0=1,则选择字的高字节。
例:LPM;操作:R0 ←(Z),即把以Z为指针的程序存储器的内容送R0。
若Z=$0100,即把地址为$0080的程序存储器的低字节内容送R0。
若Z=$0101,即把地址为$0080的程序存储器的高字节内容送R0。
例:LPM R16,Z;操作:R16←(Z),即把以Z为指针的程序存储器的内容送R16。
若Z=$0100,即把地址为$0080的程序存储器的低字节内容送R16。
若Z=$0101,即把地址为$0080的程序存储器的高字节内容送R16。
10、带后增量的程序存储器空间取常量寻址
带后增量的程序存储器空间取常量寻址主要从程序存储器Flash中取常量,此种寻址方式只用于指令LPM Rd,
Z+。程序存储器中常量字节的地址由地址寄存器Z的内容确定。Z寄存器的高15位用于选择字地址(程序存储器的存
储单元为字),而Z寄存器的最低位Z(d0)用于确定字地址的高/低字节。若d0=0,则选择字的低字节;d0=1,则选
择字的高字节。寻址操作后,Z寄存器的内容加1。例:LPM R16,Z+;操作:R16←(Z);Z←Z+1,即把以Z为指针的
程序存储器的内容送R16,然后Z的内容加1。
若Z=$0100,即把地址为$0080的程序存储器的低字节内容送R16,完成后Z=$0101。
若Z=$0101,即把地址为$0080的程序存储器的高字节内容送R16,完成后Z=$0102。
11、程序存储器空间写数据寻址
程序存储器空间写数据寻址主要用于可进行在系统自编程的AVR单片机,此种寻址方式只用于指令SPM。该指令
将寄存器R1和R0中的内容组成一个字R1:R0,然后写入由Z寄存器的内容作为地址(Z寄存器的最低位必须为0)的程
序存储器单元中。(注意:实际是写入到Flash的页缓冲区中)。
例:SPM;操作:(Z)←R1:R0,把R1:R0内容写入以Z为指针的程序存储器单元。
12、程序存储器空间直接寻址
程序存储器空间直接寻址方式用于程序的无条件跳转指令JMP、CALL。指令中含有一个16位的操作数,指令将操
作数存入程序计数器PC中,作为下一条要执行指令在程序存储器空间的地址。JMP类指令和CALL类指令的寻址方式相
同,但CALL类的指令还包括了返回地址的压进堆栈和堆栈指针寄存器SP内容减2的操作。
例:JMP $0100;操作:PC←$0100。程序计数器PC的值设置为$0100,接下来执行程序存储器$0100单元的指令代
码。
例:CALL $0100;操作:STACK←PC+2;SP←SP-2;PC←$0100。先将程序计数器PC的当前值加2后压进堆栈(CALL
指令为2个字长),堆栈指针计数器SP内容减2,然后PC的值为$0100,接下来执行程序存储器$0100单元的指令代码。
13、程序存储器空间Z寄存器间接寻址
程序存储器空间间接寻址方式是使用Z寄存器存放下一步要执行指令代码程序地址,程序转到Z寄存器内容所指
定程序存储器的地址处继续执行,即用寄存器Z的内容代替PC的值。此寻址方式用于IJMP、ICALL指令。
例:IJMP;操作:PC←Z,即把Z的内容送程序计数器PC。若Z=$0100,即把$0100送程序计数器PC,接下来执行
程序存储器$0100单元的指令代码。
例:ICALL;操作:STACK←PC+1;SP←SP-2;PC←Z。若Z=$0100,先将程序计数器PC的当前值加1后压进堆栈,
堆栈指针计数器SP内容减2,然后PC的值为$0100,接下来执行程序存储器$0100单元的指令代码。
14、程序存储器空间相对寻址
在程序存储器空间相对寻址方式中,在指令中包含一个相对偏移量k,指令执行时,首先将当前程序计数器PC值
加1后再与偏移量k相加,作为程序下一条要执行指令的地址。此寻址方式用于RJMP、RCALL指令。例:RJMP $0100;
操作:PC←PC+1+$0100。若当前指令地址为$0200(PC=$0200),即把$0301送程序计数器PC,接下来执行程序存储
器$0301单元的指令代码。
例:RCALL $0100;操作:STACK←PC+1;SP←SP-2;PC←PC+1+$0100。若当前指令地址为$0200(PC=$0200),
先将程序计数器PC的当前值加1后压进堆栈,堆栈指针计数器SP内容减2,然后PC的值为$0301,接下来执行程序存储
器$0301单元的指令代码。
15、数据存储器空间堆栈寄存器SP间接寻址
数据存储器空间堆栈寄存器SP 间接寻址,是将16位的堆栈寄存器SP的内容作为操作数在SRAM空间的地址,此寻
址方式用于PUSH、POP指令。
例:PUSH R0;操作:STACK←R0;SP←SP-1。若当前SP=$10FF,先把寄存器R0的内容送到SRAM的$10FF单元,再
将SP内容减1,即SP=$10FE。
例:POP R1;操作:SP←SP+1;R1←STACK。若当前SP=$10FE,先将SP内容加1,再把SRAM的$10FF单元内容送到
寄存器R1,此时SP=$10FF。
此外,在CPU响应中断和执行CALL一类的子程序调用指令(SP = SP-2),以及执行中断返回IRET和子程序返回RET
一类的子程序返回指令中(SP = SP+2),都隐含着使用堆栈寄存器SP间接寻址的方式。
AVR的算术运算指令有加、减、乘法、取反、取补、比较指令、增量和减量指令。逻辑运算指令有与、或和异或
指令等。
加法指令
1、不带进位位加法
ADD Rd,Rr 0≤d≤31,0≤r≤31
说明:两个寄存器不带进位C标志相加,结果送目的寄存器Rd。
操作:Rd←Rd+Rr PC←PC+1 机器码:0000 11rd dddd rrrr 对标志位的影响:H S V N Z C
2、带进位位加法
ADC Rd,Rr 0≤d≤31,0≤r≤31
说明:两个寄存器和C标志的内容相加,结果送目的寄存器Rd。
操作:Rd←Rd+Rr+C PC←PC+1 机器码:0001 11rd dddd rrrr 对标志位的影响:H S V N Z C
3、字加立即数
ADIW Rdl,K dl为:24、26、28、30,0≤K≤63
说明:寄存器对(一个字)同立即数(0~63)相加,结果放到寄存器对。
操作:Rdh:Rdl←Rdh:Rdl+K PC←PC+1 机器码:1001 0110 KKdd KKKK
对标志位的影响:S V N Z C
注意:dl只能取24、26、28、30,即仅用于最后4个寄存器对。K为6位二进制无符号数(0~63)。
4、增1指令
INC Rd 0≤d≤31
说明:寄存器Rd的内容加1,结果送目的寄存器Rd中。该操作不改变SREG中的C标志,所以INC指令允许在多倍字
长计算中用作循环计数。当对无符号数操作时,仅有BREQ(相等跳转)和BRNE(不为零跳转)指令有效。当对二进
制补码值操作时,所有的带符号跳转指令都有效。
操作:Rd←Rd+1 PC←PC+1 机器码:1001 010d dddd 0011 对标志位的影响:S V N Z
减法指令
1、不带进位位减法
SUB Rd,Rr 0≤d≤31,0≤r≤31
说明:两个寄存器相减结果送目的寄存器Rd中。
操作:Rd←Rd-Rr PC←PC+1 机器码:0001 10rd dddd rrrr 对标志位的影响:H S V N Z C
2、减立即数(字节)
SUBI Rd,K 16≤d≤31,0≤K≤255
说明:一个寄存器和常数相减,结果送目的寄存器Rd。该指令工作于寄存器R16~R31之间,非常适合X、Y和Z指
针的操作。
操作:Rd←Rd-K PC←PC+1 机器码:0101 KKKK dddd KKKK 对标志位的影响:H S V N Z C
3、带进位位减法
SBC Rd,Rr 0≤d≤31,0≤r≤31
说明:两个寄存器带着C标志相减,结果放到目的寄存器Rd 中。
操作:Rd←Rd-Rr-C PC←PC+1 机器码:0000 10rd dddd rrrr 对标志位的影响:H S V N Z C
4、带进位位减立即数(字节)
SBCI Rd,K 16≤d≤31,0≤K≤255
说明:寄存器和立即数带着C标志相减,结果放到目的寄存器Rd中。
操作:Rd←Rd-K-C PC←PC+1 机器码:0100 KKKK dddd KKKK 对标志位的影响:H S V N Z C
5、减立即数(字)
SBIW Rdl,K dl为24、26、28、30,0≤K≤63
说明:寄存器对(字)与立即数0~63相减,结果放入寄存器对。
操作:Rdh:Rdl←Rdh:Rdl-K PC←PC+1 机器码:1001 0111 KKdd KKKK
注意:dl只能取24、26、28、30,即仅用于最后4个寄存器对。K为6位二进制无符号数(0~63)。
对标志位的影响:S V N Z C
6、减1指令
DEC Rd 0≤d≤31
说明:寄存器Rd 的内容减1,结果送目的寄存器Rd中。该操作不改变SREG中的C标志,所以DEC 指令允许在多倍
字长计算中用作循环计数。当对无符号值操作时,仅有BREQ(不相等跳转)和BRNE(不为零跳转)指令有效。当对
二进制补码值操作时,所有的带符号跳转指令都有效。
操作:Rd←Rd-l PC←PC+1 机器码:1001 010d dddd 1010 对标志位的影响:S V N Z
取反指令
COM Rd 0≤d≤31
剩余14页未读,继续阅读
资源评论
oligaga
- 粉丝: 50
- 资源: 2万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功