1. LCD显示原理与并行接口基础
各位同学,咱们今天聊聊LCD显示最核心的东西。说实话,我刚开始接触LCD驱动时,也被那些时序图搞得一头雾水。但后来发现,只要把原理搞清楚了,写驱动其实就是按部就班的事。
1.1 LCD液晶显示原理
LCD,说白了就是液晶显示器。液晶本身不发光,它像个百叶窗——通过电压控制液晶分子的扭转角度,让背光透过或者挡住,从而显示出不同的亮度。
我习惯把LCD想象成一个巨大的像素矩阵。每个像素由三个子像素组成:红、绿、蓝。通过控制这三个子像素的亮度比例,就能混合出我们想要的颜色。
关键概念:液晶本身不发光,需要背光源。我们驱动的其实是每个像素的透光率。
举个例子,一个像素显示白色,就是红绿蓝三个子像素全开;显示黑色,就是全关。中间的颜色,靠的是不同灰阶组合。ILI9341支持262K色,也就是每个颜色通道有64级灰度(6位),组合起来就是64×64×64=262,144种颜色。
1.2 像素与分辨率
分辨率这个概念,大家应该不陌生。320×240,意思是横向320个像素,纵向240个像素。我最早用的LCD就是320×240的,那时候觉得挺清晰。现在手机动不动就2K屏,但嵌入式系统里,320×240、480×320这些分辨率还是很常见的。
| 分辨率 | 常见尺寸 | 典型应用 |
|---|---|---|
| 320×240 (QVGA) | 2.4寸 - 3.2寸 | MP3播放器、小家电 |
| 480×320 (HVGA) | 3.5寸 - 4.0寸 | 工控手持设备 |
| 800×480 (WVGA) | 4.3寸 - 7.0寸 | 车载仪表、智能家居面板 |
这里有个坑,我提醒一下:分辨率越高,需要的显存就越大。320×240的屏幕,如果每个像素用16位色(RGB565),需要的显存是320×240×2 = 153,600字节。如果你的单片机RAM只有64KB,那就得考虑用SPI接口或者分块刷新的方式了。
1.3 并行接口(8080/6800)时序
好,重点来了。并行接口是LCD驱动里最经典的方式。主要有两种:8080模式和6800模式。
8080模式是Intel搞的,6800模式是Motorola搞的。现在市面上绝大多数LCD驱动芯片都支持8080模式,我个人也推荐大家用8080,因为时序更直观,写代码也顺手。
我的经验:ILI9341默认就是8080模式。如果你看到数据手册里提到IM[3:0]引脚配置,IM0=1、IM1=0、IM2=0、IM3=0就是8080 16位并行模式。我每次画板子都这么配,从来没出过问题。
8080并行接口的信号线,我列一下:
- CSX:片选,低电平有效。选中了才能通信。
- D/CX:数据/命令选择。低电平写命令,高电平写数据。
- WRX:写使能,上升沿锁存数据。
- RDX:读使能,上升沿读取数据。
- DB[15:0]:16位数据总线。8位接口只用DB[7:0]。
- RESX:复位,低电平复位芯片。
写一个命令的时序是这样的:
- 拉低CSX,选中芯片。
- 拉低D/CX,表示要写命令。
- 在数据总线上放命令字节。
- 拉低WRX,再拉高WRX,产生一个上升沿。
- 芯片在WRX上升沿锁存数据。
- 拉高CSX,结束通信。
写数据时,D/CX拉高就行,其他步骤一样。
注意:时序参数有严格限制。比如WRX低电平脉冲宽度,ILI9341要求至少15ns。我刚开始用STM32F103时,GPIO翻转速度不够快,导致WRX脉冲太宽,屏幕刷新率上不去。后来改用FSMC硬件接口,问题就解决了。
6800模式跟8080的区别在于:6800用E(使能)信号代替WRX和RDX,用R/W信号区分读写。说实话,现在用6800的场合很少了,大家了解就行。
1.4 驱动芯片简介:ILI9341与ST7789
市面上最常见的两款驱动芯片,就是ILI9341和ST7789。我两个都用过,说说区别。
| 特性 | ILI9341 | ST7789 |
|---|---|---|
| 最大分辨率 | 320×240 | 240×240 / 320×320 |
| 接口 | 8080 8/9/16/18位 + SPI | 8080 8/9/16/18位 + SPI |
| 颜色深度 | 262K (6-6-6) | 262K (6-6-6) |
| 内部RAM | 172,800字节 | 172,800字节 |
| 典型应用 | 2.4寸 - 3.2寸 | 1.3寸 - 1.8寸小屏 |
ILI9341是经典款,资料多,用的人多。ST7789是后起之秀,在小尺寸圆形屏上很流行。我去年做一个智能手表项目,用的就是ST7789驱动的1.3寸圆形LCD,效果不错。
两个芯片的指令集基本兼容,但有些细节不同。比如初始化序列,ILI9341需要发一堆寄存器配置,ST7789相对简单一些。我建议你拿到屏幕后,先看驱动芯片型号,再找对应的数据手册,别拿ILI9341的代码直接烧到ST7789上——我吃过这个亏,屏幕花了一片。