Arduino时钟项目:如何取消delay(60000)以实现键盘调时
问题描述
我正在制作一款7段数码管时钟,希望通过键盘实现时间调节功能,但代码中delay(60000);这条延迟60秒的语句会干扰键盘响应。
我的代码
以下是整合了@tuyau2poil实现方案的代码:
/* * 7 Segment Clock * Created by SniverDaBest * Date: 2/9/23 */ // Include the 7-segment display library: #include <TM1637Display.h> #include <Key.h> #include <Keypad.h> #define CLK 5 #define DIO 6 const byte ROWS = 4; const byte COLS = 4; int buzzer = 3; bool clockStarted = false; unsigned long timerSec; int time = 1200; int secTime = 0; char result; char buttons[ROWS][COLS] = { {'1', '2', '3', 'A'}, // 1st row {'4', '5', '6', 'B'}, // 2nd row {'7', '8', '9', 'C'}, // 3rd row {'*', '0', '#', 'D'} // 4th row }; byte rowPins[ROWS] = {9, 8, 7, 4}; byte colPins[COLS] = {10, 11, 12, 13}; // reassigned two of the column pins // Create display object of type TM1637Display: TM1637Display disp = TM1637Display(CLK, DIO); Keypad kp = Keypad(makeKeymap(buttons), rowPins, colPins, ROWS, COLS); // Create array that turns all segments on: const uint8_t all_on[] = {0xff, 0xff, 0xff, 0xff}; // 0xff is a hexidecimal number whose binary // representation is all ones // Create array that turns all segments off: const uint8_t blank[] = {0x00, 0x00, 0x00, 0x00}; void setup() { pinMode(13, OUTPUT); digitalWrite(13, HIGH); disp.clear(); delay(1000); // Set the brightness: disp.setBrightness(7); // All segments on: disp.setSegments(all_on); delay(2000); disp.clear(); delay(1000); timerSec = millis(); } void runEverySecond() { timerSec = millis(); secTime++; if (secTime > 60) { runEveryMinute(); } } void runEveryMinute() { secTime = 0; if (result == '1') { if (time <= 1259) { time++; } if (time == 1260) { time = 100; } if (time <= 159) { time++; } if (time == 160) { time = 200; } if (time <= 259) { time++; } if (time == 260) { time = 300; } if (time <= 359) { time++; } if (time == 360) { time = 400; } if (time <= 459) { time++; } if (time == 460) { time = 500; } if (time <= 559) { time++; } if (time == 560) { time = 600; } if (time <= 659) { time++; } if (time == 660) { time = 700; } if (time <= 759) { time++; } if (time == 760) { time = 800; } if (time <= 859) { time++; } if (time == 860) { time = 900; } if (time <= 959) { time++; } if (time == 960) { time = 1000; } if (time <= 1059) { time++; } if (time == 1060) { time = 1100; } if (time <= 1159) { time++; } if (time == 1160) { time = 1200; } } else if (result == '2'){ if (time <= 1259) { time = time - 1; } if (time == 1199) { time = 1159; } if (time <= 159) { time = time - 1; } if (time == 160) { time = 1000; } if (time <= 259) { time = time - 1; } if (time == 260) { time = 300; } if (time <= 359) { time = time - 1; } if (time == 360) { time = 400; } if (time <= 459) { time = time - 1; } if (time == 460) { time = 500; } if (time <= 559) { time = time - 1; } if (time == 560) { time = 600; } if (time <= 659) { time = time - 1; } if (time == 660) { time = 700; } if (time <= 759) { time = time - 1; } if (time == 760) { time = 800; } if (time <= 859) { time = time - 1; } if (time == 860) { time = 900; } if (time <= 959) { time = time - 1; } if (time == 960) { time = 1000; } if (time <= 1059) { time = time - 1; } if (time == 1060) { time = 1100; } if (time <= 1159) { time = time - 1; } if (time == 1160) { time = 1200; } } for (time <= 1259; time++;) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 100; time <= 159; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 200; time <= 259; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 300; time <= 359; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 400; time <= 459; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 500; time <= 559; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 600; time <= 659; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 700; time <= 759; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 800; time <= 859; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 900; time <= 959; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 1000; time <= 1059; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } for (time = 1100; time <= 1159; time++) { disp.showNumberDecEx(time, 0b11100000, false, 4, 0); delay(60000); } } void loop() { result = kp.getKey(); if (millis() - timerSec > 1000) { runEverySecond(); } }
已尝试的解决方法
我搜索了Arduino论坛及相关帖子,但未找到有效解决方案。Arduino也没有cancelDelay();或resetDelay();这类直接取消延迟的命令,恳请各位提供技术帮助!
内容的提问来源于stack exchange,提问作者SniverDaBest
相关产品推荐
相关产品推荐

