PCF8563時(shí)鐘+AT24C02+LCD12864顯示時(shí)鐘程序
//aa0047132563000404
//秒分時(shí)日星期和月(最高3位0-6,代表1-7)
#include
#include
#include"hcLCDdot.h"http://點(diǎn)陣庫(kù)
#defineUcharunsignedchar
#defineUintunsignedint
#defineSomeNOP();_nop_();_nop_();_nop_();
/*LCD驅(qū)動(dòng)要用到的一些口線定意*/
#defineLCDPORTP0
sbitD_I=P3^7;
sbitR_W=P3^6;
sbitE=P3^5;
sbitCS1=P3^2;
sbitCS2=P3^4;
sbitRST=P3^3;
/*I2C要用到的口線定意*/
sbitSDA=P2^7;
sbitSCL=P2^6;
////////////以下為函數(shù)聲明///////////////////////////////
//LCD驅(qū)動(dòng)要用到的一些函數(shù)
voidlcdwrite_cmd(Ucharcmd_dat);
voidlcdwrite_dat(Uchardot_dat);
voidlcd_busy();
Ucharlcdread_dat(void);
voidlcddispon(void);
voidlcddispoff(void);
voidlcdclrall(void);
voidlcdini(void);
voidHz12disp(UcharNowrow,UcharNowcol,UcharCHplace);
voidASC12disp(UcharNowrow,UcharNowcol,UcharASCplace);
voidflashlogo(UcharBmpcol);
voidDisp128_64(UcharBMPplace);
voiddelay(void);
//I2C驅(qū)動(dòng)要用到的一些函數(shù)
voidDelay_1ms(Uchartime);
voidI2CStart(void);
voidI2CStop(void);
voidACK(void);//AcknowLEDge信號(hào)
voidNACK(void);//沒(méi)有Acknowledge信號(hào)
voidAutoACK(void);//在一定的時(shí)間內(nèi)自動(dòng)確定ACK的信號(hào)//
voidWritex(Ucharj);
UcharReadx(void);
voidX24_Write(UcharAddresshigh,UcharAddresslow,UcharWrite_date);
UcharX24_Read(UcharAddresshigh,UcharAddresslow);
voidX24_WritePage(UcharAddresshigh,UcharAddresslow,Ucharidata*Writeip);
voidX24_ReadPage(UcharAddresshigh,UcharAddresslow,Ucharidata*ReaDIP);
voidGetPCF8563(Ucharidata*Getip);
voidSetPCF8563(Ucharidata*Setip);
UcharReadPCF8563(UcharAddrePCF);
voidWritePCF8563(UcharAddrePCF,UcharPCFdata);
voidSetWaring(UcharWyear,UcharWmonth,UcharWday);
bitCheckTime(void);
voidrs232(void);
voidtime0(void);
/*定義一個(gè)接收的數(shù)組*/
Uchardatarecdata[8];//
UcharidataL24cxxdata[64];//用于讀出或?qū)懭?4C16的數(shù)據(jù)
UcharidatacLOCkdata[7];//系統(tǒng)時(shí)鐘
Ucharpcpointer,timecount,timecount2,*gettimeip;//用于設(shè)定從PC接收和發(fā)的指針
/*定義二個(gè)地址編碼寄存器,設(shè)定地址線穩(wěn)定時(shí)間,定時(shí)器2的延時(shí)時(shí)間參數(shù),動(dòng)畫的時(shí)位置參數(shù),發(fā)碼結(jié)束后取消靜音的時(shí)間*/
UchardataMCaddreh,MCaddrel,MCaddtime,time2_1s,time2_10s,time2_10sx,logocol;
Uintdatanomutetime;
Ucharnewbmpcount;
/*定義標(biāo)志位存放的寄存器*/
Ucharbdatamyflag,myflag2,bmpflag;//定義一個(gè)用于標(biāo)志寄存器存放的
sbitnomutebit=myflag^0;//用于開始取消靜音標(biāo)志
sbitrecpcokbit=myflag^1;//用于設(shè)定接收到一個(gè)完整的控制指令碼
sbitreturnbit=myflag^2;//用于向PC回傳數(shù)據(jù)標(biāo)志
sbitfindokbit=myflag^3;//尋找到明碼地址
sbitsendbit=myflag^4;//開始發(fā)碼
sbittimenewbit=myflag^5;//時(shí)鐘更新標(biāo)志
sbitcallnewbit=myflag^6;//有新的呼叫
sbitendnewbit=myflag^7;//呼叫結(jié)束
sbitw24cxxbit=myflag2^0;//設(shè)定明碼表
sbittimeoutbit=myflag2^1;
sbitnewtimebit=myflag2^2;//設(shè)定新的系統(tǒng)時(shí)間
sbitr_lbit=bmpflag^0;
sbitb_wbit=bmpflag^1;//圖和文字標(biāo)志
sbitnewbmpbit=bmpflag^2;//更新圖片
voidmain(void)
{
TH0=0xf8;//2ms
TL0=0xce;
TH1=0xfd;//以9600Baud的速率和PC機(jī)通信
TL1=0xfd;
TH2=0x4c;//50ms
TL2=0x00;
T2CON=0x00;
TMOD=0x21;//Time0為16位,Time1為8位常數(shù)自裝
SCON=0x50;
IP=0x10;
TR0=1;
TR1=1;
TR2=1;
time2_1s=0x14;
time2_10s=0x0a;
time2_10sx=0x0c;
IE=0x92;//Time0,Time2,RS232中斷
timecount=0x64;
timecount2=0x32;
newbmpcount=0x01;
logocol=0;
r_lbit=0;
timeoutbit=0;
b_wbit=1;
//setadd(80);
lcdini();
while(1)
{
lcdclrall();
HZ12disp(0x00,0x04,0x01);//承
HZ12disp(0x00,0x10,0x02);//接
HZ12disp(0x00,0x1C,0x03);//單
HZ12disp(0x00,0x28,0x04);//片
HZ12disp(0x00,0x34,0x05);//機(jī)
HZ12disp(0x00,0x40,0x06);//開
HZ12disp(0x00,0x4C,0x07);//發(fā)
HZ12disp(0x00,0x58,0x08);//及
HZ12disp(0x00,0x64,0x09);//解
HZ12disp(0x00,0x70,0x0A);//密
HZ12disp(0x01,0x0A,0x0B);//各
HZ12disp(0x01,0x16,0x0C);//類
ASC12disp(0x01,0x22,0x0B);//I
ASC12disp(0x01,0x28,0x0C);//C
HZ12disp(0x01,0x2E,0x0D);//卡
ASC12disp(0x01,0x3A,0x0D);//;
ASC12disp(0x01,0x40,0x0A);//P
ASC12disp(0x01,0x46,0x0B);//I
ASC12disp(0x01,0x4C,0x0C);//C
HZ12disp(0x01,0x52,0x03);//單
HZ12disp(0x01,0x5E,0x04);//片
HZ12disp(0x01,0x6A,0x05);//機(jī)
ASC12disp(0x02,0x0A,0x05);//5
ASC12disp(0x02,0x10,0x01);//1
HZ12disp(0x02,0x16,0x0E);//編
HZ12disp(0x02,0x22,0x0F);//程
HZ12disp(0x02,0x2E,0x10);//器
ASC12disp(0x02,0x3A,0x0D);//;
ASC12disp(0x02,0x40,0x0A);//P
ASC12disp(0x02,0x46,0x0B);//I
ASC12disp(0x02,0x4C,0x0C);//C
HZ12disp(0x02,0x52,0x0E);//編
HZ12disp(0x02,0x5E,0x0F);//程
HZ12disp(0x02,0x6A,0x10);//器
HZ12disp(0x03,0x00,0x14);//星
HZ12disp(0x03,0x0c,0x15);//期
ASC12disp(0x03,0x2c,0x02);//2
ASC12disp(0x03,0x32,0x00);//0
HZ12disp(0x03,0x44,0x11);//年
HZ12disp(0x03,0x5c,0x12);//月
HZ12disp(0x03,0x74,0x13);//日
ASC12disp(0x04,0x5c,0x0e);//:
ASC12disp(0x04,0x6e,0x0e);
while(b_wbit==1)
{
if(timenewbit==1)
{
Ucharnewtime0;
timenewbit=0;
newtime0=(clockdata[6]>>4)&0x0f;
ASC12disp(0x03,0x38,newtime0);
newtime0=clockdata[6]&0x0f;
ASC12disp(0x03,0x3e,newtime0);
newtime0=(clockdata[4]>>4)&0x01;
ASC12disp(0x03,0x50,newtime0);
newtime0=clockdata[4]&0x0f;
ASC12disp(0x03,0x56,newtime0);
newtime0=((clockdata[4]>>5)&0x07)+0x16;
HZ12disp(0x03,0x1B,newtime0);//幾號(hào)
newtime0=(clockdata[3]>>4)&0x03;
ASC12disp(0x03,0x68,newtime0);
newtime0=clockdata[3]&0x0f;
ASC12disp(0x03,0x6e,newtime0);
newtime0=(clockdata[2]>>4)&0x03;
ASC12disp(0x04,0x50,newtime0);
newtime0=clockdata[2]&0x0f;
ASC12disp(0x04,0x56,newtime0);
newtime0=(clockdata[1]>>4)&0x07;
ASC12disp(0x04,0x62,newtime0);
newtime0=clockdata[1]&0x0f;
ASC12disp(0x04,0x68,newtime0);
newtime0=(clockdata[0]>>4)&0x07;
ASC12disp(0x04,0x74,newtime0);
newtime0=clockdata[0]&0x0f;
ASC12disp(0x04,0x7a,newtime0);
}
if(r_lbit==0)
{
flashlogo(logocol++);
if(logocol==32)
{r_lbit=1;}
lcddispon();
delay();
}
else
{
flashlogo(logocol--);
if(logocol==0)
{r_lbit=0;}
lcddispon();
delay();
}
}
while(b_wbit==0)
{
if(newbmpbit==1)
{
newbmpbit=0;
Disp128_64(newbmpcount);
}
}
}
}
//以下為定時(shí)器TIME0中斷程序
voidtime0(void)interrupt1
{
TH0=0xf8;
TL0=0xce;
timecount--;
if(timecount==0)
{
timecount=0x64;
gettimeip=&clockdata[0];
GetPCF8563(gettimeip);
//clockdata[0]=0x25;
//clockdata[0]=0x12;
//clockdata[1]=0x34;
//clockdata[2]=0x56;
//clockdata[3]=0x78;
//clockdata[4]=0x90;
//clockdata[5]=0x88;
//clockdata[6]=0x77;
timenewbit=1;
timecount2--;
if(timecount2==0)
{
timecount2=0x32;
b_wbit=!b_wbit;
if(b_wbit==0)
{
newbmpbit=1;
newbmpcount++;
if(newbmpcount==0x03)
{newbmpcount=0x01;}
}
}
}
if(newtimebit==1&&recpcokbit==1)
{
//設(shè)定新的系統(tǒng)時(shí)間
Uchar*pcfsetip;
newtimebit=0;
recpcokbit=0;
pcfsetip=&recdata[1];
SetPCF8563(pcfsetip);
WritePCF8563(0x00,0x00);
WritePCF8563(0x01,0x00);
WritePCF8563(0x0d,0x83);
}
}
//以下為串行口中斷程序,用于接收串行數(shù)據(jù)
voidrs232(void)interrupt4
{
if(RI==1)
{
//原輸入格式為AA秒,分,時(shí)日,星期,月年
if(SBUF==0xaa)
{
newtimebit=1;
pcpointer=0;
}
RI=0;
recdata[pcpointer++]=SBUF;
if(pcpointer==8)
{
pcpointer=0;
recpcokbit=1;//指針還原,置收到完整的控制碼
}
}
else
{
TI=0;
}
}
voidtime2(void)interrupt5
{
TF2=0;
TH2=0x4c;//50ms
TL2=0x00;
}
/*---------------LCD驅(qū)動(dòng)要用到的一些子程序--------------------*/
/*向LCD寫指令*/
voidlcdwrite_cmd(Ucharcmd_dat)
{
D_I=0;
R_W=0;
E=0;
LCDPORT=cmd_dat;
SomeNOP();
E=1;
SomeNOP();
E=0;
}
/*向LCD寫數(shù)據(jù)*/
voidlcdwrite_dat(Uchardot_dat)
{
D_I=1;
R_W=0;
E=0;
LCDPORT=dot_dat;
SomeNOP();
E=1;
SomeNOP();
E=0;
}
/*判斷LCD是否處于*/
voidlcd_busy()
{
Uchari;
D_I=0;
R_W=1;
while(1)
{
E=0;
LCDPORT=0xff;
SomeNOP();
E=1;
SomeNOP();
i=LCDPORT;
E=0;
if(i<0x80)break;
}
}
Ucharlcdread_dat(void)
{Uchari;
D_I=1;
R_W=1;
E=0;
LCDPORT=0xff;
SomeNOP();
E=1;
SomeNOP();
i=LCDPORT;
E=0;
LCDPORT=0xff;
SomeNOP();
E=1;
SomeNOP();
i=LCDPORT;
E=0;
return(i);
}
//開LCD顯示
voidlcddispon(void)
{
CS1=0;CS2=1;
lcdwrite_cmd(0x3f);
CS1=1;CS2=0;
lcdwrite_cmd(0x3f);
}
//關(guān)LCD顯示
voidlcddispoff(void)
{
CS1=0;CS2=1;
lcdwrite_cmd(0x3e);
CS1=1;CS2=0;
lcdwrite_cmd(0x3e);
}
//對(duì)整屏清除,就是寫空的數(shù)據(jù)
voidlcdclrall(void)
{
Uchari,j;
for(i=0;i<8;i++)
{
CS1=0;CS2=1;
lcdwrite_cmd(i"0xb8);
lcdwrite_cmd(0x40);
for(j=64;j>0;j--)
{
lcdwrite_dat(0x00);
lcd_busy();
//P3_1=!P3_1;
}
CS1=1;CS2=0;
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(0x40);
for(j=64;j>0;j--)
{
lcdwrite_dat(0x00);
lcd_busy();
}
}
}
//LCD初始化
voidlcdini(void)
{
CS1=0;CS2=1;
lcdwrite_cmd(0xc0);//從第0行開始顯示
CS1=1;CS2=0;
lcdwrite_cmd(0xc0);
lcddispon();
}
/*在指定的行列上顯示12點(diǎn)陣的漢字*/
voidHZ12disp(UcharNowrow,UcharNowcol,UcharCHplace)
{
Uchari,tmp1,tmp2,k=12;
Uintj;
j=(CHplace-1)*24;
if((Nowrow%2)==0)//
{
switch(Nowrow)
{
case0:i=0;break;
case2:i=3;break;
default:i=6;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(Hzk12[j]);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8);//到下一頁(yè)
lcdwrite_cmd(Nowcol|0x40);
tmp1=lcdread_dat();
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat((Hzk12[j+12]&0x0f)|(tmp1&0xf0));
j++;
Nowcol++;
k--;
}
}
else
{
switch(Nowrow)
{
case1:i=1;break;
default:i=4;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{
if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
tmp1=lcdread_dat();
tmp1=tmp1&0x0f;
tmp1=(Hzk12[j]<<4)|tmp1;
tmp2=(Hzk12[j+12]<<4)|(Hzk12[j]>>4);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp1);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp2);
j++;
Nowcol++;
k--;
}
}
}
//6*12點(diǎn)陣的ASC碼顯示程序
voidASC12disp(UcharNowrow,UcharNowcol,UcharASCplace)
{
Uchari,tmp1,tmp2,k=6;
Uintj;
j=ASCplace*12;
if((Nowrow%2)==0)//
{
switch(Nowrow)
{
case0:i=0;break;
case2:i=3;break;
default:i=6;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(ASC12[j]);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8);//到下一頁(yè)
lcdwrite_cmd(Nowcol|0x40);
tmp1=lcdread_dat();
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat((ASC12[j+6]&0x0f)|(tmp1&0xf0));
j++;
Nowcol++;
k--;
}
}
else
{
switch(Nowrow)
{
case1:i=1;break;
default:i=4;
}
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{
if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
tmp1=lcdread_dat();
tmp1=tmp1&0x0f;
tmp1=(ASC12[j]<<4)|tmp1;
tmp2=(ASC12[j+6]<<4)|(ASC12[j]>>4);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp1);
lcd_busy();
lcdwrite_cmd((i+1)|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(tmp2);
j++;
Nowcol++;
k--;
}
}
}
//以動(dòng)畫的形式顯示公司的標(biāo)志,入口為在水平的第幾個(gè)位置,現(xiàn)把它做,從32到1,由2張32X16的圖組成
voidflashlogo(UcharBmpcol)
{
Uchari,j,p;
//把當(dāng)前要用的區(qū)間清空
CS1=0,CS2=1;
lcdwrite_cmd(0xbe);
lcdwrite_cmd(0x40);
for(i=64;i>0;i--)
{
lcdwrite_dat(0x00);
lcd_busy();
}
lcdwrite_cmd(0xbf);
lcdwrite_cmd(0x40);
for(i=64;i>0;i--)
{
lcdwrite_dat(0x00);
lcd_busy();
}
//開始寫要設(shè)定的數(shù)據(jù)(左半邊)
lcdwrite_cmd(0xbe);
lcdwrite_cmd(0x40);
j=Bmpcol;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp1zk[j-1]);
lcd_busy();
}
lcdwrite_cmd(0xbf);
lcdwrite_cmd(0x40);
j=Bmpcol;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp1zk[j-1+32]);
lcd_busy();
}
//開始寫要設(shè)定的數(shù)據(jù)(右半邊)
j=Bmpcol;
lcdwrite_cmd(0xbe);
lcdwrite_cmd((32+j-1)|0x40);
p=0;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp2zk[p++]);
lcd_busy();
}
j=Bmpcol;
lcdwrite_cmd(0xbf);
lcdwrite_cmd((32+j-1)|0x40);
p=0;
for(;j<=32;j++)
{
lcdwrite_dat(Bmp2zk[32+(p++)]);
lcd_busy();
}
}
//顯示一幅128X64的圖片,參數(shù)為圖片在bmp12864放置的第幾個(gè)圖
voidDisp128_64(UcharBMPplace)
{
Uchari,Nowcol,k;
Uintj;
j=(BMPplace-1)*1024;//計(jì)算出在圖表格中的起始位置
lcdclrall();
for(i=0;i<8;i++)
{Nowcol=0x00;
k=128;
while(k!=0)
{
if(Nowcol<0x40)
{CS1=0;CS2=1;}
else
{if(Nowcol<0x80)
{CS1=1;CS2=0;}
else
{break;}
}
lcdwrite_cmd(i|0xb8);
lcdwrite_cmd(Nowcol|0x40);
lcdwrite_dat(bmp12864[j]);
lcd_busy();
Nowcol++;
j++;
k--;
}
}
}
voiddelay(void)
{
Uchari,j,k;
for(i=0x02;i>0;i--)
{
for(j=0x96;j>0;j--)
{
for(k=0xfa;k>0;k--)
{
_nop_();
//_nop_();
}
}
}
}
/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下為一些用到的子程序*********************************/
/*延時(shí)子程序*/
voidDelay_1ms(Uchartime)
{
Ucharj;
while(time--)
{
for(j=163;j!=0;j--)
{;}
}
}
/*I2C的起動(dòng)程序*/
voidI2CStart(void)
{
SDA=1;
SomeNOP();
SCL=1;
SomeNOP();
SDA=0;
SomeNOP();
SCL=0;
SomeNOP();
}
/*I2C的停止程序*/
voidI2CStop(void)
{
SDA=0;
SomeNOP();
SCL=1;
SomeNOP();
SDA=1;
SomeNOP();
}
voidACK(void)//Acknowledge信號(hào)
{
SDA=0;
SomeNOP();
SCL=1;
SomeNOP();
SCL=0;
SomeNOP();
}
voidNACK(void)//沒(méi)有Acknowledge信號(hào)
{
SDA=1;
SomeNOP();
SCL=1;
SomeNOP();
SCL=0;
SomeNOP();
}
voidAutoACK(void)//在一定的時(shí)間內(nèi)自動(dòng)確定ACK的信號(hào)//
{
Uchari=0;
SCL=1;
SomeNOP();
while((SDA==1)&&(i<255))i++;
SCL=0;
SomeNOP();
}
/*I2C寫數(shù)據(jù)程序(向數(shù)據(jù)線上寫一個(gè)BYTE)*/
voidWritex(Ucharj)
{
Uchari,temp;
temp=j;
for(i=0;i<8;i++)//串行移位,先送高位,再送低位//
{
temp=temp<<1;
SCL=0;
SomeNOP();
SDA=CY;
SomeNOP();
SCL=1;
SomeNOP();
}
SCL=0;
SomeNOP();
SDA=1;
SomeNOP();
}
/*I2C讀數(shù)據(jù)程序(從數(shù)據(jù)線上讀出一個(gè)BYTE)返回值為讀出的數(shù)據(jù)(BYTE型)*/
UcharReadx(void)
{
Uchari,j,k=0;
SCL=0;
SomeNOP();
SDA=1;
for(i=0;i<8;i++)//串行移位,先讀出高位,后讀出低位//
{
SomeNOP();
SCL=1;
SomeNOP();
if(SDA==1)j=1;
elsej=0;
k=(k<<1)|j;
SCL=0;
}
SomeNOP();
return(k);//返回讀出的值//
}
//******************以下為對(duì)24CXX系列的讀寫程序******************************//
//*************24CXX的devICeaddress為寫0A0H,讀為0A1H*********************//
/*某個(gè)地址寫數(shù)據(jù)*/
voidX24_Write(UcharAddresshigh,UcharAddresslow,UcharWrite_date)
{
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
Writex(Write_date);
AutoACK();
I2CStop();
Delay_1ms(10);
}
/*對(duì)某個(gè)地址讀操作,函數(shù)值為讀出的數(shù)據(jù)*/
UcharX24_Read(UcharAddresshigh,UcharAddresslow)
{
Uchari;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
I2CStart();
Writex(0xA1);
AutoACK();
i=Readx();
//ACK();//注意:這里不能有ACK應(yīng)答信號(hào)//
I2CStop();
Delay_1ms(0);
return(i);
}
/*對(duì)內(nèi)存中的數(shù)據(jù)塊寫入,入口為寫EEPROM的地址,內(nèi)存緩沖中的數(shù)據(jù)的起始地址(是IDATA的數(shù)據(jù))*/
voidX24_WritePage(UcharAddresshigh,UcharAddresslow,Ucharidata*Writeip)
{
Uchari;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
for(i=0;i<64;i++)
{
Writex(*Writeip++);
AutoACK();
}
I2CStop();
}
/*把EEPROM中的數(shù)據(jù)讀出來(lái)存放在內(nèi)存緩沖中,起始地址為(是IDATA的數(shù)據(jù))*/
voidX24_ReadPage(UcharAddresshigh,UcharAddresslow,Ucharidata*Readip)
{
Uchari;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresshigh);
AutoACK();
Writex(Addresslow);
AutoACK();
I2CStart();
Writex(0xA1);
AutoACK();
for(i=0;i<63;i++)//PAGE讀的時(shí)候最后一個(gè)BYTE不要ACK信號(hào)//
{
*Readip=Readx();
Readip=Readip++;
ACK();
}
*Readip=Readx();
NACK();
I2CStop();
Delay_1ms(0);
}
//*******************以下為對(duì)PCF8383/PCF8563的讀寫子程序********************//
//**********時(shí)鐘片deviceaddress的寫地址為0A2H,讀地址為0A3H******************//
/*對(duì)PCF8563的時(shí)鐘讀到內(nèi)存中,以IDATA指針開始的連續(xù)7個(gè)BYTE*/
//****讀出的內(nèi)容依次為“秒,分鐘,小時(shí),日,星期,月/世紀(jì),年********************//
//PCF8585依次為“秒,分鐘,小時(shí),日,星期月
voidGetPCF8563(Ucharidata*Getip)
{
Uchari;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(0x02);//從秒地址開始讀//
AutoACK();
I2CStart();
Writex(0xA3);
AutoACK();
for(i=0;i<6;i++)
{
*Getip=Readx();
Getip=Getip++;
ACK();
}
*Getip=Readx();
NACK();
I2CStop();
Delay_1ms(0);
}
/*設(shè)定8563/8583的時(shí)間內(nèi)容依次為“秒,分鐘,小時(shí),日,星期,月/世紀(jì),年*/
//PCF8585依次為“秒,分鐘,小時(shí),日,星期月
voidSetPCF8563(Ucharidata*Setip)
{
Uchari;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(0x02);
AutoACK();
for(i=0;i<7;i++)
{
Writex(*Setip++);
AutoACK();
}
I2CStop();
}
UcharReadPCF8563(UcharAddrePCF)
{
Uchari;
I2CStart();
Writex(0xA2);
AutoACK();
Writex(AddrePCF);
AutoACK();
I2CStart();
Writex(0xA3);
AutoACK();
i=Readx();
//ACK();//注意:這里不能有ACK應(yīng)答信號(hào)//
I2CStop();
Delay_1ms(0);
return(i);
}
voidWritePCF8563(UcharAddrePCF,UcharPCFdata)
{
I2CStart();
Writex(0xA2);
AutoACK();
Writex(AddrePCF);
AutoACK();
Writex(PCFdata);
AutoACK();
I2CStop();
Delay_1ms(10);
}
voidSetWaring(UcharWyear,UcharWmonth,UcharWday)
{
X24_Write(0x07,0xf0,Wyear);
X24_Write(0x07,0xf1,Wmonth);
X24_Write(0x07,0xf2,Wday);
}
/*返回值為1和0,1為已溢出,0為沒(méi)有溢出*/
bitCheckTime(void)
{
Ucharj,k;
j=X24_Read(0x07,0xcb);
k=ReadPCF8563(0x08);/*讀年的時(shí)間*/
if(k
return(0);
}
else
{
if(k>j)
{
return(1);
}
else
{
j=X24_Read(0x07,0xCC);
k=ReadPCF8563(0x07)&0x1f;/*讀月的時(shí)間*/
if(k
return(0);
}
else
{
if(k>j)
{
return(1);
}
else
{
j=X24_Read(0x07,0xcd);
k=ReadPCF8563(0x05)&0x3f;/*讀日的時(shí)間*/
if(k>j)return(1);
elsereturn(0);
}
}
}
}
}