生活随笔
收集整理的這篇文章主要介紹了
UCGUI使用外部字库芯片显示汉字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發(fā)板中用的是外部字庫芯片GT21L16S2W
調試步驟:
一、編寫GT21L16S2W驅動,包括GT21L16S2W初始化函數和GT21L16S2W讀函數,并配置好GT21L16S2W引腳,然后在調用GUI_Init()初始化UCGUI之前一定要調用GT21L16S2W初始化函數,剛開始調試的時候就是因為忘記調用,搞了半天才發(fā)現問題。
二、新建字庫文件HZK16.c,建立漢字字庫結構體GUI_FontHZ16,字庫文件HZK16.c一定要引用頭文件SSP_GT21L16S2W.h,因為該頭文件中定義有各種類型字庫在GT21L16S2W芯片中的首地址,如上圖。建立字庫時要引用ASC字符和漢字字庫的首地址。
三、配置UCGUI
1、GUIConf.h
將默認字體設置成新建字庫GUI_FontHZ16
2、GUI.h
在GUI.h中聲明新建字庫GUI_FontHZ16
3、GUICharP.c
修改Core/GUICharP.c中的void GUIPROP_DispChar(U16P c)函數,使其能夠通過調用字符編碼從默認字庫GUI_FontHZ16中打到字符所在點陣的信息,然后計算出字符點陣在GT21L16S2W芯片的中的地址,再調用GT21L16S2W的讀函數讀出字符點陣信息,然后通過LCD_DrawBitmap函數將點陣畫到LCD屏上。
void GUIPROP_DispChar(U16P c) {int BytesPerLine;U16 BytesPerFont;U32 base, oft;U8 MSB, LSB;GUI_DRAWMODE DrawMode
= GUI_Context
.TextMode;const GUI_FONT_PROP GUI_UNI_PTR
* pProp
= GUIPROP_FindChar(GUI_Context
.pAFont
->p
.pProp, c);
if (pProp) {GUI_DRAWMODE OldDrawMode;const GUI_CHARINFO GUI_UNI_PTR
* pCharInfo;
if (GUI_Context
.pAFont
== &GUI_FontHZ16) {pCharInfo
= pProp
->paCharInfo;base
= (U32)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
-0x20)
* BytesPerFont
+ base;GT21L16S2W_Read(oft, GUI_FontDataBuf, BytesPerFont);OldDrawMode
= LCD_SetDrawMode(DrawMode);BytesPerLine
= pCharInfo
->BytesPerLine;LCD_DrawBitmap(GUI_Context
.DispPosX, GUI_Context
.DispPosY,pCharInfo
->XSize/
2, GUI_Context
.pAFont
->YSize,GUI_Context
.pAFont
->XMag, GUI_Context
.pAFont
->YMag,
1, BytesPerLine, GUI_FontDataBuf,
&LCD_BKCOLORINDEX);}
else {MSB
= c
>> 8;LSB
= c
& 0xFF;
if (MSB
== 0xA9 && LSB
>= 0xA1)oft
= (
282 + (LSB
- 0xA1))
* BytesPerFont
+ base;
else if (MSB
>= 0xA1 && MSB
<= 0xA3 && LSB
>= 0xA1)oft
= ((MSB
-0xA1)
* 94 + (LSB
- 0xA1))
* BytesPerFont
+ base;
else if (MSB
>= 0xB0 && MSB
<= 0xF7 && LSB
>= 0xA1) oft
= ((MSB
-0xB0)
* 94 + (LSB
- 0xA1)
+ 846)
* BytesPerFont
+ base;GT21L16S2W_Read(oft, GUI_FontDataBuf, BytesPerFont);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, BytesPerLine, GUI_FontDataBuf,
&LCD_BKCOLORINDEX);}}
else {pCharInfo
= pProp
->paCharInfo
+(c
-pProp->First);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, BytesPerLine,pCharInfo
->pData,
&LCD_BKCOLORINDEX);}
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); GUI_Context
.DispPosX
+= pCharInfo
->XDist
* GUI_Context
.pAFont
->XMag;}
}
int GUIPROP_GetCharDistX(U16P c)函數也做了修改:
int GUIPROP_GetCharDistX(U16P c) {
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
//return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Context.pAFont->XMag :
0;
if(GUI_Context.pAFont == &GUI_FontHZ16){
return (pProp) ? pProp->paCharInfo->XDist * GUI_Context.pAFont->XMag :
0;}
else{
return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XDist * GUI_Context.pAFont->XMag :
0;};
}
總結
以上是生活随笔為你收集整理的UCGUI使用外部字库芯片显示汉字的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。