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

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

液晶SO12864-12C的编程要点

控制液晶最基本的工作就是往液晶的控制器写入命令码或往显缓区写入数据码,是命令还是数据由加到上述A0的电平高低决定:高,数据;低,命令。

因为现在是串行传送,所以只能由高到低一位位写。

串行只能写不能读。以前要靠读来判定液晶是否忙,这个液晶速度较高,实际使用证明串行传输不用读忙。

编程就是用单片机的几根口线按照所需的时序发出高低电平,再往液晶里送入代码或数据。控制脉冲和代码脉冲的时序关系如图7所示。

无字库12864图形点阵液晶模块及其驱动方法
图7 控制脉冲和代码脉冲的时序关系

最常用的几个命令

1. 显示开/关:代码:0XAF(开),0XAE(关)启动复位后为“关”,必须在液晶初始化时置“开”。
2. 页地址定位:代码:0XB0……0XB7,对应第0页到第7页,复位后自动安置为第0页。
3. 列地址定位:列地址是0X00……0X7F,但不是直接用列地址而要转换为双字节代码。方法是0X10加原高4位和0X00加原低4位。例如第33列,本是0X21,现在应该转换为0X12和0X01,分2次写入。
4. 写显示数据:代码就是显示数据,控制脉冲A0为高。
5. 复位:代码0XE2,通过程序使得液晶恢复各种起始默认状态。

有了这几条命令就已经可以使液晶画出以像素点为基础的图形或字符了。有些其他命令(如对比控制、亮度、偏压等)就取默认值,无需修改(初始化要用一下),还有些很有用的命令(如反向列页扫描、起始行、反白显示等),需要时再去查资料不迟。有了上述命令代码,我们就可以通过汇编或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);
4. 指定列、页地址。参数为列地址x和页地址y。
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初始化以后就进行液晶初始化。
9. LCD初始化。
Void Lcd_ini();
通常在程序开始阶段进行,对各种参数进行设置,具体初始化项目请参看函数内容和注解。

函数应用举例

1. 在指定位置画1点
先给定页和列坐标,就指定了1列8个像素点,1个点的位置从上到下对应数值为0X01、0X02、0X04、0X08、0X10、0X20、0X40、0X80。
例如在第9列、第3页最低位画点:
LcdSetxy(9,3);
LcdWriData(0X80);
2. 在指定位置画连续8个点构成的短竖线
例如位置同上,则
LcdSetxy(9,3);
LcdWriData(0XFF);
3. 画水平线
例如从第10列起在第3页底部画1根长度50像素点的连续直线:
unsigned char i;
LcdSetxy(10,3);
for(i=0;i<50;i++)
{
LcdWriData(0X80); //循环中列地址自动递增
}

明白了以上基础,我们就可以进一步画出长短竖线、更粗的水平线、水平双线矩形方框、黑块等,这样就可以画简单图形了。

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