Array....maledetti Array

digitalWrite(pinLed[i],HIGH);//appena acceso mette i pin ad uno stato ALTO (+5V)....(display Anodo Comune)

In effetti mi era sfuggito che impiegassi un display ad anodo comune, pertanto il mio codice andrebbe corretto, o meglio il contenuto della funzione void showDataOnSevenSeg( const uint8_t data ) (non ancora scritta) richiede una piccola modifica, tanto piccola che basta aggiungere un '!'.

Non avendo ancora approfondito il linguaggio specie in merito alla definizione di funzioni e alla loro chiamata, ti allego il contenuto di quella funzione, con l'obbiettivo che ciò possa farti comprendere quanto si semplifica lo sviluppo dell'applicazione sapendole definire ed impiegare.

void showDataOnSevenSeg( const uint8_t data ) {

    uint8_t codec = sevenSegsCodec[data];

    for (byte idx=0; idx<sizeof(pinLed); idx++) {

        digitalWrite( pinLed[idx], !(codec>>idx & 1); // come vedi ho dovuto aggiungere '!' prima della parentesi al fine di                         
                                                                           // negare il valore risultante di questa operazione:  codec>>idx & 1
    }
}

In effetti è stato necessario racchiudere tra parentesi tonde l'operazione su menzionata.

Nel caso di anodo comune, le seguenti istruzioni dovrebbero mostrare 0 (zero) sul display:

digitalWrite ( 2, 0 );
digitalWrite ( 3, 0 );
digitalWrite ( 4, 0 );
digitalWrite ( 5, 0 );
digitalWrite ( 6, 0 );
digitalWrite ( 7, 0 );
digitalWrite ( 8, 1 );

Mentre con katodo comune (rimuovendo '!'), per mostrare 0 occorre la seguente sequenza:

digitalWrite ( 2, 1 );
digitalWrite ( 3, 1 );
digitalWrite ( 4, 1 );
digitalWrite ( 5, 1 );
digitalWrite ( 6, 1 );
digitalWrite ( 7, 1 );
digitalWrite ( 8, 0 );

Riguardando la definizione della funzione, la variabile data, viene impiegata come indice, e visto che accede agli elementi dell'array sevenSegsCodec, il suo valore deve essere senza segno e non deve superare il valore decimale 15.

void showDataOnSevenSeg( const uint8_t data )

void, e const non potrai comprenderli per un bel poco di tempo (e forse mai, se non ti studi il linguaggio).

Nota inoltre che con la precedente implementazione eviti di impegnare memoria ram, in quanto non ti è necessario
il seguente codice:

byte scrivi[16][7]={
                  {0,0,0,0,0,0,1},//scrive 0
                  {1,0,0,1,1,1,1},//scrive 1
                  {0,1,0,0,1,0,0},//scrive 2
                  {0,0,0,0,1,1,0},//scrive 3
                  {1,0,0,1,1,0,0},//scrive 4
                  {0,1,0,0,1,0,0},//scrive 5
                  {0,1,0,0,0,0,0},//scrive 6
                  {0,0,0,1,1,1,1},//scrive 7
                  {0,0,0,0,0,0,0},//scrive 8
                  {0,0,0,0,1,0,0},//scrive 9
                  {0,0,0,1,0,0,0},//scrive A
                  {1,1,0,0,0,0,0},//scrive b
                  {0,1,1,0,0,0,1},//scrive C
                  {1,0,0,0,0,1,0},//scrive d
                  {0,1,1,0,0,0,0},//scrive E
                  {0,1,1,1,0,0,0},//scrive F 
                 };

Dalle mie parti 16x7=112 byte, risparmiati. Per finire come vedi è possibile ottenere il risultato desiderato senza impiegare tutte quelle if.., e senza impiegare lo switch case, che ho impiegato io nel mio codice per la gestione di display 4x7 segmenti, perché avevo la necessità di mostrare anche nomi di parametri, tipo StP, diF, Pb0, Pb1 ecc, parametri a cui l'utente può accedere è modificarne il valore.

PS: Non spargere la voce in giro, ma anche io ho la tua stessa licenza scolastica. Questa notizia dovrebbe avere su di te effetti positivi (non è detto), ma bada che, sangue e sudore mi è costato.

Ciao.