LED 显示屏
本页面作为 LED 分类总览入口,用于介绍 LED 产品体系结构、技术特点及选型方向,具体型号与使用说明请参考对应子页面。
LED(Light Emitting Diode,发光二极管)显示屏是微雪电子显示产品体系中的重要大类,广泛应用于指示灯、状态显示、装饰照明、信息显示及工业控制等领域。
LED 系列产品
| 型号 | 面板分辨率 | 像素间距 | 可视角度 | 供电电压/电流 | 扫描方式 | 面板尺寸 (mm) | 带金属框 (F) | GOB 覆膜 (B) |
|---|---|---|---|---|---|---|---|---|
| RGB-Matrix-P2-64x64-B | 64×64 | 2mm | ≥140° | 5V / 3A | 1/32 扫 | 128×128 | - | √ |
| RGB-Matrix-P2-64x64 | 64×64 | 2mm | ≥140° | 5V / 3A | 1/32 扫 | 128×128 | - | - |
| RGB-Matrix-P2.5-64x32-B | 64×32 | 2.5mm | ≥140° | 5V / 2.5A | 1/16 扫 | 160×80 | - | √ |
| RGB-Matrix-P2.5-64x32 | 64×32 | 2.5mm | ≥140° | 5V / 2.5A | 1/16 扫 | 160×80 | - | - |
| RGB-Matrix-P2.5-64x64 | 64×64 | 2.5mm | ≥140° | 5V / 4A | 1/32 扫 | 160×160 | - | - |
| RGB-Matrix-P2.5-96x48-F | 96×48 | 2.5mm | ≥140° | 5V / 4A | 1/24 扫 | 240×120 | √ | - |
| RGB-Matrix-P3-64x32-B | 64×32 | 3mm | ≥160° | 5V / 2.5A | 1/16 扫 | 192×96 | - | √ |
| RGB-Matrix-P3-64x32 | 64×32 | 3mm | ≥160° | 5V / 2.5A | 1/16 扫 | 192×96 | - | - |
| RGB-Matrix-P3-64x64 | 64×64 | 3mm | ≥160° | 5V / 4A | 1/32 扫 | 192×192 | - | - |
| RGB-Matrix-P3-64x64-F | 64×64 | 3mm | ≥140° | 5V / 4A | 1/32 扫 | 192×192 | √ | - |
| RGB-Matrix-P4-64x32 | 64×32 | 4mm | ≥160° | 5V / 4A | 1/16 扫 | 256×128 | - | - |
| RGB-Matrix-P4-80x40 | 80×40 | 4mm | ≥140° | 5V / 4A | 1/20 扫 | 320×160 | - | - |
| RGB-Matrix-P5-64x32 | 64×32 | 5mm | ≥140° | 5V / 4A | 1/16 扫 | 320×160 | - | - |
GOB(Glue On Board)工艺说明:在灯珠表面形成透明保护层,具备防水、防尘、抗撞击、抗静电等优势,适合高频触碰或潮湿环境的应用;GOB 不改变分辨率与像素间距,控制接口与非 GOB 面板保持一致。
LED 选型指南
| 间距值 | 主要特点 | 适用场景 | 平台 |
|---|---|---|---|
| P2.5 | 近距细腻,可选 GOB 防护 | 室内近距信息显示、艺术装置、精细图文 | Arduino、ESP32、树莓派、STM32 |
| P3 | 清晰度与成本均衡,视觉舒适 | 桌面/挂墙显示、环境监测、文字滚动 | Arduino、ESP32、树莓派、STM32 |
| P4 | 视距更远、容错大,安装友好 | 走廊/大厅提示、楼层指示、公共看板 | Arduino、ESP32、树莓派、STM32 |
| P5 | 远距可读性好、性价比高 | 室内广告牌、远距指示、装饰显示 | Arduino、ESP32、树莓派、STM32 |
LED 产品推荐
- RGB Matrix系列:高密度LED点阵,适合信息显示和装饰照明
- RGB Matrix GOB 版本系列:GOB屏幕表面具备防水防潮特性,支持湿布清洁,日常维护更方便。覆膜可减少湿气和灰尘对灯珠焊脚的影响。
LED 技术特点
- 高亮度:LED具有较高的亮度,适合各种光照环境
- 响应快:LED的响应时间短,适合高频闪烁应用
- 环保:LED不含汞等有害物质,符合环保要求
HUB75 接口说明
- 1.使用5个地址字节选择要显示的行,从32行中选择1行 (如果是高度为32,可以不使用E引脚)。
- 2.通过将Blank管脚设为高电平来关闭显示器,这可以防止故障,或者说消隐。
- 3.使用Clock引脚和RGB引脚进行选中的行数据输入。
- 4.将锁存器引脚切换为高->低以将数据加载到选中的行。
- 5.通过将Blank引脚拉低来打开显示器。

