生活随笔
收集整理的這篇文章主要介紹了
                                
UCGUI使用外部字库芯片显示汉字
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
 
                                
                            
                            
                            在開(kāi)發(fā)板中用的是外部字庫(kù)芯片GT21L16S2W 
  
 調(diào)試步驟: 
 一、編寫(xiě)GT21L16S2W驅(qū)動(dòng),包括GT21L16S2W初始化函數(shù)和GT21L16S2W讀函數(shù),并配置好GT21L16S2W引腳,然后在調(diào)用GUI_Init()初始化UCGUI之前一定要調(diào)用GT21L16S2W初始化函數(shù),剛開(kāi)始調(diào)試的時(shí)候就是因?yàn)橥浾{(diào)用,搞了半天才發(fā)現(xiàn)問(wèn)題。 
 二、新建字庫(kù)文件HZK16.c,建立漢字字庫(kù)結(jié)構(gòu)體GUI_FontHZ16,字庫(kù)文件HZK16.c一定要引用頭文件SSP_GT21L16S2W.h,因?yàn)樵擃^文件中定義有各種類型字庫(kù)在GT21L16S2W芯片中的首地址,如上圖。建立字庫(kù)時(shí)要引用ASC字符和漢字字庫(kù)的首地址。 
 三、配置UCGUI 
 1、GUIConf.h 
  
 將默認(rèn)字體設(shè)置成新建字庫(kù)GUI_FontHZ16 
 2、GUI.h 
  
 在GUI.h中聲明新建字庫(kù)GUI_FontHZ16 
 3、GUICharP.c 
 修改Core/GUICharP.c中的void GUIPROP_DispChar(U16P c)函數(shù),使其能夠通過(guò)調(diào)用字符編碼從默認(rèn)字庫(kù)GUI_FontHZ16中打到字符所在點(diǎn)陣的信息,然后計(jì)算出字符點(diǎn)陣在GT21L16S2W芯片的中的地址,再調(diào)用GT21L16S2W的讀函數(shù)讀出字符點(diǎn)陣信息,然后通過(guò)LCD_DrawBitmap函數(shù)將點(diǎn)陣畫(huà)到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)函數(shù)也做了修改:
 
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;};
}
                            
總結(jié)
                            
                                以上是生活随笔為你收集整理的UCGUI使用外部字库芯片显示汉字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                            
                                如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。