4、常用LCD控制器芯片:HD44780、ST7735、SSD1306、ILI9341等芯片的功能框图、寄存器与指令集概览

LCD显示屏的驱动方式千差万别,但归根结底都离不开一颗专用的控制器芯片。无论是字符型液晶、TFT彩色屏还是OLED单色屏,其内部都集成了显示RAM、时序发生器、指令译码器和驱动输出级。本章选取四款最具代表性的控制器——HD44780(字符型)、ST7735(小尺寸TFT)、SSD1306(OLED单色/双色)、ILI9341(大尺寸TFT),从功能框图、寄存器结构、指令集三个维度进行横向拆解,帮助读者建立“芯片选型→寄存器操作→指令序列”的完整知识框架。

四款LCD控制器芯片功能框图与接口对比 MCU主控 GPIO/SPI/I2C/FSMC DB4~DB7/SPI RS/RW/E/CS/DC VDD/VSS/V0 HD44780 字符型LCD DDRAM 80×8位 CGROM/CGRAM IR/DR 指令寄存器 4/8位并行接口 ST7735 TFT 160×128 GRAM 262K色 SPI/8080接口 窗口地址控制 RGB565/RGB444 SSD1306 OLED 128×64 GDDRAM 1KB I2C/SPI/并行 页寻址/水平寻址 128×64 单色 ILI9341 TFT 320×240 GRAM 16.7M色 SPI/8080/6800 Gamma校正 RGB565/888 关键特性对比 芯片 分辨率 接口 寻址方式 典型应用 HD44780 16×2/20×4字符 4/8位并行 行/列地址 仪表盘、计算器 ST7735 160×128 SPI/8080 窗口+坐标 智能手环、MP3 SSD1306 128×64 I2C/SPI 页/水平/垂直 可穿戴、医疗 ILI9341 320×240 SPI/8080/6800 窗口+坐标 HMI、手持设备

上图展示了四款芯片与MCU之间的典型连接关系以及各自的核心存储结构。从工程角度看,选择控制器芯片的首要依据是显示介质类型(字符/点阵/OLED/TFT)和分辨率,其次才是接口形式与功耗要求。下面逐一深入分析每款芯片的内部架构与指令体系。

4.1 HD44780:字符型LCD的经典控制核心

4.1.1 功能框图与存储结构

HD44780是字符型液晶模块(如1602、2004)内部最常用的控制器。其功能框图可划分为三大存储区:DDRAM(显示数据RAM,容量80×8位)、CGROM(字符发生器ROM,固化192种字符)、CGRAM(字符发生器RAM,允许用户自定义8个5×8点阵字符)。CPU通过8位数据总线(或4位模式)与IR(指令寄存器)和DR(数据寄存器)交互,RS引脚选择寄存器类型(RS=0选IR,RS=1选DR),RW引脚控制读写方向,E引脚作为使能信号。

寄存器RS状态功能说明地址范围
IR(指令寄存器)0存放指令码,如清屏、光标移位—
DR(数据寄存器)1存放待写入DDRAM/CGRAM的数据—
DDRAM—存储当前显示的字符编码0x00~0x4F(两行)
CGRAM—用户自定义字符点阵0x00~0x3F(8个字符)

4.1.2 指令集概览与操作时序

HD44780共有11条指令,最常用的包括:清屏(0x01)、光标归位(0x02)、显示开关(0x08~0x0F)、功能设置(0x20~0x3C)。其中功能设置指令的DL位决定接口宽度(DL=1为8位,DL=0为4位),N位决定显示行数(N=1为两行),F位决定字体(F=1为5×10点阵)。初始化流程必须严格遵循时序:上电后等待40ms以上,依次发送功能设置、显示开关、清屏指令,每次指令执行后需检查忙标志BF或延时足够时间。

实战场景:4位模式驱动1602液晶

