字模的原理和获取.doc

字模的原理和获取.doc

ID:50885396

大小:43.95 KB

页数:5页

时间:2020-03-15

字模的原理和获取.doc_第1页
字模的原理和获取.doc_第2页
字模的原理和获取.doc_第3页
字模的原理和获取.doc_第4页
字模的原理和获取.doc_第5页
资源描述:

《字模的原理和获取.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一、什么是字模单片机应用经常会用到液晶显示模块,是用点阵的方式显示的,要显示汉字或字符的时候会用到字模,字模就是字在点阵上显示时对应的编码,如图1显示的“正”字,使用16×16点阵。点阵中黄色的点是高亮的,对应于二进制编码中的1,绿色的低亮对应于二进制编码中的0。如第一行二进制编码应该是0000000000001000刚好用两个字节表示就是0x0,0x08,这样,16总共需要用32个字节来表示,这32个字节就是“正”的字模。在单片机程序中,将字模发送给液晶显示模块,就能够显示出响应的汉字或字符。二、字模的获取 汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的1

2、6×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。  下面以HZK16文件为例,分析取得汉字点阵字模的方法。  HZK16文件是按照GB2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为94个区(Section),每个区94个位(Position),所以也称为区位码。其中01~09区为符号、数字区,16~87区为汉字区。而10~15区、88~94区是空白区域。  如何取得汉字的区位码呢?在计算机处理汉字和ASCI

3、I字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。  具体算式如下:  qh=c1-32-128=c1-160wh=c2-32-128=c2-160  或    qh=c1-0xa0wh=c2-0xa0  qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。  根据区号和位号可

4、以得到汉字字模在文件中的位置:  location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。  上面计算过,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数

5、倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。字模获取工具的制作分析过字模的原理后,就可以来编写工具,首先要准备字库文件,HZK16.DAT,可以从网上下载。根据原理,先打开文件,然后根据汉字的内码获取区码和位码,然后根据区吗和位码索引到文件中的地址,

6、再读取32个字节数据到BUFFER中即大功告成。下面是VC中的一段代码,供参考:viewplaincopytoclipboardprint?voidCFontDlg::GetGridFromHZK16(){UpdateData();BYTEAnsiCode[2];BYTEqh,wh;UINTlocation;//BYTEbuffer[32];FILE*fp;AnsiCode[0]=m_strFont.GetAt(0);//将对话框中的字符转换为内码,先读取第一个字节,判断是汉字还是字母或字符if(AnsiCode[0]<160)//英文字母和字符,转换为全角的字符内

7、码{BYTEtemp=AnsiCode[0];AnsiCode[0]=HIBYTE(temp-0x21+0xA3A1);//0xA3A1是ASCII码为0X21的字符对应的全角字符的内码,这是一个偏移量的计算AnsiCode[1]=LOBYTE(temp-0x21+0xA3A1);}else//是汉字,则直接转换{AnsiCode[1]=m_strFont.GetAt(1);}qh=AnsiCode[0]-160;//区码和位码wh=AnsiCode[1]-160;location=(94*(qh-1)+(wh-1))*32;//HZK16中的索引32是一个字的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。