各位开发者好!今天我要分享一篇关于ESP32驱动LCD屏幕的详细教程。作为嵌入式开发中的常见需求,掌握LCD驱动技术对我们的项目开发至关重要。本文将从零开始,一步步讲解如何初始化LCD、设置背光、显示颜色和图片,以及如何转换自定义图片格式。文章内容来源于实际项目经验,希望能给大家提供实用参考。
LCD初始化是整个显示过程的第一步,需要完成两个关键步骤:寄存器控制和背光控制。
// 包含LCD相关头文件
#include "lcd.h"
// LCD初始化函数
void lcd_init(void)
{
// 进行LCD寄存器初始化
// 配置各种参数如分辨率、颜色格式等
// ...具体初始化代码
}
// LCD显示开关函数 - 一级开关
void lcd_display_on(void)
{
// 打开LCD显示,激活寄存器控制
// ...具体代码
}
// LCD背光控制函数 - 二级开关
void lcd_backlight_on(void)
{
// 打开LCD背光,使显示内容可见
// ...具体代码
}
初始化LCD时需要注意两个关键点:
如果只开启寄存器而不开启背光,屏幕将无法正常显示内容。这就像电视机,即使打开了电源,不开启屏幕也是黑的。
初始化LCD后,如果不进行任何显示设置,屏幕会出现花屏现象,这是因为LCD内存中的随机数据被显示出来。要解决此问题,我们需要在开机后立即让屏幕显示某种颜色。
// 在main函数中调用
int main(void)
{
// 初始化IPHONEC
init_IPHONEC();
// 初始化IO扩展芯片
init_IO_expander();
// 初始化LCD
lcd_init();
// 显示纯白色,避免花屏
lcd_fill_color(0xFFFF); // 参数为16位RGB565格式的颜色值
// 打开LCD显示
lcd_display_on();
// 打开背光
lcd_backlight_on();
// 程序主循环
while(1) {
// 其他操作
}
return 0;
}
通过在初始化后立即填充一个纯色,可以有效避免花屏现象,提升用户体验。
让LCD显示单一颜色是最基础的显示功能,下面实现一个lcd_fill_color
函数:
// LCD填充颜色函数
void lcd_fill_color(uint16_t color)
{
uint16_t *color_buf = NULL;
uint32_t buf_size = LCD_WIDTH * 2; // 一行所需的内存大小(每像素2字节)
// 在内存中分配一行的缓冲区
color_buf = (uint16_t *)malloc(buf_size);
if (color_buf == NULL) {
return; // 内存分配失败,直接返回
}
// 填充缓冲区为指定颜色
for (int i = 0; i < LCD_WIDTH; i++) {
color_buf[i] = color;
}
// 逐行显示到LCD上
for (int y = 0; y < LCD_HEIGHT; y++) {
// 设置显示位置为该行起始点
lcd_set_window(0, y, LCD_WIDTH-1, y);
// 显示一行数据
lcd_write_data((uint8_t *)color_buf, buf_size);
}
// 释放内存
free(color_buf);
}
这个函数的工作原理是:
显示图片是LCD应用中最常见的需求,下面实现一个灵活的lcd_draw_picture
函数:
// LCD显示图片函数
void lcd_draw_picture(uint16_t x_start, uint16_t y_start,
uint16_t x_end, uint16_t y_end,
const uint16_t *pic)
{
uint32_t width = x_end - x_start + 1; // 图片宽度
uint32_t height = y_end - y_start + 1; // 图片高度
uint32_t pic_size = width * height * 2; // 图片总字节数
uint16_t *pic_buf = NULL;
// 在SPI RAM中分配内存
pic_buf = (uint16_t *)heap_caps_malloc(pic_size, MALLOC_CAP_SPIRAM);
if (pic_buf == NULL) {
return; // 内存分配失败,直接返回
}
// 复制图片数据到缓冲区
memcpy(pic_buf, pic, pic_size);
// 设置显示窗口
lcd_set_window(x_start, y_start, x_end, y_end);
// 显示图片数据
lcd_write_data((uint8_t *)pic_buf, pic_size);
// 释放内存
free(pic_buf);
}
这个函数的优势在于可以指定显示区域的起始和结束坐标,灵活地显示任意位置和大小的图片。通过参数传入图片数据指针,可以显示不同的图片内容。
要显示自定义图片,需要将图片转换为C语言数组格式。这里介绍一种实用工具和转换方法:
// 包含图片头文件
#include "my_picture.h"
// 在main函数中显示图片
int main(void)
{
// ...初始化代码
// 显示纯白色背景
lcd_fill_color(0xFFFF);
// 显示自定义图片(假设图片分辨率为320×240)
lcd_draw_picture(0, 0, 319, 239, gImage_my_picture);
// ...其他代码
}
在LCD显示中,我们通常使用RGB565颜色格式(每像素16位),而不是常见的RGB888(每像素24位)。下面详细介绍如何进行颜色转换:
以颜色值RGB(80,120,56)为例:
二进制表示:
转换为RGB565(取高位):
合并为16位值:0101001111000111
转换为16进制:0x53C7
高位在前的格式(LCD显示用):0xC753
可以使用截图工具获取屏幕上的颜色,然后通过计算器转换,或者使用在线RGB888转RGB565工具。
// 示例:使用不同颜色
lcd_fill_color(0xFFFF); // 白色
lcd_fill_color(0x0000); // 黑色
lcd_fill_color(0xF800); // 红色
lcd_fill_color(0x07E0); // 绿色
lcd_fill_color(0x001F); // 蓝色
下面是一个完整的LCD显示示例代码:
#include "lcd.h"
#include "my_picture.h"
// LCD填充颜色函数
void lcd_fill_color(uint16_t color)
{
// ...函数实现(见上文)
}
// LCD显示图片函数
void lcd_draw_picture(uint16_t x_start, uint16_t y_start,
uint16_t x_end, uint16_t y_end,
const uint16_t *pic)
{
// ...函数实现(见上文)
}
int main(void)
{
// 初始化外设
init_IPHONEC();
init_IO_expander();
// 初始化LCD
lcd_init();
// 填充白色背景
lcd_fill_color(0xFFFF);
// 打开LCD显示
lcd_display_on();
// 打开背光
lcd_backlight_on();
// 显示自定义图片
lcd_draw_picture(0, 0, 319, 239, gImage_my_picture);
while(1) {
// 主循环
}
return 0;
}
本文详细介绍了ESP32驱动LCD的完整过程,从初始化到显示颜色和图片。掌握这些基础后,你可以进一步探索:
对于LCD显示项目,使用Git进行版本控制非常有必要:
# 初始化Git仓库
git init
# 添加所有文件到暂存区
git add .
# 提交更改
git commit -m "初始化LCD显示项目"
# 如需连接远程仓库
git remote add origin https://github.com/yourusername/esp32-lcd-project.git
git push -u origin master
对于需要在文档中展示的图片,建议使用图床:

这样可以减小项目体积,加快文档加载速度。
如果你对ESP32 LCD开发有任何问题,欢迎在评论区留言交流!