写的不知道好不好,有什么不对的地方还请指出,谢了。
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;//释放总线
}