LVGL学习笔记及使用案例

V8版本配置特点等lv_conf.h:

1.频率>16Mhz  指的是CPU的主频要够大

2.Flash/ROM >64 kb,建议180kb以上    指的是CPU的

3.RAM >8kb,建议24kb以上  刷新效果越好

4.图形缓冲区(RAM上) > 水平分辨率像素,建议大于1/10屏幕总像素(800*480*字节数)  越大刷新的越快,比如800*480是需要存放到缓冲数组中   > 800*1  如果是8位就是1个字节,16(565)位色彩就是2

#define MY_DISP_HOR_RES    480
#define MY_DISP_VER_RES    272
#define DISP_ROWS          110

5.C99或更新编译器

6.减少屏幕刷新率:通过调整 LV_DISP_DEF_REFR_PERIOD 来降低屏幕的刷新频率,减少处理器的负担

7.优化显示缓冲区:调整显示缓冲区的大小 (LV_DISP_BUF_SIZE),使其既能满足流畅渲染的需要,又不会过度占用 CPU 资源

优化LVGL运行效果方法:

1.提高主频

2.增大SRAM,提高读写速度

3.增加图形缓冲区,使用双缓冲

    static lv_color_t buf_2_1[MY_DISP_HOR_RES * DISP_ROWS];
    static lv_color_t buf_2_2[MY_DISP_HOR_RES * DISP_ROWS];

4.减小需要刷新的总像素,缩短图像刷新时间  LV_DISP_DEF_REFR_PERIOD 

5.提高图像数据传输速度(使用DMA2D)

如果屏幕出现字符错位,卡屏,花屏等问题也可以考虑修改lcd的配置文件

通过FSMC,控制器可以通过并行的方式快速访问外部设备的内存,

lcd_timing_init_struct.asyn_data_setuptime = 100;//5; 增加这个时间

  1. 数据和地址建立时间 (asyn_data_setuptime, asyn_address_setuptime): 这些参数定义了在读/写操作中,数据和地址线需要稳定多久才能被外设正确读取。如果这些时间设置得太短,外设可能无法在数据被锁定前正确地读取数据,导致数据错误。

  2. 同步访问时钟分频系数 (syn_clk_division): 这个参数影响数据传输的速率。如果时钟分频设置不当,可能会导致数据传输速度过快或过慢,外设无法在预期的时间内完成数据读写

获取源码:

  1. GitHubhttps://github.com/lvgl/lvgl
  2. 百度网盘 提取码:08ejhttps://pan.baidu.com/s/1dknWAwAtyiJrjg0Qu-IGkw?pwd=08ej

文件目录

裁剪需要保留的主要文件:

demo、example(porting)、src、lv_conf_template.h、lvgl.h

如何移植LVGL可以参考其他文章:

LVGL移植stm8.3超详细【stm32移植lvgl】_stm32f429 lvgl 8.3.5-优快云博客

分布内存情况

LVGL主要三大类

1.放置图标  screen

2.图标与按键对应 GROUP

3.按键带来的响应  event 回调事件 

	KeyPadEdit = 1;
    lv_group_remove_all_objs(key_Group);
    lv_group_add_obj(key_Group, win_encode.dp[0]);
    lv_group_add_obj(key_Group, win_encode.dp[1]);
    lv_group_add_obj(key_Group, win_encode.btn);
    for(uint8_t i = 0; i < CHECKBOX_NUM; i++)
    {
        lv_group_add_obj(key_Group, win_encode.checkbox[i]);
        lv_obj_add_event_cb(win_encode.checkbox[i],checkbox_event_cb,LV_EVENT_VALUE_CHANGED,NULL);//复选框部件
        lv_obj_add_event_cb(win_encode.checkbox[i], esc_event_handler, LV_EVENT_KEY, NULL);//返回
    }
    lv_obj_add_event_cb(win_encode.btn, btn_event_cb, LV_EVENT_CLICKED, NULL);//编码按钮
    lv_obj_add_event_cb(win_encode.dp[0], dp1_event_cb, LV_EVENT_VALUE_CHANGED, NULL);//下拉部件
    lv_obj_add_event_cb(win_encode.dp[1], dp2_event_cb, LV_EVENT_VALUE_CHANGED, NULL);//下拉部件
    lv_obj_add_event_cb(win_encode.dp[0], esc_event_handler, LV_EVENT_KEY, NULL);//返回
    lv_obj_add_event_cb(win_encode.dp[1], esc_event_handler, LV_EVENT_KEY, NULL);//返回
    lv_obj_add_event_cb(win_encode.btn, esc_event_handler, LV_EVENT_KEY, NULL);//返回

