//////////////////////////////////////////////////////頭文件/////////////////////////////////////////////////////
/*******************************************************************************
* 標(biāo)題: 1602顯示驅(qū)動(dòng)程序 *
* 文件: 1602lcd.h 1602lcd.c *
* 日期: 2010-3-11 *
* 版本: 1.12(試驗(yàn)通過(guò)版)可用51hei單片機(jī)開(kāi)發(fā)板 *
* 郵箱: acsdf139@163.com qq:526083029 *
* 網(wǎng)站: 無(wú) *
********************************************************************************
* 描述: *
* 用法:首先在主程序內(nèi)添加頭文件#include"1602lcd.c" *
* 再在mian()中初始化液晶即可 *
* *
********************************************************************************
*【版權(quán)】自己參照網(wǎng)上,朋友,以及書(shū)本資料上寫(xiě)的,所以沒(méi)有版權(quán) *
*【聲明】此程序,可用于學(xué)習(xí),參考及實(shí)際設(shè)計(jì)中,歡迎轉(zhuǎn)載復(fù)制以及建議批評(píng) *
*【技術(shù)支持】qq:526083029 小張 *
********************************************************************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define delaynop(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define uchar unsigned char
#define SETXY 1
#define XYPRS 1
#define XYPRC 1
#define LEFTRIGHT 0
/************************************/
//函數(shù)聲明
extern bit lcdbusy(void);
extern void lcdwcmd(uchar cmd); //寫(xiě)命令函數(shù)1
extern void lcdwdat(uchar dat); //寫(xiě)數(shù)據(jù)1
extern void lcdpos(uchar x,bit y); //行設(shè)置1
extern void lcdinit(void); //初始化1
extern void lcdprc(uchar ch); //寫(xiě)字符1
extern void lcdprs(uchar *string); //寫(xiě)字符串1
extern void lcdsetxy(uchar X,uchar Y);//顯示坐標(biāo)設(shè)置
extern void lcdxyprs(uchar X,uchar Y,char *String);//指定坐標(biāo)顯示字符串
extern void lcdxyprc(uchar X,uchar Y,char ch);
extern void lcdsetxs(bit D,bit C,bit B);
extern void lcdsetim(bit I_D,bit S);
extern void lcdclear(); //清屏函數(shù)
extern void lcdenter(); //顯示回車(chē)
extern void lcdcri(unsigned char n);
extern void lcdcle(unsigned char n);
extern void lcdright(unsigned char n);
extern void lcdright(unsigned char n);
#endif
//////////////////////////////////////////////////////c程序/////////////////////////////////////////////////////
#include <AT89x52.H>
#include "1602lcd.h"
#include <intrins.h>
//管角定義
sbit RSlcd=P2^0; //數(shù)據(jù)命令選擇
sbit RWlcd=P2^1; //數(shù)據(jù)讀寫(xiě)
sbit EPlcd=P2^2; //使能
/************************************
函數(shù)名:lcdbusy
函數(shù)功能:1602忙閑信號(hào)
參數(shù):無(wú)
返回:bit類(lèi)型值 1為忙,0為閑
備注:
************************************/
bit lcdbusy(void)
{ bit result;
RSlcd = 0;
RWlcd = 1;
EPlcd = 1;
delaynop();
result = (bit)(P0 & 0x80);
EPlcd = 0;
return result;
}
/*************************************
函數(shù)名:lcdwcmd
函數(shù)功能:向1602中寫(xiě)指令
參數(shù):cmd(命令)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdwcmd(uchar cmd)
{
while(lcdbusy());
RSlcd=0;
RWlcd=0;
EPlcd=0;
_nop_();
_nop_();
P0=cmd;
delaynop();
EPlcd = 1;
delaynop();
EPlcd = 0;
}
/*************************************
函數(shù)名:lcdwdat
函數(shù)功能:向1602中寫(xiě)數(shù)據(jù)
參數(shù):dat(數(shù)據(jù))
返回:無(wú)
備注:無(wú)
*************************************/
void lcdwdat(uchar dat)
{
while(lcdbusy());
RSlcd=1;
RWlcd=0;
EPlcd=0;
P0=dat;
delaynop();
EPlcd=1;
delaynop();
EPlcd=0;
}
/*************************************
函數(shù)名:lcdprc
函數(shù)功能:寫(xiě)一個(gè)字符
參數(shù):zifu(字符)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdprc(uchar zifu)
{
lcdwdat(zifu);
}
/*************************************
函數(shù)名:lcdprs
函數(shù)功能:寫(xiě)字符串
參數(shù):zifu(字符)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdprs(uchar *string)
{
while(*string)
{lcdwdat(*string);string++;}
}
/*************************************
函數(shù)名:lcdclear
函數(shù)功能:清屏
參數(shù):無(wú)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdclear(void)
{
lcdwcmd(0x01);
}
/*************************************
函數(shù)名:lcdenter
函數(shù)功能:軟復(fù)位
參數(shù):無(wú)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdenter(void)
{
lcdwcmd(0x2);
}
/*************************************
函數(shù)名:lcdsetxs
函數(shù)功能:顯示設(shè)置
參數(shù):d(顯示)c(光標(biāo))b(閃爍)
返回:無(wú)
備注:d=1(開(kāi)顯示),d=0(關(guān)顯示)
c=1(顯示光標(biāo)),c=0(不顯示光標(biāo))
b=1(光標(biāo)閃爍),b=0(不閃爍)
*************************************/
void lcdsetxs(bit D,bit C,bit B)
{
unsigned char order;
order=0x8;
if(D)
order=order+0x4;
if(C)
order=order+0x2;
if(B)
order=order+0x1;
lcdwcmd(order);
}
/*************************************
函數(shù)名:lcdsetim
函數(shù)功能:左右移動(dòng)
參數(shù):I_D(地址指針), S(整行移動(dòng))
返回:無(wú)
備注:I_D=1(光標(biāo)右移),I_D=0(光標(biāo)左移)
S=1(整行左右移),S=0(整行不動(dòng))
*************************************/
void lcdsetim(bit I_D,bit S)
{
unsigned char order;
order=0x4;
if(I_D)
order=order+0x2;
if(S)
order=order+0x1;
lcdwcmd(order);
}
/*************************************
函數(shù)名:lcdinit
函數(shù)功能:初始化
參數(shù):無(wú)
返回:無(wú)
備注:無(wú)
*************************************/
void lcdinit()
{
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdsetxs(1,0,0); //設(shè)置輸入模式,默認(rèn)增量方式,畫(huà)面不動(dòng),光標(biāo)向右邊移動(dòng)
lcdsetim(1,0);
lcdwcmd(0x01); //清屏
}
/*************************************
函數(shù)名:lcdsetxy
函數(shù)功能:坐標(biāo)設(shè)置
參數(shù):x(列數(shù)),y(行數(shù))
返回:無(wú)
備注:配合lcdxyprc,lcdxyprs函數(shù)使用
列數(shù)小于39,行數(shù)小于2
*************************************/
void lcdsetxy(uchar X,uchar Y)
{
uchar Address;
if(X>39)
X=39;
if (Y == 0)
{
Address = 0x80 + X;
}
else
{
Address = 0xc0 + X;
}
lcdwcmd(Address);
}
#if XYPRC
/*************************************
函數(shù)名:lcdxyprc
函數(shù)功能:在特定行列內(nèi)顯示字符
參數(shù):X(列),Y(行),ch(字符)
返回:無(wú)
備注:列數(shù)小于16,行數(shù)小于2
*************************************/
void lcdxyprc(uchar X,uchar Y,char ch)
{
lcdsetxy(X,Y);
lcdwdat((uchar)ch);
}
#endif
#if XYPRS
/*************************************
函數(shù)名:lcdxyprs
函數(shù)功能:在特定行列內(nèi)顯示字符串
參數(shù):X(列),Y(行),String(字符)
返回:無(wú)
備注:列數(shù)小于16,行數(shù)小于2
*************************************/
void lcdxyprs(uchar X,uchar Y,char *String)
{
if(Y==0)
{
if(X<16)
{
lcdsetxy(X,Y);
for(;X<16 && *String!='\0';X++)
{
lcdwdat((uchar)*String);
String++;
}
if(*String!='\0')
{
X=0;
Y=1;
}
}
}
if(Y==1)
{
lcdsetxy(X,Y);
for(;X<16 && *String!='\0';X++)
{
lcdwdat((uchar)*String);
String++;
}
}
}
#endif
#if LEFTRIGHT
/*************************************
函數(shù)名:lcdright
函數(shù)功能:畫(huà)面和光標(biāo)一起右邊移動(dòng)n個(gè)字符位置
參數(shù):n(字符數(shù))
返回:無(wú)
備注:無(wú)
*************************************/
void lcdright(unsigned char n) //shift by n characters Right
{
unsigned char i;
for(i=0;i<n;i++)
lcdwcmd(0x1e);
}
/*************************************
函數(shù)名:lcdleft
函數(shù)功能:畫(huà)面和光標(biāo)一起左邊移動(dòng)n個(gè)字符位置
參數(shù):n(字符數(shù))
返回:無(wú)
備注:無(wú)
*************************************/
void lcdleft(unsigned char n) //shift by n characters Left
{
unsigned char i;
for(i=0;i<n;i++)
lcdwcmd(0x18);
}
/*************************************
函數(shù)名:lcdcle
函數(shù)功能:光標(biāo)往左邊移動(dòng)n個(gè)字符位置
參數(shù):n(字符數(shù))
返回:無(wú)
備注:無(wú)
*************************************/
void lcdcle(unsigned char n) //shif cursor right by n
{
unsigned char i;
for(i=0;i<n;i++)
lcdwcmd(0x14);
}
/*************************************
函數(shù)名:lcdcri
函數(shù)功能:光標(biāo)往右邊移動(dòng)n個(gè)字符位置
參數(shù):n(字符數(shù))
返回:無(wú)
備注:無(wú)
*************************************/
void lcdcri(unsigned char n) //Shift cursor left by n
{
unsigned char i;
for(i=0;i<n;i++)
lcdwcmd(0x10);
}
#endif