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;
}
}
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