自制单片机之六……LCD12864的驱动
LCD
12864在市面上主要分为两种,一种是采用st7920控制器的,它一般带有中文字库字模,价格略高一点。另一种是采用KS0108控制器,它只是点阵模式,不带字库。很可惜,我的这块就是KS0108控制器不带汉字库的,不过不打算用它专门显示文本,也就无所谓了。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_0.jpg)
LCD12864模块的20个引脚定义如下:
1。Vss 逻辑
电源地
2。VDD 逻辑电源正 5v
3。V0 LCD驱动电压
4。RS 数据/指令选择:高电平为数据,低电平为指令
5。R/W 读/写选择:高电平为读数据,低电平为写数据
6。E 读写使能,高电平有效,下降沿锁定数据
7。DB0 数据输入输出引脚
8。DB1 数据输入输出引脚
9。DB2 数据输入输出引脚
10。DB3 数据输入输出引脚
11。DB4 数据输入输出引脚
12。DB5 数据输入输出引脚
13。DB6 数据输入输出引脚
14。DB7 数据输入输出引脚
15。CS1 片选择号,低电平时选择前64列
16。CS2 片选择号,低电平时选择后64列
17。RET 复位信号,低电平有效。
18。VEE 输出-15v电源给V0提供驱动电源
19。A 背光电源 LED正极
20。K 背光电源LED负极
2。VDD 逻辑电源正 5v
3。V0 LCD驱动电压
4。RS 数据/指令选择:高电平为数据,低电平为指令
5。R/W 读/写选择:高电平为读数据,低电平为写数据
6。E 读写使能,高电平有效,下降沿锁定数据
7。DB0 数据输入输出引脚
8。DB1 数据输入输出引脚
9。DB2 数据输入输出引脚
10。DB3 数据输入输出引脚
11。DB4 数据输入输出引脚
12。DB5 数据输入输出引脚
13。DB6 数据输入输出引脚
14。DB7 数据输入输出引脚
15。CS1 片选择号,低电平时选择前64列
16。CS2 片选择号,低电平时选择后64列
17。RET 复位信号,低电平有效。
18。VEE 输出-15v电源给V0提供驱动电源
19。A 背光电源 LED正极
20。K 背光电源LED负极
具体电路图如下:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_1.jpg)
制做如下:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_2.jpg)
接口说明:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_3.jpg)
装上12864
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_4.jpg)
具体的电路还是两个电阻。一个背光限流电阻。一个液晶驱动电压调节电阻。背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。调节电位器到合适亮度。具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。中间接V0,通过调节电位器来调节V0上的电压。当V0上为-15V时为全暗(液晶显示为全黑)。当V0为0V时为全亮。调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。注意在V0的电压是在一个很小的范围有效。我的就是在-2.2——-2.5这个范围。仔细调节V0和地之间的电阻使V0上的电压在2.3V。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_5.jpg)
更换为固定电阻后的装配图:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_6.jpg)
下面说说具体的驱动:
先来了解一下LCD12864的内部控制结构:见图
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_7.jpg)
可以看出12864屏是分为左、右两块控制的。所有对屏幕的操作要受片选CS1、CS2来控制。
我们再来看一看对屏幕操作数据与屏幕点阵的排布关系:见下图。
我们再来看一看对屏幕操作数据与屏幕点阵的排布关系:见下图。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_8.jpg)
从上图可以看出数据按字节在屏幕上是竖向排列的。上方为低位,下方为高位。因此在横向上(也就是Y)就一共是128列数据。分为CS1和CS2两个64列来写入。在竖方向上(也就是X)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。了解这些后我们就知道要满屏显示一张图就要从y=0…127、X=0…7一共写128×8=1024个字节的数据。同样在AT89S51中存一张图就要1024个字节的空间。
好!下面我们来了解对LCD12864进行操作的一些指令。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_9.jpg)
下面对上图的指作解释:
1.显示开关控制(DISPLAY ON/OFF)
1.显示开关控制(DISPLAY ON/OFF)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_10.jpg)
D=1:开显示(DISPLAY ON) 意即显示器可以进行各种显示操作
D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作
D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作
2.设置显示起始行(DISPLAY START LINE)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_11.jpg)
前面在Z地址计数器一节已经描述了显示起始行是由Z地址计数器控制的。A5~A0 6位地址自动送入Z地址计数器,起始行的地址可以是0~63的任意一行。
例如: 选择A5~A0是62,则起始行与DDRAM行的对应关系如下:
DDRAM 行:62 63 0 1 2 3 ·················28 29
屏幕显示行: 1 2 3 4 5 6················· 31 32
例如: 选择A5~A0是62,则起始行与DDRAM行的对应关系如下:
DDRAM 行:62 63 0 1 2 3 ·················28 29
屏幕显示行: 1 2 3 4 5 6················· 31 32
3.设置页地址(SET PAGE “X ADDRESS”)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_12.jpg)
所谓页地址就是DDRAM的行地址,8行为一页,模块共64行即8页,A2~A0表示0~7页。读写数据对地址没有影响,页地址由本指令或RST信号改变复位后页地址为0。页地址与DDRAM的对应关系见DDRAM地址表。
4.设置Y地址(SET Y ADDRESS)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_13.jpg)
此指令的作用是将A5~A0送入Y地址计数器,作为DDRAM的Y地址指针。在对DDRA M进行读写操作后,Y地址指针自动加1,指向下一个DDRAM单元。
5.读状态(STATUS READ)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_14.jpg)
当R/W=1 D/I=0时,在E信号为“H”的作用下,状态分别输出到数据
总线(DB7~DB0)的相应位。
BF: 前面已叙述过(见BF标志位一节)。
ON/OFF: 表示DFF触发器的状态(见DFF触发器一节)。
RST: RST=1表示内部正在初始化,此时组件不接受任何指令和数据。
6.写显示数据(WRITE DISPLAY DATE)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_15.jpg)
D7~D0为显示数据,此指令把D7~D0写入相应的DDRAM单元,Y地址指针自动加1。
7.读显示数据(READ DISPLAY DATE)
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_16.jpg)
此指令把DDRAM的内容D7~D0读到数据总线DB7~DB0,Y地址指针自动加1。
再帖一下接口时序图
1.写操作时序
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_17.jpg)
2.读操作时序
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_18.jpg)
时序参数表:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_19.jpg)
又帖了这么多指令呀时序图什么的,看了就头晕。我也和你一样不爱看这些枯燥的东西。
下面实际写些程序让屏幕亮起来。
运行:
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/316082_1_20.jpg)
不要走开哦!我会不断补全的。。。
评论