本帖最后由 jinchanchan 于 2025-11-25 16:22 编辑
#LVGL使用字库IC芯片显示中文 ## LVGL使用字库IC - 基于STM32F407 LVGL使用的是字库IC。相比于大多数使用的数组字库方式,使用字库IC编译后占用更小的存储空间,可以解码并显示更多的汉字,能够支持更多的字体大小等。
(顺便吆喝一句,民族企业核心部门年底前的一波岗,base武汉、深圳、苏州等地,前、后端or测试>>>[机会](https://jsj.top/f/o38ijj "机会");语言:Java、Js、测试、python、ios、安卓、C++等)!
## 字库IC读取字形数据 根据自己所使用的IC,实现字形数据的读取。我用的晶联讯屏幕带字库的,给了字库读取的例程。做了些修改,以获取到LVGL显示字体所需要的数据。
已知:
LVGL库会传入汉字或字符的utf-8编码,字库IC使用的是GB2312编码。 获取字形数据需要知道字体大小。 需要数据区存储获取的字形数据。 需要知道得到的字形数据大小。 需要知道字体的长*宽。 因此,需要做的工作: 编码转换(放到后面)。 修改字库读取的例程,以满足上述2-4的内容。 函数原型如下: <div align="left"><font face="Calibri">void jlx350_read_font(struct jlx350_object* obj, uint32_t gb_code, enum jlx350_font font, uint8_t* buff, uint16_t* size, uint16_t* w, uint16_t* h);</font></div><div align="left"><font face="Calibri">// obj: </font><font face="宋体">自己定义的结构体,不重要,可有可无</font></div><div align="left"><font face="Calibri">// gb_code: GB2312</font><font face="宋体">的字符编码</font></div><div align="left"><font face="Calibri">// jlx350_font: </font><font face="宋体">字库</font><font face="Calibri">IC</font><font face="宋体">支持的字体大小,这里使用了枚举</font></div><div align="left"><font face="Calibri">// buff: </font><font face="宋体">用于存储字形数据的数组</font></div><div align="left"><font face="Calibri">// size: </font><font face="宋体">字形数据大小</font></div><div align="left"><font face="Calibri">// w: </font><font face="宋体">字形的宽度</font></div><div align="left"><font face="Calibri">// h: </font><font face="宋体">字形的高度</font></div><div align="left">可以看出,字符编码和字体大小是传入的,而后面的四个参数是读出的。具体内容看函数实现:</div><div align="left"><font face="Calibri">void jlx350_read_font(struct jlx350_object* obj, uint32_t gb_code, enum jlx350_font font, uint8_t* buff, uint16_t* size, uint16_t* w, uint16_t* h)</font></div><div align="left"><font face="Calibri">{</font></div><div align="left"> <font face="Calibri">obj->ops.pin_cs_zk_set(obj, 0); // </font><font face="宋体">片选</font></div><div align="left"> <font face="Calibri">switch(font){ // </font><font face="宋体">跳转不同的字体大小</font></div><div align="left"> <font face="Calibri">case JLX_FONT_12:</font></div><div align="left"> <font face="Calibri">__read_font_12(obj, gb_code, buff, size, w, h);</font></div><div align="left"> <font face="Calibri">break;</font></div><div align="left"> <font face="Calibri">case JLX_FONT_16:</font></div><div align="left"> <font face="Calibri">__read_font_16(obj, gb_code, buff, size, w, h);</font></div><div align="left"> <font face="Calibri">break;</font></div><div align="left"> <font face="Calibri">case JLX_FONT_24:</font></div><div align="left"> <font face="Calibri">__read_font_24(obj, gb_code, buff, size, w, h);</font></div><div align="left"> <font face="Calibri">break;</font></div><div align="left"> <font face="Calibri">case JLX_FONT_32:</font></div><div align="left"> <font face="Calibri">__read_font_32(obj, gb_code, buff, size, w, h);</font></div><div align="left"> <font face="Calibri">break;</font></div><div align="left"> <font face="Calibri">}</font></div><div align="left"> <font face="Calibri">obj->ops.pin_cs_zk_set(obj, 1);</font></div><div align="left"><font face="Calibri">}</font></div><div align="left"><font face="Calibri">// </font><font face="宋体">以下使用其中一个字体大小举例 </font><font face="Calibri">font_12</font></div><div align="left"><font face="Calibri">void __read_font_12(struct jlx350_object* obj, uint32_t unicode, uint8_t* buff, uint16_t* size, uint16_t* w, uint16_t* h)</font></div><div align="left"><font face="Calibri">{</font></div><div align="left"> <font face="Calibri">uint64_t font_addr = 0;</font></div><div align="left"> <font face="Calibri">uint8_t code_H = (unicode >> 8) & 0xFF; // GB2312</font><font face="宋体">编码处理,需要根据编码获取到对应的</font><font face="Calibri">IC</font><font face="宋体">存储地址</font></div><div align="left"> <font face="Calibri">uint8_t code_L = unicode & 0xFF; // </font><font face="宋体">这部分是根据例程来的,就是计算</font><font face="Calibri">font_addr</font></div><div align="left"> <font face="Calibri">if((code_H >= 0xB0) && (code_H <= 0xF7) && (code_L >= 0xA1)){</font></div><div align="left"> <font face="Calibri">font_addr = (code_H - 0xB0) * 94;</font></div><div align="left"> <font face="Calibri">font_addr += (code_L - 0xA1) + 846;</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr * 24);</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr + 0x00);</font></div><div align="left"> <font face="Calibri">*size = 24; // </font><font face="宋体">字形数据大小,</font><font face="Calibri">12*12</font><font face="宋体">的汉字,需要</font><font face="Calibri">12*2=24 bytes</font></div><div align="left"> <font face="Calibri">*w = 12; // </font><font face="宋体">字形的宽度</font></div><div align="left"> <font face="Calibri">*h = 12; // </font><font face="宋体">字形的高度</font></div><div align="left"> <font face="Calibri">}</font></div><div align="left"> <font face="Calibri">else if((code_H >= 0xA1) && (code_H <= 0xA9) && (code_L >= 0xA1)){</font></div><div align="left"> <font face="Calibri">font_addr = (code_H - 0xA1) * 94;</font></div><div align="left"> <font face="Calibri">font_addr += (code_L - 0xA1);</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr * 24);</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr + 0x00);</font></div><div align="left"> <font face="Calibri">*size = 24;</font></div><div align="left"> <font face="Calibri">*w = 12;</font></div><div align="left"> <font face="Calibri">*h = 12;</font></div><div align="left"> <font face="Calibri">}</font></div><div align="left"> <font face="Calibri">else if((code_L >= 0x20) && (code_L <= 0x7E)){</font></div><div align="left"> <font face="Calibri">font_addr += (code_L - 0x20);</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr * 12);</font></div><div align="left"> <font face="Calibri">font_addr = (uint64_t)(font_addr + 0x1DBE00);</font></div><div align="left"> <font face="Calibri">*size = 12; // </font><font face="宋体">这里是英文字符</font><font face="Calibri">/</font><font face="宋体">数字</font><font face="Calibri">/</font><font face="宋体">半角符号 所以大小是</font><font face="Calibri">12</font><font face="宋体">就可以了,</font><font face="Calibri">IC</font><font face="宋体">内的字形是</font><font face="Calibri">6*12</font></div><div align="left"> <font face="Calibri">*w = 6;</font></div><div align="left"> <font face="Calibri">*h = 12;</font></div><div align="left"> <font face="Calibri">}</font></div><div align="left"> <font face="Calibri">// </font><font face="宋体">以上根据</font><font face="Calibri">IC</font><font face="宋体">的手册,确定读取字形的数据长度,字形宽</font><font face="Calibri">/</font><font face="宋体">高,并赋值</font></div><div align="left"> <font face="Calibri">// </font><font face="宋体">下面的是读取数据了,存入到</font><font face="Calibri">buff</font><font face="宋体">中</font></div><div align="left"> <font face="Calibri">__zk_read_font(obj, font_addr, buff, *size);</font></div><div align="left"><font face="Calibri">}</font></div><div align="left"><font face="Calibri">// SPI</font><font face="宋体">读取字形数据</font></div><div align="left"><font face="Calibri">void __zk_read_font(struct jlx350_object* obj, uint32_t glyph_addr, uint8_t* data, uint16_t size)</font></div><div align="left"><font face="Calibri">{</font></div><div align="left"> <font face="Calibri">__zk_write_byte(obj, 0x03); // </font><font face="宋体">指令</font></div><div align="left"> <font face="Calibri">__zk_write_byte(obj, (glyph_addr >> 16) & 0xFF); // </font><font face="宋体">字形地址,</font><font face="Calibri">24 bits</font></div><div align="left"> <font face="Calibri">__zk_write_byte(obj, (glyph_addr >> 8) & 0xFF);</font></div><div align="left"> <font face="Calibri">__zk_write_byte(obj, glyph_addr & 0xFF);</font></div><div align="left"> <font face="Calibri">for(int i=0; i<size; i++){ // </font><font face="宋体">读取数据,按</font><font face="Calibri">size</font><font face="宋体">大小</font></div><div align="left"> <font face="Calibri">__zk_read_byte(obj, &data<i>);</i></font></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i><font face="Calibri">}</font></i></div>
完成了根据字体和编码获取数据。至于SPI的内容,就不赘述了。 LVGL中添加字体 看了LVG了关于字体的代码,加入新字体需要定义结构体。如:
<div align="left"><i><font face="Calibri">#if LVGL_VERSION_MAJOR >= 8</font></i></div><div align="left"><i><font face="Calibri">static const lv_font_fmt_txt_dsc_t font_dsc = {</font></i></div><div align="left"><i><font face="Calibri">#else</font></i></div><div align="left"><i><font face="Calibri">static lv_font_fmt_txt_dsc_t font_dsc = {</font></i></div><div align="left"><i><font face="Calibri">#endif</font></i></div><div align="left"><i> <font face="Calibri">.glyph_bitmap = glyph_bitmap,</font></i></div><div align="left"><i> <font face="Calibri">.glyph_dsc = NULL,</font></i></div><div align="left"><i><font face="Calibri">};</font></i></div><div align="left"><i><font face="Calibri">/*-----------------</font></i></div><div align="left"><i> <font face="Calibri">* PUBLIC FONT</font></i></div><div align="left"><i> <font face="Calibri">*----------------*/</font></i></div><div align="left"><i><font face="Calibri">/*Initialize a public general font descriptor*/</font></i></div><div align="left"><i><font face="Calibri">#if LVGL_VERSION_MAJOR >= 8</font></i></div><div align="left"><i><font face="Calibri">const lv_font_t jlx_font_24 = {</font></i></div><div align="left"><i><font face="Calibri">#else</font></i></div><div align="left"><i><font face="Calibri">lv_font_t lv_font_montserrat_24 = {</font></i></div><div align="left"><i><font face="Calibri">#endif</font></i></div><div align="left"><i> <font face="Calibri">.get_glyph_dsc = jlx_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/</font></i></div><div align="left"><i> <font face="Calibri">.get_glyph_bitmap = jlx_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/</font></i></div><div align="left"><i> <font face="Calibri">.line_height = 26, /*The maximum line height required by the font*/</font></i></div><div align="left"><i> <font face="Calibri">.base_line = 5, /*Baseline measured from the bottom of the line*/</font></i></div><div align="left"><i><font face="Calibri">#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)</font></i></div><div align="left"><i> <font face="Calibri">.subpx = LV_FONT_SUBPX_NONE,</font></i></div><div align="left"><i><font face="Calibri">#endif</font></i></div><div align="left"><i><font face="Calibri">#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8</font></i></div><div align="left"><i> <font face="Calibri">.underline_position = -2,</font></i></div><div align="left"><i> <font face="Calibri">.underline_thickness = 1,</font></i></div><div align="left"><i><font face="Calibri">#endif</font></i></div><div align="left"><i> <font face="Calibri">.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */</font></i></div><div align="left"><i><font face="Calibri">};</font></i></div>
以上的结构体中,指明了两个函数jlx_font_get_glyph_dsc_fmt_txt和jlx_font_get_bitmap_fmt_txt。 jlx_font_get_glyph_dsc_fmt_txt获取字库IC的数据。jlx_font_get_bitmap_fmt_txt将字库数据转换为像素数据。
dsc指向的结构体内的glyph_bitmap成员表示像素内容。这里字体最大是3232,占用324个像素,因此glyph_bitmap是一个128大小的uint8数组。
其余成员的作用没有深究。
<div align="left"><i><font face="Calibri">bool jlx_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next)</font></i></div><div align="left"><i><font face="Calibri">{</font></i></div><div align="left"><i> <font face="Calibri">/*It fixes a strange compiler optimization issue: <a href="https://github.com/lvgl/lvgl/issues/4370" target="_blank">https://github.com/lvgl/lvgl/issues/4370</a>*/</font></i></div><div align="left"><i> <font face="Calibri">bool is_tab = unicode_letter == '\t';</font></i></div><div align="left"><i> <font face="Calibri">if(is_tab) {</font></i></div><div align="left"><i> <font face="Calibri">unicode_letter = ' ';</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">enum jlx350_font f;</font></i></div><div align="left"><i> <font face="Calibri">if(font == &jlx_font_12){</font></i></div><div align="left"><i> <font face="Calibri">f = JLX_FONT_12;</font></i></div><div align="left"><i> <font face="Calibri">}else if(font == &jlx_font_16){</font></i></div><div align="left"><i> <font face="Calibri">f = JLX_FONT_16;</font></i></div><div align="left"><i> <font face="Calibri">}else if(font == &jlx_font_24){</font></i></div><div align="left"><i> <font face="Calibri">f = JLX_FONT_24;</font></i></div><div align="left"><i> <font face="Calibri">}else if(font == &jlx_font_32){</font></i></div><div align="left"><i> <font face="Calibri">f = JLX_FONT_32;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">uint16_t size = 0, w = 0, h = 0; // size</font><font face="宋体">好像没啥用</font></i></div><div align="left"><i> <font face="Calibri">memset(glyph_bitmap, 0, 128);</font></i></div><div align="left"><i> <font face="Calibri">jlx350_read_font(&obj_jlx350, unicode_letter, f, glyph_bitmap, &size, &w, &h);</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->adv_w = w; // </font><font face="宋体">可以调节字符的间距</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->box_h = h;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->box_w = w;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->ofs_x = 0;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->ofs_y = 0;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->format = 1;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->is_placeholder = false;</font></i></div><div align="left"><i> <font face="Calibri">dsc_out->gid.index = 0; // </font><font face="宋体">返回给</font><font face="Calibri">lvgl</font><font face="宋体">字形数据在数组内的索引,因为使用</font><font face="Calibri">IC</font><font face="宋体">,每次都只读一个字形的数据,这里就直接使用</font><font face="Calibri">0</font><font face="宋体">,和使用大数组是不一样的。</font></i></div><div align="left"><i> <font face="Calibri">if(is_tab) dsc_out->box_w = dsc_out->box_w * 2;</font></i></div><div align="left"><i> <font face="Calibri">return true;</font></i></div><div align="left"><i><font face="Calibri">}</font></i></div><div align="left"><i><font face="Calibri">const void * jlx_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf)</font></i></div><div align="left"><i><font face="Calibri">{</font></i></div><div align="left"><i> <font face="Calibri">const lv_font_t * font = g_dsc->resolved_font;</font></i></div><div align="left"><i> <font face="Calibri">uint8_t * bitmap_out = draw_buf->data;</font></i></div><div align="left"><i> <font face="Calibri">lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc;</font></i></div><div align="left"><i> <font face="Calibri">int32_t gsize = (int32_t) g_dsc->box_w * g_dsc->box_h;</font></i></div><div align="left"><i> <font face="Calibri">if(gsize == 0) return NULL;</font></i></div><div align="left"><i> <font face="Calibri">if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) {</font></i></div><div align="left"><i> <font face="Calibri">const uint8_t * bitmap_in = &fdsc->glyph_bitmap[0];</font></i></div><div align="left"><i> <font face="Calibri">uint8_t * bitmap_out_tmp = bitmap_out;</font></i></div><div align="left"><i> <font face="Calibri">int32_t i = 0;</font></i></div><div align="left"><i> <font face="Calibri">int32_t x, y;</font></i></div><div align="left"><i> <font face="Calibri">uint32_t stride = lv_draw_buf_width_to_stride(g_dsc->box_w, LV_COLOR_FORMAT_A8);</font></i></div><div align="left"><i> <font face="Calibri">if(1) { // </font><font face="宋体">这里的循环,根据字形数据转换成</font><font face="Calibri">pixel</font><font face="宋体">数据。根据自己实际修改</font></i></div><div align="left"><i> <font face="Calibri">for(y = 0; y < g_dsc->box_h; y ++) {</font></i></div><div align="left"><i> <font face="Calibri">for(x = 0; x < g_dsc->box_w; x++, i++) {</font></i></div><div align="left"><i> <font face="Calibri">i = i & 0x7;</font></i></div><div align="left"><i> <font face="Calibri">if(i == 0) bitmap_out_tmp[x] = (*bitmap_in) & 0x80 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 1) bitmap_out_tmp[x] = (*bitmap_in) & 0x40 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 2) bitmap_out_tmp[x] = (*bitmap_in) & 0x20 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 3) bitmap_out_tmp[x] = (*bitmap_in) & 0x10 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 4) bitmap_out_tmp[x] = (*bitmap_in) & 0x08 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 5) bitmap_out_tmp[x] = (*bitmap_in) & 0x04 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 6) bitmap_out_tmp[x] = (*bitmap_in) & 0x02 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">else if(i == 7) {</font></i></div><div align="left"><i> <font face="Calibri">bitmap_out_tmp[x] = (*bitmap_in) & 0x01 ? 0xff : 0x00;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">if((i == 7) || (x == g_dsc->box_w-1)){</font></i></div><div align="left"><i> <font face="Calibri">bitmap_in++;</font></i></div><div align="left"><i> <font face="Calibri">if(x == g_dsc->box_w-1) i = 7;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">bitmap_out_tmp += g_dsc->box_w;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">return draw_buf;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">/*If not returned earlier then the letter is not found in this font*/</font></i></div><div align="left"><i> <font face="Calibri">return NULL;</font></i></div><div align="left"><i><font face="Calibri">}</font></i></div>
以上两个函数是重要的lvgl字形数据获取和转换的。都是根据原有的函数修改而来。字符的“间隔”和“行高”都可以在字体的结构体内相关参数修改。
**注:glyph_bitmap数组需要是全局变量。**
最后,再添加字体的声明。我是在lv_font.h中加的。 <div align="left"><i><font face="Calibri">LV_FONT_DECLARE(jlx_font_32)</font></i></div><div align="left"><i><font face="Calibri">LV_FONT_DECLARE(jlx_font_12)</font></i></div><div align="left"><i><font face="Calibri">LV_FONT_DECLARE(jlx_font_16)</font></i></div><div align="left"><i><font face="Calibri">LV_FONT_DECLARE(jlx_font_24)</font></i></div>
字符编码 以上完成之后,就可以按照字符的编码,查找IC内的字形数据,最后显示到显示屏。
但是,前提是能够正确解码。在lv_text.c内修改解码函数。 // 添加gb2312的解码函数声明和定义 <div align="left"><i><font face="Calibri">static uint32_t lv_text_gb2312_next(const char * txt, uint32_t * i);</font></i></div><div align="left"><i><font face="Calibri">static uint32_t lv_text_gb2312_next(const char * txt, uint32_t * i)</font></i></div><div align="left"><i><font face="Calibri">{</font></i></div><div align="left"><i> <font face="Calibri">/**</font></i></div><div align="left"><i> <font face="Calibri">* Unicode to UTF-8</font></i></div><div align="left"><i> <font face="Calibri">* 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx</font></i></div><div align="left"><i> <font face="Calibri">* 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx</font></i></div><div align="left"><i> <font face="Calibri">* 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx</font></i></div><div align="left"><i> <font face="Calibri">* 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx</font></i></div><div align="left"><i> <font face="Calibri">*/</font></i></div><div align="left"><i> <font face="Calibri">uint32_t result = 0;</font></i></div><div align="left"><i> <font face="Calibri">/*Dummy 'i' pointer is required*/</font></i></div><div align="left"><i> <font face="Calibri">uint32_t i_tmp = 0;</font></i></div><div align="left"><i> <font face="Calibri">if(i == NULL) i = &i_tmp;</font></i></div><div align="left"><i> <font face="Calibri">/*Normal ASCII*/</font></i></div><div align="left"><i> <font face="Calibri">if(LV_IS_ASCII(txt[*i])) {</font></i></div><div align="left"><i> <font face="Calibri">result = txt[*i];</font></i></div><div align="left"><i> <font face="Calibri">(*i)++;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">/*Real UTF-8 decode*/</font></i></div><div align="left"><i> <font face="Calibri">else {</font></i></div><div align="left"><i> <font face="Calibri">result = (txt[*i] << 8) | txt[(*i)+1];</font></i></div><div align="left"><i> <font face="Calibri">(*i) += 2;</font></i></div><div align="left"><i> <font face="Calibri">}</font></i></div><div align="left"><i> <font face="Calibri">return result;</font></i></div><div align="left"><i><font face="Calibri">}</font></i></div><div align="left"><i><font face="Calibri">// </font><font face="宋体">修改</font><font face="Calibri">lv_text_encoded_next</font><font face="宋体">函数指针的值</font></i></div><div align="left"><i><font face="Calibri">uint32_t (*const lv_text_encoded_next)(const char *, uint32_t *) = lv_text_gb2312_next;</font></i></div>
至此,大功告成。要注意有汉字需要显示的文件使用gb2312编码方式保存。
转自:RT-Thread论坛用户「用RTT跑流水灯」的原创文章 |