嵌入式系统应用-第八章 基于LVGL的入门介绍

第八章 基于LVGL的入门介绍

8.1 图形库介绍

LVGL (Light and Versatile Graphics Library) 是最流行的免费开源嵌入式图形库,可为任何 MCU、MPU 和显示类型创建漂亮的 UI。
在这里插入图片描述
它的官方网站:添加链接描述
它的技术手册:添加链接描述

8.2 应用基础要求

LVGL最低配置要求16、32 或 64 位微控制器或处理器
建议使用 >16 MHz 时钟速度
闪存/ROM: > 64 kB 用于非常重要的组件 (> 建议使用 180 kB)
RAM:
静态 RAM 使用量:~2 kB,取决于使用的功能和对象类型
堆: > 2kB (> 建议使用 8 kB)
动态数据(堆): > 2 KB (> 如果使用多个对象,建议使用 16 kB). 在 lv_conf.h 文件中配置 LV_MEM_SIZE 生效。
显示缓冲区:> “水平分辨率”像素(推荐 >10 × 10ד 水平分辨率”)

8.3 图形库入门

8.3.1 了解在线案例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3.2 搭建vscode STUDIO的仿真平台

可以通过github上面下载图形仿真库,因为下载速度慢和操作复杂。如果你是使用window用户,可以直接下载。前提条件,你要安装vs studio这个软件。如何安装这个软件,可以网上找一些资料。后期如果读者有需要,我在更新说明一下。

1 下载文件后,找到lvgl.simulator.sln 这个文件,双击这个文件。
在这里插入图片描述
2 打开配置文件,选择调试属性

在这里插入图片描述

3 配置路径: 系统默认是在桌面上的,所以如果你的文件放在哪个位置,需要配置一下地址:根据你的文件所在位置,配置lvgl所在地址。在这里插入图片描述
4. 点击确定后,运行程序。

在这里插入图片描述

5 运行效果如下所示:

yu

这个是典型的应用案例,接下来我们介绍LVGL的基本操作。

8.3.3 基本概念入门

1. 位置,首先了解窗口位置定义:

lv_obj_set_x(obj, new_x)//设置横坐标
lv_obj_set_y(obj,new_y)//设置从坐标
lv_obj_set_pos(obj, new_x, new_y).// 同时设置横坐标和从坐标

2 . 窗口的大小

lv_obj_set_width(obj, new_width)lv_obj_set_height(obj, new_height)lv_obj_set_size(obj, new_width, new_height).
  1. 窗口对齐
lv_obj_set_align(obj, LV_ALIGN_CENTER);
lv_obj_set_pos(obj, 10, 20);
//Or in one function
lv_obj_align(obj, LV_ALIGN_CENTER, 10, 20);

在这里插入图片描述

  1. 父级和子集
lv_obj_set_parent(obj, new_parent)// 设置对象为父级
lv_obj_get_parent(obj)// 获取对象的父级

lv_obj_get_child(parent, idx).   // 获取父级相面的子集的编号
//• 0 get the child created first
//• 1 get the child created second
//• -1 get the child created last

uint32_t i;
for(i = 0; i < lv_obj_get_child_cnt(parent); i++) {
	lv_obj_t * child = lv_obj_get_child(parent, i);
/*Do something with child*/
}

lv_obj_get_index(obj); //
lv_obj_move_background(obj);
lv_obj_move_foreground(obj);
lv_obj_move_to_index(obj, index);

4 获取屏幕

lv_obj_t * screen = lv_obj_create(NULL)lv_scr_load(screen)lv_scr_act() ;
lv_disp_set_default.lv_obj_get_screen(obj)

5. 事件

lv_obj_add_event_cb(obj, event_cb, LV_EVENT_...,user_data),
lv_event_send(obj, LV_EVENT_..., param)

8.4 案例应用

8.4.1 创建界面、按键、文本、标签

void Main_Frame(void)
{
    // 显示主界面
    lv_obj_t* mainScreen = lv_obj_create(NULL);
    lv_obj_set_size(mainScreen, 480, 320);
    // 插入窗口的颜色
    lv_obj_set_style_bg_color(mainScreen, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
    lv_scr_load(mainScreen);   
    lv_disp_set_default;   

   // 文本操作
    lv_obj_t* mainTitle=lv_textarea_create(mainScreen);
    lv_textarea_add_text(mainTitle, "Main Frame");
    lv_textarea_set_align(mainTitle, LV_ALIGN_TOP_MID);
    // 修改大小
    lv_obj_set_size(mainTitle, 150, 40);
    lv_obj_set_pos(mainTitle, 150, 0);
    // 设置文本背景的颜色
    lv_obj_set_style_text_color(mainTitle, lv_palette_main(LV_PALETTE_YELLOW), LV_PART_MAIN);
    lv_obj_set_style_bg_color(mainTitle, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
    lv_obj_set_style_border_color(mainTitle, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
// 按键操作
    lv_obj_t* btnSpeaker = lv_btn_create(lv_scr_act());
    lv_obj_align(btnSpeaker, LV_ALIGN_LEFT_MID, 0, 0);

    // 设置按键背景颜色
    lv_obj_set_style_bg_color(btnSpeaker, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN);

    lv_obj_t* labelSpeaker= lv_label_create(btnSpeaker);
    lv_label_set_text(labelSpeaker, "Speaker");
    lv_obj_center(labelSpeaker);
    //修改大小
    lv_obj_set_size(btnSpeaker, 80, 30);
}

8.4.2 添加背景图片和按键图片

图片创建,可以选择在线图像编辑器:把图像变成c的数组。在线链接

在这里插入图片描述

选择图片,图片要设置好大小,譬如:50*50. 可以用图像编辑器来修改。选择真彩色,然后点击Convert。就会有一个light.c的文件自动下载下来。

绘制主窗口

void Main_Frame(void)
{

    // 显示主界面
    lv_obj_t* mainScreen = lv_obj_create(NULL);
    lv_obj_set_size(mainScreen, 480, 320);


    // 插入窗口的颜色
    //lv_obj_set_style_bg_color(mainScreen, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
    lv_scr_load(mainScreen);   
    lv_disp_set_default;   
    lv_obj_t* imgBackground = lv_img_create(mainScreen);
    lv_img_set_src(imgBackground, &bg);
    lv_obj_align(imgBackground, LV_ALIGN_CENTER, 0, 0);

    switch (winPoint)  // 绘制不同界面
    {
        case main_desktop:  Create_MainWindow(mainScreen); break;
        case ligh_strengh:                                 break;
        case rtc:                                          break;
    }
}
 // 创建主界面
void Create_MainWindow(lv_obj_t* mainScreen)
{
    // 文本操作
    mainTitle = lv_textarea_create(mainScreen);
    lv_textarea_add_text(mainTitle, "Main Frame");
    lv_textarea_set_align(mainTitle, LV_ALIGN_TOP_MID);


    // 修改大小
    lv_obj_set_size(mainTitle, 150, 40);
    lv_obj_set_pos(mainTitle, 150, 0);


    // 设置文本背景的颜色
    lv_obj_set_style_text_color(mainTitle, lv_palette_main(LV_PALETTE_YELLOW), LV_PART_MAIN);
    lv_obj_set_style_bg_color(mainTitle, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
    lv_obj_set_style_border_color(mainTitle, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);


    // 蜂鸣器按键操作
    btnSpeaker = lv_btn_create(lv_scr_act());
    lv_obj_align(btnSpeaker, LV_ALIGN_LEFT_MID, 20, 0);
    //修改大小
    lv_obj_set_size(btnSpeaker, 50, 50);
    // 插入图片
    lv_obj_t* imgSpeaker = lv_img_create(btnSpeaker);
    lv_img_set_src(imgSpeaker, &speaker);
    lv_obj_align(imgSpeaker, LV_ALIGN_CENTER, 0, 0);
    // 动作
    lv_obj_add_event_cb(btnSpeaker, Event_BtnSpeaker, LV_EVENT_PRESSED, NULL);
    lv_obj_add_event_cb(btnSpeaker, Event_BtnSpeaker1, LV_EVENT_RELEASED, NULL);
    // 设置按键背景颜色
    //lv_obj_set_style_bg_color(btnSpeaker, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN);
    //lv_obj_t* labelSpeaker= lv_label_create(btnSpeaker);
    //lv_label_set_text(labelSpeaker, "Speaker");
    //lv_obj_center(labelSpeaker);
    //
 
    //lv_obj_remove_style_all(btnSpeaker); /* Remove the style coming */

    static lv_style_t style_pr;
    lv_style_init(&style_pr);
    /*增加偏移动作*/  
    lv_style_set_translate_y(&style_pr, 5);  
    lv_obj_add_style(btnSpeaker, &style_pr, LV_STATE_PRESSED);

    // led按键操作
    btnLED = lv_btn_create(lv_scr_act());
    lv_obj_align(btnLED, LV_ALIGN_CENTER, 0, 0);
    //修改大小
    lv_obj_set_size(btnLED, 50, 50);
    // 插入图片
    lv_obj_t* imgLED = lv_img_create(btnLED);
    lv_img_set_src(imgLED, &led);
    lv_obj_align(imgLED, LV_ALIGN_CENTER, 0, 0);


    // 光强
    btnLight = lv_btn_create(lv_scr_act());
    lv_obj_align(btnLight, LV_ALIGN_RIGHT_MID, 0, 0);
    //修改大小
    lv_obj_set_size(btnLight, 100, 100);
    // 插入图片
    lv_obj_t* imgLight = lv_img_create(btnLight);
    lv_img_set_src(imgLight, &light);
    lv_obj_align(imgLight, LV_ALIGN_CENTER, 0, 0);
}

效果图
在这里插入图片描述

8.4.3 删除界面和增加动作

// 删除主界面

void Delete_MainWindow(lv_obj_t* mainScreen)
{

    if (mainTitle != NULL)
        lv_obj_del(mainTitle);

    if (btnSpeaker != NULL)
        lv_obj_del(btnSpeaker);

    if (btnLED != NULL)
        lv_obj_del(btnLED);

    if (btnLight != NULL)
        lv_obj_del(btnLight);

}

//
// 绘制按键动作/
///
用蜂鸣器改变图片的颜色,变成红色和蓝色

void Event_BtnSpeaker(void)   
{
    lv_obj_set_style_bg_color(mainTitle, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN);
}

void Event_BtnSpeaker1(void)
{
    lv_obj_set_style_bg_color(mainTitle, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
}

在这里插入图片描述
8.4.3 添加文本、控制文本背景和颜色

static void Create_MainWindow(lv_obj_t* mainScreen)
{
    // 创建对象
    label_name = lv_label_create(mainScreen);
    lv_label_set_text(label_name, "Test Value"); // 设定内容
    lv_obj_align(label_name, LV_ALIGN_LEFT_MID, 30, 0);  // 设定位置
   // 绘制效果
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_radius(&style,5);    // 设定边角的圆滑度
    lv_style_set_bg_opa(&style, 0);  //背景透明度和颜色
    lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_GREY, 2));  
    lv_style_set_border_width(&style, 2);  // 边框的颜色、厚度
    lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_BLUE));  
    lv_style_set_pad_all(&style, 10);  // 边框间距

    lv_style_set_text_color(&style, lv_palette_main(LV_PALETTE_YELLOW));  // 文本颜色
    lv_style_set_text_decor(&style, LV_TEXT_DECOR_NONE);   // 添加下划线
    lv_obj_add_style(label_name, &style, 0);

    // 返回按键 
    btn_return = lv_btn_create(mainScreen);  
    lv_obj_align(btn_return, LV_ALIGN_TOP_RIGHT, -20, 20);
    //修改大小
    lv_obj_set_size(btn_return, 50, 50);
    // 插入图片
    lv_obj_set_style_bg_img_src(btn_return, &return1, 0);   
    // 动作
    lv_obj_add_event_cb(btn_return, Event_BtnReturn, LV_EVENT_PRESSED, NULL);
    // 添加按下动画
    static lv_style_t style_pr;
    lv_style_init(&style_pr);     
    /*Add a large outline when pressed*/
    lv_style_set_translate_y(&style_pr, 5);
    lv_obj_add_style(btn_return, &style_pr, LV_STATE_PRESSED);

}

// 删除主界面
static void Delete_MainWindow(lv_obj_t* mainScreen)
{
    if (label_name != NULL)
        lv_obj_del(label_name);

    if (btn_return != NULL)
        lv_obj_del(btn_return);
   

}

// 返回按键
void Event_BtnReturn(void)
{
     lv_obj_t* mainScreen = lv_scr_act();
     switch (winPoint)  // 绘制不同界面
     {
         case main_desktop:   break;             // 错误界面
         case ligh_strengh:  Delete_MainWindow(mainScreen); Draw_MainFrame(); winPoint = main_desktop;  break;
         case rtc:                                          break;
     }
}

void LightFrame(void)
{
    lv_obj_t* mainScreen = lv_scr_act();
    Create_MainWindow(mainScreen);

}

在这里插入图片描述

8.4.4 滑动条和状态条

绘制滑动条和增加滑动动画和显示风格

 // 创建滑动条
        slider = lv_slider_create(lv_scr_act());
        lv_obj_align(slider, LV_ALIGN_BOTTOM_MID, 0, -30);
        lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
        lv_slider_set_range(slider, 0, 100);

        // 显示内容
        slider_label = lv_label_create(lv_scr_act());
        lv_label_set_text(slider_label, "0%");
        lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);

        //  添加风格
        static const lv_style_prop_t props[] = { LV_STYLE_BG_COLOR, 0 };
        static lv_style_transition_dsc_t transition_dsc;
        lv_style_transition_dsc_init(&transition_dsc, props, lv_anim_path_linear, 300, 0, NULL);
        static lv_style_t style_main;
        static lv_style_t style_indicator;
        static lv_style_t style_knob;
        static lv_style_t style_pressed_color;

        lv_style_init(&style_main);
        lv_style_set_bg_opa(&style_main, LV_OPA_COVER);
        lv_style_set_bg_color(&style_main, lv_palette_main(LV_PALETTE_GREEN));
        lv_style_set_radius(&style_main, LV_RADIUS_CIRCLE);
        lv_style_set_pad_ver(&style_main, -1);

        lv_style_init(&style_indicator);
        lv_style_set_bg_opa(&style_indicator, LV_OPA_COVER);
        lv_style_set_bg_color(&style_indicator, lv_palette_main(LV_PALETTE_YELLOW));
        lv_style_set_radius(&style_indicator, LV_RADIUS_CIRCLE);
        lv_style_set_transition(&style_indicator, &transition_dsc);

        lv_style_init(&style_knob);
        lv_style_set_bg_opa(&style_knob, LV_OPA_COVER);
        lv_style_set_bg_color(&style_knob, lv_palette_main(LV_PALETTE_YELLOW));
        lv_style_set_border_color(&style_knob, lv_palette_darken(LV_PALETTE_YELLOW, 3));
        lv_style_set_border_width(&style_knob, 2);
        lv_style_set_radius(&style_knob, 2);
        lv_style_set_pad_all(&style_knob, 6);
        lv_style_set_transition(&style_knob, &transition_dsc);

        lv_style_init(&style_pressed_color);
        lv_style_set_bg_color(&style_pressed_color, lv_palette_darken(LV_PALETTE_YELLOW, 2));

        lv_obj_add_style(slider, &style_main, LV_PART_MAIN);
        lv_obj_add_style(slider, &style_indicator, LV_PART_INDICATOR);
        lv_obj_add_style(slider, &style_pressed_color, LV_PART_INDICATOR | LV_STATE_PRESSED);
        lv_obj_add_style(slider, &style_knob, LV_PART_KNOB);
        lv_obj_add_style(slider, &style_pressed_color, LV_PART_KNOB | LV_STATE_PRESSED);

