mybag1 发表于 2013-10-26 19:02:08

arduino+1602液晶实现简单电子时钟功能


lantpark也曾做过类似的东西(http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1248),用到了http://www.arduino.cc/playground/uploads/Code/DateTime.zip,实现了能显示日期和时间的功能。这几天在学习时,突然想到仅用字符串也能简单的实现电子时钟,时间用delay来计算,做好后,整整跑了一个下午,发现时间的误差几乎没有,还是可以接受的。

lcd 1602 接线采用四线连接法参照弘毅的教程
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=78&reltid=955&pre_thread_id=0&pre_pos=1&ext=


代码如下:
    int LCD1602_RS=12;   
    int LCD1602_RW=11;   
    int LCD1602_EN=10;   
    int DB[] = { 6, 7, 8, 9};
    char logtxt[]="Local Time";
    char *sec={"00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"};

   
    void LCD_Command_Write(int command)
    {
    int i,temp;
    digitalWrite( LCD1602_RS,LOW);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
   
    temp=command & 0xf0;
    for (i=DB; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
   
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
   
    temp=(command & 0x0f)<<4;
    for (i=DB; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
   
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
   
    void LCD_Data_Write(int dat)
    {
    int i=0,temp;
    digitalWrite( LCD1602_RS,HIGH);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
   
    temp=dat & 0xf0;
    for (i=DB; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
   
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
   
    temp=(dat & 0x0f)<<4;
    for (i=DB; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
   
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
   
    void LCD_SET_XY( int x, int y )
    {
      int address;
      if (y ==0)    address = 0x80 + x;
      else          address = 0xC0 + x;
      LCD_Command_Write(address);
    }
   
    void LCD_Write_Char( int x,int y,int dat)
    {
      LCD_SET_XY( x, y );
      LCD_Data_Write(dat);
    }
   
    void LCD_Write_String(int X,int Y,char *s)
    {
      LCD_SET_XY( X, Y );    //设置地址
      while (*s)             //写字符串
      {
          LCD_Data_Write(*s);   
          s ++;
      }
    }
   
    void setup (void)
    {
      int i = 0;
      for (i=6; i <= 12; i++)
       {
         pinMode(i,OUTPUT);
       }
      delay(100);
      LCD_Command_Write(0x28);//4线 2行 5x7
      delay(50);
      LCD_Command_Write(0x06);
      delay(50);
      LCD_Command_Write(0x0c);
      delay(50);
      LCD_Command_Write(0x80);
      delay(50);
      LCD_Command_Write(0x01);
      delay(50);
   
    }
   
    void loop (void)
    {


       for(int index=0,minindex=59,hourindex=12;index<60;index++)   //这里设定的初始时间为12:59:00
       {
         LCD_Command_Write(0x01);
         delay(50);
         LCD_Write_String(3,0,logtxt);
         LCD_Write_String(3,1,sec);
         LCD_Write_Char(6,1,0x3a);
         LCD_Write_String(7,1,sec);
         LCD_Write_Char(10,1,0x3a);
         LCD_Write_String(11,1,sec);

         delay(950);
         if (index==59)
         {
         index=-1;
         minindex++;
         if (minindex==60)
         {
             minindex=0;
             hourindex++;
             if (hourindex==24)
             {
               hourindex=0;
             }
         }

         }
       }
   
    }

实现效果
http://player.youku.com/player.php/sid/XNjI2NTk2Mjg0/v.swf

swim 发表于 2013-11-5 23:15:28

感谢分享
页: [1]
查看完整版本: arduino+1602液晶实现简单电子时钟功能