您尚未登录。

楼主 #1 2020-08-12 12:04:03

如意如意
会员
注册时间: 2020-07-10
已发帖子: 36
积分: 33

分享 LVGL_7显示中文字库,内部+外部

我在论坛帖子的滋养下,从零基础小白到现在对嵌入式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

FluxBB bbcode 测试

还有一步: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
FluxBB bbcode 测试
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、编译,传到板子运行。
FluxBB bbcode 测试

总结:内部字库在汉字过多或者过大时,编译会报错,切显示汉字错位,若要使用GB2312和所有汉字时,最好使用外bin字库。

离线

#2 2020-08-12 13:52:37

哇酷小二
管理员
所在地: 你猜
注册时间: 2020-04-22
已发帖子: 3,387
积分: 1902
个人网站

Re: 分享 LVGL_7显示中文字库,内部+外部

感谢楼主热心分享长文!

如果用VisualStudio编译LVGL代码, C语言文件里面UTF-8字符串是个大问题, GCC确没有这个问题。

保存成带签名的utf-8文件, 其他编辑/编译软件可能识别出错。
保存成不带签名的utf-8文件, MSVC编译遇到特定汉字(比如"速")也会编译出错。





离线

#4 2022-06-22 21:15:57

Mshao
会员
注册时间: 2022-06-10
已发帖子: 2
积分: 2

Re: 分享 LVGL_7显示中文字库,内部+外部

楼主你好,这个linux下LVGL编译(Clion工具)老是报错怎么解决呢?能指导一下吗?

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn