#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
bit write=0;
sbit scl=P2^1;
sbit sda=P2^0;
uchar sec,tcnt;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint x,y;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{ ; ; }
void delay1ms(uint z)
{
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start() //开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //结束信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0;
delay();
}
void init() //初始化函数
{
sda=1;
delay();
scl=1;
delay();
}
void writebyte(uchar date) //写
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;//将temp左移一位,最高位移入CY位,然后将CY赋给SDA进而在SCL的控制下发送出去
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar readbyte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;//将k左移一位后与SDA进行或运算,依次把8个独立的位放入1字节中完成接收
scl=0;
delay();
}
return k;
}
void writeadd(uchar address,uchar date)//向任一地址写一字节的数据
{
start();
writebyte(0xa0);//发送从器件地址
respons();
writebyte(address); // 发送地址
respons();
writebyte(date);//发送数据
respons();
stop();
}
uchar readadd(uchar address)//从中任一地址读取一字节的数据
{
uchar date;
start();
writebyte(0xa0);//发送从器件地址
respons();
writebyte(address);// 发送地址
respons();
start();
writebyte(0xa1);// 发送数据
date=readbyte();//读数据
stop();
return date;
}
void display(uchar yiwei,uchar erwei)
{
LSA=0;
LSB=0;
LSC=0;
P0=table[erwei];
delay1ms(10);
LSA=1;
LSB=0;
LSC=0;
P0=table[yiwei];
delay1ms(10);
}
void main()
{
init();
sec=readadd(2);//读出保存的数据赋给sec
if(sec>100)
sec=0;
TMOD=0x01;
ET0=1;
EA=1;
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(1)
{
display(sec/10,sec%10);
if(write==1)
{
write=0;
writeadd(2,sec);
}
}
}
void time0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
tcnt++;
if(tcnt==20)
{
tcnt=0;
sec++;
write=1;
if(sec==100)
sec=0;
}
}
|