|
關鍵代碼和注釋
//檢測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);//允許寫
}
|
|