数码管秒表 通过3个按钮控制,一个按钮用来进入设置模式和启动,两个按钮用于上调和下调初值。数码管显示4 位,2位显示分,2 位显示秒
时间: 2024-03-07 20:50:13 浏览: 61
下面是通过3个按钮控制的数码管秒表程序,其中一个按钮用于进入设置模式和启动,另外两个按钮用于上调和下调初值。数码管显示4位,其中2位显示分,2位显示秒。
```
#include <SevSeg.h>
SevSeg sevseg; // 创建数码管对象
int minutes = 0; // 分钟数
int seconds = 0; // 秒数
boolean running = false; // 秒表是否在运行中
boolean setting = false; // 是否在设置模式中
boolean adjustMinute = false; // 是否在调整分钟数
boolean adjustSecond = false; // 是否在调整秒数
void setup() {
byte numDigits = 4; // 数码管位数
byte digitPins[] = {2, 3, 4, 5}; // 数码管引脚
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // 数码管段引脚
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins); // 初始化数码管
sevseg.setBrightness(90); // 设置亮度(0-100)
pinMode(A0, INPUT_PULLUP); // 启动/进入设置模式按钮
pinMode(A1, INPUT_PULLUP); // 上调初值按钮
pinMode(A2, INPUT_PULLUP); // 下调初值按钮
}
void loop() {
if (digitalRead(A0) == LOW && !setting) { // 按下启动/进入设置模式按钮
if (!running) { // 如果秒表未开始,则启动秒表
running = true;
} else { // 如果秒表已开始,则进入设置模式
setting = true;
adjustMinute = true;
}
}
if (digitalRead(A1) == LOW && setting) { // 按下上调初值按钮
if (adjustMinute) { // 上调分钟数
minutes = (minutes + 1) % 100;
} else { // 上调秒数
seconds = (seconds + 1) % 60;
}
}
if (digitalRead(A2) == LOW && setting) { // 按下下调初值按钮
if (adjustMinute) { // 下调分钟数
minutes = (minutes + 99) % 100;
} else { // 下调秒数
seconds = (seconds + 59) % 60;
}
}
if (setting) { // 在设置模式中
if (adjustMinute) { // 设置分钟数
sevseg.setNumber(minutes, 0);
sevseg.setChar('-', 2);
sevseg.setNumber(seconds, 3);
} else { // 设置秒数
sevseg.setNumber(minutes, 0);
sevseg.setChar('-', 2);
sevseg.setNumber(seconds, 3);
}
sevseg.refreshDisplay(); // 显示设置的时间值
if (digitalRead(A0) == LOW) { // 按下启动/进入设置模式按钮退出设置模式
setting = false;
if (!running) { // 如果秒表未开始,则将当前设置的时间值作为起始时间
unsigned long startTime = minutes * 60 + seconds;
running = true;
}
} else { // 切换调整模式
if (adjustMinute) {
adjustMinute = false;
adjustSecond = true;
} else {
adjustMinute = true;
adjustSecond = false;
}
delay(200);
}
} else if (running) { // 正常运行秒表
unsigned long currentTime = millis() / 1000;
unsigned long elapsedTime = currentTime - startTime;
minutes = elapsedTime / 60;
seconds = elapsedTime % 60;
sevseg.setNumber(minutes, 0);
sevseg.setChar('-', 2);
sevseg.setNumber(seconds, 3);
sevseg.refreshDisplay();
}
}
```
在这个程序中,我们使用了4个变量来控制秒表的状态和时间值。当进入设置模式时,我们使用两个变量`adjustMinute`和`adjustSecond`来控制当前调整的是分钟数还是秒数。当调整时间值时,我们使用`digitalRead()`函数来检测按钮的状态,并根据需要将时间值加上或减去1。在设置模式中,我们使用`setNumber()`函数将设置的时间值显示在数码管上,用`setChar()`函数设置显示分隔符。在正常运行秒表时,我们使用`millis()`函数来计算经过的时间,并将分钟数和秒数显示在数码管上。
请注意,由于程序使用了阻止延迟函数`delay()`,因此在切换调整模式时,您可能需要多次按下按钮才能成功切换。
阅读全文