一、使用lvgl的步骤
RVB2601开发板上已经移植好了LVGL,可以直接使用,使用步骤如下:
- 加入OLED的驱动,可以从"ch2601_gui_demo"中,拷贝出OLED的驱动。如果是复制"ch2601_helloworld"中OLED驱动的话,还需要加入lvgl的注册函数。可以通过比较这两个项目里的oled.c的"oled_init()"函数看出区别。
- 引入头文件"lvgl.h"
- 调用函数"lv_init()",对lvgl进行初始化
- 在周期函数中加入以下两个函数"lv_task_handler()"和"lv_tick_inc()"
int main(void)
{
board_yoc_init();
lv_init();
oled_init();
show_page_init();
while(1){
lv_task_handler();
aos_msleep(100);
lv_tick_inc(100);
}
}
二、SRAM内存不足的问题
但是在"webplayer_demo"中使用lvgl时,会出现以下错误:
显示SRAM溢出了,因此需要精简一下变量的使用。在"lvgl_conf.h"中,有如下代码:
/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
# define LV_MEM_SIZE (32U * 1024U)
可以看出,默认分配了32KB的空间给LVGL,用于动态内存申请。这块空间给的太大了,因此可以将其改小一些,比如改成4KB。这样就不报错了。
三、代码示例
下面是我的初始化页面,全部使用的label控件,使用前记得引入"lvgl.h"和"lv_label.h"头文件:
lv_obj_t * label_temp;
lv_obj_t * label_humity;
lv_obj_t * label_speed;
void show_page_init()
{
lv_obj_t * label1 = lv_label_create(lv_scr_act(),NULL);
lv_label_set_long_mode(label1, LV_LABEL_LONG_BREAK); /*显示模式固定*/
lv_label_set_align(label1, LV_LABEL_ALIGN_CENTER); /*居中显示*/
lv_label_set_text(label1,"Smart Fan"); /*显示标签的内容*/
lv_obj_set_width(label1, 128); /*设置显示的宽度*/
lv_obj_align(label1, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); /*靠项端居中显示*/
label_temp = lv_label_create(lv_scr_act(),NULL);
lv_label_set_long_mode(label_temp, LV_LABEL_LONG_BREAK); /*显示模式固定*/
lv_label_set_align(label_temp, LV_LABEL_ALIGN_LEFT); /*居中显示*/
sprintf(temp,"TEMP\t: -- C");
lv_label_set_text(label_temp,temp); /*显示标签的内容*/
lv_obj_set_width(label_temp, 128); /*设置显示的宽度*/
lv_obj_align(label_temp, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16); /*靠项端居中显示*/
label_humity = lv_label_create(lv_scr_act(),NULL);
lv_label_set_long_mode(label_humity, LV_LABEL_LONG_BREAK); /*显示模式固定*/
lv_label_set_align(label_humity, LV_LABEL_ALIGN_LEFT); /*居中显示*/
sprintf(humity,"RH\t: -- %%");
lv_label_set_text(label_humity,humity); /*显示标签的内容*/
lv_obj_set_width(label_humity, 128); /*设置显示的宽度*/
lv_obj_align(label_humity, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 32); /*靠项端居中显示*/
label_speed = lv_label_create(lv_scr_act(),NULL);
lv_label_set_long_mode(label_speed, LV_LABEL_LONG_BREAK); /*显示模式固定*/
lv_label_set_align(label_speed, LV_LABEL_ALIGN_LEFT); /*居中显示*/
sprintf(fan_speed,"Speed\t: 0");
lv_label_set_text(label_speed,fan_speed); /*显示标签的内容*/
lv_obj_set_width(label_speed, 128); /*设置显示的宽度*/
lv_obj_align(label_speed, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 48); /*靠项端居中显示*/
}
效果如下: