lcd显示汉字:阵汉字显示



目录:
  DOS下点阵汉字
  汉字内码
  汉字字模
  汉字库文件
  打印字库文件和HZK12

文档内容:

DOS下点阵汉字


   你是否碰到过用启动盘启动系统后用DIR命令得到串串莫名其妙?有经验朋友会告诉你:那是汉字汉字?你不禁会问:如何个我个也不认识但那确确实实是汉字如果你启动UCDOS或其他汉字系统后就会看到那是个个熟悉汉字同样是汉字为什么前后会看到区别结果?呵呵其实在电脑硬件中根本没有汉字这个概念也没有英文概念这铁玩意认识概念只有——内码

汉字内码

   点头表示什么?是“对”、“YES”偏偏有地方表示意义却恰恰相反个动作有区别诠释;个问题有区别答案;而个符号却有区别意义关键在于:你是如何地理解在电脑中亦如此所有数据都是以0和1保存按区别数据操作可以得到区别结果对于显示英文操作由于英文字母种类很少只需要8位(字节)即可而对于中文常用却有5000以上于是我们DOS前辈想了个办法就是将ASCII表高128个很少用到数值以两个为组来表示汉字即汉字内码而剩下低128位则留给英文使用即英文内码不信你可以用记事本写C文件:


{
unsigned char *s,*e=\"ABcd\",*c=\"你好\";
clrscr;
prf(\"English char =\");
s=e;
while(*s!=0) /*C串以0为结束符*/
{
prf(\"%3d,\",*s);
s;
}
prf(\"\\nChinease char=\");
s=c;
while(*s!=0)
{
prf(\"%3d,\",*s);
s;
}
getch;
}

再用TC输入*.txt打开运行看见了没有那些数值即英文和汉字各字节内码

汉字字模

   得到了汉字内码后还仅是组数字那又如何在屏幕上去显示呢?这就涉及到文字字模字模虽然也是组数字但它意义却和数字意义有了根本变化它是用数字各位信息来记载英文或汉字形状如英文\'A\'在字模中是这样记载:
\" width=344 border=0>
而中文“你”在字模中却是这样记载:
\" width=553 border=0>
  在硬件系统内英文字模信息般固化在ROM里即使在没有进入系统CMOS里也可以让你看到英文而在DOS下中文字模信息般记录在汉字库文件HZK16里

汉字库文件

  了解字母和汉字是按字模位信息显示原理后那如何得到汉字字模信息呢?难道要我们自己去做?NODOS前辈们经过艰辛努力将制作好字模放到了个个标准库中以免去后辈麻烦这就是点阵字库文件般我们使用16*16点阵宋体字库所谓16*16是每个汉字在纵、横各16点区域内显示不过后来又有了HZK12、HZK24HZK32和HZK48字库及黑体、楷体和隶书字库虽然汉字库种类繁多但都是按照区位顺序排列个字节为该汉字区号个字节为该字位号个区记录94个汉字位号则为该字在该区中位置因此汉字在汉字库中具体位置计算公式为:94*(区号-1)+位号-1减1是是以0为开始而区号位号是以1为开始这仅为以汉字为单位该汉字在汉字库中位置那么如何得到以字节为单位得到该汉字在汉字库中位置呢?只需乘上个汉字字模占用字节数即可即:(94*(区号-1)+位号-1)*个汉字字模占用字节数而按每种汉字库汉字大小区别又会得到区别结果以16*16点阵字库为例计算公式则为:(94*(区号-1)+(位号-1))*32汉字库文该从该位置起32字节信息即记录了该字字模信息


汉字库文件

  了解点阵汉字及汉字库构成原理后显示汉字就变得简单以16*16点阵字库为例通常思路方法是:将文件工作指针移到需要汉字字模处、将汉字库文件读入2*16再用for循环位位地显示以使用VGAHI模式显示“我”字为例如下:
# \"graphics.h\"
# \"stdio.h\"

{
i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]=\"我\";
FILE *HZK;
((HZK=fopen(\"hzk16\",\"rb\"))NULL)
exit(0);
initgraph(&i,&j,\"\");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码和位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);

for(j=0;j<16;j)
for(i=0;i<2;i)
for(k=0;k<8;k)
(mat[j][i]&(0x80>>k)) /*测试为1位则显示*/
putpixel(i*8+k,j,WHITE);

getch;
closegraph;
fclose(HZK);
}
如何样?只要掌握了正确思路方法显示汉字并不复杂

打印字库文件和HZK12

  如果你有UCDOSHZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)你还可以使用区别字体大字模汉字了HZK24系列是24*24点阵字库每字模占用3*24字节如果你按照HZK16显示思路方法你会看到......呵呵字被放倒了这是该类字库和汉字库区别这类大字模汉字库是专供打印打印字库为了打印方便将字模都放倒了你使用时只要将字模位信息纵横转置显示即可例如你如果定义为mat[24][3]则应该这样输出:
for(i=0;i<24;i)
for(j=0;j<24;j)
((0x80>>i%8)&mat[j][i/8]) /*转置显示*/
putpixel(j+x,y+i,color);


  还有类字库HZK12虽然属于标准字库类型但如果你将它字模当作12*12位计算根本无法正常显示汉字字库设计者为了使用方便字摸每行位数均补齐为8整数倍于是实际该字库位长度是16*12虽然每行都多出了4位但这4位都是0(不显示)并不影响显示效果



Tags:  点阵显示汉字 汉字显示屏 led显示屏汉字输入 lcd显示汉字

延伸阅读

最新评论

发表评论