Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

1.1.5 4-stellige 7-Segment-Anzeige

Einführung

Als Nächstes folgen Sie mir, um zu lernen, wie man die 4-stellige 7-Segment-Anzeige steuert.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/list_4_digit.png

Es ist definitiv praktisch, ein gesamtes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

4-stellige 7-Segment-Anzeige

-

74HC595

KAUFEN

Bemerkung

In diesem Projekt sollten wir für die 4-stellige 7-Segment-Anzeige das BS-Modell verwenden. Wenn Sie das AS-Modell verwenden, leuchtet es möglicherweise nicht.

Schaltplan

T-Board Name

physical

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

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis.

../_images/image80.png

Schritt 2: Navigieren Sie zum Ordner des Codes.

cd ~/raphael-kit/c/1.1.5/

Schritt 3: Kompilieren Sie den Code.

gcc 1.1.5_4-Digit.c -lwiringPi

Schritt 4: Führen Sie die ausführbare Datei aus.

sudo ./a.out

Nachdem der Code ausgeführt wurde, zählt das Programm hoch, um 1 pro Sekunde, und die 4-stellige 7-Segment-Anzeige zeigt den Zählstand an.

Bemerkung

Wenn es nach dem Ausführen nicht funktioniert oder eine Fehlermeldung angezeigt wird: "wiringPi.h: Datei oder Verzeichnis nicht gefunden", beziehen Sie sich bitte auf Installieren und Überprüfen von WiringPi.

Code

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

Code-Erklärung

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

Diese vier Pins steuern die gemeinsamen Anodenpins der vierstelligen 7-Segment-Anzeige.

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

Ein Segment-Code-Array von 0 bis 9 in Hexadezimal (gemeinsame Anode).

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

Wählen Sie die Position des Werts. Es sollte jeweils nur eine Position aktiviert werden. Die aktivierte Position wird hoch geschrieben.

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

Die Funktion wird verwendet, um die Anzeige auf der 4-stelligen 7-Segment-Anzeige festzulegen.

  • clearDisplay(): Schreibt 11111111, um diese acht LEDs auf der 7-Segment-Anzeige auszuschalten und den angezeigten Inhalt zu löschen.

  • pickDigit(0): Wählt die vierte 7-Segment-Anzeige aus.

  • hc595_shift(number[counter%10]): Die Zahl im Einerbereich von counter wird im vierten Segment angezeigt.

signal(SIGALRM, timer);

Dies ist eine systembereitgestellte Funktion, der Prototyp des Codes ist:

sig_t signal(int signum,sig_t handler);

Nach dem Ausführen von signal() unterbricht der Prozess bei Erhalt des entsprechenden signum (in diesem Fall SIGALRM) sofort die vorhandene Aufgabe und bearbeitet die eingestellte Funktion (in diesem Fall timer(sig)).

alarm(1);

Dies ist ebenfalls eine systembereitgestellte Funktion. Der Code-Prototyp ist:

unsigned int alarm (unsigned int seconds);

Es erzeugt nach einer bestimmten Anzahl von Sekunden ein SIGALRM-Signal.

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

Wir verwenden die oben genannten Funktionen, um die Timer-Funktion zu implementieren. Nachdem die alarm()-Funktion das SIGALRM-Signal erzeugt hat, wird die Timer-Funktion aufgerufen. Zu counter wird 1 hinzugefügt, und die Funktion alarm(1) wird nach 1 Sekunde wiederholt aufgerufen.

Phänomen-Bild

../_images/image81.jpeg