36. 中文字库应用

一、LVGL字库

  LVGL 的字体功能是较为强大的:支持 UTF-8 编码、图标字体、自定义字体、最高 8bpp 的抗锯齿,等等。值得注意的是,bpp 值越大,字体的边缘会越平滑,但其对内存的占用就越多,在界面上进行字体渲染时,绘制速度也会越慢,一般的项目,采用 4bpp 就足够了。

  LVGL 支持 2 种编码方式:第一种是 ASCII 编码,这种编码只支持英文字符的显示;第二种是 UTF-8 编码,这种编码可以支持全球所有字符的显示。用户需要在 LVGL 工程中启用 UTF-8 编码,可以打开 lv_conf.h 文件,修改 LV_TXT_ENC 配置项,如下源码所示:

设置编码格式

  然后,我们可以使用使用 LVGL 官方的在线字体转换工具(网址:https://lvgl.io/tools/fontconverter),将字库文件(例如 TTF)转换成 C 语言数组字体文件,然后将其添加到工程中,声明字体后即可调用。

生成字体

在 Unicode 编码中,0x20-0x7F 表示 ASCII 码的区间,也就是英文字母,而 0x4E00-0x9FFF 是中文的区间。

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

LV_FONT_DECLARE(Font30);

int main(void)
{
    HAL_Init();
    System_Clock_Init(8, 336, 2, 7);
    Delay_Init(168);

    SPI_Simulate_Init();
    // SRAM_Init();
    TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
    __HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE);                          // 清除更新中断标志位
    HAL_TIM_Base_Start_IT(&g_tim6_handle);                                      // 使能更新中断,并启动计数器

    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    // 测试代码
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_obj_set_style_text_font(label, &Font30, LV_PART_MAIN);
    lv_label_set_text(label, "你好,小樱。");

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
posted @ 2024-09-04 19:11  星光映梦  阅读(70)  评论(0编辑  收藏  举报