博主在使用正点原子的STM32F4驱动液晶屏的时候,一直使用的是英文字体,也就是我们常用的ASCII码,这种是可以直接显示的。但是最近的一个需求是显示中文字体,这就需要我们嵌入中文,但是看正点原子的例程,均是采用的SD卡保存字库的方法,博主自己的PCB上并没有集成SD模块,这就需要我们直接将字库放入到flash里边,但是字库文件较大,因此我们需要找寻其他办法。

文档中使用到的工具链接:

百度云链接:https://pan.baidu.com/s/13ruFDUT_6MgiVg1cZqZa1Q 
                提取码:rvvh 
                CSDN下载链接:https://download.csdn.net/download/qq_34020487/13131222

我们先上一张之前英文显示的图片

我们先分析一下英文显示的思路:

  1. 首先需要一个英文的字库,也就是我们abcd对应的点阵数据。
  2. 在我们需要显示的地方,首先选择该字库,之后通过索引找到对应的点阵,进行显示即可。

因此我们首先新建一个中文字库,接下来通过索引找到对应的点阵即可。

新建中文字库

首先我们把需要转的中文每一个词语一行写入一个txt文档,另存为文件名别包含英文(保存为chinese_show.txt),编码方式选择Unicode编码方式。如下图所示。

使用到的软件为FontCvtDemo.exe ,利用该软件转成对应的点阵,也就是字库。

  1. 打开软件,按照如下设置

2.选择自己想要的字体、字形和大小,之后确认。

3.由于所有的字体均生成文件会比较大,我们只需要我们选定的文字。选择Edit->Disable all characters取消所有的字,之后选择Edit->read pattern file选择之前的txt文档,之后File->save as保存成一个新的文件,文件需要保存成英文的名字,文件选择.c文件,点击保存,即可生成字库文件。

4.此时我们还需要一个索引文件,英文字库的索引就是对应的英文值,我们使用一个U2C.exe生成索引,这个软件是获取UTF-8编码,将其转换成对应的编码。我们将最初的chinese_show.txt再次另存为一个编码格式为UTF-8的文档,chinese_show_utf_8.txt,在软件中选择该文件,点击convert,即可生成一个对应的chinese_show_utf_8.c文件。该文件即为我们每一行的索引。文件如下图所示。我们第一行的索引即为  冲洗吸干系统的索引值。

5.修改对应的.c文件,将main.c和需要显示的文件编码方式均采用上述另存为的方式改为utf-8编码格式(主要是为了出现汉字可以显示,我们直接采用转码的方式,不修改也可以)。

6.将我们之前的字体文件包含进我们的工程文件,在程序中调用,先设定字体再使用索引显示即可。

GUI_UC_SetEncodeUTF8();//设置成UTF-8的编码格式
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);//获取句柄
TEXT_SetFont(hItem, &GUI_Fontsong16);//设置字体
TEXT_SetText(hItem,"\xe5\x86\xb2\xe6\xb4\x97\xe5\x90\xb8\xe5\xb9\xb2\xe7\xb3\xbb\xe7\xbb\x9f");//显示汉字

至此,我们即可完成中文字体的显示。编码是以三个编码来编一个汉字,我们可以在中间插入转义字符比如

TEXT_SetText(hItem, "\xe6\xa8\xa1\n\xe5\xbc\x8f\n\xe4\xb8\x80");

就可以插入换行符。

最终博主实现了在STM32F103RCT6上和STM32F407ZET6上的显示。如下图所示。

由于STMF407为项目文件,这里只给出STM32F103的程序。

#include "DIALOG.h"
#include "ButtonUse.h"
#include "led.h"
#include "font_my.h"extern GUI_CONST_STORAGE GUI_FONT GUI_Fontsong16;//song16字体
extern GUI_CONST_STORAGE GUI_FONT GUI_Fontsong32;//song32字体
extern GUI_CONST_STORAGE GUI_FONT GUI_Fontsong64;//song64字体
extern const char Font_Close[]; //定义各个id值
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x01)
#define ID_TEXT_0 (GUI_ID_USER + 0x10)//ID_BUTTON_0
#define ID_TEXT_1 (GUI_ID_USER + 0x11)//ID_BUTTON_0
#define ID_TEXT_2 (GUI_ID_USER + 0x12)//ID_BUTTON_0//对话框资源表
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 300, 320, 0, 0x64, 0 },{ BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 100, 22, 150, 50, 0, 0x0, 0 },{ TEXT_CreateIndirect, "1234", ID_TEXT_0, 100, 100, 300, 80, 0, 0x0, 0 },{ TEXT_CreateIndirect, "1234", ID_TEXT_1, 100, 130, 300, 80, 0, 0x0, 0 },{ TEXT_CreateIndirect, "1234", ID_TEXT_2, 100, 160, 300, 80, 0, 0x0, 0 },
};//对话框回调函数
static void _cbDialog(WM_MESSAGE * pMsg)
{WM_HWIN hItem;int     NCode;int     Id;switch (pMsg->MsgId) {case WM_INIT_DIALOG://初始化对话框//设置编码方式GUI_UC_SetEncodeUTF8();hItem = pMsg->hWin;//字体为32FRAMEWIN_SetTitleHeight(hItem, 30);FRAMEWIN_SetFont(hItem, &GUI_Fontsong32);FRAMEWIN_SetText(hItem, "\xe5\x86\xb2\xe6\xb4\x97\xe5\x90\xb8\xe5\xb9\xb2\xe7\xb3\xbb\xe7\xbb\x9f");//FRAMEWIN_SetFont(hItem, GUI_FONT_24_ASCII);FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);FRAMEWIN_SetTextColor(hItem, 0x0000FFFF);//初始化BUTTON0hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);BUTTON_SetFont(hItem, GUI_FONT_24_ASCII);BUTTON_SetText(hItem, "LED1");//初始化16字体大小的文字  冲洗吸干系统hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);   TEXT_SetFont(hItem, &GUI_Fontsong16);//song16TEXT_SetText(hItem, "\xe5\x86\xb2\xe6\xb4\x97\xe5\x90\xb8\xe5\xb9\xb2\xe7\xb3\xbb\xe7\xbb\x9f");//初始化16字体大小的文字  模式一hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);  TEXT_SetFont(hItem, &GUI_Fontsong16);//song16TEXT_SetText(hItem, "\xe6\xa8\xa1\xe5\xbc\x8f\xe4\xb8\x80");//初始化16字体大小的文字  模式一 插入换行符hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);    TEXT_SetFont(hItem, &GUI_Fontsong16);//song16TEXT_SetText(hItem, "\xe6\xa8\xa1\n\xe5\xbc\x8f\n\xe4\xb8\x80");break;case WM_NOTIFY_PARENT:Id    = WM_GetId(pMsg->hWinSrc);NCode = pMsg->Data.v;switch(Id) {case ID_BUTTON_0: //BUTTON_0的通知代码,控制LED1switch(NCode) {case WM_NOTIFICATION_CLICKED:break;case WM_NOTIFICATION_RELEASED: //按钮被按下并释放LED1=~LED1;      //LED1反转//BEEP=~BEEP;break;    }break;}break;default:WM_DefaultProc(pMsg);break;}
}//创建一个对话框
WM_HWIN CreateFramewin(void)
{WM_HWIN hWin;hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);return hWin;
}//BUTTO演示函数
void ButtonUse_Demo(void)
{WM_HWIN hWin;hWin=CreateFramewin();while(1){GUI_Delay(100);}
}

本实验的STM32F103的中文显示项目文件地址为:https://download.csdn.net/download/qq_34020487/13131237

STM32使用EMWin实现中文字体显示相关推荐

  1. QML on Android 在小米5s手机上中文字体显示异常

    前言 随着Qt版本的不断升级,用QML开发Android移动端应用越来越方便,并且支持的功能也逐渐增多,不过由于Android机型实在太多,并且大部分Android系统都是由手机厂商深度定制过,然后在 ...

  2. linux 字体显示更清晰,Fedora下使中文字体显示变得更清晰

    前几天装了Fedora还是同样的老毛病,字体显示不清楚.系统中的字体其实还好,免强可以接受,可是用Firefox 上网就完全让人爱不了.中文字体显示都变得很模糊,看一会,眼晴都受不了. 在网上找了一大 ...

  3. 搞定Opera的中文字体显示

    原贴:http://gnuyhlfh.blog.ubuntu.org.cn/2008/10/31/搞定opera的中文字体显示/ 搞定Opera的中文字体显示 以前也试过Opera,可以这个中文显示实 ...

  4. TIA西门子博途下载HMI程序后,画面中文字体显示乱码的处理对策

    TIA西门子博途下载HMI程序后,画面中文字体显示乱码的处理对策 大家在使用或更换精简屏或精智屏时可能会碰到,组态好的项目下载到HMI后,出现了中文字体显示乱码等异常情况,这时,我们需要注意字体的使用 ...

  5. python微软雅黑字体_Matplotlib中文字体显示

    在Mac上安装Matplotlib 不使用Anaconda,直接使用pip安装即可: pip3 install matplotlib 向Matplotlib添加中文字体Microsoft YaHei( ...

  6. python画图包seaborn和matplotlib中文字体显示(针对windows系统,,使用ipython notebook)

    一.seaborn的中文字体显示(针对windows系统,,使用ipython notebook) #################### 更新:2017年6月16日 这次的seaborn版本是0. ...

  7. 完美解决deepin-wine-wechat微信黑块以及聊天输入框中文字体显示为竖条的问题(亲测有效!)

    一. 解决显示微信黑块的问题 1. 安装wmctrl sudo apt-get install wmctrl 2. 使用wmctrl命令查看系统正在运行的窗口 打开微信聊天窗口后会有黑块显示,此时如下 ...

  8. linux显示点阵字体,Fedora 17中文字体显示点阵状的解决方法

    在Fedora 17中文字体的显示变成点阵状了,为什么在Fedora 16下中文字体是文泉驿正黑.到Fedora 17之后,中文字体由文泉驿正黑(WenQuanYi Zen Hei)变为WenQuan ...

  9. unity关于中文字体显示问题

    在界面的字体显示问题,往往会碰到很多问题,比方工程里面是没有问题的,发布到移动端时却出现不显示问题.下面对Android于IOS的问题做下整理,只是针对动态字体. 1.Android Android由 ...

最新文章

  1. 10-CSS基础-CSS选择器
  2. 理解Windows内核模式与用户模式(新)
  3. 【Python基础】用Python制作漂亮的流动桑基图
  4. max无法创建新的堆栈防护页面_交互设计师,新媒体艺术家们请注意:2019MaxMSP必读书单来袭!...
  5. OSPF——DR及BDR详解
  6. C语言及程序设计进阶例程-12 结构体成员的引用
  7. 《天谕》全新PBR技术曝光 布料纹路清晰可见
  8. hadoop hdfs 单机配置
  9. windows 下 YII2 配置 memcache
  10. android gms测试,谷歌GMS认证需要测试哪些项目?
  11. java全栈_java全栈的知识技能
  12. win10退出微软账号
  13. 测试工程师进阶之测试用例发散思维(一)
  14. get_post X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
  15. 实现Comparable接口和Comparator接口
  16. 自动化所夏令营数学概念复习
  17. 小程序接入h5页面_h5页面和小程序交互
  18. python 试题:写一段程序逐行读入一个文本文件,并在屏幕上打印出来。
  19. 湖南湘中计算机学校历任校长,2005学年度湖南省中等职业学校.doc
  20. 仿百度联想词下拉列表,键盘上下键选值

热门文章

  1. 有道云笔记网页插件无法使用
  2. 数据分析项目-英国礼品商城数据分析
  3. 山东省“晨星工厂”政策解读汇总需求
  4. java什么是抽象思维_抽象思维的特点主要有哪些
  5. matlab 真假随机,Matlab 随机数是否随机的问题
  6. Java—获取任意一年的二月有多少天
  7. 碳化硅MOSFET制造后炉前清洗的湿处理
  8. 关于公司的下一步,如何找到革命性的商业点子?
  9. BK3266低功耗蓝牙音频模块芯片
  10. 遥感在地矿中的信息提取