单片机小白学习之路(四十一)---LCD1602液晶理解

目标:理解LCD1602液晶工作原理


1.LCD1602简介

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

它是由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。

13367077-9261e6aba44b9025.png
1602
13367077-0e1404ce0cded604.png
引脚作用
  • VL是液晶显示偏压信号,当感觉屏幕过暗或过亮是可以调节此电压来调整亮度
  • RS是高电平是是数据选项,是低电平是命令选项
  • R/W 是高电平是读操作,是低电平是写操作
  • E是使能信号
  • D0 ~ D7是数据I/O口,单片机可以往传数据来让液晶显示不同的数据
  • BLA是背光源正极(A表示正),BLK是背光源负极(K表示负极),如果没背光数据是难以看清的

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

13367077-f491270eda441dce.PNG
DDRAM

DDRAM可以显示80个字节,分为2排,上面40个字节下面40个字节,但我们使用的液晶一排也就16个字节,后面不用了。

下面是对应的地址,但真正的地址是每个的加上0x80才是我们真实的地址,如00对应的地址是0x00+0x80 = 0x80


2.LCD1602常用指令
(1)清屏指令

13367077-2fa5ab69cbaa12ff.png
清屏指令

  • 输入命令是0x01
  • RS是低电平是输入的命令
  • R/W低电平表示写入
  • 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII码 20H;
  • 清完屏光标归位,即将光标撤回液晶显示屏的左上方
  • 将地址计数器(AC)的值设为 0,就是最走上角那个

(2)模式设置指令


13367077-c4729cacac6862ac.png
模式设置指令

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

I/D:0=写入新数据后光标左移 ; 1=写入新数据后光标右移;通常是1,但当光标到最右边时光标向左移就是像滚动效果
S:0=写入新数据后显示屏不移动 ; 1=写入新数据后显示屏整体右移 1 个字符;通常是0

(3)显示开关控制指令


13367077-aa7b16af3ab44063.png
显示开关控制

功能:
控制显示器开/关、光标显示/关闭以及光标是否闪烁。

D:0=显示功能关 ; 1=显示功能开
C:0=无光标 ; 1=有光标
B:0=光标闪烁 ; 1=光标不闪烁

(4)功能设定指令


13367077-16a8a6c64e84233b.png
功能设定指令

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

DL:0=数据总线为 4 位 ; 1=数据总线为 8 位;我们是8位;
N:0=显示 1 行 ; 1=显示 2 行
F:0=5×7 点阵/每字符 ; 1=5×10 点阵/每字符
X:表示随便取值


3.LCD1602操作步骤

(1)初始化(设置上面的光标那些)
(2)写命令(RS=L),设置显示坐标
(3)写数据(RS=H)


LCD1602写操作时序图:


13367077-778d757a76ea03a6.png
时序图

我们先来看一下读操作时序的RS引脚和R/W引脚,这两个引脚先进行变 化,因为是读操作,所以R/W引脚首先要置为高电平,而不管他原来是么。读指令还是读数据,都是读操作,而且都有可能,所以RS引脚既有可能是置为高电平,也有可能是置为低电平,大家注意图上的画法。而RS和R/W变化了经过 Tsp1这么长时间后,使能引脚E才能从低电平到高电平发生变化。
而使能引脚E拉高了经过了tD这么长时间后,LCD1602输出DB的数据就是有效数据了,我们就可以来读取DB的数据了。读完了之后,我们要先把使能E拉低,经过一段时间后RS、R/W和DB才可以变化继续为下一次读写做准备了。
而写操作时序和读操作时序的差别,就是写操作时序,DB的改变是我们单片机来完成的,因此要放到使能引脚E的变化之前进行操作,其他区别大家可以自行对比一下。

细心的同学会发现,这个时序图上还有很多时间标签。比如E的上升时间tR,下降时间时间tF,使能引脚E从一个上升沿到下一个上升沿之间的长度周期 tC,使能E下降沿后,R/W和RS变化时间间隔tHD1等等很多时间要求,这些要求怎么看呢?

13367077-816922087b3625df.png
时序参数

