0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机也可以轻松玩转UTF-8码和TTF字体了

冬至子 来源:FledgingSu 支离苏 作者:裸机思维 2023-11-23 17:18 次阅读

【UTF-8码简介】

要让智能设备支持各国不同的文字,首先得有支持全球文字的编码集,时下最出名的要数UTF-8码了。它一种可变长度字符编码,使用1~4字节为每个字符编码,由此它可以用来表示Unicode标准中的任何字符,而且仍与ASCII码相兼容。

有了国际范的UTF-8码,如果我们再有一个支持 UTF-8码的字库 ,那显示各国的文字就很简单了。接下来就讲一下怎么制作一个支持UTF-8码的字库(当然这个并不是包含所有的字符,而是只覆盖所需的就可以了)

【制作UTF-8码字库】

要制作字库,肯定是要找一个现成的取模工具了(这种工具网上有很多),今天我们就使用Arm-2D提供的一个python小工具来制作UTF-8码的字库,下载最新的Arm-2D,你就会看到在Acceleration下有一个ttf2c.py文件,如下图

image.png

有了这个工具,我们就看看怎么使用它来制作字库文件。

【准备工作】

首先,你的电脑中要安装了Python3,并且安装了下面两个软件包(freetype-py和numpy)

pip install freetype-py

然后从网上或者电脑C:WindowsFonts文件夹下找到一个后缀名为TTF的字体文件,如下

image.png

【制作字库】

接下来就用ttf2c.py制作字库,它的使用在官方文档中也有,如下

image.png

当然,你也可以用【-h】指令来查看它的使用方法,如下图

image.png

  • 我们使用的指令为:python3 ttf2c.py -h
  • 【-i】为后缀TTF文件
  • 【-t】为txt文件,里面为我们要生成字库的所有字符
  • 【-n】为我们生成的字库起名字,可以不写(默认为ARM_2D_FONT_UTF8)
  • 【-o】就是输出的字库文件
  • 【-p】为字体大小(比如30个像素、50个像素)
  • 【-s】可以设置生成的字库为A1、A2、A4、A8,(默认会生成所有的类型)。其中 A1所占的flash空间是最小的 ,A2、A4、A8还支持字体透明度哦。

好,那我们现在就用这个工具生成一个字库试试,首先新建一个txt文件,输入我们要生成字库的所有字符,如下

image.png

在cc.txt文件中输入的字符为“ 嵌入式小书虫 ”,待会就会生成对应的字库文件。

生成字库的指令如下

image.png

此时就会生成字库文件 qrsxsc.c ,如下图

image.png

有了字库文件,显示字符就很简单了。

【显示UTF-8码的文字】

使用Arm-2D来显示自定义字库中的文字也很简单,首先声明一下我们生成的字库,以A8为例,如下

