搜档网
当前位置:搜档网 › 单片机时间,日期,的显示

单片机时间,日期,的显示

#include
#define uint unsigned int
#define uchar unsigned char
#define duanx P0
#define weix P2
sbit leg=P1^7 ;
sbit wei=P1^4 ;
sbit jia=P1^5 ;
sbit jian=P1^6 ;
uchar h=23,min=59,s=55;
uchar w=6;
uchar year=12,math=1,day=7;
uint jishu=0,legg=0,weij=0;
uchar code days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf};

/*************************************************/

//功能:延时函数



/*************************************************/

void delay(uint xms)
{
uint i,j;
for(i=0;ifor(j=0;j<123;j++);
}

/***************************************************************/

//功能:显示星期子函数

/****************************************************************/
void week(uchar y,uchar m,uchar d)
{
unsigned char day;
day=days[m-1];//月表
w=day>>5;//月星期数
day&=0x1f;//月天数
if((m<3)&&(y&0x03))
{//平年
if(m==2)
day--;//平年月天数
w++;//平年月表+1
}
y=y+(y>>2);//年+年/4
w=(w+y+d+2)%7;//(星期=年+年/4+月表+2日)%7
//return w;//返回星期和月天数
}
/***************************************************************/

//功能:初始化

/****************************************************************/
void timer2_uinit()
{
//定时器初始化
TMOD=0x02;
TH0=0x06;
TL0=0x06;
EA=1;
ET0=1;
TR0=1;
PT0=1;

//外部中断初始化
INT1=1;
IT1=1;
EX1=1;
EA=1;

}

/***************************************************************/

//功能:定时器的中断

/****************************************************************/

void timer2_int(void) interrupt 1
{
jishu++;
if(jishu==4000)
{
jishu=0;
s++;

if(s==60)
{
s=0;
min++;
if(min==60)
{
min=0;
h++;
if(h==24)
{
week(2000+year,math,day);
day++;
h=0;
if(math==2)
{
if(((2000+year)%400==0)||((2000+year)%100!=0&&(2000+year)%4==0))
{
if(day==30)
{
day=1;
math++;
}
}
else if(day==29)
{
day=1;
math++;
}
}
else if(day==(days[math]+1))
{
day=1;
math++;
if(math==13)
{
math=1;
year++;
}
}
}
}
}
}
}

/***************************************************************/

//功能:外部中的中断

/****************************************************************/

void wbzd_init(void) interrupt 2
{
if(leg==0) //选择显示的内容
legg++;
switch(legg%3)
{

case 0 : legg=0; break;
case 1 : legg=1; break;
case 2 : legg=2; break;

}
if(wei==0) //选择调整的位置
weij++;
switch(weij%8)
{
case 1 :
case 2 :
case 3 : legg=1; break;
case 4 :
case 5 :
case 6 : legg=0; break;

case 7 : legg=2; break;
case 0 : leg=1; break;
}
if(jia==0) //在选定的位置上 加一
{
switch(weij%7)
{
case 1 : year++;
if(year==100)
year=0;
break;
case 2 : math++;
if(math==13)
math=1;
break;
case 3 : day++;
if(math==2)
if(((2000+year)%400==0)||((2000+year)%100!=0&&(2000+year)%4==0))
{
if(day==29)
day=1;
}
else
if(day==29)
day=1;
break;
case 4 : h++;
if(h==24)
h=0;
break;
case 5 : min++;
if(min==60)
min=0;
break;
case 6 : s++;
if(s==60)
s=0;
break;
case 0 : w++;
if(w==7)
w=0;
break;
}
}
if(jian==0) //在选定的位置上 减一
{
switch(weij%7)
{
case 1 : year--;
if(year==255)
year=99;
break;
case 2 : math--;
if(math==0)
math=12;
break;
case 3 : day--;
if(math==2)
if(((2000+year)%400==0)||((2000+year)%100!=0&&(2000+year)%4==0))
{
if(day==0)
day=29;
}
else
{
if(day==0)
day=28;
}
break;
case 4 : h--;
if(h==255)
h=23;
break;
case 5 : min--;
if(min==255)
min=59;
break;
case 6 : s--;
if(s==255)
s=59;
break;
case 0 : w--;
if(w==255)
w=6;
break;
}
}

}

/***************************************************************/

//功能:显示十位,个位 的数字

/****************************************************************/

void display(uchar numd,uchar nums,uchar numg)
{

duanx=table[numd/10];
weix=nums;
delay(1);
duanx=table[numd%10];
weix=numg;
delay(1);
}

/***************************************************************/

//功能:显示时,分,秒之间的 ‘ -- ’

/****************************************************************/

void display1(uchar a,uchar b)
{
duanx=table[10];
weix=a;
delay(1);
weix=b;
delay(1);
}
/***************************************************************/

//功能:星期的显示

/****************************************************************/
void display2(uchar w)
{
duanx=table[w];
weix=0;
}

/***************************************************************/

//功能:时间,日期,星期的相互转化

/****************************************************************/


void main(void)
{
week(2000+year,math,day);
timer2_uinit();
while(1)
{
if(legg==0)
{
display(s,1,0);
display(min,4,3);
display(h,7,6);
display1(2,5);
}
if(legg==1)
{
display(20,7,6);
display(year,5,4);
display(math,3,2);
display(day,1,0);
}
if(legg==2)
{
display2(w);
}
}
}










相关主题