首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >手把手教你根据时序图驱动LCD1602(全文干货!!建议收藏)

手把手教你根据时序图驱动LCD1602(全文干货!!建议收藏)

作者头像
紫昭
发布2025-11-29 08:22:14
发布2025-11-29 08:22:14
3970
举报

数据手册信息

先看目录,目录很重要,然后在一步一步去获取我们需要的信息

引脚说明

作用1:根据引脚说明来确定时序图中的引脚标识

作用2:根据管脚功能描述来更好的读懂时序图 例:管脚RS,后面我们要进行写指令函数的编写和写数据函数的编写,那么在函数的编写的时候,我们的RS分别应该为高电平还是低电平,我们就可以从这里获取答案

时序图说明

我们应该怎么去读懂时序图呢: 1.标识(图片中已经标注):可以根据标识来进行引脚的操作

2.结合引脚说明

例:从此处的RS可以看到,为什么时序图中会有两根交叉的线呢?我们来看看引脚说明吧,在引脚说明中我们可以看到他对于RS管脚的功能描述,当RS为H,DB7~DB0为显示数据,当RS为L,显示指令数据,那么此时来看RS标识的时序图,结合上面的信息我们可以知道当我们在进行写数据函数的编写的时候,就需要将RS拉高(即引脚置1),在进行写指令函数的编写的时候,就需要将RS拉低(即引脚置0)

3.在图片中我标识了一个x轴,一个开始,一个结束,我想表达的意思是:从x轴的开始,我们一帧一帧来根据当前的引脚状态来进行代码的编写,就像是一个录像带一样,从开始到最后(有一点抽象,但是大家肯定是能够理解到的吧)

根据时序图来进行代码编写

我们从数据手册中获取到了足够的信息后,就可以开始代码愉快的编写了!!!

这两个函数写完,基本上大半已经完成了,剩下的都是基于这两个函数来进行的,剩下的几个函数可以不看,能够理解,然后多多进行实践即可

写指令函数

代码语言:javascript
复制
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;//通过引脚说明,我们知道RS应该进行拉低
	LCD_RW=0;//RW引脚拉低表示写
	LCD_DataPort=Command;//这个就是PB7~PB0八个引脚了,刚好一个字节
	LCD_EN=1;//使能进行数据的写入
	Delay200us();//延时缓冲,硬件的写入需要一定的时间
	LCD_EN=0;//延时过后,使能位置零
	Delay200us();为什么还要进行延时呢?后面会有解答
}

写数据函数

代码语言:javascript
复制
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;//注意此处是和写指令函数不同的地方
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	Delay200us();
	LCD_EN=0;
	Delay200us();
}

设置光标函数

数据手册信息:

函数编写:

代码语言:javascript
复制
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
    //根据数据手册中的信息来得出
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

初始化函数

这个我在数据手册中倒是没有找到相关的文字描述,但是在最后的几页中,看到手册中留下了初始化函数编写的例程

这些指令在数据手册中的指令说明中都可以找到:

按照其格式编写即可,本质上就是调用写指令函数,来进行相关参数的初始化

代码语言:javascript
复制
void LCD_Init()
{
	LCD_WriteCommand(0x38);
	LCD_WriteCommand(0x0c);
	LCD_WriteCommand(0x06);
	LCD_WriteCommand(0x01);
}

两个问题

关于延时时间的问题

问题:在数据手册中我们可以看到,里面的时间单位大部分都是以ns来进行计数的,虽然我们的单片机做到这样精细的延时有些困难,但是按照道理来说,我们延迟个一微秒也就足够了啊,但是经过测试,这样是不行的,甚至在我以前见到的对于LCD1602驱动的函数,大部分都是以1ms来进行延时的,这是为什么呢?

答案(不一定正确,作者也是在进行网上查阅资料所得)经过测试,我使用的200us也是足够的

首先,虽然数据手册中的时序图时间单位是纳秒(ns),但在实际编程中,精确到纳秒级别的延时是比较困难的,并且对于 LCD1602 这类设备,它对时间的要求并不是绝对精确到纳秒。 这里使用 1ms(毫秒)的延时主要是基于经验和对设备的实际测试。1ms 的延时能够让 LCD1602 有足够的时间来稳定地接收和处理指令或数据。 如果换成微秒(μs)级别的延时可能不对,是因为不同的延时时间会影响到 LCD1602 内部电路的工作状态。LCD1602 内部有一些电容、电感等元件,信号在这些元件中传输和处理需要一定的时间来达到稳定状态。如果延时过短,可能会导致信号还没来得及被正确处理,下一个信号就来了,从而造成显示错误或者无法正常工作。 例如,当向 LCD1602 写入命令或数据时,设备需要时间来锁存数据、更新内部寄存器等操作。1ms 的延时能够确保这些操作在大多数情况下都能正确完成。

在写指令和写数据函数中在EN=0之后为什么还要进行延时

问题:在写指令函数和写数据函数中,明明都已经写完了,还要继续进行延时呢?

答案:在使能信号EN从高电平(EN = 1)变为低电平(EN = 0)后进行延时,是为了确保数据能够被 LCD1602 正确地读取和处理。 当EN为高电平时,数据被允许传输到 LCD1602 的内部寄存器。但是,在EN变为低电平后,LCD1602 内部电路还需要一些时间来完成数据的锁存和处理。 就好像你在向一个容器里倒水(EN = 1,数据传输),当你停止倒水(EN = 0)后,容器里的水(数据)还需要一点时间来平静下来并且被容器内部的机制(LCD1602 内部的数据处理机制)处理好。如果没有这个延时,可能会出现数据丢失或者显示错误的情况。 例如,在LCD_WriteCommand和LCD_WriteData函数中,EN为高电平使数据进入 LCD1602,然后EN变为低电平,接着的延时确保了 LCD1602 能够正确地处理刚刚传入的数据,为下一次操作做好准备。

以上就是此次做出的分享,不好的地方希望大家能够斧正

最后,诚望诸位不吝赐下一键三连,以资鼓励与襄助,使知识之光辉得以更盛,创作之热忱得以长燃,于技术探索之途携手共进,共铸不凡!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据手册信息
    • 引脚说明
    • 时序图说明
  • 根据时序图来进行代码编写
    • 写指令函数
    • 写数据函数
    • 设置光标函数
    • 初始化函数
  • 两个问题
    • 关于延时时间的问题
    • 在写指令和写数据函数中在EN=0之后为什么还要进行延时
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档