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
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); }