1. LCD显示原理概述
1.1 液晶显示基本物理原理
液晶(Liquid Crystal, LC)是一种介于固态晶体与各向同性液体之间的特殊物质状态。在LCD(Liquid Crystal Display)中,液晶分子在电场作用下发生定向排列变化,从而控制背光透过率,实现像素亮暗显示。
核心工作流程:
- 背光源:LED或CCFL提供均匀白色面光源。
- 偏光片:上下两层正交偏光片,仅允许特定偏振方向的光通过。
- 液晶层:无电场时,液晶分子扭曲90°,光可透过;施加电场后,分子竖直排列,光被阻挡。
- 彩色滤光片:每个像素由R/G/B三个子像素构成,通过组合产生全彩。
- TFT阵列:薄膜晶体管(Thin Film Transistor)控制每个子像素的电压,实现精确灰度。
关键概念: 液晶本身不发光,LCD是被动发光显示技术,必须依赖背光源。这与OLED(主动发光)有本质区别。
1.2 像素与分辨率
像素(Pixel)是构成数字图像的最小基本单元。在LCD中,一个像素由R、G、B三个子像素组成,通过三原色混色实现全彩显示。
分辨率指屏幕在水平和垂直方向上的像素数量,通常表示为 宽 × 高。常见分辨率规格如下:
| 分辨率名称 | 像素尺寸 (宽×高) | 总像素数 | 典型应用 |
|---|---|---|---|
| QVGA | 320 × 240 | 76,800 | 小尺寸嵌入式屏幕 |
| VGA | 640 × 480 | 307,200 | 早期显示器、工业屏 |
| WVGA | 800 × 480 | 384,000 | 7寸嵌入式LCD屏 |
| HD (720p) | 1280 × 720 | 921,600 | 手机、平板 |
| Full HD (1080p) | 1920 × 1080 | 2,073,600 | 显示器、电视 |
嵌入式调试要点: 驱动LCD前必须确认分辨率和像素时钟频率。例如800×480@60Hz的屏幕,像素时钟 ≈ 800×480×60×1.2 ≈ 27.6 MHz。SPI接口受限于时钟速率,通常只驱动QVGA或更小分辨率;大尺寸屏需使用RGB/MIPI/DSI接口。
1.3 色彩深度:RGB565 与 RGB888
色彩深度(Color Depth)表示每个像素用多少位二进制数来表示颜色。位数越多,可显示的颜色数量越大,色彩过渡越平滑。
嵌入式LCD驱动中最常用的两种色彩格式:
- RGB565:R占5位,G占6位,B占5位,共16位(2字节)。可显示 2^16 = 65,536 种颜色。存储效率高,适合资源受限的MCU。
- RGB888:R/G/B各占8位,共24位(3字节)。可显示 2^24 = 16,777,216 种颜色。色彩还原度更高,但需要更大的显存和带宽。
1.4 色彩深度选择对嵌入式系统的影响
在MCU驱动LCD时,色彩深度直接影响显存占用和传输带宽。以下为典型分辨率下的显存需求对比:
| 分辨率 | RGB565 显存 | RGB888 显存 | SPI传输量 (RGB565, 60fps) |
|---|---|---|---|
| 320 × 240 (QVGA) | 150 KB | 225 KB | ~9 MB/s |
| 800 × 480 (WVGA) | 750 KB | 1.125 MB | ~45 MB/s |
| 1280 × 720 (HD) | 1.8 MB | 2.7 MB | ~108 MB/s |
工程实践警告: 多数MCU内部SRAM仅几十KB到几百KB,无法直接缓存整帧RGB888数据。实际调试中常采用以下策略:
① 使用RGB565降低显存需求;
② 外挂SPI Flash或PSRAM作为帧缓冲;
③ 使用带显存的LCD驱动芯片(如ILI9341、ST7789),MCU仅需通过SPI写入指令和数据,由驱动芯片内部GRAM完成刷新。
① 使用RGB565降低显存需求;
② 外挂SPI Flash或PSRAM作为帧缓冲;
③ 使用带显存的LCD驱动芯片(如ILI9341、ST7789),MCU仅需通过SPI写入指令和数据,由驱动芯片内部GRAM完成刷新。
1.5 色彩深度与像素格式转换
在嵌入式开发中,经常需要在RGB565和RGB888之间进行转换。转换公式如下:
/* RGB888 → RGB565 转换(高位截断 + 保留高位) */
uint16_t rgb888_to_rgb565(uint8_t r, uint8_t g, uint8_t b) {
uint16_t r5 = (r >> 3) & 0x1F; // 8位 → 5位
uint16_t g6 = (g >> 2) & 0x3F; // 8位 → 6位
uint16_t b5 = (b >> 3) & 0x1F; // 8位 → 5位
return (r5 << 11) | (g6 << 5) | b5;
}
/* RGB565 → RGB888 转换(低位补0) */
void rgb565_to_rgb888(uint16_t rgb565, uint8_t *r, uint8_t *g, uint8_t *b) {
*r = ((rgb565 >> 11) & 0x1F) << 3; // 5位 → 8位
*g = ((rgb565 >> 5) & 0x3F) << 2; // 6位 → 8位
*b = (rgb565 & 0x1F) << 3; // 5位 → 8位
}
调试经验: 使用SPI驱动LCD时,字节序(Endianness)是常见陷阱。ILI9341等驱动芯片默认使用大端模式(MSB first),而STM32等MCU的SPI外设通常配置为MSB first。如果显示颜色错乱,首先检查SPI数据位序和像素数据字节顺序是否匹配。