Nota

Ciao, benvenuto nella community di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci la tua esperienza con Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

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

  • Impara e Condividi: Scambia suggerimenti 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 Giveaway: Partecipa a concorsi e promozioni festive.

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

1.1.5 Display a 4 Cifre e 7 Segmenti

Introduzione

Prossimamente, segui le istruzioni per imparare a controllare il display a 4 cifre e 7 segmenti.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_4_digit.png

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

Nome

COMPONENTI NEL KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai seguenti link.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Display a 7 Segmenti da 4 Cifre

-

74HC595

ACQUISTA

Nota

In questo progetto, per il display a 4 cifre e 7 segmenti dovremmo usare il modello BS; se usi il modello AS potrebbe non accendersi.

Schema Elettrico

Nome Scheda

Fisico

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

SPIMOSI

Pin 19

12

10

GPIO18

Pin 12

1

18

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

../_images/schmatic_4_digit.png

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/image80.png

Passo 2: Vai alla cartella del codice.

cd ~/raphael-kit/c/1.1.5/

Passo 3: Compila il codice.

gcc 1.1.5_4-Digit.c -lwiringPi

Passo 4: Esegui il file eseguibile.

sudo ./a.out

Dopo l’esecuzione del codice, il programma esegue un conteggio che aumenta di 1 ogni secondo e il display a 4 cifre e 7 segmenti visualizza il conteggio.

Nota

Se non funziona dopo l’esecuzione, o appare un messaggio di errore: "wiringPi.h: No such file or directory", fai riferimento a Installa e Controlla wiringPi.

Codice

#include <wiringPi.h>
#include <stdio.h>
#include <wiringShift.h>
#include <signal.h>
#include <unistd.h>

#define SDI 5
#define RCLK 4
#define SRCLK 1

const int placePin[] = {12, 3, 2, 0};
unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

int counter = 0;

void pickDigit(int digit)
{
    for (int i = 0; i < 4; i++)
    {
        digitalWrite(placePin[i], 0);
    }
    digitalWrite(placePin[digit], 1);
}

void hc595_shift(int8_t data)
{
    int i;
    for (i = 0; i < 8; i++)
    {
        digitalWrite(SDI, 0x80 & (data << i));
        digitalWrite(SRCLK, 1);
        delayMicroseconds(1);
        digitalWrite(SRCLK, 0);
    }
    digitalWrite(RCLK, 1);
    delayMicroseconds(1);
    digitalWrite(RCLK, 0);
}

void clearDisplay()
{
    int i;
    for (i = 0; i < 8; i++)
    {
        digitalWrite(SDI, 1);
        digitalWrite(SRCLK, 1);
        delayMicroseconds(1);
        digitalWrite(SRCLK, 0);
    }
    digitalWrite(RCLK, 1);
    delayMicroseconds(1);
    digitalWrite(RCLK, 0);
}

void loop()
{
    while(1){
    clearDisplay();
    pickDigit(0);
    hc595_shift(number[counter % 10]);

    clearDisplay();
    pickDigit(1);
    hc595_shift(number[counter % 100 / 10]);

    clearDisplay();
    pickDigit(2);
    hc595_shift(number[counter % 1000 / 100]);

    clearDisplay();
    pickDigit(3);
    hc595_shift(number[counter % 10000 / 1000]);
    }
}

void timer(int timer1)
{
    if (timer1 == SIGALRM)
    {
        counter++;
        alarm(1);
        printf("%d\n", counter);
    }
}

void main(void)
{
    if (wiringPiSetup() == -1)
    {
        printf("setup wiringPi failed !");
        return;
    }
    pinMode(SDI, OUTPUT);
    pinMode(RCLK, OUTPUT);
    pinMode(SRCLK, OUTPUT);

    for (int i = 0; i < 4; i++)
    {
        pinMode(placePin[i], OUTPUT);
        digitalWrite(placePin[i], HIGH);
    }
    signal(SIGALRM, timer);
    alarm(1);
    loop();
}

Spiegazione del Codice

const int placePin[] = {12, 3, 2, 0};

Questi quattro pin controllano i pin di anodo comune del display a 4 cifre e 7 segmenti.

unsigned char number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

Un array di codici segmento da 0 a 9 in esadecimale (anodo comune).

void pickDigit(int digit)
{
    for (int i = 0; i < 4; i++)
    {
        digitalWrite(placePin[i], 0);
    }
    digitalWrite(placePin[digit], 1);
}

Seleziona la posizione del valore. Solo una posizione deve essere abilitata ogni volta. La posizione abilitata sarà scritta su HIGH.

void loop()
{
    while(1){
    clearDisplay();
    pickDigit(0);
    hc595_shift(number[counter % 10]);

    clearDisplay();
    pickDigit(1);
    hc595_shift(number[counter % 100 / 10]);

    clearDisplay();
    pickDigit(2);
    hc595_shift(number[counter % 1000 / 100]);

    clearDisplay();
    pickDigit(3);
    hc595_shift(number[counter % 10000 / 1000]);
    }
}

La funzione viene utilizzata per impostare il numero visualizzato sul display a 4 cifre e 7 segmenti.

  • clearDisplay():scrivi 11111111 per spegnere questi otto LED sul display a 7 segmenti in modo da cancellare il contenuto visualizzato.

  • pickDigit(0):seleziona il quarto display a 7 segmenti.

  • hc595_shift(number[counter%10]):il numero nella cifra singola di counter verrà visualizzato sul quarto segmento.

signal(SIGALRM, timer);

Questa è una funzione fornita dal sistema, il prototipo di codice è:

sig_t signal(int signum,sig_t handler);

Dopo l’esecuzione di signal(), una volta che il processo riceve il corrispondente signum (in questo caso SIGALRM), interrompe immediatamente l’attività in corso e gestisce la funzione impostata (in questo caso timer(sig) ).

alarm(1);

Questa è anche una funzione fornita dal sistema. Il prototipo del codice è:

unsigned int alarm (unsigned int seconds);

Genera un segnale SIGALRM dopo un certo numero di secondi.

void timer(int timer1)
{
    if (timer1 == SIGALRM)
    {
        counter++;
        alarm(1);
        printf("%d\n", counter);
    }
}

Utilizziamo le funzioni sopra per implementare la funzione timer. Dopo che alarm() genera il segnale SIGALRM, viene chiamata la funzione timer. Aggiunge 1 a counter e la funzione alarm(1) verrà ripetutamente chiamata dopo 1 secondo.

Immagine del Fenomeno

../_images/image81.jpeg