• 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 移位寄存器级联驱动为例 )

  1. 元件清单:ESP32 开发板、8×8 点阵屏、2 个 74HC595 移位寄存器、若干杜邦线、面包板(可选 )。
  2. 接线逻辑
    • 74HC595 负责“分担”ESP32 引脚压力,用少数引脚控制更多点阵。
    • ESP32 引脚(如 D23 连数据输入 DSD22 连时钟 SH_CPD21 连锁存 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 循环切换,让图形依次显示,形成“流水”效果 。

四、常见问题与解决

(一)显示乱码/不对

  1. 检查硬件:接线是否松动、移位寄存器与点阵屏引脚对应是否正确(参考级联原理图 )。
  2. 代码排查:图形数据是否正确(可用字模提取工具重新生成 )、shiftOut 时取反是否必要(因硬件电路,有时需调整高低电平逻辑 )。

(二)流水灯不“流”

  1. 数组索引问题patternIndex 切换逻辑是否正确,确保 % 8 让索引循环在 0 - 7 。
  2. 延时与速度:电位器接线是否对,map 函数参数是否合理(输入范围 0 - 4095 对应 ESP32 模拟输入 )。

(三)ESP32 编译/上传报错

  1. 开发板选择:确认选对 ESP32 开发板型号,支持包版本适配 。
  2. 串口波特率:上传时选对串口和波特率(如 115200 ),若报错尝试降低波特率 。

通过这样一步步了解原理、接线、编程,就能用 ESP32 轻松驱动 8×8 点阵屏,实现基础显示、流水灯等效果,后续还能拓展做滚动文字、动画,让点阵屏“活”起来 !

1 条评论

  • @ 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