滑动条的动作相应
利用这个回调函数来响应动作

void slider_event_cb(lv_event_t* e)   // 控制屏幕亮度
{
    lv_obj_t* slider = lv_event_get_target(e);
    char buf[8];
    lv_snprintf(buf, sizeof(buf), "%d%%", (int)lv_slider_get_value(slider));
    lv_label_set_text(slider_label, buf);   
}

绘制状态条和绘制风格

bar_data = lv_bar_create(mainScreen);
lv_bar_set_range(bar_data, 0,100);            // 设定取值范围
lv_obj_align(bar_data, LV_ALIGN_CENTER, -20, 0);   // 设定范围
lv_obj_set_size(bar_data, 20, 100);            // 设定尺寸
lv_bar_set_value(bar_data, 70, LV_ANIM_ON);   // 设定值

// 增加风格
static lv_style_t style_bg;
static lv_style_t style_indic;
lv_style_init(&style_bg);
// 前景色
lv_style_set_border_color(&style_bg, lv_palette_main(LV_PALETTE_GREEN));
lv_style_set_border_width(&style_bg, 2);
lv_style_set_pad_all(&style_bg, 8); 
lv_style_set_radius(&style_bg, 5);
lv_style_set_anim_time(&style_bg, 1000);
// 显示颜色
lv_style_init(&style_indic);
lv_style_set_bg_opa(&style_indic, LV_OPA_COVER);
lv_style_set_bg_color(&style_indic, lv_palette_main(LV_PALETTE_YELLOW));
lv_style_set_radius(&style_indic, 3);
// 插入风格
lv_obj_add_style(bar_data, &style_bg, 0);
lv_obj_add_style(bar_data, &style_indic, LV_PART_INDICATOR);

