基于51单片机的1602驱动程序
//作者:科技小宅神
//版本声明:仅供参考学习!违者必究!
//完成时间:2021/01/10
//代码功能:本程序为液晶1602驱动程序,具有高度可移植性!只需更改相应的引脚即可!
#ifndef _1602_H_
#define _1602_H_
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80 //常量定义
//LCD1602引脚定义
sbit LCD_RS = P2^0;//寄存器选择位,将RS位定义为P2^0引脚
sbit LCD_RW = P2^1;//读写选择位, 将RW位定义为P2^1引脚
sbit LCD_EN = P2^2;//使能信号位, 将EN位定义为P2^2引脚
//---------------------------------------------------------------------
//函数:判忙函数(等待函数)
//功能:判断液晶是否忙碌
void busy()
{
uchar sta;
sta=0xff;//读取 LCD 引脚状态
LCD_EN=1;//选择数据寄存器
LCD_RS=0;//选择指令寄存器
LCD_RW=1;//读
_nop_();
_nop_();
_nop_();
do
{
LCD_EN=1;
_nop_();
sta=P0; //读取状态字
LCD_EN=0; //当E端由高电平跳变成低电平时,液晶模块执行命令
}
while(sta&BUSY);//bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止
}
//---------------------------------------------------------------------
//函数:写命令函数
//功能:向液晶写入一字节命令(8位命令), cmd-待写入命令值
void writecmd(unsigned char cmd)
{
busy(); //判断液晶是否忙碌
LCD_RS = 0; //选择指令寄存器
LCD_RW = 0; //写模式
P0 = cmd; //把数据给P0,即写入指令和地址
LCD_EN = 1;
_nop_(); //短暂延时1us
_nop_(); //短暂延时1us
LCD_EN = 0; //当E端由高电平跳变成低电平时,液晶模块执行命令
}
//---------------------------------------------------------------------
//函数:写数据函数
//功能:向液晶写入一字节数据(8位数据), dat-待写入数据值
void writedata(unsigned char dat)
{
busy(); //判断液晶是否忙碌
LCD_RS = 1; //选择数据寄存器
LCD_RW = 0; //写模式
P0= dat; //把数据给P0
LCD_EN = 1;
_nop_(); //短暂延时1us
_nop_(); //短暂延时1us
LCD_EN = 0; //当E端由高电平跳变成低电平时,液晶模块执行命令
}
//---------------------------------------------------------------------
//函数:初始化液晶函数
//功能:初始化液晶,并显示启动界面
void LCD_init()
{
writecmd(0x38); //16*2 显示, 5*7 点阵, 8 位数据传送
writecmd(0x0c); //显示器开,光标关闭
writecmd(0x06); //文字不动,地址自动+1
writecmd(0x01); //清屏
}
#endif