【51单片机系列】LCD1602液晶模块

news2025/4/26 20:38:55

本文是关于液晶显示屏的相关介绍。相对于静态数码管、动态数码管、LED点阵等,LCD1602液晶显示器能够显示更多的字符数字信息,并且也是常用的一种显示装置。

文章目录

  • 一、LCD1602介绍
    • 1.1、LCD1602简介
    • 1.2、LCD1602常用指令
    • 1.3、LCD1602使用
  • 二、LCD1602使用示例
  • 三、LCD扩展实验:使用LCD1602显示时钟

一、LCD1602介绍

1.1、LCD1602简介

1602液晶,也叫做1602字符型液晶,可以显示2行字符信息,每行可以显示16个字符,是一种专门用来显示字母、数字、符号的点阵型液晶模块。

LCD1602由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距地间隔,每行之间也有间隔,起到了字符间距和行间距的作用。

LCD1602实物如下:

LCD1602实物图

从实物图中可以看到16个管脚孔,从左至右管脚编号顺序是1-16,管脚功能定义如下表:

管脚编号符号管脚说明
1VSS电源地
2VDD电源正极
3VL液晶显示偏压信号
4RS数据/命令选择端 H/L
5R/W读/写选择端 H/L
6E使能信号
7~14D0~D7Data I/O
15BLA背光源正极
16BLK背光源负极

管脚详细说明:

  • 3脚-VL:液晶显示偏压信号,该管脚用来调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号。需要注意的是,该管脚电压为0时可以得到最强的对比度。
  • 4脚-RS:数据/命令选择端,当该管脚为高电平时,可以对1602进行数据字节的传输操作;该管脚为低电平时,对1602进行命令字节的传输操作。所谓命令字节,就是对LCD1602的一些工作方式设置的字节;数据字节,用来在1602上显示的字节。LCD1602的数据是8位的
  • 5脚-R/W:读写选择端。当该管脚为高电平时可对LCD1602进行读数据操作,该管脚为低电平时对LCD1602进行写数据操作。
  • 6脚-E:使能信号,实际上是LCD1602的数据控制时钟信号,使用该管脚的上升沿实现对LCD1602的数据传输。
  • 7~14脚-8位并行数据口:51单片机一组IO也是8位,方便了对LCD1602的数据读写。

LCD1602内部含有80字节的DDRAM,是用来存储显示字符的。其地址和屏幕的对应关系如下:

显示位置123456740
DDRAM地址第一行00H01H02H03H04H05H06H27H
DDRAM地址第二行40H41H42H43H44H45H46H67H

LCD602地址和屏幕对应关系

从上图可以看到,并不是所有的地址都能直接用来显示字符。只有第一行中的00-0F,第二行中的40-4F才能显示,其它地址只能用于存储

要显示字符时首先要输入显示字符地址,即明确在哪里显示字符。比如第二行第一个字符地址是40H,不能够直接写入40H,因为写入显示地址时要求最高位D7为1,所以第二行第一个字符地址应该是40H|80H=C0H。

1.2、LCD1602常用指令

LCD1602有一些常用指令,这些指令对于初始化是必须的。

LCD1602常用指令

1.3、LCD1602使用

要使用LCD1602,首先需要对其初始化,即通过写入一些特定的指令实现;然后选择要在LCD1602的哪个位置显示并将所要显示的数据发送到LCD的DDRAM。

使用LCD1602通常用于写数据进去,比较少使用读功能。

LCD1602操作步骤如下:

① 初始化

② 写命令,RS=L,设置显示坐标;

③ 写数据,RS=H;

这里不需要读数据,所以只需要两个写时序。

  • 第一个是写指令字时序。设置LCD1602的工作方式时,需要把RS置为低电平,RW置为低电平,然后将指令字送到数据口D0~D7,最后E使能引脚一个高脉冲将数据写入。
  • 第二个是写数据字时序。LCD1602实现显示时,需要把RS置为高电平,RW置为低电平,然后将数据字送到数据口D0~D7,最后E使能引脚一个高脉冲将数据写入。

从上面两个时序可以看出,写指令和写数据只是RS电平不一样。

LCD1602时序图如下:

LCD1602时序图

LCD1602时序图时间

从上图中可以看到时序图中的时间参数全部是ns级别的,51单片机的机器周期是1us,指令周期是2~4个机器周期,所以在程序中可以不加延时程序,也能适配LCD1602的时序要求。

当要写命令字时,时间由左往右,RS变为低电平,R/W变为低电平,RS的状态先变化完成;然后DB0~DB7上数据进入有效阶段,接着E引脚有一个正脉冲的跳变,接着维持时间最小值为tpw=400ns的E脉冲宽度;然后引脚E负跳变,RS电平变化,R/W电平变化。这便是一个完整的LCD1602写命令的时序。

二、LCD1602使用示例

本示例实现的功能:系统运行时,在LCD1602液晶上显示字符信息。使用到的资源是LCD1602液晶显示屏。

proteus中设计原理图如下:

PROTEUS设计LCD1602液晶显示模块

从上面的原理图可以看出该电路不是独立的,LCD1602的8位数据口DB0-DB7与单片机的P0.0-P0.7管脚链接;LCD1602的RS、RW、E脚与单片机的P2.6、P2.5、P2.7管脚链接;RV1是一个电位器,用来调节LCD1602显示亮度。

软件设计:

LCD发送命令和数据代码如下:

#include <reg52.h>
#include "lcd1602.h"

// 延时函数,延时ims,12MHz晶振下,12分频单片机的延时
void lcd1602_Delay1ms(uint i)
{
	uchar a,b;
	for(;i>0;i--)
	{
		for(b=199;b>0;b--)
		{
			for(a=1;a>0;a--);
		}
	}
}

#ifndef LCD1602_4PINS  // 8位数据线
// 向LCD写入一个字节的命令
void lcd1602_WriteCom(uchar com)
{
	LCD_EN=0;  // 使能
	LCD_RS=0;  // 发送命令
	LCD_RW=0;  // 选择写命令
	
	LCD_DATA=com;  // 放入数据
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;  
}

// 向LCD写入一个字节的数据
void lcd1602_WriteData(uchar dat)
{
	LCD_EN=0;  // 使能
	LCD_RS=1;  // 发送数据
	LCD_RW=0;  // 选择写命令
	
	LCD_DATA=dat;  // 放入数据
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;   
}

// LCD1602初始化
void lcd1602_Init()
{
	lcd1602_WriteCom(LCD_MODE_8_2_5X7);  // 8位数据,显示2行,5x7点阵/每字符 38H
	lcd1602_WriteCom(LCD_CURSOR_RIGHT);  // 写入数据后光标右移 06H
	lcd1602_WriteCom(LCD_CLEAR);  // 清屏 01H
	lcd1602_WriteCom(LCD_OPENSHOW);  // 显示开 0CH
	lcd1602_WriteCom(LCD_START_ADDR1);  // 设置数据指针地址起始点是第一行第一列,80H=00H|80H
}

#else  // 4位数据线
// 向LCD写入一个字节的命令
void lcd1602_WriteCom(uchar com)
{
	LCD_EN=0;  // 使能
	LCD_RS=0;  // 发送命令
	LCD_RW=0;  // 选择写命令
	
	LCD_DATA=com;  // 放入数据,4位数据,接线到P0的高四位,传送高四位不用改
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;  
	
	LCD_DATA=com<<4;
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;  
}

// 向LCD写入一个字节的数据
void lcd1602_WriteData(uchar dat)
{
	LCD_EN=0;  // 使能
	LCD_RS=1;  // 发送数据
	LCD_RW=0;  // 选择写命令
	
	LCD_DATA=dat;  // 放入数据,4位数据,接线到P0的高四位,传送高四位不用改
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;  
	
	LCD_DATA=dat<<4;
	lcd1602_Delay1ms(1);  // 等待数据稳定
	
	LCD_EN=1;  // 写入时序
	lcd1602_Delay1ms(5);  // 保持稳定
	LCD_EN=0;  
}

