计算机汉字显示原理(点阵字).doc_第1页
计算机汉字显示原理(点阵字).doc_第2页
计算机汉字显示原理(点阵字).doc_第3页
计算机汉字显示原理(点阵字).doc_第4页
计算机汉字显示原理(点阵字).doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家标准汉字字符集GB2312-80共收集了共7445个汉字和图形符号,其中汉字6763个,分为二级,一级汉字3755个,二级汉字3008个。汉字图形符号根据其位置将其分为94个“区”,每个区包含94个汉字字符,每个汉字字符又称为一个“位”。区的序号和位的序号都是从01到94,UCDOS软件中的文件HZK16和文件ASC16分别为1616的国标汉字点阵文件和816的ASCII码点阵文件,以二进制格式存储。在文件HZK16中,按汉字区位码从小到大依次存有国标区位码表中的所有汉字, 每个汉字占用32个字节,每个区为94个汉字。在文件ASC16中按ASCII码从小到大依次存有816的ASCII码点阵,每个ASCII码占用16个字节。在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去0A0AH就得该汉字的区位码。例如汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,“BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于第23区的第31个字的位置,相当于在文件HZK16中的位置为第32(23-1) 94+(31-1)=67136B以后的32个字节为“房”的显示点阵。ASCII码的显示与汉字的显示原理相同,在ASC16文件中不存在机内码的问题,其显示点阵直接按ASCII码从小到大依次排列,不过每个ASCII码在文本中只占1个字节并且小于80h,每个ASCII码为8X16点阵,即在ASCII16文件中,每个ASCII码的点阵也只占16个字节。以下是读取hzk16的C部分语言代码(仅供参考):void dis_cc(unsigned int x,unsigned int y,unsigned int color,unsigned int codeh, unsigned int codel,unsigned int circle,unsigned int kind,unsigned int mode)char word32;int area,bit;long count,offset;unsigned long count,offset;unsigned int i,j;area = (codeh&0x00ff)-0xa0-1; /根据机内码取得区码bit = (codel&0x00ff)-0xa0-1; /根据机内码取得位码offset = area*94+bit; /取得偏移量count = 32l*(long)offset;lseek(HZK16,count,SEEK_SET);/在HZK16文件中找到点阵起始位置j=_read(HZK16,&word0,32);/读取32字节的点阵信息在电脑中,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将 ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 汉字字模得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的A在字模中是这样记载的: 而中文的“你”在字模中却是这样记载的: 在硬件系统内,英文的字模信息一般固化在ROM里,中文的字模信息一般记录在汉字库文件HZK16里。采用如何在点阵LED或LCD中显示汉字?假设你采用16x16点阵汉字,水平扫描。显示汉字为“模”,用产生如下字模unsigned char mo=0x00,0x00, 0x10,0x90, 0x10,0x94, 0x13,0xFE, 0x7C,0x90, 0x11,0xFC, 0x19,0x04, 0x35,0xFC, 0x35,0x04, 0x51,0xFC, 0x50,0x40, 0x17,0xFE, 0x10,0x90, 0x11,0x08, 0x16,0x06, 0x00,0x00;代码如下:unsigned char cmp_w8=128,64,32,16,8,4,2,1;void FontDisplay(int x, int y, unsigned char * FontModule) for(int row=0;row16;row+) for(int c=0;c8;c+)if(FontModulerow*2&cmp_wc)!=0)putpixel(c+x,row+y,15); for(c=0;c8;c+)if(FontModulerow*2+1&cmp_wc)!=0)putpixel(c+8+x,row+y,15); main()FontDisplay(5,10,mo);24x24点阵代码示例(水平扫描):unsigned char mo=0x00,0x00,0x00, 0x00,0x00,0x00, 0x07,0x0C,0xC0, 0x06,0x0C,0xC0,0x06,0x0C,0xDC, 0x06,0x7F,0xF0, 0x06,0xCC,0xC0, 0x1F,0xF0,0x70, 0x06,0x3F,0xF0, 0x07,0x30,0x70, 0x0F,0xBF,0xF0, 0x0E,0xF0,0x70, 0x1E,0xF0,0x70, 0x1E,0x3F,0xF0, 0x36,0x06,0x18, 0x06,0xFF,0xFC, 0x06,0x07,0x00, 0x06,0x0F,0x80, 0x06,0x0C,0xE0, 0x06,0x38,0x7C, 0x06,0xE0,0x18, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00;unsigned char cmp_w8=128,64,32,16,8,4,2,1;void FontDisplay(int x, int y, unsigned char * FontModule) for(int row=0;row24;row+)for(int c=0;c8;c+)if(FontModulerow*3&cmp_wc)!=0)putpixel(c+x,row+y,15); for(c=0;c8;c+)if(FontModulerow*3+1&cmp_wc)!=0)putpixel(c+8+x,row+y,15); for(c=0;c8;c+)if(FontModulerow*3+2&cmp_wc)!=0)putpixel(c+16+x,row+y,15); main()FontDisplay(5,10,mo);putpixel函数:putpixel(int x,int y,int color)x,y为坐标,color为颜色值.该函数在(x,y)点设定象素的颜色.由于硬件的不同,也许提供的函数不同,用户可把此函数作为参考,必要时用硬件提供的函数取而代之.点阵字库 一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。 不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。 虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。 每一个区记录94个汉字,位号则为该字在该区中的位置。 因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。 减1是因为数组是以0为开始而区号位号是以1为开始的。 这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢? 只需乘上一个汉字字模占用的字节数即可, 即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。 以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1)*32。 汉字库文该从该位置起的32字节信息即记录了该字的字模信息。 了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例, 通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。 #include graphics.h #include stdio.h main() int i=VGA,j=VGAHI,k; unsigned char mat162,chinease3=我; FILE *HZK; if(HZK=fopen(hzk16,rb)=NULL)exit(0); initgraph(&i,&j,); i=chinease0-0xa0;j=chinea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论