1602液晶

接口原理图

在这里插入图片描述

接口介绍

在这里插入图片描述4引脚:数据命令选择端。当引脚为高电平时为数据,引脚为低电平时为命令
5引脚:功能读写选择短。H读,L写,读写之前需要判断液晶状态
6引脚:使能引脚。关系到液晶的读写命令和数据
状态字节有八个位,最高位为1表示液晶忙,为0表示液晶不忙。

在液晶上显示字符

过程
[1]读取液晶显示的状态 (不忙才可进行读写操作,忙需要继续等待)
[2]确定写入的位置 通过写指令的方式
[3]写入字符 即写指令

液晶读写时序介绍

显示2行,每行16个字符
第一行ram地址从0x00到0x27
第二行从0x40到0x67
多出来的字符为为移动字幕设置

【1】读状态
RS=L,R/W=H,E=H。(判断忙完毕后释放总线)

#define LCD1602_DB P0
sbit LCD1602_RS=P1^0;
sbit LCD1602_RW=P1^1;
sbit LCD1602_E=P1^5;
void LcdWaitReady()
{
	unsigned char sta;
	LCD1602_DB=0XFF;
	LCD1602_RS=0;//命令
	LCD1602_RW=1;//读
	do{
		LCD1602_E=1;
		sta=LCD1602_DB;//读状态
		LCD1602_E=0;//撤销使能,防止液晶输出数据干扰P0总线
	}while(sta&0x80);//头一位如果是一,表明在忙,禁止读写
}

【2】读数据
RS=H,R/W=H,E=H。
高脉冲即为E使能引脚先从低来高,再从高拉低,形成一个高脉冲。
【3】写指令
RS=L,R/W=L,D0~D7=指令码,E=高脉冲

void LcdWriteCmd(unsigned char cmd)
{
	LcdWaitReady();
	LCD1602_RS=0;//命令
	LCD1602_RW=0;//写
	LCD1602_DB=cmd;
	LCD1602_E=1;
	LCD1602_E=0;
}

【4】写数据
RS=H,R/W=L,D0~D7=数据,E=高脉冲

void LcdWriteDat(unsigned char dat)
{
	LcdWaitReady();
	LCD1602_RS=1;//数据
	LCD1602_RW=0;
	LCD1602_DB=dat;
	LCD1602_E=1;
	LCD1602_E=0;
}

指令介绍

1) 显示模式设置
写指令 0x38,设置 16x2 显示,5x7 点阵,8 位数据接口。这条指令对我们这个液晶来说是固定的,必须写 0x38,大家仔细看会发现我们的液晶实际上内部点阵是 5x8 的,还有一些1602 液晶还兼容串行通信,用 2 个 IO 口即可,但是速度慢,我们这个液晶就是固定的 0x38模式。

2) 显示开/关以及光标设置指令
这里有 2 条指令,第一条指令,一个字节中 8 位,其中高 5 位是固定的 0b00001,低 3位我们分别用 DCB 从高到低表示,D=1 表示开显示,D=0 表示关显示;C=1 表示显示光标,C=0 表示不显示光标;B=1 表示光标闪烁,B=0 表示光标不闪烁。
第二条指令,高 6 位是固定的 0b000001,低 2 位我们分别用 NS 从高到低表示,其中N=1 表示读或者写一个字符后,指针自动加 1,光标自动加 1,N=0 表示读或者写一个字符后指针自动减 1,光标自动减 1;S=1 表示写一个字符后,整屏显示左移(N=1)或右移(N=0),以达到光标不移动而屏幕移动的效果,如同我们的计算器输入一样的效果,而 S=0 表示写一个字符后,整屏显示不移动。

3) 清屏指令
固定的,写入 0x01 表示显示清屏,其中包含了数据指针清零,所有的显示清零。写入0x02 则仅仅是数据指针清零,显示不清零。

4) RAM 地址设置指令
该指令码的最高位为 1,低 7 位为 RAM 的地址。通常,我们在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

例子

用1602液晶显示
“Kingst Studio
Welcome to KSTS

#include <reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS=P1^0;
sbit LCD1602_RW=P1^1;
sbit LCD1602_E=P1^5;
void IniLcd1602();//初始化显示屏
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
void main()
{
	unsigned char str[]="Kingst Studio" ;
	IniLcd1602();
	LcdShowStr(2,0,str);
	LcdShowStr(0,1,"Welcome to KSTS");
	while(1);
}
void LcdWaitReady()	//是否准备好
{
	unsigned char sta;
	LCD1602_DB=0XFF;
	LCD1602_RS=0;//命令
	LCD1602_RW=1;//读
	do{
		LCD1602_E=1;
		sta=LCD1602_DB;//读状态
		LCD1602_E=0;//撤销使能,防止液晶输出数据干扰P0总线
	}while(sta&0x80);//头一位如果是一,表明在忙,禁止读写
}
void LcdWriteCmd(unsigned char cmd)	//写入命令
{
	LcdWaitReady();
	LCD1602_RS=0;//命令
	LCD1602_RW=0;//写
	LCD1602_DB=cmd;
	LCD1602_E=1;
	LCD1602_E=0;
}
void LcdWriteDat(unsigned char dat)//写入数据
{
	LcdWaitReady();
	LCD1602_RS=1;//数据
	LCD1602_RW=0;
	LCD1602_DB=dat;
	LCD1602_E=1;
	LCD1602_E=0;
}
void LcdSetCursor(unsigned char x,unsigned char y) //定位光标的位置
{
	unsigned char sto;
	if(y==0)
		sto=0x00+x;
	else
		sto=0x40+x;
	LcdWriteCmd(sto|0x80);//地址设置指令第一位为1	
}
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)
{
	LcdSetCursor(x,y);
	while(*str!='\0')
	{
		LcdWriteDat(*str++);	
	}
}
void IniLcd1602()
{
	LcdWriteCmd(0x38);
	LcdWriteCmd(0x0c);//显示器开,光标关闭
	LcdWriteCmd(0x06);//地址自动+1
	LcdWriteCmd(0x01);//清屏
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值