// LCD1602初始化
void lcd1602_Init()
{
	lcd1602_WriteCom(0x32);  // 将8位总线转为4位总线
	lcd1602_WriteCom(LCD_MODE_8_2_5X7);  // 8位数据,显示2行,5x7点阵/每字符28H
	lcd1602_WriteCom(LCD_CURSOR_RIGHT);  // 写入数据后光标右移 06H
	lcd1602_WriteCom(LCD_CLEAR);  // 清屏 01H
	lcd1602_WriteCom(LCD_OPENSHOW);  // 显示开 0cH
	lcd1602_WriteCom(LCD_START_ADDR1);  // 设置数据指针地址起始点是第一行第一列,80H=00H|80H
}
#endif

主函数调用:

/*
	实现功能:系统运行后,LCD1602液晶显示屏显示字符
	[2024-01-03] zoya
*/

#include <reg52.h>
#include "lcd1602.h"

typedef unsigned char u8;
typedef unsigned int u16;

u8 Disp[]="Pechin Science:";

void delay(u16 i)
{
	while(i--);
}
void main()
{
	u8 i;
	lcd1602_Init();  // LCD初始化
	for(i=0;i<16;i++)
	{
		lcd1602_WriteData(Disp[i]);
		delay(5000);
	}
	while(1);
}

proteus仿真结果:

LCD1602液晶显示屏仿真结果

三、LCD扩展实验:使用LCD1602显示时钟

LCD扩展实验实现的功能:系统运行时,LCD1602显示时间,显示格式:第一行显示年-月-日 星期“xxxx-xx-xx xth”,第二行显示时:分:秒"xx:xx:xx"。使用EEPROM记录是否已经初始化(读取EEPROM中0x00地址的数据,如果数据为0xff表示未进行初始化,如果为0x01表示已经进行初始化)。用到的资源有DS1302时钟芯片、AT24C02 EEPROM芯片、LCD1602液晶显示器。

proteus原理图设计如下:

proteus原理图设计使用LCD1602显示时间信息

设计思路,首先读取eeprom中0x00地址的数据,根据数据判断DS1302是否进行初始化,然后初始化LCD1602,在循环中读取时间并将其显示到LCD中。主程序编写如下:

void main()
{
	u8 i;
	u8 dat;
	dat=AT24C02Read(EN_INIT_ADDR);
	if(0xff==dat)
	{
		DS1302Init();
		AT24C02Write(EN_INIT_ADDR, 0x01);
	}
	
	lcd1602_Init();
	
	while(1)
	{
		DataPros();
		lcd1602_WriteCom(LCD_START_ADDR1);  // 年月日星期显示在第一行
		for(i=0;i<14;i++)
		{
			lcd1602_WriteData(Disp1Row[i]);
		}
	
		lcd1602_WriteCom(LCD_START_ADDR2);  // 时分秒显示在第二行
		for(i=0;i<8;i++)
		{
			lcd1602_WriteData(Disp2Row[i]);
		}
		delay(500);
	}
}

数据处理函数:

