⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calendar.c

📁 这个源码测试过,可以用.电路图也可以根据程序画,非常方便.
💻 C
字号:
#define uchar unsigned char
#define uint  unsigned int
#include<AT89X51.H>

uint mday;
uint sec;
uint min=38;
uint hour=17;
uint day=6;
uint month=3;
uint yearl=8;
uint yearh=20;
uint tcnt=0,tcnt1=0;
uint cursor=0;
uchar a=0xff;
uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint t)
{
    uint i;
    while(t--)
    {for (i=0;i<125;i++);}
}

void Kdelay()
{
    uint i;
    for(i=9000;i>0;i--);
}

void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,
uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14)//,uchar L15,uchar L16)
{
    if(cursor==7){P2=0x7F|a;P0=L1;delay(1);}else{P2=0x7F;P0=L1;delay(1);}  //yearh
    if(cursor==7){P2=0xBF|a;P0=L2;delay(1);}else{P2=0xBF;P0=L2;delay(1);}  //yearh
    if(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}   //yearl
    if(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}   //yearl
    if(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}   //month
    if(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}   //month
    if(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}   //day
    if(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}   //day
    P2=0xff; 										//关掉年月日的显示位,避免和时分秒显示的干扰
    if(cursor==3){P1=0x7F|a;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);}   //hour
    if(cursor==3){P1=0xBF|a;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);}  //hour
    if(cursor==2){P1=0xDF|a;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
    if(cursor==2){P1=0xEF|a;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
    if(cursor==1){P1=0xF7|a;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
    if(cursor==1){P1=0xFB|a;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
    P1=0xFF;                                       //关掉时分秒的显示位,避免和年月日显示的干扰
}

void maxday(yearh,yearl,month)
{
    uint year;
	year=yearh*100+yearl;
	if((year%4==0&&year%100!=0)||(year%400==0))
  {
    if(month==4||month==6||month==9||month==11)
		
		        mday=30;
    else if(month==2)
			
			    mday=29;
    else 
			    mday=31;
    }
	if(!((year%4==0&&year%100!=0)||year%400==0))	
  {
	if(month==4||month==6||month==9||month==11)
		        mday=30;
    else if(month==2)
		        mday=28;
    else 
			    mday=31;
    
} 
}  
main()
{   
    P0=0xff;   
    TMOD=0x02;            //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)        
    TH0=0x06;             //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
    TL0=0x06;
	P3_3=1;
    TR0=1;                //启动T0
    ET0=1;                //开启定时器T0中断允许
    EA=1;                 //开启中断总控制
    while(1)
    {
        if(P3_0==0)
        {
            Kdelay();
            if(P3_0==0)
            {
                cursor++;
                if(cursor>=8){cursor=0;}
            }
        }
        if(P3_1==0)
        {
            Kdelay();
            if(P3_1==0)
            {
                
			    if(cursor==1){sec++;if(sec==60)sec=0;}
                if(cursor==2){min++;if(min==60)min=0;}
                if(cursor==3){hour++;if(hour==24)hour=0;}
                if(cursor==4){day++;maxday(yearh,yearl,month);if(day>mday)day=0;}
                if(cursor==5){month++;if(month==13)month=1;}
                if(cursor==6){yearl++;if(yearl==100){yearl=0;yearh++;}}
                if(cursor==7){yearh++;if(yearh==100)yearh=0;}
            }
        }
        
        display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],
		        Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],
				Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],
				Seg[sec/10],Seg[sec%10]);//,Seg[i/100],Seg[i/10%10]);     
    }
}

void t0(void)interrupt 1 using 0   //t0的中断程序
{
    tcnt++;
    if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
    {
        tcnt=0;
        P3_3=~P3_3;
		a=~a;
        sec++;
        if(sec==60)
        {     
            sec=0;
            min++;
            if(min==60)
            {
                min=0;
                hour++;
                if(hour==24)
                {
                    hour=0;
                    day++;
                    if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;  
                    else if(month==2&&day==29)day=1;
                    else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
                    else if(day==32)day=1;
                    if(day==1)
                    {
                    month++;
                    if(month==13)
                    {
                        month=1;
                        yearl++;
                        if(yearl==100)
                        {
                            yearl=0;
                            yearh++;
                            if(yearh==100)
                            {
                                yearh=20;
                            }
                        }
                    }
                }
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -