.. note:: Ciao, benvenuto nella community SunFounder per gli appassionati di Raspberry Pi, Arduino ed ESP32 su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirsi?** - **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team. - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue abilità. - **Anteprime Esclusive**: Ottieni accesso anticipato a nuovi annunci di prodotto e anteprime esclusive. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e Omaggi Festivi**: Partecipa a omaggi e promozioni durante le festività. 👉 Pronto per esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi! 1.1.4 Display a 7 Segmenti ============================= Introduzione ----------------- Proviamo a pilotare un display a 7 segmenti per mostrare numeri da 0 a 9 e lettere da A a F. Componenti ---------------- .. image:: img/list_7_segment.png Principio ------------- **Display a 7 Segmenti** Un display a 7 segmenti è un componente a forma di "8" che contiene 7 LED. Ogni LED è chiamato segmento - quando è acceso, un segmento forma parte di un numero da visualizzare. Esistono due tipi di connessione: Catodo Comune (CC) e Anodo Comune (CA). Come suggerisce il nome, un display CC ha tutti i catodi dei 7 LED collegati, mentre un display CA ha tutti gli anodi collegati. In questo kit usiamo il primo tipo. .. image:: img/image70.jpeg :width: 3.89514in :height: 3.32222in :align: center Ogni LED del display è associato a un segmento posizionale con un pin di connessione che emerge dal pacchetto di plastica rettangolare. I pin dei LED sono etichettati da "a" a "g", ciascuno rappresentante un LED individuale. Gli altri pin LED sono collegati insieme formando un pin comune. Alimentando i pin appropriati dei segmenti in un ordine specifico, alcuni segmenti si illumineranno mentre altri rimarranno spenti, mostrando il carattere corrispondente sul display. **Codici Display** Per comprendere come i display a 7 segmenti (Catodo Comune) mostrano i numeri, abbiamo preparato la tabella seguente. I numeri rappresentano i caratteri 0-F visualizzati sul display a 7 segmenti; (DP) GFEDCBA indica i LED corrispondenti impostati su 0 o 1. Ad esempio, 00111111 significa che DP e G sono impostati su 0, mentre gli altri sono impostati su 1. Pertanto, viene visualizzato il numero 0, mentre il Codice HEX corrisponde al numero in esadecimale. .. image:: img/common_cathode.png **74HC595** Il 74HC595 è composto da un registro a scorrimento a 8 bit e da un registro di memoria con uscite parallele a tre stati. Converte l'input seriale in output parallelo, permettendo di risparmiare sui pin IO di un MCU. Quando MR (pin10) è a livello alto e OE (pin13) è a livello basso, i dati vengono immessi al fronte di salita di SHcp e passano al registro di memoria tramite il fronte di salita di SHcp. Se i due clock sono collegati insieme, il registro a scorrimento è sempre un impulso avanti rispetto al registro di memoria. Nel registro di memoria vi è un pin di input seriale (Ds), un pin di output seriale (Q) e un pulsante di reset asincrono (livello basso). Il registro di memoria produce un Bus con un output parallelo a 8 bit in tre stati. Quando OE è abilitato (livello basso), i dati nel registro di memoria vengono inviati al bus. .. image:: img/74hc595_sche.png :width: 400 :align: center **Piedini del 74HC595 e loro funzioni**: * **Q0-Q7**: Uscite di dati paralleli a 8 bit, in grado di controllare direttamente 8 LED o 8 pin di un display a 7 segmenti. * **Q7’**: Uscita seriale, collegata al DS di un altro 74HC595 per connettere in serie più 74HC595. * **MR**: Pin di reset, attivo a livello basso; * **SHcp**: Ingresso di sequenza temporale del registro a scorrimento. Allo spigolo di salita, i dati nel registro a scorrimento avanzano di un bit, ad esempio, i dati in Q1 passano a Q2 e così via. Allo spigolo di discesa, i dati nel registro a scorrimento rimangono invariati. * **STcp**: Ingresso di sequenza temporale del registro di memoria. Allo spigolo di salita, i dati nel registro a scorrimento vengono trasferiti al registro di memoria. * **CE**: Pin di abilitazione dell'uscita, attivo a livello basso. * **DS**: Ingresso dati seriale. * **VCC**: Tensione di alimentazione positiva. * **GND**: Massa. Schema Elettrico --------------------- Collega il pin ST_CP del 74HC595 al GPIO18 del Raspberry Pi, SH_CP al GPIO27, DS al GPIO17 e le uscite parallele agli 8 segmenti del display a 7 segmenti. I dati vengono immessi nel pin DS del registro a scorrimento al fronte di salita di SH_CP (clock di registrazione) e nel registro di memoria al fronte di salita di ST_CP (clock di memoria). Controllando gli stati di SH_CP e ST_CP tramite i GPIO del Raspberry Pi, puoi trasformare l’input seriale in output parallelo, risparmiando i GPIO del Raspberry Pi e pilotando il display. ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 GPIO27 Pin 13 2 27 ============ ======== ======== === .. image:: img/schematic_7_segment.png :width: 800 Procedure Sperimentali ------------------------------ **Passo 1**: Costruisci il circuito. .. image:: img/image73.png :width: 800 **Passo 2**: Accedi alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.1.4/ **Passo 3**: Compila. .. raw:: html .. code-block:: gcc 1.1.4_7-Segment.c -lwiringPi **Passo 4**: Esegui il file eseguibile appena creato. .. raw:: html .. code-block:: sudo ./a.out Dopo aver eseguito il codice, vedrai il display a 7 segmenti mostrare i numeri da 0 a 9 e le lettere da A a F. .. note:: Se il programma non funziona o compare un messaggio di errore: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #define SDI 0 // input dati seriale #define RCLK 1 // ingresso clock della memoria (STCP) #define SRCLK 2 // ingresso clock registro a scorrimento (SHCP) unsigned char SegCode[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void init(void){ pinMode(SDI, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SRCLK, OUTPUT); digitalWrite(SDI, 0); digitalWrite(RCLK, 0); digitalWrite(SRCLK, 0); } void hc595_shift(unsigned char dat){ int i; for(i=0;i<8;i++){ digitalWrite(SDI, 0x80 & (dat << i)); digitalWrite(SRCLK, 1); delay(1); digitalWrite(SRCLK, 0); } digitalWrite(RCLK, 1); delay(1); digitalWrite(RCLK, 0); } int main(void){ int i; if(wiringPiSetup() == -1){ // se l'inizializzazione di wiring fallisce, stampa un messaggio printf("setup wiringPi failed !"); return 1; } init(); while(1){ for(i=0;i<16;i++){ printf("Print %1X on Segment\n", i); // %X means hex output hc595_shift(SegCode[i]); delay(500); } } return 0; } **Spiegazione del Codice** unsigned char SegCode[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; Un array di codici per segmenti da 0 a F in esadecimale (catodo comune). .. code-block:: c void init(void){ pinMode(SDI, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(SRCLK, OUTPUT); digitalWrite(SDI, 0); digitalWrite(RCLK, 0); digitalWrite(SRCLK, 0); } Imposta i pin ds, st_cp e sh_cp su OUTPUT e il loro stato iniziale a 0. void hc595_shift(unsigned char dat){} Per assegnare un valore a 8 bit al registro a scorrimento del 74HC595. .. code-block:: c digitalWrite(SDI, 0x80 & (dat << i)); Assegna i dati di "dat" a SDI (DS) per singoli bit. Supponiamo dat=0x3f (0011 1111); quando i=2, 0x3f si sposta a sinistra (<<) di 2 bit. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, quindi vero. .. code-block:: c digitalWrite(SRCLK, 1); Il valore iniziale di SRCLK è impostato a 0, e qui è impostato a 1 per generare un impulso di salita, quindi trasferisce i dati DS nel registro a scorrimento. .. code-block:: c digitalWrite(RCLK, 1); Il valore iniziale di RCLK è impostato a 0, e qui è impostato a 1 per generare un impulso di salita, quindi trasferisce i dati dal registro a scorrimento al registro di memoria. .. code-block:: c while(1){ for(i=0;i<16;i++){ printf("Print %1X on Segment\n", i); // %X means hex output hc595_shift(SegCode[i]); delay(500); } } In questo ciclo "for", usiamo "%1X" per visualizzare "i" come numero esadecimale. Usiamo "i" per trovare il codice segmento corrispondente nell'array SegCode[], e utilizziamo hc595_shift() per trasferire il SegCode nel registro a scorrimento del 74HC595.