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显示屏
代码示例:
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显示屏显示的数据
代码示例:
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、清屏设置
代码示例:
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显示字符串数据
代码示例:
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,第二行显示时间
代码示例:
int main()
{LCD1602_init();LCD1602_Display_string(0,0,"LyfLOVEWorld");LCD1602_Display_string(0,1,"2025.10.02");while(1){ }
}
效果展示:
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!