#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 aDisp[12][8] = {
  {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"
  {1,1,1,1,1,1,1,0},      //кодирование символа "."
  {1,1,1,1,1,1,1,1},      //очистка индикатора (все сегменты погашены)
};

int aRow = 12; 
int aCol = 8;
int blCt = 3;
int blDel = 300;
int showDel = 1000;




void (*pZro)(void) = &fZro;
void (*pOne)(void) = &fOne;
void (*pTwo)(void) = &fTwo;
void (*pThr)(void) = &fThr;
void (*pFor)(void) = &fFor;
void (*pFiv)(void) = &fFiv;
void (*pSix)(void) = &fSix;
void (*pSvn)(void) = &fSvn;
void (*pEgt)(void) = &fEgt;
void (*pNne)(void) = &fNne;
void (*pClr)(void) = &fClr;

typedef void (* funcPtype) ();

funcPtype funcArr[] = {pZro, pOne, pTwo, pThr, pFor, pFiv, pSix, pSvn, pEgt, pNne, pClr};
int funcsNm = sizeof(funcArr) / sizeof(funcPtype *);

int del_t = 1000;        //переменная с величиной задержки между выводами цифр 

char *ledPins[] = {A,B,C,D,E,F,G,DP};
int ledPinsNm = sizeof(ledPins) / sizeof(char *);

void fDelay (int bC, int bD) {
  for (int i = 0; i < bC; i++){
    fClr();
    delay(bD);
    fDt();
    delay(bD);
  }
}

void setup() {

  for (int i=0; i < ledPinsNm; i++){
    pinMode(ledPins[i], OUTPUT);
  }
    
Serial.begin(9600);

Serial.println(ledPinsNm);
Serial.println(funcsNm);

}

void loop() {

for (int f=0; f < funcsNm; f++){
    funcArr[f]();
    delay(showDel);
    fDelay(blCt, blDel);
  }

  Serial.println("Второй вариант");
  Serial.println();

fDisp(aDisp, aRow, aCol, showDel);
  //delay(1000);           //задержка выполнения на величину 2 секунды 

}

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 fDisp (int arr[][8], int aR, int aC, int sD) {
  
  for (int i=0; i < aR; i++){
    digitalWrite(A, arr[i][0]);
    digitalWrite(B, arr[i][1]);
    digitalWrite(C, arr[i][2]);
    digitalWrite(D, arr[i][3]);
    digitalWrite(E, arr[i][4]);
    digitalWrite(F, arr[i][5]);
    digitalWrite(G, arr[i][6]);
    digitalWrite(DP, arr[i][7]);
    delay(sD);
  
  }
}

void fPause (int arr[][8], int aR, int aC, int bC, int bD) {
  
  for (int i=0; i < bC; i++) {

    fCls(aDisp, aRow, aCol);
    delay(bD);
    fDot(aDisp, aRow, aCol);
    delay(bD);

  }
}

void fCls (int arr[][8], int aRow, int aCol) {
  digitalWrite(A, arr[12][0]);
  digitalWrite(B, arr[12][1]);
  digitalWrite(C, arr[12][2]);
  digitalWrite(D, arr[12][3]);
  digitalWrite(E, arr[12][4]);
  digitalWrite(F, arr[12][5]);
  digitalWrite(G, arr[12][6]);
  digitalWrite(DP, arr[12][7]);
}

void fDot (int arr[][8], int aRow, int aCol) {
  digitalWrite(A, arr[11][0]);
  digitalWrite(B, arr[11][1]);
  digitalWrite(C, arr[11][2]);
  digitalWrite(D, arr[11][3]);
  digitalWrite(E, arr[11][4]);
  digitalWrite(F, arr[11][5]);
  digitalWrite(G, arr[11][6]);
  digitalWrite(DP, arr[11][7]);
}