AVR单片基础及指令手册

一、ATmega256RFR2 简要手册

1. 概述

ATmega256RFR2是一款基于AVR增强型RISC架构的低功耗CMOS 8位微控制器,集成了高性能2.4GHz无线收发器。它具有丰富的指令集、多种存储器选项和强大的外设功能,适用于ZigBee、IEEE 802.15.4、6LoWPAN及其他低功耗无线应用。

2. 主要特性

• 微控制器核心:
◦ 高性能、低功耗AVR® 8位RISC架构
◦ 135条强大指令,多数为单时钟周期执行
◦ 32个8位通用工作寄存器 (R0-R31)
◦ 片上2周期硬件乘法器
◦ 在16MHz和1.8V下,吞吐量高达16 MIPS
• 存储器:
◦ Flash程序存储器: 256KB (ATmega256RFR2型号)
◦ EEPROM数据存储器: 8KB
◦ SRAM数据存储器: 32KB 内部SRAM
• 2.4GHz无线收发器:
◦ 工作于2.4GHz ISM频段
◦ 支持数据率: 250 kb/s, 500 kb/s, 1 Mb/s, 2 Mb/s
◦ 高接收灵敏度: -100 dBm
◦ 发射功率: 高达 +3.5 dBm
◦ 硬件MAC加速功能 (如自动应答、自动重传)
• 关键外设:
◦ 多个定时器/计数器,支持PWM输出
◦ 实时计数器 (RTC)
◦ 10位ADC,多达8个单端通道或11个差分通道
◦ 主/从SPI串行接口
◦ 2个可编程串行USART
◦ TWI (I2C兼容) 串行接口
◦ JTAG接口 (IEEE 1149.1标准),支持片上调试和Flash、EEPROM、熔丝位、锁定位的编程
• 电源与功耗:
◦ 工作电压: 1.8V – 3.6V
◦ CPU活动模式 (16MHz): 约4.1 mA
◦ 收发器接收模式 (RX_ON): 约6.0 mA
◦ 收发器发送模式 (TX 14.5 mA @ 最大功率)
◦ 深度睡眠模式: <700nA @ 25°C
• 时钟系统:
◦ 最高系统时钟频率: 16MHz
◦ 集成晶体振荡器,支持外接16MHz晶体 (用于主系统和收发器) 和32.768kHz晶体 (用于RTC)
• I/O 和封装:
◦ 多达38个可编程I/O口线
◦ 64引脚QFN封装

3. 存储器组织与寻址

ATmega256RFR2具有独立的程序存储器和数据存储器空间(小端模式哈佛结构)。
• 程序存储器 (Flash): 用于存储程序代码。
• 数据存储器空间 (Data Memory Space):
◦ 通用工作寄存器 (GPRs - R0-R31):
▪ 共32个8位寄存器,编号R0到R31。
▪ 寄存器直接寻址: 在许多AVR指令中,这些寄存器可以直接作为操作数。
▪ 数据空间映射: R0-R31映射到数据存储空间的最低32个字节地址,即 0x0000 - 0x001F。
• 例如,R31 的数据空间地址是 0x001F。
• 这些地址可以通过 LDS (从数据空间加载) 和 STS (存储到数据空间) 指令访问。
◦ I/O寄存器空间 (I/O Memory):
▪ 标准I/O寄存器 (Standard I/O Registers):
• 共64个I/O寄存器。
• 直接I/O寻址 (使用 IN/OUT 指令): I/O端口地址范围为 0x00 - 0x3F。例如,IN R16, 0x21 (访问I/O端口0x21)。
• 数据空间映射 (使用 LDS/STS 指令): 这些标准I/O寄存器也映射到数据空间,地址范围为 0x0020 - 0x005F (即I/O端口地址加上0x20的偏移量)。例如,访问I/O端口0x21的数据空间地址是0x0041。
▪ 扩展I/O寄存器 (Extended I/O Registers):
• 共416个扩展I/O寄存器。
• 数据空间寻址 (仅能使用 LDS/STS 指令): 数据空间地址范围为 0x0060 - 0x01FF。不能使用 IN/OUT 指令访问。
◦ 内部SRAM (Internal SRAM):
▪ 在上述寄存器空间之后,从数据空间地址 0x0200 开始,直到SRAM的末尾。ATmega256RFR2具有32KB的SRAM。

4. 时钟系统

• 主系统时钟: 最高可达 16MHz。可以由内部RC振荡器、外部晶体振荡器或外部时钟源提供。
• 无线收发器时钟: 通常使用16MHz晶体振荡器作为其参考时钟。
• RTC时钟: 可使用32.768kHz晶体振荡器。

二、AVR 单片机汇编指令手册 (A-Z)

引言
AVR 单片机采用精简指令集计算机 (RISC) 架构,其指令系统设计简洁高效。大部分指令在一个时钟周期内完成。本手册将 AVR 指令按字母顺序排列,并说明其格式、功能和分类。

A

  1. ADC Rd, Rr (带进位加法)
    ◦ 分类: 算术运算指令
    ◦ 格式: ADC Rd, Rr
    ◦ 说明: 将寄存器 Rd、寄存器 Rr 以及状态寄存器 SREG 中的进位标志 C 相加,结果存回 Rd。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 影响标志: H, S, V, N, Z, C
  2. ADD Rd, Rr (加法)
    ◦ 分类: 算术运算指令
    ◦ 格式: ADD Rd, Rr
    ◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容相加,结果存回 Rd。不考虑进位标志 C。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 影响标志: H, S, V, N, Z, C
  3. ADIW Rdl, K (立即数加法 - 字)
    ◦ 分类: 算术运算指令
    ◦ 格式: ADIW Rdl, K (Rdl 为 R24, R26, R28, R30; K 为 0-63)
    ◦ 说明: 将一个 16 位寄存器对 (Rdh:Rdl) 与一个 6 位立即数 K (0-63) 相加,结果存回该寄存器对。Rdl 必须是 R24, R26, R28 或 R30。
    ◦ 影响标志: S, V, N, Z, C
  4. AND Rd, Rr (逻辑与)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: AND Rd, Rr
    ◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑与操作,结果存回 Rd。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 影响标志: S, V=0, N, Z
  5. ANDI Rd, K (立即数逻辑与)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: ANDI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 将寄存器 Rd 的内容与 8 位立即数 K 进行逻辑与操作,结果存回 Rd。
    ◦ 影响标志: S, V=0, N, Z
  6. ASR Rd (算术右移)
    ◦ 分类: 移位指令
    ◦ 格式: ASR Rd
    ◦ 说明: 将寄存器 Rd 的内容算术右移一位。位 7 (最高位) 保持不变,位 0 移入进位标志 C。(0 ≤ d ≤ 31)
    ◦ 影响标志: S, V, N, Z, C

B

  1. BCLR s (清除状态寄存器位)
    ◦ 分类: 位操作指令
    ◦ 格式: BCLR s (0 ≤ s ≤ 7)
    ◦ 说明: 清除状态寄存器 SREG 中的指定位 s。例如 BCLR 0 清除 C 标志 (等同于 CLC)。
    ◦ 影响标志: SREG(s)
  2. BLD Rd, b (从 T 标志位加载到寄存器位)
    ◦ 分类: 位操作指令
    ◦ 格式: BLD Rd, b (0 ≤ d ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 将状态寄存器 SREG 中的 T 标志位的值复制到寄存器 Rd 的指定位 b。
    ◦ 影响标志: 无 (除了 Rd 的目标位)
  3. BRBC s, k (如果状态位清零则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRBC s, k (0 ≤ s ≤ 7, -64 ≤ k ≤ +63)
    ◦ 说明: 测试状态寄存器 SREG 中的指定位 s。如果该位为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  4. BRBS s, k (如果状态位置位则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRBS s, k (0 ≤ s ≤ 7, -64 ≤ k ≤ +63)
    ◦ 说明: 测试状态寄存器 SREG 中的指定位 s。如果该位为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  5. BRCC k (如果进位清零则分支 / 无符号数大于等于则跳转 BRSH)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRCC k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的进位标志 C 为 0,则相对转移到 PC + k + 1。也用作 BRSH (Branch if Same or Higher)。当 进位标志位 C = 0(即没有发生进位)时,执行跳转;否则继续执行下一条指令。
    ◦ 影响标志: 无
  6. BRCS k (如果进位位置位则分支 / 无符号数小于则跳转 BRLO)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRCS k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的进位标志 C 为 1,则相对转移到 PC + k + 1。也用作 BRLO (Branch if Lower)。
    ◦ 影响标志: 无
  7. BREQ k (如果相等则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BREQ k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的零标志 Z 为 1 (表示上一个比较或算术操作结果为零),则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  8. BRGE k (如果带符号数大于等于则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRGE k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果 N⊕V = 0 (负标志 N 和溢出标志 V 相同),则相对转移到 PC + k + 1。用于带符号比较。
    ◦ 影响标志: 无
  9. BRHC k (如果半进位清零则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRHC k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的半进位标志 H 为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  10. BRHS k (如果半进位位置位则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRHS k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的半进位标志 H 为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  11. BRID k (如果中断禁止则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRID k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的全局中断允许标志 I 为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  12. BRIE k (如果中断允许则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRIE k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的全局中断允许标志 I 为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  13. BRLO k (无符号数小于则跳转)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRLO k (-64 ≤ k ≤ +63)
    ◦ 说明: 见 BRCS k。如果 C=1,则跳转。
  14. BRLT k (如果带符号数小于则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRLT k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果 N⊕V = 1 (负标志 N 和溢出标志 V 不同),则相对转移到 PC + k + 1。用于带符号比较。
    ◦ 影响标志: 无
  15. BRMI k (如果结果为负则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRMI k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的负标志 N 为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  16. BRNE k (如果不相等则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRNE k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的零标志 Z 为 0 (表示上一个比较或算术操作结果不为零),则相对转移到 PC + k + 1。当 零标志位 Z = 0(即结果不等于 0)时,执行跳转;否则继续执行下一条指令。
    ◦ 影响标志: 无
  17. BRPL k (如果结果为正则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRPL k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的负标志 N 为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  18. BRSH k (无符号数大于等于则跳转)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRSH k (-64 ≤ k ≤ +63)
    ◦ 说明: 见 BRCC k。如果 C=0,则跳转。
  19. BRTC k (如果 T 标志清零则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRTC k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的 T 标志位为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  20. BRTS k (如果 T 标志置位则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRTS k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的 T 标志位为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  21. BRVC k (如果溢出清零则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRVC k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的溢出标志 V 为 0,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  22. BRVS k (如果溢出置位则分支)
    ◦ 分类: 程序流控制指令 (条件转移)
    ◦ 格式: BRVS k (-64 ≤ k ≤ +63)
    ◦ 说明: 如果状态寄存器 SREG 中的溢出标志 V 为 1,则相对转移到 PC + k + 1。
    ◦ 影响标志: 无
  23. BSET s (置位状态寄存器位)
    ◦ 分类: 位操作指令
    ◦ 格式: BSET s (0 ≤ s ≤ 7)
    ◦ 说明: 置位状态寄存器 SREG 中的指定位 s。例如 BSET 0 置位 C 标志 (等同于 SEC)。
    ◦ 影响标志: SREG(s)
  24. BST Rd, b (存储寄存器位到 T 标志位)
    ◦ 分类: 位操作指令
    ◦ 格式: BST Rd, b (0 ≤ d ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 将寄存器 Rd 的指定位 b 的值复制到状态寄存器 SREG 中的 T 标志位。
    ◦ 影响标志: T

C

  1. CALL k (长调用子程序)
    ◦ 分类: 程序流控制指令 (子程序调用)
    ◦ 格式: CALL k (k 为 22 位地址,可达 4M 字地址空间)
    ◦ 说明: 调用位于绝对地址 k 处的子程序。返回地址 (PC+2 for 4-byte CALL, PC+1 for 2-byte CALL) 压入堆栈。具体指令长度和寻址范围取决于具体 AVR 型号。
    ◦ 影响标志: 无 (但 SP 会改变)
  2. CBI P, b (清除 I/O 寄存器位)
    ◦ 分类: 位操作指令
    ◦ 格式: CBI P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 清除 I/O 空间地址为 P 的寄存器中的指定位 b。
    ◦ 影响标志: 无
  3. CBR Rd, K (清除寄存器中的位)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: CBR Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 清除寄存器 Rd 中由立即数 K 的置位所对应的位。等效于 ANDI Rd, ~$K (K的补码)。
    ◦ 影响标志: S, V=0, N, Z
  4. CLC (清除进位标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLC
    ◦ 说明: 清除状态寄存器 SREG 中的进位标志 C。等同于 BCLR 0。
    ◦ 影响标志: C=0
  5. CLH (清除半进位标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLH
    ◦ 说明: 清除状态寄存器 SREG 中的半进位标志 H。等同于 BCLR 5。
    ◦ 影响标志: H=0
  6. CLI (清除全局中断允许标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLI
    ◦ 说明: 清除状态寄存器 SREG 中的全局中断允许标志 I,禁止所有可屏蔽中断。等同于 BCLR 7。
    ◦ 影响标志: I=0
  7. CLN (清除负标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLN
    ◦ 说明: 清除状态寄存器 SREG 中的负标志 N。等同于 BCLR 2。
    ◦ 影响标志: N=0
  8. CLR Rd (清除寄存器)
    ◦ 分类: 逻辑运算指令 (或 数据传送指令)
    ◦ 格式: CLR Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容清零。等效于 EOR Rd, Rd。
    ◦ 影响标志: S=0, V=0, N=0, Z=1
  9. CLS (清除有符号测试标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLS
    ◦ 说明: 清除状态寄存器 SREG 中的有符号测试标志 S。等同于 BCLR 4。
    ◦ 影响标志: S=0
  10. CLT (清除 T 标志位)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLT
    ◦ 说明: 清除状态寄存器 SREG 中的 T 标志位。等同于 BCLR 6。
    ◦ 影响标志: T=0
  11. CLV (清除溢出标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLV
    ◦ 说明: 清除状态寄存器 SREG 中的溢出标志 V。等同于 BCLR 3。
    ◦ 影响标志: V=0
  12. CLZ (清除零标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: CLZ
    ◦ 说明: 清除状态寄存器 SREG 中的零标志 Z。等同于 BCLR 1。
    ◦ 影响标志: Z=0
  13. COM Rd (取反)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: COM Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容按位取反 (1 变 0,0 变 1)。
    ◦ 影响标志: S, V=0, N, Z, C=1
  14. CP Rd, Rr (比较)
    ◦ 分类: 比较指令
    ◦ 格式: CP Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 比较寄存器 Rd 和 Rr 的内容 (执行 Rd - Rr),并根据结果设置状态标志,但不改变 Rd 或 Rr 的内容。
    ◦ 影响标志: H, S, V, N, Z, C
  15. CPC Rd, Rr (带进位比较)
    ◦ 分类: 比较指令
    ◦ 格式: CPC Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 比较寄存器 Rd 和 Rr 的内容,并减去进位标志 C (执行 Rd - Rr - C)。结果影响状态标志,但不改变 Rd 或 Rr 的内容。用于多字节比较。
    ◦ 影响标志: H, S, V, N, Z, C
  16. CPI Rd, K (立即数比较)
    ◦ 分类: 比较指令
    ◦ 格式: CPI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 比较寄存器 Rd (R16-R31) 的内容和 8 位立即数 K (执行 Rd - K)。结果影响状态标志,但不改变 Rd 的内容。
    ◦ 影响标志: H, S, V, N, Z, C
  17. CPSE Rd, Rr (比较相等则跳过下一条指令)
    ◦ 分类: 程序流控制指令 (跳过指令)
    ◦ 格式: CPSE Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 比较寄存器 Rd 和 Rr。如果它们相等 (Rd = Rr),则跳过下一条指令。
    ◦ 影响标志: 无

D

  1. DEC Rd (减 1)
    ◦ 分类: 算术运算指令
    ◦ 格式: DEC Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容减 1。
    ◦ 影响标志: S, V, N, Z

E

  1. EOR Rd, Rr (逻辑异或)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: EOR Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑异或操作,结果存回 Rd。
    ◦ 影响标志: S, V=0, N, Z

I

  1. ICALL (间接调用子程序)
    ◦ 分类: 程序流控制指令 (子程序调用)
    ◦ 格式: ICALL
    ◦ 说明: 通过 Z 寄存器 (R31:R30) 间接调用子程序。Z 寄存器指向程序存储器中的目标地址。返回地址 (PC+1) 压入堆栈。
    ◦ 影响标志: 无 (但 SP 会改变)
  2. IJMP (间接跳转)
    ◦ 分类: 程序流控制指令 (无条件转移)
    ◦ 格式: IJMP
    ◦ 说明: 通过 Z 寄存器 (R31:R30) 间接跳转到程序存储器中的目标地址。
    ◦ 影响标志: 无
  3. IN Rd, P (从 I/O 端口读)
    ◦ 分类: 数据传送指令
    ◦ 格式: IN Rd, P (0 ≤ d ≤ 31, 0 ≤ P ≤ 63)
    ◦ 说明: 从 I/O 空间地址为 P (0-63) 的端口或寄存器读取数据到通用寄存器 Rd。
    ◦ 影响标志: 无
  4. INC Rd (加 1)
    ◦ 分类: 算术运算指令
    ◦ 格式: INC Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容加 1。
    ◦ 影响标志: S, V, N, Z

J

  1. JMP k (长跳转)
    ◦ 分类: 程序流控制指令 (无条件转移)
    ◦ 格式: JMP k (k 为 22 位地址,可达 4M 字地址空间)
    ◦ 说明: 无条件跳转到程序存储器中的绝对地址 k。具体寻址范围取决于具体 AVR 型号。
    ◦ 影响标志: 无

L

  1. LD Rd, X (从 X 指针间接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, X
    ◦ 说明: 将数据存储器中由 X 寄存器 (R27:R26) 指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  2. LD Rd, X+ (从 X 指针间接加载并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, X+
    ◦ 说明: 将数据存储器中由 X 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 X 寄存器加 1。
    ◦ 影响标志: 无
  3. LD Rd, -X (从 X 指针间接加载并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, -X
    ◦ 说明: X 寄存器先减 1,然后将数据存储器中由 X 寄存器指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  4. LD Rd, Y (从 Y 指针间接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, Y
    ◦ 说明: 将数据存储器中由 Y 寄存器 (R29:R28) 指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  5. LD Rd, Y+ (从 Y 指针间接加载并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, Y+
    ◦ 说明: 将数据存储器中由 Y 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 Y 寄存器加 1。
    ◦ 影响标志: 无
  6. LD Rd, -Y (从 Y 指针间接加载并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, -Y
    ◦ 说明: Y 寄存器先减 1,然后将数据存储器中由 Y 寄存器指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  7. LDD Rd, Y+q (从 Y 指针带位移间接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LDD Rd, Y+q (0 ≤ q ≤ 63)
    ◦ 说明: 将数据存储器中由 (Y + q) 指向的地址处的一个字节加载到寄存器 Rd。Y 寄存器内容不变。
    ◦ 影响标志: 无
  8. LD Rd, Z (从 Z 指针间接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, Z
    ◦ 说明: 将数据存储器中由 Z 寄存器 (R31:R30) 指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  9. LD Rd, Z+ (从 Z 指针间接加载并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, Z+
    ◦ 说明: 将数据存储器中由 Z 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 Z 寄存器加 1。
    ◦ 影响标志: 无
  10. LD Rd, -Z (从 Z 指针间接加载并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: LD Rd, -Z
    ◦ 说明: Z 寄存器先减 1,然后将数据存储器中由 Z 寄存器指向的地址处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  11. LDD Rd, Z+q (从 Z 指针带位移间接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LDD Rd, Z+q (0 ≤ q ≤ 63)
    ◦ 说明: 将数据存储器中由 (Z + q) 指向的地址处的一个字节加载到寄存器 Rd。Z 寄存器内容不变。
    ◦ 影响标志: 无
  12. LDI Rd, K (加载立即数)
    ◦ 分类: 数据传送指令
    ◦ 格式: LDI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 将 8 位立即数 K 加载到寄存器 Rd (R16-R31)。
    ◦ 影响标志: 无
  13. LDS Rd, k (从 SRAM 直接加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LDS Rd, k (k 为 16 位地址)
    ◦ 说明: 将数据空间地址 k 处的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  14. LPM (从程序存储器加载)
    ◦ 分类: 数据传送指令
    ◦ 格式: LPM (隐式使用 R0 和 Z)
    ◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到 R0。
    ◦ 影响标志: 无
  15. LPM Rd, Z (从程序存储器加载到指定寄存器)
    ◦ 分类: 数据传送指令
    ◦ 格式: LPM Rd, Z
    ◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到寄存器 Rd。
    ◦ 影响标志: 无
  16. LPM Rd, Z+ (从程序存储器加载到指定寄存器并后增量 Z)
    ◦ 分类: 数据传送指令
    ◦ 格式: LPM Rd, Z+
    ◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到寄存器 Rd,然后 Z 寄存器加 1。
    ◦ 影响标志: 无
  17. LSL Rd (逻辑左移)
    ◦ 分类: 移位指令
    ◦ 格式: LSL Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容逻辑左移一位。位 0 补零,位 7 移入进位标志 C。等同于 ADD Rd, Rd。
    ◦ 影响标志: H, S, V, N, Z, C
  18. LSR Rd (逻辑右移)
    ◦ 分类: 移位指令
    ◦ 格式: LSR Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容逻辑右移一位。位 7 补零,位 0 移入进位标志 C。
    ◦ 影响标志: S=0, V, N, Z, C

M

  1. MOV Rd, Rr (移动/复制寄存器)
    ◦ 分类: 数据传送指令
    ◦ 格式: MOV Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 将寄存器 Rr 的内容复制到寄存器 Rd。
    ◦ 影响标志: 无
  2. MOVW Rd, Rr (移动/复制寄存器对)
    ◦ 分类: 数据传送指令
    ◦ 格式: MOVW Rd+1:Rd, Rr+1:Rr (Rd, Rr 必须为偶数)
    ◦ 说明: 将寄存器对 Rr+1:Rr 的内容复制到寄存器对 Rd+1:Rd。
    ◦ 影响标志: 无

N

  1. NEG Rd (取补码)
    ◦ 分类: 算术运算指令
    ◦ 格式: NEG Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容取其二进制补码 (即 0 - Rd)。
    ◦ 影响标志: H, S, V, N, Z, C
  2. NOP (无操作)
    ◦ 分类: 其他指令
    ◦ 格式: NOP
    ◦ 说明: 不执行任何操作,仅占用一个时钟周期。用于延时或占位。
    ◦ 影响标志: 无

O

  1. OR Rd, Rr (逻辑或)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: OR Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑或操作,结果存回 Rd。
    ◦ 影响标志: S, V=0, N, Z
  2. ORI Rd, K (立即数逻辑或)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: ORI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 将寄存器 Rd 的内容与 8 位立即数 K 进行逻辑或操作,结果存回 Rd。
    ◦ 影响标志: S, V=0, N, Z
  3. OUT P, Rr (写到 I/O 端口)
    ◦ 分类: 数据传送指令
    ◦ 格式: OUT P, Rr (0 ≤ P ≤ 63, 0 ≤ r ≤ 31)
    ◦ 说明: 将通用寄存器 Rr 的内容写入 I/O 空间地址为 P (0-63) 的端口或寄存器。
    ◦ 影响标志: 无

P

  1. POP Rd (出栈)
    ◦ 分类: 数据传送指令 (堆栈操作)
    ◦ 格式: POP Rd (0 ≤ d ≤ 31)
    ◦ 说明: 从堆栈顶部弹出一个字节到寄存器 Rd,堆栈指针 SP 加 1。
    ◦ 影响标志: 无 (但 SP 会改变)
  2. PUSH Rr (入栈)
    ◦ 分类: 数据传送指令 (堆栈操作)
    ◦ 格式: PUSH Rr (0 ≤ r ≤ 31)
    ◦ 说明: 将寄存器 Rr 的内容压入堆栈顶部,堆栈指针 SP 减 1。
    ◦ 影响标志: 无 (但 SP 会改变)

R

  1. RCALL k (相对调用子程序)
    ◦ 分类: 程序流控制指令 (子程序调用)
    ◦ 格式: RCALL k (-2K ≤ k ≤ +2K-1 字,即 -4K 到 +4K-2 字节)
    ◦ 说明: 相对调用子程序。目标地址为 PC + k + 1。返回地址 (PC+1) 压入堆栈。
    ◦ 影响标志: 无 (但 SP 会改变)
  2. RET (从子程序返回)
    ◦ 分类: 程序流控制指令 (子程序返回)
    ◦ 格式: RET
    ◦ 说明: 从子程序返回。返回地址从堆栈顶部弹出到 PC。
    ◦ 影响标志: 无 (但 SP 会改变)
  3. RETI (从中断服务程序返回)
    ◦ 分类: 程序流控制指令 (子程序返回)
    ◦ 格式: RETI
    ◦ 说明: 从中断服务程序返回。返回地址从堆栈顶部弹出到 PC,并置位全局中断允许标志 I。
    ◦ 影响标志: I (但 SP 会改变)
  4. RJMP k (相对跳转)
    ◦ 分类: 程序流控制指令 (无条件转移)
    ◦ 格式: RJMP k (-2K ≤ k ≤ +2K-1 字,即 -4K 到 +4K-2 字节)
    ◦ 说明: 相对跳转到目标地址 PC + k + 1。
    ◦ 影响标志: 无
  5. ROL Rd (带进位循环左移)
    ◦ 分类: 移位指令
    ◦ 格式: ROL Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容和进位标志 C 一起循环左移一位。Rd 的位 7 移入新的 C,原来的 C 移入 Rd 的位 0。
    ◦ 影响标志: H, S, V, N, Z, C
  6. ROR Rd (带进位循环右移)
    ◦ 分类: 移位指令
    ◦ 格式: ROR Rd (0 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd 的内容和进位标志 C 一起循环右移一位。Rd 的位 0 移入新的 C,原来的 C 移入 Rd 的位 7。
    ◦ 影响标志: S, V, N, Z, C

S

  1. SBC Rd, Rr (带借位减法)
    ◦ 分类: 算术运算指令
    ◦ 格式: SBC Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 从寄存器 Rd 中减去寄存器 Rr 和进位标志 C (Rd = Rd - Rr - C)。
    ◦ 影响标志: H, S, V, N, Z, C
  2. SBCI Rd, K (立即数带借位减法)
    ◦ 分类: 算术运算指令
    ◦ 格式: SBCI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 从寄存器 Rd (R16-R31) 中减去立即数 K 和进位标志 C (Rd = Rd - K - C)。
    ◦ 影响标志: H, S, V, N, Z, C
  3. SBI P, b (置位 I/O 寄存器位)
    ◦ 分类: 位操作指令
    ◦ 格式: SBI P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 置位 I/O 空间地址为 P 的寄存器中的指定位 b。
    ◦ 影响标志: 无
  4. SBIC P, b (如果 I/O 寄存器位清零则跳过)
    ◦ 分类: 程序流控制指令 (跳过指令)
    ◦ 格式: SBIC P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 测试 I/O 空间地址为 P 的寄存器中的指定位 b。如果该位为 0,则跳过下一条指令。
    ◦ 影响标志: 无
  5. SBIS P, b (如果 I/O 寄存器位置位则跳过)
    ◦ 分类: 程序流控制指令 (跳过指令)
    ◦ 格式: SBIS P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 测试 I/O 空间地址为 P 的寄存器中的指定位 b。如果该位为 1,则跳过下一条指令。
    ◦ 影响标志: 无
  6. SBIW Rdl, K (立即数字减法 - 字)
    ◦ 分类: 算术运算指令
    ◦ 格式: SBIW Rdl, K (Rdl 为 R24, R26, R28, R30; K 为 0-63)
    ◦ 说明: 从 16 位寄存器对 (Rdh:Rdl) 中减去 6 位立即数 K (0-63),结果存回该寄存器对。Rdl 必须是 R24, R26, R28 或 R30。
    ◦ 影响标志: S, V, N, Z, C
  7. SBR Rd, K (置位寄存器中的位)
    ◦ 分类: 逻辑运算指令
    ◦ 格式: SBR Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 置位寄存器 Rd 中由立即数 K 的置位所对应的位。等效于 ORI Rd, K。
    ◦ 影响标志: S, V=0, N, Z
  8. SBRC Rr, b (如果寄存器位清零则跳过)
    ◦ 分类: 程序流控制指令 (跳过指令)
    ◦ 格式: SBRC Rr, b (0 ≤ r ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 测试寄存器 Rr 中的指定位 b。如果该位为 0,则跳过下一条指令。
    ◦ 影响标志: 无
  9. SBRS Rr, b (如果寄存器位置位则跳过)
    ◦ 分类: 程序流控制指令 (跳过指令)
    ◦ 格式: SBRS Rr, b (0 ≤ r ≤ 31, 0 ≤ b ≤ 7)
    ◦ 说明: 测试寄存器 Rr 中的指定位 b。如果该位为 1,则跳过下一条指令。
    ◦ 影响标志: 无
  10. SEC (置位进位标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEC
    ◦ 说明: 置位状态寄存器 SREG 中的进位标志 C。等同于 BSET 0。
    ◦ 影响标志: C=1
  11. SEH (置位半进位标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEH
    ◦ 说明: 置位状态寄存器 SREG 中的半进位标志 H。等同于 BSET 5。
    ◦ 影响标志: H=1
  12. SEI (置位全局中断允许标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEI
    ◦ 说明: 置位状态寄存器 SREG 中的全局中断允许标志 I,允许所有可屏蔽中断。等同于 BSET 7。
    ◦ 影响标志: I=1
  13. SEN (置位负标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEN
    ◦ 说明: 置位状态寄存器 SREG 中的负标志 N。等同于 BSET 2。
    ◦ 影响标志: N=1
  14. SER Rd (置位寄存器所有位)
    ◦ 分类: 数据传送指令 (或 逻辑运算指令)
    ◦ 格式: SER Rd (16 ≤ d ≤ 31)
    ◦ 说明: 将寄存器 Rd (R16-R31) 的所有位都置为 1 (即写入 $FF)。
    ◦ 影响标志: 无 (但 Rd 内容改变)
  15. SES (置位有符号测试标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SES
    ◦ 说明: 置位状态寄存器 SREG 中的有符号测试标志 S。等同于 BSET 4。
    ◦ 影响标志: S=1
  16. SET (置位 T 标志位)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SET
    ◦ 说明: 置位状态寄存器 SREG 中的 T 标志位。等同于 BSET 6。
    ◦ 影响标志: T=1
  17. SEV (置位溢出标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEV
    ◦ 说明: 置位状态寄存器 SREG 中的溢出标志 V。等同于 BSET 3。
    ◦ 影响标志: V=1
  18. SEZ (置位零标志)
    ◦ 分类: 位操作指令 (SREG 操作)
    ◦ 格式: SEZ
    ◦ 说明: 置位状态寄存器 SREG 中的零标志 Z。等同于 BSET 1。
    ◦ 影响标志: Z=1
  19. SLEEP (进入休眠模式)
    ◦ 分类: 其他指令
    ◦ 格式: SLEEP
    ◦ 说明: 使 MCU 进入由 MCU 控制寄存器中设置的休眠模式。
    ◦ 影响标志: 无
  20. ST X, Rr (通过 X 指针间接存储)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST X, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址。
    ◦ 影响标志: 无
  21. ST X+, Rr (通过 X 指针间接存储并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST X+, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址,然后 X 寄存器加 1。
    ◦ 影响标志: 无
  22. ST -X, Rr (通过 X 指针间接存储并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST -X, Rr
    ◦ 说明: X 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址。
    ◦ 影响标志: 无
  23. ST Y, Rr (通过 Y 指针间接存储)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST Y, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址。
    ◦ 影响标志: 无
  24. ST Y+, Rr (通过 Y 指针间接存储并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST Y+, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址,然后 Y 寄存器加 1。
    ◦ 影响标志: 无
  25. ST -Y, Rr (通过 Y 指针间接存储并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST -Y, Rr
    ◦ 说明: Y 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址。
    ◦ 影响标志: 无
  26. STD Y+q, Rr (通过 Y 指针带位移间接存储)
    ◦ 分类: 数据传送指令
    ◦ 格式: STD Y+q, Rr (0 ≤ q ≤ 63)
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 (Y + q) 指向的地址。Y 寄存器内容不变。
    ◦ 影响标志: 无
  27. ST Z, Rr (通过 Z 指针间接存储)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST Z, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址。
    ◦ 影响标志: 无
  28. ST Z+, Rr (通过 Z 指针间接存储并后增量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST Z+, Rr
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址,然后 Z 寄存器加 1。
    ◦ 影响标志: 无
  29. ST -Z, Rr (通过 Z 指针间接存储并先减量)
    ◦ 分类: 数据传送指令
    ◦ 格式: ST -Z, Rr
    ◦ 说明: Z 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址。
    ◦ 影响标志: 无
  30. STD Z+q, Rr (通过 Z 指针带位移间接存储)
    ◦ 分类: 数据传送指令
    ◦ 格式: STD Z+q, Rr (0 ≤ q ≤ 63)
    ◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 (Z + q) 指向的地址。Z 寄存器内容不变。
    ◦ 影响标志: 无
  31. STS k, Rr (直接存储到 SRAM)
    ◦ 分类: 数据传送指令
    ◦ 格式: STS k, Rr (k 为 16 位地址)
    ◦ 说明: 将寄存器 Rr 的内容存储到数据空间地址 k 处。
    ◦ 影响标志: 无
  32. SUB Rd, Rr (减法)
    ◦ 分类: 算术运算指令
    ◦ 格式: SUB Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
    ◦ 说明: 从寄存器 Rd 中减去寄存器 Rr (Rd = Rd - Rr)。
    ◦ 影响标志: H, S, V, N, Z, C
  33. SUBI Rd, K (立即数减法)
    ◦ 分类: 算术运算指令
    ◦ 格式: SUBI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
    ◦ 说明: 从寄存器 Rd (R16-R31) 中减去 8 位立即数 K (Rd = Rd - K)。
    ◦ 影响标志: H, S, V, N, Z, C
  34. SWAP Rd (交换半字节)
    ◦ 分类: 移位指令 (或 位操作指令)
    ◦ 格式: SWAP Rd (0 ≤ d ≤ 31)
    ◦ 说明: 交换寄存器 Rd 中的高 4 位和低 4 位。
    ◦ 影响标志: 无

T

  1. TST Rd (测试零或负)
    ◦ 分类: 逻辑运算指令 (或 比较指令)
    ◦ 格式: TST Rd (0 ≤ d ≤ 31)
    ◦ 说明: 测试寄存器 Rd 是否为零或负。通过执行 Rd AND Rd 来设置 Z 和 N 标志,不改变 Rd 内容。
    ◦ 影响标志: S, V=0, N, Z

W

  1. WDR (看门狗复位)
    ◦ 分类: 其他指令
    ◦ 格式: WDR
    ◦ 说明: 复位看门狗定时器 (Watchdog Timer)。
    ◦ 影响标志: 无

AVR单片基础及指令手册
https://blog.ijune.cn/posts/1330137603/
作者
LYOfficial
发布于
2025年5月27日
许可协议