最近对UI移植很感兴趣,于是在看到一下大神博客的一些实战项目的时候,发现这个高度可裁剪、低资源占用、界面美观且易用的嵌入式系统图形库——LVGL(Light and Versatile Graphics Library),而且尝试移植的时候发现它的移植过程还是很简单的,秉承着学而时习之的理念,觉得还是有必要记录一下,以后回顾的时候不至于因时间而遗忘,同时也希望能给对该图形库有兴趣的朋友予以帮助!
1、准备工作
(1)一个例程,支持TFTLCD显示以及触摸
(2)图形库文件,这里我使用的版本是v8.2.0,因为我的GUI Guider图形软件目前只支持这个版本
2、开始移植
(1)打开lvgl_v8.2可以看到里面的文件有很多,移植过程只需要部分文件
src下的所有文件、examples文件夹下porting文件夹下的所有文件、demo文件夹下的所有文件(demo文件夹不是必须的,稍后要用这个文件夹下的案例验证是否移植成功)
(2)将以上文件拷贝到之前准备的例程工程目录下,修改porting文件夹下的所有文件
第一项:修改文件名称
修改前名称:
修改后名称:
第二项:修改.h文件里面的名称以及打开宏定义,三个文件均要如此修改,此处以第一个文件为例,其他两个文件如是修改即可。
修改前:
修改后:
(3)修改完成后添加文件到工程中,添加过程比较繁琐,需耐心仔细
(4)添加包含头文件路径,其中有一处需要注意,lvgl.h该文件的位置放置的地方不同,可能导致未能包含上,编译时报错,找不到这个文件,笔者遇到过,后来把lvgl.h文件放到和src目录同级,再添加包含工程目录,就通过了,如果遇到编译出现这个错误,可以看下是否文件路径没有被包含
(5)修改驱动文件,主要需要修改的文件,如下图,其中lv_port_disp.c文件与显示 有关,lv_port_indev.c文件与触摸有关
先修改lv_port_disp.c文件
屏蔽82行~92行内容,此处有三种方法用于定义缓冲区,来显示部件,我们采用第一个,创建一个buffer,另外两个申请的buffer较大
再修改disp_init(void),在其中添加lcd的初始化接口,lcd初始化也可以在main函数中调用,所以此处可以添加也可以不添加
最后修改刷新接口disp_flush()
显示部分内容修改完成,其中有一处需要注意,这处的宏定义,根据实际的LCD屏幕大小来填写,而且也需要注意横屏和竖屏方向问题
再修改lv_port_indev.c文件
lvgl提供五种输入设备驱动,触摸、鼠标、键盘、编码器、按钮等,此处我们使用触摸输入,将其他几项全部屏蔽:32行~48行、54行~60行、104行~171行
屏蔽完成后,添加触摸屏驱动
touchpad_init()中添加触摸屏初始化
touchpad_is_pressed()中添加触摸扫描函数
touchpad_get_xy()获取坐标函数中添加自己触摸屏的坐标
这样修改完成,注意:触摸屏校准过程不能缺少,笔者移植过程中忘记加屏幕触摸校准部分,导致触摸按钮一点反应都没有,找了好几天问题,后来打开lvgl日志,才发现是触摸返回的坐标不对,所以屏幕没识别到
修改完成后可移植demo验证,也可以用GUI Guider图形软件生产UI界面验证,
使用demo的话需要修改lv_conf.h文件夹下的一些宏,可按照demo里的指导来完成
笔者用GUI Guider图形软件生成了一个简单模型验证,能正常显示和触摸