原创 用51单片机设计的 一个能校准的时钟

2008-7-21 17:08 2406 1 2 分类: MCU/ 嵌入式

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int


sbit rs="P0"^2;
sbit rw="P0"^3;
sbit lcden="P0"^4;
sbit  s1=P3^2;
sbit  s2=P3^3;
sbit  s3=P3^4;
sbit  s4=P3^5;
sbit beep="P0"^7;
uchar count,s1num;


char shi,fen,miao,nian,yue,ri,week;
uchar code table[]="2008-05-27week02";
uchar code table1[]="23:59:50 ";


void delay(uint z)  //***延时程序  *********************************************************************//
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=100;y>0;y--);
}


      
void write_com(uchar com)  //***液晶1602指令设置******************************************//    
{                  
 rs=0;
 lcden=0;
 P2=com;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
 
}
 
 
void write_date(uchar date)   //***液晶1602数据设置***********************************************//                                                   
{
 rs=1;
 lcden=0;
 P2=date;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}


void init()   //***********************************初始化函数*************************************//
{
 uchar num;


 rw=0;
 lcden=0;
   shi="23";
 fen=59;
 miao=50; 
  
   nian="8";
   yue="5";
 ri=27;
 week=2;
 write_com(0x38);
 write_com(0x0c);
 write_com(0x06);
 write_com(0x01);
 write_com(0x80);
 for(num=0;num<16;num++) 
 {
  write_date(table[num]);
  delay(1);
   
 }


 write_com(0x80+0x40);
 for(num=0;num<8;num++)
 {
  write_date(table1[num]);
  delay(1);
    
 }
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256; 
 EA=1;
 ET0=1;
 TR0=1;
 
}


void write_sfm(uchar add,uchar date) //*********************写时分秒函数***************************//
{
 uchar shi,ge;
 shi=date/10;
 ge=date%10;
 write_com(0x80+0x40+add);
 write_date(0x30+shi);
 write_date(0x30+ge); 
}


void write_nyr(uchar add1,uchar date1) //*********************写年月日函数***************************//
{
 uchar nianshi,niange,yueshi,yuege,rishi,rige,weekshi,weekge;
 nianshi=date1/10;
 niange=date1%10;


 yueshi=date1/10;
 yuege=date1%10;


 rishi=date1/10;
 rige=date1%10;


 weekshi=date1/10;
 weekge=date1%10;


 write_com(0x80+add1);
 write_date(0x30+nianshi);
 write_date(0x30+niange); 


 write_com(0x80+add1);
 write_date(0x30+yueshi);
 write_date(0x30+yuege);


 write_com(0x80+add1);
 write_date(0x30+rishi);
 write_date(0x30+rige);


 write_com(0x80+add1);
 write_date(0x30+weekshi);
 write_date(0x30+weekge);


}


void timer0() interrupt 1  //*********************写定时器函数**************************************//
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 count++;
}   


