#include <stddef.h> /* needed for definition of NULL */
#include "GUI_Private.h"
#include "ff.h"
#include "malloc.h"
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
//字模数据的暂存数组,以单个字模的最大字节数为设定值
#define BYTES_PER_FONT 128
static U8 GUI_FontDataBuf[BYTES_PER_FONT];
extern void GUI_X_GetFontData(char *font, U32 oft, U8 *ptr, U8 bytes);
//从外部存储器取得字模数据
static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c)
{
U8 BytesPerFont;
U32 oft;
char *font = (char *)pProp->paCharInfo->pData;
BytesPerFont = GUI_Context.pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数
if (BytesPerFont > BYTES_PER_FONT){BytesPerFont = BYTES_PER_FONT;}
if (c < 0x80) //英文字符地址偏移算法
{
oft = c * BytesPerFont;
}
else
{
oft = ((((c >> 8)-0xA1)) + ((c & 0xFF)-0xA1) * 94)* BytesPerFont; //中文字符地址偏移算法包括符号
}
GUI_X_GetFontData(font, oft, GUI_FontDataBuf, BytesPerFont);
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUIPROP_DispChar
*
* Purpose:
* This is the routine that displays a character. It is used by all
* other routines which display characters as a subroutine.
*/
void GUIPROP_X_DispChar(U16P c)
{
int BytesPerLine;
GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_Context.pAFont->p.pProp;
//搜索定位字库数据信息
for (; pProp; pProp = pProp->pNext)
{
if ((c >= pProp->First) && (c <= pProp->Last))break;
}
if (pProp)
{
GUI_DRAWMODE OldDrawMode;
const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo;
GUI_GetDataFromMemory(pProp, c);//取出字模数据
BytesPerLine = pCharInfo->BytesPerLine;
OldDrawMode = LCD_SetDrawMode(DrawMode);
LCD_DrawBitmap(GUI_Context.DispPosX, GUI_Context.DispPosY,
pCharInfo->XSize, GUI_Context.pAFont->YSize,
GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag,
1, /* Bits per Pixel */
BytesPerLine,
&GUI_FontDataBuf[0],
&LCD_BKCOLORINDEX
);
/* Fill empty pixel lines */
if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize)
{
int YMag = GUI_Context.pAFont->YMag;
int YDist = GUI_Context.pAFont->YDist * YMag;
int YSize = GUI_Context.pAFont->YSize * YMag;
if (DrawMode != LCD_DRAWMODE_TRANS)
{
LCD_COLOR OldColor = GUI_GetColor();
GUI_SetColor(GUI_GetBkColor());
LCD_FillRect(GUI_Context.DispPosX, GUI_Context.DispPosY + YSize,
GUI_Context.DispPosX + pCharInfo->XSize,
GUI_Context.DispPosY + YDist);
GUI_SetColor(OldColor);
}
}
LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag;
}
}
/*********************************************************************
*
* GUIPROP_GetCharDistX
*/
int GUIPROP_X_GetCharDistX(U16P c)
{
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_Context.pAFont->p.pProp;
for (; pProp; pProp = pProp->pNext)
{
if ((c >= pProp->First) && (c <= pProp->Last))break;
}
return (pProp) ? (pProp->paCharInfo)->XSize * GUI_Context.pAFont->XMag : 0;
}
/*---------------------------------------------------------------------------*/
/*字库外部函数部分-----------------------------------------------------------*/
void GUI_X_GetFontData(char* font, U32 oft, U8 *ptr, U8 bytes)
{
FIL *fsrc; // 定义文件操作类
FRESULT res; // 定义操作结果变量
UINT br; // 定义读写数量变量
fsrc=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
res = f_open(fsrc, font, FA_OPEN_EXISTING | FA_READ); //打开字库文件
if(res != FR_OK)
{
//打开失败显示问号
}
res = f_lseek(fsrc,oft); //找到首地址
res = f_read(fsrc, ptr, bytes, &br); //读取32个字库点阵数据
res = f_close(fsrc); //关闭字体
myfree(SRAMIN,fsrc);
}
4.接下来就是新建三个自己的与字体相关的文件,分别是:
GUI_Font12.c,
GUI_Font14.c,
GUI_Font16.c,并且将它们加入工程
GUI_Font12.c内容如下:
注意:下述代码的字库在SD卡的路径(SD卡卷标为0,且"
SYSTEM"文件夹为SD卡根目录下的文件夹
#include "GUI.h"
/*
****************************************
*
*说明:GUI_FontHZ12.C文件
*
*By:ailson jack
*
*Date:2013.09.21
*****************************************
*/
extern int GUIPROP_X_GetCharDistX(U16P c);//声明部分
extern void GUIPROP_X_DispChar(U16P c) ;
GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ12_CharInfo[2] =
{
{ 6, 6, 1, (void *)"0:SYSTEM/FONT/GUI_ASC12.gui"},//&ASC_ROM_6X12 字库的路径
{ 12,12,2, (void*) "0:SYSTEM/FONT/GUI_HZ12.gui"}, //&HZ_ROM_12X12字库的路径
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ= {
0xA1A1, //第一个字符
0xFEFE, //最后一个字符
&GUI_FontHZ12_CharInfo[1], //字符信息
(void *)0,
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC= {
0x0000, //第一个字符
0x007F, //最后一个字符
&GUI_FontHZ12_CharInfo[0], //字符信息
(void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
};
GUI_CONST_STORAGE GUI_FONT GUI_FontHZ12 =
{
GUI_FONTTYPE_PROP_USER,
12, //xsize
12, //yszie
1, //x方向放大倍数
1, //y方向放大倍数
(void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropASC
};
至于GUI_Font14.c,GUI_Font16.c,的内容,可查看下面的附件。
至此,UCGUI的外置字库添加完成.
然后可在main()函数所在的文件里面输入:
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ12;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ14;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16;
再在main()函数里面输入如下代码(只是部分代码,相关初始化什么的就自己去弄吧):
GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("UC/GUI外置字库",30,30);
GUI_DispStringAt("---2013.09.21",81,50);
GUI_SetFont(&GUI_Font8x16);
GUI_DispStringAt("AILSON JACK",60,90);
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("MCU的世界,你值得探索!!!(12x12)",3,120);
GUI_SetFont(&GUI_FontHZ14);
GUI_DispStringAt("MCU的世界,你值得探索!!!(14x14)",3,140);
GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("MCU的世界,你值得探索!!!(16x16)",3,160);
GUI_SetFont(&GUI_FontHZ16);
移植不是随便编的,有图有真相哦

,其效果图如下:
好了,至此,应该就完成了UCGUI添加外置字库到SD卡的全过程。
附件在此: