液晶1602驱动

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include

#define Uchar unsigned char
#define Uint unsigned int

// LCM1602A端口地址定义
char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1

#define Busy 0x80 // 忙判别位

code char exampl[]="For an example. - By zhangzhen\n";

void Delay400Ms(void);
void Delay5Ms(void);
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC ); //写液晶控制字
void LcdReset( void ); //复位
void Display( Uchar dd ); //动态显示
void DispOneChar(Uchar x,Uchar y,Uchar Wdata); //显示一个字符
void ePutstr(Uchar x,Uchar y, Uchar code *ptr); //显示一串字符

//主程序
void main(void)
{
Uchar temp;

Delay400Ms(); //启动时必须的延时,等待lcm进入工作状态

LcdReset(); //这也是必需的....初始化
temp = 32;
ePutstr(0,0,exampl); //上面一行显示一个预定字符串

Delay400Ms(); //保留显示内容
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();

while(1)
{
temp &= 0x7f; //只显示ASCII字符

if (temp<32)temp=32; //屏蔽控制字符,不予显示
Display( temp++ );

Delay400Ms();
}
}

//显示字符串
void ePutstr(Uchar x,Uchar y, Uchar code *ptr)
{
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;iDispOneChar(x++,y,ptr[i]);
if ( x == 16 )
{
x = 0; y ^= 1;
}
}
}

// 演示一行连续字符串,配合上位程序演示移动字串
void Display( Uchar dd )
{

Uchar i;

for (i=0;i<16;i++)
{

DispOneChar(i,1,dd++);

dd &= 0x7f;
if (dd<32) dd=32;
}
}

// 显示光标定位
void LocateXY( char posx,char posy)
{

Uchar temp;

temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}

// 按指定位置显示数出一个字符
void DispOneChar(Uchar x,Uchar y,Uchar Wdata)
{
LocateXY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}

// 初始化程序, 必须按照产品资料介绍的初始化过程进行
void LcdReset( void ) {

LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();

LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}

// 写控制字符子程序: E=1 RS=0 RW=0

void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

if (AttribC) while( Lcd1602StatusPort & Busy ); // 检测忙信号?
Lcd1602

CmdPort = CMD;
}

// 当前位置写字符子程序: E =1 RS=1 RW=0
void LcdWriteData( char dataW ) {

while( Lcd1602StatusPort & Busy ); // 检测忙信号
Lcd1602WdataPort = dataW;
}

// 短延时
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}

//长延时
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}
///////////////////////////////////////////////////////////////////////////////////////////

#include
#define uchar unsigned char
#define Data P2 //
#define Busy 0x80 //用于检测LCM状态字中的Busy标识

#define NoDisp 0
#define NoCur 1
#define CurNoFlash 2
#define CurFlash 3

sbit RS = P1^2;
sbit RW = P1^3;
sbit E = P1^4;

uchar number[]={'0','1','2','3','4','5','6','7','8','9'};
uchar Date[]={"Date"};
uchar Time[]={"Time"};


/*延时程序 由Delay参数确定延迟时间*/
void delay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++) ;
}
}

/*读状态*/
void ReadLCD()
{
Data=0xFF;
RS=0;
RW=1;
E=1;
E=0;
E=1;
while (Data&Busy); //检测忙信号
}

/*写指令*/
void WriteCommandLCD(uchar WCLCD)
{
Data=WCLCD;
RS=0;
RW=0;
E=1;
E=0;
E=1;
}

/*写数据*/
void WriteDataLCD(uchar WDLCD)
{
ReadLCD();
Data=WDLCD;
RS=1;
RW=0;
E=1;
E=0;
E=1;
}

/*光标设置命令Cur 为设定光标参数*/
void SetCur(uchar Cur)
{ switch(Cur)
{ case 0x0:
{ WriteCommandLCD(0x08); //关显示
break;
}
case 0x1:
{ WriteCommandLCD(0x0c); //开显示但无光标
break;
}
case 0x2:
{ WriteCommandLCD(0x0e); //开显示有光标但不闪烁
break;
}
case 0x3:
{ WriteCommandLCD(0x0f); //开显示有光标且闪烁
break;
}
default: break;
}
}

/*按指定位置显示一个字符X不能大于15,Y不能大于1*/
void DisplayOneChar(uchar X,uchar Y,uchar Num)
{
Y&=0x01;
X&=0x0F; //限制X不能大于15,Y不能大于1
if(Y) X+=0xc0; //当要显示第二行时地址码+0xc0;
else X+=0x80;
ReadLCD();
WriteCommandLCD(X); //发送地址码
WriteDataLCD(Num);
}

/*按指定位置显示一串字符*/
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength;
ListLength=0;
while(DData[ListLength]>0x20) //若到达字串尾则退出
{
if(X<=15) //X坐标应小于15
{
DisplayOneChar(X,Y,DData[ListLength]); //显示单个字符
ListLength++;
++X;
}
}
}

/*LCD初始化*/
void LCDInit(void)
{
WriteCommandLCD(0x38); //显示模式设置
delay(10);
ReadLCD();
WriteCommandLCD(0x08);//关显示
ReadLCD();
WriteCommandLCD(0x01);//清显示
ReadLCD();
WriteCommandLCD(0x0f);//开显示且光标闪烁
ReadLCD();
WriteCommandLCD(0x06);//置输入方式
DisplayListChar(0,0,Date);
Disp

layOneChar(4,0,0x3a);
DisplayListChar(0,1,Time);
DisplayOneChar(4,1,0x3a);

}

void main()
{
LCDInit();//初始化
SetCur(NoCur);//不显示光标
for(;;)
{;}

}

相关文档
最新文档