无字库12864图形点阵液晶模块及其驱动方法

作者 卫小鲁 来源 《无线电》杂志
发布时间 2010-12-15

怎样显示字符或汉字

字符和汉字实质是在一个矩形区域内由一系列像素点构成的图形,也就是点阵图。例如在一个8×8点阵区域内,字母“L”点阵如图8左所示。如果要在第0页第 0……第7列显示这个字符,那么就应该在相应的显示缓冲区装入相应的数据如右边图所示,这里用1表示显示像素,不显示的像素都是0,为清楚起见图中就不标出,上方表示列号0……7,那么从0列开始,各列的二进数和16进数分别表示为:
0B00000000 : 0X00
0B01000010 : 0X42
0B01111110 : 0X7E
0B01000010 : 0X82
0B01000000 : 0X40
0B01000000 : 0X40
0B01100000 : 0X60
0B00000000 : 0X00

所以我们就用一个8元素的数组来表示这个“L”:
const unsigned char L[8]={0X00,0X42,0X7E,0X82,0X40,0X40,0X60,0X00};

要在液晶上的第3页第6列显示这个“L”,就使用如下函数:
LcdShow88(unsigned x,unsigned y, const char *p);

其中p指向8点阵字符数组,那么具体代码为:
LcdShow88(6,3, L);

打造字模就是按照所需显示的文字符号一一编制各自的数组,上述8×8点阵就可以在1页高度内显示,实际上其上下左右都要留空,这样有效的点阵只有6×6,要显示数字和ASCII字符尚可,简单笔画的汉字也行,可是笔画稍多的汉字就不行了。对于汉字显示我们一般使用16×16点阵的字模。这样的汉字高度占2 页,宽度是16列,12864的液晶可以显示4行,每行8个字。所有的12864液晶不论尺寸大小都是如此。

一个16点阵字模数组具有32个元素,每一页有16个元素。因此显示这样的汉字时,就要给同一列的某一页和下一页分别写入各自的16个元素。例如汉字“钟”的字模数组为:
const unsigned char ZHONG[  ]={0x80,0x40,0x70,0xCF,0x48,0x48,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF8,0x10,0x00, 0x02,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,0x02,0x02,0xFF,0x02,0x02,0x07,0x00,0x00};

要在第2页、第6列开始显示“钟”,我们用一个函数:
LcdShow1616(unsigned x,unsigned y, const char *p);

其中参数x 是列,y是页,p指向字模数组,具体的代码为:
LcdShow1616(6,2, ZHONG);

这样,汉字就显出来了。
最后,交代一下取得点阵汉字字模的方法。

编制字模数组的好帮手——字模软件的使用

因为我们现在需要的汉字量很少,所以可以使用一些字模提取软件自己制作所需的字模。以一个很好用的绿色免费“畔畔字模提取软件”为例加以说明。

此软件在各大程序网站都有下载,下载解压后就可使用,开启界面如图9所示。选取Shape :方形,Mode:C51,取模顺序选第4种,即点阵图右上为A,右下为B,左上为C,左下为D,这是按照先右半从上到下,后左半从上到下的顺序取模。

无字库12864图形点阵液晶模块及其驱动方法
图9

无字库12864图形点阵液晶模块及其驱动方法
图10

无字库12864图形点阵液晶模块及其驱动方法
图11

无字库12864图形点阵液晶模块及其驱动方法
图12

然后在下面输入框里输入汉字回车后,左边显示点阵字,见图10。对点阵自行修饰改动,用鼠标点选即可,例如竖笔加粗等,这里没改。

点右旋90度按钮,点阵汉字右旋90度,其目的是由上往下取码,相当于显示时从左往右显示。点“提取字模”按钮,字模代码呈现在点阵下面,见图11。注意字模码有2行,上行对应旋转后的右半区域从上往下取码,下行对应左半区域从上往下取码,这就等同于旋转前的汉字从左往右取码,而上行代码对应的是汉字的上半代码,下行则对应的是汉字的下半代码。正好符合上述汉字显示程序先显示上半部后显示下半部的要求。这样就取得了例子中的字模代码。

可以把所需的汉字逐一取码,然后存在二维表中,就形成了16×16点阵字模数组。
因为单片机FLASH ROM程序存储空间较大而RAM较小,而一个16点阵汉字占据32字节,10个字就320字节,对于RAM通常在几百到1K字节以下的单片机嫌太大,所以字库应该存放在FLASH区比较合理。但是读出FLASH中的数据,程序还要变一下,以使用GCC编程为例,前述字模常量和程序修改如下:
const unsigned char_[   ]PROGMEM{0x80,0x40,0x70,0xCF,0x48,0x48,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF8,0x10,0x00,0x02,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,0x02,0x02,0xFF,0x02,0x02,0x07,0x00,0x00,};

要在第2页第6列显示“钟”,用一个稍稍不同的函数:
LcdShowFlash1616(unsigned x,unsigned y, const char *p);

即:LcdShowFlash1616(6,2, ZHONG_);
就行了。
以上各有关函数具体内容可到《无线电》网站上下载。

制作非标准的字模

有时我们需要一些“非标准的”字符,例如12宽×16高或者8×8字符,同样也可以使用上述工具,不过这时字符就要用鼠标在选定区域内逐点点出,因为他提取的时候还是针对16×16点阵,所以最后还要去除多余的0字节,如图12表示一个数字9的取模。得到的代码上下排都去掉最后4个0字节如图中下面画线的那8个。最后每个字就24字节,程序中循环此书作相应改变。

好了 喋喋不休一大堆,基本方法都交代了,说得口干看得头大,这次就到这里,下次结合一个具体的小日历钟,看看该怎么整。

大大小小的液晶模块在电子市场里有很多种,读者朋友不一定限于笔者所用的型号。

相关内容:使用无字库12864液晶模块制作温湿度计

上一页1234
电子爱好者 DIANZIAIHAOZHE.COM