|
#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() //結(jié)束信號
{
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() //初始化函數(shù)
{
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進(jìn)而在SCL的控制下發(fā)送出去
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進(jìn)行或運(yùn)算,依次把8個獨(dú)立的位放入1字節(jié)中完成接收
scl=0;
delay();
}
return k;
}
void writeadd(uchar address,uchar date)//向任一地址寫一字節(jié)的數(shù)據(jù)
{
start();
writebyte(0xa0);//發(fā)送從器件地址
respons();
writebyte(address); // 發(fā)送地址
respons();
writebyte(date);//發(fā)送數(shù)據(jù)
respons();
stop();
}
uchar readadd(uchar address)//從中任一地址讀取一字節(jié)的數(shù)據(jù)
{
uchar date;
start();
writebyte(0xa0);//發(fā)送從器件地址
respons();
writebyte(address);// 發(fā)送地址
respons();
start();
writebyte(0xa1);// 發(fā)送數(shù)據(jù)
date=readbyte();//讀數(shù)據(jù)
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);//讀出保存的數(shù)據(jù)賦給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;
}
}
|
|