在嵌入式项目中,为节省GPIO资源,常采用4位数据模式。此时DB4~DB7作为数据线,DB0~DB3悬空。初始化时需分两次发送高4位和低4位:

// 伪代码示例:4位模式初始化序列
void LCD_Init_4bit(void) {
    delay_ms(50);              // 上电等待
    LCD_WriteNibble(0x03);     // 第一次:功能设置高4位
    delay_ms(5);
    LCD_WriteNibble(0x03);     // 第二次
    delay_us(150);
    LCD_WriteNibble(0x03);     // 第三次
    delay_ms(5);
    LCD_WriteNibble(0x02);     // 切换到4位模式
    LCD_WriteCmd(0x28);        // 功能设置:4位、两行、5×8
    LCD_WriteCmd(0x0C);        // 显示开、光标关
    LCD_WriteCmd(0x01);        // 清屏
    delay_ms(2);
}

该序列的关键在于前三次发送0x03是为了让控制器在未知接口宽度时仍能正确识别,这是HD44780特有的“唤醒”时序。

常见误区:很多初学者在4位模式下直接发送0x28,导致控制器仍处于8位模式而无法正确解析。务必先通过三次0x03和一次0x02完成模式切换,再发送完整指令。

4.2 ST7735:小尺寸TFT彩屏的SPI驱动方案

4.2.1 内部架构与GRAM组织

ST7735是驱动1.8英寸(160×128)TFT彩屏的主流控制器,内部集成262K色GRAM(共160×128×18位)。其功能框图包含:SPI接口(支持3线/4线模式)、8080并行接口、窗口地址控制器(用于定义写入区域)、RGB-to-Dot转换器(将RGB565数据转换为面板像素格式)。芯片通过CASET(列地址设置)和RASET(行地址设置)指令定义写入窗口,随后连续写入像素数据即可自动递增地址。

4.2.2 寄存器与指令集要点

ST7735的指令集分为系统指令和显示指令两大类。核心指令包括:SLPOUT(0x11,退出睡眠)、DISPON(0x29,开启显示)、CASET(0x2A)、RASET(0x2B)、RAMWR(0x2C,写显存)。初始化时需按顺序发送约20条设置指令,包括电源控制、帧率设置、Gamma校正等。其中MADCTL(0x36)指令用于控制扫描方向和RGB/BGR顺序,是调整屏幕旋转方向的关键。

经验提醒:ST7735的初始化序列因不同模组厂商而异,建议从模组数据手册中直接复制官方初始化数组,不要随意修改参数顺序。若屏幕出现颜色反相或镜像,优先检查MADCTL的RGB位和扫描方向位。

4.2.3 案例拆解:SPI写入RGB565像素

假设需要在一张160×128的ST7735屏幕上填充红色背景,操作流程如下:

  1. 发送SLPOUT并延时120ms;
  2. 发送DISPON开启显示;
  3. 设置窗口:CASET(0,159),RASET(0,127);
  4. 发送RAMWR指令;
  5. 连续发送160×128×2字节的RGB565数据(红色为0xF800)。

实际工程中,若使用SPI时钟为10MHz,整屏刷新约需160×128×2×8/10M≈32ms,可满足一般UI刷新需求。若需提升帧率,可考虑使用RGB接口或降低色彩深度。

4.3 SSD1306:OLED单色屏的I2C/SPI驱动

4.3.1 显示RAM与页寻址机制

SSD1306驱动128×64 OLED屏,内部GDDRAM共1KB(128×64/8)。其寻址方式有三种:页寻址模式(默认,每页8行)、水平寻址模式(连续递增列)、垂直寻址模式(列递增后行递增)。页寻址模式下,屏幕被分为8页(PAGE0~PAGE7),每页对应8行像素,写入数据时需先设置页地址(0xB0~0xB7)和列地址(低4位+高4位)。

4.3.2 指令集分类与常用命令

