博主在使用正点原子的STM32F4驱动液晶屏的时候,一直使用的是英文字体,也就是我们常用的ASCII码,这种是可以直接显示的。但是最近的一个需求是显示中文字体,这就需要我们嵌入中文,但是看正点原子的例程,均是采用的SD卡保存字库的方法,博主自己的PCB上并没有集成SD模块,这就需要我们直接将字库放入到flash里边,但是字库文件较大,因此我们需要找寻其他办法。
文档中使用到的工具链接:
百度云链接:https://pan.baidu.com/s/13ruFDUT_6MgiVg1cZqZa1Q
提取码:rvvh
CSDN下载链接:https://download.csdn.net/download/qq_34020487/13131222
我们先上一张之前英文显示的图片
我们先分析一下英文显示的思路:
- 首先需要一个英文的字库,也就是我们abcd对应的点阵数据。
- 在我们需要显示的地方,首先选择该字库,之后通过索引找到对应的点阵,进行显示即可。
因此我们首先新建一个中文字库,接下来通过索引找到对应的点阵即可。
新建中文字库
首先我们把需要转的中文每一个词语一行写入一个txt文档,另存为文件名别包含英文(保存为chinese_show.txt),编码方式选择Unicode编码方式。如下图所示。
使用到的软件为FontCvtDemo.exe ,利用该软件转成对应的点阵,也就是字库。
- 打开软件,按照如下设置
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;
//字体为32
FRAMEWIN_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);
//初始化BUTTON0
hItem = 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);//song16
TEXT_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);//song16
TEXT_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);//song16
TEXT_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的通知代码,控制LED1
switch(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