Nota
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.
¿Por qué unirse?
Soporte Experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances Exclusivos: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.
Descuentos Especiales: Aprovecha descuentos exclusivos en nuestros productos más recientes.
Promociones Festivas y Sorteos: Participa en sorteos y promociones especiales.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
1.1.5 Pantalla de 7 Segmentos de 4 Dígitos
Introducción
A continuación, aprendamos cómo controlar una pantalla de 7 segmentos de 4 dígitos.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.

Diagrama de Conexiones
T-Board Name |
physical |
BCM |
GPIO17 |
Pin 11 |
17 |
GPIO27 |
Pin 13 |
27 |
GPIO22 |
Pin 15 |
22 |
SPIMOSI |
Pin 19 |
10 |
GPIO18 |
Pin 12 |
18 |
GPIO23 |
Pin 16 |
23 |
GPIO24 |
Pin 18 |
24 |

Procedimientos del Experimento
Paso 1: Construir el circuito.

Paso 2: Accede a la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Paso 3: Ejecuta el archivo.
sudo python3 1.1.5_4-Digit.py
Al ejecutar el código, el programa iniciará un contador, aumentando en 1 cada segundo, y la pantalla de 4 dígitos mostrará la cuenta.
Advertencia
Si aparece un mensaje de error RuntimeError: Cannot determine SOC peripheral base address
, consulta Si gpiozero no funciona.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Primero, asegúrate de estar en la ruta del código fuente como davinci-kit-for-raspberry-pi/python-pi5
. Tras modificar el código, puedes ejecutarlo directamente para ver el efecto.
#!/usr/bin/env python3
from gpiozero import OutputDevice
import time
import threading
# Define pines GPIO para el registro de desplazamiento 74HC595
SDI = OutputDevice(24) # Entrada de datos en serie
RCLK = OutputDevice(23) # Reloj de registro
SRCLK = OutputDevice(18) # Reloj de desplazamiento
# Definir pines GPIO para la selección de dígitos en la pantalla de 7 segmentos
placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
# Códigos de segmentos para los números 0-9 en la pantalla de 7 segmentos
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
counter = 0 # Inicializar contador para mostrar
timer1 = 0 # Inicializar temporizador para incrementar el contador
def clearDisplay():
""" Clear the 7-segment display. """
for _ in range(8):
SDI.on()
SRCLK.on()
SRCLK.off()
RCLK.on()
RCLK.off()
def hc595_shift(data):
""" Shift a byte of data to the 74HC595 shift register. """
for i in range(8):
SDI.value = 0x80 & (data << i)
SRCLK.on()
SRCLK.off()
RCLK.on()
RCLK.off()
def pickDigit(digit):
""" Select a digit for display on the 7-segment display. """
for pin in placePin:
pin.off()
placePin[digit].on()
def timer():
""" Timer function to increment the counter every second. """
global counter, timer1
timer1 = threading.Timer(1.0, timer)
timer1.start()
counter += 1
print("%d" % counter)
def setup():
""" Setup initial state and start the timer. """
global timer1
timer1 = threading.Timer(1.0, timer)
timer1.start()
def loop():
""" Main loop to update the 7-segment display with counter value. """
global counter
while True:
for i in range(4):
clearDisplay()
pickDigit(i)
digit = (counter // (10 ** i)) % 10
hc595_shift(number[digit])
time.sleep(0.001)
def destroy():
""" Cleanup GPIO resources and stop timer on exit. """
global timer1
timer1.cancel()
for device in [SDI, RCLK, SRCLK] + placePin:
device.close()
try:
setup()
while True:
loop()
except KeyboardInterrupt:
destroy()
Explicación del Código
Estos cuatro pines controlan los pines de ánodo común de las pantallas de 7 segmentos de cuatro dígitos.
# Definir pines GPIO para la selección de dígitos en la pantalla de 7 segmentos placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
Una matriz de códigos de segmentos de 0 a 9 en hexadecimal (ánodo común).
# Códigos de segmentos para los números 0-9 en la pantalla de 7 segmentos number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
Inicializa un temporizador que activa la función timer cada segundo. Esto establece el incremento recurrente del contador.
def setup(): """ Setup initial state and start the timer. """ global timer1 timer1 = threading.Timer(1.0, timer) timer1.start()
Una vez que el temporizador alcanza 1.0s, se llama a la función Timer; se incrementa el contador en 1, y el Timer se usa nuevamente para ejecutarse cada segundo.
def timer(): """ Timer function to increment the counter every second. """ global counter, timer1 timer1 = threading.Timer(1.0, timer) timer1.start() counter += 1 print("%d" % counter)
Desplaza un byte de datos al registro 74HC595, controlando los segmentos de la pantalla.
def hc595_shift(data): """ Shift a byte of data to the 74HC595 shift register. """ for i in range(8): SDI.value = 0x80 & (data << i) SRCLK.on() SRCLK.off() RCLK.on() RCLK.off()
Actualiza continuamente la pantalla con el valor actual del contador, mostrando cada dígito secuencialmente.
def loop(): """ Main loop to update the 7-segment display with counter value. """ global counter while True: for i in range(4): clearDisplay() pickDigit(i) digit = (counter // (10 ** i)) % 10 hc595_shift(number[digit]) time.sleep(0.001)
Limpia la pantalla de 7 segmentos al apagar todos los segmentos antes de mostrar el siguiente dígito.
def clearDisplay(): """ Clear the 7-segment display. """ for _ in range(8): SDI.on() SRCLK.on() SRCLK.off() RCLK.on() RCLK.off()
Selecciona cuál dígito de la pantalla de 7 segmentos activar. Cada dígito es controlado por un pin GPIO separado.
def pickDigit(digit): """ Select a digit for display on the 7-segment display. """ for pin in placePin: pin.off() placePin[digit].on()
Libera los recursos GPIO y detiene el temporizador cuando se interrumpe el programa.
except KeyboardInterrupt: # Manejar la interrupción del script (por ejemplo, Ctrl+C) destroy()