You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:25:30