#include "Clock.h"
#include <TimerOne.h>
#include <Keypad.h>
Clock myClock(0, 0, 0);
int h = 23;
int m = 59;
int s = 59;
int x = 99;
int h1 = 0;
int m1 = 0;
int s1 = 0;
int x1 = 0;
int time = 0;
int tamp = 0;
int count = 0;
bool _update = false;
bool _update2 = false;
bool check = false;
bool _switch = false;
bool nitial = true;
const uint8_t ROWS = 4;
const uint8_t COLS = 3;
char keys[ROWS][COLS] = {
{ '1', '2', '3'},
{ '4', '5', '6' },
{ '7', '8', '9' },
{ '*', '0', '#' }
};
uint8_t colPins[COLS] = { 5, 4, 3 };
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 };
Keypad pad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char key = pad.getKey();
void setup() {
myClock.init();
Serial.begin(9600);
Serial.println(" ");
Timer1.initialize(10000);
Timer1.attachInterrupt(clk);
myClock.setTime(h, m, s, x);
}
void loop() {
myClock.autoTime();
myClock.displayTime();
if (nitial == true) { //初始時會直接進入倒數 但是後面按了#後就不會再進入此
if (_update == true) {
myClock.setTime(h, m, s, x);
nitial == false;
}
}
char key = pad.getKey();
if (key != NO_KEY) {
Serial.println(key);
if (key == '#') {
h1 = h;
m1 = m;
s1 = s;
x1 = x;//保存上一刻的最新時間
nitial = false;
_switch = false;
check = true; // 進入設置模式
Serial.println(check);
}
}
while (check) {
myClock.autoTime();
myClock.displayTime();
if (_update2 == true) {
myClock.blink();
_update2 = false;
}
char key = pad.getKey();
if (key != NO_KEY) {
if (key >= '0' && key <= '9') { // 將按鍵的值轉換為數字
int num = key - '0';
if (count == 0) {
tamp = num * 10 ;
h1 = tamp + h1 % 10;
myClock._display(0, num);
myClock.setTime(h1, m1, s1, x1);
} else if (count == 1) {
tamp = h1 - h1 % 10 + num ;
h1 = tamp ;
myClock._display(1, num);
myClock.setTime(h1, m1, s1, x1);//正式更新完小時
} else if (count == 2) {
tamp = num * 10 ;
m1 = tamp + m1 % 10;
myClock._display(2, num);
myClock.setTime(h1, m1, s1, x1);
} else if (count == 3) {
tamp = m1 - m1 % 10 + num ;
m1 = tamp ;
myClock._display(3, num);
myClock.setTime(h1, m1, s1, x1);//正式更新完分鐘
} else if (count == 4) {
tamp = num * 10 ;
s1 = tamp + s1 % 10;
myClock._display(4, num);
myClock.setTime(h1, m1, s1, x1);
} else if (count == 5) {
tamp = s1 - s1 % 10 + num ;
s1 = tamp ;
myClock._display(5, num);
myClock.setTime(h1, m1, s1, x1);//正式更新完秒鐘
}
count++; // 增加計數器,用於標記設置的項目
tamp = 0;
if (count > 5) {
count = 0; // 重置計數器
}
} else if (key == '*') {
count = 0;//如果突然中止 必須確保計數器歸0
check = false;
h = h1;
m = m1;
s = s1;
x = x1;
_switch = true;// 退出設置模式
}
}
}
if (_switch == true) {
if (_update == true) {
myClock.setTime(h, m, s, x);
_update == false;
}
}
}
void clk() {//這裡應該只放更新時間的邏輯
x--;
time++;
if (x <= 0) {
x = 99;
s--;
if (s <= 0) {
s = 59;
m--;
if (m <= 0) {
m = 59;
h--;
if (h <= 0 ) {
h = 23;
}
}
}
}
_update = true;
if (time == 50) {
_update2 = true;
time = 0;
}
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3