数码管采用动态显示,可以实现8位数字同时闪烁的方式主要是通过快速频繁的切换每一个数码管的显示内容,并在每个数码管显示的短暂停留时间内,将一个数字转换成多个不同的显示形态。

其中,一个常用的实现方式是采用定时中断的方式来周期性地切换每一个数码管。比如,可以设定一个定时器,每隔一定时间(比如几毫秒)触发一次中断,然后在中断服务函数中,依次控制每个数码管的控制引脚进行扫描,并在每个数码管显示的短暂停留时间(比如几微秒)内,将一个数字转换成多个不同的显示形态。

具体来说,以常用的7段数码管为例,可以通过将一个10进制数字分解成每一位的数字来实现数字的动态显示。比如,将数字1234分解成数字1、数字2、数字3和数字4,然后通过查表的方式,将每个数字对应的7段LED的状况保存在一个数组中,最后在定时中断中依次控制每个数码管的控制引脚进行扫描,同时将不同的数字对应的7段LED状况依次输出到相应的数码管上。这样,就可以实现多个数码管同时显示数字,并且快速切换其中一个数码管显示的内容,从而实现动态闪烁效果。

下面是一个简单的示例代码,展示了如何使用定时中断来动态显示数字:

#define LED_PIN_1 2  // 数码管1的控制引脚
#define LED_PIN_2 3  // 数码管2的控制引脚
#define LED_PIN_3 4  // 数码管3的控制引脚
#define LED_PIN_4 5  // 数码管4的控制引脚

const int NUM_DIGITS = 4;  // 数码管的数量
int digits[NUM_DIGITS] = {0};  // 存储每个数码管显示的数字
int ledPins[NUM_DIGITS] = {LED_PIN_1, LED_PIN_2, LED_PIN_3, LED_PIN_4};  // 存储每个数码管的控制引脚

// 0~9的7段数码管显示表
const int digitTable[10][7] = {
  {1, 1, 1, 1, 1, 1, 0},  // 数字0的7段LED状况
  {0, 1, 1, 0, 0, 0, 0},  // 数字1的7段LED状况
  // ... (省略数字2~9的7段LED状况)
};

unsigned long previousMillis = 0;   // 上次中断触发的时间
const long interval = 1;            // 定时中断的时间间隔(毫秒)

void setup() {
  // 初始化数码管的控制引脚
  for(int i = 0; i < NUM_DIGITS; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  // 设定一个定时器
  Timer1.initialize(interval * 1000);  
  Timer1.attachInterrupt(displayDigits);    // 设定中断服务函数
}

void loop() {
  // 更新每个数码管显示的数字(比如从传感器获取数据)
  digits[0] = 1;
  digits[1] = 2;
  digits[2] = 3;
  digits[3] = 4;
}

void displayDigits() {
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    static int digitNum = 0;
    digitNum++;
    if(digitNum >= NUM_DIGITS) {
      digitNum = 0;
    }

    // 控制当前数码管的控制引脚为低电平
    for(int i = 0; i < NUM_DIGITS; i++) {
      digitalWrite(ledPins[i], HIGH);
    }
    digitalWrite(ledPins[digitNum], LOW);

    // 根据当前数码管需要显示的数字,输出对应的7段数码管状况
    int digit = digits[digitNum] % 10;
    for(int i = 0; i < 7; i++) {
      digitalWrite(ledPins[i], digitTable[digit][i]);
    }
  }
}

在这个示例代码中,我们将4个数码管的控制引脚存储在一个数组中,并使用一个另一个数组存储每个数码管需要显示的数字。在每次中断触发时,我们控制当前数码管对应的控制引脚为低电平,然后根据需要显示的数字,输出相应的7段数码管状况。这样,就可以在每个数码管之间快速地切换显示的数字,并实现闪烁的效果。