显示效果

在这里插入图片描述

  • 27
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
嵌入式系统是一种集成了软件和硬件的特殊计算机系统,它通常用于控制、监控、通信和计算等方面。STM32F4系列是一种常用的嵌入式微控制器,具有高性能、低功耗和丰富的外设接口,广泛应用于各种领域。 在控制器考试样卷中,可以通过嵌入式系统原理应用基于STM32F4系列的控制器来实现一些常见的功能,比如控制LED灯的亮灭、读取温度传感器的数值、驱动步进电机等。通过这些功能的实现,考生可以了解嵌入式系统的基本原理和应用。 首先,可以利用STM32F4系列的GPIO接口来控制LED灯的亮灭,通过编写相应的程序来实现LED的闪烁、呼吸灯等效果,考生需要了解GPIO的基本配置和控制方法。 其次,可以通过外部的温度传感器模块将温度数据输入到STM32F4系列的ADC(模数转换)接口,再通过编写程序将采集到的数据进行处理和显示,考生需要了解ADC的基本原理和操作方法。 此外,还可以利用STM32F4系列的定时器和PWM(脉冲宽度调制)接口来驱动步进电机,实现简单的转动控制,考生需要了解定时器的配置和PWM的输出控制方法。 通过这些实际的应用,考生可以加深对嵌入式系统原理的理解,掌握嵌入式系统在控制领域的基本应用。同时,也能够培养考生的动手能力和解决问题的能力。因此,基于STM32F4系列的控制器考试样卷是一种有效的教学方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHONGQI123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值