INTEGRATI: Esempio SHIFT REGISTER + 7SEGMENT 4 DIGIT

Per costruire gli esempi proposti è necessario procurarsi un display a 7 segmenti a 4 elementi. Inoltre occorrono 2 shift register 74HC495.

Codice Sorgente A

Obiettivo progetto: Utilizzando un display a 7 segmenti composto da 4 elementi (digit) costruire un progetto che, sfruttando i 2 shift register collegati in cascata, consenta di visualizzare il numero di secondi trascorsi dall'attivazione di Arduino utilizzando solo 3 pin.

soluzione:

Costruiamo il seguente circuito

7Segment Module x 4 digit + Shift Register

Scriviamo il seguente programma

/* -----------------------------------------------------------------------------------
Visualizza  il corrispondente numero in binario sfruttando una fila di 16 led
----------------------------------------------------------------------------------- */
int Pin_AbilitaScrittura = 4; // Pin 12 sullo SR - Cavo Verde
int Pin_ClockRegister = 8;    // Pin 11 sullo SR - Cavo Bianco
int Pin_SerialInput = 3;      // Pin 14 sullo SR - Cavo Arancio

void setup() 
{
   // Setto i pin come uscite
   pinMode(Pin_AbilitaScrittura, OUTPUT); 
   pinMode(Pin_ClockRegister, OUTPUT);
   pinMode(Pin_SerialInput, OUTPUT);
}

// Procedura per scrivere un singolo digit
void ScriviDigit(unsigned int n, byte digit)
{
#define DISPLAY_BRIGHTNESS  20000
  byte v, d;
  unsigned int b;
  // pongo a 1 il segmento che intendo accendere
  // E D . C G A F B
  if (n==0)
     v=B11010111;
  else if (n==1)
     v=B00010001;
  else if (n==2)
     v=B11001101;
  else if (n==3)
     v=B01011101;
  else if (n==4)
     v=B00011011;
  else if (n==5)
     v=B01011110;
  else if (n==6)
     v=B11011110;
  else if (n==7)
     v=B00010101;
  else if (n==8)
     v=B11011111;
  else if (n==9)
     v=B01011111;
  else if (n==10) // tutto OFF
     v=B00000000;
  // Pongo azero il bit corrispondente al digit che voglio accendere
  // d3 d2 d1 d4
  if (digit==1)
     d=B00001101;
  else if (digit==2)
     d=B00001011;
  else if (digit==3)
     d=B00000111;
  else if (digit==4)
     d=B00001110;
  else   
     d=B00001111; // tutti spenti
  
  // Per iniziare la comunicazione seriale c’è bisogno di mettere l’integrato 
  // in uno stato di “ascolto” che avviene utilizzando un opportuno pin detto
  // di “latch” e settandolo a LOW.
  digitalWrite(Pin_AbilitaScrittura, LOW);
  // Invio il dato sulla porta seriale
  shiftOut(Pin_SerialInput, Pin_ClockRegister , MSBFIRST, d); // High Byte 
  shiftOut(Pin_SerialInput, Pin_ClockRegister , MSBFIRST, v); // Low Byte 
  // Disabilito la scrittura sull'ingresso seriale impostando il 
  // risultato del processo di shift sulle 16 uscite in parallelo
  digitalWrite(Pin_AbilitaScrittura, HIGH);
}
// Procedura per scrivere il numero di 4 cifre
void ScriviNumero(int n)
{
  for (int digit = 4 ; digit > 0 ; digit--)
  {
      // Mostra il resto della divisione per 10 sull'elemento "digit"
      ScriviDigit(n % 10, digit);
      // Lascia il digit acceso per una breve frazione di secondo
      delayMicroseconds(DISPLAY_BRIGHTNESS); 
      // Spengo tutti i segmenti dell'elemento "digit"
      //ScriviDigit(0, digit);
      ScriviDigit(n, 0); // Disattivo tutti i digit
      n /= 10; // divisione intera per 10
  }
}

void loop() 
{
   // secondi trascorsi - se supero 10000 considero il resto 
   // della divisione per 10.000
   ScriviNumero(millis()/1000 % 10000);
}