找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2290|回復: 0
收起左側

arduino電子鐘程序

[復制鏈接]
ID:155430 發(fā)表于 2016-12-17 14:49 | 顯示全部樓層 |閱讀模式
/* * LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V  */
#include <LiquidCrystal.h>       //LCD1602顯示頭文件
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
unsigned long seconds;
int  s = 0, m = 0, h = 0, d = 0, mon = 0, y = 0;   //時間進位
int  second = 0, minute = 0, hour = 0, day = 0, month = 0, year = 0;  //當前時間
int  SECOND = 0, MINUTE = 0, HOUR = 0, DAY = 0, MONTH = 0, YEAR = 0;  //初始時間
void setup()
{
  lcd.begin(16, 2);  
  lcd.setCursor(2, 1);   lcd.print(":");   
  lcd.setCursor(5, 1);   lcd.print(":");  
  lcd.setCursor(4, 0);   lcd.print('-');  
  lcd.setCursor(7, 0);   lcd.print('-');   
  for(int i = 2;i <= 13; i++)
  {  
    pinMode(i,OUTPUT);  
  }
  set(2015,5,15,22,19,32);  //設置初始時間
}

void FormatDisplay(int col, int row,int num)   //格式化輸出
{
  lcd.setCursor(col, row);
  if(num < 10)   lcd.print("0");
  lcd.print(num);   
}
void time()   //計算時間
{   
     second = ( SECOND + seconds ) % 60;   //計算秒
     m = ( SECOND + seconds ) / 60;        //分鐘進位
     FormatDisplay(6,1,second);

     minute = ( MINUTE + m ) % 60;  //計算分鐘
     h = ( MINUTE + m ) / 60;       //小時進位
     FormatDisplay(3,1,minute);      

     hour = ( HOUR + h ) % 24;   //計算小時
     d = ( HOUR + h ) / 24;      //天數(shù)進位
     FormatDisplay(0,1,hour);
}

int Days(int year, int month)   //根據(jù)年月計算當月天數(shù)
{
    int days = 0;
    if (month != 2)
    {
      switch (month)
      {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31;  break;
        case 4: case 6: case 9: case 11:  days = 30;  break;
      }
    }
    else //閏年
    {
      if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)    days = 29;
      else    days = 28;   
    }  
   return days;   
}

void Day()   //計算當月天數(shù)
{     
   int days = Days(year,month);
   int days_up;
   if( month == 1 )   days_up = Days( year - 1, 12 );
   else  days_up = Days( year, month - 1 );
   day = ( DAY + d ) % days;
   if( day == 0 )   day = days;   
   if( ( DAY + d ) == days + 1 )
   {
     DAY -= days;
     mon++;
   }
   if(( DAY + d ) == 0)
   {
     DAY += days_up;
     mon--;
   }
   FormatDisplay(8,0,day);
}

void Month()    //計算月份
{  
   month = ( MONTH + mon ) % 12;
   if( month == 0 )  month = 12;
   y = ( MONTH + mon - 1) / 12;
   FormatDisplay(5,0,month);
}

void Year()    //計算年份
{
    year = ( YEAR + y ) % 9999;
    if( year == 0 ) year = 9999;
    lcd.setCursor(0, 0);
    if(year < 1000)  { lcd.print("0"); }
    if(year < 100)   { lcd.print("0"); }
    if(year < 10)    { lcd.print("0"); }
    lcd.print(year);
}

void Week(int y,int m, int d)  //根據(jù)年月日計算星期幾
{           
    if(m==1) m=13;
    if(m==2) m=14;
    int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1;
    String weekstr="";
    switch(week)
      {
          case 1: weekstr="Mon. ";   break;
          case 2: weekstr="Tues. ";  break;
          case 3: weekstr="Wed. ";   break;
          case 4: weekstr="Thur. ";  break;
          case 5: weekstr="Fri. ";   break;
          case 6: weekstr="Sat. ";   break;
          case 7: weekstr="Sun. ";   break;
      }   
    lcd.setCursor(11, 0);
    lcd.print(weekstr);
}

void set(int y, int mon, int d, int h, int m, int s)
{
  YEAR = y;
  MONTH = mon;
  DAY = d;  
  HOUR = h;
  MINUTE = m;
  SECOND = s;  
}

void Display()  //顯示時間、日期、星期
{
  time();
  Day();  
  Month();
  Year();
  Week(year,month,day);  
}

void loop()
{     
   seconds = millis()/1000;   
   Display();
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表