如何使用stm32中LCD的中英文显示

在STM32上使用LCD屏幕进行中英文显示通常涉及几个步骤,包括LCD驱动、图形库(如STM32 HAL库、UCGUI、LVGL等)的集成、字体文件的处理以及文本渲染。以下是一个简化的流程:

   

1. LCD驱动

首先,你需要为你的LCD屏幕编写或找到一个合适的驱动程序。这个驱动程序应该能够初始化LCD、设置像素、处理颜色等。

2. 图形库

使用图形库可以简化文本渲染和其他图形元素(如按钮、滑动条等)的创建。STM32 HAL库本身提供了一些基本的图形功能,但对于更复杂的界面,你可能需要使用更强大的图形库,如LVGL。

3. 字体处理

为了显示中英文字符,你需要有相应的字体文件。这些字体文件可以是位图字体(.bmp、.bin等)或矢量字体(如TrueType Font,.ttf)。

  • 位图字体:每个字符都是一个预定义的图像。优点是渲染速度快,但缺点是存储空间占用大。
  • 矢量字体:字符由数学描述定义,可以根据需要缩放。优点是节省存储空间,但渲染速度可能较慢。

4. 集成字体文件

将字体文件集成到你的项目中,并配置图形库以使用这些字体。不同的图形库有不同的方法来处理字体文件,但通常你需要将字体文件转换为图形库可以理解的格式,并将其包含在项目中。

5. 文本渲染

使用图形库的API函数来创建文本对象,并设置其文本内容、字体、颜色等属性。然后,你可以将这些文本对象放置在LCD屏幕上的任何位置。

一、中文显示原理

      已知字模是图形数据,而图形在计算机中是由一个个像素点组成的,所以字模实质是一个个像素点数据。为方便处理,我们把字模定义成方块形的像素点阵,且每个像素点只有0和1这两种状态(可以理解为单色图像数据),下图两个宽、高为16x16的像素点阵组成的两个汉字图形,其中的黑色像素点即为文字的笔迹。计算机要表示这样的图形,只需使用16x16个二进制数据位,每个数据位记录一个像素点的状态,把黑色像素点以“1”表示,无色像素点以“0”表示即可。这样的一个汉字图形,使用16x16/8=32个字节来就可以记录下来。

二、字模的生成

可以使用PCtoLCD2002生成字模

例如,我们需要显示A这个字符,相当于在屏幕上,在特定点进行填充,最后形成A这个字符。我们用字模工具,来创建这个字符对应的编码。

这个是我们常用的字模软件,主要设置如下:

1.选择字体为Consolas字体;

2. 字宽16 字高 16;

配置字模的解析顺序,解析顺序要和代码配套,否则会显示乱码。

生成后的字模数据如下,以“你好明天”为例:

0x10,0x01,0x10,0x01,0x10,0x01,0x88,0x7F,0x88,0x40,0x4C,0x20,0x2C,0x04,0x0A,0x04,
0x89,0x14,0x88,0x24,0x48,0x24,0x48,0x44,0x28,0x44,0x08,0x04,0x08,0x05,0x08,0x02,/*"你",0*/

0x08,0x00,0x08,0x3F,0x08,0x20,0x08,0x10,0x3F,0x08,0x24,0x04,0x24,0x04,0xA4,0x7F,
0x24,0x04,0x12,0x04,0x14,0x04,0x08,0x04,0x14,0x04,0x22,0x04,0x21,0x05,0x00,0x02,/*"好",1*/

0x00,0x00,0x00,0x3F,0x3E,0x21,0x22,0x21,0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21,
0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21,0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10,/*"明",2*/

0x00,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,
0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,/*"天",3*/

2. 显示中文

英文字母简单,只有26个英文字母,构建的ASCII表也非常简单。因此,显示英文的方法一般都是把全部ASCII用字模创建出来,放到fonts.c中。

然而中文的显示就会复杂很多。中文的字符数量非常多,如果都放到fonts.c文件,会把MCU内存吃尽。因此,我们必须有一些新的计数,来支持中文的显示。

2.1 GBK编码和GB2312编码


