其他分享
首页 > 其他分享> > 【常用传感器】LCD1602液晶工作原理详解及例程代码

【常用传感器】LCD1602液晶工作原理详解及例程代码

作者:互联网

本文带你详细的了解下LCD1602液晶的工作原理以及代码编写

LCD1602液晶显示屏

LCD ( Liquid Crystal Display 的简称)液晶显示器。能够同时显示16x2,32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。该显示屏的优点是耗电量低、体积小、辐射低。

LCD1602主要用来显示数字、字母、图形以及少量自定义字符。可以显示2行16个字符,拥有16个引脚,其中8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节V0和背光源AK。
在这里插入图片描述

注:
我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的 比如lcd1602 就是分辨率为16×2 lcd12864 就是分辨率为128×64

LCD1602主要参数

LCD发光原理

首先要知道:

液晶的物理特性是:液晶控制光线通过的程度是由加在液晶上的电压强弱来控制的。当通电时导通,排列变的有秩序,使光线容易通过,光的路径不改变;不通电时排列混乱,阻止光线通过,改变光的路径。

LCD屏幕的组成:

上偏光片,和下偏光片,使背光源的光只能通过下偏光片,不能通过下偏光片

彩色滤光片: 不同强度的光经过红绿蓝三色滤光片之后,会形成各种各样的颜色

液晶层: 通过通电方式来控制液晶的分子排列,从而改变背光源发出的光的路径,如果通电则不改变路径,光不能通过上偏光片,如果不通电则改变光的路径,光可以通过上偏光片,从而进行显示。

TFT基板:排列有序的薄膜晶体管,每一个薄膜晶体管都可以调整其电压,从而使单个晶体管范围内液晶进行不同的亮度和颜色显示,也就是我们说的像素点

背光源: 提供均匀的背景光源
在这里插入图片描述

也就是说:如果想要LCD屏幕不显示,那么只需要背光源的光不穿过上偏光片即可,如果需要LCD屏幕显示字符,需要背光源的光穿过上偏光片,而是否能穿过上偏光片,需要看液晶层的分子排列,而液晶层的分子排列,是由加在液晶上的电压强弱来控制的,

也就是最后我们只需要控制每个像素点的电压,就可以达到LCD屏幕显示的效果。这样就可以通过不同区域的电压控制使液体水晶重新排列来显示出各种图形图像以及字符。

LCD和OLED区别:

LCD ( Liquid Crystal Display 的简称)液晶显示器。
OLED(Organic Light-Emitting Diode, OLED)本质是LED发光二极管,当两端加上正向电压,半导体中的载流子发生复合引起光子发射而产生光,又称为有机电激光显示。

简单地说,LCD与LED是两种不同的显示技术,LCD是由液态晶体组成的显示屏,而LED则是由发光二极管组成的显示屏。本质区别二是LCD需要背光源才能亮,OLED是发光二极管自发光,不需要额外的光源.

LCD1602引脚接线:

在这里插入图片描述

各引脚的功能介绍如下:

在这里插入图片描述

LCD1602共16个管脚,但分类很好分类,
其中一个VCC和GND用于给1602供电,
一个VCC和GND用于给背光源供电,
剩下三个功能引脚:RS(数据命令选择端),R/W(读写选择端),E(使能信号),
还有8个D0~D7分别为8位双向数据线传输数据。

LCD1602的RAM地址映射及标准字库表

LCD1602,总共显示为16行2列,对应着32个RAM地址,在使用的时候,需要在哪个位置显示,就写入对应的RAM地址,然后再写入需要的字符,对应就会显示该字符。

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示LCD此时不忙,这时才能写指令和数据,否则此指令失效。要显示字符时要先输入显示字符地址(写指令),也就是告诉模块在,哪里显示字符,然后再写入需要显示的字符(写数据),才能够正常显示字符

下图是1602的内部显示地址
一共32个地址,对应2行16列
在这里插入图片描述
标准字库表(CGROM):
在这里插入图片描述

这个ROM中固化了一些我们常用的ASCII字符以及部分日文字符的点阵数据,需要写入那个字符,就直接设置对应进制码就可以,比如大写的字母A,代码是0100 0001(41H) 与ASCII码一致。也就是表中的ASCII码字符的地址和实际的ASCII码字符是一样的

LCD1602读写操作

LCD1602分为读操作写操作

其中读操作可以分为读状态读数据,写操作可以分为写指令写数据

读状态: 读取LCD引脚状态,返回为状态字,D0-D6为当前LCD数据指针的地址 D7为是否允许读写操作(即检查LCD是否处于忙状态)
在这里插入图片描述
读数据:读取D0-07内的数据

写指令: 写入LCD的控制指令,比如清屏,显示开关等

写数据: 写入需要显示的数据,比方说要显示字符a,就写入0100 0001(41H)

读状态
引脚电平:RS=L,RW=H,E=H输出:D0~D7=状态字
读数据
引脚电平:RS=H,RW=H,E=H输出:D0~D7的数据
写指令
引脚电平:RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:无
写数据
引脚电平:RS=H,RW=L,D0~D7=数据,E=高脉冲输出:无

以51单片机为例,D0-D7接到P0口 RW RW EN接到任意两个口

读写操作的时序图如下:

读操作时序:
在这里插入图片描述
写操作时序:
在这里插入图片描述我们来分析一下时序图,当我们要写指令的时候,RS置为低电平,RW置为低电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候指令就开始写入LCD,延时一段时间,将EN置低电平。

当我们要写数据的时候,RS置为低电平,RW置为高电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候数据就开始写入LCD,延时一段时间,将EN置低电平。

我们以51单片机为例,D0-D7接到P0口上,RW RW EN任意三个引脚,则写指令和写数据代码如下:

写指令:

/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ 
	LcdRs_P = 0;  //选择写指令
	LcdRw_P = 0; 	//选择写
	LcdEn_P = 0;  //E使能拉低
	P0=cmd;  //把指令送入P0
	DelayMs(2); //延时一小会儿,让1602准备接收数据
	LcdEn_P = 1;  //使能线电平变化上升沿,命令送入1602的8位数据口
	DelayMs(2);//延时,让数据发送
	LcdEn_P = 0;	//使能线拉低
}

写数据:


/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的数据
/*********************************************************/
void LcdWriteData(uchar dat)
{
	LcdRs_P = 1;  //选择写数据
	LcdRw_P = 0; //选择写
	LcdEn_P = 0; //E使能拉低
	P0=dat;   //把数据送入P0
	DelayMs(2); //延时一小会儿,让1602准备接收数据
	LcdEn_P = 1;  //使能线电平变化上升沿,命令送入1602的8位数据口    
	DelayMs(2);//延时,让数据发送
	LcdEn_P = 0;//使能线拉低
}

LCD1602的指令操作

LCD1602一共有11条指令,下面我们一一解读,

1602液晶模块的读写操作,屏幕和光标的操作都是通过指令来实现的。(1为高电平,0为低电平)
在这里插入图片描述

指令1:清显示,指令码01H,

在这里插入图片描述功能:

指令2:光标复位,光标返回到地址00H
在这里插入图片描述
功能:

指令3:光标和显示位置设置
在这里插入图片描述
功能:

指令4:显示开关控制
在这里插入图片描述功能:

指令5:光标或显示移位
在这里插入图片描述

指令6:功能设置命令

在这里插入图片描述

指令7:CGRAM地址设置
在这里插入图片描述
功能:

指令8:DDRAM地址设置
在这里插入图片描述

指令9:读忙信号和光标地址
在这里插入图片描述

指令10:写数据到CGRAM或DDRAM指令
在这里插入图片描述

LCD初始化

LCD初始化的过程,也就是对LCD进行写指令的过程,具体的指令如下:

/*********************************************************/
// 1602液晶功能初始化
/*********************************************************/
void LcdInit()
{
	LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
	LcdWriteCmd(0x0C);        // 开显示,不显示光标
	LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
	LcdWriteCmd(0x01);        // 清屏
}

LCD写地址

其实本质也就是指令8,只不过我们在写的时候,最高位D7是要求必须要为1 ,也就是实际是7位地址
在这里插入图片描述

比方说我们想要写入第二行第一列,那么地址是40H(0100 0000),是不是直接写就行了呢?,显然是不行的,因为最高位D7不是1.所以需要加上一个80H(1000 0000),也就是实际写入的为40H(0100 0000)+80H(1000 0000)=C0H(1100 0000)

那这样子的话,第一行起始地址就是(1000 0000)80H,第二行起始地址是(1100 0000)C0H

代码如下:

/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{
	// 第一行
	if(line==0)        
		LcdWriteCmd(0x80+column); 
	// 第二行
	if(line==1)        
		LcdWriteCmd(0x80+0x40+column); 
}


LCD写数据

这个就相对比较简单,直接用一个指针,判断字符是否结束,然后写入数据就可以

/*********************************************************/
// 液晶输出字符串函数
/*********************************************************/
void LcdPrintStr(uchar *str)
{
	while(*str!='\0')
			LcdWriteData(*str++);
}

代码及使用实例:

这里我们用Proteus仿真做演示

功能:LCD1602英文显示字符

代码如下:

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char	// 以后unsigned char就可以用uchar代替
#define uint  unsigned int	// 以后unsigned int 就可以用uint 代替

sbit LcdRs_P   = P1^1;			// 1602液晶的RS管脚       
sbit LcdRw_P   = P1^2;			// 1602液晶的RW管脚 
sbit LcdEn_P   = P1^3;			// 1602液晶的EN管脚



/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
		for(j=0;j<112;j++);
}


/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ 
	LcdRs_P = 0;
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=cmd;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;	
}


/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的数据
/*********************************************************/
void LcdWriteData(uchar dat)
{
	LcdRs_P = 1; 
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=dat;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;
}


/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{
	// 第一行
	if(line==0)        
		LcdWriteCmd(0x80+column); 
	// 第二行
	if(line==1)        
		LcdWriteCmd(0x80+0x40+column); 
}



/*********************************************************/
// 液晶输出字符串函数
/*********************************************************/
void LcdPrintStr(uchar *str)
{
	while(*str!='\0')
			LcdWriteData(*str++);
}


/*********************************************************/
// 1602液晶功能初始化
/*********************************************************/
void LcdInit()
{
	LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
	LcdWriteCmd(0x0C);        // 开显示,不显示光标
	LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
	LcdWriteCmd(0x01);        // 清屏
}

/*********************************************************/
// 开启LCD1602显示
/*********************************************************/
void LcdOn()   //开显示器,关光标与闪烁
{
	LcdWriteCmd(0x0c);
}
/*********************************************************/
//关闭LCD1602显示,但DDRAM中内容不丢失,重开后将恢复内容

/*********************************************************/
void LcdOff()  
{
	LcdWriteCmd(0x08);
}

/*********************************************************/
// 1602液晶显示内容初始化
/*********************************************************/
void LcdShowInit()
{
	LcdGotoXY(0,0);	    							// 定位到第0行第0列
	LcdPrintStr("   LCD Test  ");	// 第0行显示“            ”
	LcdGotoXY(1,0);	    							// 定位到第1行第0列
	LcdPrintStr("ABCDEFGHIJKLMNOP");	// 第1行显示“ ”
}


/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
	LcdInit();								// 液晶功能初始化	
	LcdShowInit();
	
	while(1)
	{
	}
}

测试效果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

标签:液晶,引脚,例程,低电平,LCD,详解,指令,LCD1602
来源: https://blog.csdn.net/as480133937/article/details/113148712