專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)帶閏年補(bǔ)償?shù)囊粋(gè)時(shí)鐘程序

作者:我行天下   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月31日   【字體:

這是我教的學(xué)生寫的帶閏年補(bǔ)償?shù)囊粋(gè)時(shí)鐘,比我自己寫成的還有成就感


#include <reg51.h>
#include<delay.h>
#define uchar unsigned char
#define uint unsigned int
uchar S1num;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit GND=P2^4;
sbit K2=P2^3;
sbit K4=P2^2;
sbit K6=P2^1;
uchar x,num,shi,fen,miao,day,mon,year,week,count;
void display();
void write_com(uchar com)
 {
  RS=0;
  EN=0;
  P0=com;
  delay(5);
  //RW=0;
  EN=1;
  delay(5);
   EN=0;
 
 }
void write_dat(uchar dat)
 {
  RS=1;
  EN=0;
  P0=dat;
  delay(5);
   //RW=0;
  EN=1;
  delay(5);
  EN=0;
 
 }
void timer0()interrupt 1
 {
   TH0=(65536-45872)/256;//45872這個(gè)值是11.0592MHz產(chǎn)生一次中斷,最接近50Ms,如果是12MHz請(qǐng)用50000
   TL0=(65536-45872)%256;
   count++;
 }
write_sfm(uchar add,uchar date)
 {
   uchar shi,ge;
   write_com(0x80+0x40+add);
   shi=date/10;
   ge=date%10;
   write_dat(0x30+shi);
   write_dat(0x30+ge);
 }
write_ymd(uchar add,uchar date)
 {
   uchar shi,ge;
   write_com(0x80+add);
   shi=date/10;
   ge=date%10;
   write_dat(0x30+shi);
   write_dat(0x30+ge);
 }
write_week(week)
 {
   switch(week)
   {
     case 1:write_dat('M');
         write_dat('O');
      write_dat('N');
      break;
     case 2:write_dat('T');
         write_dat('U');
      write_dat('E');
      break;
     case 3:write_dat('W');
         write_dat('E');
      write_dat('N');
      break;
     case 4:write_dat('T');
         write_dat('H');
      write_dat('U');
      break;
  case 5:write_dat('F');
         write_dat('R');
      write_dat('I');
      break;
     case 6:write_dat('S');
         write_dat('A');
      write_dat('T');
      break;
  case 7:write_dat('S');
         write_dat('U');
      write_dat('N');
      break;
   }
 }
void init()
 {
  EN=0;
  RW=0;
  write_com(0x38);//顯示模式
  delay(5);
  write_com(0x0c);//開顯示
  write_com(0x06);//光標(biāo)自加
  write_com(0x80);//指針左一
  write_com(0x01);//清屏
 
  TMOD=0x01;//定時(shí)器0的工作方式1
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
 
 EA=1;//開中斷
 ET0=1;
 TR0=1;//開定時(shí)器
 display();
 }
void display()
 {
   write_sfm(10,0);
   write_com(0x80+0x40+11);
   write_com(0x80+0x40+9);
   write_dat(':');
   write_sfm(7,0);
   write_com(0x80+0x40+8);
   write_com(0x80+0x40+6);
   write_dat(':');
   write_sfm(4,0);
   write_com(0x80+0x40+5);
   write_ymd(10,29);
   write_com(0x80+11);
   write_com(0x80+9);
   write_dat('-');
   write_ymd(7,3);
   write_com(0x80+8);
   write_com(0x80+6);
   write_dat('-');
   write_com(0x80+2);
   write_dat('2');
   write_dat('0');
   write_ymd(4,12);
   write_com(0x80+5);
   write_com(0x80+13);
   write_week(4);
 
 }
