1.1.4 7-Segment-Anzeige¶
Einführung¶
Lassen Sie uns versuchen, eine 7-Segment-Anzeige anzusteuern, um Ziffern von 0 bis 9 und Buchstaben von A bis F anzuzeigen.
Benötigte Komponenten¶
Für dieses Projekt benötigen wir die folgenden Komponenten.
Schaltplan¶
Verbinden Sie den Pin ST_CP des 74HC595 mit dem GPIO18 des Raspberry Pi, SH_CP mit GPIO27, DS mit GPIO17, parallele Ausgangsports mit den 8 Segmenten der LED-Segment- Anzeige.
Daten werden in den DS-Pin eingegeben und beim Anstieg von SH_CP (dem Takt- eingang des Schieberegisters) in das Schieberegister und beim Anstieg von ST_CP (dem Takt- eingang des Speichers) in das Speicherregister übertragen.
Dann können Sie die Zustände von SH_CP und ST_CP über die GPIOs des Raspberry Pi steuern, um serielle Dateneingaben in parallele Daten- ausgaben umzuwandeln, um GPIOs des Raspberry Pi zu sparen und die Anzeige anzusteuern.
T-Board Name |
physical |
BCM |
GPIO17 |
Pin 11 |
17 |
GPIO18 |
Pin 12 |
18 |
GPIO27 |
Pin 13 |
27 |
Experimentelle Verfahren¶
Schritt 1: Bauen Sie den Schaltkreis auf.
Schritt 2: Wechseln Sie in den Ordner des Codes.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Schritt 3: Führen Sie das Programm aus.
sudo python3 1.1.4_7-Segment_zero.py
Nachdem der Code ausgeführt wurde, sehen Sie, dass die 7-Segment-Anzeige 0-9, A-F anzeigt.
Code
Bemerkung
Sie können den unten stehenden Code Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen. Aber bevor Sie das tun, müssen Sie zum Quellcode-Pfad wie davinci-kit-for-raspberry-pi/python-pi5
gehen. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um die Auswirkungen zu sehen. Nachdem Sie bestätigt haben, dass keine Probleme vorliegen, können Sie den geänderten Code mit der Kopieren-Schaltfläche kopieren, dann den Quellcode im Terminal über den Befehl nano
öffnen und einfügen.
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
# GPIO-Pins, die mit dem 74HC595 Schieberegister verbunden sind
SDI = OutputDevice(17) # Serieller Dateneingang
RCLK = OutputDevice(18) # Speichertakteingang (Register Clock)
SRCLK = OutputDevice(27) # Schieberegistertakt
# Hexadezimale Zifferncodes für eine gemeinsame Kathoden-7-Segment-Anzeige
segCode = [
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
]
def hc595_shift(data):
# 8 Bits Daten in den 74HC595 schieben
for bit in range(8):
# SDI auf hoch oder niedrig setzen, abhängig vom Datenbit
SDI.value = 0x80 & (data << bit)
# Schieberegistertakt auslösen
SRCLK.on()
sleep(0.001)
SRCLK.off()
# Daten durch Auslösen des Speichertakts in die Ausgabe übernehmen
RCLK.on()
sleep(0.001)
RCLK.off()
def display_all_on():
# Funktion, um alle Segmente einzuschalten (für gemeinsame Kathoden-7-Segment-Anzeige)
all_on_code = 0x3f
hc595_shift(all_on_code)
print("Alle Segmente eingeschaltet")
try:
while True:
# Jede hexadezimale Ziffer auf der 7-Segment-Anzeige anzeigen
for code in segCode:
hc595_shift(code) # Den Code in den 74HC595 schieben
# Den angezeigten Segmentcode ausgeben
print(f"Anzeige segCode[{segCode.index(code)}]: 0x{code:02X}")
sleep(0.5) # Pause zwischen der Anzeige jeder Ziffer
except KeyboardInterrupt:
# Skriptunterbrechung (z. B. Ctrl+C) elegant behandeln
pass
Code-Erklärung
Dieser Ausschnitt importiert die notwendigen Klassen für das Projekt.
OutputDevice
ausgpiozero
wird verwendet, um Hardwarekomponenten, die mit GPIO-Pins verbunden sind, zu steuern, undsleep
austime
für Verzögerungen.#!/usr/bin/env python3 from gpiozero import OutputDevice from time import sleep
SDI, RCLK und SRCLK entsprechen den Pins für den seriellen Dateneingang, den Speichertakteingang (Register Clock) und den Schieberegistertakt des 74HC595.
# GPIO-Pins, die mit dem 74HC595 Schieberegister verbunden sind SDI = OutputDevice(17) # Serieller Dateneingang RCLK = OutputDevice(18) # Speichertakteingang (Register Clock) SRCLK = OutputDevice(27) # Schieberegistertakt
segCode
ist ein Array, das hexadezimale Codes für jede auf der 7-Segment-Anzeige darzustellende Ziffer enthält.# Hexadezimale Zifferncodes für eine gemeinsame Kathoden-7-Segment-Anzeige segCode = [ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 ]
Diese Funktion schiebt 8 Bits Daten in den 74HC595. Jedes Bit wird seriell in
SDI
eingegeben,SRCLK
wird umgeschaltet, um das Bit zu verschieben, undRCLK
wird verwendet, um die Daten an den Ausgang zu übertragen.def hc595_shift(data): # 8 Bits Daten in den 74HC595 schieben for bit in range(8): # SDI auf hoch oder niedrig setzen, abhängig vom Datenbit SDI.value = 0x80 & (data << bit) # Schieberegistertakt auslösen SRCLK.on() sleep(0.001) SRCLK.off() # Daten durch Auslösen des Speichertakts in die Ausgabe übernehmen RCLK.on() sleep(0.001) RCLK.off()
Diese Funktion schaltet alle Segmente der Anzeige ein, indem sie einen spezifischen Code an
hc595_shift
sendet.def display_all_on(): # Funktion, um alle Segmente einzuschalten (für gemeinsame Kathoden-7-Segment-Anzeige) all_on_code = 0x3f hc595_shift(all_on_code) print("Alle Segmente eingeschaltet")
In der Hauptschleife wird jeder Code in
segCode
nacheinander an die Anzeige gesendet, mit einer Verzögerung zwischen jedem.try: while True: # Jede hexadezimale Ziffer auf der 7-Segment-Anzeige anzeigen for code in segCode: hc595_shift(code) # Den Code in den 74HC595 schieben # Den angezeigten Segmentcode ausgeben print(f"Anzeige segCode[{segCode.index(code)}]: 0x{code:02X}") sleep(0.5) # Pause zwischen der Anzeige jeder Ziffer
Dieser Teil des Codes behandelt die Unterbrechung des Skripts (wie Ctrl+C) auf elegante Weise.
except KeyboardInterrupt: # Skriptunterbrechung (z. B. Ctrl+C) elegant behandeln pass