LCD1602显示驱动-8080通讯(上)

写的不知道好不好,有什么不对的地方还请指出,谢了。

1、提到LCD1602就需要先知道ASCLL码,特别是'\0'的作用和‘0’及使用,一个用在字符串,一个用在数字转换ASCLL码。

2、LCD1602驱动类似于因特尔8080通讯。

3、LCD基本驱动接口有:写1字节指令、读1字节数据、写1字节数据、读取LCD1602状态。

4、每次读写均要判断LCD1602的状态,不判断谁知道它处理之前的数据忙了没。
 

#ifndef __LCD_H__
#define __LCD_H__

#include <reg52.h>

sbit RS = P3 ^ 5;
sbit RW = P3 ^ 6;
sbit EN = P3 ^ 4;
#define DATA P0

//写1字节LCD1602的指令
void write_cmd_LCD1602(unsigned char cmd);
//读1字节LCD1602的数据
unsigned char read_DATA_LCD1602(void);
//写1字节LCD1602的数据
void write_dat_LCD1602(unsigned char dat);

#endif // !__LCD1602_H__
//LCD1602//类似SPI通讯,好像是因特尔8080通讯。
//VO进行亮度调节,硬件控制
//P0口进行一字节数据传送
//sbit RS = P3 ^ 5;数据/命令选择端(H/L)即高电平传输的是数据,低电平传输的是命令
//sbit RW = P3 ^ 6;读/写选择端(H/L)即高电平读,低电平写
//sbit EN = P3 ^ 4;使能信号
//#define DATA P0
#include "lcd.h"

//读LCD1602的状态
//返回0表示LCD1602允许读写操作
//返回1表示LCD1602禁止读写操作
bit LCD1602_status(void)
{
	RS = 0;//表示传输数据
	RW = 1;//要读LCD1602
	DATA = 0xff;//释放数据线
	EN = 1;//开启使能
	if ((DATA & 0x80) == 0x80)//保留最高位并且判断最高位是1还是0
	{
		EN = 0;//关闭使能
		return 1;//禁止写入数据
	}
	else
	{
		EN = 0;//关闭使能
		return 0;//允许读写数据
	}
}
//写1字节LCD1602的指令
void write_cmd_LCD1602(unsigned char cmd)
{
	while (LCD1602_status());//等待LCD1602处于闲置状态
	RS = 0;//表示要传送命令了
	RW = 0;//表示要进行写操作
	DATA = cmd;//写入数据给LCD1602
	EN = 1;//开启使能,让LCD1602开始接收数据
	EN = 0;//关闭使能,每次操作后均关闭使能
	DATA = 0xff;//释放数据线
}

//读1字节LCD1602的数据
unsigned char read_DATA_LCD1602(void)
{
	while (LCD1602_status());//等待LCD1602处于闲置状态
	RS = 1;//表示要传输数据
	RW = 1;//表示要进行读数据操作
	DATA = 0xff;//释放数据线,为了确保数据线是释放的
	EN = 1;//开启使能
	EN = 0;//关闭使能
	return DATA;//将读取到的数据返回给函数
}

//写1字节LCD1602的数据
void write_dat_LCD1602(unsigned char dat)
{
	while (LCD1602_status());//等待LCD1602处于闲置状态
	RS = 1;//表示接下来要传输数据了
	RW = 0;//表示要进行写数据
	DATA = dat;//将数据写入到总线上
	EN = 1;//开启使能,让LCD1602进行读取数据
	EN = 0;//关闭使能
	DATA = 0xff;//释放总线
}

猜你喜欢

转载自blog.csdn.net/qq_44829055/article/details/107440605