Ucgui汉字库的建立方法
1.
2.
3.
4.
5.
在UC/GUI中F16_1hk.c文件中定义的GUI_FONT_PROP结构体对象,通过注释了解映像地址和字模数据存储地址的对应的关系。
GUI_FLASH
};
6.
在UC/GUI中动态地读取字模是无法实现的,即当程序运行时动态地从汉字库中读取所需要的字母的字模,因此只有把所有一级常用汉字的字模全部取出,按照UC/GUI中字库创建的标准去创建新的字库就可以了。下面以在F16_HZ_LEI.C中创建字体GUI_Font6_HZ为例来说明具体的步骤。
第一:声明全局字体结构体对象GUI_Font16_HZ,该声明必须在GUI.H文件中加以说明,
extern const GUI_FONTGUI_Font16_HZ
第二:定义一个用于存放字模数据的数组。
GUI_FLASH const unsigned char acFont16HZSong_16_0001 =[……]
第三:定义一个GUI_CHARINFO的结构体对象数组,用于说明每个字母的字模数据在程序段存储的方式。
GUI_FLASH const GUI_CHARINFO GUI_Font16_HZ_CharInfo/[3760\]= {{16,16,2,(voidGUI_FLASH*)&acFont16HZ\[\0],……,16,16,2,(voidGUI_FLASH*)&acFont16HZ\[3759\]},}
第四:按汉字内码的高位来定义多个结构体GUI_FONT_Prop0={0xb0a1,0xb0fe,&GUI_Font_HZ_CharInfo\[0\],(voidGUI_FLASH*)&GUI_Font_HZ_Prop1};
第五:把创建的汉字库文件F16_HZ_LEI.C添加到UC/GUI的工程中,通过以下语句实现在LCD上显示汉字:GUI_SetFont(&GUI_Font16_HZ);
7.通常情况下我们所使用的开发板的存储器都较小,并且我们在一篇文章中不可能使用所有的十六点阵或者十二点阵包含的所有汉字,那么此时我们就需要从这些点阵中挑选出我们需要使用的汉字。这种情况下汉字的机内码存储就不是连续的,有些时候下可能得为单独的一个汉字建立一个GUI_FONT_PROP结构,然后再将它们链成链表,这样做就可以直接使用以下两种方法:
比如我们此刻要在LCD上显示“世界你好”:
方法一、const unsigned charhelloworld[] = "世界你好";
此时是编译器将汉字转换为机内码
方法二、
const unsigned charhelloworld[]={0xca, 0xc0, 0xbd, 0xe7, 0xc4, 0xe3, 0xba, 0xc3,0x00};
GUI_DispString((const char*)helloworld);
此时编译器利用数组中存储的汉字的机内码找到相应的汉字输出至LCD上。
如上两种比较, 结果是一样的,唯一不同的是, 第一种方法显示汉字时, 无须使用知道汉字的机内码, 而是由编译器来转换的,但我要说的是, 其实两者本质是一样的, 只是对使用者来说有表面上的不同.比较以上的两种显示汉字时构造字符串的方法,我们可以得到一个启示, 对于第二种, 我们可以采取自定义汉字机内码, 然后直接通过自定义机内码来显示汉字,这一点我已经在"建立自定义小型汉字库说明"一文当中说明了,现在我想说的是对于采用第一种方法显示汉字的建立自定义小型字库的方法。
#include "GUI.H"
#ifndef GUI_FLASH
#define GUI_FLASH
#endif
extern GUI_FLASH const GUI_FONT GUI_FontHZ12;
//世
GUI_FLASH const unsigned char acFontHZ12_cac0[24] = {
0x04,0x40, 0x24,0x40, 0x24,0x40, 0x24,0x40, 0xff,0xf0, 0x24,0x40,0x24,0x40, 0x24,0x40,
0x27,0xc0, 0x24,0x40, 0x20,0x00, 0x3f,0xf0
};
//界
GUI_FLASH const unsigned char acFontHZ12_bde7[24] = {
0x3f,0xc0, 0x24,0x40, 0x3f,0xc0, 0x24,0x40, 0x3f,0xc0, 0x04,0x00,0x0b,0x00, 0x38,0xf0,
0xc9,0x20, 0x09,0x00, 0x11,0x00, 0x61,0x00
};
//你
GUI_FLASH const unsigned char acFontHZ12_c4e3[24] = {
0x12,0x00, 0x12,0x00, 0x27,0xf0, 0x24,0x20, 0x69,0x40, 0xa1,0x00,0x25,0x40,
0x25,0x20, 0x29,0x10, 0x31,0x10, 0x25,0x00, 0x22,0x00
};
//好
GUI_FLASH const unsigned char acFontHZ12_bac3[24] = {
0x20,0x00, 0x27,0xe0, 0x20,0x40, 0xf8,0x80, 0x48,0x80, 0x48,0xa0,0x57,0xf0, 0x50,0x80,
0x30,0x80, 0x28,0x80, 0x4a,0x80, 0x81,0x00
};
GUI_FLASH const GUI_CHARINFO GUI_FontHZ12_CharInfo[4] = {
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_cac0},
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_bde7},
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_c4e3},
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_bac3}
};
GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa4= {
0xbac3,
0xbac4,
&GUI_FontHZ12_CharInfo[3],
0
};
GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa3= {
0xc4e3,
0xc4e4,
&GUI_FontHZ12_CharInfo[2],
(void *)&GUI_FontHZ12_Propa4
};
GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa2= {
0xbde7,
0xbde8,
&GUI_FontHZ12_CharInfo[1],
(void *)&GUI_FontHZ12_Propa3
};
GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa1= {
0xcac0,
0xcac1,
&GUI_FontHZ12_CharInfo[0],
(void*)&GUI_FontHZ12_Propa2
};
GUI_FLASH const GUI_FONT GUI_FontHZ12 = {
GUI_FONTTYPE_PROP_SJIS,
12,
12,
1,
1,
(void GUI_FLASH *)&GUI_FontHZ12_Propa1
};
结语:在上述过程中介绍了LCD上汉字的显示方法,已经成功建立了12点阵和16点阵的汉字库。
来自:http://blog.sina.com.cn/s/blog_724d24bf0100vmgp.html