Nota

Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a omaggi e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

1.1.4 Display a 7 Segmenti

Introduzione

Proviamo a pilotare un display a 7 segmenti per mostrare una cifra da 0 a 9 e da A a F.

Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_7_segment.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

COMPONENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Display a 7 segmenti

ACQUISTA

74HC595

ACQUISTA

Schema di Collegamento

Collega il pin ST_CP del 74HC595 al GPIO18 del Raspberry Pi, SH_CP al GPIO27, DS al GPIO17, e le uscite parallele ai 7 segmenti del display LED. Inserisci i dati nel pin DS per il registro a scorrimento quando SH_CP (l’ingresso del clock del registro a scorrimento) è al fronte di salita, e nel registro di memoria quando ST_CP (l’ingresso del clock della memoria) è al fronte di salita. Poi puoi controllare gli stati di SH_CP e ST_CP tramite i GPIO del Raspberry Pi per trasformare i dati in ingresso seriale in dati in uscita parallela, risparmiando così 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

../_images/schematic_7_segment.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image73.png

Passo 2: Accedi alla cartella del codice.

cd ~/raphael-kit/c/1.1.4/

Passo 3: Compila il codice.

gcc 1.1.4_7-Segment.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Dopo l’esecuzione del codice, vedrai il display a 7 segmenti mostrare le cifre da 0 a 9, e le lettere da A a F.

Nota

Se non funziona dopo l’esecuzione o appare un errore come: "wiringPi.h: No such file or directory", consulta Installazione e verifica di WiringPi.

Codice

#include <wiringPi.h>
#include <stdio.h>
#define   SDI   0   //ingresso dati seriale
#define   RCLK  1   //ingresso clock 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){ //quando l'inizializzazione di wiring fallisce, stampa un messaggio a schermo
        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};

Una matrice di codici di segmento da 0 a F in esadecimale (catodo comune).

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, sh_cp come OUTPUT, e lo stato iniziale a 0.

void hc595_shift(unsigned char dat){}

Assegna un valore a 8 bit al registro a scorrimento del 74HC595.

digitalWrite(SDI, 0x80 & (dat << i));

Assegna il dato dat a SDI (DS) bit per bit. Supponiamo che dat=0x3f (0011 1111, quando i=2, 0x3f si sposterà a sinistra (<<) di 2 bit. 1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000, è vero.

digitalWrite(SRCLK, 1);

Il valore iniziale di SRCLK era impostato su 0, e qui è impostato su 1, per generare un impulso di salita, quindi sposta i dati DS nel registro a scorrimento.

digitalWrite(RCLK, 1);

Il valore iniziale di RCLK era impostato su 0, e qui è impostato su 1, per generare un impulso di salita, quindi sposta i dati dal registro a scorrimento al registro di memoria.

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 stampare i come numero esadecimale. Applica i per trovare il codice del segmento corrispondente nell’array SegCode[], e utilizza hc595_shift() per trasferire il codice SegCode nel registro a scorrimento del 74HC595.

Nota

Il formato esadecimale dei numeri da 0 a 15 è (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)

Immagine del Fenomeno

../_images/image74.jpeg