2.7 4-Digital-7-Segment-Anzeige

Überblick

In dieser Lektion lernen Sie die 4-Digital-7-Segment-Anzeige kennen. Es besteht aus vier 7-Segment-Anzeigen, die zusammenarbeiten, um 4-stellige Zahlen anzuzeigen.

Erforderliche Komponenten

../_images/list_2.7.png

Fritzing-Schaltung

../_images/image438.png

Schematische Darstellung

../_images/image439.png

Code

Bemerkung

  • Sie können die Datei 2.7_4digitalSegment.ino unter dem Pfad sunfounder_vincent_kit_for_arduino\code\2.7_4digitalSegment direkt öffnen.

Code-Analyse

Im Wesentlichen verwendet dieser Code das Prinzip des Multiplexing, um eine 4-stellige Zahl auf einer 7-Segment-Anzeige darzustellen. Durch schnelles Umschalten zwischen den Ziffern und Anzeigen einer Ziffer zu einem Zeitpunkt entsteht der Eindruck, dass alle Ziffern gleichzeitig angezeigt werden. Die Stoppuhr-Funktionalität wird durch die Verwendung der eingebauten millis()-Funktion erreicht, um die Zeit zu verfolgen und die angezeigte Zahl jede Sekunde zu erhöhen.

  1. Variable and Constant Definitions:

    int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
    int digitPins[] = {13, 12, 11, 10};
    
    long n = 0; // Variable to store the current stopwatch number
    int del = 5; // Delay time (in milliseconds) to keep each digit illuminated
    unsigned long previousMillis = 0; // Store the last time the stopwatch incremented
    const long interval = 1000; // One-second interval (in milliseconds)
    
    • Die Arrays segmentPins und digitPins definieren die Pins, die mit den Segmenten bzw. Ziffern der 7-Segment-Anzeige verbunden sind.

    • n ist eine long-Variable, die die aktuelle Stoppuhrennummer verfolgt, beginnend bei 0 und erhöhend.

    • del ist eine Verzögerungszeit, um die Anzeige der aktuellen Ziffer aufrechtzuerhalten, bevor zur nächsten übergegangen wird.

    • previousMillis und interval beziehen sich auf die Zeitmessung, um zu entscheiden, wann die Stoppuhr erhöht wird.

  2. 7-Segment-Muster für Zahlen:

    Das 2D-Array numbers definiert, wie jede der Zahlen 0-9 auf einer Gemeinsam-Kathoden-7-Segment-Anzeige dargestellt wird. Jedes Unterarray hat 8 Werte (entweder HIGH oder LOW), die den 7 Segmenten und einem Dezimalpunkt entsprechen. Dieses Muster hilft, die entsprechenden Segmente für jede Zahl anzusteuern.

    byte numbers[10][8] = {
        {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW},  // 0
        {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW},      // 1
        {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW},   // 2
        {HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW},   // 3
        {LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW},    // 4
        {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW},   // 5
        {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW},  // 6
        {HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW},     // 7
        {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 8
        {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW}   // 9
    };
    
  3. Setup-Funktion:

    void setup() {
        // Configure all segment and digit pins as OUTPUT
        for (int i = 0; i < 8; i++) {
            pinMode(segmentPins[i], OUTPUT);
        }
        for (int i = 0; i < 4; i++) {
            pinMode(digitPins[i], OUTPUT);
            digitalWrite(digitPins[i], HIGH); // Initially turn off all digits (for common-cathode displays, HIGH is OFF)
        }
    }
    
    • Alle Segment- und Ziffern-Pins sind auf OUTPUT-Modus gesetzt, da sie die Segmente und Ziffern der Anzeige steuern.

    • Zu Beginn sind alle Ziffern ausgeschaltet, was durch Schreiben von HIGH für eine Gemeinsam-Kathoden-Anzeige angezeigt wird.

  4. Haupt-Schleife:

    void loop() {
        // Check if a second has passed since the last increment
        if (millis() - previousMillis >= interval) {
            previousMillis += interval; // Update the last increment time
            n = (n + 1) % 10000; // Increment the stopwatch number and wrap around at 9999
        }
    
        displayNumber(n); // Display the current stopwatch number on the 7-segment display
    }
    
    • Dieser Abschnitt überprüft, ob das Intervall (das auf 1000ms oder 1 Sekunde eingestellt ist) seit der letzten Erhöhung der Stoppuhr vergangen ist. Wenn ja, erhöht es die Nummer.

    • Die Nummer wird dann auf der 7-Segment-Anzeige mit der Funktion displayNumber() angezeigt.

  5. displayNumber()-Funktion:

    // Function to display a 4-digit number on the 7-segment display
    void displayNumber(long num) {
        for (int digit = 0; digit < 4; digit++) {
            clearLEDs(); // Turn off all segments and digits
            pickDigit(digit); // Activate the current digit
            int value = (num / (int)pow(10, 3 - digit)) % 10; // Extract the specific digit from the number
            pickNumber(value); // Illuminate the segments to display the digit
            delay(del); // Keep the digit illuminated for a short time
        }
    }
    
    • Diese Funktion zerlegt die 4-stellige Zahl in einzelne Ziffern und zeigt jede Ziffer nacheinander in schneller Folge an. Dies erzeugt den Eindruck, dass alle Ziffern gleichzeitig angezeigt werden, aufgrund der Trägheit des Sehens.

    • Für jede Ziffer löscht die Funktion zuerst alle LEDs, wählt die entsprechende Ziffer mit pickDigit() aus und zeigt dann die Nummer auf dieser Ziffer mit pickNumber() an.

    • Die delay(del) stellt sicher, dass jede Ziffer für eine kurze Zeit sichtbar ist, bevor zur nächsten übergegangen wird.

  6. pickDigit()-Funktion:

    Diese Funktion ist dafür verantwortlich, eine der vier Ziffern auf der 7-Segment-Anzeige auszuwählen (oder einzuschalten). Dies wird erreicht, indem der entsprechende Ziffern-Pin auf LOW gesetzt wird.

    void pickDigit(int x) {
        digitalWrite(digitPins[x], LOW); // Turn ON the selected digit (for common-cathode displays, LOW is ON)
    }
    
  7. pickNumber() Function:

    Gegeben eine einzelne Zahl (0-9), steuert diese Funktion die Segmente der 7-Segment-Anzeige, um diese Zahl anzuzeigen. Sie verwendet das zuvor definierte numbers-Array, um zu wissen, welche Segmente ein-/ausgeschaltet werden sollen.

    void pickNumber(int x) {
        for (int i = 0; i < 8; i++) {
            digitalWrite(segmentPins[i], numbers[x][i]); // Set each segment according to the pattern for the given number
        }
    }
    
  8. clearLEDs() Function:

    Wie der Name schon sagt, schaltet diese Funktion alle Segmente und Ziffern aus. Sie wird verwendet, um sicherzustellen, dass während des Multiplexing-Prozesses in der displayNumber()-Funktion nur eine Ziffer aktiv ist.

    void clearLEDs() {
        for (int i = 0; i < 8; i++) {
            digitalWrite(segmentPins[i], LOW); // Turn off all segments
        }
        for (int i = 0; i < 4; i++) {
            digitalWrite(digitPins[i], HIGH); // Turn off all digits
        }
    }
    

Phänomen Bild

../_images/image104.jpeg