#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "TimerOne.h"
#define add 9 // 按键“增加”引脚
#define dec 10 // 按键“减少”引脚
#define sel 7 // 按键“选择”引脚
#define mode 8 // 按键“模式”引脚
int hour = 23;
int minute = 59;
int second = 50;
char time[9]; // 将int改为char数组
bool selectMode = false; // 标志位,用于切换选择模式
int editField = 0; // 0:小时,1:分钟,2:秒
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(add, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(sel, INPUT_PULLUP);
pinMode(mode, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Time is:");
Timer1.initialize(1000000);
Timer1.attachInterrupt(timerIsr);
}
// 更新时间数组以供显示
void timedeal(int h, int m, int s) {
time[0] = h / 10 + '0'; // 小时十位
time[1] = h % 10 + '0'; // 小时个位
time[2] = ':'; // 分隔符
time[3] = m / 10 + '0'; // 分钟十位
time[4] = m % 10 + '0'; // 分钟个位
time[5] = ':'; // 分隔符
time[6] = s / 10 + '0'; // 秒十位
time[7] = s % 10 + '0'; // 秒个位
time[8] = '\0'; // 字符串结束符
}
// 显示时间到液晶屏
void showtime(int h, int m, int s) {
timedeal(h, m, s);
lcd.setCursor(8, 1);
lcd.print(time); // 显示时间字符串
}
void timerIsr() {
if (!selectMode) { // 只有在非选择模式下时间才会更新
second++;
if (second > 59) {
second = 0;
minute++;
if (minute > 59) {
minute = 0;
hour++;
if (hour > 23) {
hour = 0;
}
}
}
}
}
// 选择按键逻辑,用于切换正在编辑的字段
void SelKey() {
if (digitalRead(sel) == LOW) {
delay(20);
if (digitalRead(sel) == LOW) {
if (selectMode) {
editField = (editField + 1) % 3; // 循环切换编辑字段
} else {
selectMode = true; // 进入选择模式
}
while (digitalRead(sel) == LOW); // 等待按键释放
}
}
}
// 模式按键逻辑
void MsKey() {
if (digitalRead(mode) == LOW) {
delay(20);
if (digitalRead(mode) == LOW) {
selectMode = false; // 退出选择模式
while (digitalRead(mode) == LOW); // 等待按键释放
}
}
}
// 增加时间的逻辑
void UpKey() {
if (digitalRead(add) == LOW) {
delay(10);
if (digitalRead(add) == LOW) {
if (selectMode) { // 只有在选择模式下才允许修改时间
if (editField == 0) { // 编辑小时
hour = (hour + 1) % 24;
} else if (editField == 1) { // 编辑分钟
minute = (minute + 1) % 60;
} else if (editField == 2) { // 编辑秒
second = (second + 1) % 60;
}
}
while (digitalRead(add) == LOW); // 等待按键释放
showtime(hour, minute, second);
}
}
}
// 减少时间的逻辑
void DownKey() {
if (digitalRead(dec) == LOW) {
delay(10);
if (digitalRead(dec) == LOW) {
if (selectMode) { // 只有在选择模式下才允许修改时间
if (editField == 0) { // 编辑小时
hour = (hour == 0) ? 23 : hour - 1;
} else if (editField == 1) { // 编辑分钟
minute = (minute == 0) ? 59 : minute - 1;
} else if (editField == 2) { // 编辑秒
second = (second == 0) ? 59 : second - 1;
}
}
while (digitalRead(dec) == LOW); // 等待按键释放
showtime(hour, minute, second);
}
}
}
void loop() {
UpKey(); // 增加时间
DownKey(); // 减少时间
SelKey(); // 选择时间
MsKey(); // 切换模式
showtime(hour, minute, second); // 显示时间
}