uchar szTime[]="0123456789 -th:";
uchar Disp2Row[16];
uchar Disp1Row[16];
void DataPros()
{
	DS1302ReadTime();
	Disp1Row[0]=szTime[2];  // 2
	Disp1Row[1]=szTime[0];  // 0
	Disp1Row[2]=szTime[TIME[6]>>4];  // 年的十位
	Disp1Row[3]=szTime[TIME[6]&0x0f];  // 年的个位
	Disp1Row[4]=szTime[11];  // -
	Disp1Row[5]=szTime[TIME[4]>>4&0x01];  // 月的十位
	Disp1Row[6]=szTime[TIME[4]&0x0f];  // 月的个位
	Disp1Row[7]=szTime[11];  // -
	Disp1Row[8]=szTime[TIME[3]>>4&0x03];  // 日的十位
	Disp1Row[9]=szTime[TIME[3]&0x0f];  // 日的个位
	Disp1Row[10]=szTime[10];  // 空格
	Disp1Row[11]=szTime[(TIME[5]&0x0f) - 1];  // 星期几
	Disp1Row[12]=szTime[12];  // t
	Disp1Row[13]=szTime[13];  // h
	
	
	Disp2Row[0]=szTime[TIME[2]/16];  // 时的十位
	Disp2Row[1]=szTime[TIME[2]&0x0f];  // 时的个位
	Disp2Row[2]=szTime[14];  // : 冒号
	Disp2Row[3]=szTime[TIME[1]/16];  // 分的十位
	Disp2Row[4]=szTime[TIME[1]&0x0f];  // 分的个位
	Disp2Row[5]=szTime[14];  // : 冒号
	Disp2Row[6]=szTime[TIME[0]>>4&0x07];  // 秒的十位
	Disp2Row[7]=szTime[TIME[0]&0x0f];  // 秒的个位
}

仿真结果:

LCD1602显示时间信息仿真结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1357292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据StarRocks(三) StarRocks数据表设计

1. 列式存储 1.1 列式存储方式有以下几个优点&#xff1a; 1.快速的数据查询 由于数据是按照列进行存储的&#xff0c;所以查询某个列时只需要读取该列所在的块&#xff0c;而不是整行数据&#xff0c;从而大大提高了查询效率。 2.压缩效率高 由于列式存储的数据块中只有一…

数据库之存储引擎

1. 存储引擎的概念 存储引擎是MYSQL数据库的组件&#xff0c;负责执行时间的数据I/O操作&#xff08;数据的存储和提取&#xff09;&#xff0c;工作在文件系统之上&#xff0c;数据库的数据会先传到存储引擎&#xff0c;再按照存储引擎的存储格式保存到文件系统。 &#xff…

【AMD Xilinx】ZUBoard(5):移植KSZ9131千兆phy驱动

【AMD Xilinx】ZUBoard&#xff08;5&#xff09;&#xff1a;移植KSZ9131千兆phy驱动 一、需求二、软件搭建1. 在bsp中添加lwip库2. 创建lwip的例子 三、 Phy驱动调试1. 问题查找2. 修改驱动1&#xff09; 查找芯片手册2&#xff09;增加宏PHY_MICROCHIP_IDENTIFIER3&#xff…

Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:java.net.ConnectException: 拒绝连接;

一、问题描述 搭建完Hadoop集群后&#xff0c;在Hadoop集群环境下运行HDFS实践编程使用Eclipse开发调试HDFS Java程序&#xff08;文末有源码&#xff09;&#xff1a; 假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件&#xff0c;分别是file1.txt、file2.tx…

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范&#xff08;即接口函数&#xff09;&#xff0c;交易…

使用Go语言实现RESTful API

RESTful架构是一种设计风格&#xff0c;用于构建网络应用程序的API。它基于HTTP协议&#xff0c;并使用不同的HTTP方法&#xff08;如GET、POST、PUT、DELETE等&#xff09;来处理不同的操作。在Go语言中&#xff0c;我们可以使用标准库中的net/http包来实现RESTful API。 下面…

不同阶数的巴特沃斯低通滤波器的空间域表示——数字图像处理

原理 巴特沃斯低通滤波器&#xff08;Butterworth Low-Pass Filter&#xff09;在频率域中的定义是明确的&#xff0c;但它在空间域中的表示不是直观的。这是因为巴特沃斯滤波器的形式是基于频率的&#xff0c;并且其空间域表示涉及到一个复杂的逆傅里叶变换&#xff0c;该变换…

Hive10_窗口函数

窗口函数&#xff08;开窗函数&#xff09; 1 相关函数说明 普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值&#xff0c;而开窗函数则可为窗口中的每行都返回一个值。简单理解&#xff0c;就是对查询的结果多出一列…

