📄 数字时钟.c
字号:
#include<at89x52.h>
unsigned char code num[]={0xc0,0xdf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char hour=0,min=0,sec=0,dat,mon,year;
unsigned char sign=0,set=0;
unsigned int i=0,j=0;
void display();
void init();
void trans();
void delay(unsigned int);
void scan_key();
void set_min();
void set_hour();
void cov_data();
void display_data();
void set_dat();
void set_mon();
void set_year();
void main()
{
init();
year=9;mon=2;dat=11;
while(1)
{
trans();
display();
scan_key();
switch(set)
{
case 0:trans();break;
case 1:set_hour();break;
case 2:set_min();break;
default :break;
}
do
{
trans();
scan_key();
switch(set)
{
case 3:set_dat();break;
case 4:set_mon();break;
case 5:set_year();break;
case 6:display_data();break;
default :break;
}
}while(set!=0&&set!=1&&set!=2);
}
}
/*---------------定时器T0初始化------------*/
void init()
{
EA=1; //开启总中断
TMOD=0X01; //设置定时器零工作方式为1
ET0=1; //开启定时器0
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //装入初值
TR0=1; //开始定时
}
/*------------------定时中断-----------------*/
void set0_5() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //装入初值
i++;
}
/*------------时分秒转换---------------------*/
void trans()
{
if(i<100)
sign=0;
else
sign=1;
if(i>=200)
{
sec++;
i=0;
}
if(sec>=60)
{
min++;
sec=0;
}
if(min>=60)
{
hour++;
min=0;
}
if(hour>=24)
{
dat++;
hour=0;
}
}
/*-----------------显示函数----------------*/
void display()
{
P0=num[hour/10];
P2=0x7f;
delay(1);
P2=0xff;
P0=num[hour%10];
P2=0xbf;
delay(1);
P2=0xff;
P0=num[min/10];
P2=0xdf;
delay(1);
P2=0xff;
P0=num[min%10];
P2=0xef;
delay(1);
P2=0xff;
P0=num[sec/10];
P2=0xf7;
delay(1);
P2=0xff;
P0=num[sec%10];
P2=0xfb;
delay(1);
P2=0xff;
if(sign==0)
{
if(P2_6==0)
P0_7=0;
else
P0_7=1;
}
else P0_7=1;
}
/*------------ 延时函数---------------------*/
void delay(unsigned int z)
{
unsigned char b;
unsigned int a;
for(a=z;a>0;a--)
for(b=150;b>0;b--);
}
/*--------------扫描设置----------------------*/
void scan_key()
{
delay(1);
if(P1_0==0)
set++;
if(set>=7)
set=0;
while(P1_0==0)display(); /*按键未释放,在此等候*/
}
/*--------------小时设定--------------------*/
void set_hour()
{
unsigned char a;
if(P1_1==0)
delay(1);
if(P1_1==0)
{
while(P1_1==0)display();
hour++;
}
for(a=0;a<30;a--)
{
display();
delay(3);
}
}
/*----------------分钟设定---------------------*/
void set_min()
{
unsigned char a;
if(P1_1==0)
delay(1);
if(P1_1==0)
{
while(P1_1==0)display();
min++;
}
for(a=0;a<30;a--)
{
display();
delay(3);
}
}
/*------------------设定日期-------------------*/
void set_dat()
{
unsigned char a;
if(P1_1==0)
delay(1);
if(P1_1==0)
{
while(P1_1==0)display_data();
dat++;
}
for(a=0;a<30;a--)
{
display_data();
delay(3);
}
}
void set_mon()
{
unsigned char a;
if(P1_1==0)
delay(1);
if(P1_1==0)
{
while(P1_1==0)display_data();
mon++;
}
for(a=0;a<30;a--)
{
display_data();
delay(3);
}
}
void set_year()
{
unsigned char a;
if(P1_1==0)
delay(1);
if(P1_1==0)
{
while(P1_1==0)display_data();
year++;
}
for(a=0;a<30;a--)
{
display_data();
delay(3);
}
}
/*-------------------日期显示函数---------------*/
void display_data()
{
P2=0x7f;
P0=num[year/10];
delay(1);
P0=0xff;
P2=0xbf;
P0=num[year%10];
delay(1);
P0=0xff;
P2=0xdf;
P0=num[mon/10];
delay(1);
P0=0xff;
P2=0xef;
P0=num[mon%10];
delay(1);
P0=0xff;
P2=0xf7;
P0=num[dat/10];
delay(1);
P0=0xff;
P2=0xfb;
P0=num[dat%10];
delay(1);
P0=0xff;
cov_data();
}
/*---------日期转换函数----------------------*/
void cov_data()
{
switch(mon)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
{
if(dat>=31)
{
mon++;
dat=0;
}
}
case 4:case 6:case 9:case 11:
{
if(dat>=30)
{
mon++;
dat=0;
}
}
case 2:
if(year%4==0)
{
if(dat>=29)
{
mon++;
dat=0;
}
}
if(year%4!=0)
{
if(dat>=28)
{
mon++;
dat=0;
}
}
}
if(mon>=12)
{
year++;
mon=0;
}
if(year>=99)
year=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -