Contapezzi con display 7 segment

Mi da questo Problema..qualcuno sa spiegarmi come mai?

Fury_man:
Mi da questo Problema..qualcuno sa spiegarmi come mai?

Puoi postare uno schema dei collegamenti che hai fatto? E anche il codice che hai caricato.

Questo è il codice che ho inserito. ho usato un arduino nano, un integrato max 7219 e un display a 7 segmenti a 3 cifre a catodo comune, ho collegato i rispettivi pin del display al max7219 e poi al nano datain al pin 12, clk al pin 11 e il load al pin 10 di arduino come scritto nel codice. una volta caricato non funziona, il led rimane spento..

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


void setup(){
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);

  Serial.begin(9600);
}

void loop() {
   
    if (digitalRead(buttonPin)==HIGH){
      
        contatore++;
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

        Serial.print(centinaia);
        Serial.print("-");
        Serial.print(decine);
        Serial.print("-");
        Serial.print(unita);
        Serial.println(" "); 
 
        lc.setDigit(0,2,(byte)centinaia,false);
        lc.setDigit(0,1,(byte)decine,false);
        lc.setDigit(0,0,(byte)unita,false);
    } 
    if(contatore>999) contatore=0; // Ritorna a zero quando deve contare 1000
    delay(200);
  
  

  
    if  (digitalRead(buttonReset) == HIGH){
        (contatore = 0);
         lc.clearDisplay(0);
    }
  }

Se hai fatto i collegamenti come lo schema allegato (lascia stare il buzzer) deve almeno accendersi. Comunque io ho usato il modulo già assemblato (vedi foto allegata), posta qualche foto/schema del tuo circuito.

Questo è il circuito, scusate per il disegno pessimo, comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12. Non riesco proprio a capire dove sbaglio... ah i pulsanti non li ho disegnati ma sono stati collegati al piedino D2 e D3.

Ma la resistenza tra ISET e il positivo, ce l'hai messa ?

Ahm no, non ho messo la resistenza tra iset e positivo.. di quanto gliela devo mettere? E a cosa serve la
Resistenza su quel pin?

Fury_man:
comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12.

scusa ma ho fatto talmente tante prove/modifiche a quel circuito che non ricordo più quale è quello definitivo ::slight_smile: domani controllo poi ti dico.

Flaviano

Fammi sapere perché davvero non so come farlo funzionare :confused:

Fury_man:
Questo è il circuito, scusate per il disegno pessimo, comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12. Non riesco proprio a capire dove sbaglio... ah i pulsanti non li ho disegnati ma sono stati collegati al piedino D2 e D3.

devi usare moduli già assemblati se cerchi di far funzionare i max 7219 con fili volanti il più delle volte non funzionano :confused: anche se tutto sembra collegato correttamente

uso quei moduli con i led inseriti (non saldati) e se voglio mettere moduli led più grandi o di colore diverso è fattibile,

Ciao Elrospo avevo gia pensato di acquistare un modulo come hai detto tu, solo che a me servirebbe pilotare solo 1 display a 3cifre e per il progetto che vorrei fare sono molto ristretto con gli spazi

Fury_man:
Fammi sapere perché davvero non so come farlo funzionare :confused:

Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2 (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK = D9
LOAD-CS = D10
DIN = D12

Con questo codice DEVE funzionare:

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn 
 pin 9 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


void setup(){
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
  
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
      
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
     
    // Delay a little bit to avoid bouncing
    delay(50);
  
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
}

Fammi sapere.
Flaviano

Flavi71:
Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2 (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK = D9
LOAD-CS = D10
DIN = D12

Con questo codice DEVE funzionare:

 //State change detection (edge detection)

//We always have to include the library
#include "LedControl.h"

/*
Now we need a LedControl to work with.
pin 12 is connected to the DataIn
pin 9 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:

  • buttonpin attached to pin 2 from +5V
  • buttonreset attached to pin 4 from +5V
  • 10 kilohm resistor attached to pin 2&4 from ground
    */
    // this constant won't change:
    #define buttonPin 2 // the pin that the pushbutton is attached to
    #define buttonReset 4 // the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;  // counter for the number of button presses
int buttonState = 0;        // current state of the button
int lastButtonState = 0;    // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;

void setup(){
  /*
  The MAX72XX is in power-saving mode on startup,
  we have to do a wakeup call
  /
  lc.shutdown(0,false);
  /
Set the brightness to a medium values /
  lc.setIntensity(0,8);
  /
and clear the display */
  lc.clearDisplay(0);

// initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
   
    // Delay a little bit to avoid bouncing
    delay(50);
 
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

// if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
      lc.clearDisplay(0);
    }
}



Fammi sapere.
Flaviano

Ciao Flavi71 scusami per il ritardo, allora ho aggiunto una resistenza al pin ISET del max7219 ogni volta che premo il pulsante comincia a contare solo che lo stato iniziale del display è spento come premo si accende.. come faccio a farlo stare acceso al primo stato? ho notato anche che conta dall'ultima cifra.. mi spiego meglio: invece di contare 001, 002.. mi conta 100,200 e cosi via come risolvo?
GRAZIE per il tempo che mi stai dando :slight_smile:
Fammi sapere
FuryMan

Risolto per quanto riguarda il conteggio sfalsato ho invertito i pin del dig1 e del dig3 cosi' parte dal primo a contare.. non riesco a risolvere il problema del display spento all'inizio :confused:

Perché non usi solo l'ATmega328p? Io ho fatto un timer per la magnetoterapia di Nuova Elettronica con solo quello e due display:

  ATMEGA 328P - 1MHz
        Pin
I/O0  PD0  2: KA
I/O1  PD1  3: KB
I/O2  PD2  4: KC
I/O3  PD3  5: KD
I/O4  PD4  6: KE
I/O5  PD5 11: KF
I/O6  PD6 12: KG
I/O7  PD7 13: Kdp 
I/O8  PB0 14: Uscita fCk.
I/O9  PB1 15: Anodo comune: *Alto(diretto):A2*; Basso(via PNP):A1
I/O10 PB2 16: Anodo comune: *Alto(diretto):A1*; Basso(via PNP):A2
I/O11 PB3 17: MOSI -
I/O12 PB4 18: MISO -
I/O13 PB5 19:  SCK -
XTAL1 PB6  9: ---
XTAL2 PB7 10: ---
A0  PC0 23: Potenziometro per l'impostazione del tempo.
A1  PC1 24: BUZZER PASSIVO
A2  PC2 25: OUT al transistor NPN pilota del relè.
A3  PC3 26:
A4  PC4 27:
A5  PC5 28: 
         1: Reset
     7, 20: Vcc
     8, 22: GND
        21: ARef
*/
// Il tempo parte all'accensione (avvio=0) o dopo l'impostazione della durata (avvio=1)?
#define avvio 1

#include <EEPROM.h>
unsigned int durata;
unsigned int durata0;
byte DS1; // Dip Switch 1: può valere 0 o 1.
byte DS2; // Dip Switch 2: può valere 0 o 1.
byte adesso; // millis() in minuti
byte minRimanenti=0;
byte minRimanentiP=250; // Valore precedente di minRimanenti.
byte z=0;
byte n=0;
byte d=0; // decine di minuti
byte u=0; // unità di minuti
byte dpon=0; // 1: dp acceso (pin basso per anodo comune).
unsigned long millis0=0; // Valore di millis()per il conteggio del tempo dall'impostazione della durata.
unsigned long t=0; // Valore di millis() per il tempo a disposizione per l'impostazione della durata.
unsigned long t1=0; // Valore di millis() per il rilevamento della richiesta di pausa.
byte b=0; // Contatore dei Bip di avviso della pausa.
byte c=0; // Contatore dei Bip di avviso dello spegnimento anticipato.
unsigned long t2=0; // Valore di millis() per il rilevamento della richiesta di spegnimento.
byte potAZero=0;
byte potA60=0;
byte endSetup=0;

void displ();
void mpx();

void setup()
{
// durata=600000*(((PINB&((1<<PB4)|(1<<PB3)))>>3)+1); // Con dip switch verso +V.
// Legge i due dip switch su PB4 (peso 16) e PB3 (peso 8) e divide per 8, ottenendo valori tra 0 e 3;
// somma 1, ottenendo valori tra 1 e 4, poi moltiplica per 10, ottenendo 10...40 minuti.
// Moltiplicando per 60.000 ottiene i millisecondi.
pinMode(0,OUTPUT); // KA
pinMode(1,OUTPUT); // KB
pinMode(2,OUTPUT); // KC
pinMode(3,OUTPUT); // KD
pinMode(4,OUTPUT); // KE
pinMode(5,OUTPUT); // KF
pinMode(6,OUTPUT); // KG
pinMode(7,OUTPUT); // Kdp
pinMode(8,OUTPUT); // fCk out (abilitata con AVR Burn-O-Mat).
pinMode(9,OUTPUT);  // Anodo comune: Basso:A1; Alto:A2.
pinMode(10,OUTPUT); // Anodo comune: Basso:A2; Alto:A1.
pinMode(A0,INPUT);  // Potenziometro per l'impostazione del tempo.
pinMode(A1,OUTPUT); // Buzzer
pinMode(A2,OUTPUT); // OUT
// pinMode(A3,OUTPUT); // Periodo 2000ms (non serve più, perché ho attivato l'uscita fCk sull'8).

digitalWrite(A2, HIGH); // Eccita il relè.


OSCCAL=161; // Era 162 e la frequenza di clock era 1,004MHz;
            // Con 161, la frequenza di clock è circa 998,5kHz.
/*
Serial.begin(9600);
Serial.print("OSCCAL=");
Serial.print(OSCCAL,DEC);
Serial.end();
*/

delay(100);
t=millis();
millis0=millis();

if(EEPROM.read(0)==255) // Se c'è scritto 255, vuol dire che non è stata mai scritta oppure è stata 
  {                     // "azzerata" a 255, perciò prosegue con l'impostazione della durata.
  while(millis()-t<4000)
    {
    analogRead(A0); durata=1+analogRead(A0)/17.2;
    d = int(durata/10); // DECINE DI MINUTI
    u = durata%10;      // UNITA' DI MINUTI
    mpx(); // Visualizza d e u.
    if(durata!=durata0) {durata0=durata; t=millis();}
    }
  tone(A1,880,60); // E' finito il tempo per l'impostazione della durata.
  }
else // Se non c'è scritto 255, significa che l'apparecchio è stato messo in pausa e il valore rappresenta i minuti residui.
  {
  durata=EEPROM.read(0);
  EEPROM.update(0,255); // "Azzera" il contenuto della cella a 255.
  d = int(durata/10); // DECINE DI MINUTI
  u = durata%10;      // UNITA' DI MINUTI
  tone(A1,880,200); // Poiché ha caricato il tempo residuo in memoria, emette 3 toni: LA4-LA5-LA4.
  delay(250);
  tone(A1,440,200);
  delay(250);
  tone(A1,880,250);
  mpx(); // Visualizza d e u.
  }
  
if(analogRead(A0)<15) potAZero=1;
if(analogRead(A0)>1010) potA60=1;
 
#if avvio==1           // Se avvio=1, 
  millis0=millis();    // la durata parte dopo l'impostazione della durata,
#endif                 // altrimenti millis0 vale già 0 e la durata parte dall'accensione.
  endSetup=1;
}
void loop()
{
adesso=int((millis()-millis0)/60000);

// Calcola e visualizza i minuti rimanenti (a ogni passaggio commuta Display 1 / Display 2):
minRimanenti=durata-adesso;
d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.
if(analogRead(A0)>15) potAZero=0;
if(analogRead(A0)<1010) potA60=0;
   
  // Controlla se il tempo è scaduto:
if(adesso>=durata)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  PORTD=0b00001110;     // Stop:  Visualizza " F."
  digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
  while(1==1);
  }

  // RICHIESTA DI PAUSA?
if(potAZero==0) // Se il potenziometro non sta a 0 dall'accensione
  {
  if(analogRead(A0)>15) t1=millis(); // Se il potenziometro non è al minimo, aggiorna costantemente t1.
  else                               // Se viene messo al massimo, non aggiorna più t1.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
    PORTD=0b00001100;     // Visualizza " P."
    while(analogRead(A0)<=15 && millis()-t1<3200)
      {
      if(b==0) {tone(A1,1760,100); b=1;} // Se il potenziometro sta al minimo e b è ancora 1, fa un primo Bip e incrementa b a 1.
      if(b==1 && (millis()-t1)>=1000) {tone(A1,1760,100); b=2;} // Dopo 1 secondo fa un altro Bip e incrementa b.
      if(b==2 && (millis()-t1)>=2000) {tone(A1,1760,100); b=3;} // Dopo 1 secondo fa un altro Bip e incrementa b.  
      if(millis()-t1>3000) // Se per 3 secondi il potenziometro sta al minimo, va in pausa.
        {
        EEPROM.update(0,minRimanenti);  // Salva il tempo residuo.
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    b=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera b.  
    }
  }

  // RICHIESTA DI SPEGNIMENTO?
if(potA60==0) // Se il potenziometro non sta a 60 dall'accensione
  {
  if(analogRead(A0)<1010) t2=millis(); // Se il potenziometro non è al massimo, aggiorna costantemente t2.
  else                                 // Se viene messo al massimo, non aggiorna più t2.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
 // PORTD=0b00001001;     // Visualizza " H."
    PORTD=0b00010010;     // Visualizza " S."
    while(analogRead(A0)>=1010 && millis()-t2<3200)
      {
      if(c==0) {tone(A1,880,100); c=1;} // Se il potenziometro sta al massimo e c è ancora 1, fa un primo Bip e incrementa c a 1.
      if(c==1 && (millis()-t2)>=1000) {tone(A1,880,100); c=2;} // Dopo 1 secondo fa un altro Bip e incrementa c.
      if(c==2 && (millis()-t2)>=2000) {tone(A1,880,100); c=3;} // Dopo 1 secondo fa un altro Bip e incrementa c.    
      if(millis()-t2>3000) // Se per 3 secondi il potenziometro sta al massimo, spegne tutto.
        {
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    c=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera c.  
    }  
  } 
  
} // END loop

// --------------------------------------------------

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}

void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}

L'essenziale che ti serve è questo:

d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.

// Tu, invece, calcolerai centinaia, decine e unità. Nel multiplexer, poi, userai per z i valori 1, 2 e 3, scrivendo alla fine, al posto di z=1-z:
z+=1; if(z==4) z=1;

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}


void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}

Grazie Datman sembra molto interessante ma vorrei portare a termine un progetto alla volta, aspetto la risposta di Flavi71 per quanto riguarda il display spento all’inizio e non capisco come mai ..

E' semplice: nel setup() viene eseguito:
lc.clearDisplay(0);
perciò il display rimane senza alcuna scritta. Se preferisci, subito dopo il clear fagli scrivere "0". Probabilmente devi scrivere così:
lc.setDigit(0,0,0,false);