一、液晶的概述 液晶的型号命名规则 液晶的命名规则有两种,第一种是按照显示字符的行数和列数命名的,如LCD1602,表示液晶上显示2行,一行16个字符;第二种是按照液晶点阵的行数和列数命名的,如LCD12232,表示液晶上有122x32个点来显示图形。
二、LCD1602 1.概况 LCD1602为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库,既可显示库中的字符,也可显示自定义字符。只有并行接口,无串行接口。LED可以静态显示字符,也可以使用移屏指令实现整屏幕左移。
2.引脚详情
引脚
名称
解释
1
VSS
电源地
2
VDD
电源正极
3
VL
液晶显示偏压信号,可以改变背光亮度,对比调整电压
4
RS
数据/命令选择端,0输入指令,1输入数据
5
R/W
读/写选择的端,0写入指令或数据,1读取信息
6
E
使能信号,1时读取信息,下降沿执行指令
7-14
D0-D7
数据输入/输出端
15
BLA
背光源正极
16
BLK
背光源负极
3.I/O口与操作 在大多数时候很少使用LCD1602的读取功能,因此在第5引脚R/W置0时,有如下功能:
命令操作 当第4引脚RS置0时,D0-D7为命令接收位,有如下指令和模式可以设置: (0为低电平,1为高电平,X为任意电平,?为不同电平对应指令在下表中)
清屏 清除液晶显示器,DDRAM的内容填入空白ASCII码20H;光标归位,撤回到显示屏左上方;地址计数器(AC)设置为0。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
0
0
0
0
0
1
光标归位 光标归位,撤回到显示屏左上方;地址计数器(AC)设置为0。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
0
0
0
0
1
X
模式设置 模式设置包括设置光标的移位方向和写入数据后显示屏是否移动。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
0
0
0
1
?
?
位序号与电平
功能解释
D1=0
写入新数据后光标左移
D1=1
写入新数据后光标右移
D0=0
写入新数据后显示屏不移动
D0=1
写入新数据后显示屏右移一个字符
显示开关控制 显示开关控制包括控制显示器开/关,光标的显示/关闭以及是否闪烁。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
0
0
1
?
?
?
位序号与电平
功能解释
D2=0
显示功能关
D2=1
显示功能开
D1=0
无光标
D1=1
有光标
D0=0
光标闪烁
D0=1
光标不闪烁
设定显示屏或光标移位 可以使光标移位或使整个显示屏移位。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
0
1
?
?
X
X
位序号与电平
功能解释
D3=0,D4=0
光标左移1格,AC值-1
D3=0,D4=1
光标右移1格,AC值+1
D3=1,D4=0
显示器上字符全部左移1格,光标不动
D3=0,D4=0
显示器上字符全部右移1格,光标不动
功能设定 功能设定包括设定数据总线位数、显示的行数和字型。
位序号
D7
D6
D5
D4
D3
D2
D1
D0
电平
0
0
1
?
?
?
X
X
位序号与电平
功能解释
DB4=0
数据总线为4位
DB4=1
数据总线为8位
DB3=0
显示1行
DB3=1
显示2行
DB2=0
5×7点阵/字符
DB2=1
5×10点阵/字符
位序号
功能解释
D6=1
设定下一个要存入数据的CGRAM的地址
D7=1
设定下一个要存入数据的DDRAM的地址
注: 1.在D7=1设置地址时,由于地址只有80个字节,因此只需要七位就能表示了。(2^7^=128) 2.总线即为单片机与D0-D7连接时的使用线的数量。8位总线即LCD1602上D0-D7都与单片机的IO口进行数据交换,4位总线为D4-D7(高四位)与单片机的IO口进行数据交换。在液晶屏刷新率不高时,或者单片机IO口数量紧张时,采用4线。 3.AC(Address Counter)地址计数器。汇编常用,不过这里表示保存地址指针的空间。地址指针(光标)通过地址计数器寻址。
地址操作 LCD1602中有3个储存器:
DDRAM(Display Data RAM) DDRAM是显示数据随机存储器。共80个字节。从下图可以看出,DDRAM中的地址对应的LCD每个字符的位置。但只有2×16个地址可以对应到液晶上的每一位,剩余的地址只能储存信息但不会显示在液晶上。 事实上,我们不会直接操纵液晶的地址。而是通过地址指针(光标)来进行左移右移,然后写入数据。当第4引脚RS置1时,D0-D7为数据接收位,通过接收到的数据写入地址指针(光标)指向的地址。
CGROM(Character Generation ROM) CGROM是标准字符储存器。储存了每个字符的点阵形状。在液晶出场时就固化在控制芯片中的,不能更改。
CGRAM(Character Generation RAM) CGRAM是存放字符点阵的储存器,能存放自定义字符库。用户可以更改。
4.时序图
写操作步骤
步骤
操作
解释
1
判断D7是否处于忙状态
由于LCD1602速度高于单片机,因此不需要判断或简单延时即可
2
设定RS
选择写命令还是写数据
3
设定R/W
置低电平为写模式
4
操作D0-D7
将数据送达到数据线上
5
给E端口一个高频脉冲
把数据送入液晶,完成写操作
初始化步骤
步骤
操作
解释
1
RS = 0,R/W=0
设置写入指令模式
1
D0-D7=0x38
写入功能设定 总线选择为8 显示2行 5×7点阵
2
D0-D7=0x0d
写入显示开关 显示功能开 无光标 光标不闪烁
3
D0-D7=0x06
写入模式选择 光标右移 屏幕不移动
3
D0-D7=0x01
清屏
3
D0-D7=0x80
设置数据指针起点
注:在每一步操作中间可以加入延时函数,防止指令输入有误。
5.例程:在LCD1602上打印Hello world! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #include <reg52.h> typedef unsigned int u16; typedef unsigned char u8;#define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7 ; sbit LCD1602_RW=P2^5 ; sbit LCD1602_RS=P2^6 ; u8 Disp[]=" Hello world! " ;void Delay (u16) ; void LcdWriteCom (u8) ; void LcdWriteData (u8) ; void LcdInit () ; void main (void ) { u8 i; LcdInit(); for (i=0 ;i<16 ;i++) { LcdWriteData(Disp[i]); } while (1 ); }void Delay (u16 c) { u8 a,b; for (;c>0 ;c--) for (b=199 ;b>0 ;b--) for (a=1 ;a>0 ;a--); }void LcdWriteCom (u8 com) { LCD1602_E = 0 ; LCD1602_RS = 0 ; LCD1602_RW = 0 ; LCD1602_DATAPINS = com; Delay(1 ); LCD1602_E = 1 ; Delay(5 ); LCD1602_E = 0 ; }void LcdWriteData (u8 dat) { LCD1602_E = 0 ; LCD1602_RS = 1 ; LCD1602_RW = 0 ; LCD1602_DATAPINS = dat; Delay(1 ); LCD1602_E = 1 ; Delay(5 ); LCD1602_E = 0 ; }void LcdInit () { LcdWriteCom(0x38 ); LcdWriteCom(0x0d ); LcdWriteCom(0x06 ); LcdWriteCom(0x01 ); LcdWriteCom(0x80 ); }
注: 1.例程采用的是8位总线,4位总线需要线接收高四位然后进行移位再写入低四位。 2.若要在第二行打印,只需要加一句LcdWriteCom(0x80+0x40);使得地址指针移动到第二行开头。