emwin本身是不支持直接显示汉字的,需要添加字库来协助显示,还需要选择编码(UTF-8)方式。
就字库的添加有两种:1、直接在项目代码中添加.c的字库(适合较小的字库);2、吧二进制字库文件烧写进flash里面在读取出来(位置字库法,适合较大的字库);
1、在项目中直接添加字库
(2)、使用U2C获得显示字的unicode编码;
(3)、添加进入项目,显示打印;
代码:
GUI_SetFont(&GUI_Font16); //选择字库
GUI_UC_SetEncodeUTF8(); //设置编码
GUI_DispStringAt("\xe7\x91\x9e\xe5\xba\xb7\xe5\xae\x8f\xe4\xb8\x9a", 3, 3); //在制定位置打印
2、从外部SPI flash读取(无文件系统)
(1)、使用FontCvt生成二进制字库文件,并且烧写进外部存储(这里生成的是XBF格式,使用SPI 串口烧写进SPI flash中。这个看具体需要,方法不同);
(2)、使用U2C获得显示字的unicode编码;
(3)、项目中添加代码GUI_XBF_CreateFont函数,打印实现;
代码:
回调函数:
static int _cbGetData(U32 Off, U16 NumBytes, void *pVoid, void *pBuffer)
{
spinorflashReadData(pBuffer, Off, NumBytes); //直接从spiflash中读取数据
//如果需要多个字库,把上面的Off改为Off+字库地址偏移就可以了。不能直接写字库地址偏移
return 0;
}
编码打印:
GUI_XBF_CreateFont(&XBF_Font16, &XBF_Data,GUI_XBF_TYPE_PROP, _cbGetData, (void *)0);
GUI_UC_SetEncodeUTF8();
GUI_DispStringAt("\xe7\x91\x9e\xe5\xba\xb7\xe5\xae\x8f\xe4\xb8\x9a", 3, 3);
3、从外部flash读取(有文件系统)
步骤与无文件系统一样,附代码:
static int __cbGetData(U32 Off, U16 NumBytes, void *pVoid, void *pBuffer)
{
FIL *FontFile;
FontFile = (FIL *)pVoid;
fr = f_lseek(FontFile, Off);
if(FR_OK != fr)
{
return 1;
}
fr = f_read(FontFile, pBuffer, NumBytes, &bw);
if(FR_OK != fr)
{
return 1;
}
return 0;
}
static void __ShowXBF(void)
{
fr = f_open(&Fontfile, "Font16.xbf", FA_OPEN_EXISTING | FA_READ);
if(FR_OK != fr)
{
GUI_DispDecAt(fr, 2, 3, 3);
return ;
}
GUI_XBF_CreateFont(&XBF_Font16, &XBF_Data, GUI_XBF_TYPE_PROP_AA4_EXT, __cbGetData, &Fontfile);
}
自己搞这个,不知转了多少个弯啊!!!