Arduino用库的定时器对数字管进行定时扫描
时间: 2023-06-26 17:10:32 浏览: 93
定时器实现码表(数码管显示)
5星 · 资源好评率100%
可以使用Arduino的定时器和数字IO口来实现数字管的定时扫描。以下是一个简单的例子:
1. 首先,需要引入对应的库文件,如SevenSeg库。
2. 然后,定义数字管的引脚和显示的数字。
3. 接着,设置定时器的频率和计数值,并启用定时器中断。
4. 在定时器中断中,依次输出每个数字管的信号,同时更新显示的数字。
下面是一个示例代码:
```c++
#include <SevenSeg.h>
SevenSeg disp(2, 3, 4, 5, 6, 7, 8); // 定义数字管的引脚
int digit = 0; // 当前显示的数字
void setup() {
disp.begin(); // 初始化数字管
disp.setBrightness(50); // 设置亮度
TCCR1A = 0; // 设置定时器1的计数模式
TCCR1B = (1 << CS11) | (1 << CS10); // 设置分频器,将时钟频率分为64分之一
OCR1A = 15625; // 设置计数值,1秒钟计数15625次
TIMSK1 |= (1 << OCIE1A); // 启用定时器中断
}
void loop() {
// 更新要显示的数字
digit++;
if (digit > 9) {
digit = 0;
}
// 每次循环更新数字管显示
disp.writeDigitNum(0, digit, false);
disp.writeDigitNum(1, digit, false);
disp.writeColon(true);
delay(1000);
}
ISR(TIMER1_COMPA_vect) {
// 定时器中断中,依次输出每个数字管的信号
switch (digit) {
case 0:
digitalWrite(2, HIGH);
break;
case 1:
digitalWrite(3, HIGH);
break;
case 2:
digitalWrite(4, HIGH);
break;
case 3:
digitalWrite(5, HIGH);
break;
case 4:
digitalWrite(6, HIGH);
break;
case 5:
digitalWrite(7, HIGH);
break;
case 6:
digitalWrite(8, HIGH);
break;
}
digit++;
if (digit > 6) {
digit = 0;
}
// 关闭上一个数字管的信号
switch (digit - 1) {
case 0:
digitalWrite(2, LOW);
break;
case 1:
digitalWrite(3, LOW);
break;
case 2:
digitalWrite(4, LOW);
break;
case 3:
digitalWrite(5, LOW);
break;
case 4:
digitalWrite(6, LOW);
break;
case 5:
digitalWrite(7, LOW);
break;
case 6:
digitalWrite(8, LOW);
break;
}
}
```
在上面的代码中,定时器1的计数模式被设置为CTC模式,计数频率为16MHz / 64 = 250KHz,计数值为15625,即定时器每计数15625次中断一次,时间间隔为1秒。在定时器中断中,依次输出每个数字管的信号,并更新要显示的数字。在循环中,每次更新数字管显示后延时1秒钟,等待下一次定时器中断。
阅读全文