最常用的几个命令
显示开/关:代码:0XAF(开),0XAE(关)启动复位后为“关”,必须在液晶初始化时置“开”。 1.
页地址定位:代码:0XB0……0XB7,对应第0页到第7页,复位后自动安置为第0页。 2.
列地址定位:列地址是0X00……0X7F,但不是直接用列地址而要转换为双字节代码。方法是0X10加原高4位和0X00加原低4位。例如第33列,本是0X21,现在应该转换为0X12和0X01,分2次写入。 3.
写显示数据:代码就是显示数据,控制脉冲A0为高。 4. 复位:代码0XE2,通过程序使得液晶恢复各种起始默认状态。 5.
有了这几条命令就已经可以使液晶画出以像素点为基础的图形或字符了。有些其他命令(如对比控制、亮度、偏压等)就取默认值,无需修改(初始化要用一下),还有些很有用的命令(如反向列页扫描、起始行、反白显示等),需要时再去查资料不迟。有了上述命令代码,我们就可以通过汇编或C语言,按照控制时序编出子程序或函数,以便在程序中使用。C语言因为易读性好、通用性好、移植性好所以用得较多,下面就给出一些C的函数,由它们就构成了液晶的驱动。
驱动液晶的基本C函数
我们用C语言编程,在C语言里,用“函数”把单片机的一系列具体操作包装起来起个函数名,需要时直接按名调用即可,非常方便。
首先必须解决怎样对液晶串行写数据的问题,然后按照A0线的高低,我们就可以自行编出写数据函数和写命令函数。
一下只列出函数说明和用法举例,函数的具体内容可到《无线电》网站上下载C程序代码。
串行传送1字节数据函数,参数为待传字节。 1. void LcdWriByte(unsigned char nn) //nn就是待写字节
这个是最基本的函数,不过我们不直接用它而是把它放在其他写数据函数里调用。 写命令。参数为命令码。 2.
void LcdWriCommand(unsigned char command); 例如,打开显示:LcdWriCommand(0XAF); 写数据。参数为待写的显示数据。 3. void LcdWriData(unsigned char data);
例如,写显示一个点的数据: LcdWriData(0X01); 指定列、页地址。参数为列地址x和页地址y。 4. void LcdSetxy(unsigned char x,unsigned chary);
例如:LcdSetxy(68,2);//设置显示地址为第68列、第2页。 通常和上一个函数连用,见下一节函数应用举例。
在以上基本函数基础上我们还可以根据命令码推演出几个便于使用的功能函数。 开显示。 5. void LcdOn(void ); 例:LcdOn( ); 关显示。 6. void LcdOff(void ); 例:LcdOff( );
软复位。用它可以在任何时刻使液晶屏回到起始状态而显示缓冲区内容不变。 7. void LcdReset(void ); 例:LcdReset( ); 刷屏。 8.
void LcdCls(unsigned char data );
就是用数据data写满显示缓冲区,data如果为0,那全屏刷白(无像素显示),如果data为0XFF则全屏刷黑(像素全部亮)。如果为0XAA呢?感兴趣的读者不妨实验一下。
例:LcdCls(0 );
最后给出该液晶的初始化函数,在系统启动后,MCU初始化以后就进行液晶初始化。 LCD初始化。 9. Void Lcd_ini();
通常在程序开始阶段进行,对各种参数进行设置,具体初始化项目请参看函数内容和注解。
函数应用举例
在指定位置画1点 1.
先给定页和列坐标,就指定了1列8个像素点,1个点的位置从上到下对应数值为0X01、0X02、0X04、0X08、0X10、0X20、0X40、0X80。 例如在第9列、第3页最低位画点: LcdSetxy(9,3); LcdWriData(0X80);
在指定位置画连续8个点构成的短竖线 2.
例如位置同上,则 LcdSetxy(9,3); LcdWriData(0XFF); 画水平线 3.
例如从第10列起在第3页底部画1根长度50像素点的连续直线: unsigned char i; LcdSetxy(10,3); for(i=0;i<50;i++) {
LcdWriData(0X80); //循环中列地址自动递增 }
明白了以上基础,我们就可以进一步画出长短竖线、更粗的水平线、水平双线矩形方框、黑块等,这样就可以画简单图形了。
怎样显示字符或汉字
字符和汉字实质是在一个矩形区域内由一系列像素点构成的图形,也就是点阵图。例如在一个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,这是按照先右半从上到下,后左半从上到下的顺序取模。
图9