第一章 LCD驱动基础:从像素到屏幕
各位同学好,我是老张。做嵌入式这些年,我调试过的LCD屏少说也有几十种了。今天咱们就来聊聊LCD驱动最基础的那些事儿。别小看这些基础,我见过太多工程师上来就写代码,结果屏幕死活不亮,最后发现连接口类型都没搞对。
1.1 LCD到底是怎么工作的?
说白了,LCD就是一块夹心饼干。上下两层玻璃,中间夹着液晶材料。液晶这家伙有个怪脾气——给它加电压,它就扭转方向;不加电压,它就保持原样。扭转的时候,光线穿过去的角度就变了,于是我们就能看到不同的颜色。
嗯,这里要注意:LCD本身不发光。它背后需要背光模组,就像手电筒一样照亮屏幕。我刚开始做项目时,有次屏幕怎么调都不亮,折腾了半天才发现是背光电源没焊好。这种低级错误,谁还没犯过呢?
核心要点:LCD显示 = 背光 + 液晶偏转 + 彩色滤光片
1.2 像素与分辨率——屏幕的"细胞"
每个像素就是屏幕上的一个小点。一个像素由红、绿、蓝三个子像素组成。你想想看,我们看到的彩色画面,其实就是这三个子像素以不同亮度组合出来的。
分辨率呢?就是横向和纵向各有多少个像素。比如128×64,就是横向128个像素,纵向64个像素。我习惯用"点阵"来理解它——就像LED点阵屏一样,只不过LCD的每个点更小、更精细。
| 分辨率 | 像素总数 | 常见应用 |
|---|---|---|
| 128×64 | 8192 | 小尺寸手环、电子标签 |
| 240×240 | 57600 | 圆形智能手表 |
| 320×480 | 153600 | 入门级手机副屏 |
我的经验:选分辨率时别贪大。分辨率越高,刷屏越慢,功耗也越大。手环这种小设备,128×64其实够用了。我曾经有个项目非要上240×240,结果帧率惨不忍睹,最后还得降分辨率。
1.3 接口类型——SPI vs 8080
这是LCD驱动里最容易踩坑的地方。接口选错了,后面全白搭。
SPI接口
SPI接口,说白了就是串行通信。它只需要4根线:SCLK(时钟)、MOSI(数据输入)、MISO(数据输出,很多屏不用)、CS(片选)。
- 优点:引脚少,布线简单,适合小尺寸屏
- 缺点:速度慢,刷全屏时明显卡顿
- 适用场景:128×64这种小分辨率,或者对刷新率要求不高的场合
我个人习惯用SPI驱动小屏。为什么?因为省引脚啊!MCU就那么几个IO口,能省则省。不过要注意,SPI的时钟频率别设太高,我遇到过几次因为时钟太快导致数据错位的情况。
8080接口
8080接口是并行的,一次传8位或16位数据。它需要的数据线多,但速度快得多。
- 优点:速度快,刷屏流畅
- 缺点:占用引脚多,布线复杂
- 适用场景:大分辨率屏,或者需要动画效果的场合
避坑指南:我曾经在一个项目里用了8080接口,结果PCB布线时发现IO口不够用,最后只能改方案。所以选接口前,先数数你的MCU还剩多少引脚!
1.4 驱动时序——让屏幕"听话"的关键
不管是SPI还是8080,驱动LCD都需要遵循特定的时序。说白了,就是什么时候拉高CS,什么时候送数据,什么时候拉低WR。
我刚开始学LCD驱动时,总觉得时序图看着头疼。后来发现一个窍门:把时序图想象成交通信号灯。CS是总开关,SCLK是节奏,数据线就是路上的车。红灯停、绿灯行,节奏对了,数据就传过去了。
// SPI写命令的典型时序
void LCD_WriteCmd(uint8_t cmd) {
LCD_DC_LOW(); // 命令模式
LCD_CS_LOW(); // 选中芯片
SPI_WriteByte(cmd); // 发送数据
LCD_CS_HIGH(); // 释放芯片
}
// SPI写数据的典型时序
void LCD_WriteData(uint8_t data) {
LCD_DC_HIGH(); // 数据模式
LCD_CS_LOW(); // 选中芯片
SPI_WriteByte(data);// 发送数据
LCD_CS_HIGH(); // 释放芯片
}
小技巧:调试时序时,用逻辑分析仪抓波形。我每次调新屏都会先抓一下波形,确认时序对不对。这比盯着代码看有效多了。
1.5 初始化流程——让屏幕"醒过来"
LCD上电后不会自动显示,需要给它发一串初始化命令。这就像叫醒一个睡懒觉的人——先喊几声(复位),再告诉他该干什么(配置参数)。
典型的初始化流程是这样的:
- 硬件复位:拉低RST引脚,保持10ms以上,再拉高
- 发初始化命令序列:设置扫描方向、颜色格式、显示模式等
- 开显示:发命令让屏幕开始显示
- 清屏:把所有像素设为黑色或白色
嗯,这里有个坑要注意:不同厂家的LCD,初始化命令完全不同。我遇到过最离谱的一次,同一款屏换了批次,初始化序列就不一样了。所以拿到新屏,第一件事就是看数据手册,别偷懒。
总结一下:LCD驱动基础就三件事——理解像素原理、选对接口类型、写好初始化时序。这三步走稳了,后面刷屏、优化帧率才有基础。
好了,第一章就聊到这儿。下一章咱们会深入讲帧率优化,到时候我会分享一些实战中总结出来的"骚操作"。各位先把基础打牢,后面才能飞得起来。