找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3552|回复: 9
收起左侧

电子时钟

  [复制链接]
ID:78027 发表于 2015-5-22 15:44 | 显示全部楼层 |阅读模式
# 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;         //调时
sbit key2=P2^4;         //加
sbit key3=P2^5;    //减
uchar miao,fen,shi,ri,zhou,yue,year;        //        秒,分,时,周,月,年
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)        //第一行年月日周函数
{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)        //第二行写入时分秒函数
{         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);   //开光标
  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记录调时键按下次数,K,m,n为标志位,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)        //调时键按下
    delay(10);
         if(key1==0)
         { while(!key1);  //按键释放
                 i++;
                if(i==1)
                        {TR0=0;           //停止定时
                         write_com(0x80+0x40+12);
                         write_com(0x0f);

                                    k=1;         //K=1为秒标志位
                        }
                 if(i==2)
                  { TR0=0;
                 write_com(0x80+0x40+9);
                 write_com(0x0f);
                       k=2;           //k=2为分标志位
             }
                if(i==3)
                  { TR0=0;
                 write_com(0x80+0x40+6);
                 write_com(0x0f);
                           k=3;           //k=3为时标志位
             }
                if(i==4)
                  { TR0=0;
                 write_com(0x80+3);
                 write_com(0x0f);
                           k=4;           //k=4为年标志位
             }
                if(i==5)
                  { TR0=0;
                 write_com(0x80+6);
                 write_com(0x0f);
                           k=5;           //k=5为月标志位
             }
                if(i==6)
                  { TR0=0;
                 write_com(0x80+9);
                 write_com(0x0f);
                           k=6;           //k=3为日标志位
             }
                if(i==7)
                  { TR0=0;
                 write_com(0x80+15);
                 write_com(0x0f);
                           k=7;           //k=3为周标志位
             }
                if(i==8)
                 {i=0;
                 TR0=1;                        //启动定时
                 write_com(0x0c);         //消除光标
                 }
}
if((key2==0)&&(k==1))        //秒加键按下
                   delay(10);
                        if((key2==0)&&(k==1))
                                { while(!key2);
                                    miao++;
                                 if(miao==60)
                                          miao=0;
                                  write_sfm(11,miao);          //写入时分秒函数
                                  write_com(0x80+0x40+12);        //光标位置
                                  }
   if((key3==0)&&(k==1))        //秒减键按下
                   delay(10);
                        if((key3==0)&&(k==1))
                                { while(!key3);
                                  miao--;
                                  if(miao==-1)
                                          miao=59;
                                  write_sfm(11,miao);         //写入时分秒函数
                                  write_com(0x80+0x40+12); //光标位置
                                  }
if((key2==0)&&(k==2))        //分加键按下
                   delay(10);
                        if((key2==0)&&(k==2))
                                { while(!key2);
                                  fen++;
                                  if(fen==60)
                                          fen=0;
                                  write_sfm(8,fen);                 //写入时分秒函数
                                  write_com(0x80+0x40+9);         //光标位置
                                  }
if((key3==0)&&(k==2))        //分减键按下
                   delay(10);
                        if((key3==0)&&(k==2))
                                { while(!key3);
                                   fen--;
                                  if(fen==-1)
                                          fen=59;
                                  write_sfm(8,fen);                //写入时分秒函数
                                  write_com(0x80+0x40+9);  //光标位置
                                  }
  if((key2==0)&&(k==3))        //时加键按下
                   delay(10);
                        if((key2==0)&&(k==3))
                                { while(!key2);
                                  shi++;
                                  if(shi==24)
                                  shi=0;
                                  write_sfm(5,shi);                 //写入时分秒函数
                                  write_com(0x80+0x40+6);        //光标位置
                                  }
  if((key3==0)&&(k==3))        //时减键按下
                   delay(10);
                        if((key3==0)&&(k==3))
                                { while(!key3);
                                 shi--;
                                  if(shi==-1)
                                  shi=23;
                                  write_sfm(5,shi);                 //写入时分秒函数
                                  write_com(0x80+0x40+6);        //光标位置
                                  }
if((key2==0)&&(k==4))        //年加键按下
                   delay(10);
                        if((key2==0)&&(k==4))
                                { while(!key2);
                                  year++;
                                  write_nyr(2,year);                 //写入年月日函数
                                  write_com(0x80+3);        //光标位置
                                  }
if((key3==0)&&(k==4))        //年减键按下
                   delay(10);
                        if((key3==0)&&(k==4))
                                { while(!key3);
                                  year--;
                                  write_nyr(2,year);                 //写入年月日函数
                                  write_com(0x80+3);        //光标位置
                                  }
  if((key2==0)&&(k==5))        //月加键按下
                   delay(10);
                        if((key2==0)&&(k==5))
                                { while(!key2);
                                  yue++;
                                  if(yue==13)
                                     yue=1;
                                  write_nyr(5,yue);                 //写入年月日函数
                                  write_com(0x80+6);        //光标位置
                                  }
if((key3==0)&&(k==5))        //月减键按下
                   delay(10);
                        if((key3==0)&&(k==5))
                                { while(!key3);
                                  yue--;
                                  if(yue==0)
                                     yue=12;
                                  write_nyr(5,yue);                 //写入年月日函数
                                  write_com(0x80+6);        //光标位置
                                  }
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);                 //写入年月日函数
                                  write_com(0x80+9);        //光标位置
         }
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);                 //写入年月日函数
                write_com(0x80+9);        //光标位置
        }
if((key2==0)&&(k==7))        //周加键按下
                   delay(10);
                        if((key2==0)&&(k==7))
                                { while(!key2);
                                  zhou++;
                                  if(zhou==8)
                                    zhou=1;
                                  write_nyr(14,zhou);                 //写入年月日函数
                                  write_com(0x80+15);        //光标位置
                                  }
if((key3==0)&&(k==7))        //周减键按下
                   delay(10);
                        if((key3==0)&&(k==7))
                                { while(!key3);
                                  zhou--;
                                  if(zhou==0)
                                     zhou=7;
                                  write_nyr(14,zhou);                 //写入年月日函数
                                  write_com(0x80+15);        //光标位置
                                  }
}
void compare_r( uchar b)                  //判断日满函数
{  
     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)          //判月满
{         
           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);        //判日满
                          compare_y(yue);        //判月满
                        if(zhou==8)
                     { zhou=1;}
                    write_nyr(14,zhou);
                   }
                  write_sfm(5,shi);
                 }
                 write_sfm(8,fen);
          }
      write_sfm(11,miao);
        }
}




评分

参与人数 2黑币 +58 收起 理由
1103863857 + 8 共享资料的黑币奖励!很给力,不知有没有教.
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2015-5-22 16:07 | 显示全部楼层
功能比较强大 电路图能共享一下吗
回复

使用道具 举报

ID:80203 发表于 2015-5-23 23:12 | 显示全部楼层
可惜没有电路图。
回复

使用道具 举报

ID:78027 发表于 2015-5-29 17:08 | 显示全部楼层
新建 WinRAR ZIP 压缩文件.zip (18.36 KB, 下载次数: 89)

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:112756 发表于 2016-4-18 18:17 | 显示全部楼层
不错,值得学习。
回复

使用道具 举报

ID:115147 发表于 2016-4-19 10:51 | 显示全部楼层
非常好,感谢分享!!!!
回复

使用道具 举报

ID:70246 发表于 2016-5-4 16:20 | 显示全部楼层
没有黑笔怎么下载啊  
回复

使用道具 举报

ID:225510 发表于 2017-12-21 22:42 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:265128 发表于 2017-12-22 08:23 来自手机 | 显示全部楼层
qq6570 发表于 2016-5-4 16:20
没有黑笔怎么下载啊

不知道
回复

使用道具 举报

ID:262827 发表于 2017-12-23 16:34 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表