tC:指的是使能引脚E从本次上升沿到下次上升沿的最短时间是400ns,而我们单片机因为速度较慢,一个机器周期就是1us多,而一条C语言指令肯定是一个或者几个机器周期的,所以这个条件完全满足。
tPW:指的是使能引脚E高电平的持续时间最短是150ns,由于我们的单片机比较慢,这个条件也完全满足。
tR, tF:指的是使能引脚E的上升沿时间和下降沿时间,不能超过25ns,这个时间限值空间很大,我们用示波器测了一下我们开发板的这个引脚上升沿和下降沿时间大概是10ns到15ns之间,完全满足。
tSP1:指的是RS和R/W引脚使能后至少保持30ns,使能引脚E才可以变成高电平,这个条件完全满足。
tHD1:指的是使能引脚E变成低电平后,至少保持10ns之后,RS和R/W才能进行变化,这个条件完全满足。
tD:指的是我们的使能引脚E变成高电平后,最多100ns后,1602就把数据送出来了,那么我们就可以正常去读取状态或者数据了。
tHD2:指的是读操作过程中,使能引脚E变成低电平后,至少保持20ns,DB数据总线才可以进行变化,这个条件完全满足。
tSP2:指的是DB数据总线准备好后,至少保持40ns,使能引脚E才可以从低到高进行使能变化,这个条件完全满足。
tHD2:指的是写操作过程中,只能引脚E变成低电平后,至少保持10ns,DB数据总线才可以变化,这个条件完全满足。


看完之后,是不是感觉比你想象的要简单,没有你想的那么困难。大家自己也得慢慢学会看这种时序图和表格,在今后的学习中,这方面的能力尤为重要。如果以后换用了其它型号的单片机,那么就根据单片机的执行速度来评估你的程序是否满足时序要求,整体上来说器件都是有一个最快速度的限制,而没有最慢限制,所以当换用高速的单片机后通常都是靠在各步骤间插入软件延时来满足较慢的时序要求。


4.LCD1602液晶接口电路

13367077-0d6bc9a7fd1603de.png
电路模块

VO通过下面的滑动变阻器改变电压

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现52单片机超声波测距并用lcd1602显示,你需要进行以下步骤: 1. 连接硬件:将超声波测距模块与52单片机相连,并将LCD1602液晶显示屏连接到52单片机的IO口上。 2. 定义IO口:在程序中定义超声波模块和LCD1602显示屏所使用的IO口。 3. 初始化:对超声波模块和LCD1602显示屏进行初始化。 4. 测距:使用超声波模块进行距离测量,并将结果保存下来。 5. 显示:将测量结果显示在LCD1602显示屏上。 以下是一个简单的示例代码,供你参考: ``` #include<reg52.h> #define LCD_RS P0_0 #define LCD_RW P0_1 #define LCD_EN P0_2 #define LCD_DAT P0 sbit TRIG = P1^0; sbit ECHO = P1^1; void delayms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 123; j++); } void lcd_init() { LCD_RS = 0; LCD_RW = 0; LCD_DAT = 0x38; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); LCD_DAT = 0x0c; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); LCD_DAT = 0x01; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); LCD_DAT = 0x06; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); } void lcd_write_cmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_DAT = cmd; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); } void lcd_write_data(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_DAT = data; LCD_EN = 1; delayms(5); LCD_EN = 0; delayms(5); } void lcd_write_str(unsigned char *str) { unsigned char i = 0; while (str[i] != '\0') { lcd_write_data(str[i]); i++; } } void main() { unsigned int distance; unsigned char str[16]; lcd_init(); while (1) { TRIG = 1; delayms(10); TRIG = 0; while (!ECHO); TH0 = 0; TL0 = 0; while (ECHO); distance = ((unsigned int)TH0 << 8) | TL0; distance = distance / 58; lcd_write_cmd(0x80); sprintf(str, "Distance: %d cm", distance); lcd_write_str(str); delayms(1000); } } ``` 这段代码实现了超声波测距并用LCD1602显示距离的功能。其中,通过定义TRIG和ECHO两个IO口来控制超声波模块的工作,使用定时器来计算超声波的回波时间,从而得出距离。最后,将距离值转换成字符串,并通过lcd_write_str函数将其显示在LCD1602液晶显示屏上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值