找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1763|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

時(shí)鐘日歷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:139341 發(fā)表于 2016-9-18 21:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
# include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit  rs=P2^0;
sbit  rw=P2^1;
sbit  en=P2^2;
sbit key1=P2^3;         //調(diào)時(shí)
sbit key2=P2^4;         //加
sbit key3=P2^5;    //減
uchar miao,fen,shi,ri,zhou,yue,year;        //        秒,分,時(shí),周,月,年
uchar code table[16]="20  -  -   wk:  ";
uchar code table1[16]="time 23:59:57   ";
void delay(uchar a)
{
uchar x,y;
for(x=a;x>0;x--)
  for(y=110;y>0;y--);
}

void write_com(uchar com)
{ rw=0;
   rs=0;
   en=0;
   P0=com;
   en=1;
   delay(5);
   en=0;
   delay(5);
}
void write_date(uchar date)
{ rw=0;
   rs=1;
   en=0;
   P0=date;
   en=1;
   delay(5);
   en=0;
   delay(5);
}
void write_nyr(uchar lie,uchar date)        //第一行年月日周函數(shù)
{uchar a,b;
     a=date/10;
         b=date%10;
  write_com(0x80+lie);
            write_date(0x30+a);
         write_date(0x30+b);
}
void write_sfm(uchar lie,uchar date)        //第二行寫(xiě)入時(shí)分秒函數(shù)
{         uchar a,b;
     a=date/10;
         b=date%10;
         write_com(0x80+0x40+lie);
            write_date(0x30+a);
         write_date(0x30+b);
}
void init()
{ uchar i ;                        
   en=0;
   shi=23;
   fen=59;
   miao=57;
   year=15;
   yue=5;
   ri=12;
   zhou=6;
  write_com(0x38);          //顯示
  write_com(0x0c);   //開(kāi)光標(biāo)
  write_com(0x06);         //指針加一
  write_com(0x01);   //清屏
  write_com(0x80);   //第一行
  for(i=0;i<15; i++)
          {
           write_date(table[i]);
                   delay(5);
          }

  write_nyr(2,year);
  write_nyr(5,yue);
  write_nyr(8,ri);
  write_nyr(14,zhou);
  write_com(0x80+0x40);   //第二行
  for(i=0;i<15; i++)
          {
           write_date(table1[i]);
                delay(5);
      }
          TMOD=0X01;
          TH0=(65536-50000)/256;
          TL0=(65536-50000)%256;
            EA=1;
                ET0=1;
                TR0=1;
}
uchar i,k,temp,n,m;   //i記錄調(diào)時(shí)鍵按下次數(shù),K,m,n為標(biāo)志位,temp為年份
void key_scan(void)
{  
   temp=2000+year;
   if(((temp%4==0)&&(temp%100!=0))||(temp%400==0))
       n=1;                         //閏年
   else  
       n=0;                   //非閏年
  if(key1==0)        //調(diào)時(shí)鍵按下
    delay(10);
         if(key1==0)
         { while(!key1);  //按鍵釋放
                 i++;
                if(i==1)
                        {TR0=0;           //停止定時(shí)
                         write_com(0x80+0x40+12);
                         write_com(0x0f);

                                    k=1;         //K=1為秒標(biāo)志位
                        }
                 if(i==2)
                  { TR0=0;
                 write_com(0x80+0x40+9);
                 write_com(0x0f);
                       k=2;           //k=2為分標(biāo)志位
             }
                if(i==3)
                  { TR0=0;
                 write_com(0x80+0x40+6);
                 write_com(0x0f);
                           k=3;           //k=3為時(shí)標(biāo)志位
             }
                if(i==4)
                  { TR0=0;
                 write_com(0x80+3);
                 write_com(0x0f);
                           k=4;           //k=4為年標(biāo)志位
             }
                if(i==5)
                  { TR0=0;
                 write_com(0x80+6);
                 write_com(0x0f);
                           k=5;           //k=5為月標(biāo)志位
             }
                if(i==6)
                  { TR0=0;
                 write_com(0x80+9);
                 write_com(0x0f);
                           k=6;           //k=3為日標(biāo)志位
             }
                if(i==7)
                  { TR0=0;
                 write_com(0x80+15);
                 write_com(0x0f);
                           k=7;           //k=3為周標(biāo)志位
             }
                if(i==8)
                 {i=0;
                 TR0=1;                        //啟動(dòng)定時(shí)
                 write_com(0x0c);         //消除光標(biāo)
                 }
}
if((key2==0)&&(k==1))        //秒加鍵按下
                   delay(10);
                        if((key2==0)&&(k==1))
                                { while(!key2);
                                    miao++;
                                 if(miao==60)
                                          miao=0;
                                  write_sfm(11,miao);          //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+12);        //光標(biāo)位置
                                  }
   if((key3==0)&&(k==1))        //秒減鍵按下
                   delay(10);
                        if((key3==0)&&(k==1))
                                { while(!key3);
                                  miao--;
                                  if(miao==-1)
                                          miao=59;
                                  write_sfm(11,miao);         //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+12); //光標(biāo)位置
                                  }
if((key2==0)&&(k==2))        //分加鍵按下
                   delay(10);
                        if((key2==0)&&(k==2))
                                { while(!key2);
                                  fen++;
                                  if(fen==60)
                                          fen=0;
                                  write_sfm(8,fen);                 //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+9);         //光標(biāo)位置
                                  }
if((key3==0)&&(k==2))        //分減鍵按下
                   delay(10);
                        if((key3==0)&&(k==2))
                                { while(!key3);
                                   fen--;
                                  if(fen==-1)
                                          fen=59;
                                  write_sfm(8,fen);                //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+9);  //光標(biāo)位置
                                  }
  if((key2==0)&&(k==3))        //時(shí)加鍵按下
                   delay(10);
                        if((key2==0)&&(k==3))
                                { while(!key2);
                                  shi++;
                                  if(shi==24)
                                  shi=0;
                                  write_sfm(5,shi);                 //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+6);        //光標(biāo)位置
                                  }
  if((key3==0)&&(k==3))        //時(shí)減鍵按下
                   delay(10);
                        if((key3==0)&&(k==3))
                                { while(!key3);
                                 shi--;
                                  if(shi==-1)
                                  shi=23;
                                  write_sfm(5,shi);                 //寫(xiě)入時(shí)分秒函數(shù)
                                  write_com(0x80+0x40+6);        //光標(biāo)位置
                                  }
if((key2==0)&&(k==4))        //年加鍵按下
                   delay(10);
                        if((key2==0)&&(k==4))
                                { while(!key2);
                                  year++;
                                  write_nyr(2,year);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+3);        //光標(biāo)位置
                                  }
if((key3==0)&&(k==4))        //年減鍵按下
                   delay(10);
                        if((key3==0)&&(k==4))
                                { while(!key3);
                                  year--;
                                  write_nyr(2,year);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+3);        //光標(biāo)位置
                                  }
  if((key2==0)&&(k==5))        //月加鍵按下
                   delay(10);
                        if((key2==0)&&(k==5))
                                { while(!key2);
                                  yue++;
                                  if(yue==13)
                                     yue=1;
                                  write_nyr(5,yue);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+6);        //光標(biāo)位置
                                  }
if((key3==0)&&(k==5))        //月減鍵按下
                   delay(10);
                        if((key3==0)&&(k==5))
                                { while(!key3);
                                  yue--;
                                  if(yue==0)
                                     yue=12;
                                  write_nyr(5,yue);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+6);        //光標(biāo)位置
                                  }
if((key2==0)&&(k==6))        //日加鍵按下
                   delay(10);
        if((key2==0)&&(k==6))
        { while(!key2);
                                  ri++;
                   switch(yue)
                 { case 1:  case 3: case 5: case 7: case 8: case 10: case 12:
                               m=1;break;        //大月
                  case 4:  case 6: case 9: case 11:
                                  m=2;break;          //小月
                  case 2:  m=3; break;         //二月
            }
                if(ri==32)
                        {ri=1;}                  
                if((ri==32)&&(m==1))
                        { ri=1; }
                if((ri==31)&&(m==2))
                                { ri=1; }
                if((ri==30)&&(m==3)&&(n==1))
                        { ri=1; }                        //閏年二月
                if((ri==29)&&(m==3)&&(n==0))        
                                { ri=1; }         //非閏年二月
                                  write_nyr(8,ri);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+9);        //光標(biāo)位置
         }
if((key3==0)&&(k==6))        //日減鍵按下
                   delay(10);
         if((key3==0)&&(k==6))
            { while(!key3);
                                  ri--;
                 switch(yue)
                 { case 1:  case 3: case 5: case 7: case 8: case 10: case 12:
                                m=4; break;                           //大月
                   case 4:  case 6: case 9: case 11:
                                   m=5; break;                //小月
                   case 2:  m=6;  break;         //二月         
            }
                if((m==4)&&(ri==0))  
                         { ri=31;}
                if((m==5)&&(ri==0))
                     { ri=30;}
                if((n==1)&&(m==6)&&(ri==0))                   //閏年2月
                     { ri=29;}
                if((n==0)&&(m==6)&&(ri==0))                //非閏年2月
                         { ri=28;}
                 write_nyr(8,ri);                 //寫(xiě)入年月日函數(shù)
                write_com(0x80+9);        //光標(biāo)位置
        }
if((key2==0)&&(k==7))        //周加鍵按下
                   delay(10);
                        if((key2==0)&&(k==7))
                                { while(!key2);
                                  zhou++;
                                  if(zhou==8)
                                    zhou=1;
                                  write_nyr(14,zhou);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+15);        //光標(biāo)位置
                                  }
if((key3==0)&&(k==7))        //周減鍵按下
                   delay(10);
                        if((key3==0)&&(k==7))
                                { while(!key3);
                                  zhou--;
                                  if(zhou==0)
                                     zhou=7;
                                  write_nyr(14,zhou);                 //寫(xiě)入年月日函數(shù)
                                  write_com(0x80+15);        //光標(biāo)位置
                                  }
}
void compare_r( uchar b)                  //判斷日滿(mǎn)函數(shù)
{  
     if((b==32)&&((m==1)||(m==4)))
                        { b=1;
                        yue++;
                          if(yue==13)
                        {  year++;
                         write_nyr(2,year);
                                 }
                    write_nyr(5,yue);
                         }
     if((b==31)&&((m==2)||(m==5)))
                         { b=1;
                         yue++;
                          if(yue==13)
                        {  year++;
                          write_nyr(2,year);}
                         write_nyr(5,yue);
                          }               
         if((b==30)&&((m==3)||(m==6))&&(n==1))
                         { b=1;
                          yue++;
                          if(yue==13)
                        {  year++;
                          write_nyr(2,year);}
                           write_nyr(5,yue);
                          }
         if((b==29)&&((m==3)||(m==6))&&(n==0))
                        {b=1 ;
                        yue++;
                          if(yue==13)
                        {  year++; }
                          write_nyr(2,year);
                            write_nyr(5,yue);                        
                     }
          write_nyr(8,b);
                }
void compare_y( uchar a)          //判月滿(mǎn)
{         
           if(a==13)
           { a=1;
           write_nyr(2,year);
           }
           
           write_nyr(5,a);
         
}

void main(void)
{
  init();
  while(1)
  { key_scan();
  }

  }
void  time0() interrupt 1
{        uint t;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
         t++;
   if(t==20)
        {
            t=0;
     miao++;
          if(miao==60)
          {
            miao=0;
            fen++;
             if(fen==60)
                 {
                   fen=0;
                   shi++;
                   if(shi==24)
                   { shi=0;
                     zhou++;
                      ri++;
                          compare_r(ri);        //判日滿(mǎn)
                          compare_y(yue);        //判月滿(mǎn)
                        if(zhou==8)
                     { zhou=1;}
                    write_nyr(14,zhou);
                   }
                  write_sfm(5,shi);
                 }
                 write_sfm(8,fen);
          }
      write_sfm(11,miao);
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表