"""
1er Parcial, 2a. parte
Comparador de 4 bits
Se leerá un número (A), de 4 bits, de las terminales:
GPIO3, GPIO2, GPIO1 y GPIO0 (GPIO0 es el menos significativo)
Y otro número (B), también de 4 bits, de las terminales:
GPIO7, GPIO6, GPIO5 y GPIO4 (GPIO4 es el menos significativo)
Si A > B se enciende el LED de GPIO16
Si A = B se enciende el LED de GPIO17
Si A < B se enciende el LED de GPIO18
Implementación en MicroPython para Raspberry Pi Pico W
"""
from machine import Pin
import time
# --- Configuración de Hardware ---
# Definición de Pines para el Número A (GPIO 0 a 3)
# GPIO0 es el Menos Significativo (LSB), GPIO3 es el Más Significativo (MSB)
# Orden en la lista: [LSB, ..., MSB] para facilitar el cálculo binario
pines_a = [0, 1, 2, 3]
entradas_a = []
# Definición de Pines para el Número B (GPIO 4 a 7)
# GPIO4 es el LSB, GPIO7 es el MSB
pines_b = [4, 5, 6, 7]
entradas_b = []
# Configuración de pines de entrada con resistencia PULL_DOWN
# Esto asegura que si el switch está apagado, lea 0. Si está encendido (conectado a 3.3v), lea 1.
for p in pines_a:
entradas_a.append(Pin(p, Pin.IN, Pin.PULL_DOWN))
for p in pines_b:
entradas_b.append(Pin(p, Pin.IN, Pin.PULL_DOWN))
# Configuración de Salidas (LEDs)
led_mayor = Pin(16, Pin.OUT) # A > B
led_igual = Pin(17, Pin.OUT) # A = B
led_menor = Pin(18, Pin.OUT) # A < B
# --- Funciones Auxiliares ---
def leer_numero_4bits(lista_pines):
"""
Lee el estado de una lista de 4 pines y convierte
el valor binario a decimal.
La lista debe estar ordenada del bit menos significativo al más significativo.
"""
valor_decimal = 0
for i in range(4):
# Si el pin está en alto (1), sumamos su peso binario (2 elevado a i)
# Ejemplo: Si i=2 (tercer bit), suma 2^2 = 4
if lista_pines[i].value() == 1:
valor_decimal += (1 << i) # Operación bitwise shift
return valor_decimal
def actualizar_leds(a, b):
"""
Compara A y B y enciende el LED correspondiente.
"""
# Apagamos todos primero para limpiar el estado anterior
led_mayor.value(0)
led_igual.value(0)
led_menor.value(0)
if a > b:
led_mayor.value(1) # GPIO 16
print(f"Estado: A ({a}) > B ({b}) -> LED 16 ON")
elif a == b:
led_igual.value(1) # GPIO 17
print(f"Estado: A ({a}) = B ({b}) -> LED 17 ON")
else: # a < b
led_menor.value(1) # GPIO 18
print(f"Estado: A ({a}) < B ({b}) -> LED 18 ON")
# --- Bucle Principal (Main Loop) ---
print("Iniciando Comparador de 4 Bits...")
print("A: GPIO 3-2-1-0 | B: GPIO 7-6-5-4")
while True:
# 1. Leer los valores actuales
valor_a = leer_numero_4bits(entradas_a)
valor_b = leer_numero_4bits(entradas_b)
# 2. Comparar y encender LEDs
actualizar_leds(valor_a, valor_b)
# 3. Pequeña pausa para estabilidad y no saturar la CPU
time.sleep(0.1)