### Arduino 控制四位数码管
为了实现四位数码管分别显示不同数字,采用动态扫描技术可以有效解决问题。通过让各个数码管依次轮流点亮并迅速切换所显示的数字,在视觉上形成连续稳定的多位数字显示效果[^2]。
下面是一个完整的Arduino控制四位数码管的例子:
#### 所需材料
- Arduino UNO套件
- 计算机
- 4位数码管
- 4个220欧姆限流电阻
- 面包板
- 杜邦线等[^1]
#### 示例代码
```cpp
// 定义连接到数码管各段的引脚号
const int digitPins[] = {9, 8, 7, 6}; // 数码管选通端口定义
const int segmentPins[] = {A0, A1, A2, A3, A4, A5, 10, 11}; // a,b,c,d,e,f,g,dp
byte numbers[][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
void setup() {
for (int i=0; i<4; i++) pinMode(digitPins[i], OUTPUT);
for (int i=0; i<8; i++) pinMode(segmentPins[i], OUTPUT);
Serial.begin(9600);
}
void loop() {
displayNumber(5, 6, 7, 8);
}
void clearLEDs(){
for(int i=0;i<4;i++){
digitalWrite(digitPins[i], HIGH);
}
}
void pickDigit(byte n){
for(int i=0;i<4;i++){
if(i==(n-1)){
digitalWrite(digitPins[i], LOW);
}else{
digitalWrite(digitPins[i], HIGH);
}
}
}
void pickNumber(byte num){
byte segments[7];
memcpy(segments,numbers[num-1],sizeof(segments));
for(int i=0;i<7;i++){
digitalWrite(segmentPins[i],segments[i]);
}
}
void displayNumber(byte d1, byte d2, byte d3, byte d4){
static unsigned long lastTime;
static byte currentDigit;
if(millis()-lastTime>2){
lastTime=millis();
clearLEDs();
switch(currentDigit){
case 0:
pickDigit(1);
pickNumber(d1);
break;
case 1:
pickDigit(2);
pickNumber(d2);
break;
case 2:
pickDigit(3);
pickNumber(d3);
break;
case 3:
pickDigit(4);
pickNumber(d4);
break;
}
currentDigit=(currentDigit+1)%4;
}
}
```
此代码实现了对四个独立位置上的数字进行循环刷新的功能,从而可以在四位数码管上显示出不同的数值组合。每次只激活一个数码管,并设置其应显示的具体字符;当完成一次更新后立即转向下一个数码管执行同样的操作,利用人眼的视觉暂留效应达到稳定显示的目的。