STM32使用EMWin实现中文字体显示

       博主在使用正点原子的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;
			//字体为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

   

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页