#define A  2                    //определение константы с номером пина для сегмента A 
#define B  3                    //определение константы с номером пина для сегмента B  
#define C  5                    //определение константы с номером пина для сегмента C 
#define D  6                    //определение константы с номером пина для сегмента D 
#define E  7                    //определение константы с номером пина для сегмента E 
#define F  9                    //определение константы с номером пина для сегмента F 
#define G  8                    //определение константы с номером пина для сегмента G
#define DP 4                    //определение константы с номером пина для сегмента DP 

int showDel = 1000;             //время отображение цифры на индикаторе 
int blCt = 2;                   //мигаем точкой между цифрами (0 - отключает эту функцию)                   
int blDel = 300;                //время отображения точки на индикаторе

void (*pZro)(void) = &fZro;     //определение указателя с записью адреса функции fZro   
void (*pOne)(void) = &fOne;     //определение указателя с записью адреса функции fOne
void (*pTwo)(void) = &fTwo;     //определение указателя с записью адреса функции fTwo
void (*pThr)(void) = &fThr;     //определение указателя с записью адреса функции fThr
void (*pFor)(void) = &fFor;     //определение указателя с записью адреса функции fFor
void (*pFiv)(void) = &fFiv;     //определение указателя с записью адреса функции fFiv
void (*pSix)(void) = &fSix;     //определение указателя с записью адреса функции fSix
void (*pSvn)(void) = &fSvn;     //определение указателя с записью адреса функции fSvn
void (*pEgt)(void) = &fEgt;     //определение указателя с записью адреса функции fEgt
void (*pNne)(void) = &fNne;     //определение указателя с записью адреса функции fNne

typedef void (* funcPtype) ();  //определение типа данных для массива указателей

funcPtype funcArr[] = {pZro, pOne, pTwo, pThr, pFor, pFiv, pSix, pSvn, pEgt, pNne}; //массив указателей на функции
int funcsNm = sizeof(funcArr) / sizeof(funcPtype *);                                //определение длины массива funcArr

char *ledPins[] = {A,B,C,D,E,F,G,DP};                //массив переменных с номерами пинов
int ledPinsNm = sizeof(ledPins) / sizeof(char *);    //определение длины массива ledPins


void setup() {

  for (int i = 0; i < ledPinsNm; i++){              //запись режма OUTPUT для пинов индикатора              
    pinMode(ledPins[i], OUTPUT);                    //и начального уровня HIGH
    digitalWrite(ledPins[i], HIGH);                 //при помощи перебора элементов массива ledPins 
  }
  
}

void loop() {

for (int f=0; f < funcsNm; f++){                    //вывод символов на индикатор
    funcArr[f]();                                   //при помощи перебора массива указателей на функции funcArr
    delay(showDel);                                 //задержка отображения цифры на индикаторе
    fDelay(blCt, blDel);                            //мигание точкой между цифрами
  }

}

void fZro () {            //функция вывода на индикатор символа "0" 
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(DP, HIGH);
}

void fOne () {            //функция вывода на индикатор символа "1"
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, HIGH);
}

void fTwo () {            //функция вывода на индикатор символа "2"
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fThr () {            //функция вывода на индикатор символа "3"
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fFor () {            //функция вывода на индикатор символа "4" 
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fFiv () {            //функция вывода на индикатор символа "5"
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fSix () {            //функция вывода на индикатор символа "6"
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fSvn () {            //функция вывода на индикатор символа "7"
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, HIGH);
}

void fEgt () {            //функция вывода на индикатор символа "8"
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fNne () {            //функция вывода на индикатор символа "9"
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, HIGH);
}

void fDt () {            //функция вывода на индикатор символа "Точка"
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void fClr () {            //функция очистки индикатора
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, HIGH);
}

void fDelay (int bC, int bD) {        //функция вывода точки между цифрами, получает аргументы: число повторов,  
  for (int i = 0; i < bC; i++){       //задержка вывода. Выполняется в цикле ограниченном числом повторов (bC) 
    fClr();                           //вызов функции очистки индикатора
    delay(bD);                        //задержка вывода пустого индикатора
    fDt();                            //вызов функции вывода точки
    delay(bD);                        //задержка вывода точки
  }
}