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

   

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F4是一款高性能的单片机系列,它内置了强大的ARM Cortex-M4内核,具有丰富的外设和高速的处理能力,非常适合用于开发各种嵌入式应用。 emWin是一款专业的嵌入式图形库,它可以在STM32F4上运行,提供了丰富的图形显示和用户界面功能。通过使用emWin,我们可以轻松地实现各种图形界面设计,包括示波器的功能。 示波器是一种常用的测试设备,用于显示电压信号的变化情况。在STM32F4上使用emWin图形库,可以实现一个简单的示波器应用程序。首先,我们可以通过ADC模块获取外部信号的电压值。然后,使用emWin中的绘图函数将这些电压值显示在屏幕上,形成波形图。同时,我们还可以使用触摸屏或按键等输入设备,实现一些调整功能,比如改变波形的时间尺度或幅度,以及选择不同的输入通道等。此外,我们还可以添加触发功能,使波形在特定条件下触发显示,以便更好地观察信号。 要实现STM32F4上的emWin示波器,首先需要了解STM32F4的硬件架构和外设功能。然后,使用STM32CubeMX工具进行初始化设置,并在开发环境中编写相应的代码。在编写代码时,我们需要使用emWin提供的绘图函数和用户界面库函数,来实现波形的绘制和交互功能。 总之,使用STM32F4和emWin图形库,我们可以很方便地实现一个功能强大的示波器应用程序。这个示波器可以用于各种测试和测量应用,是嵌入式系统开发中非常有用的工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值