当前示例代码只是通过轮询的方式翻转IO引脚实现对HUB75接口的控制,这种方法十分消耗主控性能,实际开发可以根据主控芯片自带的外设特性优化效果。
简单总结操作流程 先关屏(OE脚拉高) → 选行(驱动A-E引脚确定行数) → 按列移位送RGB数据(驱动R1~B2引脚配合CLK输送RGB数据) → 锁存(LAT脚先拉高,再拉低) → 开屏短暂显示 → 关屏 → 下一行,循环足够快后人眼看到整屏常亮。
基本示例代码(IDF版本)
Details
#include "driver/gpio.h"
#include "rom/ets_sys.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"
#include <stdint.h>
#define CONFIG_HUB75_PIN_R1 GPIO_NUM_4
#define CONFIG_HUB75_PIN_G1 GPIO_NUM_5
#define CONFIG_HUB75_PIN_B1 GPIO_NUM_6
#define CONFIG_HUB75_PIN_R2 GPIO_NUM_7
#define CONFIG_HUB75_PIN_G2 GPIO_NUM_15
#define CONFIG_HUB75_PIN_B2 GPIO_NUM_16
#define CONFIG_HUB75_PIN_A GPIO_NUM_18
#define CONFIG_HUB75_PIN_B GPIO_NUM_8
#define CONFIG_HUB75_PIN_C GPIO_NUM_3
#define CONFIG_HUB75_PIN_D GPIO_NUM_42
#define CONFIG_HUB75_PIN_E GPIO_NUM_9
#define CONFIG_HUB75_PIN_LAT GPIO_NUM_40
#define CONFIG_HUB75_PIN_OE GPIO_NUM_2
#define CONFIG_HUB75_PIN_CLK GPIO_NUM_41
#define HUB75_WIDTH 64
#define HUB75_HEIGHT 64
#define HUB75_HALF_ROWS (HUB75_HEIGHT / 2)
/*
* @brief 产生HUB75移位时钟上升沿,将当前RGB并行位移入面板移位寄存器
* @note 每调用一次对应推进1列数据位置
*/
static inline void hub75_clk_pulse(void)
{
gpio_set_level(CONFIG_HUB75_PIN_CLK, 1);
gpio_set_level(CONFIG_HUB75_PIN_CLK, 0);
}
/*
* @brief 触发LAT锁存,将移位寄存器内容更新到输出寄存器
* @note 锁存后配合OE使能,当前行数据才会被实际点亮
*/
static inline void hub75_latch(void)
{
gpio_set_level(CONFIG_HUB75_PIN_LAT, 1);
gpio_set_level(CONFIG_HUB75_PIN_LAT, 0);
}
/*
* @brief 设置行选地址线A~E
* @param row 行地址索引(有效范围由面板扫描方式与HUB75_HALF_ROWS决定)
* @note 本工程为上下半屏并行输出:同一row同时对应上半区与下半区各一行
*/
static inline void hub75_set_row_address(uint32_t row)
{
gpio_set_level(CONFIG_HUB75_PIN_A, (int)(row & 0x01U));
gpio_set_level(CONFIG_HUB75_PIN_B, (int)((row >> 1U) & 0x01U));
gpio_set_level(CONFIG_HUB75_PIN_C, (int)((row >> 2U) & 0x01U));
gpio_set_level(CONFIG_HUB75_PIN_D, (int)((row >> 3U) & 0x01U));
gpio_set_level(CONFIG_HUB75_PIN_E, (int)((row >> 4U) & 0x01U));
}
/*
* @brief 推送当前列的上下半屏RGB数据并执行一次移位
* @param r1,g1,b1 上半屏当前列RGB位(0/1)
* @param r2,g2,b2 下半屏当前列RGB位(0/1)
* @note 该函数只负责“送1列数据”,整行显示需连续调用HUB75_WIDTH次
*/
static inline void hub75_push_column(uint32_t r1, uint32_t g1, uint32_t b1, uint32_t r2, uint32_t g2, uint32_t b2)
{
gpio_set_level(CONFIG_HUB75_PIN_R1, (int)r1);
gpio_set_level(CONFIG_HUB75_PIN_G1, (int)g1);
gpio_set_level(CONFIG_HUB75_PIN_B1, (int)b1);
gpio_set_level(CONFIG_HUB75_PIN_R2, (int)r2);
gpio_set_level(CONFIG_HUB75_PIN_G2, (int)g2);
gpio_set_level(CONFIG_HUB75_PIN_B2, (int)b2);
hub75_clk_pulse();
}
static void hub75_gpio_init(void)
{
gpio_config_t io_conf = {
.pin_bit_mask =
(1ULL << CONFIG_HUB75_PIN_R1) |
(1ULL << CONFIG_HUB75_PIN_G1) |
(1ULL << CONFIG_HUB75_PIN_B1) |
(1ULL << CONFIG_HUB75_PIN_R2) |
(1ULL << CONFIG_HUB75_PIN_G2) |
(1ULL << CONFIG_HUB75_PIN_B2) |
(1ULL << CONFIG_HUB75_PIN_A) |
(1ULL << CONFIG_HUB75_PIN_B) |
(1ULL << CONFIG_HUB75_PIN_C) |
(1ULL << CONFIG_HUB75_PIN_D) |
(1ULL << CONFIG_HUB75_PIN_E) |
(1ULL << CONFIG_HUB75_PIN_LAT) |
(1ULL << CONFIG_HUB75_PIN_OE) |
(1ULL << CONFIG_HUB75_PIN_CLK),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
gpio_set_level(CONFIG_HUB75_PIN_CLK, 0);
gpio_set_level(CONFIG_HUB75_PIN_LAT, 0);
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
}
void app_main(void)
{
hub75_gpio_init();
while (true) {
uint32_t row = 0;
while (row < HUB75_HALF_ROWS) {
uint32_t col = 0;
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
hub75_set_row_address(row);
while (col < HUB75_WIDTH) {
hub75_push_column(1, 0, 0, 1, 0, 0);
col++;
}
hub75_latch();
gpio_set_level(CONFIG_HUB75_PIN_OE, 0);
ets_delay_us(80);
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
row++;
}
vTaskDelay(1);
}
}
BCM 信号控制
根据上述方法不难看出,仅仅通过RGB引脚配比,最多只能配出8种色彩效果,对于实际效果展示来说这显然是不够的。
所以,为了实现更多的颜色,我们需要使用其他方式来控制RGB显示时间从而做到不同颜色的渲染,比如使用BCM信号来控制颜色显示比例实现颜色混合。
BCM(Binary Code Modulation,二进制编码调制)是一种用“时间分片 + 二进制权重”来表达亮度的调光方式,常用于 LED 点阵、RGB 矩阵(如 HUB75 屏)中。 它的核心思想是:不用固定占空比 PWM,而是把一个刷新周期拆成多个“按位时间片”
举例说明
例如设定一个总显示时间片为 35us,并采用 3bit 颜色深度。若最低位时间单位设为 5us,则 3 个 bit 可按二进制权重分配为 5us、10us、20us,对应权重比为 1:2:4。此时单个颜色通道的取值范围为 0-7(二进制为 000-111)。
假设某一像素的颜色值为 R=7、G=2、B=0,则对应二进制分别为 R=111、G=010、B=000。也就是说,在这 35us 的时间片内,R 通道点亮 35us,G 通道点亮 10us,B 通道不点亮。根据三次不同的显示时间片,最终显示出的颜色会是偏红的橙色。若继续调节 G 通道的取值,则可与 R 通道按不同比例混合,得到更多中间色。
示例代码
Details
#define COLOR_R_LEVEL 7
#define COLOR_G_LEVEL 2
#define COLOR_B_LEVEL 0
#define COLOR_BITS 3 // 表示每个颜色通道用 3bit 表示亮度, 也就是每个通道有 8 个码值(0~7)
#define ROW_ON_US 5 // BCM 的“基准时间单位”
/*
* @brief 扫描一行,将当前行的RGB数据推送至面板
* @param row 行地址索引(有效范围由面板扫描方式与HUB75_HALF_ROWS决定)
* @param r_on,g_on,b_on 上半屏当前行RGB位(0/1)
* @param hold_us 扫描时保持当前行显示时间(单位:微秒)
*/
static inline void hub75_scan_one_row(uint32_t row, uint32_t r_on, uint32_t g_on, uint32_t b_on, uint32_t hold_us)
{
uint32_t col = 0;
hub75_set_row_address(row);
while (col < HUB75_WIDTH) {
hub75_push_column(r_on, g_on, b_on, r_on, g_on, b_on);
col++;
}
hub75_latch();
gpio_set_level(CONFIG_HUB75_PIN_OE, 0);
ets_delay_us(hold_us);
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
}
void app_main(void)
{
uint32_t bit = 0;
while (bit < COLOR_BITS) {
const uint32_t r_on = (COLOR_R_LEVEL >> bit) & 0x01U;
const uint32_t g_on = (COLOR_G_LEVEL >> bit) & 0x01U;
const uint32_t b_on = (COLOR_B_LEVEL >> bit) & 0x01U;
const uint32_t hold_us = (ROW_ON_US << bit);
uint32_t row = 0;
while (row < HUB75_HALF_ROWS) {
hub75_scan_one_row(row, r_on, g_on, b_on, hold_us);
row++;
}
bit++;
}
}
级联显示
我们已经完成了基本的显示和调色功能,但在实际应用中,单块单元板的显示面积是有限的。因此,需要利用单元板的级联能力,将多块单元板串联连接,以扩展显示区域。
每块单元板提供输入与输出接口,多块单元板之间通过串联方式连接,即前一块的输出连接到下一块的输入。通过这种方式,所有单元板共享 CLK / LAT / OE 等控制信号,而 RGB 数据信号则通过级联方式逐级传递,从而实现多屏扩展显示。
HUB75 的显示数据通过 CLK 驱动移位结构逐位移入,当一行像素数据全部移入后,通过 LAT 将移位结构中的数据锁存到输出寄存器(Latch / Output Register),再由 OE 控制该行的显示使能。数据在级联传输路径中是单向传播的,因此最先输入的数据会被推送到级联链的最远端面板。所以简单总结级联的本质就是共享控制信号(CLK/LAT/OE)并扩展数据传输路径,从而实现对不同数量单元板的统一驱动。

举例说明
我们通过级联两个64*64的HUB75单元板,来扩展显示区域,我们只需要修改代码中的宽度即可,然后先写入64列绿色,再写入64列红色,按照之前的分析,靠近MCU的HUB75单元板显示红色,远端的HUB75单元板显示绿色。
示例代码
Details
#define PANEL_COUNT 2
#define HUB75_TOTAL_WIDTH (64 * PANEL_COUNT)
void app_main(void)
{
hub75_gpio_init();
while (true) {
uint32_t row = 0;
while (row < HUB75_HALF_ROWS) {
uint32_t col = 0;
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
hub75_set_row_address(row);
while (col < HUB75_TOTAL_WIDTH) {
if (col < HUB75_WIDTH) {
// 第2块(远端)
hub75_push_column(0, 1, 0, 0, 1, 0); // 绿色
} else {
// 第1块(靠近MCU)
hub75_push_column(1, 0, 0, 1, 0, 0); // 红色
}
col++;
}
hub75_latch();
gpio_set_level(CONFIG_HUB75_PIN_OE, 0);
ets_delay_us(80);
gpio_set_level(CONFIG_HUB75_PIN_OE, 1);
row++;
}
vTaskDelay(1);
}
}
