|
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code duanxuan[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff};
uchar tt=0;
uchar month=10,day=1,sec=0,min=0,hour=0,b;
uint year=2016;
sbit key0=P1^0; //复位键
sbit key1=P1^1; //秒加1键
sbit key2=P1^2; //分加1键
sbit key3=P1^3; //时加1键
sbit key4=P1^4; //日加1键
sbit key5=P1^5; //月加1键
sbit key6=P1^6; //年加1键
//******************延时函数****************
void delay(uint k)
{
uchar j;
while((k--)!=0)
{
for (j=0;j<250;j++);
}
}
//*****************显示函数*****************
void disPlay()
{
P3=0x80; //秒和日的个位显示
P0=duanxuan[sec%10]; //显示秒的个位
P2=duanxuan[day%10]; //显示日的个位
delay(1);
P3=0x40; //秒和日的十位显示
P0=duanxuan[sec/10]; //显示秒的十位
P2=duanxuan[day/10]; //显示日的十位
delay(1);
P3=0x20; //时钟显示“-”,日期显示月的个位
P0=duanxuan[10]; //调数组元素,显示“-”
P2=duanxuan[month%10]; //显示月的个位
delay(1);
P3=0x10; //分的个位显示和月的十位显示
P0=duanxuan[min%10]; //显示分的个位
P2=duanxuan[month/10]; //显示月的十位
delay(1);
P3=0x08; //分的十位显示和年的个位显示
P0=duanxuan[min/10]; //显示分的十位
P2=duanxuan[year%10]; //显示年的个位
delay(1);
P3=0x04; //时钟显示“-”,日期显示年的十位
P0=duanxuan[10]; //显示“-”
P2=duanxuan[year/10%10]; //显示年的十位
delay(1);
P3=0x02; //小时的个位和年的百位显示
P0=duanxuan[hour%10]; //显示秒的个位
P2=duanxuan[year/100%10];//显示年的百位
delay(1);
P3=0x01; //小时的十位和年的千位显示
P0=duanxuan[hour/10]; //显示分的十位
P2=duanxuan[year/1000]; //显示年的个位
delay(1);
}
//**************************闰年判断******************
void runnian()
{
if((year%4==0)&&(year%100!=0)||(year%400)==0) //判断是否为闰年
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) //每月31天的月份
{b=32;}
if((month==4)||(month==6)||(month==9)||(month==11)) //每月30天的月份
{b=31;}
if((month==2)) //如是闰年,2月为29天
{b=30;}
}
else
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) //每月31天的月份
{b=32;}
if((month==4)||(month==6)||(month==9)||(month==11)) //每月30天的月份
{b=31;}
if((month==2)) //如不是闰年,2月为28天
{b=29;}
}
}
/**************************按键调整时间函数*****************/
void keyscan() //按键控制函数
{
if (key0==0)
{
delay(30); //去抖动
if (key0==0)
{
sec=0; min=0; hour=0; year=2014;
month=10; day=1; //复位键被按下,恢复初始值
}
}
if (key1==0) //判断“秒”的调整键是否被按下
{
delay(30); //去抖动
if (key1==0)
{
sec++; //是“秒”的按键被按下,每按键一次加1
if (sec==60) //若秒的变量sec加到60,则sec清零
{
sec=0;
}
}
}
if (key2==0) ////判断“分”的调整键是否被按下
{
delay(30); //去抖动
if (key2==0)
{
min++; //是“分”的按键被按下,每按键一次加1
if (min==60) //若秒的变量min加到60,则min清零
{
min=0;
}
}
}
if (key3==0) ////判断“时”的调整键是否被按下
{
delay(30); //去抖动
if (key3==0)
{
hour++; //是“时”的按键被按下,每按键一次加1
if (hour==24) //若时的变量hour加到24,则hour清零
{
hour=0;
}
}
}
if (key4==0) ////判断“日”的调整键是否被按下
{
delay(30); //去抖动
if (key4==0)
{
day++; //是“日”的按键被按下,每按键一次加1
if (day==32) //若日的变量day加到32,则day=1
{
day=1;
}
}
}
if (key5==0) //判断“月”的调整键是否被按下
{
delay(30); //去抖动
if (key5==0)
{
month++; //是“月”的按键被按下,每按键一次加1
if (month==13) //若月的变量month加到13,则month=1
{
month=1;
}
}
}
if (key6==0) //判断“年”的调整键是否被按下
{
delay(30); //去抖动
if (key6==0)
{
year++; //是“年”的按键被按下,每按键一次加1
if (year==2500) //若年的变量year加到2500,则year=2016
{
year=2016;
}
}
}
}
//*************************主函数******************
void main()
{
TMOD=0x10; //初始化
ET0=1; //开定时器T0中断
TR0=1; //启动定时器T0
TH0=(65536-50000) /256; //赋定时50ms初值
TL0=(65536-50000) %256;
EA=1; //开中断总开关
while(1)
{
keyscan();
}
}
//***************定时器T0中断函数*****************
void time1() interrupt 1
{
TH0=(65536-50000) /256; //赋定时50ms初值
TL0=(65536-50000) %256;
disPlay(); //调用显示函数
tt++; //计中断次数,中断20次为1s
if (tt=20)
{
tt=0; //如计满1s,tt清零
sec++; //秒加1
if (sec==60) //如计满60s,变量sec清0
{
sec=0;
min++; //分加1
if (min==60) //如计满60min,变量min清0
{
min=0;
hour++; //时加1
if (hour==24)//如计满24小时,变量hour清0
{
hour=0;
day++; //日加1
runnian();//调用闰年函数,确定每月的天数
if (day==b) //根据每天的天数值b,判断是否要月加1
{
day=1;
month++; //月加1
if (month==13) //如计满12个月,变量month清零
{
month=1;
year++; //年加1
}
}
}
}
}
}
}
|
评分
-
查看全部评分
|