#include <reg51.h>//头文件声明
sbit K1=P3^2;//按键的位声明
sbit d1=P3^7;//wei 12 的声明
sbit d2=P3^6;//wei 11 的声明
sbit d3=P3^5;//wei 10 的声明
sbit d4=P3^4;//wei 9 的声明
unsigned char LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//实现LED依次流水
unsigned char duan[]={0x88,0xaf,0x19,0x29,0x2e,0x68,0x48,0xad,0x08,0x28};//无小数点段码
unsigned char duan3[]={0x80,0xa7,0x11,0x21,0x26,0x60,0x40,0xa5,0x00,0x20};//有小数点段码
unsigned char wei1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//位
unsigned int ms;//毫秒
unsigned int k;//米
unsigned char i;//刷新数码管用的
unsigned int m;//秒
unsigned int f;//分
unsigned char h;//十分
unsigned char g;//小时
unsigned char v=0x01;
unsigned int km;//千米
unsigned int l;//显示费用用的
unsigned int o;
unsigned int q;
unsigned int w;
unsigned int n;
unsigned char y;
unsigned int r;
unsigned int a;
unsigned char c;
void shumaguan();//数码管的显示
void shijiandanwei();//时间单位判断
void tingzhi();
void main()
{
TMOD&=0xf0;
TMOD|=0x01;
TH0=64535/256;
TL0=64535%256;
TR0=1;
EA=1;
ET0=1;
PT0=1;//
IT1=1;
EX1=1;
IT0=1;
EX0=0;//打开外部中断和定时器中断
while(1)
{
if(K1==1)//
{
P1=LED[c];
if(c>=8)
{
c=0;
}
}
else if(K1==0)//
{
P1=0xff;
tingzhi();
}
shumaguan();
shijiandanwei();
}
}
void zhongduan() interrupt 1 //定时器1中断
{
TF0=0;
TH0=64535/256;
TL0=64535%256;
if(K1==1)
{
ms++;
a++;
}
else
{
ms=0;
a=0;
}
if(ms<=500)
{
wei1[8]=duan[f%10];
wei1[9]=duan[h%6];
wei1[10]=duan3[g%10];
wei1[11]=duan[g/10%10];
}
else if(ms>=500)
{
wei1[8]=duan[f%10];
wei1[9]=duan[h%6];
wei1[10]=duan[g%10];
wei1[11]=duan[g/10%10];
}
if(a==500)
{
a=0;
c++;
}
switch(i)//刷新数码管
{
// 尝试用来消除第三组的第1位的显示错误的方法,
case 0:d1=0;d2=0;d3=0;d4=0;i++;break;
case 1:P2=0x00;P0=0xff;i++;break;
//刷新第1组数码管
case 2:P2=0x08;P0=wei1[0];i++;break;
case 3:P2=0x04;P0=wei1[1];i++;break;
case 4:P2=0x02;P0=wei1[2];i++;break;
case 5:P2=0x01;P0=wei1[3];i++;break;
// 尝试用来消除第三组的第1位的显示错误的方法,
case 6:P2=0x00;P0=0xff;i++;break;
case 7:d1=0;d2=0;d3=0;d4=0;i++;break;
//刷新第2组数码管
case 8:P2=0x80;P0=wei1[4];i++;break;
case 9:P2=0x40;P0=wei1[5];i++;break;
case 10:P2=0x20;P0=wei1[6];i++;break;
case 11:P2=0x10;P0=wei1[7];i++;break;
// 尝试用来消除第三组的第1位的显示错误的方法,
case 12:P2=0x00;P0=0xff;i++;break;
case 13:d1=0;d2=0;d3=0;d4=0;i++;break;
//刷新第3组数码管
case 14:d1=1;d2=0;d3=0;d4=0;P0=wei1[8];i++;break;
case 15:d1=0;d2=1;d3=0;d4=0;P0=wei1[9];i++;break;
case 16:d1=0;d2=0;d3=1;d4=0;P0=wei1[10];i++;break;
case 17:d1=0;d2=0;d3=0;d4=1;P0=wei1[11];i++;break;
// 尝试用来消除第三组的第1位的显示错误的方法,
case 18:P2=0x00;P0=0xff;i++;break;
case 19:d1=0;d2=0;d3=0;d4=0;i=0;break;
}
}
void zhongduan1() interrupt 2 //外部中断
{
if(K1==1)
{k++;}
else
{k=0;}//米
}
void shumaguan()
{
//第1组数码管的显示
if(k>=100)//判断是否到了100米
{
k=0;
km++;
l++;
w++;
wei1[0]=duan[km%10];
wei1[1]=duan3[km/10%10];
wei1[2]=duan[km/100%10];
wei1[3]=duan[km/1000%10];
}
else
{
wei1[0]=duan[km%10];
wei1[1]=duan3[km/10%10];
wei1[2]=duan[km/100%10];
wei1[3]=duan[km/1000%10];
}
//第3组数码管的显示,显示时间。
if(ms>=1000)
{
ms=0;
m++;
if(m>=60)
{
m=0;
f++;
wei1[8]=duan[f%10];
wei1[9]=duan[h%6];
wei1[10]=duan[g%10];
wei1[11]=duan[g/10%10];
}
}
else
{
wei1[8]=duan[f%10];
wei1[9]=duan[h%6];
wei1[10]=duan[g%10];
wei1[11]=duan[g/10%10];
}
//小于三公里,第2组数码管的显示
if(w<=30)
{
o=1000;
wei1[4]=duan[o%10];
wei1[5]=duan[o/10%10];
wei1[6]=duan3[o/100%10];
wei1[7]=duan[o/1000%10];
}
//当大于3公里的时候,第2组数码管的显示
if(l>=10&&w>=30)
{
l=0;
n++;
r++;
n+=220;
q=n+1000;
q=q-r;
wei1[4]=duan[q%10];
wei1[5]=duan[q/10%10];
wei1[6]=duan3[q/100%10];
wei1[7]=duan[q/1000%10];
}
}
void shijiandanwei()
{
if(f>=10)
{
f=0;
h++;
if(h>=6)
{
h=0;
g++;
}
}
}
void tingzhi()
{
if(K1==0)
{
if(w>=30&&km%10!=0)
{
if(km>=30)
{
q+220;
wei1[4]=duan[q%10];
wei1[5]=duan[q/10%10];
wei1[6]=duan3[q/100%10];
wei1[7]=duan[q/1000%10];
}
}
if(w<=30)
{
o=1000;
wei1[4]=duan[o%10];
wei1[5]=duan[o/10%10];
wei1[6]=duan3[o/100%10];
wei1[7]=duan[o/1000%10];
}
//当大于3公里的时候,第2组数码管的显示
if(l>=10&&w>=30)
{
wei1[4]=duan[q%10];
wei1[5]=duan[q/10%10];
wei1[6]=duan3[q/100%10];
wei1[7]=duan[q/1000%10];
}
wei1[8]=duan[f%10];
wei1[9]=duan[h%6];
wei1[10]=duan[g%10];
wei1[11]=duan[g/10%10];
wei1[0]=duan[km%10];
wei1[1]=duan3[km/10%10];
wei1[2]=duan[km/100%10];
wei1[3]=duan[km/1000%10];
while(K1==0);
ms=0;
k=0;
i=0;
m=0;
f=0;
h=0;
g=0;
km=0;
l=0;
o=0;
q=0;
w=0;
n=0;
y=0;
r=0;
a=0;
c=0;
}
}