arduino中用millis()函数让数码管有两种状态,常亮和间隔0.5S闪烁
时间: 2024-03-06 19:49:23 浏览: 114
keil数码管逐个亮,在keil编程软件上实现对数码管的检测,P1口接数码管,500ms的间隔时间逐个点亮。.zip
可以通过以下代码实现:
```c++
const int digitPins[] = {2, 3, 4, 5}; // 数码管引脚,从左数第1~4个引脚分别接到数字引脚2~5
const int numDigits = 4; // 数码管位数
const int digitPatterns[] = {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110}; // 数码管显示模式,0~9对应的模式分别为第1~10个元素
unsigned long previousMillis = 0; // 存储上一次闪烁的时间
const long interval = 500; // 闪烁时间间隔,单位为毫秒
bool digitState = false; // 数码管状态,初始为关闭
void setup() {
for (int digit = 0; digit < numDigits; digit++) {
pinMode(digitPins[digit], OUTPUT); // 设置数码管引脚为输出模式
}
}
void loop() {
unsigned long currentMillis = millis(); // 获取当前时间
if (digitState) { // 如果数码管状态为常亮
for (int digit = 0; digit < numDigits; digit++) {
digitalWrite(digitPins[digit], HIGH); // 将数码管设置为高电平,即常亮
}
} else { // 如果数码管状态为闪烁
if (currentMillis - previousMillis >= interval) { // 如果距离上一次闪烁已经超过间隔时间
previousMillis = currentMillis; // 存储当前时间
for (int digit = 0; digit < numDigits; digit++) {
digitalWrite(digitPins[digit], !digitalRead(digitPins[digit])); // 取反数码管状态,即从常亮到闪烁,从闪烁到常亮
}
}
}
// 检测是否需要切换数码管状态
if (currentMillis % 1000 >= 500) { // 每隔1秒检测一次,判断当前时间是否大于等于0.5秒
digitState = !digitState; // 取反数码管状态,即从常亮到闪烁,从闪烁到常亮
}
// 显示数字
int number = 1234; // 要显示的数字
for (int digit = 0; digit < numDigits; digit++) {
int digitValue = number % 10; // 取最后一位数字
number /= 10; // 去掉最后一位数字
digitalWrite(digitPins[digit], (digitPatterns[digitValue] >> digit) & 1); // 显示数字
}
}
```
该代码通过 `millis()` 函数实现数码管的常亮和闪烁两种状态,其中 `digitState` 变量存储数码管状态,初始为关闭,即闪烁状态。每隔1秒检测一次,判断当前时间是否大于等于0.5秒,如果是,则取反数码管状态,即从闪烁状态变为常亮状态,从常亮状态变为闪烁状态。在闪烁状态下,每隔0.5秒闪烁一次数码管。在显示数字时,通过位运算来控制数码管的显示。
阅读全文