EMWIN中文字库添加方法
来源:互联网 发布:java搭建web服务器 编辑:程序博客网 时间:2024/04/30 00:56
emWin图形库由德国SEGGER公司开发的嵌入式GUI。用STM32及NXP系列MCU设计时,可以免费获得编译好的emWin库。
emWin默认是不支持中文显示的,如果要用到中文显示,只有自己添加了。
在工程中添加如下几个文件:ASCII_CODE.c、GUI_Font.c.、GUI_UC_EncodeNone.c、GUICharPEx.c。
在ASCII_CODE.c中写入如下两个数组用与存储对应汉字字体的半角ASCII字符点阵:
const unsigned char ASCII_08X16[95][16]= {1608ASCII字符点阵码,对应16X16汉字};
const unsigned char ASCII_12X24[95][48] = {2412ASCII字符点阵码,对应24X24汉字};
在GUI_Font.c文件中填入以下代码:
#include "GUI.H"#ifndef GUI_FLASH #define GUI_FLASH #endif#define HZ_16X16 0x00000//16x16汉字字库在FALSH中存储的偏移地址#define HZ_24X24 0x40000//24x24汉字字库在FALSH中存储的偏移地址extern void GUIPROP_HZ_DispChar(U16P c);extern int GUIPROP_HZ_GetCharDistX(U16P c, int * pSizeX);extern const unsigned char ASCII_08X16[95][16];extern const unsigned char ASCII_12X24[95][48];GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ_CharInfo[8] = { { 8, 8, 1, ( void *)ASCII_08X16},{ 16, 16, 2, ( void *)HZ_16X16}, { 12, 12, 2, ( void *)ASCII_12X24},{ 24, 24, 3, ( void *)HZ_24X24},};GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ16_PropHZ = { 0xA1A1, 0xF7FE, &GUI_FontHZ_CharInfo[1], (void *)0, };GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ16_PropASCII = { 0x0000, 0x007F, &GUI_FontHZ_CharInfo[0], (void GUI_CONST_STORAGE *)&GUI_FontHZ16_PropHZ, };GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16 = { GUI_FONTTYPE_PROP_HZ, 16, 16, 1, 1, (void GUI_CONST_STORAGE *)&GUI_FontHZ16_PropASCII};GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropHZ = { 0xA1A1, 0xF7FE, &GUI_FontHZ_CharInfo[3], (void *)0, };GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropASCII = { 0x0000, 0x007F, &GUI_FontHZ_CharInfo[2], (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropHZ, };GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24 = { GUI_FONTTYPE_PROP_HZ, 24, 24, 1, 1, (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropASCII};
在GUI_UC_EncodeNone.c文件中填放如下代码:
#include "GUI_Private.h"static U16 _GetCharCode(const char GUI_UNI_PTR * s){if((*s)>0xA1){return *(const U16 GUI_UNI_PTR *)s; }return *(const U8 GUI_UNI_PTR *)s;}static int _GetCharSize(const char GUI_UNI_PTR * s) {GUI_USE_PARA(s);if((*s) >= 0xA1) {return 2; }return 1;}static int _CalcSizeOfChar(U16 Char) {GUI_USE_PARA(Char);if(Char >= 0xA1A1) {return 2;}return 1;}static int _Encode(char *s, U16 Char) {if(Char >= 0xA1A1){*((U16 *)s) = (U16)(Char);return 2;}*s = (U8)(Char);return 1;}const GUI_UC_ENC_APILIST GUI_UC_None = {_GetCharCode, _GetCharSize, _CalcSizeOfChar, _Encode };const GUI_UC_ENC_APILIST GUI__API_TableNone = {_GetCharCode, _GetCharSize, _CalcSizeOfChar, _Encode };void GUI_UC_SetEncodeNone(void){#if GUI_SUPPORT_UNICODEGUI_LOCK();GUI_Context.pUC_API = &GUI_UC_None;GUI_UNLOCK();#endif}
在GUICharPEx.c文件中填入如下代码:
#include "GUI_Private.h"#include "flash.h"extern const unsigned char ASCII_08X16[95][16];extern const unsigned char ASCII_12X24[95][48];//字模数据的暂存数组,以单个字模的最大字节数为设定值#define BYTES_PER_FONT 48static U8 GUI_FontDataBuf[BYTES_PER_FONT];static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c){U8 qh,ql; U32 foffset; U32 i;U16 BytesPerFont;U8 *asciiaddr;U8 *baseaddr;baseaddr = (U8 *)pProp->paCharInfo->pData;BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数if (BytesPerFont > BYTES_PER_FONT) BytesPerFont = BYTES_PER_FONT;if (c<0x80){ //英文字符地址偏移算法 if (c<0x20){for(i=0;i<BytesPerFont;i++){ GUI_FontDataBuf[i] = 0x00; //ASCII控制字符用黑块表示 }} else {asciiaddr = baseaddr + (c-0x20)*BytesPerFont;for(i=0;i<BytesPerFont;i++){ GUI_FontDataBuf[i] = asciiaddr[i]; //调用ASCII字体 }} } else {ql = c/256;qh = c%256;if (qh<0xA1||ql<0xA1||ql>0xFE||qh>0xF7){//非常用汉字for (i=0;i<BytesPerFont;i++) GUI_FontDataBuf[i] = 0x00;//填充满格return; //结束访问} ql -= 0xA1;qh -= 0xA1; foffset=((unsigned long)94*qh+ql)*BytesPerFont;//得到字库中的字节偏移量flash_read(GUI_FontDataBuf,foffset+(U32)baseaddr,BytesPerFont);} }void GUIPROP_HZ_DispChar(U16P c) {int BytesPerLine;GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_pContext->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_pContext->DispPosX, GUI_pContext->DispPosY, pCharInfo->XSize, GUI_pContext->pAFont->YSize, GUI_pContext->pAFont->XMag, GUI_pContext->pAFont->YMag, 1, /* Bits per Pixel */ BytesPerLine, &GUI_FontDataBuf[0],//&GUI_FontDataBufText[0],// &LCD_BKCOLORINDEX );if (GUI_pContext->pAFont->YDist > GUI_pContext->pAFont->YSize){int YMag = GUI_pContext->pAFont->YMag;int YDist = GUI_pContext->pAFont->YDist * YMag;int YSize = GUI_pContext->pAFont->YSize * YMag;if (DrawMode != LCD_DRAWMODE_TRANS) {LCD_COLOR OldColor = GUI_GetColor();GUI_SetColor(GUI_GetBkColor());LCD_FillRect(GUI_pContext->DispPosX, GUI_pContext->DispPosY + YSize, GUI_pContext->DispPosX + pCharInfo->XSize, GUI_pContext->DispPosY + YDist); GUI_SetColor(OldColor);}}LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ GUI_pContext->DispPosX += pCharInfo->XDist * GUI_pContext->pAFont->XMag; }}int GUIPROP_HZ_GetCharDistX(U16P c, int * pSizeX) {const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_pContext->pAFont->p.pProp; for (; pProp; pProp = pProp->pNext) { if ((c >= pProp->First) && (c <= pProp->Last))break;}return (pProp) ? (pProp->paCharInfo)->XSize * GUI_pContext->pAFont->XMag : 0;}
最后,在emWin库的头文件GUI.h的恰当位置,约1750行处添加如下代码:
extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16;extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24;#define GUI_FONT_HZ16 &GUI_FontHZ16 #define GUI_FONT_HZ24 &GUI_FontHZ24
完成之后,编译一般不会不通过的,通过之后,可写如下小程序测试一下效果:
int main( void )
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//如果用stmemwin,这条代码必须有flash_init();//字库FLASH驱动初始化GUI_Init();GUI_Clear();GUI_DispString("Hello!,草泥马就是羊驼!\n");while (1){GUI_Delay(100);}
}
OK!祝你成功!
0 0
- EMWIN中文字库添加方法
- Wince 添加中文字库
- Wince 添加中文字库
- Wince 添加中文字库
- emwin如何添加字体并显示中文
- 给uGUI添加自定义中文字库
- 树莓派安装中文字库和输入方法
- emWin - 汉字字库生成及显示
- emwin字库制作及汉字显示
- 关于在TCC8900开发板上添加中文字库
- STM32 + UCGUI+外扩NAND FLASH 中文字库支持方法
- 在emwin中显示字库芯片GT23L24M0140的字模
- emwin使用自定义字库显示字母及汉字特殊字符
- emwin,我也用中文
- ubuntu 安装中文字库
- QT的中文字库
- ubuntu 安装中文字库
- MTK字库添加
- 串口IAP实验
- Android开发-将自定义View布局到Layout中并调用
- java中的网络编程
- Android自定义Layout
- 呵呵,我悄悄的来了~
- EMWIN中文字库添加方法
- DM3730 x-loader 分析 五
- Android实战简易教程-第四枪(ScrollView和HorizontalScrollView动态添加控件并提供事件监听)
- 转载一段关于当今剩女现象的经典好文
- poj 3061 尺取法
- js加载顺序测试
- 教你搞定Android自定义View
- Leetcode: House Robber II
- eclipse 错误 R.java was removed! Recreating R.java!