//该数码管是四位,共阴极数码管
// 数码管引脚连接
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEG_A 6
#define SEG_B 7
#define SEG_C 8
#define SEG_D 9
#define SEG_E 10
#define SEG_F 11
#define SEG_G 12
#define SEG_DP 13

// 数码管的数字映射表
const byte digitMap[11][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, 0, 0, 1, 1},  // 9
  {0, 0, 0, 0, 0, 0, 1}   // -
};

void setup() {
  // 设置数码管引脚为输出模式
  pinMode(DIGIT_1, OUTPUT);
  pinMode(DIGIT_2, OUTPUT);
  pinMode(DIGIT_3, OUTPUT);
  pinMode(DIGIT_4, OUTPUT);
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);


  digitalWrite(SEG_A, LOW);//防止开头闪一下
  digitalWrite(SEG_B, LOW);
  digitalWrite(SEG_C, LOW);
  digitalWrite(SEG_D, LOW);
  digitalWrite(SEG_E, LOW);
  digitalWrite(SEG_F, LOW);
  digitalWrite(SEG_G, LOW);
  digitalWrite(DIGIT_1, HIGH);
  digitalWrite(DIGIT_2, HIGH);
  digitalWrite(DIGIT_3, HIGH);
  digitalWrite(DIGIT_4, HIGH);
}

void loop() {
  
  //显示-9~-1
  for(int i = 9; i>= 1; i--){
    for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
      //显示“-”
      digitalWrite(DIGIT_3, LOW);
      digitalWrite(SEG_G, HIGH);
      delay(1);
      digitalWrite(SEG_G, LOW);
      digitalWrite(DIGIT_3, HIGH);
      
      displayNumber(i);
    }
    delay(100);
  }
  
  //显示—0.9~-0.1
  for(int i = 9; i>= 1; i--){
    for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
      //显示“-”
      digitalWrite(DIGIT_2, LOW);
      digitalWrite(SEG_G, HIGH);
      delay(1);
      digitalWrite(SEG_G, LOW);
      digitalWrite(DIGIT_2, HIGH);

      //显示“0.“
      digitalWrite(DIGIT_3, LOW);
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_DP, HIGH);
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_DP, LOW);
      digitalWrite(DIGIT_3, HIGH);
      
      displayNumber(i);
    }
    delay(100);
  }


  // 显示数字0到20
  for (int i = 0; i <= 20; i++) {
    if ( isPrime(i) ){
      for (int k = 0; k <= 2; k++) {
        for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
      
        displayNumber(i);
        }
        delay(1000);
       
      }
    }
    else{
      for (int j = 1; j <= 500; j++){
        displayNumber(i);
      }
    }
    
    delay(1000); // 每0.1秒更新一次显示
  }

}

void displayNumber(int num) {
  // 将数字转换成数组,每个数组元素代表一个数位的数字
  int digits[4] = {0};
  int index = 3;
  while (num > 0 && index >= 0) {
    digits[index] = num % 10;
    num /= 10;
    index--;
  }
  
  
  

  int pass=0;

 // 显示数字
  digitalWrite(DIGIT_1, LOW);
 
 //if语句用来跳过开头0的显示

  if (digits[0]!=0){
    displayDigit(digits[0]);
    delay(1);
  }
  digitalWrite(DIGIT_1, HIGH);
  
  
  digitalWrite(DIGIT_2, LOW);
  if (digits[1]!=0||digits[0]!=0){
    displayDigit(digits[1]);
    delay(1);
  }
  digitalWrite(DIGIT_2, HIGH);
  
  digitalWrite(DIGIT_3, LOW);
  if (digits[2]!=0||digits[1]!=0||digits[0]!=0){
    displayDigit(digits[2]);
    delay(1);
  }
  digitalWrite(DIGIT_3, HIGH);
  
  digitalWrite(DIGIT_4, LOW);
  displayDigit(digits[3]);
  delay(1);
  digitalWrite(DIGIT_4, HIGH);
}

void displayDigit(int digit) {
  // 控制每个数码管段的亮灭
  digitalWrite(SEG_A, digitMap[digit][0]);
  digitalWrite(SEG_B, digitMap[digit][1]);
  digitalWrite(SEG_C, digitMap[digit][2]);
  digitalWrite(SEG_D, digitMap[digit][3]);
  digitalWrite(SEG_E, digitMap[digit][4]);
  digitalWrite(SEG_F, digitMap[digit][5]);
  digitalWrite(SEG_G, digitMap[digit][6]);
  digitalWrite(SEG_A, LOW);//用来清除上次显示带来的影响
  digitalWrite(SEG_B, LOW);
  digitalWrite(SEG_C, LOW);
  digitalWrite(SEG_D, LOW);
  digitalWrite(SEG_E, LOW);
  digitalWrite(SEG_F, LOW);
  digitalWrite(SEG_G, LOW);
}

int isPrime(int num) {
    // 如果数字小于等于1,则不是质数
    if (num <= 1) {
        return 0;
    }
    // 对2进行特殊处理
    if (num == 2) {
        return 1;
    }
    // 如果能被2整除,那么不是质数
    if (num % 2 == 0) {
        return 0;
    }
    // 循环检查是否能被奇数整除
    for (int i = 3; i * i <= num; i += 2) {
        if (num % i == 0) {
            return 0;
        }
    }
    // 如果都不能整除,则是质数
    return 1;
}