サンプルロゴ

2013年4月4日木曜日

デジタル時計 <ソースコード>



 次はこれに使った回路を公開します(;:;)


#include <MsTimer2.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd = LiquidCrystal(12, 11, 10, 5, 4, 3, 2);
// 初期値
int year = 2013;
int month = 4;
int day = 4;
int hour = 3;
int minite = 00;
int sec = 00;
int s_year = 2013;
int s_month = 4;
int s_day = 2;
int s_hour = 17;
int s_minite = 00;
int s_sec = 00;
// 日付と時刻をテキスト変換するために用意
char strDate[11];
char strTime[9];
// 各月の日数
int set_day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
//スイッチ入力
int sw_in = 7;
int sw_in2 =9;
int lode=0;
int lode2=0;
const int led1 = 8;
int old = 0;
int oldSW = HIGH;


// LCDへ日時を表示させる
// 引数は年月日時分秒
void outputLCD(int y, int m, int d, int h, int mi, int s){
  sprintf(strDate, "%04d/%02d/%02d", y, m, d);
  sprintf(strTime, "%02d:%02d:%02d", h, mi, s);
  lcd.setCursor(6, 0);
  lcd.print(strDate);
  lcd.setCursor(8, 1);
  lcd.print(strTime);

}

void countup(void)

{
  // 60秒なら0に戻して分をイクリメント
  if(sec < 59){
    sec++;
  }else{
    sec = 0;
    minite++;
  }

  // 60分なら0に戻して時をイクリメント
  if(minite == 60){
    minite = 0;
    hour++;
  }

  // 24時なら0に戻して日をイクリメント
  if(hour == 24){
    hour = 0;
    day++;
  }

  // 閏年なら2月は29日まで
  if(year%4 == 0 && year%100 != 0 || year%400 == 0){
    set_day[1] = 29;
  }else{
    set_day[1] = 28;
  }

  // 日付が月の日数+1なら1に戻して月をインクリメント
  if(day == set_day[month-1]+1){
    day = 1;
    month++;
  }

  // 13月なら1に戻して年をインクリメント
  if(month == 13){
    month = 1;
    year++;
  }
 
  if(oldSW == HIGH)
  {
  outputLCD(year, month, day, hour, minite, sec);
  }
}
void set_sw(void)
{
  if(s_sec < 59){
    s_sec++;
  }else{
    s_sec = 0;
    s_minite++;
  }

  // 60分なら0に戻して時をイクリメント
  if(s_minite == 60){
    s_minite = 0;
    s_hour++;
  }

  // 24時なら0に戻して日をイクリメント
  if(s_hour == 24){
    s_hour = 0;
    s_day++;
  }

  // 閏年なら2月は29日まで
  if(s_year%4 == 0 && s_year%100 != 0 || s_year%400 == 0){
    set_day[1] = 29;
  }else{
    set_day[1] = 28;
  }

  // 日付が月の日数+1なら1に戻して月をインクリメント
  if(s_day == set_day[month-1]+1){
    s_day = 1;
    month++;
  }

  // 13月なら1に戻して年をインクリメント
  if(s_month == 13){
    s_month = 1;
    s_year++;
  }


  // LCDへ再表示
  outputLCD(s_year, s_month, s_day, s_hour, s_minite, s_sec);
}
void setup(){
  // LCD初期化
  lcd.begin(16, 2);
  lcd.clear();
  // 時刻をoutputLCDで表示
  outputLCD(year, month, day, hour, minite, sec);
   pinMode(sw_in,INPUT);
    pinMode(sw_in2,INPUT);
  pinMode(led1,OUTPUT);

lcd.setCursor(0, 0);
        lcd.print("timer ");

  // 割り込み処理 1000msecごとにcountupを呼び出し
  MsTimer2::set(1000, countup);
  MsTimer2::start();

}
void loop(void)
{
  delay(100);  
   lode2 = digitalRead(sw_in2);
   lode = digitalRead(sw_in);
  
   if(lode == HIGH)
   {
      if(oldSW == LOW)
     {
       set_sw();
     }    
   }
  
  
   if(lode2 == HIGH)
   {
      if(oldSW == HIGH)
      {
        lcd.setCursor(0, 0);
        lcd.print("config");      
        oldSW = LOW;
      }
      else
      {

        lcd.setCursor(0, 0);
        lcd.print("timer ");
        oldSW = HIGH;
      }
   }
}

0 件のコメント:

コメントを投稿