2、LCD显示基础:液晶显示原理、常见LCD类型对比、分辨率与色彩深度概念
在嵌入式系统设计中,LCD(Liquid Crystal Display,液晶显示器)是人与机器交互最直观的窗口。无论是工业仪表、医疗设备、智能家电还是消费电子,LCD屏的选型与驱动能力直接决定了产品的用户体验和开发复杂度。本章作为从入门到精通的核心基础,将首先拆解液晶显示的基本物理原理,随后对字符型、图形点阵型、TFT和OLED四类主流显示器件进行系统性对比,最后深入解析分辨率与色彩深度这两个决定显示质量的关键参数。理解这些底层概念,是后续编写高效驱动代码、调试显示异常、优化UI效果的前提。
上图展示了本章的知识框架:液晶显示原理是根基,决定了驱动方式的选择;常见LCD类型对比帮助工程师在项目初期完成硬件选型;分辨率与色彩深度则是驱动配置和显存规划的核心依据。下面逐一展开。
2.1 液晶显示原理:从偏振光到像素点亮
2.1.1 核心原理:液晶分子的光学“开关”
液晶本身不发光,它像一个受电场控制的光阀。典型透射式LCD由三层核心结构组成:背光模组(提供白色光源)、液晶盒(夹在两片偏振片之间)、彩色滤光片(仅彩色TFT需要)。其工作过程如下:
- 起偏:背光发出的自然光经过第一片偏振片(起偏器)后,变为单一方向的线偏振光。
- 旋光:偏振光进入液晶层。液晶分子在无电场时呈螺旋状排列(扭曲向列相),将偏振方向旋转90°,从而顺利通过第二片偏振片(检偏器),该像素呈现亮态。
- 遮光:当在像素电极上施加电压时,液晶分子沿电场方向排列,失去旋光能力,偏振光无法通过检偏器,该像素呈现暗态。
- 灰度控制:通过调节施加电压的大小,可以控制液晶分子的扭转程度,从而连续控制透光率,形成不同灰度。
对于彩色TFT,每个像素由红、绿、蓝三个子像素构成,每个子像素前放置对应颜色的滤光片,通过控制三基色的灰度比例混合出1600万种颜色。
2.1.2 驱动方式:静态、无源矩阵与有源矩阵
根据电极寻址方式,LCD驱动分为三类:
| 驱动类型 | 电极结构 | 典型应用 | 优点 | 缺点 |
|---|---|---|---|---|
| 静态驱动 | 每个段一个独立电极 | 段码屏(计算器、电表) | 驱动简单,对比度高 | 引脚数随段数线性增加 |
| 无源矩阵(STN) | 行/列交叉寻址 | 老式手机屏、字符屏 | 成本低,引脚少 | 交叉串扰,响应慢 |
| 有源矩阵(TFT) | 每个像素一个薄膜晶体管 | 手机、显示器、工业HMI | 无串扰,响应快,灰度好 | 工艺复杂,成本高 |
在单片机项目中,字符型LCD(如1602)采用静态或简单多路复用驱动;图形点阵型(如12864)采用无源矩阵;而TFT彩屏则必须使用有源矩阵,且通常内置驱动IC(如ILI9341),MCU只需通过SPI或并行接口发送像素数据即可。
2.1.3 案例拆解:用逻辑分析仪观察LCD初始化时序
假设我们使用STM32F103通过SPI接口驱动一块1.8寸TFT(ST7735S)。初始现象:屏幕白屏,无任何显示。通过逻辑分析仪抓取SPI总线数据,发现MCU发送了初始化命令序列,但屏幕无响应。
分析过程:
- 检查硬件连接:确认RST引脚连接正确,且MCU在初始化前拉低RST至少10ms再拉高(复位时序)。
- 检查SPI模式:ST7735S要求SPI Mode 0(CPOL=0,CPHA=0),而代码中误配置为Mode 3,导致数据采样沿错误。
- 检查初始化命令:对比数据手册,发现漏发了SLPOUT(睡眠退出)命令后的120ms延时。
修复操作:修正SPI模式为Mode 0,在SLPOUT命令后增加120ms延时,重新上电后屏幕正常显示测试图案。
2.2 常见LCD类型对比:选型决策指南
2.2.1 四类显示器件核心参数对比
| 类型 | 分辨率范围 | 颜色 | 接口 | 功耗 | 视角 | 成本 | 典型驱动IC |
|---|---|---|---|---|---|---|---|
| 字符型 | 8x2 ~ 40x4字符 | 单色(黄绿/蓝白) | 并行4/8bit | 低(~2mA) | 窄(6点钟) | 极低 | HD44780 |
| 图形点阵型 | 128x64 ~ 240x128 | 单色/灰阶 | SPI/并行 | 低(~5mA) | 窄 | 低 | ST7920, SSD1306 |
| TFT彩色 | 320x240 ~ 1024x600 | 65K/262K/16.7M | SPI/RGB/MCU/DSI | 中(~50mA含背光) | 宽(IPS 80°) | 中高 | ILI9341, ST7789, NT35510 |
| OLED | 128x32 ~ 256x64 | 单色/黄蓝/彩色 | I2C/SPI | 极低(~1mA) | 超宽(>170°) | 中 | SSD1306, SH1106, SSD1331 |
2.2.2 选型判断流程
在项目选型时,建议按以下步骤决策:
- 第一步:确定显示内容需求。如果只需显示数字、英文字母和少量自定义符号,字符型LCD性价比最高;如果需要显示汉字、曲线或简单图形,选择图形点阵型;如果需要显示照片、复杂UI或视频,必须选TFT;如果追求超薄、高对比度且内容简单,OLED是优选。
- 第二步:评估MCU资源。TFT彩色屏需要较大的RAM做显存(320x240x2字节=150KB),普通单片机无法直接承载,必须使用带显存的驱动IC或选择SPI接口的慢速刷新模式。OLED和字符屏对MCU资源要求极低。
- 第三步:考虑环境约束。户外强光下,TFT需要高亮度背光(>800nit)或半透射屏;低温环境优先选OLED或宽温TFT;功耗敏感的可穿戴设备选OLED或反射式LCD。
2.2.3 常见误区与复盘
误区一:认为OLED一定比TFT好。实际上,OLED在大尺寸(>3寸)领域成本极高且寿命(蓝光衰减)不如TFT,小尺寸单色OLED才是其优势区间。
误区二:忽略背光功耗。TFT的功耗主要来自背光(通常占70%以上),在电池供电产品中,即使MCU进入睡眠,背光不关也会快速耗尽电量。设计时应增加背光控制引脚,并实现自动熄灭策略。
误区三:字符型LCD只能显示ASCII。通过自定义CGRAM(字符生成RAM),可以创建8个5x8点阵的自定义符号,用于显示简单的进度条或特殊图标。
2.3 分辨率与色彩深度:像素矩阵与数据量的权衡
2.3.1 分辨率:物理像素与驱动坐标
分辨率指LCD屏的物理像素数量,表示为“列数×行数”,例如128x64表示有128列、64行像素。对于字符型LCD,分辨率通常用“字符数×行数”表示,如16x2表示每行16个字符、共2行。分辨率决定了显示内容的精细度,但同时也决定了驱动数据量:
// 以128x64单色屏为例,一帧数据量计算
uint32_t frame_size = (128 * 64) / 8; // 每像素1bit,8像素/字节
// frame_size = 1024 字节
// 以320x240 RGB565 TFT为例,一帧数据量计算
uint32_t frame_size_tft = 320 * 240 * 2; // 每像素16bit = 2字节
// frame_size_tft = 153600 字节 = 150KB
从上述计算可见,TFT彩屏的一帧数据量是单色屏的150倍。这意味着:
- MCU需要更高的SPI时钟(至少40MHz)才能实现可接受的刷新率(>30fps)。
- 如果MCU内部RAM不足以存储整帧,必须采用局部刷新或行缓冲策略。
- 对于嵌入式GUI(如LVGL),分辨率越高,CPU负载越大,需要合理设计刷新区域。
2.3.2 色彩深度:从1bit到24bit
色彩深度(Color Depth)表示每个像素用多少位二进制数来表示颜色。常见格式如下:
| 格式 | 位数 | 颜色数 | 典型应用 | 存储需求(320x240) |
|---|---|---|---|---|
| Monochrome | 1 | 2 | 单色OLED/字符屏 | 9.6KB |
| Gray4 | 4 | 16灰阶 | 电子书/工业仪表 | 38.4KB |
| RGB332 | 8 | 256 | 低端彩屏 | 76.8KB |
| RGB565 | 16 | 65536 | 主流TFT | 153.6KB |
| RGB888 | 24 | 16.7M | 高端TFT/HDMI | 230.4KB |
在单片机驱动中,RGB565是最常用的折中方案:它用16位表示颜色,其中红色5位、绿色6位、蓝色5位。绿色多1位是因为人眼对绿色最敏感。RGB565可以直接用uint16_t变量表示,传输效率高,且颜色数量足以满足绝大多数工业UI需求。
2.3.3 案例拆解:优化TFT刷屏性能
背景:某产品使用STM32F407(168MHz)通过FSMC接口驱动4.3寸TFT(480x272,RGB565)。初始实现中,全屏填充纯色需要120ms,刷新一帧图片需要800ms,用户明显感觉卡顿。
关键指标:FSMC总线时钟=84MHz,理论带宽=84M×16bit=168MB/s,但实际有效带宽仅约30MB/s(受限于SRAM时序和MCU开销)。
分析过程:
- 检查代码,发现使用逐点写入方式:
LCD_FillPoint(x,y,color),每次写入都执行一次FSMC写操作,包含地址建立、数据建立等开销。 - 使用示波器测量FSMC写周期,发现单次写操作约需120ns,远高于理论值。
- 进一步分析,发现代码中在每次写操作后都读取LCD状态寄存器(读忙标志),增加了额外等待。
优化操作:
// 优化前:逐点写入
for (y = 0; y < 272; y++) {
for (x = 0; x < 480; x++) {
LCD_FillPoint(x, y, color);
}
}
// 优化后:设置窗口 + 连续写数据
LCD_SetWindow(0, 0, 479, 271); // 设置显示窗口
LCD_WriteData16(color); // 连续写入,无需重复设置地址
for (i = 0; i < 480 * 272; i++) {
LCD_WriteData16(color);
}
结果对比:优化后全屏填充时间从120ms降至18ms,性能提升6.7倍。进一步使用DMA传输数据,时间可降至8ms。
2.3.4 分辨率与色彩深度的工程权衡
在实际项目中,分辨率和色彩深度往往需要根据MCU性能、存储资源和刷新率要求进行权衡:
- MCU主频低于72MHz:建议分辨率不超过320x240,色彩深度不超过RGB565,否则刷新率会低于15fps。
- RAM小于32KB:无法使用TFT彩屏(需要外部显存或驱动IC自带显存),应选择单色图形点阵或OLED。
- 需要显示照片或渐变效果:必须使用RGB565以上色彩深度,且需要外部SPI Flash存储图片资源。
- 工业HMI(人机界面):推荐使用RGB565 + 局部刷新策略,避免整屏刷新造成的闪烁。