1、LCD驱动基础:LCD工作原理、接口类型与驱动芯片选型

各位同学,咱们今天聊聊LCD驱动的基础。说实话,我做了十几年嵌入式显示开发,踩过的坑比走过的路还多。但LCD驱动这块,只要你把基础打牢了,后面那些花里胡哨的优化技巧,其实都是水到渠成的事。

1.1 LCD是怎么工作的?

先说说原理。LCD,说白了就是液晶显示器。液晶本身不发光,它像个百叶窗——通过电压控制液晶分子的扭转角度,让背光透过或者挡住。

我刚开始接触LCD时,总觉得这东西很神秘。后来拆了几块屏才明白,每个像素背后其实就是一个微型电容。你给它充上电,液晶分子就偏转;电放掉了,它就恢复原状。嗯,这里要注意:液晶分子对电压变化有响应时间,这就是我们常说的「响应速度」。

具体来说,LCD显示一帧图像的过程是这样的:

  • 背光点亮——LED灯条提供白色光源
  • 偏光片过滤——把自然光变成单一方向的光
  • 液晶扭转——电压控制扭转角度,决定透光率
  • 彩色滤光片——红绿蓝三个子像素合成一个彩色点

你想想看,一个1024×600的屏幕,背后有60多万个像素点,每个点又要控制三个子像素。这数据量可不小。所以驱动芯片的作用,就是把CPU发来的图像数据,转换成液晶面板能识别的电压信号。

核心要点:LCD驱动本质上是「数模转换」——把数字的图像数据,变成模拟的液晶驱动电压。这个转换的精度和速度,直接决定了显示效果。

1.2 接口类型:RGB、MIPI、LVDS怎么选?

接口这块,我见过太多人栽跟头了。选错了接口,轻则改板子,重则整个项目推倒重来。咱们一个一个说。

RGB接口

RGB接口是最古老的,也是最简单的。它把红绿蓝三路数据并行传输,再加上行同步、场同步、像素时钟、数据使能这几个控制信号。

我记得2015年做一款工业手持终端,用的就是RGB接口的屏。当时觉得挺省事,直接连上就能亮。但后来发现一个问题:RGB接口的时钟频率跟分辨率成正比。1024×600@60Hz,像素时钟大概要50MHz左右。再往上走,比如1280×800,时钟就飙到70MHz以上了。这时候信号完整性就成了噩梦。

我的建议:分辨率在800×480以下,用RGB接口没问题。超过这个范围,老老实实上LVDS或者MIPI。

LVDS接口

LVDS,低压差分信号。说白了就是把并行数据转成串行,用差分线传输。好处很明显:抗干扰能力强,传输距离远,线数少。

我做过一个项目,手持终端要接一块7寸1024×600的屏。当时选了LVDS接口,4对差分数据线加一对时钟线,总共才10根线。要是用RGB接口,光数据线就得24根。你想想看,在手持设备那么小的空间里,少十几根线意味着什么?

LVDS的典型配置是这样的:

分辨率 数据通道数 时钟频率
800×480 4通道 30-40MHz
1024×600 4通道 50-65MHz
1280×800 4通道或8通道 70-85MHz
1920×1080 8通道 130-150MHz

MIPI DSI接口

MIPI是手机和平板上最主流的接口。它跟LVDS类似,也是差分串行传输,但协议更复杂,功能也更强大。

MIPI DSI有几个特点:

  • 双向通信——不仅能发数据,还能读寄存器
  • 低功耗模式——有高速模式和低功耗模式两种
  • 命令模式和视频模式——命令模式适合静态显示,视频模式适合动态画面

我曾经在一个项目里踩过MIPI的坑。当时选的屏是MIPI接口,但主控的MIPI控制器只支持1路数据通道。结果屏需要2路通道才能跑1080P@60Hz。最后没办法,只能降分辨率跑。所以选型时一定要看清楚主控支持几路MIPI通道。

