ESP32 lvgl踩坑,动画问题(GC9A01非触摸屏利用串口控制)

您所在的位置:网站首页 window10有触摸屏吗 ESP32 lvgl踩坑,动画问题(GC9A01非触摸屏利用串口控制)

ESP32 lvgl踩坑,动画问题(GC9A01非触摸屏利用串口控制)

2023-06-03 05:08| 来源: 网络整理| 查看: 265

        在ESP32上学习lvgl,遇到了一个问题困扰了很久,目前已解决,现在把这个坑跟大家分享一下,希望能帮助到大家~

        手里有一块GC9A01的非触摸原屏,在学习lvgl的时候,想要实现动画效果如切屏,按钮操作,但是手头又没有按键,于是考虑使用串口进行事件发送,从而进行控制。在实际使用中发现,时间可以发送接收,但是切换动画不进行,即图像仅显示1帧。

        废话不多说上代码

#include #include #include 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); //调用区域填充颜色函数 } /*初始化LVGL*/ void mylvglinit(){ 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); } /*GUI设置*/ static lv_obj_t* label; char rev; void label_event(lv_event_t *e);//回调函数声明 void gui() { label = lv_label_create(lv_scr_act()); // 创建label lv_label_set_text(label, "Close"); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); // label居屏幕中心对齐 lv_obj_add_event_cb(label,label_event,LV_EVENT_ALL,NULL); } /*回调函数*/ void label_event(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); // 获取当前部件(对象)触发的事件代码 if(code == LV_EVENT_CLICKED) { lv_label_set_text(label, "Open"); } } void setup() { tft.init(); //初始化 mylvglinit(); //LVGL初始化 gui(); Serial.begin(115200); } void loop() { lv_timer_handler(); /* let the GUI do its work */ delay(5); if(Serial.available()) { rev=Serial.read(); Serial.print("rev="); Serial.println(rev); if(rev == 'a') { //手动发送事件到对象 lv_event_send(label,LV_EVENT_CLICKED,NULL); Serial.println("send!!!"); } } }

        利用串口发送指令,接收到字符‘a’时,向标签label发送事件lv_event_send(label,LV_EVENT_CLICKED,NULL),从而使标签从Close变成Open。

请检查上述代码是否有问题?????

我检查了三天都没找到问题所在。。。。。

如果你也没找到,恭喜你!

它就是没问题!!!!

        问题的所在不在这,而是在这里,我没有时钟自定义打开!!!!!一定要将LV_TICK_CUSTOM设置为1!!!!!!!

LV_TICK_CUSTOM 1 !!!!!!!

        在ESP32移植lvgl教程中,很多教程只是将lv_demo_conf_template.h改成lv_conf.h,然后将第一个"if 0"改成"if 1"就完事了,我也是看了这些教程改完就开始上手自己搞了,据后来发现问题一直解决不了,最后从动画角度尝试,找到了解决方法。

        本人只是个刚刚学学ESP32的小小萌新,可能这个问题看来很幼稚,但的确困扰了我很久,希望在这里发出来可以帮助到童谣遇到该问题的朋友,最后附上效果图。

最后祝愿大家远开心,永远保持一颗积极探索的心~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3