样式部件:

示例代码

标签部件:

开关按键部件:

按钮添加文本显示,并且居中

   lv_obj_t *btn_label = lv_label_create(win_encode.btn);
    lv_label_set_text(btn_label, "一键编码");
    lv_label_set_recolor(btn_label,1);
    lv_obj_center(btn_label); // 居中文本在按钮上

复选框部件:

比如,总线,选择设备需要很多复选框

如果是进制选中状态,也用禁用复选框,非点击状态

回调函数,根据事件类型,当单个复选框,值发生改变时

如果是多个复选框,那么需要判断是哪个触发源导致的,然后再判断当前复选框的状态

 

static void checkbox_event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    memset(checked, 0, sizeof(checked));
     for(int i = 0; i < CHECKBOX_NUM; i++) 
    {
        if(win_encode.checkbox[i] != target) 
        { 
            lv_obj_clear_state(win_encode.checkbox[i], LV_STATE_CHECKED);
        }
    }
    
    // 遍历所有复选框并检查它们的选中状态 
    for(int i = 0; i < CHECKBOX_NUM; i++) 
    {
        if(target == win_encode.checkbox[i]) 
        {
            checked[i] = lv_obj_has_state(win_encode.checkbox[i], LV_STATE_CHECKED);
            break;
        }
    }
}

进度条部件

先设置范围,再设置动画时间,再设置当前值

也可以指定起始点开始绘制

默认模式从最左侧绘制到当前值,也可以设置起始值

比如开机使用

如果还要增加百分比的同步显示效果,就需要增加一个定时器部件

文本部件:

加载器部件:

比如在系统自检的界面

//隐藏
lv_obj_add_flag(win_encode.spin, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(win_encode.label[3], LV_OBJ_FLAG_HIDDEN);
//显示
lv_obj_clear_flag(win_encode.spin, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(win_encode.label[3],LV_OBJ_FLAG_HIDDEN);

LED部件

用途:屏幕控制硬件LED,同步LED的状态切换

列表部件:

用途:菜单列表,二级菜单列表,可以显示图标,可以显示菜单的文本内容等

下拉列表部件:

用途:字体字号修改,设备型号选择  设置下拉的方向等

滚动部件:

用途:比如系统时间设置  字体  字号

获取文本内容

滑块部件:

用途:音量   灯光亮度滑块调节

圆弧部件:

用途:码盘表显示,温湿度等

要会计算圆弧角度

增加百分比标签显示

线条部件:

在一组坐标点绘制一条直线

用途:画边框   画横线  竖线

 

画出一个正弦波

图片部件:

用途:主页图片,开机界面,背景优化

在LVGL官网找到

LV_IMG_DECLARE(imagetest);

代码段:

    win_many_tst.image1 = lv_img_create(win_many_tst.obj);
    lv_obj_add_flag(win_many_tst.image1, LV_OBJ_FLAG_CLICKABLE);
    lv_img_set_src(win_many_tst.image1, &imagetest);
    lv_img_set_pivot(win_many_tst.image1, 50,50);//设置轴心的位置 参考点00 图片旋转使用
    lv_img_set_angle(win_many_tst.image1, 0);//旋转角度
    lv_obj_set_pos(win_many_tst.image1, 100, 50);
    lv_obj_set_size(win_many_tst.image1, 200, 200);

    lv_obj_set_style_img_opa(win_many_tst.image1, 255, LV_PART_MAIN|LV_STATE_DEFAULT);

但是为什么图片出现两张呢    尺寸问题   

色环部件:

用途:

第一个false,手柄为固定,true跟着变化

按钮矩阵部件:

用途:密码框,计算机,数字矩阵,字符矩阵框,文本输入等

 

文本区域部件:

用途:文本输入内容,密码输入框等

图片按钮部件

用途:用户可以在里面设置图片

选择带有通明度通道的进行转换

选项卡部件:

平铺视图部件:

窗口部件:

消息框部件:

微调器部件:

表格部件:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值