void keyscan()
{
  if(K2==0)
  {
    delay(5);
     if(K2==0);//防止誤動(dòng)作
  {
     S1num++;
     while(!K2);
     switch(S1num)
     {
      case 1:
        TR0=0;
     write_com(0x80+0x40+11);
     write_com(0x0f);
     break;
      case 2:
       write_com(0x80+0x40+8);
       break;
      case 3:
       write_com(0x80+0x40+5);
       break;
      case 4:
       write_com(0x80+11);
       break;
      case 5:
       write_com(0x80+8);
       break;
      case 6:
       write_com(0x80+5);
       break;
      case 7:
       write_com(0x80+13);
       break;
      case 8:
       S1num=0;
       TR0=1;
    write_com(0x0c);
       break;
   }
  }
  }
  if(S1num!=0)
  {
    if(K4==0)
    {
     delay(5);
  while(!K4);
  switch(S1num)
  {
   case 1:
    miao++;
    if(miao==60)miao=0;
    write_sfm(10,miao);
    write_com(0x80+0x40+11);
    break;
   case 2:
    fen++;
    if(fen==60)fen=0;
    write_sfm(7,fen);
    write_com(0x80+0x40+8);
    break;
   case 3:
    shi++;
    if(shi==24)shi=0;
    write_sfm(4,shi);
    write_com(0x80+0x40+5);
    break;
   case 4:
    day++;
    switch(mon)
     {
       case 1:if(day==32)day=1;break;
    case 3:if(day==32)day=1;break;
    case 5:if(day==32)day=1;break;
    case 7:if(day==32)day=1;break;
    case 8:if(day==32)day=1;break;
    case 10:if(day==32)day=1;break;
    case 12:if(day==32)day=1;break;
    case 4:if(day==31)day=1;break;
    case 6:if(day==31)day=1;break;
    case 9:if(day==31)day=1;break;
    case 11:if(day==31)day=1;break;
    case 2:x=20*100+year;
           if((x%4==0 && x%100!=0) || x%400==0)
           {
          if(day==30)
       {
         day=1;break;
       }
     
        }
       else if(day==29)
       {
         day=1;break;
       }
   }
    write_ymd(10,day);
    write_com(0x80+11);
    break;
     case 5:
    mon++;
    if(mon==13)mon=1;
    write_ymd(7,mon);
    write_com(0x80+8);
    break;
     case 6:
    year++;
    write_ymd(4,year);
    write_com(0x80+5);
    break;
     case 7:
    week++;
    if(week==8)week=1;
    write_week(week);
    write_com(0x80+13);
    break;
     }
    }
    if(K6==0)
    {
     delay(5);
  while(!K6);
  switch(S1num)
  {
   case 1:
    miao--;
    if(miao==-1)miao=59;
    write_sfm(10,miao);
    write_com(0x80+0x40+11);
    break;
   case 2:
    fen--;
    if(fen==-1)fen=59;
    write_sfm(7,fen);
    write_com(0x80+0x40+8);
    break;
   case 3:
    shi--;
    if(shi==-1)shi=23;
    write_sfm(4,shi);
    write_com(0x80+0x40+5);
    break;
   case 4:
    day--;
    switch(mon)
     {
       case 1:if(day==0)day=31;break;
    case 3:if(day==0)day=31;break;
    case 5:if(day==0)day=31;break;
    case 7:if(day==0)day=31;break;
    case 8:if(day==0)day=31;break;
    case 10:if(day==0)day=31;break;
    case 12:if(day==0)day=31;break;
    case 4:if(day==0)day=30;break;
    case 6:if(day==0)day=30;break;
    case 9:if(day==0)day=30;break;
    case 11:if(day==0)day=30;break;
    case 2:x=20*100+year;
           if((x%4==0 && x%100!=0) || x%400==0)
           {
          if(day==0)
       {
         day=29;break;
       }
     
        }
       else if(day==0)
       {
         day=28;break;
       }
     }
    write_ymd(10,day);
    write_com(0x80+11);
    break;
     case 5:
    mon--;
    if(mon==0)mon=12;
    write_ymd(7,mon);
    write_com(0x80+8);
    break;
     case 6:
    year--;
    write_ymd(4,year);
    write_com(0x80+5);
    break;
     case 7:
    week--;
    if(week==-1)week=7;
    write_week(week);
    write_com(0x80+13);
    break;
  }
    }
  }
}
void main()
 {
  init();
  GND=0;
 
   while(1)
   {
     keyscan();
     if(count==20)
     {
     count=0;
     miao++;
      if(miao==60)
      {
    miao=0;
    fen++;
     if(fen==60)
     {
      fen=0;
      shi++;
       if(shi==24)
       {
        shi=0;
        day++;
        week++;
         switch(mon)
         {
           case 1:if(day==32)day=1;mon++;break;
        case 3:if(day==32)day=1;mon++;break;
        case 5:if(day==32)day=1;mon++;break;
        case 7:if(day==32)day=1;mon++;break;
        case 8:if(day==32)day=1;mon++;break;
        case 10:if(day==32)day=1;mon++;break;
        case 12:if(day==32)day=1;mon++;break;
        case 4:if(day==31)day=1;mon++;break;
        case 6:if(day==31)day=1;mon++;break;
        case 9:if(day==31)day=1;mon++;break;
        case 11:if(day==31)day=1;mon++;break;
        case 2:x=20*100+year;
               if((x%4==0 && x%100!=0) || x%400==0)
               {
              if(day==30)
           {
             day=1;mon++;break;
           }
         
            }
           else if(day==29)
           {
             day=1;mon++;break;
           }
         }
         if(mon==13)
         {
          mon=1;
          year++;
          write_ymd(4,year);
         }
         write_ymd(10,day);
         write_com(0x80+13);
         write_week(week);
         write_ymd(7,mon);
       }
       write_sfm(4,shi);
     }
     write_sfm(7,fen);
      }
      write_sfm(10,miao);
     }
   }
 
 }
 

關(guān)閉窗口

相關(guān)文章