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
- ADC Rd, Rr (带进位加法)
◦ 分类: 算术运算指令
◦ 格式: ADC Rd, Rr
◦ 说明: 将寄存器 Rd、寄存器 Rr 以及状态寄存器 SREG 中的进位标志 C 相加,结果存回 Rd。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 影响标志: H, S, V, N, Z, C - ADD Rd, Rr (加法)
◦ 分类: 算术运算指令
◦ 格式: ADD Rd, Rr
◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容相加,结果存回 Rd。不考虑进位标志 C。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 影响标志: H, S, V, N, Z, C - 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 - AND Rd, Rr (逻辑与)
◦ 分类: 逻辑运算指令
◦ 格式: AND Rd, Rr
◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑与操作,结果存回 Rd。(0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 影响标志: S, V=0, N, Z - ANDI Rd, K (立即数逻辑与)
◦ 分类: 逻辑运算指令
◦ 格式: ANDI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
◦ 说明: 将寄存器 Rd 的内容与 8 位立即数 K 进行逻辑与操作,结果存回 Rd。
◦ 影响标志: S, V=0, N, Z - ASR Rd (算术右移)
◦ 分类: 移位指令
◦ 格式: ASR Rd
◦ 说明: 将寄存器 Rd 的内容算术右移一位。位 7 (最高位) 保持不变,位 0 移入进位标志 C。(0 ≤ d ≤ 31)
◦ 影响标志: S, V, N, Z, C
B
- BCLR s (清除状态寄存器位)
◦ 分类: 位操作指令
◦ 格式: BCLR s (0 ≤ s ≤ 7)
◦ 说明: 清除状态寄存器 SREG 中的指定位 s。例如 BCLR 0 清除 C 标志 (等同于 CLC)。
◦ 影响标志: SREG(s) - BLD Rd, b (从 T 标志位加载到寄存器位)
◦ 分类: 位操作指令
◦ 格式: BLD Rd, b (0 ≤ d ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 将状态寄存器 SREG 中的 T 标志位的值复制到寄存器 Rd 的指定位 b。
◦ 影响标志: 无 (除了 Rd 的目标位) - BRBC s, k (如果状态位清零则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRBC s, k (0 ≤ s ≤ 7, -64 ≤ k ≤ +63)
◦ 说明: 测试状态寄存器 SREG 中的指定位 s。如果该位为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRBS s, k (如果状态位置位则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRBS s, k (0 ≤ s ≤ 7, -64 ≤ k ≤ +63)
◦ 说明: 测试状态寄存器 SREG 中的指定位 s。如果该位为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRCC k (如果进位清零则分支 / 无符号数大于等于则跳转 BRSH)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRCC k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的进位标志 C 为 0,则相对转移到 PC + k + 1。也用作 BRSH (Branch if Same or Higher)。当 进位标志位 C = 0(即没有发生进位)时,执行跳转;否则继续执行下一条指令。
◦ 影响标志: 无 - BRCS k (如果进位位置位则分支 / 无符号数小于则跳转 BRLO)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRCS k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的进位标志 C 为 1,则相对转移到 PC + k + 1。也用作 BRLO (Branch if Lower)。
◦ 影响标志: 无 - BREQ k (如果相等则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BREQ k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的零标志 Z 为 1 (表示上一个比较或算术操作结果为零),则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRGE k (如果带符号数大于等于则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRGE k (-64 ≤ k ≤ +63)
◦ 说明: 如果 N⊕V = 0 (负标志 N 和溢出标志 V 相同),则相对转移到 PC + k + 1。用于带符号比较。
◦ 影响标志: 无 - BRHC k (如果半进位清零则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRHC k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的半进位标志 H 为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRHS k (如果半进位位置位则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRHS k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的半进位标志 H 为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRID k (如果中断禁止则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRID k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的全局中断允许标志 I 为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRIE k (如果中断允许则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRIE k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的全局中断允许标志 I 为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRLO k (无符号数小于则跳转)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRLO k (-64 ≤ k ≤ +63)
◦ 说明: 见 BRCS k。如果 C=1,则跳转。 - BRLT k (如果带符号数小于则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRLT k (-64 ≤ k ≤ +63)
◦ 说明: 如果 N⊕V = 1 (负标志 N 和溢出标志 V 不同),则相对转移到 PC + k + 1。用于带符号比较。
◦ 影响标志: 无 - BRMI k (如果结果为负则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRMI k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的负标志 N 为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRNE k (如果不相等则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRNE k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的零标志 Z 为 0 (表示上一个比较或算术操作结果不为零),则相对转移到 PC + k + 1。当 零标志位 Z = 0(即结果不等于 0)时,执行跳转;否则继续执行下一条指令。
◦ 影响标志: 无 - BRPL k (如果结果为正则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRPL k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的负标志 N 为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRSH k (无符号数大于等于则跳转)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRSH k (-64 ≤ k ≤ +63)
◦ 说明: 见 BRCC k。如果 C=0,则跳转。 - BRTC k (如果 T 标志清零则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRTC k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的 T 标志位为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRTS k (如果 T 标志置位则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRTS k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的 T 标志位为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRVC k (如果溢出清零则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRVC k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的溢出标志 V 为 0,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BRVS k (如果溢出置位则分支)
◦ 分类: 程序流控制指令 (条件转移)
◦ 格式: BRVS k (-64 ≤ k ≤ +63)
◦ 说明: 如果状态寄存器 SREG 中的溢出标志 V 为 1,则相对转移到 PC + k + 1。
◦ 影响标志: 无 - BSET s (置位状态寄存器位)
◦ 分类: 位操作指令
◦ 格式: BSET s (0 ≤ s ≤ 7)
◦ 说明: 置位状态寄存器 SREG 中的指定位 s。例如 BSET 0 置位 C 标志 (等同于 SEC)。
◦ 影响标志: SREG(s) - BST Rd, b (存储寄存器位到 T 标志位)
◦ 分类: 位操作指令
◦ 格式: BST Rd, b (0 ≤ d ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 将寄存器 Rd 的指定位 b 的值复制到状态寄存器 SREG 中的 T 标志位。
◦ 影响标志: T
C
- CALL k (长调用子程序)
◦ 分类: 程序流控制指令 (子程序调用)
◦ 格式: CALL k (k 为 22 位地址,可达 4M 字地址空间)
◦ 说明: 调用位于绝对地址 k 处的子程序。返回地址 (PC+2 for 4-byte CALL, PC+1 for 2-byte CALL) 压入堆栈。具体指令长度和寻址范围取决于具体 AVR 型号。
◦ 影响标志: 无 (但 SP 会改变) - CBI P, b (清除 I/O 寄存器位)
◦ 分类: 位操作指令
◦ 格式: CBI P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 清除 I/O 空间地址为 P 的寄存器中的指定位 b。
◦ 影响标志: 无 - CBR Rd, K (清除寄存器中的位)
◦ 分类: 逻辑运算指令
◦ 格式: CBR Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
◦ 说明: 清除寄存器 Rd 中由立即数 K 的置位所对应的位。等效于 ANDI Rd, ~$K (K的补码)。
◦ 影响标志: S, V=0, N, Z - CLC (清除进位标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLC
◦ 说明: 清除状态寄存器 SREG 中的进位标志 C。等同于 BCLR 0。
◦ 影响标志: C=0 - CLH (清除半进位标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLH
◦ 说明: 清除状态寄存器 SREG 中的半进位标志 H。等同于 BCLR 5。
◦ 影响标志: H=0 - CLI (清除全局中断允许标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLI
◦ 说明: 清除状态寄存器 SREG 中的全局中断允许标志 I,禁止所有可屏蔽中断。等同于 BCLR 7。
◦ 影响标志: I=0 - CLN (清除负标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLN
◦ 说明: 清除状态寄存器 SREG 中的负标志 N。等同于 BCLR 2。
◦ 影响标志: N=0 - CLR Rd (清除寄存器)
◦ 分类: 逻辑运算指令 (或 数据传送指令)
◦ 格式: CLR Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容清零。等效于 EOR Rd, Rd。
◦ 影响标志: S=0, V=0, N=0, Z=1 - CLS (清除有符号测试标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLS
◦ 说明: 清除状态寄存器 SREG 中的有符号测试标志 S。等同于 BCLR 4。
◦ 影响标志: S=0 - CLT (清除 T 标志位)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLT
◦ 说明: 清除状态寄存器 SREG 中的 T 标志位。等同于 BCLR 6。
◦ 影响标志: T=0 - CLV (清除溢出标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLV
◦ 说明: 清除状态寄存器 SREG 中的溢出标志 V。等同于 BCLR 3。
◦ 影响标志: V=0 - CLZ (清除零标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: CLZ
◦ 说明: 清除状态寄存器 SREG 中的零标志 Z。等同于 BCLR 1。
◦ 影响标志: Z=0 - COM Rd (取反)
◦ 分类: 逻辑运算指令
◦ 格式: COM Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容按位取反 (1 变 0,0 变 1)。
◦ 影响标志: S, V=0, N, Z, C=1 - CP Rd, Rr (比较)
◦ 分类: 比较指令
◦ 格式: CP Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 比较寄存器 Rd 和 Rr 的内容 (执行 Rd - Rr),并根据结果设置状态标志,但不改变 Rd 或 Rr 的内容。
◦ 影响标志: H, S, V, N, Z, C - 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 - 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 - CPSE Rd, Rr (比较相等则跳过下一条指令)
◦ 分类: 程序流控制指令 (跳过指令)
◦ 格式: CPSE Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 比较寄存器 Rd 和 Rr。如果它们相等 (Rd = Rr),则跳过下一条指令。
◦ 影响标志: 无
D
- DEC Rd (减 1)
◦ 分类: 算术运算指令
◦ 格式: DEC Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容减 1。
◦ 影响标志: S, V, N, Z
E
- EOR Rd, Rr (逻辑异或)
◦ 分类: 逻辑运算指令
◦ 格式: EOR Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑异或操作,结果存回 Rd。
◦ 影响标志: S, V=0, N, Z
I
- ICALL (间接调用子程序)
◦ 分类: 程序流控制指令 (子程序调用)
◦ 格式: ICALL
◦ 说明: 通过 Z 寄存器 (R31:R30) 间接调用子程序。Z 寄存器指向程序存储器中的目标地址。返回地址 (PC+1) 压入堆栈。
◦ 影响标志: 无 (但 SP 会改变) - IJMP (间接跳转)
◦ 分类: 程序流控制指令 (无条件转移)
◦ 格式: IJMP
◦ 说明: 通过 Z 寄存器 (R31:R30) 间接跳转到程序存储器中的目标地址。
◦ 影响标志: 无 - IN Rd, P (从 I/O 端口读)
◦ 分类: 数据传送指令
◦ 格式: IN Rd, P (0 ≤ d ≤ 31, 0 ≤ P ≤ 63)
◦ 说明: 从 I/O 空间地址为 P (0-63) 的端口或寄存器读取数据到通用寄存器 Rd。
◦ 影响标志: 无 - INC Rd (加 1)
◦ 分类: 算术运算指令
◦ 格式: INC Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容加 1。
◦ 影响标志: S, V, N, Z
J
- JMP k (长跳转)
◦ 分类: 程序流控制指令 (无条件转移)
◦ 格式: JMP k (k 为 22 位地址,可达 4M 字地址空间)
◦ 说明: 无条件跳转到程序存储器中的绝对地址 k。具体寻址范围取决于具体 AVR 型号。
◦ 影响标志: 无
L
- LD Rd, X (从 X 指针间接加载)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, X
◦ 说明: 将数据存储器中由 X 寄存器 (R27:R26) 指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LD Rd, X+ (从 X 指针间接加载并后增量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, X+
◦ 说明: 将数据存储器中由 X 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 X 寄存器加 1。
◦ 影响标志: 无 - LD Rd, -X (从 X 指针间接加载并先减量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, -X
◦ 说明: X 寄存器先减 1,然后将数据存储器中由 X 寄存器指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LD Rd, Y (从 Y 指针间接加载)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, Y
◦ 说明: 将数据存储器中由 Y 寄存器 (R29:R28) 指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LD Rd, Y+ (从 Y 指针间接加载并后增量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, Y+
◦ 说明: 将数据存储器中由 Y 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 Y 寄存器加 1。
◦ 影响标志: 无 - LD Rd, -Y (从 Y 指针间接加载并先减量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, -Y
◦ 说明: Y 寄存器先减 1,然后将数据存储器中由 Y 寄存器指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LDD Rd, Y+q (从 Y 指针带位移间接加载)
◦ 分类: 数据传送指令
◦ 格式: LDD Rd, Y+q (0 ≤ q ≤ 63)
◦ 说明: 将数据存储器中由 (Y + q) 指向的地址处的一个字节加载到寄存器 Rd。Y 寄存器内容不变。
◦ 影响标志: 无 - LD Rd, Z (从 Z 指针间接加载)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, Z
◦ 说明: 将数据存储器中由 Z 寄存器 (R31:R30) 指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LD Rd, Z+ (从 Z 指针间接加载并后增量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, Z+
◦ 说明: 将数据存储器中由 Z 寄存器指向的地址处的一个字节加载到寄存器 Rd,然后 Z 寄存器加 1。
◦ 影响标志: 无 - LD Rd, -Z (从 Z 指针间接加载并先减量)
◦ 分类: 数据传送指令
◦ 格式: LD Rd, -Z
◦ 说明: Z 寄存器先减 1,然后将数据存储器中由 Z 寄存器指向的地址处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LDD Rd, Z+q (从 Z 指针带位移间接加载)
◦ 分类: 数据传送指令
◦ 格式: LDD Rd, Z+q (0 ≤ q ≤ 63)
◦ 说明: 将数据存储器中由 (Z + q) 指向的地址处的一个字节加载到寄存器 Rd。Z 寄存器内容不变。
◦ 影响标志: 无 - LDI Rd, K (加载立即数)
◦ 分类: 数据传送指令
◦ 格式: LDI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
◦ 说明: 将 8 位立即数 K 加载到寄存器 Rd (R16-R31)。
◦ 影响标志: 无 - LDS Rd, k (从 SRAM 直接加载)
◦ 分类: 数据传送指令
◦ 格式: LDS Rd, k (k 为 16 位地址)
◦ 说明: 将数据空间地址 k 处的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LPM (从程序存储器加载)
◦ 分类: 数据传送指令
◦ 格式: LPM (隐式使用 R0 和 Z)
◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到 R0。
◦ 影响标志: 无 - LPM Rd, Z (从程序存储器加载到指定寄存器)
◦ 分类: 数据传送指令
◦ 格式: LPM Rd, Z
◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到寄存器 Rd。
◦ 影响标志: 无 - LPM Rd, Z+ (从程序存储器加载到指定寄存器并后增量 Z)
◦ 分类: 数据传送指令
◦ 格式: LPM Rd, Z+
◦ 说明: 将 Z 寄存器指向的程序存储器中的一个字节加载到寄存器 Rd,然后 Z 寄存器加 1。
◦ 影响标志: 无 - LSL Rd (逻辑左移)
◦ 分类: 移位指令
◦ 格式: LSL Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容逻辑左移一位。位 0 补零,位 7 移入进位标志 C。等同于 ADD Rd, Rd。
◦ 影响标志: H, S, V, N, Z, C - LSR Rd (逻辑右移)
◦ 分类: 移位指令
◦ 格式: LSR Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容逻辑右移一位。位 7 补零,位 0 移入进位标志 C。
◦ 影响标志: S=0, V, N, Z, C
M
- MOV Rd, Rr (移动/复制寄存器)
◦ 分类: 数据传送指令
◦ 格式: MOV Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 将寄存器 Rr 的内容复制到寄存器 Rd。
◦ 影响标志: 无 - MOVW Rd, Rr (移动/复制寄存器对)
◦ 分类: 数据传送指令
◦ 格式: MOVW Rd+1:Rd, Rr+1:Rr (Rd, Rr 必须为偶数)
◦ 说明: 将寄存器对 Rr+1:Rr 的内容复制到寄存器对 Rd+1:Rd。
◦ 影响标志: 无
N
- NEG Rd (取补码)
◦ 分类: 算术运算指令
◦ 格式: NEG Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容取其二进制补码 (即 0 - Rd)。
◦ 影响标志: H, S, V, N, Z, C - NOP (无操作)
◦ 分类: 其他指令
◦ 格式: NOP
◦ 说明: 不执行任何操作,仅占用一个时钟周期。用于延时或占位。
◦ 影响标志: 无
O
- OR Rd, Rr (逻辑或)
◦ 分类: 逻辑运算指令
◦ 格式: OR Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 将寄存器 Rd 和寄存器 Rr 的内容进行逻辑或操作,结果存回 Rd。
◦ 影响标志: S, V=0, N, Z - ORI Rd, K (立即数逻辑或)
◦ 分类: 逻辑运算指令
◦ 格式: ORI Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
◦ 说明: 将寄存器 Rd 的内容与 8 位立即数 K 进行逻辑或操作,结果存回 Rd。
◦ 影响标志: S, V=0, N, Z - OUT P, Rr (写到 I/O 端口)
◦ 分类: 数据传送指令
◦ 格式: OUT P, Rr (0 ≤ P ≤ 63, 0 ≤ r ≤ 31)
◦ 说明: 将通用寄存器 Rr 的内容写入 I/O 空间地址为 P (0-63) 的端口或寄存器。
◦ 影响标志: 无
P
- POP Rd (出栈)
◦ 分类: 数据传送指令 (堆栈操作)
◦ 格式: POP Rd (0 ≤ d ≤ 31)
◦ 说明: 从堆栈顶部弹出一个字节到寄存器 Rd,堆栈指针 SP 加 1。
◦ 影响标志: 无 (但 SP 会改变) - PUSH Rr (入栈)
◦ 分类: 数据传送指令 (堆栈操作)
◦ 格式: PUSH Rr (0 ≤ r ≤ 31)
◦ 说明: 将寄存器 Rr 的内容压入堆栈顶部,堆栈指针 SP 减 1。
◦ 影响标志: 无 (但 SP 会改变)
R
- RCALL k (相对调用子程序)
◦ 分类: 程序流控制指令 (子程序调用)
◦ 格式: RCALL k (-2K ≤ k ≤ +2K-1 字,即 -4K 到 +4K-2 字节)
◦ 说明: 相对调用子程序。目标地址为 PC + k + 1。返回地址 (PC+1) 压入堆栈。
◦ 影响标志: 无 (但 SP 会改变) - RET (从子程序返回)
◦ 分类: 程序流控制指令 (子程序返回)
◦ 格式: RET
◦ 说明: 从子程序返回。返回地址从堆栈顶部弹出到 PC。
◦ 影响标志: 无 (但 SP 会改变) - RETI (从中断服务程序返回)
◦ 分类: 程序流控制指令 (子程序返回)
◦ 格式: RETI
◦ 说明: 从中断服务程序返回。返回地址从堆栈顶部弹出到 PC,并置位全局中断允许标志 I。
◦ 影响标志: I (但 SP 会改变) - RJMP k (相对跳转)
◦ 分类: 程序流控制指令 (无条件转移)
◦ 格式: RJMP k (-2K ≤ k ≤ +2K-1 字,即 -4K 到 +4K-2 字节)
◦ 说明: 相对跳转到目标地址 PC + k + 1。
◦ 影响标志: 无 - ROL Rd (带进位循环左移)
◦ 分类: 移位指令
◦ 格式: ROL Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容和进位标志 C 一起循环左移一位。Rd 的位 7 移入新的 C,原来的 C 移入 Rd 的位 0。
◦ 影响标志: H, S, V, N, Z, C - ROR Rd (带进位循环右移)
◦ 分类: 移位指令
◦ 格式: ROR Rd (0 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd 的内容和进位标志 C 一起循环右移一位。Rd 的位 0 移入新的 C,原来的 C 移入 Rd 的位 7。
◦ 影响标志: S, V, N, Z, C
S
- 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 - 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 - SBI P, b (置位 I/O 寄存器位)
◦ 分类: 位操作指令
◦ 格式: SBI P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 置位 I/O 空间地址为 P 的寄存器中的指定位 b。
◦ 影响标志: 无 - SBIC P, b (如果 I/O 寄存器位清零则跳过)
◦ 分类: 程序流控制指令 (跳过指令)
◦ 格式: SBIC P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 测试 I/O 空间地址为 P 的寄存器中的指定位 b。如果该位为 0,则跳过下一条指令。
◦ 影响标志: 无 - SBIS P, b (如果 I/O 寄存器位置位则跳过)
◦ 分类: 程序流控制指令 (跳过指令)
◦ 格式: SBIS P, b (0 ≤ P ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 测试 I/O 空间地址为 P 的寄存器中的指定位 b。如果该位为 1,则跳过下一条指令。
◦ 影响标志: 无 - 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 - SBR Rd, K (置位寄存器中的位)
◦ 分类: 逻辑运算指令
◦ 格式: SBR Rd, K (16 ≤ d ≤ 31, 0 ≤ K ≤ 255)
◦ 说明: 置位寄存器 Rd 中由立即数 K 的置位所对应的位。等效于 ORI Rd, K。
◦ 影响标志: S, V=0, N, Z - SBRC Rr, b (如果寄存器位清零则跳过)
◦ 分类: 程序流控制指令 (跳过指令)
◦ 格式: SBRC Rr, b (0 ≤ r ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 测试寄存器 Rr 中的指定位 b。如果该位为 0,则跳过下一条指令。
◦ 影响标志: 无 - SBRS Rr, b (如果寄存器位置位则跳过)
◦ 分类: 程序流控制指令 (跳过指令)
◦ 格式: SBRS Rr, b (0 ≤ r ≤ 31, 0 ≤ b ≤ 7)
◦ 说明: 测试寄存器 Rr 中的指定位 b。如果该位为 1,则跳过下一条指令。
◦ 影响标志: 无 - SEC (置位进位标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEC
◦ 说明: 置位状态寄存器 SREG 中的进位标志 C。等同于 BSET 0。
◦ 影响标志: C=1 - SEH (置位半进位标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEH
◦ 说明: 置位状态寄存器 SREG 中的半进位标志 H。等同于 BSET 5。
◦ 影响标志: H=1 - SEI (置位全局中断允许标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEI
◦ 说明: 置位状态寄存器 SREG 中的全局中断允许标志 I,允许所有可屏蔽中断。等同于 BSET 7。
◦ 影响标志: I=1 - SEN (置位负标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEN
◦ 说明: 置位状态寄存器 SREG 中的负标志 N。等同于 BSET 2。
◦ 影响标志: N=1 - SER Rd (置位寄存器所有位)
◦ 分类: 数据传送指令 (或 逻辑运算指令)
◦ 格式: SER Rd (16 ≤ d ≤ 31)
◦ 说明: 将寄存器 Rd (R16-R31) 的所有位都置为 1 (即写入 $FF)。
◦ 影响标志: 无 (但 Rd 内容改变) - SES (置位有符号测试标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SES
◦ 说明: 置位状态寄存器 SREG 中的有符号测试标志 S。等同于 BSET 4。
◦ 影响标志: S=1 - SET (置位 T 标志位)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SET
◦ 说明: 置位状态寄存器 SREG 中的 T 标志位。等同于 BSET 6。
◦ 影响标志: T=1 - SEV (置位溢出标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEV
◦ 说明: 置位状态寄存器 SREG 中的溢出标志 V。等同于 BSET 3。
◦ 影响标志: V=1 - SEZ (置位零标志)
◦ 分类: 位操作指令 (SREG 操作)
◦ 格式: SEZ
◦ 说明: 置位状态寄存器 SREG 中的零标志 Z。等同于 BSET 1。
◦ 影响标志: Z=1 - SLEEP (进入休眠模式)
◦ 分类: 其他指令
◦ 格式: SLEEP
◦ 说明: 使 MCU 进入由 MCU 控制寄存器中设置的休眠模式。
◦ 影响标志: 无 - ST X, Rr (通过 X 指针间接存储)
◦ 分类: 数据传送指令
◦ 格式: ST X, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址。
◦ 影响标志: 无 - ST X+, Rr (通过 X 指针间接存储并后增量)
◦ 分类: 数据传送指令
◦ 格式: ST X+, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址,然后 X 寄存器加 1。
◦ 影响标志: 无 - ST -X, Rr (通过 X 指针间接存储并先减量)
◦ 分类: 数据传送指令
◦ 格式: ST -X, Rr
◦ 说明: X 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 X 寄存器指向的地址。
◦ 影响标志: 无 - ST Y, Rr (通过 Y 指针间接存储)
◦ 分类: 数据传送指令
◦ 格式: ST Y, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址。
◦ 影响标志: 无 - ST Y+, Rr (通过 Y 指针间接存储并后增量)
◦ 分类: 数据传送指令
◦ 格式: ST Y+, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址,然后 Y 寄存器加 1。
◦ 影响标志: 无 - ST -Y, Rr (通过 Y 指针间接存储并先减量)
◦ 分类: 数据传送指令
◦ 格式: ST -Y, Rr
◦ 说明: Y 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 Y 寄存器指向的地址。
◦ 影响标志: 无 - STD Y+q, Rr (通过 Y 指针带位移间接存储)
◦ 分类: 数据传送指令
◦ 格式: STD Y+q, Rr (0 ≤ q ≤ 63)
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 (Y + q) 指向的地址。Y 寄存器内容不变。
◦ 影响标志: 无 - ST Z, Rr (通过 Z 指针间接存储)
◦ 分类: 数据传送指令
◦ 格式: ST Z, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址。
◦ 影响标志: 无 - ST Z+, Rr (通过 Z 指针间接存储并后增量)
◦ 分类: 数据传送指令
◦ 格式: ST Z+, Rr
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址,然后 Z 寄存器加 1。
◦ 影响标志: 无 - ST -Z, Rr (通过 Z 指针间接存储并先减量)
◦ 分类: 数据传送指令
◦ 格式: ST -Z, Rr
◦ 说明: Z 寄存器先减 1,然后将寄存器 Rr 的内容存储到数据存储器中由 Z 寄存器指向的地址。
◦ 影响标志: 无 - STD Z+q, Rr (通过 Z 指针带位移间接存储)
◦ 分类: 数据传送指令
◦ 格式: STD Z+q, Rr (0 ≤ q ≤ 63)
◦ 说明: 将寄存器 Rr 的内容存储到数据存储器中由 (Z + q) 指向的地址。Z 寄存器内容不变。
◦ 影响标志: 无 - STS k, Rr (直接存储到 SRAM)
◦ 分类: 数据传送指令
◦ 格式: STS k, Rr (k 为 16 位地址)
◦ 说明: 将寄存器 Rr 的内容存储到数据空间地址 k 处。
◦ 影响标志: 无 - SUB Rd, Rr (减法)
◦ 分类: 算术运算指令
◦ 格式: SUB Rd, Rr (0 ≤ d ≤ 31, 0 ≤ r ≤ 31)
◦ 说明: 从寄存器 Rd 中减去寄存器 Rr (Rd = Rd - Rr)。
◦ 影响标志: H, S, V, N, Z, C - 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 - SWAP Rd (交换半字节)
◦ 分类: 移位指令 (或 位操作指令)
◦ 格式: SWAP Rd (0 ≤ d ≤ 31)
◦ 说明: 交换寄存器 Rd 中的高 4 位和低 4 位。
◦ 影响标志: 无
T
- TST Rd (测试零或负)
◦ 分类: 逻辑运算指令 (或 比较指令)
◦ 格式: TST Rd (0 ≤ d ≤ 31)
◦ 说明: 测试寄存器 Rd 是否为零或负。通过执行 Rd AND Rd 来设置 Z 和 N 标志,不改变 Rd 内容。
◦ 影响标志: S, V=0, N, Z
W
- WDR (看门狗复位)
◦ 分类: 其他指令
◦ 格式: WDR
◦ 说明: 复位看门狗定时器 (Watchdog Timer)。
◦ 影响标志: 无