RLCD

RLCD(Reflective LCD,反射式液晶显示器)不需要背光,依靠反射环境光成像,观感接近墨水屏,但刷新速度与普通 LCD 相当。它适用于既需要墨水屏级别的低功耗和阳光可读性、又需要实时刷新动态画面的场景,例如常显时钟、电子日历、户外仪表。
阅读本章前,建议先了解 LCD 章节 中液晶成像的基本原理,两者的控光机制一致。
1. 显示原理
RLCD 与普通 LCD 同属液晶显示,液晶层同样充当控制光线通断的光阀,区别在于光源的位置:
- 普通 LCD(透射式):光来自屏幕底部的背光,穿过液晶层后射出。
- RLCD(反射式):屏幕底部没有背光,取而代之的是一层反射膜。环境光从正面射入,穿过液晶层、经反射膜反射后再次穿过液晶层射出。液晶层透光时该像素反射环境光显示为亮,遮光时显示为暗。
由此带来两个直接结果:
- 环境光越强,画面越清晰。阳光直射下普通 LCD 的背光会被环境光淹没,RLCD 反而达到最佳观感,这一点与墨水屏一致。
- 无环境光时无法显示。RLCD 在暗处不可见,需要外部照明(部分产品会增加一层可选的前光)。
RLCD 没有背光,不会像普通 LCD 那样主动发光。屏幕亮度偏低甚至偏暗属于正常现象,并非故障;光线越充足显示越清晰,长时间观看也不易视觉疲劳。
在低功耗实现上,RLCD 常与两类技术结合:
- 低功耗反射 TFT(Thin Film Transistor,薄膜晶体管):驱动 IC 内置显存并深度优化静态功耗,画面不更新时整屏功耗可低至微安级,同时保留较快的刷新能力。
- MIP(Memory-in-Pixel):每个像素内嵌 1 bit 存储单元,画面保持时几乎不耗电,常见于户外运动手表使用的 Sharp Memory LCD。
2. 特性与局限
优势:
- 功耗很低:省去了功耗占比最大的背光,静态显示功耗比普通 LCD 低一到两个数量级,适合电池供电的常显(Always-On)设备。
- 刷新快:本质仍是液晶,毫秒级响应,可流畅显示动画和实时数据。这是它与墨水屏的最大差别,且没有墨水屏的残影问题。
- 阳光下清晰可读:反射式成像,光线越强越清晰。
- 观感类纸:无背光直射眼睛,长时间观看舒适。
局限:
- 依赖环境光:暗处不可见,需要前光或外部照明。
- 色彩表现有限:目前以单色为主,彩色 RLCD 的色彩饱和度也明显低于普通 LCD。
- 对比度一般:反射效率有限,黑白对比度不如墨水屏和 OLED。
- 生态相对较新,可选尺寸和驱动资料少于普通 LCD。
与类似屏幕的定位对比:
| 需求 | 更适合的屏幕 |
|---|---|
| 彩色 GUI、室内交互 | LCD / AMOLED |
| 画面几乎不变、极致待机(价签、日历封面) | E-Paper |
| 常显 + 实时刷新 + 户外可读 + 电池供电 | RLCD |
3. 常见驱动方案与接口
RLCD 对主控来说与普通 SPI LCD 非常相似:驱动 IC 内置显存(GRAM,Graphics RAM,图形随机存取存储器),通过 SPI 接口接收命令与像素数据,同样遵循 显示基础与接口 中复位、初始化序列、设置窗口、写入像素的通用流程。
差别主要在像素格式:单色 RLCD 的显存按 1bpp(1 bit per pixel,每像素 1 位)组织,一帧数据量很小。以 4.2 英寸 300×400 的屏幕为例,一帧仅 300 × 400 ÷ 8 = 15000 字节(同分辨率的 RGB565 彩屏为 240000 字节),因此即使 SPI 接口也能达到很高的帧率,功耗也进一步降低。
常见的低功耗反射 TFT 驱动 IC 有 Sitronix ST7305、ST7306 等,支持低功耗模式与局部窗口更新。使用微雪的 RLCD 开发板时,驱动层已在官方示例包中封装好,一般无需直接操作这些 IC 的寄存器。
3.1 图形库选择
由于是单色屏,RLCD 的图形库推荐使用 u8g2:这是嵌入式单色显示最常用的图形库,1bpp 显存组织与屏幕原生格式一致,字体和绘图资源丰富。
需要复杂界面时也可以移植 LVGL(配置为单色模式)。
4. Arduino + u8g2 驱动示例
本节以 微雪 ESP32-S3-RLCD-4.2 为例。该开发板板载 4.2 英寸 300×400 全反射屏,驱动 IC 为 ST7305。如果使用其他开发板或屏幕模块,只需替换引脚定义和对应的构造器即可。
4.1 准备工作
- 参考 Arduino IDE 开发环境搭建教程 安装 Arduino IDE 并添加 ESP32 支持。ESP32-S3-RLCD-4.2 要求 arduino-esp32 v3.3.0 以上版本。
- 在库管理器(工具 > 管理库)中搜索
U8g2并安装。ST7305 300×400 的支持自 U8g2 v2.36.19 起并入,请确认版本不低于此。其他安装方式参考 Arduino 库管理教程。 - 按产品页的 Arduino 工程参数设置 配置开发板选项。
4.2 确认引脚
屏幕已直连主控,引脚固定如下。与 LCD 不同,RLCD 没有背光,因此引脚表中不含 BL 一项:
| 信号 | GPIO | 说明 |
|---|---|---|
| RLCD_SCK | GPIO11 | SPI 时钟 |
| RLCD_MOSI | GPIO12 | SPI 数据 |
| RLCD_DC | GPIO5 | 命令 / 数据选择 |
| RLCD_CS | GPIO40 | 片选 |
| RLCD_RST | GPIO41 | 复位 |
4.3 示例代码
这块屏的驱动 IC 是 ST7305,U8g2 库已原生支持它,选用 U8G2_ST7305_300X400 系列构造器即可,无需额外的驱动文件。ESP32-S3 的引脚可自由路由到硬件 SPI,实际项目通常使用硬件 SPI,因此这里直接采用(4W_HW_SPI)。新建一个 Arduino 工程,写入以下代码:
#include <U8g2lib.h>
#include <SPI.h>
// 引脚定义(ESP32-S3-RLCD-4.2)
#define RLCD_SCK 11
#define RLCD_MOSI 12
#define RLCD_DC 5
#define RLCD_CS 40
#define RLCD_RST 41
// 1. 创建屏幕对象:ST7305 300×400,硬件 SPI,U8G2_R1 旋转为 400×300 横屏
// 构造器参数依次为 旋转方向、CS、DC、RST
U8G2_ST7305_300X400_F_4W_HW_SPI u8g2(U8G2_R1, RLCD_CS, RLCD_DC, RLCD_RST);
void setup() {
// 2. 将硬件 SPI 映射到本板的 SCK=11、MOSI=12(MISO 用不到,填 -1)
SPI.begin(RLCD_SCK, -1, RLCD_MOSI, RLCD_CS);
// 3. 初始化屏幕
u8g2.begin();
// 4. 清空缓冲区
u8g2.clearBuffer();
// 5. 显示文字
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.drawStr(90, 140, "Hello, RLCD!");
// 6. 绘制边框与图形
u8g2.drawFrame(10, 10, 380, 280); // 空心矩形(边框)
u8g2.drawBox(60, 200, 60, 50); // 实心矩形
u8g2.drawCircle(200, 225, 30); // 空心圆
u8g2.drawLine(270, 250, 340, 200); // 直线
// 7. 将缓冲区内容刷新到屏幕
u8g2.sendBuffer();
}
void loop() {
}
编译并烧录后,屏幕显示 "Hello, RLCD!" 与一组图形。RLCD 依靠环境光成像,在光线充足处观察效果最佳。
关于构造器:u8g2 的构造器名遵循 U8G2_<驱动IC>_<分辨率>_<缓冲模式>_<总线类型> 的格式,U8G2_ST7305_300X400_F_4W_HW_SPI 拆开即:驱动 IC 为 ST7305、分辨率 300×400、缓冲模式 F、总线为四线硬件 SPI,后面依次是旋转方向和三个引脚(时钟与数据由硬件 SPI 外设固定负责,不在构造器参数里)。其中:
- 缓冲模式:
F为整屏缓冲(Full buffer),一次绘制整帧;1/2为分页缓冲,每次只在内存中缓存 1 或 2 个 tile 行,配合firstPage()/nextPage()循环刷新,内存占用更小但代码略复杂。300×400 的 1bpp 整帧仅 15000 字节,ESP32-S3 内存充裕,直接用F即可。 - 总线类型:
4W_HW_SPI为硬件 SPI,由 SPI 外设产生时序、速度快;若需接到任意引脚,可改用软件模拟的4W_SW_SPI,见下方提示。
完整的命名规则与各参数取值见 u8g2 官方文档。
关于 SPI.begin():硬件 SPI 构造器只接收 CS、DC、RST,时钟与数据走 ESP32-S3 的硬件 SPI(FSPI)外设,默认引脚为 SCK=GPIO12、MOSI=GPIO11。本板的 SPI 时钟与数据未使用 FSPI 默认引脚(SCK 接 GPIO11、MOSI 接 GPIO12),因此要在 u8g2.begin() 之前调用 SPI.begin(11, -1, 12, 40) 按实际接线重新映射,否则屏幕不亮。
换到非专属引脚后,信号从 IO MUX 直连改走 GPIO 矩阵,SPI 时钟上限由约 80 MHz 降到约 40 MHz,但外设本身仍是硬件驱动(远快于软件 SPI)。而 ST7305 数据手册规定的写时序时钟周期最小 30 ns(约 33 MHz),是比 GPIO 矩阵更低的那道上限。本章示例最高使用 24 MHz 时钟(见动态刷新示例的 setBusClock()),未触及这两道上限,因此重映射不构成瓶颈。
此后所有绘图均使用 u8g2 的标准 API,常用的还有:
u8g2.drawUTF8(x, y, "text"); // 绘制 UTF-8 字符串
u8g2.drawDisc(x, y, r); // 实心圆
u8g2.drawXBMP(x, y, w, h, bitmap); // 单色位图
注意 u8g2 的绘图模式:所有绘制先写入内存缓冲区,调用 sendBuffer() 后才一次性刷新到屏幕,这正对应 显示基础与接口 中的帧缓冲概念。
4.4 动态刷新示例
RLCD 与墨水屏最大的区别是刷新快。沿用 4.3 的硬件 SPI 配置,将绘图逻辑从 setup() 移到 loop() 中反复执行并统计帧率,就能直观感受这一点:
#include <U8g2lib.h>
#include <SPI.h>
// 引脚定义(ESP32-S3-RLCD-4.2)
#define RLCD_SCK 11
#define RLCD_MOSI 12
#define RLCD_DC 5
#define RLCD_CS 40
#define RLCD_RST 41
// 硬件 SPI 构造器,参数依次为 旋转方向、CS、DC、RST
U8G2_ST7305_300X400_F_4W_HW_SPI u8g2(U8G2_R1, RLCD_CS, RLCD_DC, RLCD_RST);
uint32_t counter = 0;
uint32_t lastMs = 0;
uint32_t frames = 0;
uint32_t fps = 0;
void setup() {
// 将硬件 SPI 总线映射到本板的 SCK=11、MOSI=12(MISO 用不到,填 -1)
SPI.begin(RLCD_SCK, -1, RLCD_MOSI, RLCD_CS);
u8g2.begin();
u8g2.setBusClock(24000000); // 提高 SPI 时钟以获得更高帧率
lastMs = millis();
}
void loop() {
char buf[32];
u8g2.clearBuffer();
// 居中显示计数值
u8g2.setFont(u8g2_font_logisoso50_tn);
snprintf(buf, sizeof(buf), "%lu", (unsigned long)counter);
int w = u8g2.getStrWidth(buf);
u8g2.drawStr((400 - w) / 2, 170, buf);
// 底部显示实时帧率
u8g2.setFont(u8g2_font_6x13_tf);
snprintf(buf, sizeof(buf), "FPS: %lu", (unsigned long)fps);
u8g2.drawStr(20, 285, buf);
u8g2.drawFrame(10, 10, 380, 280);
u8g2.sendBuffer(); // 刷新到屏幕
counter++;
frames++;
// 每秒统计一次帧率
uint32_t now = millis();
if (now - lastMs >= 1000) {
fps = frames * 1000 / (now - lastMs);
frames = 0;
lastMs = now;
}
}
编译并烧录后,屏幕中央的计数值飞快跳动,底部显示实时帧率,整屏刷新约 45 FPS。相比之下,同尺寸墨水屏的一次整屏刷新通常以秒计,两者的差距一目了然。
与 4.3 相比,这段代码的差别只有两点:u8g2.begin() 后用 setBusClock(24000000) 把 SPI 时钟提到 24 MHz,以及把绘图放进 loop() 循环刷新。构造器、引脚映射和绘图 API 都一样。
上述 ~45 FPS 基于 U8g2 内置的 ST7305 驱动,它逐块发送、每帧要发起数千次小的 SPI 事务,刷新路径尚未针对本屏优化(300×400 支持是 v2.36.19 才并入的新驱动)。瓶颈在事务开销而非时钟,因此继续调高 setBusClock 收效甚微。
如果追求极限帧率,可改用示例程序包中的 02_Example/Arduino/10_U8G2_Test——它自带一份手写驱动,将整个 tile 行拼好后一次性批量发送,同样 24 MHz 下可达 70+ FPS(并额外统计单帧耗时、刷新耗时并通过串口输出)。代价是要复制其中的 ST7305_U8g2.h/.cpp 两个文件。
4.5 常见问题
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 暗处看不清 | RLCD 依赖环境光成像,属正常现象 | 增加外部照明 |
| 构造器编译报错 | U8g2 版本过低,未包含 ST7305 支持 | 升级 U8g2 至 v2.36.19 以上 |
| 画面偏移或花屏 | 构造器分辨率或旋转方向不匹配 | 核对构造器型号与屏幕分辨率(300×400)一致 |