//2010/1/2 18:38 complete
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit ln=P2^1;
sbit ls=P2^0;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit mode=P1^4;
uchar code table[]="0123456789";
uchar code table1[]=":.-";
uchar code table2[]="Number";
uchar code table3[]="MONTUEWEDTHUFRISATSUN";
uchar t=0,i,aa=0,bb=0,flag=0,month,day,week,hour,min,sec,min2=0,sec2=0,secp=0,num=0,max,flag2=0;
uchar mins[20]=0,secs[20]=0,secps[20]=0;
int year;
bit write=0;
sbit sda=P2^7;
sbit scl=P2^6;
void delay0()
{;;}
void start()
{
sda=1;
delay0();
scl=1;
delay0();
sda=0;
delay0();
}
void stop()
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
delay0();
}
void respons()
{
unsigned char i;
scl=1;
delay0();
while((sda==1)&&(i<250))
i++;
scl=0;
delay0();
}
void init_24c02()
{
sda=1;
delay0();
scl=1;
delay0();
}
void write_byte(unsigned char date)
{
unsigned char i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay0();
sda=CY;
delay0();
scl=1;
delay0();
}
scl=0;
delay0();
sda=1;
delay0();
}
unsigned char read_byte()
{
unsigned char i,k;
scl=0;
delay0();
sda=1;
delay0();
for(i=0;i<8;i++)
{
scl=1;
delay0();
k=(k<<1)|sda;
scl=0;
delay0();
}
return k;
}
void write_add(unsigned char address,unsigned char date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
char read_add(unsigned char address)
{
unsigned char date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void delay(int z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
ls=0;
P0=com;
delay(5);
ln=1;
delay(5);
ln=0;
}
void write_data(uchar date)
{
ls=1;
P0=date;
delay(5);
ln=1;
delay(5);
ln=0;
}
void displaytime(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(table[shi]);
write_data(table[ge]);
}
void displaydate(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(table[shi]);
write_data(table[ge]);
}
void displayyear(date)
{
uchar qian,bai,shi,ge;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x01);
write_data(table[qian]);
write_data(table[bai]);
write_data(table[shi]);
write_data(table[ge]);
}
void displayweek(date)
{
write_com(0x80+0x0d);
for(i=0;i<3;i++)
{
write_data(table3[(date-1)*3+i]);
}
}
void init()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1; //开总中断
ln=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
hour=read_add(1);
min=read_add(2);
sec=read_add(3);
year=read_add(4)+2010;
month=read_add(5);
day=read_add(6);
week=read_add(7);
displayyear(year);
write_data(table1[2]);
displaydate(6,month);
write_data(table1[2]);
displayweek(week);
displaydate(9,day);
displaytime(4,hour);
write_data(table1[0]);
displaytime(7,min);
write_data(table1[0]);
displaytime(10,sec);
}
void init2()
{
TMOD=0x10;
ET1=1;
TR1=0; //定时器1关闭
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
secp=0;
write_com(0x80+0x40+0x03); //显示number
for(i=0;i<6;i++)
write_data(table2[i]);
displaydate(4,min2);
write_com(0x80+0x06);
write_data(table1[0]);
displaydate(7,sec2);
write_com(0x80+0x09);
write_data(table1[1]);
displaydate(10,secp);
displaydate(0x40+0x0a,num);
}
void display2()
{
displaydate(10,secp);
displaydate(0x40+0x0a,num);
displaydate(7,sec2);
displaydate(4,min2);
}
void clear()
{
min2=0;sec2=0;num=0;secp=0;
for(i=0;i<max;i++)
{
mins[i]=0;secs[i]=0;secps[i]=0;
}
max=0;ET1=0;
}
void keyscan()
{
if(k1==0&&flag2!=0)
{
delay(5);
if(k1==0&&flag2!=0)
{
flag=0; delay(5); flag2=0; ET1=0; init(); TR0=0;TR0=1; ET0=1; write_com(0x0c); clear();
}
while(k1==0);
}
if(k1==0)
{
delay(5);
if(k1==0)
{
flag++;
if(flag==1)
{
ET0=0;
delay(5);
init2();
}
switch(flag)
{
case 2 : ET1=0; init(); TR0=0; write_com(0x80+0x40+0x04); write_com(0x0f); break;
case 3 : write_com(0x80+0x40+0x07); break;
case 4 : write_com(0x80+0x40+0x0a); break;
case 5 : write_com(0x80+0x01); break;
case 6 : write_com(0x80+0x06); break;
case 7 : write_com(0x80+0x09); break;
case 8 : write_com(0x80+0x0d); break;
case 9 : flag=0; TR0=1; ET0=1; write_com(0x0c); clear(); break;
}
}
while(k1==0);
}
if(k2==0)
{
delay(5);
if(k2==0)
{
if(flag==1)
{
if(ET1==0)
{
min2=0;sec2=0;num=0;secp=0;
for(i=0;i<max;i++)
{
mins[i]=0;secs[i]=0;secps[i]=0;
}
max=0;ET1=1;
while(k2==1);
}
if(TR1==1)
{
num++;
mins[num]=min2;
secs[num]=sec2;
secps[num]=secp;
TR1=0;
ET1=0;
max=num;
while(k2==1);
}
}
switch(flag)
{
case 2 : if(hour<23) hour++; else hour=0; write_add(1,hour); displaytime(4,hour); write_com(0x80+0x40+0x04); break;
case 3 : if(min<59) min++; else min=0; write_add(2,min); displaytime(7,min); write_com(0x80+0x40+0x07); break;
case 4 : if(sec<59) sec++; else sec=0; write_add(3,sec); displaytime(10,sec); write_com(0x80+0x40+0x0a); break;
case 5 : year++; write_add(4,year-2010); displayyear(year); write_com(0x80+0x01); break;
case 6 : if(month<12) month++; else month=1; write_add(5,month); displaydate(6,month);write_com(0x80+0x06); break;
case 7 : if(day<31) day++; else day=1; write_add(6,day); displaydate(9,day); write_com(0x80+0x09); break;
case 8 : if(week<7) week++; else week=1; write_add(7,week); displayweek(week); write_com(0x80+0x0d); break;
}
}
while(k2==0);
}
if(k3==0)
{
delay(5);
if(k3==0)
{
if(flag==1)
{
if(ET1==1&&TR1==1)
{
num++;
flag2++;
mins[num]=min2;
secs[num]=sec2;
secps[num]=secp;
while(k3==0)
display2();
}
if(ET1==1&&TR1==0)
{
TR1=1;
flag2++;
}
if(ET1==0)
{
if(num>1)
num--;
min2=mins[num];
sec2=secs[num];
secp=secps[num];
}
}
switch(flag)
{
case 2 : if(hour>0) hour--; else hour=23; write_add(1,hour); displaytime(4,hour); write_com(0x80+0x40+0x04); break;
case 3 : if(min>0) min--; else min=59; write_add(2,min); displaytime(7,min); write_com(0x80+0x40+0x07); break;
case 4 : if(sec>0) sec--; else sec=59; write_add(3,sec); displaytime(10,sec); write_com(0x80+0x40+0x0a); break;
case 5 : year--; write_add(4,year-2010); displayyear(year); write_com(0x80+0x01); break;
case 6 : if(month>1) month--; else month=12; write_add(5,month); displaydate(6,month); write_com(0x80+0x06); break;
case 7 : if(day>1) day--; else day=31; write_add(6,day); displaydate(9,day); write_com(0x80+0x09); break;
case 8 : if(week>1) week--; else week=7; write_add(7,week); displayweek(week); write_com(0x80+0x0d); break;
}
}
while(k3==0);
}
if(k4==0)
{
delay(5);
if(k4==0&&ET1==0)
{
if(num<max)
num++;
min2=mins[num];
sec2=secs[num];
secp=secps[num];
}
}
while(k4==0);
}
void main()
{
init();
init_24c02();
ET0=1; //计时器0开启
TR0=1; //计时器打开
while(1)
{
keyscan();
if(flag==1)
{
display2();
}
}
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
aa++;
if(aa==200)
{
aa=0;
sec++;
if(sec==6