下面这几行代码,相信看过emWin手册的人,都不会陌生。
static GUI_FONT xbfFont; /* GUI_FONT structure in RAM */
static GUI_XBF_DATA XBF_Data; /* GUI_XBF_DATA structure in RAM */
static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
{
W25XxxReadData(FONT_BASE_ADDR + Off, pBuffer, NumBytes);
return (0);
}
void CreateXBF_Font(void)
{
GUI_XBF_CreateFont(&xbfFont, /* Pointer to GUI_FONT structure */
&XBF_Data, /* Pointer to GUI_XBF_DATA structure */
GUI_XBF_TYPE_PROP, /* Font type to be created */
_cbGetData, /* Pointer to callback function */
NULL); /* Pointer to be passed to callback */
}
//===================================================================
GUI_FONT * SetFont_Xbf(void)
{
return ((GUI_FONT *)GUI_SetFont(&xbfFont));
}
//===================================================================
FONT_BASE_ADDR 这是XBF文件在FLASH中的起始地址
W25XxxReadData 这是从FLASH中读取数据的函数
关键是这个函数 static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
Off 是XBF文件的内部偏移
pVoid 是GUI_XBF_CreateFont的最后一个参数,在这里我们不用这个参数。
pBuffer 读回来的数据就到这里了,剩下的就是emWin的事了。
附件给一个可用的FontCvt版本,我从网上找的,已经验证过的,不敢藏私,分享给大家用。用这个文件生成一个XBF文件,把文件下载到FLASH中就可以了。
emWin的字库采用的索引表的方式查找字符,在调用GUI_XBF_CreateFont创建XBF字库时,会读取字库的索引信息填充xbfFont,XBF_Data这两个结构体。
最后上一个简单的例程。
CreateXBF_Font(); //创建XBF字体
GUI_UC_SetEncodeUTF8(); //一定要设置这个
GUI_SetFont(GUI_FONT_6X8_ASCII);
GUI_DispStringAt("GUI Start Succ!", 7, 4);
SetFont_Xbf(); //然后像使用其它字体一样,设置XBF字库为当前字体
GUI_DispStringAt("汉字显示测试OK!", 4, 20); //用起来就是这么简单
GUI_DispStringAt("123ABC四五六七.", 4, 40); |