|
楼主 |
发表于 2012-7-28 14:38:45
|
显示全部楼层
#ifndef _LCD12864_H_
#define _LCD12864_H_
#define uchar unsigned char
#define uint unsigned int
#define MCLK_C (1)//定义主时钟频率,供延时使用
#define Delay_us(n) __delay_cycles(n*MCLK_C)
#define Delay_ms(n) __delay_cycles(n*(1000L)*MCLK_C)
#define LCDCSSET P1OUT |= BIT2 //(RS)液晶的4脚
#define LCDSIDSET P1OUT |= BIT3 //(WR)液晶的5脚
#define LCDCLKSET P1OUT |= BIT4 //(EN)液晶的6脚
#define LCDCSCLR P1OUT &=~BIT2 //
#define LCDSIDCLR P1OUT &=~BIT3 //
#define LCDCLKCLR P1OUT &=~BIT4 //
#define LCDSIDIN P1DIR &=~BIT3 //SID脚作为输入
#define LCDSIDOUT P1DIR |= BIT3 //SID脚作为输出
#define LCDSID BIT3
void LcdWriteType(void)//写方式
{
uchar i;
LCDCSSET;
for(i=0;i<5;i++)
{
LCDCLKCLR;
LCDSIDSET;
LCDCLKSET;//时钟上升沿
}//先发送5个1
LCDCLKCLR;
LCDSIDCLR;//再发送一个0表示写操作
LCDCLKSET;//时钟上升沿
}
void LcdReadType(void)//读方式
{
uchar i;
LCDCSSET;
for(i=0;i<5;i++)
{
LCDCLKCLR;
LCDSIDSET;
LCDCLKSET;//时钟上升沿
}//先发送5个1
LCDCLKCLR;
LCDSIDSET;//再发送一个1表示读操作
LCDCLKSET;//时钟上升沿
}
void LcdSendDat(uchar Dat)//发送一个字节的数据
{
uchar i;
for(i=0;i<4;i++)
{
LCDCLKCLR;
if(Dat & 0x80) LCDSIDSET;
else LCDSIDCLR;
LCDCLKSET;
Dat<<=1;
}//发送高4位
for(i=0;i<4;i++)
{
LCDCLKCLR;
LCDSIDCLR;
LCDCLKSET;
}//发送4个0
for(i=0;i<4;i++)
{
LCDCLKCLR;
if(Dat & 0x80) LCDSIDSET;
else LCDSIDCLR;
LCDCLKSET;
Dat<<=1;
}//发送低4位
for(i=0;i<4;i++)
{
LCDCLKCLR;
LCDSIDCLR;
LCDCLKSET;
}//发送4个0
LCDCSCLR;
}
uchar LcdBusy(void)//液晶忙判断
{
uchar result=1;
LcdReadType();
LCDCLKCLR;
LCDSIDCLR;//再发送一个0表示写命令操作
LCDCLKSET;//时钟上升沿
LCDCLKCLR;
LCDSIDCLR;//再发送一个0表示写第一个字节结束
LCDCLKSET;//时钟上升沿
LCDSIDIN;
LCDCLKCLR;
result = P1IN & LCDSID;//得到输入的值
LCDCLKSET;//时钟上升沿
LCDCSCLR;
LCDSIDOUT;
return (result);
}
void LcdWcmd(uchar cmd)//写指令
{
while((LcdBusy()>0));
LcdWriteType();
LCDCLKCLR;
LCDSIDCLR;
LCDCLKSET;//发送一个0表示写指令
LCDCLKCLR;
LCDSIDCLR;
LCDCLKSET;//发送一个0表示第一个字节结束
LcdSendDat(cmd);
}
void LcdWdat(uchar dat)//写数据
{
while((LcdBusy()>0));
LcdWriteType();
LCDCLKCLR;
LCDSIDSET;
LCDCLKSET;//发送一个1表示写数据
LCDCLKCLR;
LCDSIDCLR;
LCDCLKSET;//发送一个0表示第一个字节结束
LcdSendDat(dat);
}
void LcdInit(void)//初始化
{
P1DIR |= (BIT2 + BIT3 + BIT4);
Delay_ms(2);
LcdWcmd(0x02); //
Delay_ms(2);
LcdWcmd(0x0d); //
Delay_ms(2);
LcdWcmd(0x30); //
Delay_ms(2);
LcdWcmd(0x0c); //关闭光标
Delay_ms(2);
LcdWcmd(0x01); //
Delay_ms(2);
}
void LcdPos(uchar X,uchar Y)//写每一行的地址
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
LcdWcmd(pos); //显示地址
}
void LcdDisplay(uchar Line,uchar* str)//Line:第Line行,*str:要显示的字符
{
uchar i=0;
LcdPos(Line-1,0);// //设置显示位置为第一行的第1个字符
while(str[i] != '\0')
{ //显示字符
LcdWdat(str[i]);
i++;
}
}
void LcdDisplaySure(uchar Line,uchar Num,uchar *Dat)//Line:第Line行,num:个数,dat:要显示的字符
{
uchar i=0;
LcdPos(Line-1,Num-1);// //设置显示位置为第一行的第1个字符 //显示字符
while(Dat[i] != '\0')
{ //显示字符
LcdWdat(Dat[i]);
i++;
}
}
#endif |
|