LVGL中读取外部变量的值

在LVGL中,如果外部有一个变量值A,那么我该用哪个函数去读取这个变量,并且让这个变量的值通过文本显示在屏幕上

在 LVGL 中,您可以通过使用 LVGL 的对象类型 lv_label 来显示文本。要将外部变量的值显示为文本,您需要使用 C++ 中的字符串格式化函数(如 sprintf)将其转换为字符串,然后将其设置为 lv_label 的文本内容。

下面是示例代码:

// 假设外部有一个变量 int A = 123;
int A = 123;

// 创建一个 label 对象
lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
lv_label_set_long_mode(label, LV_LABEL_LONG_BREAK); /*自动换行*/
lv_obj_set_width(label, 200);

// 将变量 A 转换为字符串
char text[32];
sprintf(text, "A 的值为 %d", A);

// 将字符串设置为 label 的文本内容
lv_label_set_text(label, text);

// 将 label 对象显示在屏幕上
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);

这段代码首先将外部变量 A 的值转换为字符串,然后将其设置为 label 对象的文本内容。最后,将 label 对象显示在屏幕中央。

请注意,上述示例代码假设您已经创建了 LVGL 的画布。如果您还没有创建画布,请参阅 LVGL 文档,了解如何创建画布和其他 LVGL 对象。

  • 文章:LVGL库实现的简单实时时钟表盘示例代码 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: LVGL移植中的 五、LVGL完整初始化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int main(int argc,char *argv[])
    {
        /*LittlevGL init*/
        lv_init();
        
       /*Linux frame buffer device init*/
        fbdev_init();
    
       /*A small buffer for LittlevGL to draw the screen's content*/
        static lv_color_t buf[DISP_BUF_SIZE];
        static lv_color_t buf1[DISP_BUF_SIZE];
    
       /*Initialize a descriptor for the buffer*/
        static lv_disp_draw_buf_t disp_buf;
        lv_disp_draw_buf_init(&disp_buf, buf, buf1, DISP_BUF_SIZE);
    
       /*Initialize and register a display driver*/
        static lv_disp_drv_t disp_drv;
        lv_disp_drv_init(&disp_drv);
        disp_drv.draw_buf   = &disp_buf;
        disp_drv.flush_cb   = fbdev_flush;
        disp_drv.hor_res    = 1024;
        disp_drv.ver_res    = 600;
        lv_disp_drv_register(&disp_drv);
        
        lv_indev_drv_t indev_drv;
        lv_indev_drv_init(&indev_drv);
    
        indev_drv.type = LV_INDEV_TYPE_POINTER;
        indev_drv.read_cb = (void (*)(struct _lv_indev_drv_t *, lv_indev_data_t *))evdev_read; // defined in lv_drivers/indev/evdev.h
        lv_indev_t *lv_indev = lv_indev_drv_register(&indev_drv);
        if (!lv_indev)
        {
            printf("lv_indev rregister error %d \r\n", __LINE__);
            return 0;
        }
        
       /*Handle LitlevGL tasks (tickless mode)*/
        while(1) {
            lv_task_handler();
            usleep(5000);
        }
        return 0;
    }
    
  • 您还可以看一下 姜景隆老师的5个小时上手嵌入式操作系统课程中的 LVGL简介小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的关键是如何在LVGL中读取外部变量的值并在屏幕上显示。首先,需要对输入设备进行初始化并注册,然后使用回调函数来读取外部变量的值并将其显示在LVGL的控件上。

    以下是实现这个功能的步骤和代码示例:

    1. 在LVGL的初始化代码中添加注册输入设备的代码:
    lv_indev_t *indev_encoder;
    int32_t encoder_diff;
    lv_indev_state_t encoder_state;
    
    void lv_port_indev_init(void) {
        lv_indev_drv_t indev_drv;
    
        lv_indev_drv_init(&indev_drv);
        indev_drv.type = LV_INDEV_TYPE_ENCODER;  // 设备类型为编码器
        indev_drv.read_cb = encoder_read;  // 回调函数
        indev_encoder = lv_indev_drv_register(&indev_drv);
    }
    
    1. 在回调函数encoder_read中实现读取外部变量的逻辑,并将其值更新到LVGL的控件上。以下是一个示例:
    bool encoder_read(lv_indev_drv_t * drv, lv_indev_data_t* data) {
        // 读取外部变量A的值
        int externValueA = getExternalValueA(); // 假设有一个函数可以获取外部变量A的值
    
        // 更新控件的文本显示
        lv_label_set_text(textLabel, "External Value A: " + externValueA);  // 假设有一个文本控件叫做textLabel
    
        // 其他处理代码
    
        return false;
    }
    

    在回调函数中,首先获取外部变量A的值,然后使用lv_label_set_text函数将其更新到文本控件textLabel的显示上。

    1. 在LVGL的完整初始化代码中调用注册输入设备的函数:
    int main(int argc, char *argv[]) {
        // 其他初始化代码
    
        lv_port_indev_init();  // 注册输入设备
    
        // 其他代码
    
        // 创建和显示LVGL的窗口和控件
    
        // 处理LVGL的任务
    
        return 0;
    }
    

    通过以上步骤和示例代码,可以在LVGL中读取外部变量的值并在屏幕上显示。请注意,示例代码中的函数和控件名称仅供参考,需根据实际情况进行修改和调整。