1. LCD显示原理概述

1.1 液晶显示基本物理原理

液晶(Liquid Crystal, LC)是一种介于固态晶体与各向同性液体之间的特殊物质状态。在LCD(Liquid Crystal Display)中,液晶分子在电场作用下发生定向排列变化,从而控制背光透过率,实现像素亮暗显示。

核心工作流程:

  • 背光源:LED或CCFL提供均匀白色面光源。
  • 偏光片:上下两层正交偏光片,仅允许特定偏振方向的光通过。
  • 液晶层:无电场时,液晶分子扭曲90°,光可透过;施加电场后,分子竖直排列,光被阻挡。
  • 彩色滤光片:每个像素由R/G/B三个子像素构成,通过组合产生全彩。
  • TFT阵列:薄膜晶体管(Thin Film Transistor)控制每个子像素的电压,实现精确灰度。
关键概念: 液晶本身不发光,LCD是被动发光显示技术,必须依赖背光源。这与OLED(主动发光)有本质区别。
LCD液晶显示原理结构图 LCD液晶显示原理结构图 背光源 (LED / CCFL) 下偏光片 (0°) TFT阵列 + 液晶层 电场控制液晶分子扭转 → 控制光透过率 彩色滤光片 (R / G / B 子像素) 上偏光片 (90°) 出射光 → 人眼感知彩色图像 无电场:液晶扭转90° 有电场:液晶竖直排列 R+G+B 混合 → 全彩 每个子像素独立灰度控制

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 种颜色。色彩还原度更高,但需要更大的显存和带宽。
RGB565与RGB888色彩深度对比 RGB565 与 RGB888 色彩深度对比 RGB565 (16位 / 2字节) R [4:0] 5位 (32级) G [5:0] 6位 (64级) B [4:0] 5位 (32级) → 总颜色数: 32×64×32 = 65,536 RGB888 (24位 / 3字节) R [7:0] 8位 (256级) G [7:0] 8位 (256级) B [7:0] 8位 (256级) → 总颜色数: 256×256×256 = 16.7M RGB565:节省显存(每像素2字节),适合MCU驱动小尺寸屏 | RGB888:色彩丰富,适合高质量显示,需更大带宽

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完成刷新。

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数据位序和像素数据字节顺序是否匹配。