51单片机学习笔记——LCD1602

一、液晶的概述

液晶的型号命名规则

液晶的命名规则有两种,第一种是按照显示字符的行数和列数命名的,如LCD1602,表示液晶上显示2行,一行16个字符;第二种是按照液晶点阵的行数和列数命名的,如LCD12232,表示液晶上有122x32个点来显示图形。

二、LCD1602

1.概况

LCD1602为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库,既可显示库中的字符,也可显示自定义字符。只有并行接口,无串行接口。LED可以静态显示字符,也可以使用移屏指令实现整屏幕左移。51单片机学习笔记——LCD1602_第1张图片

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个地址可以对应到液晶上的每一位,剩余的地址只能储存信息但不会显示在液晶上。51单片机学习笔记——LCD1602_第2张图片
    事实上,我们不会直接操纵液晶的地址。而是通过地址指针(光标)来进行左移右移,然后写入数据。当第4引脚RS置1时,D0-D7为数据接收位,通过接收到的数据写入地址指针(光标)指向的地址。
  • CGROM(Character Generation ROM)
    CGROM是标准字符储存器。储存了每个字符的点阵形状。在液晶出场时就固化在控制芯片中的,不能更改。
    51单片机学习笔记——LCD1602_第3张图片
  • CGRAM(Character Generation RAM)
    CGRAM是存放字符点阵的储存器,能存放自定义字符库。用户可以更改。

4.时序图

51单片机学习笔记——LCD1602_第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 
typedef unsigned int u16;	  
typedef unsigned char u8;

#define LCD1602_DATAPINS P0		//P0口连接到LCD1602的D0-D7
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();					//LCD1602初始化函数

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);					//延时1ms,等待数据稳定
	LCD1602_E = 1;	        	//写入时序
	Delay(5);	 				//延时1ms,保持时间
	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);  					//延时1ms,保持时间
	LCD1602_E = 0;
}

void LcdInit()					//LCD初始化子程序
{
	LcdWriteCom(0x38);  		//总线选择为8 显示2行 5×7点阵
	LcdWriteCom(0x0d);  		//显示功能开 无光标 光标不闪烁
	LcdWriteCom(0x06);  		//光标右移 屏幕不移动
	LcdWriteCom(0x01);  		//清屏
	LcdWriteCom(0x80);  		//设置数据指针起点
}

注:
1.例程采用的是8位总线,4位总线需要线接收高四位然后进行移位再写入低四位。
2.若要在第二行打印,只需要加一句LcdWriteCom(0x80+0x40);使得地址指针移动到第二行开头。

你可能感兴趣的:(51单片机学习笔记——LCD1602)