#include #define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=0;
uchar mstcnt=0;
uchar years=13;
uchar months=6;
uchar days=29;
uchar mstcnt1=0;
uchar seconde1=0;
uchar minite1=0;
uchar hour1=0;
uchar slnum=0;
uchar flag=1,flag1=1;
sbit P3_0=P3^0; // second 调整定义
sbit P3_1=P3^1; //minite调整定义
sbit P3_2=P3^2; //hour调整定义
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit LE=P3^7;
/*函数声明*/
void time_pro( ); //时间处理子程序
void display( ); //times显示子程序
void display1( ); //dates显示子程序
void display2( );
void keyscan( ); //键盘扫描子程序
void init();
/*****************************/
/*延时子程序*/
/****************************/
void delay (uint z)
{uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒钟设为60进制
{ seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==24) //时钟设为24进制
{hour=0; }
}
}
}
/*****************************/
/*times显示子程序*/
/*****************************/
void display(void)
{
P2=0xfe;
P0=dispcode[hour/10]; //显示小时的十位
delay(5);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80; //显示小时的个位
delay(5);
P2=0xfb;
P0=dispcode[minite/10]; //显示分的十位
delay(5);
P2=0xf7;
P0=(dispcode[minite%10])|0X80; //显示分的个位
delay(5);
P2=0xef;
P0=dispcode[seconde/10]; //显示秒的十位
delay(5);
P2=0xdf;
P0=dispcode[seconde%10]; //显示秒的个位
delay(5);
}
/*****************************/
/*dates显示子程序*/
/*****************************/
void display1(void)
{
P2=0xfe;
P0=dispcode[years/10]; //显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(years%10)])|0X80; //显示小时的个位
delay(4);
P2=0xfb;
P0=dispcode[months/10]; //显示分的十位
delay(4);
P2=0xf7;
P0=(dispcode[months%10])|0X80; //显示分的个位
delay(4);
P2=0xef;
P0=dispcode[days/10]; //显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[days%10]; //显示秒的个位
delay(4);
}
void display2(void)
{
P2=0xfe;
P0=dispcode[hour1/10]; //显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(hour1%10)])|0X80; //显示小时的个位
delay(4);
P2=0xfb;
P0=dispcode[minite1/10]; //显示分的十位
delay(4);
P2=0xf7;
P0=(dispcode[minite1%10])|0X80; //显示分的个位
delay(4);
P2=0xef;
P0=dispcode[seconde1/10]; //显示秒的十位
delay(4);
P2=0xdf;
P0=dispcode[seconde1%10]; //显示秒的个位
delay(4);
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
TH0=0x3c;
TMOD = 0x11;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0; //对计数单元的清零
}
}
void T1_time() interrupt 3
{
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
mstcnt1++;
if(mstcnt1==1)
{
mstcnt1=0;
seconde1++;
if(seconde1==99)
{
seconde1=0;
minite1++;
if(minite1==60)
{
minite1=0;
hour1++;
if(hour1==60)
{
hour1=0;
}
}
}
}
}
void keyscan (void)
{
if(P3_0==0) //按键1秒的调整
{
delay(10);
if(P3_0==0)
{ if(flag==1)
{
seconde++;
if(seconde==60)
{seconde=0; }
}
else if(flag==2)
{
days++;
if(days==32)
{
days=1;
}
}
else
{}
while(!P3_0);
}
}
if(P3_1==0) //按键2分的调整
{
delay(10);
if(P3_1==0)
{if(flag==1)
{
minite++;
if(minite==60)
{minite=0;}
}
else if(flag==2)
{months++;
if(months==13)
{
months=1;
}
}
else
{}
while(!P3_1);
}
}
if(P3_2==0) //按键3小时的调整
{
delay(30);
if(P3_2==0)
{ if(flag==1)
{
hour++;
if(hour==24)
{hour=0; }
}
else if(flag==2)
{
years++;
if(years==21)
{
years=13;
}
}
else
{}
while(!P3_2);
}
}
if(P3_3==0)
{
delay(10);
if(P3_3==0)
{
flag++;
if(flag==4)
{
flag=1;
}
while(!P3_3);
}
}
if(P3_4==0)
{
delay(10);
if(P3_4==0)
{
TR1=1;
}
}
if(P3_5==0)
{
delay(10);
if(P3_5==0)
{
TR1=0;
display2();
}
while(!P3_5);
}
if(P3_6==0)
{
delay(10);
if(P3_6==0)
{
hour1=0;
minite1=0;
seconde1=0;
}
while(!P3_5);
}
}
void init()
{
P1=0xff; //初始化p1口,全设为1
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
ET1=1;
TR1=1;
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{
init();
P1=0xff; //初始化p1口,全设为1
TMOD =0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
if(flag==1)
{
display( );//显示时间
}
else if(flag==2)
{
display1();
}
else
{
display2();
}
}
}