51单片机-驱动LCD1602液晶显示屏教程

本章概述思维导图:

51单片机驱动LCD1602液晶显示实验教程

LCD1602液晶显示屏简介

LCD1602是一种成本低廉、控制简便且应用广泛的字符型液晶显示模块,其名称中的"1602"代表每行可显示16个字符、共2行的显示容量。该模块基于液晶光电效应工作,通过电场控制液晶分子偏转实现字符显示,支持蓝色或绿色背光,具备标准化接口和丰富的指令集,广泛应用于仪器仪表、家用电器及嵌入式系统中需要简单文本提示的场景,尤其适合对显示功能要求不高但追求开发效率的入门级项目。实物图如下所示:


LCD1602显示屏核心参数

1、显示容量:16×2个字符。每个字符由若干个5×7或5×10的点阵字符位组成;

2、芯片工作电压:4.5-5.5V,模块最佳工作电压通常为5.0V。

3、工作电流:约2.0mA(在5.0V电压下)。

4、字符尺寸:每个字符的尺寸为2.95mm×4.35mm(宽×高)。

5、显示颜色:通常为蓝色或绿色背光,也有其他颜色可选。

6、视角:可视角度一般为6点钟方向至12点钟方向,水平可视角度约为70度。


LCD1602显示屏引脚功能

LCD1603通常有16个引脚,各种引脚的功能如下:

|--------------|-------|---------------------------------------------|
| 引脚编号 | 引脚名称 | 功能描述 |
| 1 | VSS | 电源地(接地) |
| 2 | VDD | 接5V正电源 |
| 3 | VL | 液晶显示偏压调整端,通过电位器调节显示对比度(接正电源时对比度最弱,接地时对比度最高) |
| 4 | RS | 数据/命令选择端(高电平选数据寄存器,低电平选指令寄存器) |
| 5 | R/W | 读写信号线(高电平读操作,低电平写操作) |
| 6 | E | 使能端(高电平跳变为低电平时执行命令) |
| 7-14 | D0-D7 | 8位双向数据线(传输数据和指令) |
| 15 | BLA | 背光源正极(通常接5V) |
| 16 | BLK | 背光源负极(通常接地) |


LCD1602显示屏内存结构

LCD1602的内存分为三类,分别用于存储字符字模、显示数据和用户自定义字符;

一、CGROM(字符发生器ROM)

CGROM是LCD1602内部固化的只读存储器,存储了192个标准字符的字模数据,包括:5×7点阵字符(如字母、数字、符号)部分5×10点阵字符(需通过指令0x34或0x36切换模式)

工作原理:

当微控制器向DDRAM写入一个字符的ASCII码时,LCD1602会自动从CGROM中查 找对应字符的字模数据。

示例:

显示字符'A'时,写入ASCII码0x41,LCD1602自动从CGROM中读取'A'的字 模并显示。

访问方式:

通过字符的ASCII码自动映射到CGROM中的字模数据,无需用户干预。

特点:

只读不可修改:用户无法更改CGROM中的字模数据。

无需手动操作:显示标准字符时,用户只需写入ASCII码,无需直接操作CGROM

二、DDRAM(显示数据RAM)

DDRAM是LCD1602的显示缓冲区,用于存储当前屏幕上显示的字符的ASCII码。它直接决定了屏幕的显示内容。

第一行:0x00~0x0F(实际显示0x00~0x0F)。

第二行:0x40~0x4F(实际显示0x40~0x4F)。

剩余地址(如0x10~0x3F、0x50~0x7F)用于屏幕滚动时的字符暂存。

操作:通过设置DDRAM地址指令(如0x80+偏移量)定位光标位置,再写入数据。

这里有小伙伴会有疑问,为什么要0x80+偏移量呢?是因为最高位也就是DB7地址指令规定一直为1(0x80),DB6-DB0为CGRAM的地址(7位);操作指令如图所示:

示例:

显示位置操作:

比如说要在第一排第二个位子写入数据时地址设定指令为:0x80|0x01或者0x80+2;这样才是对

显示数据操作:指令编码如图说是

要在第一排第二个位子写入数据1时,应该传输ASCII码值为0x31

特点:

动态更新:修改DDRAM中的数据会立即反映在屏幕上。

地址连续:写入数据后,地址计数器(AC)会自动加1(需通过指令0x06设置)。

三、CGRAM(字符发生器RAM)

CGRAM是LCD1602的可编程字符存储器,允许用户自定义8个5×7点阵字符或4个5×10点阵字符的字模数据。

总容量:64字节(8字符×8字节)

地址范围:0x00~0x07(每个字符占8字节)。

自定义步骤:

写入指令0x40+字符编号(如0x40定义第一个字符)。

依次写入8字节的字模数据(每字节代表点阵的一行,1为亮,0为灭)。

在DDRAM中写入字符编号(如0x00)即可显示自定义字符。


LCD1602显示屏寄存器介绍

LCD1602内部包含两个关键寄存器,用于控制显示操作:

1、指令寄存器(Instruction Register, IR)

功能:接收微控制器发送的指令(如清屏、光标移动等)。

控制方式:通过RS=0(低电平)选择指令寄存器,R/W=0(低电平)写入指令。

示例指令:

0x01:清屏,将DDRAM内容清空,光标复位到左上角。

0x02:光标归位,光标移至左上角,DDRAM内容不变。

0x06:输入模式设置,光标右移,字符写入后地址自动加1。

2、数据寄存器(Data Register, DR)

功能:存储待显示字符的ASCII码或从DDRAM/CGRAM读取的数据。

控制方式:通过RS=1(高电平)选择数据寄存器,R/W=0(低电平)写入数据,R/W=1 (高电平)读取数据。

数据流向:写入时,数据存入DDRAM或CGRAM;读取时,从DDRAM或CGRAM加载 数据到DR。


LCD1602显示屏指令集简介

LCD1602支持11条控制指令,用于初始化、显示控制、光标移动等操作:

|-------------------------|---------------------|--------------------------------------------------|
| 指令 | 指令码(十六进制) | 功能说明 |
| 清屏 | 0x01 | 清除DDRAM内容,光标复位到左上角,地址计数器(AC)归零。 |
| 光标归位 | 0x02 | 光标移至左上角,DDRAM内容不变,AC归零。 |
| 输入模式设置 | 0x04/0x05/0x06/0x07 | 设置光标移动方向(I/D)和屏幕滚动(S)。例如,0x06表示光标右移,地址自动加1。 |
| 显示开关控制 | 0x08~0x0F | 控制显示(D)、光标(C)、闪烁(B)。例如,0x0C表示开显示、无光标、不闪烁。 |
| 光标/字符移位 | 0x10~0x1F | 移动光标(S/C=0)或整体屏幕(S/C=1)。例如,0x14表示光标右移。 |
| 功能设置 | 0x20~0x3F | 设置数据总线位数(DL)、行数(N)、点阵(F)。例如,0x38表示8位数据、两行、5×7点阵。 |
| CGRAM地址设置 | 0x40~0x7F | 设置自定义字符的CGRAM地址(需先定义字模,再在DDRAM中写入字符编号)。 |
| DDRAM地址设置 | 0x80~0xFF | 设置显示起始地址(如0x80为第一行首列,0xC0为第二行首列)。 |
| 读忙信号/AC地址 | 0x00(读状态时) | 读取忙标志(BF)和AC地址(BF=1时模块忙,需等待)。 |
| 写数据到DDRAM/CGRAM | RS=1, R/W=0 | 将数据写入当前选中的DDRAM或CGRAM地址。 |
| 从DDRAM/CGRAM读数据 | RS=1, R/W=1 | 从当前选中的DDRAM或CGRAM地址读取数据。 |

详细说明:

一、清屏指令

功能:

1、清楚液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码0x20;

2、光标归位,即将光标撤回液晶显示屏的左上方;

3、将地址计数器(AC)的值设为0;

二、光标归位指令

功能:

1、把光标撤回到显示器的左上方

2、把地址计数器(AC)的值设置为0;

3、保持DDRAM的内容不变

三、进入模式设置指令

功能:

1、设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。

设置操作:

I/D:写0表示写入新数据后光标左移,写1表示写入新数据后光标右移;

S:写0表示写入新数据后显示屏不移动,写1表示写入新数据后显示屏整体右移1字符;

四、显示开关控制指令

功能:

1、 控制显示器开关,光标开关,以及光标是否闪烁。

设置操作:

D:写0表示显示功能关闭,写1表示显示功能开启;

C:写0表示无光标,写1表示有光标;

B:写0表示光标闪烁,写1表示光标不闪烁

