点阵汉字显示原理及其在点阵 LCD
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
点阵汉字显示原理及其在点阵LCD&LED 中的应用
※点阵汉字显示原理及其在点阵LCD&LED 中的应用※
发表时间:2007-3-18 10:03:48 天气状况:心情指数:浏览次数:145
本文由豪智软件工具自由职业者秦文豪提供下载本
文摘要:本文主要论述汉字的显示原理,并详细阐述了如何创建点阵字库,如何在点阵LCD&LED 进行扫描显示的原理,还阐述了如何根据不同的字符编码标准,来存取数据,使您的系统可以和计算机兼容,并象计算机一样能显示各种字符。
关键字:位(bit )、字节(byte )、字模、计算机内码(ASCII )、UNICODE 编码
提示:如果没有特别提示,本文所提到的字库都是指点阵
字库问题引入
大千世界中,有很多物质都可以看作是由很小很小的点
(例如:分子、原子)组成的,当然,您所看到的字符也不例外。假设我们把一个字符分成若干个可视的点组成,换句话来说,就是一个个点组成了我们看到的字
符。假设您的电脑显示器是液晶的,您不妨仔细的看看,每一个字符或图形都是由一个个的点组成的,只是这些点很小,
小得让您不容易发现而已(仔细看看还是不
难发现呀!);由此,我们引入点阵字符的概念,从微观的电子信号0 或1 ,到宏观可视的字符,足以让我们感叹这世界真是丰富多彩,奥妙无穷啊!
字模数据
首
先,从我们常用的计算机系统谈起,再扩展到我们要开发设计的点阵LCD&LED
显示系统中去,其实单片机系统的显示原理和计算机是一样的。在计算机中,所有的数据(包括指令等)都是以0 和1 来表示的,这意味着,如果我们想要在显示器上显示字符,那么这些字符的信息将也会是以0 、1
来保存显示的。那么计算机是如何来存贮显示字符的呢?下面我们举例来说明点阵字符的数据存贮及显示原理(这里我们主要讨论的是点阵字符,故有关计算机矢量
字符的显示及其原理这里就不作说明,而且单片机的寻址和计算能力远不及PC
,故显示矢量的字符还是有一定的困难)。假设我们把计算机液晶显示器上显示16x16 点阵的“豪”字
放大10 倍,如下图所示:
放大10 倍的“豪” 位信息
字模数据
放
大之后,每一个小方格代表一个点,黑色的为1 ,白色为0 ;每一个点看作为一位(bit )。据此可以描绘出“豪
”字的位(bit
)信息。采用行扫描的方式,每八位(bit
)为一个字节,这里采用十六进制表示,这样就得到了字模数据。由上述的示例,我们可以清晰的了解到可视字符、位信息与字模数据之间的关系。清楚了上面的关
系之后,我们就可以自己编写一个字模数据生成工具了。笔者自己就编写了两款很强劲的字模工具(汉字字模点阵数据批量生成工具[下载]和Font Model Tool,前者是针对汉字编写的,后来一小日本想用这个工具,Font Model Tool就出
生了,不过新增了很多功能,而且是一个中英文可以互相切换的双语版),这里介绍给大家,希望共同学习和使用哟。[点阵异常处理]
假设字符的点阵不是8 的倍数怎么办呢?通常情况下可以
不计或在后面以4 个0 位补足8 位都可,例如:12x12 点阵的汉字,以本人编写的字模工具软件为例,是这样处
理的:先假设对
12x12的点阵字符进行扫描,第一行的前8位为一个字节,第一行的后面4位形成一个字节,以后的每行逐次类推,直
到扫描到最后一行,行成一个完整可用的
字模数据。
点阵字库
把上述很多很多字符的字模数据按照一定的排列顺序存放在一起,就形成了点阵字库。这里所讲的字库是广义的,可以是文件,也可以是其他的东东,例如:数组、DB 表等等所有可以存取数据的形式。有的点阵字库还带有索引表,用来方便程序的编写及查询。
在计算机中如何显示一个字符
在
计算机中是如何把点阵字符显示出来的呢?其实字符的显示过程是字模数据创建的逆过程。首先我们要明白字模数据的排列扫描方式,然后再把16
进制的字模数据变成位(bit
)信息,最后才能根据位信息按照字模数据给定的扫描方式逐个把点描绘出来。光说还是不行的,最好我们亲自动手来实验一下,先假定我们要用行扫描的显示方
式,在计算机中显示一个“豪”字,我们可以使用字模软件来创建一个字模数据,设定为行扫描、16x16 点阵、宋体、11 号字,
创建如下字模数据:
unsigned char hao0[]={
0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,
0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,
0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,
0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00
};
则C 语言全部显示代码描述如下:
unsigned char cmp_w[8]={128,64,32,16,8,4,2,1}; // 用于取位
unsigned char hao0[]={ /* 字模数组*/
0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,
0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,
0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,
0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00
};
void FontDisplay(int x, int y, unsigned char * FontModule) ;/*16x16 单个字符行扫描函数*/ void FontDisplay(int x, int y, unsigned char * FontModule)
{/*x: 水平偏移坐标,y: 垂直偏移坐标*/
for(int row=0;row<16;row++)
{
for(int c=0;c<8;c++)