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

本文是关于液晶显示屏的相关介绍。相对于静态数码管、动态数码管、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显示时间信息仿真结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[雷池WAF]长亭雷池WAF配置基于健康监测的负载均衡,实现故障自动切换上游服务器

为了进一步加强内网安全&#xff0c;在原有硬WAF的基础上&#xff0c;又在内网使用的社区版的雷池WAF&#xff0c;作为应用上层的软WAF。从而实现多WAF防护的架构。 经过进一步了解&#xff0c;发现雷池WAF的上游转发代理是基于Tengine的&#xff0c;所以萌生出了一个想法&…

SpringMVC-获取请求参数

1. 通过ServletAPI获取请求参数 /**** param request HttpServletRequest对象&#xff0c;直接作为形参传入方法&#xff0c;前端处理器就是一个Servlet* 所以前端处理器可以获得HttpServletRequest对象&#xff0c;并根据控制器方法的形参将对象传递给方法* re…

勒索事件急剧增长,亚信安全发布《勒索家族和勒索事件监控报告》

近期(12.15-12.21)态势快速感知 近期全球共发生了247起攻击和勒索事件&#xff0c;勒索事件数量急剧增长。 近期需要重点关注的除了仍然流行的勒索家族lockbit3以外&#xff0c;还有本周top1勒索组织toufan。toufan是一个新兴勒索组织&#xff0c;本周共发起了108起勒索攻击&a…

一文读懂$mash 通证的 “Fair Launch” 规则,将公平发挥极致

Solmash 是Solana生态中由社区主导的铭文资产LaunchPad平台&#xff0c;该平台旨在为Solana原生铭文项目&#xff0c;以及通过其合作伙伴SoBit跨链桥桥接到Solana的Bitcoin生态铭文项目提供更广泛的启动机会。有了Solmash&#xff0c;将会有更多的Solana生态的铭文项目、资产通…

【JUC的四大同步辅助类】

文章目录 一、CountDownLatch二、CyclicBarrier三、Semaphore四、Phaser 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CountDownLatch CountDownLatch如同火箭发射&#xff0c;计数只能不断减减&#xff0c;当到达0时即发射 场景示例&#xff1…

elect函数可以设置等待时间,

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;贝叶斯滤波与Kalman估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能&#xff0c…

ssm基于BS的仓库在线管理系统的设计与实现论文

摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#x…

OpenCV-Python(23):傅里叶变换

原理 傅里叶变换是一种数学变换&#xff0c;用于将一个函数&#xff08;在图像处理中通常是图像&#xff09;从时域&#xff08;空域&#xff09;转换到频域。它将函数表示为一系列正弦和余弦函数的和&#xff0c;用于分析信号的频率和相位信息。 傅里叶变换的原理是将一个连续…

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分&#xff1a;注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler&#xff0c;从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic&#xff0c;原名MagicDraw&#xff0c;俗称No Magic&#xff0c;被达索收购后融入3DExperience产品协同研发管理平台中&#xff0c;形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持&#xff0c;提供独有的MagicGrid方法论&…

5分钟了解接口测试

接口测试是指对系统接口进行测试的一种质量保障手段&#xff0c;主要是验证接口的功能、性能、安全性等方面是否符合预期。 在接口测试中&#xff0c;可以测试以下内容&#xff1a; 功能测试&#xff1a;验证接口的输入和输出是否符合预期&#xff0c;包括参数的正确性、返回结…

【无标题】idea的lombok插件支持@SuperBuilder注解啦

在我的博客阅读本文 1. 前言 今早进公司打开idea&#xff0c;弹出更新提示&#xff0c;简单看了下&#xff0c;原来是idea的lombok插件更新了&#xff0c;惊喜的发现update log上写着Add support for SuperBuilder。 为什么说是惊喜呢&#xff1f;因为之前也有用到这个的场景…

Go后端开发 -- Go Modules

Go后端开发 – Go Modules 文章目录 Go后端开发 -- Go Modules一、什么是Go Modules?二、GOPATH的工作模式1.GOPATH模式2.GOPATH模式的弊端 三、Go Modules模式创建项目1.go mod命令2.go mod环境变量3.使用Go Modules初始化项目4.修改模块的版本依赖关系 四、Go Modules下impo…

数据库:基础SQL知识+SQL实验2

&#xff08;1&#xff09;基础知识&#xff1a; 1.JOIN&#xff08;连接&#xff09;&#xff1a; 连接操作用于根据指定的条件将两个或多个表中的数据行合并在一起。JOIN 可以根据不同的条件和方式执行&#xff0c;包括等值连接、不等值连接等。 &#xff08;1&#xff09…

SAP BAPI 客户主数据创建:cmd_ei_api=>maintain_bapi

BAPI函数&#xff1a;cmd_ei_api>maintain_bapi 事物代码&#xff1a;XD01/XD02 客户主数据创建、修改、拓展功能开发 数据结构定义&#xff1a; 基本视图信息 公司代码信息结构&#xff1a; 销售视图信息结构: 客户主数据税分类信息结构&#xff1a; 代码参考 详细代码…

C++面向对象编程与泛型编程(GP)

C既支持面向对象编程&#xff0c;又支持泛型编程 1.面向对象编程 将数据结构与处理方法&#xff08;容器与算法&#xff09;组成对象封装在一个类中&#xff0c;通过类的封装隐藏内部细节&#xff0c;可以使用继承&#xff0c;多态等方法。 注意&#xff1a;list容器本身带有…

计算机毕业设计——SpringBoot 招投标 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…

CH341StreamI2C参数解释

总体思路&#xff1a; 第一步&#xff1a;使用EEPROM写入相应的数据 第二步&#xff1a;使用EEPROM读取相应的数据 第三步&#xff1a;使用CH341StreamI2C函数还原读取过程 每一步需要逻辑分析仪进行对比。 第一步&#xff1a;数据写入CH341WriteEEPROM 使用CH341WriteE…

性能测试之Mysql数据库调优

一、前言 性能调优前提&#xff1a;无监控不调优&#xff0c;对于mysql性能的监控前几天有文章提到过&#xff0c;有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个&#xff1a;CPU、内存、连接数、io读写时间…

【网络安全】【密码学】常见数据加(解)密算法及Python实现(一)

一、Base64编码 1、算法简介 Base64是一种常见的编&#xff08;解&#xff09;码方法&#xff0c;用于传输少量二进制数据。该编码方式较为简短&#xff0c;并不具有可读性&#xff0c;对敏感数据可以起到较好的保护作用。 2、Python实现&#xff08;调库&#xff09; &…