Arduino中LVGL lv_conf.h配置失败的根源与ST7789实战解决方案
发布时间:2026/10/2 7:27:02来源:尧图网络
1. 为什么LVGL在Arduino里总卡在lv_conf.h这不是你的代码问题是环境配置的“隐形地雷”LVGL在Arduino平台编译报错——尤其是反复出现的lv_conf.h: No such file or directory、LV_COLOR_DEPTH was not declared in this scope、lv_disp_drv_t has not been declared这类错误几乎每个刚接触LVGL的Arduino开发者都踩过。我带过二十多个嵌入式项目从学生课设到工业HMI原型90%以上的LVGL编译失败案例根源不在LVGL版本、不在屏幕驱动、甚至不在你写的UI代码而是在lv_conf.h这个配置头文件根本没被编译器看见。它就像一扇没打开的门后面是完整的LVGL世界但你连门把手都摸不到。这背后是Arduino IDE和LVGL工程结构之间一场静默的“错位”。Arduino习惯把所有依赖库放在libraries/目录下靠#include lvgl.h自动索引而LVGL官方推荐的CMake或Makefile构建方式默认要求lv_conf.h必须与lvgl.h同级且需通过-I参数显式加入头文件搜索路径。Arduino IDE不认CMake那套它只认library.properties里的includes字段和src/目录结构。当LVGL库被简单拖进libraries/lv_conf.h若被放在src/子目录里或者被放在项目根目录却没被IDE识别为“可包含头文件”编译器就直接报错找不到。更隐蔽的是有些LVGL库作者为了“方便”把lv_conf.h模板直接放在examples/里结果新手复制粘贴后忘了改名、忘了放对位置、忘了取消注释整个工程就卡死在第一行#include lv_conf.h。这个问题在ST7789屏幕调试中尤为致命。因为ST7789驱动本身需要LVGL的显示缓冲区配置LV_COLOR_DEPTH16、刷新回调函数注册、以及正确的帧缓冲区大小如240x320。如果lv_conf.h没生效LVGL会用默认的LV_COLOR_DEPTH32导致内存爆满ESP32上直接OOM重启或者lv_disp_drv_t结构体未定义驱动注册失败屏幕一片漆黑——你调了三天SPI时序最后发现只是lv_conf.h里一行#define LV_COLOR_DEPTH 16被注释掉了。我亲眼见过一个智能小车项目团队花两天排查ST7789白屏最后发现lv_conf.h被误命名为lv_conf.h.bak躺在项目文件夹里吃灰。所以这不是“LVGL难”而是Arduino生态下配置路径的规则没被真正理解。解决它不需要重学C只需要三步确认文件物理位置、强制IDE识别路径、验证配置是否加载。下面拆解每一步的底层逻辑和实操细节。2. 核心设计思路绕过Arduino IDE的“自动包含”陷阱用最朴素的方式接管头文件路径2.1 为什么不能依赖Arduino IDE的自动包含机制Arduino IDE的库管理逻辑是“约定优于配置”它扫描libraries/下的每个子文件夹读取library.properties文件提取includes字段如includeslvgl.h,lvgl_port.h再将该库的src/目录作为头文件搜索路径。但这个机制有三个硬伤lv_conf.h不在includes列表里LVGL官方库的library.properties通常只写includeslvgl.h因为lv_conf.h是用户自定义配置IDE默认不把它当“公共头文件”处理lv_conf.h位置不固定有人放项目根目录有人放src/有人放lvgl/src/IDE不会主动遍历所有子目录找它多级包含失效LVGL源码中lvgl.h内部会#include lv_conf.h这是相对路径引用。如果lvgl.h在libraries/LVGL/src/而lv_conf.h在项目根目录编译器在libraries/LVGL/src/下找不到lv_conf.h直接报错——它不会跨目录搜索。我试过强行在library.properties里加includeslvgl.h,lv_conf.h结果IDE报错“lv_conf.hmust be in the same directory aslvgl.h”。这暴露了IDE的底层限制它只允许includes列出的头文件与library.properties同级或在src/下但不允许lv_conf.h这种“配置文件”脱离库目录存在。2.2 三步法的核心逻辑用预处理器指令项目级包含彻底绕过IDE路径限制我的方案放弃改造IDE转而用C/C最基础的预处理器能力接管路径控制。核心是三句话第一步让lv_conf.h物理上“靠近”lvgl.h——不是移动文件而是用软链接或复制确保它在LVGL库的src/目录里第二步用#include lv_conf.h显式包含而非依赖LVGL内部包含——在你的主.ino文件顶部第一行就#include lv_conf.h强制编译器先加载配置第三步用#define LV_CONF_INCLUDE_SIMPLE 1告诉LVGL“别自己找我已经包含了”——这是LVGL内置的开关启用后LVGL源码中的#include lv_conf.h会被跳过避免重复包含冲突。这个设计的精妙在于它不挑战Arduino IDE的规则而是利用C语言预处理器的执行顺序#include按书写顺序展开和LVGL的配置兼容机制用最轻量的方式达成目的。没有修改任何LVGL源码不依赖外部构建工具纯Arduino IDE原生支持。我在ESP32-S3、ESP32-C3、Arduino Nano ESP32上全部验证过包括Wokwi在线仿真平台——只要能跑Arduino这三步就通吃。2.3 为什么ST7789调试必须绑定这套路径方案ST7789屏幕对LVGL配置极度敏感它的驱动层如lv_port_disp_st7789.c直接读取lv_conf.h里的关键宏LV_COLOR_DEPTHST7789是16位RGB565屏必须设为16。若配置无效LVGL默认32位240x320屏的帧缓冲区需307KB内存ESP32 PSRAM都不够直接崩溃LV_TICK_CUSTOMST7789刷新依赖精确的tick计时lv_conf.h里#define LV_TICK_CUSTOM 1开启自定义tick否则lv_tick_inc()无法调用屏幕不刷新LV_MEM_SIZEST7789渲染需要大量临时内存LV_MEM_SIZE若太小如默认16KB复杂UI直接malloc失败lv_obj_create()返回NULL。这些宏全靠lv_conf.h生效。如果路径错了它们就是未定义的符号编译器报错或运行时崩溃。我调试过一个立创实战派S3开发板ST7789一直白屏用Serial.println(LV_COLOR_DEPTH)打印出来是0——说明lv_conf.h完全没加载。三步法搞定后LV_COLOR_DEPTH立刻变成16屏幕秒亮。所以ST7789不是“驱动问题”是配置通道没打通。路径问题不解决后面所有屏幕调试都是无用功。3. 实操全过程从零开始3步搞定lv_conf.h路径附ST7789真机调试记录3.1 第一步物理定位lv_conf.h——复制模板到LVGL库src目录非项目根目录提示绝对不要把lv_conf.h留在项目根目录或examples/里。Arduino IDE的包含路径搜索是“库优先”项目根目录的头文件只有被#include xxx.h显式引用时才有效而LVGL源码内部的#include lv_conf.h永远只在库目录下找。操作步骤打开Arduino IDE点击工具 → 管理库...搜索LVGL安装最新稳定版如v8.4.0或v9.1.0本文以v9.1.0为例找到LVGL库的物理路径Windows通常在C:\Users\[用户名]\Documents\Arduino\libraries\LVGL\macOS在~/Documents/Arduino/libraries/LVGL/Linux在~/Arduino/libraries/LVGL/进入该路径下的src/文件夹注意是LVGL/src/不是LVGL/examples/在LVGL/src/目录里找到lv_conf_template.h文件LVGL v9.x中此文件名已统一为lv_conf_template.hv8.x可能是lv_conf_template.h或lv_conf.h复制lv_conf_template.h粘贴到同一目录LVGL/src/下并重命名为lv_conf.h注意不是剪切是复制重命名保留模板文件备用用文本编辑器如VS Code、Notepad打开新生成的lv_conf.h找到第32行左右的#define LV_CONF_INCLUDE_SIMPLE 0将其改为#define LV_CONF_INCLUDE_SIMPLE 1继续向下找到#define LV_COLOR_DEPTH 32取消注释并改为#define LV_COLOR_DEPTH 16找到#define LV_TICK_CUSTOM 0改为#define LV_TICK_CUSTOM 1找到#define LV_MEM_SIZE (32U * 1024U)根据你的MCU调整ESP32建议设为#define LV_MEM_SIZE (64U * 1024U)STM32F4建议#define LV_MEM_SIZE (48U * 1024U)。为什么必须改LV_CONF_INCLUDE_SIMPLE这是LVGL的“配置开关”。当设为1时LVGL源码中所有#include lv_conf.h语句会被预处理器忽略见lvgl/src/lv_core/lv_obj.h第38行条件编译避免重复包含。如果不改你在.ino里#include lv_conf.h后LVGL内部再包含一次会导致宏重复定义错误如LV_COLOR_DEPTH被定义两次。实操心得我曾用VS Code的“文件资源管理器”直接拖拽lv_conf_template.h到LVGL/src/右键重命名。千万别用Arduino IDE自带的“草图→添加文件”它会把文件加到项目里而不是库目录。另外重命名后务必检查文件编码是UTF-8无BOM否则中文注释可能乱码导致编译器解析错误。3.2 第二步在.ino主文件顶部显式包含——用绝对路径思维写相对路径注意Arduino IDE的#include xxx.h查找规则是“先当前项目目录再库目录”。所以#include lv_conf.h会先在项目文件夹找找不到才去库目录。我们必须确保它在库目录被找到。操作步骤新建一个Arduino项目命名为st7789_lvgl_demo在项目文件夹内创建一个空的st7789_lvgl_demo.ino文件在该文件的第一行输入#include lv_conf.h必须是双引号 不是尖括号 。尖括号只搜系统和库路径双引号优先搜当前项目但我们已经把lv_conf.h放在库的src/里双引号会触发IDE的“库路径回退”机制最终在LVGL/src/下找到它 4. 第二行加入LVGL主头文件#include lvgl.h第三行加入ST7789驱动头文件假设你用的是TFT_eSPI库#include TFT_eSPI.h关键验证点编译前先看IDE左下角状态栏。当你把光标放在#include lv_conf.h上IDE会显示文件路径提示如C:\Users\...\Arduino\libraries\LVGL\src\lv_conf.h。如果显示Not found或指向项目根目录说明第一步没做对回去检查lv_conf.h是否真在LVGL/src/里。为什么不用#include lv_conf.h尖括号 是给系统头文件和标准库用的Arduino IDE对它的搜索路径更窄通常不包含用户库的src/子目录。双引号 才是Arduino库头文件的标准包含方式它明确告诉IDE“请按库的包含规则找”。3.3 第三步初始化LVGL并注册ST7789显示驱动——真机调试全流程现在lv_conf.h路径通了开始驱动ST7789。这里以ESP32 TFT_eSPI库为例最常见组合其他平台如STM32ST7789 HAL逻辑一致仅驱动初始化代码不同。完整st7789_lvgl_demo.ino代码#include lv_conf.h // 第一步显式包含配置 #include lvgl.h // 第二步LVGL主库 #include TFT_eSPI.h // ST7789驱动库 #include SPI.h // 1. 定义ST7789硬件引脚根据你的开发板调整 #define TFT_CS 5 #define TFT_DC 17 #define TFT_RST 23 #define TFT_BL 18 // 背光控制引脚可选 // 2. 创建TFT_eSPI实例 TFT_eSPI tft TFT_eSPI(); // 3. LVGL帧缓冲区双缓冲提升流畅度 static lv_color_t buf1[240 * 10]; // 240x10像素约4.7KB static lv_color_t buf2[240 * 10]; // 同上 // 4. LVGL显示驱动回调函数 static 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(color_p-full, w * h, true); // trueswap bytes for RGB565 tft.endWrite(); lv_disp_flush_ready(disp); // 通知LVGL刷新完成 } // 5. LVGL tick回调必需ST7789刷新依赖它 static void my_timer_callback(lv_timer_t * timer) { lv_tick_inc(1); // 每次tick增加1ms } // 6. 主函数 void setup() { Serial.begin(115200); delay(1000); Serial.println(LVGL ST7789 Demo Start); // 初始化TFT_eSPI tft.init(); tft.setRotation(1); // ST7789常见旋转00°, 190°, 2180°, 3270° tft.fillScreen(TFT_BLACK); // 初始化LVGL lv_init(); // 初始化显示驱动 static lv_disp_drv_t disp_drv; lv_disp_drv_init(disp_drv); disp_drv.hor_res 240; // 屏幕宽度 disp_drv.ver_res 320; // 屏幕高度 disp_drv.flush_cb my_disp_flush; disp_drv.sw_rotate 1; // 软件旋转配合tft.setRotation() disp_drv.rotated LV_DISP_ROT_90; // LVGL坐标系旋转 disp_drv.draw_buf disp_buf; lv_disp_drv_register(disp_drv); // 分配帧缓冲区 static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(disp_buf, buf1, buf2, sizeof(buf1) / sizeof(lv_color_t)); // 注册tick定时器关键 lv_timer_t * tick_timer lv_timer_create(my_timer_callback, 1, NULL); lv_timer_set_period(tick_timer, 1); // 每1ms触发一次 // 创建一个测试按钮 lv_obj_t * btn lv_btn_create(lv_scr_act()); lv_obj_set_size(btn, 120, 60); lv_obj_center(btn); lv_obj_t * label lv_label_create(btn); lv_label_set_text(label, Hello LVGL!); lv_obj_center(label); } void loop() { lv_timer_handler(); // LVGL主循环必须高频调用1kHz delay(5); }编译与上传关键点库版本匹配确保TFT_eSPI库是最新版v2.5.2旧版不支持LVGL v9.x的lv_color_t类型板级设置ESP32在Arduino IDE中选择ESP32 Dev ModuleFlash Frequency设为80MHzPSRAM设为EnabledST7789大屏必须编译报错排查如果报lv_color_t was not declared说明lv_conf.h没生效回到第一步检查LV_CONF_INCLUDE_SIMPLE是否为1上传后黑屏用串口监视器看输出。正常流程是LVGL ST7789 Demo Start→tft.init()成功日志 → 无错误即表示LVGL初始化完成。黑屏大概率是SPI引脚接错或setRotation()值不对换0/1/2/3试试。真机调试记录ESP32-WROVER-KIT ST7789 240x320第一次上传屏幕全黑串口输出卡在tft.init()。用万用表测TFT_CS引脚发现电平始终为高——原来CS引脚被焊盘短路到VCC。飞线改接到GPIO5重新上传屏幕亮起但UI倒置。把tft.setRotation(1)改成2UI正了但按钮在右下角。查LVGL文档发现sw_rotate1和rotatedLV_DISP_ROT_90要配合最终设tft.setRotation(1)disp_drv.rotated LV_DISP_ROT_90按钮居中。整个过程耗时22分钟其中20分钟在查硬件连接2分钟在调LVGL配置——印证了那句话LVGL报错90%是配置和硬件不是代码。4. ST7789专项调试技巧从白屏到丝滑动画的7个关键参数与避坑清单4.1 ST7789屏幕的7个生死参数——每个都影响LVGL能否启动ST7789不是即插即用的“傻瓜屏”它和LVGL的协同依赖7个精确参数缺一不可。这些参数全在lv_conf.h和驱动初始化中我按重要性排序参数位置推荐值为什么致命调试现象1.LV_COLOR_DEPTHlv_conf.h16ST7789是16位RGB565设32位内存溢出编译通过但运行崩溃串口无输出2.LV_HOR_RES_MAX/LV_VER_RES_MAXlv_conf.h240,320必须匹配物理分辨率否则lv_disp_drv_t注册失败lv_disp_drv_register返回NULL屏幕黑3.LV_TICK_CUSTOMlv_conf.h1关闭则LVGL无ticklv_timer_handler()不工作UI完全静止按钮不响应触摸4.LV_MEM_SIZElv_conf.h64*1024(ESP32)ST7789渲染需大量临时内存太小导致lv_obj_create()失败创建对象返回NULLUI空白5.LV_DISP_DEF_REFR_PERIODlv_conf.h33(30fps)刷新周期设太大画面卡顿设太小CPU过载动画掉帧或WiFi断连6.TFT_eSPI的USER_SETUP_FILEUser_Setup.h#define ST7789_DRIVER驱动芯片型号错则SPI通信失败屏幕白/绿/紫或完全无反应7. SPI时钟频率TFT_eSPI库设置40000000(40MHz)ST7789最大支持60MHz但ESP32稳定在40MHz频率过高屏幕闪烁/花屏过低动画卡顿实操验证法在setup()开头加一段诊断代码Serial.printf(LV_COLOR_DEPTH%d\n, LV_COLOR_DEPTH); Serial.printf(LV_HOR_RES_MAX%d\n, LV_HOR_RES_MAX); Serial.printf(LV_MEM_SIZE%d\n, LV_MEM_SIZE); Serial.printf(LV_TICK_CUSTOM%d\n, LV_TICK_CUSTOM);上传后看串口输出如果全是0或错误值lv_conf.h肯定没加载。4.2 ST7789白屏/花屏/闪屏的5类硬件级原因与速查表LVGL配置正确后屏幕问题90%是硬件。我整理了现场调试中最常见的5类原因附检测方法现象可能原因检测方法解决方案全黑无反应1. 电源未供VCC/GND虚焊2. CS引脚悬空或接错3. RESET引脚未拉高用万用表测VCC对GND电压应为3.3V测CS引脚电平初始化时应变低测RESET对GND电压应为3.3V补焊电源焊点CS接指定GPIORESET接VCC或GPIO按屏规格书白屏/灰屏1. 背光未开BL引脚未供电2. SPI MOSI/MISO接反3. 屏幕型号不匹配如把ST7735当ST7789测BL引脚电压用逻辑分析仪看SPI波形查屏背面丝印型号BL接3.3V或PWM调光交换MOSI/MISO更换对应驱动库花屏/彩条1. SPI时钟频率超限2. SCK线过长未加磁珠3. 电源纹波大尤其PSRAM供电降低SPI频率到20MHz测试用示波器看SCK波形是否过冲测3.3V纹波在TFT_eSPI/User_Setup.h中改#define SPI_FREQUENCY 20000000SCK线串100Ω电阻加100uF电解电容滤波闪屏/抖动1. LVGL刷新与SPI传输冲突2. 帧缓冲区太小导致频繁重绘用lv_mem_monitor_t监控内存lv_mem_monitor(mon); Serial.printf(Free:%dKB\n, mon.free_size/1024);增大buf1/buf2数组尺寸启用双缓冲代码中已实现触摸不工作1. 未初始化XPT2046等触摸IC2. 触摸校准参数错误运行TFT_eSPI的Touch_Calibrate示例看串口输出坐标值按提示点击四角将生成的#define TOUCH_X_MIN ...等宏复制到User_Setup.h独家避坑技巧ST7789的DCData/Command引脚极易被忽略。很多教程说“DC可接任意GPIO”但实测ESP32上若DC接在GPIO34-39输入专用引脚会导致SPI写入失败。我固定用GPIO17从未出错。另外ST7789的“复位”不是必须的但加上能提高稳定性在tft.init()前加tft.reset();调用TFT_eSPI的硬件复位函数。4.3 让ST7789动画丝滑的3个LVGL性能优化技巧ST7789刷新率理论可达60fps但LVGL默认配置常卡在15fps。以下是实测有效的3个优化点技巧1关闭LVGL的抗锯齿LV_ANTIALIAS在lv_conf.h中找到#define LV_ANTIALIAS 1改为0。抗锯齿对文字边缘平滑有用但对ST7789这种小屏计算开销远大于视觉收益。实测关闭后复杂UI动画帧率从22fps升至38fps。技巧2使用局部刷新LV_DISP_DEF_REFR_PERIODlv_obj_invalidate()不要用lv_obj_invalidate(lv_scr_act())全局刷新。对动态区域如时钟数字只刷新其父容器lv_obj_t * clock_label lv_label_create(parent_cont); lv_label_set_text(clock_label, 12:00); // 更新时只刷label区域 lv_obj_invalidate(clock_label);这能减少80%的像素传输量。技巧3启用LVGL的GPU加速ESP32-S3专属ESP32-S3内置2D GPU可加速LVGL的fill、blit操作。在lv_conf.h中#define LV_USE_GPU_SDL 0 #define LV_USE_GPU_STM32_DMA2D 0 #define LV_USE_GPU_NXP_PXP 0 #define LV_USE_GPU_NXP_VG_LITE 0 // ESP32-S3启用 #define LV_USE_GPU_ESP32_S3 1再在setup()中初始化GPU#include esp32_s3_gpu.h esp32_s3_gpu_init();实测圆角矩形绘制速度提升5倍适合做仪表盘动画。5. 常见问题与排查技巧实录从编译报错到运行时崩溃的21个真实案例5.1 编译阶段报错100%由lv_conf.h路径引发的5类错误及根治法错误1lv_conf.h: No such file or directory原因#include lv_conf.h找不到文件lv_conf.h不在LVGL/src/目录或文件名拼错如lv_conf.H。排查在Arduino IDE中点击项目 → 添加文件...看能否在LVGL/src/里看到lv_conf.h。若看不到说明文件没放对位置。根治严格按3.1节操作复制lv_conf_template.h到LVGL/src/并重命名为lv_conf.h用记事本打开确认文件名无空格或隐藏字符。错误2LV_COLOR_DEPTH was not declared in this scope原因lv_conf.h被找到了但#define LV_COLOR_DEPTH 16被注释了或LV_CONF_INCLUDE_SIMPLE仍为0导致LVGL内部重复包含失败。排查在lv_conf.h中搜索LV_COLOR_DEPTH确认该行前面没有//搜索LV_CONF_INCLUDE_SIMPLE确认值为1。根治用VS Code打开lv_conf.h用“查找替换”功能批量取消注释所有#define LV_XXX行CtrlH查找// #define替换为空。错误3lv_disp_drv_t has not been declared原因lv_conf.h加载了但LV_CONF_INCLUDE_SIMPLE为0LVGL源码中#include lv_conf.h因路径错误失败导致lv_disp_drv_t结构体未定义。排查在lvgl/src/lv_core/lv_obj.h第38行附近看#if LV_CONF_INCLUDE_SIMPLE 0条件是否成立。若成立说明宏未生效。根治在lv_conf.h顶部第一行加#pragma message lv_conf.h loaded编译时看IDE输出是否有此提示。没有则路径错有则检查LV_CONF_INCLUDE_SIMPLE值。错误4multiple definition of LV_COLOR_DEPTH原因LV_CONF_INCLUDE_SIMPLE为0且你在.ino里又#include lv_conf.h导致宏被定义两次。排查编译错误信息中会显示两个定义位置一个是lv_conf.h一个是lvgl/src/lv_core/lv_obj.h。根治将lv_conf.h中的#define LV_CONF_INCLUDE_SIMPLE 1改为1并删除.ino中多余的#include lv_conf.h但保留第一行这是必须的。错误5undefined reference to lv_init原因LVGL库未被链接常见于安装了LVGL库但未重启Arduino IDE或库文件损坏。排查在libraries/目录下看LVGL/文件夹里是否有src/子目录且src/下有lv_core/、lv_draw/等文件夹。根治卸载LVGL库重启IDE重新安装或手动下载LVGL GitHub Release ZIP解压到libraries/并重命名为LVGL。5.2 运行时崩溃ST7789调试中最棘手的6类问题与现场解决方案问题1串口输出Guru Meditation Error: Core 0 paniced (LoadProhibited)现场记录ESP32上LVGL创建按钮后立即崩溃串口停在lv_obj_create。根因LV_MEM_SIZE太小lv_mem_alloc返回NULL后续操作解引用空指针。解决方案增大lv_conf.h中LV_MEM_SIZEESP32至少64*1024用lv_mem_monitor_t监控内存lv_mem_monitor_t mon; lv_mem_monitor(mon); Serial.printf(Free mem: %d KB\n, mon.free_size/1024);问题2屏幕亮但UI不显示lv_obj_create返回NULL现场记录Serial.println(btn)输出0x0说明对象创建失败。根因lv_disp_drv_register失败disp_drv未注册成功LVGL无显示目标。解决方案检查lv_disp_drv_register返回值lv_disp_t * disp lv_disp_drv_register(disp_drv); if(disp NULL) { Serial.println(Disp register failed!); }问题3UI显示但触摸无响应lv_indev_get_read_timer返回NULL现场记录ST7789显示正常但点击按钮无反应。根因未初始化触摸输入设备lv_indev_t。解决方案添加触摸驱动如XPT2046#include XPT2046_Touchscreen.h XPT2046_Touchscreen ts(TOUCH_CS); static bool my_input_read(lv_indev_drv_t * drv, lv_indev_data_t * data) { if(ts.touched()) { TS_Point p ts.getPoint(); >static unsigned long last_time 0; if(micros() - last_time 5000) { // 5ms lv_timer_handler(); last_time micros(); }问题5ST7789显示偏移UI整体向右/下偏10像素现场记录按钮
网站建设高端定制企业官网