一、液晶的概述
液晶的型号命名规则
液晶的命名规则有两种,第一种是按照显示字符的行数和列数命名的,如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个字节,因此只需要七位就能表示了。(27 =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!
#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);使得地址指针移动到第二行开头。