|
关键代码和注释
//检测1602 是否忙,如果忙,则等待,直到1602不忙为止。
sbit PLcdRS = P1^0 ;
sbit PLcdRW = P1^1 ;
sbit PLcdE = P2^5 ;
#define PLCDDATA P0
void vWaitNotBusy(void)
{
PLcdRS = 0 ;
PLcdRW = 1 ;
PLCDDATA = 0XFF;
while ( PLCDDATA & 0x80 ) //为真,代表忙 1000 0000
{
_nop_();
PLcdE = 0 ;
_nop_();
PLcdE = 1 ;
_nop_();
}
}
void vLcdCommand(unsigned char ucCommand)
{
vWaitNotBusy();
PLcdRS = 0 ;
PLcdRW = 0 ;
PLCDDATA = ucCommand ;
_nop_() ;
PLcdE = 1 ;
_nop_();
PLcdE = 0 ;
_nop_() ;
}
void vLcdData(unsigned char ucData)
{
vWaitNotBusy();
PLcdRS = 1 ;
PLcdRW = 0 ;
_nop_() ;//1us
PLcdE = 1 ;
PLCDDATA = ucData ;
_nop_();
PLcdE = 0 ;
_nop_() ;
} //需要等待液晶忙结束
void vLcdInit(void)
{
vLcdCommand(0x38);
vLcdCommand(0x0C); //0C显示屏幕,光标不显示,并不闪烁
vLcdCommand(0x06); // LCD模式设定,I/D=1(计数地址加1)
vLcdCommand(0x01); //清除LCD的屏幕
#define CLRS 0X01 //清除屏幕
#define CURREST 0X02 //光标复位
#define DISPLAY 0X0C //开启显示
#define DISPLAYCUR 0X0E //开启显示,并显示光标,光标不闪烁
#define DISPLAYCUR 0X0F //开启显示,并显示光标,光标闪烁
}
void vLcd1Char(unsigned char X,unsigned char Y,unsigned char ucChar)
{
Y &= 1; //目的是保证行值为0或者1
X &= 15; //保证列值为0-15 0000 1111 列坐标,范围0-15 ,
if(Y == 1)
{
X |= 0x40 ;
}
X |= 0x80; //指令码为地址码+0X80
vLcdCommand(X); //用命令的方式,发送一个地址,要显示的地址????。
//DDRAM
vLcdData(ucChar);
}
//计算下一个要显示的字符,地址是否在16个字符范围内。
void vLcdString(unsigned char X,unsigned char Y,unsigned char *ucString)
{
while(*ucString)
{
vLcd1Char(X,Y,*ucString);
ucString ++ ; //指令码为地址码+0X80
X++;
}
}
//lcd显示16进制数据,
void vLcdHex(unsigned char X,unsigned char Y,unsigned char ucData)
{
unsigned char ucTemp;
ucTemp = (ucData & 0xf0) >> 4;
if(ucTemp >=0x0A)
{
ucTemp += 'A'; //x y ucdata 分别是 列,行,数据。 0x39
}
else
{
ucTemp += '0';
}
vLcd1Char(X,Y,ucTemp );
ucTemp = (ucData & 0x0f);
if(ucTemp >=0x0A)
{
ucTemp += 'A';
}
else
{
ucTemp += '0';
}
vLcd1Char(X+1,Y,ucTemp );
}
void vLcdDec(unsigned char X,unsigned char Y,unsigned char ucData)
{
unsigned char ucTemp;
ucTemp = ucData /100;
ucTemp += '0';
vLcd1Char(X,Y,ucTemp );
ucTemp = ucData %100 /10;
ucTemp += '0';
vLcd1Char(X+1,Y,ucTemp );
ucTemp = ucData %10; //lcd显示10进制数据,
ucTemp += '0';
vLcd1Char(X+2,Y,ucTemp );
}
void WriteDs1302_1Byte(unsigned char Address, unsigned char Data)
{
unsigned char i;
RST=0;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
SDA = Address & 0x01;
Address>>=1;
SCK=1;
SCK=0;
}
for(i=0;i<8;i++)
{
SDA=Data&0x01;
Data>>=1;
SCK=1;
SCK=0;
}
SCK=0;
RST=0;
}
unsigned char ReadDs1302_1Byte(unsigned char Address)
{
unsigned char i;
unsigned char Data;
Data=0;
RST=0;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
SDA=Address&0x01;
Address>>=1;
SCK=1;
SCK=0;
}
for(i=0;i<7;i++)
{
if(SDA==1)
Data|=0x80;
Data>>=1;
SCK=1;
SCK=0;
}
SCK=0;
RST=0;
return Data;
}
void DS1302_Init(void)
{
WriteDs1302_1Byte(0x80,0x00);//允许时钟运行
WriteDs1302_1Byte(0x8E,0x00);//允许写
}
|
|