避坑指南:MIPI的物理层对PCB布线要求很高。差分线要等长,阻抗要控制在100欧姆±10%。我曾经因为布线没注意,导致信号眼图闭合,屏幕闪得跟迪斯科一样。后来重新画了一版才解决。

1.3 驱动芯片选型

驱动芯片,也叫LCD Controller或T-CON。它负责把CPU发来的数据,转换成液晶面板需要的时序和电压。

选驱动芯片,我一般看这几个维度:

  1. 分辨率支持——芯片能支持的最大分辨率是多少
  2. 接口类型——输入接口和输出接口要匹配
  3. 色彩深度——16位、18位还是24位
  4. 内置GRAM——有没有帧缓存,多大容量
  5. 功耗——手持设备特别看重这个

我常用的几款驱动芯片:

芯片型号 最大分辨率 接口 内置RAM 典型应用
ILI9341 320×240 SPI/8位/16位并行 172800字节 小尺寸手持设备
ST7789 240×240 SPI/4线 172800字节 圆形屏、小屏
RA8875 800×480 8位/16位并行 无(需外部RAM) 工业手持终端
SSD1963 864×480 8位/16位并行 1215K字节 中尺寸屏
FT5x06 1920×1080 MIPI DSI 高清手持设备

选型时有个小技巧:先定屏,再定驱动芯片,最后定主控。很多人反过来,先选主控再找屏,结果发现主控的LCD控制器不支持想要的屏,那就尴尬了。

个人经验:做手持终端,我一般优先选带内置GRAM的驱动芯片。为什么呢?因为手持设备经常要进入低功耗模式,CPU可以休眠,但屏幕内容不能丢。有内置GRAM的芯片,CPU一睡,芯片自己刷新屏幕,功耗能降一大截。

1.4 初始化流程

最后说说驱动芯片的初始化。不管用哪款芯片,初始化流程都差不多:

// 伪代码:LCD驱动芯片初始化流程
void LCD_Init(void)
{
    // 1. 硬件复位
    LCD_RST_LOW();
    delay_ms(10);
    LCD_RST_HIGH();
    delay_ms(120);  // 等待芯片稳定
    
    // 2. 退出睡眠模式
    LCD_WriteCmd(0x11);  // Sleep Out
    delay_ms(120);
    
    // 3. 配置显示参数
    LCD_WriteCmd(0x36);  // 扫描方向设置
    LCD_WriteData(0x00); // 默认方向
    
    LCD_WriteCmd(0x3A);  // 像素格式设置
    LCD_WriteData(0x55); // 16位色(RGB565)
    
    // 4. 设置显示窗口
    LCD_WriteCmd(0x2A);  // 列地址设置
    LCD_WriteData(0x00);
    LCD_WriteData(0x00); // 起始列
    LCD_WriteData(0x01);
    LCD_WriteData(0x3F); // 结束列(320-1)
    
    LCD_WriteCmd(0x2B);  // 行地址设置
    LCD_WriteData(0x00);
    LCD_WriteData(0x00); // 起始行
    LCD_WriteData(0x00);
    LCD_WriteData(0xEF); // 结束行(240-1)
    
    // 5. 开启显示
    LCD_WriteCmd(0x29);  // Display On
    delay_ms(50);
}

这段代码看着简单,但每个芯片的时序要求都不一样。我建议你拿到芯片手册后,先看「Initial Sequence」这一章,照着写就行。千万别自己瞎猜时序参数,我吃过这个亏。

注意:复位后的延时一定要给够。有些芯片要求120ms以上,你给个50ms,屏幕可能就点不亮。我曾经因为赶进度,把延时从120ms改到80ms,结果屏幕死活不亮。查了两天才发现是延时不够。嗯,从那以后我再也不敢省这个延时了。

好了,LCD驱动基础就讲这么多。下一章咱们聊聊帧率控制和刷新策略,那才是真正考验功力的时候。