五、设定显示屏或光标移动方向指令

功能:

1、使光标移位或使整个显示屏移位。

设置操作:

S/C:0 R/L:0 光标左移1格,且AC值减1

S/C:0 R/L:1 光标右移1格,且AC值加1

S/C:1 R/L:0 显示器上字符全部左移1格,单光标不动;

S/C:1 R/L:1 显示器上字符全部右移1格,单光标不动;

六、功能设定指令

功能:

设定数据总线位数、显示的行数及字型。

设置操作:

DL:写0数据总线为4位,写1数据总线为8位

N:写0显示1行,写1显示2行

F:写0是5*7点阵/字符,写1是5*10点阵/字符

七、设定CGRAM地址指令

功能:

设定下一个要存入数据的CGRAM的地址

设置说明:

DB5、DB4、DB3为字符号,也就是你将来要显示该字符时要用到的字符地址。(000-111)能定义8个字符

DB2、DB1、DB0为行号。(000-111)8行

八、设定DDRAM地址指令

功能:

设定下一个要存入数据的DDRAM的地址

九、读取忙信号或AC地址指令

功能:

1、读取忙碌信号FB的内容,FB=1表示液晶显示器忙,暂时无法接收单片机送来 的数据或指令;FB=0,液晶显示器可以接收单片机送来的数据或指令。

2、读取地址计数器AC的内容

十、数据写入DDRAM或CGRAM指令一览

功能:

1、将字符码写入DDRAM,已使液晶显示屏显示出相应的字符

2、将使用者自己设计的图像存入CGRAM。

功能2设置说明:

DB7、DB6、DB5、可以为如何数据,一般设置为"000"

DB4、DB3、DB2、DB1、DB0、对应于每行5点的字模数据

十一、从CGRAM或DDRAM读出数据的指令一览

功能:

1、读取DDRAM或CGRAM中的内容


LCD1602显示屏使用步骤

要使用LCD1602,第一步就是对LCD1602初始化,就是写入一些特定的指令实现。第二步:选择在LCD1602的那个位置可以显示并将要显示的数据发送到LCD的DDRAM。

1、初始化

2、写命令(RS=L),设置显示坐标

3、写数据(RS=H)

写入数据时序图:

基本操作时序:

读状态 输入:RS=L、RW=H、E=H 输出:DB0-DB7=状态字

写指令 输入:RS=L、RW=L、E=下降沿脉冲 DB0-DB7=指令码 输出:无

读数据 输入:RS=H、RW=H、E=H 输出:DB0-DB7=数据

写数据 输入:RS=H、RW=L、E=下降沿脉冲 DB0-DB7=数据 输出:无


LCD1602显示屏硬件电路原理图分析

该LCD1602电路图中LCD1602一共有16个引脚;

1脚为LCD1602的GCD电源地引脚连接开发板电源地

2脚为LCD1602的VCC引脚连接开发板的5V电源

3脚为LCD1602的VO液晶显示偏压调整脚通过通过电位器连接5V电源;

4脚为LCD1602的RS数据/命令选择脚连接单片机的P26输入输出管脚进行控制

5脚为LCD1602的RW读写信号选择脚连接单片机的P25输入输出管脚进行控制

6脚为LCD1602的E使能脚连接单片机的P27输入输出管脚进行控制

DB0-DB7脚为LCD1602数据指令传输脚连接单片机P00-P07输入输出管脚脚进行数据的传输

15脚为LCD1602的背光源正极脚连接5V电源

16脚为LCD1602的背光源负极脚连接开发板电源地


LCD1602显示屏模块软件编程设计

实现在LCD1602显示屏上显示字符串信息,完成显示功能;

步骤为:

第一步:首先实现写入一字节指令函数用来驱动LCD1602显示屏

代码示例:

cpp 复制代码
void LCD1602_write_cmd(u8 cmd)//LCD1602写入1字节命令函数
{
	LCD1602_RS=0;			//选择写入命令	
	LCD1602_RW=0;			//低电平写入
	LCD1602_E=0;			//使能端口低电平
	LCD1602_data=cmd;		//准备开始传输命令
	Delay_ms(1);				//延时1微秒
	LCD1602_E=1;		    //数据传输完成
	Delay_ms(1);				//延时1微秒,下降沿脉冲脉冲写入完成
	LCD1602_E=0;			//使能端口低电平
}

第二步:实现写入一字节数据函数用来驱动LCD1602显示屏显示的数据

代码示例:

cpp 复制代码
void LCD1602_write_data(u8 dat)//LCD1602写入1字节数据函数
{
	LCD1602_RS=1;			//选择写入数据	
	LCD1602_RW=0;			//低电平写入
	LCD1602_E=0;			//使能端口低电平
	LCD1602_data=dat;		//准备开始传输命令
	Delay_ms(1);				//延时1微秒
	LCD1602_E=1;		    //数据传输
	Delay_ms(1);				//延时1微秒,下降沿脉冲
	LCD1602_E=0;			//使能端口高电平
}

第三步:配置LCD1602显示屏完成初始化函数,指令有:1、功能设定,2、显示开关控制,3、进入模式设置,4、清屏设置

代码示例:

cpp 复制代码
void LCD1602_init(void)	//LCD1602初始化函数配置
{
	LCD1602_write_cmd(0x38);	//LCD1602功能设置指令
	LCD1602_write_cmd(0x0C);	//LCD1602显示开关控制指令
	LCD1602_write_cmd(0x06);	//LCD1602模式设置指令
	LCD1602_write_cmd(0x01);	//LCD1602清屏指令
}

第四步:最重要部分完成LCD1602显示屏显示字符串函数,形参介绍:形参x(0、1)行,y(0-15)列,str显示字符串数据

代码示例:

cpp 复制代码
void LCD1602_Display_string(u8 x,u8 y,u8 *str)//LCD1603字符串显示字符函数:形参x(0、1)行,y(0-15)列,str字符串
{
	u8 i=0;
	if(y>1 || x>15)	//显示坐标位置输入错误,退出函数
	{
		return;
	}
	if(y == 0)	//从第一行开始显示
	{
		while(*str != '\0')
		{
			if(i<16-x)	//字符串在第一行显示
			{
				LCD1602_write_cmd(0x80+x+i);
			}
			else   		//字符串撑爆了第一行,开始在第二行显示
			{
				 LCD1602_write_cmd(0x80+0x40+x+i-16);
			}
			LCD1602_write_data(*str);	//LCD1602每个坐标位置显示数据
			i++;
			str++;	
		}	
	}
	else if(y == 1)	//从第二行开始显示
	{
		 while(*str != '\0')
		{
			if(i<16-x)	//字符串在第二行显示
			{
				LCD1602_write_cmd(0x80+0x40+x+i);
			}
			else   		//字符串撑爆了第二行,开始在第一行显示
			{
				 LCD1602_write_cmd(0x80+x+i-16);
			}
			LCD1602_write_data(*str);	//LCD1602每个坐标位置显示数据
			i++;
			str++;	
		}	
	}
}

主函数:实现第一行显示LyfLoveWorld,第二行显示时间

代码示例:

cpp 复制代码
int main()
{
	LCD1602_init();
	LCD1602_Display_string(0,0,"LyfLOVEWorld");
	LCD1602_Display_string(0,1,"2025.10.02");
	while(1)
	{   
	
	}
}	 

效果展示:


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
straw_hat.6 小时前
PCB学习——STM32F103VET6-STM32接口部分
stm32·嵌入式硬件·学习
Hello_wshuo7 小时前
记一次手机付费充电设备研究
linux·单片机
点灯小铭7 小时前
基于51单片机的手机蓝牙控制8位LED灯亮灭设计
单片机·mongodb·智能手机·毕业设计·51单片机·课程设计
张人玉9 小时前
C# TCP 开发笔记(TcpListener/TcpClient)
stm32·单片机·嵌入式硬件
CHANG_THE_WORLD9 小时前
Windows程序字符串处理与逆向分析
windows·stm32·单片机
A9better10 小时前
嵌入式开发学习日志30——stm32之定时器中断简单项目练习
stm32·单片机·嵌入式硬件·学习
充哥单片机设计11 小时前
【STM32项目开源】基于STM32的智能电子秤
stm32·单片机·嵌入式硬件
学不动CV了13 小时前
C语言(FreeRTOS)中堆内存管理分析Heap_1、Heap_2、Heap_4、Heap_5详细分析与解析(二)
linux·c语言·arm开发·stm32·单片机·51单片机
XINVRY-FPGA17 小时前
XCVU9P-2FLGA2104E Xilinx AMD Virtex UltraScale+ FPGA
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga