以下是改进后的实验代码:

// 定义常量
const int digitPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 数码管位选引脚
const int segmentPins[] = {10, 11, 12, 13, A0, A1, A2, A3}; // 数码管段选引脚
const unsigned long interval = 1000; // 定时器间隔

// 定义变量
int digits[] = {0, 0}; // 数码管显示的两位数
unsigned long previousMillis = 0; // 上一次定时器计时的时间
int digitIndex = 0; // 当前显示的数码管位选引脚

void setup() {
  // 初始化引脚
  for (int i = 0; i < 8; i++) {
    pinMode(digitPins[i], OUTPUT);
    pinMode(segmentPins[i], OUTPUT);
  }
  // 设置定时器2
  TCCR2A = 0; // 清空寄存器A
  TCCR2B = 0; // 清空寄存器B
  TCNT2 = 0; // 清空计数器
  OCR2A = 249; // 设置比较值,产生1ms的间隔
  TCCR2A |= (1 << WGM21); // 设置比较模式
  TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // 设置预分频,64分频,1ms间隔
}

void loop() {
  // 获取当前时间
  unsigned long currentMillis = millis();
  // 如果定时器时间间隔已经过去
  if (currentMillis - previousMillis >= interval) {
    // 重置计时器
    previousMillis = currentMillis;
    // 计时器加一
    digits[digitIndex]++;
    // 如果当前位加到9,就重置为0
    if (digits[digitIndex] == 10) {
      digits[digitIndex] = 0;
    }
    // 如果当前位是个位数,就更新十位数
    if (digitIndex == 0 && digits[digitIndex] == 0) {
      digits[1]++;
      if (digits[1] == 6) {
        digits[1] = 0;
      }
    }
    // 更新显示
    updateDisplay();
    // 切换到下一个位
    digitIndex++;
    if (digitIndex == 2) {
      digitIndex = 0;
    }
  }
}

void updateDisplay() {
  // 更新数码管显示
  for (int i = 0; i < 8; i++) {
    digitalWrite(segmentPins[i], LOW);
    digitalWrite(digitPins[i], HIGH);
  }
  digitalWrite(segmentPins[digits[0]], HIGH);
  digitalWrite(digitPins[0], LOW);
  digitalWrite(segmentPins[digits[1]], HIGH);
  digitalWrite(digitPins[1], HIGH);
}

这个代码使用了定时器2来产生1ms的间隔,然后每隔1秒更新一次数码管显示。两个数码管的位选引脚和段选引脚分别通过数组进行定义和管理。使用了一个digits数组来存储当前显示的两个数码管的数字,然后在定时器中每隔一秒更新一次数字,并更新显示。更新显示使用了updateDisplay()函数,该函数会根据digits数组的值来更新数码管的显示

改实验代码是什么定时器与数码管显示目的:掌握ARDUINO下的定时器使用方法数码管的驱动与显示方法内容:①利用定时器2产生精确的1秒并进行计时实现0-59的循环显示;连接2个数码管需要10个端口自己选择与分配如果不够可以考虑进行IO口扩展。

原文地址: https://www.cveoy.top/t/topic/eC7F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录