【Android】如何设置应用程序启动Activity(应用启动时显示的界面)

前言 在Android中&#xff0c;AndroidManifest.xml文件可以通过修改来设置应用启动时显示的界面&#xff0c;即启动Activity。 操作步骤 打开AndroidManifest.xml文件。 在文件中找到想要设置为启动Activity的<activity>元素。该元素通常在<application>元素内部…

【Linux Shell】3. 传递参数

文章目录 【 1. $n 调用单个参数 】【 2. \$*、\$ 引用全部参数 】【 3. 其他符号 】 【 1. $n 调用单个参数 】 在执行 Shell 脚本时&#xff0c;可以向脚本传递参数&#xff0c; 脚本内获取参数的格式为 $n&#xff0c;n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&…

[Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目

前面讲解了通过命令行方式来部署k8s项目,下面来讲讲通过腾讯云TKE来快速创建Pod、Deployment、Service部署k8s项目,云平台搭建Kubernetes可参考[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群 一.通过腾讯云TKE创建集群 1.创建集群 参考上…

vue项目中的录屏插件recordrtc且带声音

vue项目中的录屏插件recordrtc且带声音 一、效果图二、安装插件三、直接上代码 一、效果图 其中窗口录屏不带声音&#xff0c;chrome标签和整个屏幕的录屏是带声音的 二、安装插件 npm i recordrtc 三、直接上代码 <template><div class"record-page">…

修改 docker /dev/shm 的大小

修改 docker /dev/shm 的大小 1&#xff0c;获取完整id&#xff1a; docker inspect 245| grep Id rootlynxi:~# docker inspect 245| grep Id"Id": "245ab167ed9a79873b31b3a38df2053870fe72f267c3c1a660df25c63e37e88b",2&#xff0c;修改 ShmSize&…

真机调试HarmonyOS应用报错

问题表现&#xff1a; 01/04 19:00:01: Launching com.example.simplevideo $ hdc shell am force-stop com.example.simplevideo $ hdc shell bm uninstall com.example.simplevideo $ hdc file send E:\harmony\SimpleVideo\entry\build\default\outputs\default\entry-defau…

Nginx 负载均衡集群 节点健康检查

前言 正常情况下&#xff0c;nginx 做反向代理负载均衡的话&#xff0c;如果后端节点服务器宕掉的话&#xff0c;nginx 默认是不能把这台服务器踢出 upstream 负载集群的&#xff0c;所以还会有请求转发到后端的这台服务器上面&#xff0c;这样势必造成网站访问故障 注&#x…

CISSP 第9章:安全脆弱性、威胁和对策

第九章 安全脆弱性、威胁和对策 9.1 评估和缓解安全脆弱性 9.1 硬件 处理器 执行类型 多任务处理&#xff1a; 同时处理两个或更多任务 多处理&#xff1a; 利用多个处理器完成一个应用程序的处理能力 多程序设计&#xff1a;通过操作系统对单个处理器上的两个任务进行协调&…

Vue开发中使用Element UI过程中遇到的问题及解决方案Missing required prop: “value”

一、vue中使用el-table的typeindex有时不显示序号 Table 表格 用于展示多条结构类似的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 当el-table元素中注入data对象数组后&#xff0c;在el-table-column中用prop属性来对应对象中的键名即可填入数据&…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

“华为杯”杭州电子科技大学2023新生编程大赛---树

题目链接 Problem Description 给定一棵包含 n 个节点的带边权的树&#xff0c;树是一个无环的无向联通图。定义 xordist(u,v) 为节点 u 到 v 的简单路径上所有边权值的异或和。 有 q 次询问&#xff0c;每次给出 l r x&#xff0c;求 ∑rilxordist(i,x) 的值。 Input 测试…

IO进程线程Day4

1> 创建出三个进程完成两个文件之间拷贝工作&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程回收子进程的资源 #include <myhead.h> //使用三个进程完成两个文件的拷贝工作 //两个子进程分别拷贝文件的上下两部分 //父进程回…