PCF8563时钟程序
扫描二维码
随时随地手机看文章
PCF8563时钟程序
#include
#include
#definebyteunsignedchar
sbitscl=0x81;//定义串行I/O口
sbitsda=0x80;
idatabyterom_sed[9];
idatabyterom_rec[7];
idatabytej,k;
bitflag,flag1;
voiddelay(void)//延时子程序
{
databytei;
for(i=0;i<6;i++);
}
voidI_start(void)//发送I2C总线起始条件子程序
{
sda=1;
;
scl=1;
delay();
sda=0;
delay();
scl=0;
;
}
voidI_stop(void)//I2C总线停止条件子程序
{
sda=0;
;
scl=1;
delay();
sda=1;
delay();
}
bitI_send(byteI_data)//字节数据传送子程序
{
databytei;
for(i=0;i<8;i++)
{
sda=(bit)(I_data&0x80);
I_data=I_data<<1;
;
scl=1;
delay();
scl=0;
}
;
;
sda=1;
;
;//准备接收ACK位
scl=1;
;
;//开始接收ack位
flag=0;
if(sda==0)flag=0;
elseflag=1;//返回(~I_cLOCk());
scl=0;
return(flag);
}
byteI_receive(void)//字节数据接收子程序
{
databytei;
byteI_data=0;
sda=1;
for(i=0;i<8;i++)
{
I_data*=2;
;
scl=0;
delay();
scl=1;
;
;
if(sda==1)I_data++;
;
;
}
scl=0;
;
;
;
sda=0;
if(flag1==0)//不是最后一个ACK
{
;
;
scl=1;
delay();
scl=0;
}
else//是最后一个ACK
{
sda=1;
;
;
scl=1;
delay();
scl=0;
flag1=0;
}
return(I_data);
}
voidmain()//主程序
{
databytei;
rom_sed[0]=0x00;rom_sed[1]=0x00;
rom_sed[2]=0x00;rom_sed[3]=0x55;
rom_sed[4]=0x23;rom_sed[5]=0x31;
rom_sed[6]=0x06;rom_sed[7]=0x92;
rom_sed[8]=0x99;
for(i=0;i<255;i++)delay();
I_start();
if(~I_send(0xa2))//pcf_write地址
{
if(~I_send(0x02))//pcf_status寄存器地址
{
for(i=0;i<9;i++)
{
if(~I_send(rom_sed[i]));
else;
}
I_stop();
}
else;
}
else;
start:I_start();
if(~I_send(0xa2))//pcf_write地址
{
if(~I_send(0x02))//pcf_status寄存器地址
{
I_start();
if(~I_send(0xa3))//写状态寄存器
{
for(i=0;i<7;i++)
{
if(i==6)
flag1=1;
else
flag1=0;
rom_rec[i]=I_receive();
switch(i)
{
case1:rom_rec[i]=rom_rec[i]&0x7f;break;
case2:
case3:rom_rec[i]=rom_rec[i]&0x3f;break;
case4:rom_rec[i]=rom_rec[i]&0x07;break;
case5:rom_rec[i]=rom_rec[i]&0x9f;break;
default:break;
}
}
I_stop();
}
}
}
gotostart;
}