在之前的文章中讲到了显示器件–LCD1602,但是1602的缺点比较严重:
1、仅有两行显示。
2、仅能显示字符,不能显示汉字。
12864是12864点阵液晶模块,其本质跟1602类似,只不过点阵数更多而已,可显示四行信息,单字符16,汉字8个。带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个1616点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。
引脚定义如下:
管脚号 | 管脚名称 | 电平 | 管脚功能描述 |
---|---|---|---|
1 | VSS | 0V | 电源地 |
2 | VCC | 3.0~+5V | 电源正 |
3 | V0 | - | 对比度(亮度)调整 |
4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0为显示数据;RS=“L”,表示DB7——DB0为显示指令数据 |
5 | R/W(SID) | H/L | R/W=“H”,E=“H”,数据被读到DB7——DB0;R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR |
6 | E(SCLK) | H/L | 使能信号 |
7 | DB0 | H/L | 三态数据线 |
8 | DB1 | H/L | 三态数据线 |
9 | DB2 | H/L | 三态数据线 |
10 | DB3 | H/L | 三态数据线 |
11 | DB4 | H/L | 三态数据线 |
12 | DB5 | H/L | 三态数据线 |
13 | DB6 | H/L | 三态数据线 |
14 | DB7 | H/L | 三态数据线 |
15 | PSB | H/L | H:8位或4位并口方式,L:串口方式 |
16 | NC | - | 空脚 |
17 | /RESET | H/L | 复位端,低电平有效 |
18 | VOUT | - | LCD驱动电压输出端 |
19 | A | VDD | 背光源正端(+5V) |
20 | K | VSS | 背光源负端 |
指令集 – 重要
指令 | 指令码 | 功 能 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
清除显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" |
地址归位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 |
显示状态开/关 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | D=1: 整体显示 ONC=1: 游标ON B=1:游标位置反白允许 |
进入点设定 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 |
游标或显示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 |
功能设定 | 0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X | DL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作 |
设定CGRAM地址 | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 设定CGRAM 地址 |
设定DDRAM地址 | 0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 设定DDRAM 地址(显示位址)第一行:80H-87H第二行:90H-97H |
读取忙标志和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 |
写数据到RAM | 1 | 0 | 数据 | 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) | |||||||
读出RAM的值 | 1 | 1 | 数据 | 从内部RAM读取数据D7——D0(DDRAM/CGRAM/IRAM/GRAM) |
扩展指令
指令 | 指 令 码 | 功 能 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
待命模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 进入待命模式,执行其他指令都可终止待命模式 |
卷动地址开关开启 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR | SR=1:允许输入垂直卷动地址SR=0:允许输入IRAM和CGRAM地址 |
反白选择 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 选择4行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 |
睡眠模式 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X | SL=0:进入睡眠模式SL=1:脱离睡眠模式 |
扩充功能设定 | 0 | 0 | 0 | 0 | 1 | CL | X | RE | G | 0 | CL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作G=1/0:绘图开关 |
设定绘图RAM地址 | 0 | 0 | 1 | 0AC6 | 0AC5 | 0AC4 | AC3AC3 | AC2AC2 | AC1AC1 | AC0AC0 | 设定绘图RAM先设定垂直(列)地址AC6AC5…AC0再设定水平(行)地址AC3AC2AC1AC0将以上16位地址连续写入即可 |
连接方式
LCD12864与单片机的连接有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。
1.直接控制方式
LCD12864的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD12864中写入命令和数据,因此,可将LCD12864的R/W读/写选择控制端直接接地,这样可节省1根数据线。VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。
2.间接控制方式
间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。采用四线并口通信,可以减少对微控制器I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。 可以看做是一个LCD12864加上一个IIC转并口输出模块。
使用
使用前先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出黑色的底影。此过程亦可以初步检测LCD有无缺段现象。
1、字符显示
带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中 文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
80H | 81H | 82H | 83H | 84H | 85H | 86H | 87H |
---|---|---|---|---|---|---|---|
90H | 91H | 92H | 93H | 94H | 95H | 96H | 97H |
88H | 89H | 8AH | 8BH | 8CH | 8DH | 8EH | 8FH |
98H | 99H | 9AH | 9BH | 9CH | 9DH | 9EH | 9FH |
2、图形显示
先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)
垂直地址范围 AC5…AC0
水平地址范围 AC3…AC0
绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:
这个可以使用取模小工具配合使用。
用带中文字库的128X64显示模块时应注意以下几点:
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。
基本操作
读状态。输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。
读数据。输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。
写命令。输入RS=0,RW=0,E=高脉冲。输出:无。
写数据。输入RS=1,RW=0,E=高脉冲。输出:无。
串口操作时序
初始化
驱动程序
1、公共代码
#include <reg51.h>
sbit lcden=P2^7;
sbit lcdwr=P2^6;
sbit lcdrs=P2^5;
unsigned char table0[]={"去年今日此门中,"};
unsigned char table1[]={"人面桃花相映红,"};
void DelayTime1ms(unsigned int DelayValue)
{
unsigned int a,b;
for(a=0;a<DelayValue;a++)
for(b=0;b<182;b++);
}
2、初始化
void init_12864()
{
write_com(0x30);
write_com(0x06);
write_com(0x01);
write_com(0x0c);
write_com(0x02);
}
3、写指令
void write_com(unsigned char com)
{
LCDWR = 0; //LCDWR为读写控制端,LCDWR = 0,这里可不写
LCDRS = 0; //液晶rs接口为0时,写指令,rs为1时写数据
P0 = com; //将要写的指令赋给P0口,
DelayTime1ms(5); //由1602读写操作时序图,先将指令赋给P0口,延时后将使能
LCDEN = 1; // 端LCDEN置高,再延时一段时间,然后将LCDEN置低,这样指令
DelayTime1ms(5); // 就写入到LCD了
LCDEN = 0;
}
4、写一个数据
void write_data(unsigned char date)//与写指令类似,这里LCDRS设为1
{
LCDRS = 1;
P0 = date;
DelayTime1ms(5);
LCDEN = 1;
DelayTime1ms(5);
LCDEN = 0;
}
5、读一个数据
uchar Read_Lcd_Data()
{
unsigned char byte;
P0 = 0xff; //防止低电平干扰拉低数据位
Lcd_RW = 1;
Lcd_RS = 1;
DelayTime1ms(5); //写个延时程序 为什么加延时请看时序图
lcden= 0;
byte = P0;
DelayTime1ms(5);
lcden= 1;
return byte;
}