arduino 点亮4位8段数码管实验

9/26/2023 10:12:10 PM
967
0

一、物料

  1. 共阳极4位8段数码管x1  
  2. 1k电阻x4
  3. 杜邦线若干

二、接线

数码管的a、b、c、d、e、f、g、dp引脚连接到Arduino的数字引脚  13、2、3、4、5、6、7、8

数码管d1 d2 d3 d4 接 Arduino的数字引脚 9、10、11、12

数码管图示

 

三、源码

本实验使用的数码管为共阳极数码管,高电平无法点亮,低电平点亮。在实验过程,应当注意自己使用的数码管是共阳极还是共阴极。

注意事项:

  1. 源码中 digits  s数组存储了0~9这十个数字在点亮时应为引脚输出的电平。如上面所说,低电平才能点亮数码管的段。例如如果要显示1这个数字,则要点亮 b 和 c,其他段熄灭状态,所以 b、c两个段对应的针脚输出低电平即可  [ { 1, 0, 0, 1, 1, 1, 1, 1 },  // 1]
  2. 因为每次为 a\b\c\d\e\f\g\dp这些引脚输出电平会作用到所有的数字上,所以,如果想单独点亮某个位的数码管时,要关闭其他3个数码管。如何关闭:本案例中数码管共阳极,所以对数码管的D口输出低电平即可。
  3. 如何显示多位数字?显示多位数字要利用人眼睛的视觉停留这个规律。即:1s内24hz的闪动人眼就无法感知其在闪动。所以如果要显示多位数字,每一轮4次分别打印每位数码管上的数字,每秒至少进行24轮。这相当于,每位数码管上的数字闪了24次以上,人眼无法感知到其熄灭的状态

 

/*
    共阳极,正极供电
    数码管低电平点亮,高电平熄灭
    1号针脚无法正常输出低电平,换为13号脚。原因未知
    */
    int digitPins[] = { 9, 10, 11, 12 };              // 数码管的阳极引脚连接到Arduino的数字引脚
    int segmentPins[] = { 13, 2, 3, 4, 5, 6, 7, 8 };  // 数码管的a、b、c、d、e、f、g、dp引脚连接到Arduino的数字引脚
    byte digits[10][8] = {
      //a  b  c  d  e  f  g  dp
      { 0, 0, 0, 0, 0, 0, 1, 1 },  // 0
      { 1, 0, 0, 1, 1, 1, 1, 1 },  // 1
      { 0, 0, 1, 0, 0, 1, 0, 1 },  // 2
      { 0, 0, 0, 0, 1, 1, 0, 1 },  // 3
      { 1, 0, 0, 1, 1, 0, 0, 1 },  // 4
      { 0, 1, 0, 0, 1, 0, 0, 1 },  // 5
      { 0, 1, 0, 0, 0, 0, 0, 1 },  // 6
      { 0, 0, 0, 1, 1, 1, 1, 1 },  // 7
      { 0, 0, 0, 0, 0, 0, 0, 1 },  // 8
      { 0, 0, 0, 0, 1, 0, 0, 1 }   // 9
    };
    
    void setup() {
      Serial.begin(9600);  //初始化串口设置
      for (int i = 0; i < 4; i++) {
        pinMode(digitPins[i], OUTPUT);  // 设置数码管的阳极引脚为输出模式
      }
      for (int i = 0; i < 8; i++) {
        pinMode(segmentPins[i], OUTPUT);  // 设置数码管的a、b、c、d、e、f、g、dp引脚为输出模式
      }
    }
    
    void loop() {
    
      //showDigit(8,3);  //打印第4个数码管,数字为4
    
      
      for (int i = 0; i <= 9999; i++) {
        showNumber(i);  // 显示数字1234
        //delay(1000);    // 延迟1秒
      }
      
    }
    
    void showNumber(int number) {
      Serial.print("打印:");
      Serial.print(number);
      Serial.println();
      int digit;
      for (int c = 0; c < 50; c++) {  //每秒对4个数码管显示125次。每个数码管停顿2ms,一轮下来停顿8ms,则1s下来,要进行125轮
    
        int temp = number;
        for (int i = 3; i >= 0; i--) {
          digit = temp % 10;    // 获取个位数
          temp = temp / 10;     // 去掉个位数
          showDigit(digit, i);  // 显示当前位的数字
          Serial.print(digit);
          delay(2);  // 延迟一小段时间,可调整亮度
        }
        Serial.print(" ");
      }
      Serial.println();
    }
    
    void showDigit(int digit, int com) {
      for (int i = 0; i < 8; i++) {
        digitalWrite(segmentPins[i], HIGH);  //关闭所有数码管的段显,因为他们不会立即完全熄灭。关闭余晖 。低电平点亮,高电平熄灭
      }
    
      /*选择一个数码管打开*/
      for (int i = 0; i < 4; i++) {
        if (i == com) {
          digitalWrite(digitPins[i], HIGH);  //打开指定位的数码管
        } else {
          digitalWrite(digitPins[i], LOW);  //关闭其他位的数码管
        }
      }
    
      /*数码管显示数字,只有上文被选择的数码管会亮*/
      for (int i = 0; i < 8; i++) {
        digitalWrite(segmentPins[i], digits[digit][i]);  // 根据数字的显示模式设置数码管的a、b、c、d、e、f、g引脚
      }
    }

四、演示

https://www.bilibili.com/video/BV1Mz4y157s9/

 

 

全部评论



提问