/***********自动化101班33号周强*********/
//头文件
#include
***it ADS=P1^0;
***it ADM=P1^1;
***it ADH=P1^2;
unsigned ADS_bit=0,ADM_bit=0,ADH_bit=0;
unsigned counter=0,second=0,minute=0,hour=0; //定义,秒,分,时
unsigned char Seg[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0x40}; //定义数码管0-9的数字显示和“—”,即它们中间的分段
unsigned char Com[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; //定义8个数码管的亮灭数组
//延时程序
void delay(unsigned int j)
{
int i;
for(i=0;i
}
void time0 (void)
{
TMOD=0x01;
TH0=0xf8;
TL0=0xcb;
TR0=1;
ET0=1;
EA=1;
}
void timer0(void) interrupt 1
{
TR0=0;
ET0=0;
TH0=0xf8;
TL0=0xcb;
TR0=1;
ET0=1;
counter++;
if(counter>1000)
{
counter=0;
second++; //首先让秒自加
if(second==60) //因为大家都知道秒是只能跑60秒的,所以这里定义如果到60时,返回0
{
second=0;
minute++; //同时分开始自加
}
if(minute==60) //接下来是分,同样不能超过62,反0
{
minute=0;
hour++; //同时时自加
}
if(hour==24) //因为是24小时,而达不到,在这里定义等于23时,反0
{
hour=0;
}
}
}
void Keyplay()
{
if(ADS==0){ADS_bit=1;}
if((ADS)&&(ADS_bit)){ADS_bit=0;second++;if(second==60)second=0;}
if(ADM==0){ADM_bit=1;}
if((ADM)&&(ADM_bit)){ADM_bit=0;minute++;if(minute==60)minute=0;}
if(ADH==0){ADH_bit=1;}
if((ADH)&&(ADH_bit)){ADH_bit=0;hour++;if(hour==24)hour=0;}
}
//数码管扫描
void Segplay()
{
int i; //定义i
for(i=0;i<8;i++) //执行for语句,用于switch
{ //调用判断进位的子函数
switch(i)
{
case 0: ;
P3=Com[8];P3=Com[7]; //先让数码管全亮,让运动的一个数码管熄灭,再用下面的程序亮起来跑秒
P0=Seg[second%10]; //对十取余,利用查表法,用Seg数组达到跑秒的效果
delay(500);break; //延时1s,关闭数码管
case 1:
P3=Com[8];P3=Com[6]; //同上
P0=Seg[second/10]; //对十取整,使个位进位
delay(500);break; //同上
case 2:
P3=Com[8];P3=Com[5]; //同理
P0=Seg[10];
delay(500);break;
case 3:
P3=Com[8];P3=Com[4]; //同理
P0=Seg[minute%10];
delay(500);break;
case 4:
P3=Com[8];P3=Com[3]; //同理
P0=Seg[minute/10];
delay(500);break;
case 5:
P3=Com[8];P3=Com[2]; //同理
P0=Seg[10];
delay(500);break;
case 6:
P3=Com[8];P3=Com[1]; //同理
P0=Seg[hour%10];
delay(500);break;
case 7:
P3=Com[8];P3=Com[0]; //同理
P0=Seg[hour/10];
delay(500);
}
}
}
//主函数
void main(void)
{
time0();
while(1)
{
Keyplay();
Segplay(); //调用数码管子函数
}
}
|