外设配置
本分类的指令用于开关各个外设模块,并配置板载 PWM、外置 PCA9685 PWM 模块、实时时钟与 Playtune 音频引擎。
0xC0 模块配置(MKPZ)
一次开关多个模块。OP-1 是一个 16 位开关位图,整体替换外设开关位图(位定义与寄存器 R34 相同)。位图的每一位都生效:某位为 0,对应模块即被关闭。
| bit | 模块 |
|---|---|
| 0 | ADS1115 AD 转换器(0xC1) |
| 1 | BME280 环境传感器(0xC3) |
| 2 | DS1307 实时时钟(0xCA) |
| 3 | TCS34725 颜色传感器(0xC4) |
| 4 | PCA9685 PWM 发生器(0xC5) |
| 6 | WS2812B 全彩灯(0xCB) |
| 8 | OLED 显示屏 |
| 11 | 旋律发生器(0xE8) |
000 C0 0000 0105 开 ADS1115 + DS1307 + OLED,其余全关
001 C0 0000 0000 位图全 0:所有模块关闭
0105 对应二进制 0000 0001 0000 0101:bit 0、bit 2、bit 8 置 1,恰好是上面注释中提到的三个模块。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000 | 忽略 |
| OP-1 | 0000~FFFF | 开关位图,每位对应一个模块(见上表) |
单模块开关:通用格式
六条单模块开关指令 0xC1、0xC3、0xC4、0xC5、0xCA、0xCB 共用同一个五字节布局 XX 00 ss 00 00,其中 ss = 01 使能,其他值关闭该模块。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-00 | 00 | 忽略 |
| OP-01 | 01 | 使能模块 |
| 其他 | 关闭模块(建议用 00) | |
| OP-1 | 0000 | 忽略 |
- 指令形式
- 助记符形式
000 C1 0001 0000 开启 ADS1115 模块
001 C1 0000 0000 关闭 ADS1115 模块
000 C1 0001 0000 开启 ADS1115 模块
001 C1 0000 0000 关闭 ADS1115 模块
自 2026-09 固件起,上电自检会自动使能它检测到的每一个模块,因此示例程序一般不再需要显式的使能指令。这些开关仍有用武之地:故意关闭某个模块,或在关闭之后重新打开。
0xC1 ADS1115 开关
使能或关闭 ADS1115 模数转换器模块。
使能后,转换结果保存在 R40~R4F——见传感器。
0xC3 BME280 开关
使能或关闭 BME280 环境传感器(温度、湿度、气压)。
传感器读数保存在 R2E~R30。
0xC4 TCS34725 开关
使能或关闭 TCS34725 颜色识别传感器。
0xC5 PCA9685 开关
使能或关闭 PCA9685 外置 PWM 发生器模块。
下文的外置 PWM 指令 0xE1~0xEF 需要先使能本模块。
0xCA DS1307 开关
使能或关闭 DS1307 实时时钟模块。使能后时间数据会持续更新;可以用 0xE3 写入新时间。
0xCB WS2812B 开关(MKCD)
使能或关闭 WS2812B 全彩灯模块。彩灯指令见彩灯与音乐。
0xCC 板载 PWM 占空比(PWM)
设置板载 PWM 通道的占空比:CH1=PB4、CH2=PB3、CH3=PB0、CH4=PB1。
000 CC 0001 01F4 单通道:CH1 占空比 = 500
001 CC FF05 01F4 位掩码:CH1 和 CH3 占空比同时 = 500
第二行中,05 按位选择通道(b0101 = CH1 和 CH3)。
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-00 | FF | 位选模式:OP-01 按位选择通道 |
| 其他 | 单通道模式(建议用 00) | |
| OP-01 | 00~03 | 通道号(单通道模式) |
00~0F | 通道位掩码,bit0=CH1 … bit3=CH4(位选模式) | |
| OP-1 | 0000~03E7 | 占空比;仅当数值小于 1000 时才写入 |
0xD0 Playtune 开关
激活或复原 Playtune 音频引擎。值为 01 时音频系统切换到 MIDI 播放器 0xFE 所需的三声道 MIDI 模式;值为 00 时恢复板载 PWM。
000 D0 0000 0001 激活 Playtune(MIDI 三声道模式)
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-00 | 00 | 忽略 |
| OP-01 | 01 | 激活 Playtune(MIDI 三声道模式) |
00 | 恢复板载 PWM | |
| OP-1 | 0000 | 忽略 |
16 位整体操作数
从 0xE1 开始,本章的大多数操作数都按 16 位整体解释:OP-0 与 OP-1 各自作为一个 16 位数值(一个 4 位十六进制数),而不是两个独立的 8 位半字节。例如 E1 0003 01FF 中,0003 是通道掩码、01FF 是占空比——两者都不拆分字节。另见简述中的操作数记法。
0xE1 外置 PWM:掩码选通道 + 立即占空比
一条指令设置 PCA9685 模块 0 全部 16 个通道的占空比。掩码位为 1 的每个通道都收到占空比值。
000 E1 0003 01FF 模块0 通道0和1,占空比 = 01FF(约12.5%)
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~FFFF | 16 通道位掩码(bit0 = 通道 0 … bit15 = 通道 15) |
| OP-1 | 0000~0FFF | 占空比,12 位分辨率 |
0xE2 外置 PWM:掩码选通道 + 寄存器占空比
通道选择方式与 0xE1 相同,但占空比取自寄存器。
- 指令形式
- 助记符形式
000 10 0020 01FF R20 = 01FF(占空比)
001 E2 0003 0020 模块0 通道0和1,占空比取自 R20
000 FZ 0020 01FF R20 = 01FF(占空比)
001 E2 0003 0020 模块0 通道0和1,占空比取自 R20
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~FFFF | 16 通道位掩码 |
| OP-1 | 00~FF | 寄存器号;占空比 = R[reg] |
0xE3 写 RTC 时间
向 DS1307 实时时钟写入新时间。以 OP-01 为起始的 7 个连续寄存器依次存放年、月、日、星期、时、分、秒。写入在后台异步进行。
- 指令形式
- 助记符形式
000 10 0030 001A R30 = 26(年)
001 10 0031 0009 R31 = 9(月)
002 10 0032 0019 R32 = 25(日)
003 10 0033 0005 R33 = 5(星期)
004 10 0034 000A R34 = 10(时)
005 10 0035 001E R35 = 30(分)
006 10 0036 0000 R36 = 0(秒)
007 E3 0030 0000 把 R30~R36 写入 DS1307
000 FZ 0030 001A R30 = 26(年)
001 FZ 0031 0009 R31 = 9(月)
002 FZ 0032 0019 R32 = 25(日)
003 FZ 0033 0005 R33 = 5(星期)
004 FZ 0034 000A R34 = 10(时)
005 FZ 0035 001E R35 = 30(分)
006 FZ 0036 0000 R36 = 0(秒)
007 E3 0030 0000 把 R30~R36 写入 DS1307
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-00 | 00 | 忽略 |
| OP-01 | 00~FF | 起始寄存器号;R[n]~R[n+6] = 年、月、日、星期、时、分、秒 |
| OP-1 | 0000 | 忽略 |
三模块掩码机制
外置 PWM 端口最多支持 3 个 PCA9685 模块——模块 0、1、2,各 16 通道(Port4~6,见简述)。对 0xEB~0xEE 而言,OP-0 是三个连续掩码寄存器中第一个的编号 n:
| 寄存器 | 内容 |
|---|---|
R[n] | 模块 0 的 16 通道位掩码 |
R[n+1] | 模块 1 的 16 通道位掩码 |
R[n+2] | 模块 2 的 16 通道位掩码 |
0xEB 与 0xEC 一条指令刷新全部三个模块中被掩码选中的通道(最多 48 个);0xED 与 0xEE 分别只刷新模块 1、模块 2,使用对应的掩码寄存器 R[n+1] / R[n+2]。
0xEB 外置 PWM:三模块 + 立即占空比
对三个模块中由掩码寄存器选中的通道施加立即占空比。
- 指令形式
- 助记符形式
000 10 0040 0003 R40 = 模块0 掩码(通道0和1)
001 10 0041 0001 R41 = 模块1 掩码(通道0)
002 10 0042 0000 R42 = 模块2 掩码(无通道)
003 EB 0040 01FF 掩码命中的所有通道占空比 = 01FF
000 FZ 0040 0003 R40 = 模块0 掩码(通道0和1)
001 FZ 0041 0001 R41 = 模块1 掩码(通道0)
002 FZ 0042 0000 R42 = 模块2 掩码(无通道)
003 EB 0040 01FF 掩码命中的所有通道占空比 = 01FF
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~00FF | 掩码寄存器号 n(R[n]~R[n+2] = 模块 0/1/2 掩码) |
| OP-1 | 0000~0FFF | 占空比,12 位分辨率 |
0xEC 外置 PWM 寄存器版(WPWM)
0xEB 的寄存器版:占空比取自寄存器。一条指令可刷新三个模块共 48 个通道。
- 指令形式
- 助记符形式
000 10 0040 0003 R40 = 模块0 掩码
001 10 0041 0001 R41 = 模块1 掩码
002 10 0042 0000 R42 = 模块2 掩码
003 10 0050 01FF R50 = 01FF(占空比)
004 EC 0040 0050 刷新所有掩码通道,占空比取自 R50
005 EC 0010 000F 掩码取 R10/R11/R12(模块0/1/2),占空比取 R15;掩码为1的通道一起输出
000 FZ 0040 0003 R40 = 模块0 掩码
001 FZ 0041 0001 R41 = 模块1 掩码
002 FZ 0042 0000 R42 = 模块2 掩码
003 FZ 0050 01FF R50 = 01FF(占空比)
004 WPWM 0040 0050 刷新所有掩码通道,占空比取自 R50
005 WPWM 0010 000F 掩码取 R10/R11/R12(模块0/1/2),占空比取 R15;掩码为1的通道一起输出
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~00FF | 掩码寄存器号 n(R[n]~R[n+2] = 模块 0/1/2 掩码) |
| OP-1 | 00~FF | 占空比寄存器号;占空比 = R[reg] |
0xED 外置 PWM:仅模块 1(寄存器版)
与 0xEC 相同,但只刷新模块 1(掩码寄存器 R[n+1])。
000 10 0041 00F0 R41 = 模块1 掩码 (channels 4~7)
001 10 0050 0800 R50 = 0800(占空比)
002 ED 0040 0050 只刷新模块1,占空比取自 R50
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~00FF | 掩码寄存器号 n;掩码取自 R[n+1] |
| OP-1 | 00~FF | 占空比寄存器号;占空比 = R[reg] |
0xEE 外置 PWM:仅模块 2(寄存器版)
与 0xEC 相同,但只刷新模块 2(掩码寄存器 R[n+2])。
000 10 0042 0001 R42 = 模块2 掩码 (channel 0)
001 10 0050 0400 R50 = 0400(占空比)
002 EE 0040 0050 只刷新模块2,占空比取自 R50
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~00FF | 掩码寄存器号 n;掩码取自 R[n+2] |
| OP-1 | 00~FF | 占空比寄存器号;占空比 = R[reg] |
0xEF 设置 PWM 频率(WPL)
设置某个 PCA9685 模块(0、1 或 2)的 PWM 频率,单位 Hz。
000 EF 0000 03E8 模块0 的 PWM 频率 = 1000 Hz
| 操作数 | 数值/范围 | 备注 |
|---|---|---|
| OP-0 | 0000~0002 | 模块号 |
| OP-1 | 0000~FFFF | 频率,单位 Hz(PCA9685 大约支持 24~1526 Hz) |
设置频率会暂停通道刷新:0xEF 执行后,各通道保持最后一次的输出,直到下一条 WPWM 0xEC 执行为止。