我在论坛帖子的滋养下,从零基础小白到现在对嵌入式linux移植编译+LVGL移植+应用开发一套流程略知一二的入门级选手。在此感谢哇酷网各位大佬的相助,众多坛友的无私奉献!
我是用的是Clion配置工程,修改CMakeLists.txt文件的编译选项,用Clion编译的。(安装完Clion就保存快照,试用30天快到了,就恢复一下)
现在将LVGL_v7添加中文支持遇到的问题分享一下,希望大家能跳过这些坑。
本人水平有限,有啥错误,欢迎批评指正,大家共同进步!
一、LVGL内置字库显示
关于LVGL内置字库的配置使用,官方文档介绍的比较清楚,就不再赘述。其中有一个中文的字库LV_FONT_SIMSUN_16_CJK,不过字比较少。下面是七月中旬最先版v7的官方英文文档,接口有很大变动,如果用最新源码,参考之前v6的教程就会各种找不到属性方法。
https://whycan.cn/files/members/4756/LVGL.pdf
二、显示自己生成的内部字库
下面是阿里大佬开发的字库生成工具,使用很简单
https://whycan.cn/files/members/4756/LvglFontTool_V0_3.rar
还有一步:6、保存为myFont.c文件
将字库添加到工程需要一下几步:
1、将myFont.c另存为UTF-8编码格式,并复制到 lvgl/src/lv_font/ 下。
2、在CMakeLists.txt中 lvgl/src/lv_font/lv_font_montserrat_48.c 附近添加lvgl/src/lv_font/myFont.c。
3、在 main.c 文件中声明LV_FONT_DECLARE(myFont);(也可以按照官方改lv_conf.h)。
4、在main函数前添加测试函数
void lv_font_test()
{
LV_FONT_DECLARE(myFont);//放这里也行
lv_obj_t* label1 = lv_label_create(lv_scr_act(), NULL);
lv_obj_set_style_local_text_font(label1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &myFont_6763);
lv_obj_set_pos(label1, 20, 20);
lv_label_set_text(label1, "Hello,你好,哇酷网!");
}
5、在主函数while前添加语句调用lv_font_test();
6、编译后,查看 file yourName
7、rz -y 传到板子上运行(要chmod 777 yourName)
二、显示外部bin字库
外部字库比内部字库麻烦一点。
以下为详细步骤:
1、在字库生成工具右下角类型选择外部bin字库,转换保存会生成myFont.c myFont.bin两个文件。
2、将myFont.bin文件传到板子/root/目录下,并且chmod 777 myFont.bin。
3、将myFongt.c复制到工程 lvgl/src/lv_font/ 下,并修改以下内容
//添加头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//取消这行注释
static uint8_t __g_font_buf[322];//如bin文件存在SPI FLASH可使用此buff
//修改函数,就是读取bin文件
static uint8_t *__user_font_getdata(int offset, int size){
//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
//如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
uint32_t br;
FILE *fp = NULL;
fp = fopen("./myFont.bin", "rb");
if(!fp){
fprintf(stderr, "can't open file myFont.bin");
exit(1);
}
fseek(fp, offset, SEEK_SET);
fread(__g_font_buf, (uint32_t)size, 1, fp);
fclose(fp);
return __g_font_buf;
}
4、在CMakeLists.txt中 lvgl/src/lv_font/lv_font_montserrat_48.c 附近添加lvgl/src/lv_font/myFont.c。
5、在 main.c 文件中声明LV_FONT_DECLARE(myFont);(也可以按照官方改lv_conf.h)。
6、在main函数前添加测试函数
void lv_font_test()
{
LV_FONT_DECLARE(myFont);//放这里也行
lv_obj_t* label1 = lv_label_create(lv_scr_act(), NULL);
lv_obj_set_style_local_text_font(label1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &myFont_6763);
lv_obj_set_pos(label1, 20, 20);
lv_label_set_text(label1, "Hello,你好,哇酷网!");
}
7、在主函数while前添加语句调用lv_font_test();
8、编译,传到板子运行。
总结:内部字库在汉字过多或者过大时,编译会报错,切显示汉字错位,若要使用GB2312和所有汉字时,最好使用外bin字库。
离线