- C++
ESP32 驱动 8×8 点阵屏学习笔记(Arduino 环境)
- 2025-7-22 18:17:56 @
ESP32 驱动 8×8 点阵屏学习笔记(Arduino 环境)
一、基础认知:8×8 点阵屏
(一)用途
8×8 点阵屏常“隐藏”在生活场景里,像公交车线路显示屏、公共场所信息提示屏,都是多个 8×8 点阵拼接成大显示区域,用来展示文字、数字、简单图形,实现信息传递 。
(二)工作原理
单个 8×8 点阵有 64 个 LED,按矩阵排列(8 行 8 列 )。通过控制特定行、列的 LED 点亮/熄灭,组合出数字(如 “0 - 9” )、符号(如 “+、-” )、汉字(简单字体)、自定义图形(像小箭头 )。比如想显示数字 “1”,就点亮对应列、行的 LED 形成竖线形状 。
二、ESP32 + Arduino 环境准备
(一)硬件连接(以 74HC595 移位寄存器级联驱动为例 )
- 元件清单:ESP32 开发板、8×8 点阵屏、2 个 74HC595 移位寄存器、若干杜邦线、面包板(可选 )。
- 接线逻辑:
- 74HC595 负责“分担”ESP32 引脚压力,用少数引脚控制更多点阵。
- ESP32 引脚(如
D23
连数据输入DS
、D22
连时钟SH_CP
、D21
连锁存ST_CP
)→ 74HC595 对应引脚 → 点阵屏行、列引脚(参考级联原理图,把移位寄存器输出连到点阵行、列 )。 - 简单说,就是让 ESP32 能通过控制移位寄存器,间接指挥点阵屏哪些 LED 亮 。
(二)软件环境
在 Arduino IDE 中,选对应 ESP32 开发板型号(如 “ESP32 Dev Module” ),装好 “ESP32” 开发板支持包(通过 Boards Manager 安装 ),就能开始编程 。
三、核心代码与解析(实现点阵基本显示、流水灯效果 )
(一)基础显示(以显示自定义图形,如小箭头为例 )
// 引脚定义:连 74HC595 的数据、时钟、锁存引脚
const int dataPin = 23; // 数据输入 DS
const int clockPin = 22; // 时钟 SH_CP
const int latchPin = 21; // 锁存 ST_CP
// 自定义图形数据(8×8,共 8 字节,每字节对应 1 行 LED 状态 )
// 这里示例是简单小箭头,可根据字模提取工具改数据
byte customPattern[8] = {0x00, 0x00, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00};
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
}
void loop() {
displayPattern(customPattern); // 显示自定义图形
delay(1000); // 显示 1 秒
}
// 点阵显示函数:把图形数据输出到移位寄存器,控制点阵点亮
void displayPattern(byte pattern[]) {
digitalWrite(latchPin, LOW); // 锁存引脚拉低,准备接收新数据
for (int row = 0; row < 8; row++) { // 逐行处理
// 发送行数据:先通过移位寄存器输出,控制哪行亮
shiftOut(dataPin, clockPin, MSBFIRST, ~pattern[row]);
// 锁存数据,让点阵显示当前行状态
digitalWrite(latchPin, HIGH);
digitalWrite(latchPin, LOW);
delay(1); // 短暂延时,让显示稳定
}
}
代码注释解析:
customPattern
存图形数据,每字节 8 位对应 1 行 8 个 LED 状态(0
灭、1
亮,因硬件可能需取反,所以用~
)。shiftOut
函数:按MSBFIRST
(高位先传 )规则,把数据发到 74HC595,控制点阵行、列点亮 。- 循环逐行显示,配合延时,让人眼看到完整图形 。
(二)流水灯效果(让图案“流动”,可结合电位器调速 )
const int dataPin = 23;
const int clockPin = 22;
const int latchPin = 21;
const int potPin = A0; // 电位器接模拟引脚 A0,用于调速
byte patterns[8][8] = { // 可存多组图形,实现流动切换
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, 0x00},
{0x00, 0x00, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00},
// 可继续添加更多图形...
};
int patternIndex = 0;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(potPin, INPUT);
}
void loop() {
int speed = map(analogRead(potPin), 0, 4095, 100, 1000); // 读取电位器值,映射为延时(100 - 1000 毫秒 )
displayPattern(patterns[patternIndex]);
patternIndex = (patternIndex + 1) % 8; // 切换图形索引,循环显示
delay(speed);
}
void displayPattern(byte pattern[]) {
digitalWrite(latchPin, LOW);
for (int row = 0; row < 8; row++) {
shiftOut(dataPin, clockPin, MSBFIRST, ~pattern[row]);
digitalWrite(latchPin, HIGH);
digitalWrite(latchPin, LOW);
delay(1);
}
}
代码注释解析:
patterns
数组存多组图形数据,模拟“流动”的不同帧 。potPin
读电位器电压(analogRead
获 0 - 4095 值 ),map
函数转成 100 - 1000 毫秒延时,拧电位器就能调速 。patternIndex
循环切换,让图形依次显示,形成“流水”效果 。
四、常见问题与解决
(一)显示乱码/不对
- 检查硬件:接线是否松动、移位寄存器与点阵屏引脚对应是否正确(参考级联原理图 )。
- 代码排查:图形数据是否正确(可用字模提取工具重新生成 )、
shiftOut
时取反是否必要(因硬件电路,有时需调整高低电平逻辑 )。
(二)流水灯不“流”
- 数组索引问题:
patternIndex
切换逻辑是否正确,确保% 8
让索引循环在 0 - 7 。 - 延时与速度:电位器接线是否对,
map
函数参数是否合理(输入范围 0 - 4095 对应 ESP32 模拟输入 )。
(三)ESP32 编译/上传报错
- 开发板选择:确认选对 ESP32 开发板型号,支持包版本适配 。
- 串口波特率:上传时选对串口和波特率(如 115200 ),若报错尝试降低波特率 。
通过这样一步步了解原理、接线、编程,就能用 ESP32 轻松驱动 8×8 点阵屏,实现基础显示、流水灯等效果,后续还能拓展做滚动文字、动画,让点阵屏“活”起来 !
1 条评论
-
admin SU @ 2025-7-22 18:19:41
// LED矩阵控制引脚定义 const int LPin = 13, CPin = 14, DPin = 15; // LPin:锁存引脚, CPin:时钟引脚, DPin:数据引脚 byte Rowdata, COLdata; // 行数据和列数据存储变量 void setup() { // 初始化控制引脚为输出模式 pinMode(LPin, OUTPUT); pinMode(CPin, OUTPUT); pinMode(DPin, OUTPUT); // 初始状态设置 digitalWrite(LPin, LOW); // 锁存引脚低电平,允许数据输入 digitalWrite(CPin, LOW); // 时钟引脚初始化为低 // 设置PWM分辨率为10位(0-1023),虽然此处未使用PWM功能 // analogSetWidth(10); } void loop() { // 设置第一行点亮,其余行熄灭 Rowdata = 0b00000010; // 二进制表示第2行(LSB)为高电平,其余行为低 // 设置第一列熄灭,其余列点亮 COLdata = ~(0b00000100); // 取反后第3列为低电平,其余列为高电平 // 调用显示函数更新LED矩阵 matrixDisplay(); } // 矩阵显示函数 - 通过移位寄存器发送数据 void matrixDisplay() { // 发送列数据(先发送) shiftOut(DPin, CPin, MSBFIRST, COLdata); // 发送行数据(后发送,级联寄存器) shiftOut(DPin, CPin, MSBFIRST, Rowdata); // 更新显示 - 上升沿锁存数据 digitalWrite(LPin, LOW); // 锁存引脚置高,将移位寄存器数据更新到输出 digitalWrite(LPin, HIGH); // 锁存引脚置低,准备下一次数据传输 }
- 1