写在前面:本文是学习lvgl前的移植过程,用来当作笔记,复习查阅方便,如有侵权,联系删除。
另外本人也是初学者,有很多理解不透彻的或者错误的理解,希望大家多多批评指针,一起进步。
一. 硬件接线图
开发板使用的是ESP-WROOM-32,显示屏使用的是优信电子购买的1.3寸240x240的TFT七针显示屏。
显示屏 | ESP32 |
GND(接地) | GND |
VCC(接3.3V) | VCC |
SCL(SPI时钟引脚) | D18 |
SDA(SPI MOSI引脚) | D23 |
RES(复位引脚) | D19 |
DC(命令 数据选择) | D5 |
BLK(背光) | D21(实测此引脚接不接好像无所谓) |
二. 下载并配置TFT_eSPI
2.1 新建ESP32项目
2.2 下载TFT_eSPI库
选择最新版本添加到项目中。
选择刚才创建的项目,点Add。
然后TFT_eSPI库就成功的下载到项目中了。
2.3 修改TFT_eSPI配置
打开项目的.pio\libdeps\esp32dev\TFT_eSPI\User_Setup.h文件。
取消注释掉自己显示屏使用的驱动,其他驱动全部注释。这里使用的是ST7789
显示屏宽高选择 240x240
根据接线表设置引脚宏定义
设置SPI速率
至此已经配置完成。
2.4 运行示例
在TFT_eSPI中提供了很多示例程序,这里选择一个时钟示例程序,由于示例程序是320x240的所以显示屏显示不全。将示例程序中的代码全部复制到main文件下,编译,下载即可。
2.5. 可能遇到的问题
1. include <spi.h>报错
在platformio.ini中添加lib_ldf_mode = deep+可解决。
三. 下载并配置lvgl
2.1 下载lvgl库
这里使用的是V8.3.9
2.2 修改lvgl配置
在lvgl库里将lvgl_conf_template.h复制一份并重命名为lvgl_conf.h。
然后打开lvgl_conf.h把如图所示0改成1。lvgl库已经配置完成。
2.3 示例程序
在main.cpp文件中复制下面的代码,编译下载,测试是否正常运行。此代码是网上找的,如有侵权,联系删除。
#include <lvgl.h>
#include <TFT_eSPI.h>
static lv_disp_draw_buf_t draw_buf; //定义显示器变量
static lv_color_t buf[TFT_WIDTH * 10]; //定义刷新缓存
TFT_eSPI tft = TFT_eSPI();
/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
tft.startWrite(); //使能写功能
tft.setAddrWindow(area->x1, area->y1, w, h); //设置填充区域
tft.pushColors((uint16_t *)&color_p->full, w * h, true); //写入颜色缓存和缓存大小
tft.endWrite(); //关闭写功能
lv_disp_flush_ready(disp); //调用区域填充颜色函数
}
void setup()
{
tft.init(); //初始化
tft.setRotation(0); //屏幕旋转方向(横向)
lv_init();
lv_disp_draw_buf_init(&draw_buf, buf, NULL, TFT_WIDTH * 10);
/*Initialize the display*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
/*Change the following line to your display resolution*/
disp_drv.hor_res = TFT_WIDTH;
disp_drv.ver_res = TFT_HEIGHT;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf = &draw_buf;
lv_disp_drv_register(&disp_drv);
/*获取LVGL版本信息*/
String LVGL_Arduino = "Hello LVGL! ";
LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch(); //版本
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, LVGL_Arduino.c_str());
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); //居中显示
}
void loop()
{
lv_timer_handler(); /* let the GUI do its work */
delay(5);
}