sbit ELCD=P2^5;
sbit R_W=P2^6;
sbit RS=P2^7;
sbit clk=P3^3;
sbit da=P3^4;
sbit rst=P3^5;
uchar code discode[]={'0','1','2','3','4','5','6','7','8','9'};//LCD显示0~9的
ASSII码
uchar sec=0;uchar hsec=0;uchar lsec=0;
uchar min=0;
uchar hmin=0;
uchar lmin=0;
uchar hour=0;uchar hhour=0;uchar lhour=0;
initlcd();//LCD初始化
wrcm(uchar a);//LCD写命令字
wrda(uchar b);//LCD写数据
init1302();//1302初始化
void wr1302(uchar adr1302,uchar dat1302);//写1302
uchar re1302(uchar adr302);//读1302
retime();//读时间
dotime();//秒、分、时,时间处理
lcddisp();//LCD显示
Delay();//用延时来代替查询LCD的BF忙信号
main()
{
initlcd();
init1302();
while(1)
{
retime();
dotime();
lcddisp();
}
}
//*****************************
retime()
{
sec=re1302(0x81);
min=re1302(0x83);
hour=re1302(0x85);
}
//*****************************
dotime()
{
hsec=sec&0xf0;
hsec=hsec> > 4;
lsec=sec&0x0f;//拆出秒的十位、个位
hmin=min&0xf0;
hmin=hmin> > 4;
lmin=min&0x0f;//拆出分的十位、个位
hhour=hour&0xf0;
hhour=hhour> > 4;
lhour=hour&0x0f;//拆出时的十位、个位
}
//*****************************
lcddisp()
{
wrcm(0x84);
wrda(discode[hhour]);
wrda(discode[lhour]);//显示时
wrda(0x3a);//显示时和分的分隔符:
wrda(discode[hmin]);
wrda(discode[lmin]);//显示分
wrda(0x3a);//显示分和秒的分隔符:
wrda(discode[hsec]);
wrda(discode[lsec]);//显示秒
}
//*****************************
init1302()
{
wr1302(0x8e,0x00);//打开写保护
wr1302(0x80,0x80);//秒初始化,关振荡器,但读出时间时发现秒仍旧正常走时。
wr1302(0x82,0x01);//分初始化
wr1302(0x84,0x01);//时初始化,分和时读出后显示的是乱码
}//说明是初始化时写不进去,这是为什么呢?
//****************************
initlcd()
{
wrcm(0x00);
wrcm(0x38);
wrcm(0x0c);
wrcm(0x06);
}
//****************************
wrcm(uchar a)
{
ELCD=0;
R_W=0;
RS=0;
ELCD=1;
ADB=a;
ELCD=0;
Delay();
}
//*****************************
wrda(uchar b)
{
ELCD=0;
R_W=0;
RS=1;
ELCD=1;
ADB=b;
ELCD=0;
Delay();
}
//******************************
void wr1302(uchar adr1302,uchar dat1302)
{
char i,m;
clk=0;
rst=1;
for(i=0;i <8;i++)
{
m=adr1302&0x01;
if(m)
da=1;
else da=0;
clk=0;
//Delay();
clk=1;
adr1302=adr1302> > 1;
}
for(i=0;i <8;i++)
{
m=dat1302&0x01;
if(m)
da=1;
else da=0;
clk=0;
//Delay();
clk=1;
adr1302=adr1302> > 1;
}
rst=0;
}
//****************************
uchar re1302(uchar adr1302)
{
uchar i,m;
clk=0;
rst=1;
for(i=0;i <8;i++)
{
if((adr1302> > i)&0x01)
da=1;
else da=0;
clk=0;
// Delay();
clk=1;
}
m=0;
for(i=0;i <8;i++)
{//da=1;
m=m> > 1;
clk=1;
//Delay();
clk=0;
if(da)
m=m|0x80;
else m=m&0x7f;
}
rst=0;
return(m);
}
//****************************
Delay()
{
uchar j;
for(j=0;j <248;j++);
}
//***************************
}
rst=0;
}