/*--------------------------------------------------------------------------------------
程序功能：99秒计数器，数据掉电后不丢失。

注：全新的AT24C02芯片或已被写入过数据时，程序中读出来的数据可能会是一个255或是其它数字，
因此开发板第一次显示的数字是不确实的，当计数加到100之后，它就会归零，重新计数。
----------------------------------------------------------------------------------------*/

#include <reg52.h>
#include "i2c.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uint num,disnum,t;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管段选编码

delay1(uchar x)   //延时函数
{
	uchar a,b;
	for(a=x;a>0;a--)
		for(b=200;b>0;b--);
}

display(uint disnum)   //数码管显示函数
{
	P0=table_du[disnum/10];    //十位上的数
	dula=1;
	dula=0;
	P0=0xfe;   //第1个数码管位选值
	wela=1;
	wela=0;
	delay1(10);  

	P0=table_du[disnum%10];   //个位上的数
	dula=1;
	dula=0;
	P0=0xfd;    //第2个数码管位选值
	wela=1;
	wela=0;
	delay1(10);
}

init_time0()  //定时器0初始化
{
	EA=1;
	ET0=1;
	TMOD=0X01;
	TH0=(65536-50000)/256;  //给定时器0装初值，12M晶振定时时间为50ms
	TL0=(65536-50000)%256;
	TR0=1;
}

void main()
{
	start();     //单片机给24C02芯片发送一个始起信号   
	disnum=read_at24c02(10);   //在24C02的地址10中读出保存的数据赋给disnum
	init_time0();
	while(1)
	{
		display(disnum);   //数码管显示
		if(t==1)
		{
			t=0;   //清零
			write_at24c02(10,disnum);  //在24C02的地址10中写入数据disnum
		}
	}
}

void time0() interrupt 1     
{
	TH0=(65536-50000)/256;   //重装初值，12M晶振隔间50ms重装一次
	TL0=(65536-50000)%256;
	num++;    //每中断一次，num的值加1
	if(num==20)  //如果到了20次，说明1秒时间到了
  	{
    num=0;     //然后把num的值清0，让它重新再计20次
    disnum++;  	//每到1秒钟，disnum的值加1
    t=1;     //1秒写一次24C02
    if(disnum==100) //定时100秒，在从零开始计时
      {disnum=0;}
 	}	
}


