PCF8563时钟程序
#include<reg51.h>
#include<stdlib.h>
#define byte unsigned char
sbit scl=0x81; //定义串行I/O口
sbit sda=0x80;
idata byte rom_sed[9];
idata byte rom_rec[7];
idata byte j,k;
bit flag,flag1;
void delay(void) //延时子程序
{
data byte i;
for(i=0;i<6;i++);
}
void I_start(void) //发送I2C总线起始条件子程序
{
sda=1;
;
scl=1;
delay();
sda=0;
delay();
scl=0;
;
}
void I_stop(void) //I2C总线停止条件子程序
{
sda=0;
;
scl=1;
delay();
sda=1;
delay();
}
bit I_send(byte I_data) //字节数据传送子程序
{
data byte i;
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;
else flag=1; //返回(~I_cLOCk());
scl=0;
return(flag);
}
byte I_receive(void) //字节数据接收子程序
{
data byte i;
byte I_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);
}
void main() //主程序
{
data byte i;
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)
{
case 1:rom_rec[i]=rom_rec[i]&0x7f;break;
case 2:
case 3:rom_rec[i]=rom_rec[i]&0x3f;break;
case 4:rom_rec[i]=rom_rec[i]&0x07;break;
case 5:rom_rec[i]=rom_rec[i]&0x9f;break;
default:break;
}
}
I_stop();
}
}
}
goto start;
}