基于51單片機(jī)的1602驅(qū)動程序
//作者:科技小宅神
//版本聲明:僅供參考學(xué)習(xí)!違者必究!
//完成時間:2021/01/10
//代碼功能:本程序為液晶1602驅(qū)動程序,具有高度可移植性!只需更改相應(yīng)的引腳即可!
#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引腳
//---------------------------------------------------------------------
//函數(shù):判忙函數(shù)(等待函數(shù))
//功能:判斷液晶是否忙碌
void busy()
{
uchar sta;
sta=0xff;//讀取 LCD?引腳狀態(tài)
LCD_EN=1;//選擇數(shù)據(jù)寄存器
LCD_RS=0;//選擇指令寄存器
LCD_RW=1;//讀
_nop_();?
_nop_();
_nop_();
do
{
LCD_EN=1;
_nop_();
sta=P0; ? ?//讀取狀態(tài)字
LCD_EN=0;? //當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令
}
while(sta&BUSY);//bit7 等于 1 表示液晶正忙,重復(fù)檢測直到其等于 0 為止
}
//---------------------------------------------------------------------
//函數(shù):寫命令函數(shù)
//功能:向液晶寫入一字節(jié)命令(8位命令), cmd-待寫入命令值?
void writecmd(unsigned char cmd)
{
busy();? ? ?//判斷液晶是否忙碌
LCD_RS = 0; //選擇指令寄存器
LCD_RW = 0; //寫模式
P0 = cmd;? ?//把數(shù)據(jù)給P0,即寫入指令和地址
LCD_EN = 1;
? ? _nop_();? ? //短暫延時1us
_nop_();? ? //短暫延時1us
LCD_EN = 0; //當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令
}
//---------------------------------------------------------------------
//函數(shù):寫數(shù)據(jù)函數(shù)
//功能:向液晶寫入一字節(jié)數(shù)據(jù)(8位數(shù)據(jù)), dat-待寫入數(shù)據(jù)值?
void writedata(unsigned char dat)
{
busy(); //判斷液晶是否忙碌
LCD_RS = 1; //選擇數(shù)據(jù)寄存器
LCD_RW = 0; //寫模式
P0= dat; //把數(shù)據(jù)給P0
LCD_EN = 1;
_nop_(); //短暫延時1us
_nop_(); //短暫延時1us
LCD_EN = 0; //當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令
}
//---------------------------------------------------------------------
//函數(shù):初始化液晶函數(shù)
//功能:初始化液晶,并顯示啟動界面
void LCD_init()
{
writecmd(0x38); //16*2 顯示, 5*7 點陣, 8 位數(shù)據(jù)傳送
writecmd(0x0c); //顯示器開,光標(biāo)關(guān)閉
writecmd(0x06); //文字不動,地址自動+1
writecmd(0x01); //清屏
}
#endif