# Nombre: Eusebio Sarabia Alexis
# El circuito NLSF595 es un registro diseñado para manejar LED's RGB o displays de ánodo común
# el registro recibe información por el protocolo SPI y se pueden conectar varios en cascada
# Objetivo del problema: Modifique el programa para que el contador cambie cuando se presionan los botones
# Con GPIO14 el contador se debe incrementar (de 99 pasará a 0)
# Con GPIO15 el contador se debe decrementar (de 0 pasará a 99)
# Utilice interrupciones por GPIO y considere la eliminación de rebotes
from machine import Pin, SPI
import time
# Configuración del SPI
spi = SPI(0, baudrate=500000, sck=Pin(18), mosi=Pin(19), miso=Pin(16))
ss = Pin(17, Pin.OUT)
ss.value(1)
# Arreglo con los códigos en 7 segmentos para displays de ánodo común
digitos = [
0b11000000, # 0
0b11111001, # 1
0b10100100, # 2
0b10110000, # 3
0b10011001, # 4
0b10010010, # 5
0b10000010, # 6
0b11111000, # 7
0b10000000, # 8
0b10010000 # 9
]
# Función para enviar al display
def Send(valor):
u = digitos[valor % 10]
d = digitos[valor // 10]
buf = [u, d]
ss.value(0)
spi.write(bytearray(buf))
ss.value(1)
# Variables globales
contador = 0
ultimo_tiempo = 0
DEBOUNCE_MS = 200
# Funciones de interrupción
def boton_incrementar(pin):
global contador, ultimo_tiempo
if time.ticks_diff(time.ticks_ms(), ultimo_tiempo) > DEBOUNCE_MS:
contador = (contador + 1) % 100
Send(contador)
ultimo_tiempo = time.ticks_ms()
def boton_decrementar(pin):
global contador, ultimo_tiempo
if time.ticks_diff(time.ticks_ms(), ultimo_tiempo) > DEBOUNCE_MS:
contador = (contador - 1) % 100
Send(contador)
ultimo_tiempo = time.ticks_ms()
# Configurar botones
btn_up = Pin(14, Pin.IN, Pin.PULL_UP)
btn_down = Pin(15, Pin.IN, Pin.PULL_UP)
# Asociar interrupciones (flanco de bajada)
btn_up.irq(trigger=Pin.IRQ_FALLING, handler=boton_incrementar)
btn_down.irq(trigger=Pin.IRQ_FALLING, handler=boton_decrementar)
# Mostrar valor inicial
Send(contador)
# Bucle principal (espera pasiva)
while True:
time.sleep(1)