#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar SegCode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar Recorded_data[20];//记录数据值
//**********************************
//number 计数值
//Key_State 1为计时器启动 0为关闭
//x,y都为Recorded_data[20]的索引值
//mode P33(s4)的工作模式 1时记录数据 0时显示记录的数据
//**********************************
uchar number,Key_State,x,y,i,mode;
sbit P31=P3^1;//s2
sbit P32=P3^2;//s3
sbit P33=P3^3;//s4
void Delay1ms(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Seg_Display(uchar temp)
{
P2=0x02;
P0=~SegCode[temp/100];
Delay1ms(1);
P2=0x08;
P0=~SegCode[temp%10];
Delay1ms(1);
P2=0x04;
P0=~SegCode[temp/10]+0X80;
Delay1ms(1);
}
void Timer_State()
{
//计数器模式
if(P33==0)
{
Delay1ms(20);
while(P33==0);
Delay1ms(20);
Key_State++;Key_State=Key_State%2;
TR0=Key_State;mode=Key_State;
}
//清零
if(P32==0)
{
Delay1ms(20);
while(P32==0);
Delay1ms(20);
number=0;i=0;mode=1;TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
//查询计时模式
if(mode)
{
if(P31==0)
{
Delay1ms(20);
while(P31==0);Delay1ms(20);
Recorded_data[x]=number;
x++;x=x%20;//防溢出
}
}
else
{
if(P31==0)
{
Delay1ms(20);
while(P31==0);Delay1ms(20);
y++;y=y%20;//防溢出
}
}
}
void Timer0_Init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
}
void main()
{
Timer0_Init();
P0=0x00;
P2=0x00;
while(1)
{
Timer_State();
if(mode) Seg_Display(number);
else Seg_Display(Recorded_data[y]);
}
}
void Counter()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==10)
{
number++;
i=0;
if(number==1000)
{
number=0;
}
}