第5章液晶显示输出.docx
《第5章液晶显示输出.docx》由会员分享,可在线阅读,更多相关《第5章液晶显示输出.docx(59页珍藏版)》请在冰豆网上搜索。
第5章液晶显示输出
第5章液晶显示输出
5.1概述
液晶显示器(LCD:
LiquidCrystalDisplay)简称液晶,它具有体积小、重量轻、电压低、功耗低、显示内容丰富且操作简单的特点,在仪器仪表、电子产品等众多领域都有广泛应用。
液晶显示是单片机显示输出的一种重要方式。
液晶主要有字符型液晶和点阵型液晶两大类。
字符型液晶一般按其显示字符行列数来命名,例如,0802表示每行显示8个字符,共2行;1602表示每行显示16个字符,共2行。
点阵型液晶一般按其点阵行列数来命名,例如,12864表示该液晶是由64行、128列的点阵组成,即可以用64×128个点来显示图形或文字等,点阵型液晶又分为带字库和不带字库两类。
本章重点介绍三款液晶的显示输出:
字符型液晶1602/0802,不带字库的12864点阵液晶和带字库的12864点阵液晶。
5.21602/0802字符液晶显示输出
5.2.11602/0802液晶简介
1602和0802字符型液晶实物的正面如图5-1所示,0802是每行显示8个字符,共有两行,即一次最多可以显示16个字符;1602是每行显示16个字符,共有两行,即一次最多可以显示32个字符;这两种液晶的差别仅仅是所能显示字符个数不同,其它方面如管脚、控制时序、使用方法等均完全相同,所以本节重点介绍1602液晶,0802液晶可以参照使用。
图5-11602和0802液晶实物正面图
1602是字符型液晶,内含128个ASCII字符的字符库,故可以显示ASCII字符,而不能显示汉字。
1602液晶可以显示两行信息,每行16个字符,5V电源供电,带有背光。
表5-1列出了1602/0802的引脚及其定义。
表5-11602/0802的引脚及其定义
引脚
序号
引脚
名称
功能描述
引脚
序号
引脚
名称
功能描述
1
VSS
电源地
9
D2
数据第2位
2
VDD
电源正极(+5V)
10
D3
数据第3位
3
VL
液晶显示偏压信号
11
D4
数据第4位
4
RS
数据/命令选择端
12
D5
数据第5位
5
R/W
读/写选择端
13
D6
数据第6位
6
E
使能信号
14
D7
数据第7位(最高位)
7
D0
数据第0位(最低位)
15
BLA
背光电源正极
8
D1
数据第1位
16
BLK
背光电源负极
1602液晶管脚简介如下:
◆引脚1——VSS,电源地。
该引脚接地。
◆引脚2——VDD,电源正极。
该引脚接+5V电源。
◆引脚3——VL,液晶显示偏压信号。
该引脚与电源地之间连接一个电位器,用于调节显示偏置电压,使液晶能正常显示。
◆引脚4——R/S,数据/命令选择端。
R/S=1代表数据,R/S=0代表命令。
◆引脚5——R/W,读/写选择端。
R/W=1代表读操作,R/W=0代表写操作。
◆引脚6——E,使能信号。
E=1代表液晶被使能,E=0代表液晶未被选中。
◆引脚7~14——D0~D7,8位数据线。
最高位是D7,最低位是D0。
◆引脚15——BLA,背光电源正极。
该引脚与电源正极间一般接一个10Ω的电阻即可。
◆引脚16——BLK,背光电源负极。
该引脚一般直接接地。
5.2.21602/0802液晶特点及使用
1、1602液晶显示的数据
1602液晶能显示的字符是ASCII码表(参见附录A:
常见字符与ASCII码对照表)中的部分字符(ASCII码值从33开始到125,126是水平向右指的小箭头,127是水平向左指的小箭头。
1602能显示的除部分ASCII码外,还有部分日文片假名和希腊字母,详细内容请查阅相关资料)。
常规使用中,若要通过1602液晶显示某一字符,只需将该字符对应的ASCII码值送1602液晶显示即可。
实际应用中,若用C语言编程,则可直接将准备显示的字符放在一对单撇号(’’)内送给1602液晶去显示,例如:
‘3’,‘A’,‘=’等。
对于数字,则可以用具体数字加上‘0’去显示,例如要显示数字6,则可以将6+‘0’送去显示,因为6+‘0’相当于6+48=54,其中数值48是数字0的ASCII值,而54恰好就是数字6的ASCII值。
2、1602液晶字符显示的位置
如果忽略或者说不讨论1602内部数据RAM缓冲区及其地址映射结构等内容,1602的使用方法可以简化。
下面就来说明这种简化的应用方法。
前面已经讨论了显示数据的方法,接下来就该确定数据在液晶屏上显示的具体位置,即在哪一行、哪一列的位置上显示数据。
表5-2列出了1602液晶屏2行16列中每一个具体位置的地址,向这些地址写数值,所写数值对应的ASCII码字符就在该地址对应的位置显示出来。
例如,要在第0行第0列显示字母A,就向地址0x80写‘A’或者数值65;要在第1行第13列显示数字6,就向地址0xCD写6+‘0’或者数值54。
表5-21602液晶显示数据地址
第0列
第1列
第2列
第3列
第12列
第13列
第14列
第15列
第0行
0x80
0x81
0x82
0x83
……
0x8C
0x8D
0x8E
0x8F
第1行
0xC0
0xC1
0xC2
0xC3
……
0xCC
0xCD
0xCE
0xCF
3、1602液晶指令说明
①显示模式设置指令码——0x38
指令码
功能说明
0
0
1
1
1
0
0
0
16×2显示,5×7点阵,8位数据接口
注:
0802尽管是每行8个字符,但也设置为16×2,指令码仍然为0x38。
②显示开/关及光标设置
指令码
功能说明
0
0
0
0
1
D
C
B
D=1开显示;D=0关显示
C=1显示光标;C=0不显示光标
B=1光标闪烁;B=0光标不显示
0
0
0
0
0
1
N
S
N=1当读或写一个字符后,地址指针加1,且光标加1;N=0当读或写一个字符后,地址指针减1,且光标减1;当写一个字符时,S=1 整屏左移(N=1)或右移(N=0);S=0 整屏显示不移动。
③其它指令
指令码
功能说明
0x01
清屏
0x02
显示回车
4、1602液晶初始化
1602液晶的初始化按照以下步骤进行(不检查忙信号):
S1:
将R/W引脚设置为低电平,使写操作有效;
S2:
将E引脚设置为低电平,使能液晶;
S3:
写指令0x38(16×2显示,5×7点阵,8位数据接口);
S4:
写指令0x0C(开显示,不显示光标);
S5:
写指令0x06(当读或写一个字符后地址指针加1,且光标加1;当写一个字符时,整屏显示不移动);
S6:
写指令0x01(清屏)。
5、1602液晶操作时序
在不执行读操作的情况下,此处仅给出1602写操作的时序图,如图5-2所示。
图5-21602写操作时序图
写操作分为写指令和写数据两种情形。
写指令:
RS=0,RW=0,DB0~DB7=指令码,E=1,E=0;
写数据:
RS=1,RW=0,DB0~DB7=数据,E=1,E=0;
5.2.31602/0802字符液晶显示输出实例
功能要求:
使用1602液晶在屏幕指定位置显示指定字符。
硬件说明:
电路如图5-3所示。
单片机的P1口做数据口使用,三条控制线RS、RW和E,分别连接51单片机的P2.0,P2.1和P2.2引脚。
软件说明:
1、按照写操作的时序图,分别给出了写指令和写数据两个子函数;
2、
2、初始化子函数,主要由写指令子函数调用相关的指令,进行1602的设置或配置工作。
3、显示子函数中,首先是通过调用写指令子函数指定位置,在延时一段时间后,再通过调用写数据子函数,向指定位置写字符。
其中x取0或者1,用于指定显示位置中的行;y取0~15中某一个值,用于指定显示位置中的列,ch是在(x,y)位置显示的字符。
4、很多情况下,为了使显示能紧随被显示值的变化而实时变化,显示子函数一般会被包含在循环体中。
此时,显示子函数中,写指令子函数调用和写数据子函数调用之间的延时,可以省略或延时时间可以稍短一些,具体情况可依应用自行测试调节。
图5-31602液晶使用硬件电路图
程序清单如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
ucharcodetab[]={"0123456789"};
voidwrcmd1602(ucharcmd)
{
ucharm;
RW=0;
RS=0;
P1=cmd;
for(m=0;m<=2;m++);
E=1;
for(m=0;m<=2;m++);
E=0;
}
voidwrdata1602(ucharshuju)
{
ucharm;
RW=0;
RS=1;
P1=shuju;
for(m=0;m<=2;m++);
E=1;
for(m=0;m<=2;m++);
E=0;
}
voidinit1602(void)
{
RW=0;
E=0;
wrcmd1602(0x38);
wrcmd1602(0x0C);
wrcmd1602(0x06);
wrcmd1602(0x01);
}
voiddisp1602(ucharx,uchary,ucharch)
{
ucharm;
wrcmd1602(0x80+x*0x40+y);
for(m=0;m<=252;m++);
wrdata1602(ch);
}
main()
{
uchari;
uintj;
init1602();
for(i=0;i<=9;i++)
{
disp1602(0,i,tab[i]);
disp1602(1,15-i,tab[i]);
}
while
(1);
}
5.3不带字库12864液晶显示输出
5.3.112864点阵液晶显示输出简介
本节介绍的12864点阵液晶是LM6063CFW,其内部不带字库,工作电压3.3V。
图5-4是其实物的正面和反面,表5-3列出了其20个引脚的定义及功能简介。
图5-4LM6063CFW12864点阵液晶实物正反面
表5-3LM6063CFW12864点阵液晶引脚定义
引脚
序号
引脚
名称
功能描述
1
A0
数据/指令选择端。
A0=1,代表数据;A0=0,代表指令。
2
RD
读操作使能端,低电平有效。
读操作时,RD=0。
3
WR
写操作使能端,低电平有效。
写操作时,WR=0。
4
RES
复位端。
RES=0,初始化时执行复位操作;RES=1,液晶正常工作。
5
CS1
片选信号。
低电平有效。
6,7
VSS
电源负极,接地。
8
VDD
电源正极(+3.3V)
9~16
D0~D7
8位数据口。
D7是最高位,D0是最低位。
17
BLA
液晶背光正极,要求电压3.3V,电流85mA左右,故可以直接接3.3V电源
18
BLK
液晶背光负极,一般接地
19,20
NC
保留
5.3.212864点阵液晶特点及使用
1、12864液晶工作电压
LM6063CFW12864液晶的工作电压是3.3V,与常见的5V电压不匹配,此处选用AMS1117-3.3稳压芯片,它能将输入的5V电压稳压到3.3V后输出。
AMS1117-3.3的实物及SOT223封装如图5-5所示,其中引脚1为接地引脚,引脚2为3.3V电压输出引脚,引脚3为5V电压输入引脚。
图5-5AMS1117-3.3V稳压芯片实物与封装引脚图
2、12864液晶存储器结构图
LM6063CFW12864液晶显示存储器结构图如图5-6所示。
图5-6LM6063CFW12864液晶显示存储器结构图
由此结构图可知,LM6063CFW12864液晶有128×64个点阵像素点,这些像素点被分成64行,128列。
64行又被划分为8页,页地址依次为0~7,每一页占8行。
每一页有128列,列地址为0x00~0x7F。
这种结构,使得每页上的任意一列数据,都恰好是二进制8位(一页上的一列数据恰好构成二进制8位数据,即一个字节),方便了与8位数据总线间的接口。
特别需要注意的是,这8位数据中最低位(第0位)在上,而最高位(第7位)在下。
在显示时,要先设定页地址,即确定显示目标位置所在的页;然后再设置列地址,即确定显示目标位置所在的列;最后将准备显示的数据发送给液晶显示器,这样,在刚才确定的位置就能看到显示的结果。
3、12864液晶工作指令
LM6063CFW12864液晶的指令有20多条,但大部分都用作液晶初始化,只要按照芯片资料的要求,依照顺序依次执行就可以了,使用中没有必要深究这些固定不变的细节。
这样一来,LM6063CFW12864液晶需要掌握的工作指令就所剩无几了,其主要指令如表5-4所示。
表5-4LM6063CFW12864液晶主要指令
控制线
指令码
功能说明
A0
RD
WR
D7
D6
D5
D4
D3
D2
D1
D0
0
1
0
1
0
1
1
页地址
设置页地址(范围0~7)
0
1
0
0
0
0
1
列地址高4位
设置列地址(范围:
0~127)。
将列地址数据分为高4位和低4位分别发送
0
1
0
0
0
0
0
列地址低4位
1
1
0
显示数据
写显示数据
4、12864液晶工作时序
图5-7是LM6063CFW12864液晶工作时序图,其间的时间间隔都在ns级。
图5-7LM6063CFW12864液晶工作时序图
5、12864液晶复位时序
图5-8是LM6063CFW12864液晶复位时序图,其间的低电平时间应大于2.5μs。
图5-8LM6063CFW12864液晶复位时序图
6、12864液晶初始化
LM6063CFW12864液晶的初始化工作就是向液晶依次发送(写)一系列指令,具体如下:
S1:
向液晶发送(写)指令0xA1;
S2:
向液晶发送(写)指令0xC0;
S3:
向液晶发送(写)指令0xA2;
S4:
向液晶发送(写)指令0x40;
S5:
向液晶发送(写)指令0xA4;
S6:
向液晶发送(写)指令0xA6;
S7:
向液晶发送(写)指令0x2F;
S8:
向液晶发送(写)指令0xAF;
S9:
向液晶发送(写)指令0x81和指令0x30。
5.3.312864点阵液晶使用实例
功能要求:
在LM6063CFW12864液晶屏上显示,
1、在指定的页、列位置处显示(点亮)一个像素点;
2、在指定的页,多列范围内显示单个字符(ASCII中的大部分字符);
3、从指定页的某一列开始,连续显示字符串;
4、在指定位置显示汉字。
硬件说明:
硬件连接如图5-9所示,
1、本款LCD12864液晶工作电压是3.3V,所以使用了AMS1117_3.3V稳压芯片,为该液晶提供正确的工作电压;
2、背光正极直接连接到3.3V电源端;
3、因只对12864液晶执行写操作,而没有读操作,所以RD(引脚2)直接连接电源3.3V;
4、4条信号控制线A0,WR,RES和CS依次直接连接到单片机的P2口的部分引脚上;
5、8条数据线在接100Ω限流电阻后接单片机I/O口,此处选用P1口;
6、VSS和背光负极直接接地。
图5-9LCD12864点阵液晶应用硬件图
软件说明:
1、本例程序中对液晶LCD12864的复位、写指令及写数据操作,均使用模拟口线方式;依照图5-8的复位子函数reset12864()、依照图5-7的写指令和写数据子函数wrcmd12864()和wrdata12864()都较简单,请读者自己依照时序参看程序清单分析。
2、清屏子函数,就是循环向液晶屏8页空间的每一页的128列,都写数据0;
3、向12864液晶屏的某一页的某一列写一个字节的数据,该字节数据中的1将点亮该位置的点。
例如将数据0x01(二进制00000001)写到第0页的第0列,结果就是12864液晶屏左上角顶角的那个像素点被点亮。
子函数disp12864onec()用于向指定的页(变量p)、指定的列(变量y)写数据(变量shuju)。
子函数如下所示。
首先是用写命令子函数,将页位置、列位置高4位、列位置的低4位,分别写入液晶,最后,将显示的数据用写数据子函数写入液晶。
voiddisp12864onec(ucharp,uchary,ucharshuju)
{
wrcmd12864(0xB0|p);
wrcmd12864(0x10|(y/16));
wrcmd12864(0x00|(y%16));
wrdata12864(shuju);
}
主函数中的disp12864onec(0,0,0x01);语句就是调用该子函数,将液晶屏的左上角顶角的那一个像素点亮。
4、字符显示
无论是字符还是图形图像,在液晶屏上能得以显示的本质,就是用一系列像素点,组成字符或图形图像的图样点阵。
由于本款液晶是内部不带字库的点阵型液晶,为了方便显示字符或图像,可以将常用字符对应的点阵数据以数组形式存储,供液晶显示时使用。
我们可以按照字符的具体模样,手动描点来得到字符的点阵数据,也可以通过字模生成软件(简称字模软件,例如PCtoLCD软件等)来生成字符的点阵数据。
本例对照ASCII码表,用PCtoLCD软件,将常用的字符(ASCII表中从值为33的“!
”开始到值为126的“~”,共计94个,另外编者自己手动设计了一个小数点的字符编码并列于此表的最后一个,即第95个)的每一个字符,生成与其对应的6×8点阵大小的点阵数据,因有95个字符,所以字符点阵数组是95行、6列的二维数组,即字符库数组tabchx[95][6]。
该字符库中字符排列顺序,与ASCII码表字符排列顺序一致,但是该字符库中字符是从ASCII码表中的“!
“字符开始,所以本字符库中某个字符的“值”(行下标),比ASCII码表中该字符的ASCII值要小33(“!
”的ASCII码值是33)。
具体使用本字符库时,可以用某字符的ASCII码值减去33,即得到该字符在本字符库数组tabchx[95][6]中的行下标,然后依次读取字符库数组中这一行的6个元素值,并送至液晶显示,在液晶屏上指定位置,就能看到该字符的显示结果。
小数点定义在数组tabchx[95][6]中的最后一行,行下标为94(注意:
数组下标从0开始计数)。
显然,将这样一个有95行、6列的字符库二维数组编辑放在程序的开头是很不恰当的,所以本例中将该字符库二维数组tabchx[95][6]在文本文件编辑环境中编辑,并存储为头文件形式,且命名为chxcharlib.h,然后将该头文件复制粘贴到KeilC安装目录下的Keil\C51\INC文件夹中,与reg52.h,intrins.h等头文件并列存放在一起。
有了这些前提准备之后,这时只需在程序开头如同包含reg52.h头文件#include一样,将该头文件包含进来,即:
#include即可,以后就可以方便地调用这个字符库了。
以下是头文件chxcharlib.h的具体内容。
unsignedcharcodetabchx[95][6]={
{0x00,0x00,0x5F,0x00,0x00,0x00},//!
{0x00,0x03,0x00,0x03,0x00,0x00},//
{0x14,0x7F,0x14,0x7F,0x14,0x00},//#
{0x00,0x4C,0x7A,0x4F,0x32,0x00},//$
{0x00,0x66,0x16,0x68,0x66,0x00},//
{0x00,0x38,0x4F,0x4D,0x32,0x00},//&
{0x00,0x00,0x00,0x03,0x00,0x00},//
{0x00,0x00,0x3E,0x41,0x00,0x00},//(
{0x00,0x00,0x41,0x3E,0x00,0x00},//)
{0x00,0x24,0x18,0x18,0x24,0x00},//*
{0x08,0x08,0x3E,0x08,0x08,0x00},//+
{0x00,0x00,0x00,0x60,0x00,0x00},//,
{0x00,0x08,0x08,0x08,0x08,0x00},//-
{0x00,0x30,0x48,0x48,0x30,0x00},//。
{0x00,0x40,0x30,0x0C,0x03,0x00},//
{0x3E,0x51,0x49,0x45,0x3E,0x00},//0
{0x00,0x42,0x7F,0x40,0x00,0x00},//1
{0x72,0x49,0x49,0x49,0x46,0x00},//2
{0x21,0x41,0x49,0x4D,0x33,0x00},//3
{0x18,0x14,0x12,0x7F,0x10,0x00},//4
{0x27,0x45,0x45,0x45,0x39,0x00},//5
{0x3C,0x4A,0x49,0x49,0x31,0x00},//6
{0x41,0x21,0x11,0x09,0x07,0x00},//7
{0x36,0x49,0x49,0x49,0x36,0x00},//8
{0x46,0x49,0x49,0x29,0x1E,0x00},//9
{0x00,0x00,0x14,0x00,0x00,0x00},//:
{0x00,0x40,0x34,0x00,0x00,0x00},//;
{0x00,0x08,0x14,0x22,0x41,0x00},//<
{0x14,0x14,0x14,0x14,0x14,0x00},//=
{0x00,0x41,0x22,0x14,0x08,0x00},//>
{0x02,0x01,0x59,0x09,0x06,0x00},//?
{0x3E,0x41,0x5D,0x59,0x4E,0x00},//@
{0x7C,0x12,0x11,0x12,0x7C,0x00},//A
{0x7F,0x49,0x49,0x49,0x36,0x00},//B
{0x3E,0x41,0x41,0x41,0x22,0x00},//C
{0x7F,0x41,0x41,0x41,0x3E,0x00},//D
{0x7F,0x49,0x49,0x49,0x41,0x00},//E
{0x7F,0x0