您的位置:控制工程论坛网论坛 » 教程与手册 » 万年历

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

万年历

xilinxue  发表于 2008/9/18 14:19:53      676 查看 0 回复  [上一主题]  [下一主题]

手机阅读


#define uchar unsigned char
#define uint    unsigned int

#include<AT89X51.H>
uint sec;
uint min=59;
uint hour=23;
uint day=13;
uint month=4;
uint yearl=7;
uint yearh=20;
uint tcnt;
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()
{
      uchar i,j;
      for(i=100;i>0;i--)
      for(j=248;j>0;j--);
}

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)
{
      P2=0x7F;P0=L1;delay(1);    //yearh
      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=0xFD;P0=L15;delay(1); //temp
      P1=0xFE;P0=L16;delay(1); //temp
      P1=0xFF;
}main()
{  
      uint i;   
      TMOD=0x02;              //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)       
      TH0=0x06;               //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
      TL0=0x06;
      TR0=1;                  //启动T0
      ET0=1;                  //开启定时器T0中断允许
      EA=1;                   //开启中断总控制
      while(1)
      {
          if(P3_0==0)
          {
              Kdelay();
              if(P3_0==0)
              {
                  cursor++;
                  if(cursor>=7){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++;if(day==31)day=0;}
                  if(cursor==5){month++;if(month==12)month=0;}
                  if(cursor==6){yearl++;if(yearl==100)yearl=0;}
                  if(cursor==7){yearh++;if(yearh==30)yearh=20;}
              }
          }
          if(P3_2==0)
          {
              Kdelay();
              if(P3_2==0)
              {
                  if(cursor==1){sec--;}
                  if(cursor==2){min--;}
                  if(cursor==3){hour--;}
                  if(cursor==4){day--;}
                  if(cursor==5){month--;}
                  if(cursor==6){yearl--;}
                  if(cursor==7){yearh--;}
              }
          }
    
          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;
                              }
                          }
                      }
                  }
                  }
              }
          }
      }
}

1楼 0 0 回复