微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 无字库12864液晶的驱动方法

无字库12864液晶的驱动方法

时间:12-27 来源:互联网 点击:

在串行模式时,一个命令或数据字节要分为8次加载,从最高位开始。

图形点阵的显示原理

12864点阵液晶的图形显示原理都差不多。液晶屏x方向(水平)具有128列像素从左到右为第0列……第127列,y方向(垂直)具有64行像素。每8行组成1页,从上到下就是第0页……第7页。这样以列号和页号为坐标,就可以指定交叉位置的8个像素。例如第0、1、2、3列第1页的8个像素,如图6所示。在液晶内部有一块显示缓存区,按照列号和页号就可以对显缓区的某个字节写数,该字节的8位二进制数就对应了液晶屏同样位置的像素的亮灭,如对第1列第1页的那个缓存单元写入0X80即0b10000000,那么液晶对应位置的最下面一点7亮(低位在上高位在下)其余都灭,如果第2列第1页写入0X0F即0b00001111,则该位置上方4个点0123亮,其余像素不亮,第3列第1页写0X33,则该处间隔2点亮。这样就可以通过程序控制液晶屏的任意像素了。不同的液晶屏指令代码可能不同(例如这个屏和常见的7920驱动不一样),屏幕划分也可能不同,例如有的是分为左右两半,每半边64列,有的是分为上下两半等。

液晶SO12864-12C的编程要点

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

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

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

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

图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();
通常在程序开始阶段进行,对各种参数进行设置,具体初始化项目请参看函数内容和注解。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top