extern struct {

然后就可以使用这个字库啦,很简单,代码如下

arm_lcd_text_set_font(&ARM_2D_FONT_UTF8_A8);
  • 第1行就是设置我们的字库
  • 第2行为设置字符显示的区域,NULL为整个屏幕
  • 第3行为设置字体颜色
  • 第4行为设置在第几行第几列进行显示字符
  • 第5行为设置字体的透明度
  • 最后调用arm_lcd_printf函数就可以了

注意: 此时,把程序下载进去,可能屏幕不会显示“ 嵌入式小书虫 ”这几个字哦!

这是因为我们的字库是UTF-8编码的,而你在keil MDK中可能设置的是GB2312编码集哦,所以当屏幕没有显示出我们想要的字符时,要记得修改一下编码集,如下

image.png

点击小扳手进行设置,如下

image.png

好了,这样屏幕中就可以显示我们的字符了。

值得一说的是我们使用了Arm-2D提供的arm_lcd_print_banner 函数,它可以方便我们 在指定的区域内居中显示字符串 ,如下图

image.png

程序如下

arm_2d_region_t myRegions={
  • 第1个参数就是要显示的字符串
  • 第2个参数为字符串显示的区域
  • 第3个参数就是要使用的字体

怎么样,使用还是很简单吧,O(∩_∩)O哈哈~

其实banner还有2个不同的版本(不同的参数)哦!

如果我们已经设置好了字体,第3个参数是可以省略的,如下

arm_lcd_print_banner("雷阵雨",myRegions);

如此,上面的代码也可以改写成这样,如下

arm_lcd_text_set_font((arm_2d_font_t*)&ARM_2D_FONT_UTF8_A8);

同样的,第二个参数也可以省略,如下

arm_lcd_print_banner("雷阵雨");

那这个只有一个参数,没有设置区域,它会在哪里居中呢?

此时如果只传一个参数,它就会 默认在屏幕中间显示字符串

是不是觉得banner这个函数就是专门为支持各国不同的文字量身定做的,使我们可以轻松实现多国语言的切换

当然,使用很简单,那是因为Arm-2D都为我们制作好了,其实TTF字体里面还有很多Bearing( 字体大小、水平预留值等 ),如下图

image.png

这些Arm-2D都为我们做好了,感兴趣的可以看源码哈(* ̄︶ ̄),这里我们就不讲了。

不过还有一个关于字符显示的API函数需要简单介绍一下,就是提取一行字符串尺寸的函数,如下

arm_2d_size_t StringSize = arm_lcd_get_string_line_box("雷阵雨",&ARM_2D_FONT_UTF8_A8);
  • arm_lcd_get_string_line_box这个函数可以帮我们计算出给定字体给定字符串的一行的尺寸,这样就可以精确控制字符串位置(方便进行对齐哦),在banner函数中就使用了此函数,它的妙用还期待大家进行开发( *  ̄︶ ̄)

【温故知新】

对了,大家有没有发现,视频中的闪电由明变暗然后又变明(好像在呼吸),这个是怎么实现的呢?

其实这个还是用了上一篇文章讲过的知识,使用了arm_2d_helper_time_cos_slider,程序如下

uint8_t opacity = 0;
  • 在frame_start函数中调用,使iResult的取值按照cos函数变化,其取值范围为0~255,然后赋值给opacity,使闪电图片的透明度按照cos曲线变化
  • 最后在绘制函数中按照计算出来的透明度进行绘制就可以了,如下
arm_2dp_rgb565_tile_copy_with_colour_keying_and_opacity(NULL,
  • 倒数第2个参数就是透明度哦
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620871
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361831
  • LCD显示
    +关注

    关注

    0

    文章

    122

    浏览量

    18188
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473
  • UTF-8
    +关注

    关注

    0

    文章

    13

    浏览量

    7817
收藏 人收藏

    评论

    相关推荐

    LABVIEW字符串转换为UTF-8编码字符串

    提供。实际上,LABVIEW中包含了很多非常有用的内置函数或者VI,但是并没有列入帮助文档,所以一般情况下不容易发现。今天给大家介绍的文本转换为UTF-8的函数就是如此。LABVIEW提供STMP库
    发表于 06-06 15:16

    如何在海思HI3716平台上实现TV上支持UTF-8编码格式显示?

    TV上显示UTF-8字体,不用转GB2312HI_S32 main(HI_S32 argc, HI_CHAR* argv[]){HI_S32 s32Ret = 0;HI_HANDLE hFont
    发表于 05-30 11:32

    怎么在MDB中将编码设置为UTF-8

    是否有一种方法将编码设置为MDB中的UTF-8。我在Ubuntu/PIC18/XC8编译器上运行我的测试代码,预处理失败,在UTF-8中使用了一个无效的字节序列。一些外来字符的存在导
    发表于 10-25 16:51

    如何将文件编码更改为UTF-8

    HII正在对我的项目本地化,需要使用UTF-8编码的字符串。我有一切工作代码,但在编辑器中,字符串显示,如果编码的ANSI拉丁代码页。我了解到,在开始新项目时可以选择UTF-8编码,关于如何为现有
    发表于 07-03 10:30

    LabVIEW如何将UTF-8转为中文

    各位,在LabVIEW的库中可以找到文本转UTF-8工具,如下:我想请教下,有人知道如何UTF-8转文本吗?就是将上面的“E4B8ADE59BBD”转为“中国”,在线等,非常感谢!
    发表于 11-08 17:15

    TTF字体中文显示问题如何解决

    ;TTF18_Font);}[C] 纯文本查看 复制代码BUTTON_SetText(WM_GetDialogItem(WM_HBKWIN, 4),"测试ceshi");文件的编码是utf-8
    发表于 05-25 04:04

    如何将UTF-8转换为GBK编码

    概述我们在单片机开发中常会遇到需要将UTF-8转换为GBK编码的需求。在我们了解各种编码格式的情况下可知,UFT-8不能直接转成GBK,需中转成unicode再转换为gbk。而unicode和gbk
    发表于 12-09 07:39

    如何用stm32单片机接收APP发下来的汉字

    ASCII(GBK,GB2312)。现在升级STM32单片机程序,发现需要UTF-8编码,APP和服务器最好不动,不然修改太大。所以就出现ASCII(GBK,GB2312)转unicode转
    发表于 01-25 06:58

    RT-Thread Studio的GBK编码版本如何改为UTF-8

    2.2.1工作区显示 GBK 编码,如何改为 UTF-8 呢?操作【窗口】–> 【首选项】在【搜索框】中,可以输入【编码】,这样,找到 【常规】–> 【工作空间】【文本文件编码】,改为
    发表于 05-20 10:05

    请问如何在TouchGFX的TextArea通配符中显示UTF-8文本?

    是“UTF-8”,所以这是文件编码。我尝试使用 UART 作为调试控制台,它可以毫无问题地输出 UTF-8 文本。我猜 TouchGFX 的 Unicode 函数不希望 char* 字符串是
    发表于 12-09 06:11

    IAR中UTF-8中文字符串不显示怎么解决?

    界面使用的是ucGUI原本使用GB2312编码的中字符串可以直接读取显示,字库用FontCvt做了初始化的时候添加了GUI_UC_SetEncodeutf8();函数 后面换成
    发表于 10-07 07:11

    轻松玩转AVR单片机C语言》2.pfd

    轻松玩转AVR单片机C语言》2.pfd
    发表于 09-30 16:49 0次下载

    轻松玩转AVR单片机C语言》3.pfd

    轻松玩转AVR单片机C语言》3.pfd
    发表于 09-30 16:51 0次下载

    轻松玩转AVR单片机C语言》4.pfd

    轻松玩转AVR单片机C语言》4.pfd
    发表于 09-30 16:53 0次下载

    轻松玩转AVR单片机C语言》5.pfd

    轻松玩转AVR单片机C语言》5.pfd
    发表于 09-30 16:54 0次下载