#define Seg_A 2
#define Seg_B 3
#define Seg_C 4
#define Seg_D 5
#define Seg_E 6
#define Seg_F 8
#define Seg_G 7
// пины для управления цифрами на индикаторе
#define Dig_1 9
#define Dig_2 10
#define Dig_3 11
#define Dig_4 12
int counter;

// массив с данными для индикатора, неработающий сегмент = 0
int Number[10][8] = { 
  {Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,0},
  {0,Seg_B,Seg_C,0,0,0,0},
  {Seg_A,Seg_B,0,Seg_D,Seg_E,0,Seg_G},
  {Seg_A,Seg_B,Seg_C,Seg_D,0,0,Seg_G},
  {0,Seg_B,Seg_C,0,0,Seg_F,Seg_G},
  {Seg_A,0,Seg_C,Seg_D,0,Seg_F,Seg_G},
  {Seg_A,0,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
  {Seg_A,Seg_B,Seg_C,0,0,0,0},
  {Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
  {Seg_A,Seg_B,Seg_C,Seg_D,0,Seg_F,Seg_G},
};
void setup() {
  // инициализация индикатора вместе с выбором
  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);
  pinMode(Dig_1, OUTPUT);
  pinMode(Dig_2, OUTPUT); 
  pinMode(Dig_3, OUTPUT);
  pinMode(Dig_4, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
 for (counter = 0; counter < 9999; counter ++)
  {
    int a = counter / 1000;
    int b = (counter % 1000) / 100;
    int c = (counter % 100)/ 10;
    int d = counter % 10;
    Serial.print(String(a)+" ");
    Serial.print(String(b)+" ");
    Serial.print(String(c)+" ");
    Serial.println(String(d)+" ");
   
// прижать общий контакт старшей цифры к земле
  //digitalWrite(Dig_1, LOW);
  // выдать первую цифру с минимальной задержкой
  // Number_Take(a,20);
  // поднять общий контакт - цифра погаснет
  //digitalWrite(Dig_1, HIGH);
  // аналогично прижать общий контакт младшей цифры
  //digitalWrite(Dig_2, LOW);
  // выдать вторую цифру и после поднять обратно  общий контакт
  Number_Take(b,20);
  //digitalWrite(Dig_2, HIGH);
  //digitalWrite(Dig_3, LOW);
  // выдать вторую цифру и после поднять обратно  общий контакт
  //Number_Take(c,20);
  //digitalWrite(Dig_3, HIGH);
   digitalWrite(Dig_4, LOW);
  // выдать вторую цифру и после поднять обратно  общий контакт
  Number_Take(d,20);
   digitalWrite(Dig_4, HIGH);
  // задержка 100 мс - цифры мигают, а 50 мс - нормально
 delay(50);

  }
  
}
// процедура выдачи нужной цифры с заданной задержкой
void Number_Take(int num, int del)
{
  for(int i = 0; i<8; i++)
  {
    int a = Number[num][i];
    if (a != 0)
    {
      digitalWrite(a, HIGH);      
    }
  }
  delay(del);
  for(int i = 0; i<10; i++)
  {
    int a = Number[num][i];
    if (a != 0)
    {
      digitalWrite(a, LOW);
    }
  }
}