void keyscan()  //*********************按键扫描函数**********************************************//
{


//十分妙年月日自动加一程序  ************************************************************************** //
if(count==20)  
  {
   count=0;
   miao++;
   if(miao==60)
   {
    miao=0;
    fen++;
    if(fen==60)
    {
     fen=0;
     shi++;
     if(shi==24)
     {
      shi=0;
      week++;
      ri++;
      if(week==8)
       {
       week=1;
       }
         if(ri==31)
      {
       ri=1;
       yue++;
       if(yue==13)
        {
         yue=1;
         nian++;
         if(nian==100)
         {
          nian=0; 
         }
         write_nyr(2,nian);
        }
        write_nyr(5,yue);
      }
        write_nyr(14,week);
      delay(100);
      write_nyr(8,ri);
     }
          write_sfm(0,shi);
      
    } 
   
     write_sfm(3,fen);
   }   
  
   write_sfm(6,miao);
  }
//十分妙年月日自动加一程序  ************************************************************************** //      


//***按键判断程序  ******************************************************************************//
          if(s1==0) //**判断按键1是否按下********************************************************//
  {   
               delay(5);
               if(s1==0)
               {            
            while(!s1);
      s1num++;
       if(s1num==1)
       {
           TR0=0;
               write_com(0x0f);
                 write_com(0x80+0x40+7);         
         }                     
       if(s1num==2)
        {
                 write_com(0x80+0x40+4);
       }
       
        if(s1num==3)
       {
                 write_com(0x80+0x40+1);
       }
       if(s1num==4)
       {
                 write_com(0x80+15);
       }
        if(s1num==5)
       {
                 write_com(0x80+9);
       }
        if(s1num==6)
       {
                 write_com(0x80+6);
       }
        if(s1num==7)
       {
                 write_com(0x80+3);
       }
        if(s1num==8)
       {
                 s1num=0;
       TR0=1;
       write_com(0x0c);
       }              
       
             }
        
        
    }    
   
   if(!s1num==0)  //**判断按键2是否按下********************************************************//
    {
     if(s2==0)
      {
       delay(5);
       if(s2==0)
       
        while(!s2);
        if(s1num==1)
         {                    
          miao++;
          if(miao==60)
          miao=0;
          write_com(0x80+0x40+7);
          write_com(0x0f);     
          write_sfm(6,miao);          
            
         }
        if(s1num==2)
         {                    
          fen++;
          if(fen==60)
          fen=0;
          write_com(0x80+0x40+4);
          write_com(0x0f);     
          write_sfm(3,fen);          
            
         }
        if(s1num==3)
         {                    
          shi++;
          if(shi==24)
          shi=0;
          write_com(0x80+0x40+1);
          write_com(0x0f);     
          write_sfm(0,shi);          
            
         } 
         if(s1num==4)
         {                    
          week++;
          if(week==8)
          week=1;
          write_com(0x80+14);
          write_com(0x0f);     
          write_nyr(14,week);          
            
         } 
         if(s1num==5)
         {                    
          ri++;
          if(ri==31)
          ri=1;
          write_com(0x80+8);
          write_com(0x0f);     
          write_nyr(8,ri);          
            
         } 
         if(s1num==6)
         {                    
          yue++;
          if(yue==13)
          yue=1;
          write_com(0x80+5);
          write_com(0x0f);     
          write_nyr(5,yue);
          }
           if(s1num==7)
         {                    
          nian++;
          if(nian==99)
          nian=0;
          write_com(0x80+2);
          write_com(0x0f);     
          write_nyr(2,nian);          
            
         }
      
          }
           }


      if(!s1num==0)  //**判断按键3是否按下********************************************************//
    {
     if(s3==0)
      {
       delay(5);
       if(s3==0)
       
        while(!s3);
        if(s1num==1)
         {                    
          miao--;
          if(miao==-1)
          miao=59;
          write_com(0x80+0x40+7);
          write_com(0x0f);     
          write_sfm(6,miao);          
            
         }
        if(s1num==2)
         {                    
          fen--;
          if(fen==-1)
          fen=59;
          write_com(0x80+0x40+4);
          write_com(0x0f);     
          write_sfm(3,fen);          
            
         }
        if(s1num==3)
         {                    
          shi--;
          if(shi==-1)
          shi=23;
          write_com(0x80+0x40+1);
          write_com(0x0f);     
          write_sfm(0,shi);          
            
         } 
        if(s1num==4)
         {                    
          week--;
          if(week==0)
          week=7;
          write_com(0x80+14);
          write_com(0x0f);     
          write_nyr(14,week);          
            
         } 
         if(s1num==5)
         {                    
          ri--;
          if(ri==0)
          ri=30;
          write_com(0x80+8);
          write_com(0x0f);     
          write_nyr(8,ri);          
            
         } 
         if(s1num==6)
         {                    
          yue--;
          if(yue==0)
          yue=12;
          write_com(0x80+5);
          write_com(0x0f);     
          write_nyr(5,yue);
          }
           if(s1num==7)
         {                    
          nian--;
          if(nian==-1)
          nian=98;
          write_com(0x80+2);
          write_com(0x0f);     
          write_nyr(2,nian);          
            
         }
      
        
           }
            }
 
}
//***按键判断程序  *******************************************************************************//


 



void main()       //*********************主函数********************************************************//
{
 init();
 while(1)
 {
  
          keyscan();
 //   keyscan2();


          
 } 



}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户392024 2008-7-22 12:04

用12864就更好了,我的12864调不出来,是JM12864M的
相关推荐阅读
用户159305 2008-07-21 15:48
常用电子元器件的原理与使用
常用电子元器件的原理与使用半导体基本知识:   半导体二极管、三极管、场效应管是电路中最常用的半导体器件,PN结是构成各种半导体器件的重要基础。   导电能力介于导体和绝缘体之间的物质称为半导体。具有...
用户159305 2008-07-21 15:08
人体感应开关红外感应延时开关
人体是一特定波长红外线的发射体,由红外传感器检测到这种红外线的变化并予以放大选频处理后,可以推动适当的负载,此乃人体红外自动开关。这一检测技术较之超声、哑声、微波方式更为灵敏与准确。它要求PIR热释电...
我要评论
1
1
关闭 站长推荐上一条 /2 下一条