分类: 嵌入式
2011-10-30 14:00:55
要高效的利用汉字, 最好的办法是建立自己的小汉字库,要做到这一点, 就必须理解汉字库的构成原理及汉字的显示原理.否则常规的汉字库太大了, 网上流传的HZK12.C文件, 是一个完全的汉字库源码文件,是按照UCGUI中处理文字显示的基本原理来显示汉字的----即以点阵位图来显示文字. 但是这个文件很大, 不可能直接在嵌入式当中使用的..
我认为一种可行的比较灵活的办法是, 将可能用到的汉字集中在一块编一个序号,比如说"世界你好", 则编号分别为0xa1a1,0xa1a2,0xa1a3,0xa1a4, 请注意这些编码与机内码没有任何关联, 是我们自定义的文字机内码.
世-------->0xa1a1
界-------->0xa1a2
你-------->0xa1a3
好-------->0xa1a4
构建SmallHZK12.c如下:显示"世界你好".
调用时如下:
void MainTask(void)
{
// ToD Make sure hardware is initilized first!!
//自定义小字库时用.
const unsigned char helloworld[]={0xa1, 0xa1, 0xa1, 0xa2, 0xa1, 0xa3, 0xa1, 0xa4, 0x00};
//标准字库时用
//const unsigned char helloworld[]={0xca, 0xc0, 0xbd, 0xe7, 0xc4, 0xe3, 0xba, 0xc3, 0x00};
GUI_Init();
GUI_DispString((const char*)helloworld);
while(1){
//GUI_DispStringHCenterAt("TEST汉字支持 ", 50, GUI_GetDispPosY());
GUI_Delay(800);
}
}
/***********************************************************************
REVISION LOG ENTRY
Revision By: ucgui
Revised on 2005-6-17 19:09:52
QQ:106719880
Email:ucgui@163.com
Home:
Comments: SmallHZK12.c
***********************************************************************/
#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_Propa2= {
0xa1a1,
0xa1fe,
&GUI_FontHZ12_CharInfo[0],
0
};
GUI_FLASH const GUI_FONT GUI_FontHZ12 = {
GUI_FONTTYPE_PROP_SJIS,
12,
12,
1,
1,
(void GUI_FLASH *)&GUI_FontHZ12_Propa2
};
不过目前有一个问题, 就是显示结果挤在一块了.只是显示半个字节.这个问题下一步解决..
呵呵.....先吃钣...
[2005/07/14]
昨天晚上已经解决了半个汉字的问题, 写了一篇详细些的文档, 不过由于拷错文件, 没持拷过来, 所以暂且只贴了代码, 没有大多的详细说明.
演示代码下载:
截图下载:
[2005/07/14]
在上一文中已经提供了一种自定义小型字库的说明, 现在再提出另外一种建立小型字库的方法, 这两种差别不大, 但构造方法还是有区别的, 希望大家可以对自定义字库(其实也就是自定义自己的字体)有本质的认识, 很多朋友对于UCGUI当中字体文件的.C文件是如何产生的不清楚原理, 也有许多朋友不不清楚自定义汉字字体的原理与方法, 这里我就如何自定义小型汉字库做了很清楚的说明, 须要的朋友可以看看....
从HZK16中取出所须的汉字, 组成新的字库文件, 再变成UCGUI中所须的源文件. 这样讲是非常抽象的, 首先, 你取出的汉字, 其机内码不是连续的, 那么这样一来, 如果还是使用汉字的标准机内码的话, 则必须为每一个要用到的汉字都建立一个GUI_FONT_PROP结构, 一个汉字一个, 在将他们链接成链表, 这样做唯一好处是可以直接以如下方法:
const unsigned char helloworld[]="世界你好";
GUI_DispString((const char*)helloworld);
依*编译器来将"世界你好"转变成汉字机内码的字符串. 但我们亦可手工构造要显示的汉字如下:
const unsigned char helloworld[]={0xca, 0xc0, 0xbd, 0xe7, 0xc4, 0xe3, 0xba, 0xc3, 0x00};
GUI_DispString((const char*)helloworld);
如上两种比较, 结果是一样的,唯一不同的是, 第一种方法显示汉字时, 无须使用知道汉字的机内码, 而是由编译器来转换的,
但我要说的是, 其实两者本质是一样的, 只是对使用者来说有表面上的不同.比较以上的两种显示汉字时构造字符串的方法, 我们可以得到一个启示,
对于第二种, 我们可以采取自定义汉字机内码, 然后直接通过自定义机内码来显示汉字, 这一点我已经在"建立自定义小型汉字库说明"一文当中说明了,
现在我想说的是对于采用第一种方法显示汉字的建立自定义小型字库的方法:
使用如下:
void MainTask(void)
{
char helloworld[] = "世界你好";
GUI_Init();
GUI_DispString((const char*)helloworld);
while(1){
GUI_Delay(800);
}
}
构造SmallHZK12_2.c如下:
/***********************************************************************
REVISION LOG ENTRY
Revision By: ucgui
Revised on 2005-6-17 19:09:52
QQ:106719880
Email:ucgui@163.com
Home:
Comments: SmallHZK12_2.c
这时是第二种自定义小型汉字库的方法,在这种方法下可以采用
char hellworld[]="世界你好";这种方法来方便的显示汉字, 比
第一种方法容易使用, 不过缺点是每一个字对应一个GUI_FONT_PROP结构
体, 明显占用了多的内存, 减慢查找显示的速度.
***********************************************************************/
#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
};
SmallHZK12_2.C自定义小字库及说明下载: