#include "TM1637.h"
#include "TimerOne.h"
int CLK = 11;
int key = 2;
int DIO = 12;
int sel = 6;
int mode = 5;
int add = 4;
int dec = 3;
int hour = 23;
int minute = 59;
int second = 50;
int time[6];
int screen = 0;
int done = 0;
boolean up_flag = false, down_flag = false;
TM1637 Display = TM1637(CLK, DIO);
void setup() {
for (int i = 2; i <= 6; i++) { // 假设只有这些引脚用作输入
pinMode(i, INPUT_PULLUP); // 使用上拉电阻
}
Display.init();
Display.setBrightness(BRIGHT_TYPICAL); // 假设这是设置亮度的正确方法
// Display.point(1); // 如果不需要点亮某个段,可以注释掉或删除这行代码
Timer1.initialize(1000000);
Timer1.attachInterrupt(timerIsr);
}
void loop() {
if (done == 1) {
keydown(); // 这个函数没有在代码中定义,需要您自己实现
}
showtime(hour, minute, second);
SelKey(); // 这个函数现在只处理选择键,与切屏分离
}
// 时间数据处理函数
void timedeal(int h, int m, int s) {
time[0] = h / 10;
time[1] = h % 10;
time[2] = m / 10;
time[3] = m % 10;
time[4] = s / 10;
time[5] = s % 10;
}
// 切屏函数(现在只处理切屏,不处理显示)
void SelScr() {
static boolean keyPressed = false; // 添加静态变量来跟踪按键状态
if (digitalRead(key) == LOW) {
delay(20); // 消抖
if (digitalRead(key) == LOW && !keyPressed) { // 确保按键刚刚被按下
keyPressed = true;
screen = (screen + 1) % 2;
// 不再在这里调用 showtime,因为它会导致无限循环
}
} else {
keyPressed = false; // 按键释放时重置状态
}
}
// 显示函数
void showtime(int h, int m, int s) {
timedeal(h, m, s);
if (screen == 0) {
// 显示时间(小时和分钟)
for (int i = 0; i < 4; i++) {
Display.display(i, time[i]);
}
} else {
// 假设第二个屏幕显示秒和其他信息(这里只是示例)
for (int i = 0; i < 4; i++) {
if (i < 2) {
Display.display(i, 0x7F); // 显示空白或特定字符
} else {
Display.display(i, time[i + 2 - 2]); // 显示秒(调整索引以匹配秒的位置)
}
}
// 注意:上面的代码有点冗余,因为当 i=2,3 时,它实际上是在显示秒。可以简化为:
// Display.display(0, 0x7F);
// Display.display(1, 0x7F);
// Display.display(2, time[4]);
// Display.display(3, time[5]);
}
// 在这里调用 SelScr 而不是在 showtime 内部处理按键,以避免无限循环
// SelScr(); // 已经移到 loop() 中独立调用
}
// 定时器中断函数
void timerIsr() {
second++;
if (second >= 60) {
second = 0;
minute++;
if (minute >= 60) {
minute = 0;
hour++;
if (hour >= 24) {
hour = 0;
}
}
}
// 这里可能需要更新显示,但最好通过其他方式(如非阻塞检查)而不是在中断中直接调用 showtime
}
// 选择键处理函数
void SelKey() {
static boolean selPressed = false;
if (digitalRead(sel) == LOW) {
delay(20);
if (digitalRead(sel) == LOW && !selPressed) {
selPressed = true;
done = (done + 1) % 2;
// 不再在这里调用 showtime,因为它会导致无限循环
}
} else {
selPressed = false;
}
}
// 注意:keydown, UpKey, DownKey, keydone 等函数没有在提供的代码中定义,需要您自己实现或删除相关调用。