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

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

void display(uint disnum)   //数码管显示函数
{
	P0=table_du[disnum/100];
	dula=1;
	dula=0;
	P0=0xfe;
	wela=1;
	wela=0;
	delay_ms(10);

	P0=table_du[disnum%100/10];
	dula=1;
	dula=0;
	P0=0xfd;
	wela=1;
	wela=0;
	delay_ms(10);

	P0=table_du[disnum%100%10];
	dula=1;
	dula=0;
	P0=0xfb;
	wela=1;
	wela=0;
	delay_ms(10);
}

init_Timer0()  //定时器0初始化
{
	EA=1;
	ET0=1;
	TMOD=0X01;
	TH0=(65536-20000)/256;    //使定时器20ms中断一次
	TL0=(65536-20000)%256;
}

void main()    //主函数
{	
	start();    //单片机给24C02芯片发送一个始起信号   
	disnum=read_at24c02(10);   //在24C02的地址10中读出保存的数据赋给disnum
	init_Timer0();  //定时器0初始化
TR0=1;       //起动定时器0，让显示函数display(disnum) 循环扫描显示
key=1;       //先给S2按键对应的I/O口置1，方便下面做按键检测
	while(1)      //进入大循环不断检测有没S2按键按下
	{
		if(!key)
		{
			delay_ms(50);
			if(!key)
			{
				while(!key);
				disnum++;       //若S2按键被按下，disnum的值自加1
				if(disnum>100)   //如果disnum的值大于100，清零
				{
				disnum=0;
				}
				write_at24c02(10,disnum);  //在24C02的地址10中写入数据disnum
			}
		}	
	}	
}

void time0() interrupt 1  //定时器0服务中断函数
{
	TH0=(65536-20000)/256; 
	TL0=(65536-20000)%256;
	display(disnum);    //每间隔20ms数码管显示函数循环显示一次
}