SSD1306指令分为基本指令和绘图指令。常用命令包括:设置对比度(0x81)、设置整个显示开启/关闭(0xA4/0xA5)、设置正常/反色显示(0xA6/0xA7)、设置显示偏移(0xD3)。初始化时需配置时钟分频、复用比、电荷泵等参数。特别要注意电荷泵指令(0x8D),必须设置为0x14才能开启内部DC-DC,否则屏幕无法点亮。

实战场景:I2C地址冲突与解决

SSD1306的I2C地址由SA0引脚决定,默认地址为0x3C(SA0=0)或0x3D(SA0=1)。当同一总线上挂载多个OLED时,可通过SA0引脚区分。若使用软件模拟I2C,需注意时序要求:起始条件后发送控制字节(0x00表示后续为命令,0x40表示后续为数据)。

// I2C写命令示例
void OLED_WriteCmd(uint8_t cmd) {
    I2C_Start();
    I2C_SendByte(0x3C << 1);  // 设备地址+写
    I2C_SendByte(0x00);       // 控制字节:命令
    I2C_SendByte(cmd);
    I2C_Stop();
}

风险提示:OLED屏长期显示静态画面会产生“烧屏”现象。工程中应定期切换显示内容或使用屏幕保护逻辑,避免同一像素长时间点亮。

4.4 ILI9341:大尺寸TFT的进阶驱动

4.4.1 功能框图与色彩深度

ILI9341驱动2.4~3.5英寸TFT屏(320×240),支持16.7M色(RGB888)和262K色(RGB565)。其内部GRAM容量为320×240×18位,约1.38Mbit。芯片支持SPI、8080并行、6800并行三种接口,其中8080并行接口在高速刷新时优势明显。功能框图包含:输入接口控制器、GRAM读写仲裁、Gamma校正电路、背光控制等模块。

4.4.2 寄存器与指令集特点

ILI9341的指令集比ST7735更丰富,包含电源序列控制(0xC0~0xC8)、Gamma校正(0xE0/0xE1)、像素格式设置(0x3A)等。其中0x3A指令用于设置RGB接口的像素格式(0x55为RGB565,0x66为RGB666)。与ST7735类似,ILI9341也采用CASET/RASET/RAMWR窗口写入机制,但支持更大的地址范围(0~239行,0~319列)。

4.4.3 案例拆解:RGB565与RGB888的转换

在嵌入式GUI开发中,经常需要处理不同色彩格式的转换。例如将摄像头输出的RGB888转换为ILI9341的RGB565格式:

uint16_t RGB888_to_565(uint8_t r, uint8_t g, uint8_t b) {
    return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}

该转换会损失低3位色彩信息,但在LCD显示中肉眼几乎无法察觉。若追求更高色彩精度,可选用RGB666模式,但需要更多传输带宽。

4.5 四款芯片的横向对比与选型决策

对比维度HD44780ST7735SSD1306ILI9341
显示类型字符点阵TFT彩色OLED单色TFT彩色
最大分辨率80字符160×128128×64320×240
接口方式4/8位并行SPI/8080I2C/SPI/并行SPI/8080/6800
色彩深度单色262K单色16.7M
RAM容量80×8位160×128×18128×64×1320×240×18
典型功耗低中极低高
驱动难度简单中等简单较复杂

选型时需综合考虑显示内容复杂度、MCU资源、功耗预算和成本。例如,智能手表表盘需要显示丰富色彩,应选择ST7735或ILI9341;而血糖仪只需显示数字和简单图形,SSD1306的OLED在阳光下可读性和低功耗优势明显。

总结复盘:四款芯片虽然指令集不同,但核心操作逻辑一致——先初始化(设置显示参数),再设置写入窗口(或地址),最后写入像素/字符数据。掌握这一通用流程后,即使遇到新型号控制器,也能快速上手。建议读者在开发板上分别跑通四款芯片的“点亮屏幕+显示固定图案”实验,对比各自的初始化时序差异。