基于Proteus的LCD1602液晶显示学习

1.LCD1602简介

1602字符型液晶也叫1602液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。字符型液晶,能够同时显示16x02即32个字符。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。

实物图如下:
基于Proteus的LCD1602液晶显示学习_第1张图片

2.LCD1602工作原理

LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,1602原理图如下:
基于Proteus的LCD1602液晶显示学习_第2张图片
各引脚接口说明如下:
基于Proteus的LCD1602液晶显示学习_第3张图片
1引脚:VSS为地电源。
2引脚:VDD接5V正电源。
3引脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
4引脚: RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
5引脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
6引脚: E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
7—14引脚:D0~D7为8位双向数据线。
15引脚:背光源正极。
16引脚:背光源负极。

3.LCD1602指令说明

基于Proteus的LCD1602液晶显示学习_第4张图片
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置ID:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。指令8: DDRAM地址设置。
指令8: DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。.

4.LCD1602的时序

单片机时序是指单片机执行指令时应发出的控制信号的时间序列。这些控制信号在时间上的相互关系就是CPU的时序。它是一系列具有时间顺序的脉冲信号。

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明: 1为.高电平、0为低电平)。在这里时序=高低电平+时间
通过输入RS,RW高低电平,来控制读写数据和命令。
在这里插入图片描述

读操作时序
基于Proteus的LCD1602液晶显示学习_第5张图片
写操作时序基于Proteus的LCD1602液晶显示学习_第6张图片
时序参数表
基于Proteus的LCD1602液晶显示学习_第7张图片

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

LCD1602内部显示地址表

基于Proteus的LCD1602液晶显示学习_第8张图片
16进制的0x27表示1进制为39,又因为是从0x00开始的,所以第一行有40个字节,(一个字节显示一个字符),可显示40个字符。

字符代码与图形对应表
基于Proteus的LCD1602液晶显示学习_第9张图片

6.LCD1602基本操作

(1)初始化液晶屏

void Lcd_Init()		   //初始化函数
{
	LcdWrCmd(0x01); // 指令1 ——清屏指令
	LcdWrCmd(0x06); // 指令3 ——RAM地址设置指令,游标向右移动,AC自动加一
	LcdWrCmd(0x0c); // 指令4 ——开关控制,显示开,游标关,闪烁关
	LcdWrCmd(0x38); // 指令6——显示模式设置,8位数据总线,两行显示模式,5*7点阵+游标显示模式 
}

(2)指定显示的位置

void Lcd_Show(uchar x, uchar y)		 //定位函数
{
	uchar addr;			//x表示第几个显示,y表示第几行显示
	if(0==y)			  //y=0,表示在第一行,y=1,表示在第二行
		{
		addr = 0x00 + x;	 //第一行首地址为0x00
		}
	else
	
		addr = 0x40+x;		 //第二行首地址为0x40
		LcdWrCmd(addr|0x80);  //DRAM地址设置
		
}

(3)在指定位置显示

void main()		 //主函数					 
{	
	Lcd_Init();  //  初始化
	Lcd_Show(0,0);	//定位	 从1行的第1个位置开始显示
    while(*str1 !='\0')	   //判断是否显示完字符串
	{			
	LcdWrDat(*str1++) ;		//	 把字符串一个一个放到相应位置
	}

	Lcd_Show(0,1);	//定位	 从2行的第1个位置开始显示
    while(*str2!='\0')
	{			
	LcdWrDat(*str2++) ;	
	}
	while(1)
	{	  
		
	  }
	
}

7 Proteus实验效果图

基于Proteus的LCD1602液晶显示学习_第10张图片

8.C51代码

#include  //定义头文件

#define uchar unsigned char		//宏定义
#define uint unsigned int

#define LcdDB P0// 数据端口

uchar  code table1[] = "0123456789012345";	  //定义数组
uchar  code table2[] = "abcdefghABCDEFGH";

uchar *str1 = table1;	//定义指针,把数组的首地址赋给它
uchar *str2 = table2;	  //数组名表示数组首元素的地址

 void LcdBusy();
 void LcdWrCmd(uchar Cmd);
 void LcdWrDat(uchar Dat);
 void Lcd_Init();
 void Lcd_Show(uchar x, uchar y);  //函数声明

sbit LcdRS = P2^2;   
sbit LcdRW = P2^1; 
sbit LcdE = P2^0;	 // 定义引脚


void LcdBusy()		  //判忙函数
{

	uchar temp;

	LcdDB = 0xff;  // 复位
	LcdRS = 0;  // 0 指令
	LcdRW = 1;	 // 1 读

	do{
	
		LcdE = 1;		  // 拉高
		temp = LcdDB;  // 将 LCD 状态保存在 temp 中,用于判忙
		LcdE = 0;		  // 负跳变使能 
		
	}while(temp & 0x80);  // 结果为 1表示忙,继续循环;结果为 0表示闲,可以进行后面的操作
}


void LcdWrCmd(uchar Cmd)		//写命令函数
{

	LcdBusy();  // 判忙
	LcdRS = 0;     //0表示命令,1表示数据
	LcdRW = 0;  // 0表示写,1表示读
	LcdDB = Cmd;  // 送指令
	LcdE = 1;
	LcdE = 0;	  //使能拉低
}


void LcdWrDat(uchar Dat)	//写数据函数
{
	LcdBusy();  // 判忙
	LcdRS = 1;  // 1 数据
	LcdRW = 0;  // 0 写
	LcdDB = Dat;  // 送数据	
	LcdE = 1;
	LcdE = 0;	  	//使能拉低
}


void Lcd_Init()		   //初始化函数
{
	LcdWrCmd(0x01); // 指令1 ——清屏指令
	LcdWrCmd(0x06); // 指令3 ——RAM地址设置指令,游标向右移动,AC自动加一
	LcdWrCmd(0x0c); // 指令4 ——开关控制,显示开,游标关,闪烁关
	LcdWrCmd(0x38); // 指令6——显示模式设置,8位数据总线,两行显示模式,5*7点阵+游标显示模式 
}



void Lcd_Show(uchar x, uchar y)		 //定位函数
{
	uchar addr;			//x表示第几个显示,y表示第几行显示
	if(0==y)			  //y=0,表示在第一行,y=1,表示在第二行
		{
		addr = 0x00 + x;	 //第一行首地址为0x00
		}
	else
	
		addr = 0x40+x;		 //第二行首地址为0x40
		LcdWrCmd(addr|0x80);  //DRAM地址设置
		
}


void main()		 //主函数					 
{	
	Lcd_Init();  //  初始化
	Lcd_Show(0,0);	//定位	 从1行的第1个位置开始显示
    while(*str1 !='\0')	   //判断是否显示完字符串
	{			
	LcdWrDat(*str1++) ;		//	 把字符串一个一个放到相应位置
	}

	Lcd_Show(0,1);	//定位	 从2行的第1个位置开始显示
    while(*str2!='\0')
	{			
	LcdWrDat(*str2++) ;	
	}
	while(1)
	{	  
		
	  }
	
}

你可能感兴趣的:(单片机)