Product Image
实物照片
Wiring
Arduino UNO R3 接线图
4 块 FC-16 MAX7219 级联。CLK 和 CS 全部并联,DIN→模块#1→DOUT→模块#2→DOUT→模块#3→DOUT→模块#4。数据从模块#1 流入,依次经过 #2、#3,最后到 #4。
| UNO R3(H42) | FC-16 模块 | 说明 |
|---|---|---|
| D13 | CLK(全部并联) | SPI 时钟,4 块模块的 CLK 全部接 D13 |
| D11 | DIN(第 1 块) | SPI 数据,只接第 1 块 DIN |
| D10 | CS(全部并联) | 片选 / LOAD,4 块全部并联 |
| 5V | VCC(全部并联) | 4 块全亮约 300-400mA,UNO 5V 引脚可直供 |
| GND | GND(全部并联) | 共地 |
| — | DOUT → 下一块 DIN | 级联:每块 DOUT 接下一块 DIN |
Code
硬件 SPI 测试代码
使用 Arduino 硬件 SPI(不用 LedControl 库),4 块级联,轮流显示 "1234" 和全亮,每 5 秒切换。拔掉模块再插回可自动恢复(每次切换时重新初始化)。
// FC-16 MAX7219 4位 — 1234(5s) ↔ 全亮(5s)
// 接线: DIN→D11 CLK→D13 CS→D10
#include <SPI.h>
const int CS = 10;
const int DEV = 4;
byte buf[DEV][8]; // buf[模块][行]
// ----- 一次 CS 脉冲写一个寄存器到全部模块 -----
void maxAll(byte reg, byte val) {
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CS, LOW);
for (int d = 0; d < DEV; d++) { SPI.transfer(reg); SPI.transfer(val); }
digitalWrite(CS, HIGH);
SPI.endTransaction();
}
// ----- 整帧输出(8 次 CS 脉冲)-----
void drawBuf() {
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
noInterrupts();
for (int r = 0; r < 8; r++) {
digitalWrite(CS, LOW);
for (int d = 0; d < DEV; d++) { SPI.transfer(r + 1); SPI.transfer(buf[d][r]); }
digitalWrite(CS, HIGH);
}
interrupts();
SPI.endTransaction();
}
// ----- 填充缓冲区 -----
void fill1234() {
const byte N[4][8] = {
{0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x10},
{0x7E,0x02,0x02,0x7E,0x40,0x40,0x40,0x7E},
{0x7E,0x02,0x02,0x3E,0x02,0x02,0x02,0x7E},
{0x08,0x18,0x28,0x48,0xFE,0x08,0x08,0x08},
};
for (int d = 0; d < DEV; d++)
for (int r = 0; r < 8; r++) buf[d][r] = N[d][r];
}
void fillAllOn() {
for (int d = 0; d < DEV; d++)
for (int r = 0; r < 8; r++) buf[d][r] = 0xFF;
}
// ----- 初始化 + 画画面(每次切换都跑 = 拔插自动恢复)-----
void show(bool allOn) {
maxAll(0x09, 0x00); // 非 BCD
maxAll(0x0A, 0x01); // 亮度
maxAll(0x0B, 0x07); // 扫描 8 行
maxAll(0x0C, 0x01); // 正常模式
maxAll(0x0F, 0x00); // 关测试
if (allOn) fillAllOn();
else fill1234();
drawBuf();
}
void setup() {
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
SPI.begin();
show(false);
}
void loop() {
delay(5000);
show(true); // 全亮(内含重新初始化)
delay(5000);
show(false); // 1234(内含重新初始化)
}
库依赖:仅需 Arduino 内置 SPI.h,无需额外安装。硬件 SPI 比 LedControl 软件模拟更稳定,抗干扰更强。
Troubleshooting
常见故障排查
以下排查方法基于退货实测经验,部分故障和 LedControl 库的信号质量问题有关,改用硬件 SPI 后大部分消失。
整行不亮(其它 7 行正常)
原因:MAX7219 该 DIG 脚损坏或虚焊。
FC-16 的 1088AS 点阵是共阴极结构——DIG0-DIG7 分别驱动 8 个行(吸收电流),SEG A-DP 驱动 8 个列(输出电流)。一整行全黑说明那一行回路断了。
定位方法:
- 换一块模块插到同一位置——如果问题消失,确认是模块问题
- 如果只发生在特定位置——检查该位置的排针/排母是否接触不良
- 大概率是 MAX7219 芯片该 DIG 脚内部开路(静电或过流损坏)
处理:退货/换货。MAX7219 芯片损坏不可修复。
显示十几秒后画面乱掉
原因:MAX7219 发热后 DOUT 驱动能力下降。
尤其 LedControl 库用软件模拟 SPI 时更明显——时序不够干净,坏模块的 DOUT 噪声顺着级联线干扰下游模块。
解决:
- 换用硬件 SPI(见上方代码)——信号更干净
- 如果还乱,把花屏的那块换到级联最末端——DOUT 不再接下游
- 如果问题跟着模块走——确认是这块 MAX7219 芯片不良
屏幕一直闪 / 间歇性快闪乱码
常见原因(按可能性排序):
- LedControl 库反复清屏 —
loop()里每圈都 clearDisplay + setRow,肉眼看到的就是闪。改成只写不删的硬件 SPI 方案可解决。 - SPI 信号被干扰 — 某块 MAX7219 不良,在总线空闲时往 DOUT 输出噪声。拔掉嫌疑模块单独测试可确认。
- 供电不足 — 4 块全亮时 5V 电流不够,MAX7219 内部欠压复位,表现为间歇性全熄再亮。换外部 5V 电源或降低亮度验证。
4 块里只有某几块正常,其余不亮或乱码
先确认级联方向:DIN 接第一块,DOUT 接下一块 DIN,依次类推。CS 和 CLK 必须全部并联。
如果接线正确但中间某块不亮——换位置测试:把不亮的模块换到级联最末端,如果亮了说明它的 DOUT 有问题;如果还是不亮说明芯片本身坏了。
References