显示英文的时候,我们采用ASCII编码方式,将每个字符减去空格' ',得到的就是这个字符在ASCII表格里面的偏移量。通过偏移量,从fonts.c中,将文件输出出来。

针对中文,我们一般采用GBK编码,GBK编码把ASCII和中文GB2321合并起来了。对于一个字符,我们首先判断其数值是否大于126,如果不大于126,为英文,采用英文显示。否则为中文,采用中文显示即可。

GB2312中,采用了类似于ASCII的方式,对中文进行了编码。

2.1.1 分区表示


GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。这种表示方式也称为区位码。
01-09区收录除汉字外的682个字符。
10-15区为空白区,没有使用。
16-55区收录3755个一级汉字,按拼音排序。
56-87区收录3008个二级汉字,按部首/笔画排序。
88-94区为空白区,没有使用。
举例来说,“啊”字是GB2312编码中的第一个汉字,它位于16区的01位,所以它的区位码就是1601。

2.1.2 双字节编码


GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码。例如最后一个码位是9494,区号和位号分别转换成十六进制是5E5E,0x5E+0xA0=0xFE,所以该码位的GB2312编码是FEFE。

GB2312编码范围:A1A1-FEFE,其中汉字的编码范围为B0A1-F7FE,第一字节0xB0-0xF7(对应区号:16-87),第二个字节0xA1-0xFE(对应位号:01-94)。

2.1.3 解码过程

GB2312采用分区方式,对汉字进行编码,例如:16分区如上图所示,每一个区有94个字符。

 我们现在收到一个编码B0FC,我们如何将它破解为对应汉字呢?

解码过程如下:

0xB0FC对应的高位为0XB0,我们将其减去0XA0,得到了16,说明这个字符在16区;

0XFC-0XA0=92 说明这个字符为16区92字符,对应的字符为“包”。

在STM32中文字库中,是从0开始计数的,也就是说16区前面有15个区,这15个区中有15X94=1401个字符,然后再加上91,也就是偏移91格,就可以得到对应的字符:“包”

示例代码(以LVGL为例)

以下是一个简化的示例,说明如何在LVGL中使用中英文字符

#include "lvgl/lvgl.h"  
  
/* 假设你已经初始化了LCD和LVGL库 */  
  
/* 加载字体文件(这里只是一个示例,具体实现取决于你的字体文件和LVGL的配置) */  
extern LV_FONT_DECLARE(my_font_cn); /* 假设你有一个中文字体文件 */  
extern LV_FONT_DECLARE(my_font_en); /* 假设你有一个英文字体文件 */  
  
void create_label(void)  
{  
    /* 创建一个标签对象 */  
    lv_obj_t * label = lv_label_create(lv_scr_act(), NULL); /* 在当前活动屏幕上创建 */  
  
    /* 设置标签的文本内容(中英文混合) */  
    lv_label_set_text(label, "Hello, World! 你好,世界!");  
  
    /* 设置标签的字体(这里只是一个示例,你可能需要为中文和英文分别设置字体) */  
    /* 注意:LVGL可能不支持在同一个标签中使用不同的字体,你可能需要使用两个标签或文本块来处理中英文混合的情况 */  
    lv_label_set_font(label, &my_font_en, LV_LABEL_LONG_TXT_WRAP); /* 英文字体 */  
    /* 对于中文,你可能需要创建另一个标签或使用其他方法 */  
  
    /* 设置标签的位置和大小(可选) */  
    lv_obj_set_pos(label, 10, 10);  
    lv_obj_set_size(label, 200, 50);  
  
    /* 刷新屏幕以显示标签 */  
    lv_task_handler();  
}  
  
/* 在你的主函数或其他初始化函数中调用create_label函数 */

注意事项

  • 确保你的LCD驱动程序和图形库配置正确。
  • 字体文件的加载和处理可能因你的具体项目和使用的图形库而异。你可能需要查看图形库的文档以了解如何加载和使用字体文件。
  • 中英文混合显示时,你可能需要为中文和英文分别设置字体,或者使用其他方法(如两个标签或文本块)来处理。
  • 根据你的项目需求,你可能还需要处理其他文本渲染特性,如换行、滚动、字体大小调整等。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值