from machine import Pin
import time
from time import sleep_ms

# Controles de los 7 segmentos
seg_a = Pin(0, Pin.OUT)
seg_b = Pin(1, Pin.OUT)
seg_c = Pin(2, Pin.OUT)
seg_d = Pin(3, Pin.OUT)
seg_e = Pin(4, Pin.OUT)
seg_f = Pin(5, Pin.OUT)
seg_g = Pin(6, Pin.OUT)
# Controles de los 4 dígitos
dig_1 = Pin(12, Pin.OUT)
dig_2 = Pin(13, Pin.OUT)
dig_3 = Pin(14, Pin.OUT)
dig_4 = Pin(15, Pin.OUT)
# Variable para el contador
conta = 0

# Interrupción para incrementar el contador
# Importa la función sleep de time
from time import sleep_ms

# Define una constante para el debounce
DEBOUNCE_TIME_MS = 50  # Puedes ajustar este valor según sea necesario

# Interrupción para incrementar el contador con debounce
def inc_conta(pin):
    global conta
    # Añade un pequeño retraso para el debounce
    sleep_ms(DEBOUNCE_TIME_MS)
    # Verifica si el botón sigue presionado después del debounce
    if bot_inc.value() == 0:
        conta += 1 
        print("Contadrp actial",conta) 
         # Incrementa el contador
        if conta > 1000:  # Verifica el límite superior
            conta = 0

# Interrupción para decrementar el contador con debounce
def dec_conta(pin):
    global conta
    # Añade un pequeño retraso para el debounce
    sleep_ms(DEBOUNCE_TIME_MS)
    # Verifica si el botón sigue presionado después del debounce
    if bot_dec.value() == 0:
        conta -= 1  # Decrementa el contador
        if conta < 0:  # Verifica el límite inferior
            conta = 1000

# Interrupción para resetear el contador a 0 con debounce
def rst_conta(pin):
    global conta
    # Añade un pequeño retraso para el debounce
    sleep_ms(DEBOUNCE_TIME_MS)
    # Verifica si el botón sigue presionado después del debounce
    if bot_rst.value() == 0:
        conta = 0



# Función para obtener dígitos del contador
def get_digitos(conta):
    return '{:04}'.format(conta)

# Función para asignar valores a los segmentos
def asignar_segmentos(a, b, c, d, e, f, g):
    seg_a.value(a)
    seg_b.value(b)
    seg_c.value(c)
    seg_d.value(d)
    seg_e.value(e)
    seg_f.value(f)
    seg_g.value(g)

# Función para cambiar número a mostrar en un dígito
def cambiar_digito(num):
    if (num == 0):
        asignar_segmentos(1, 1, 1, 1, 1, 1, 0)
    elif (num == 1):
        asignar_segmentos(0, 1, 1, 0, 0, 0, 0)
    elif (num == 2):
        asignar_segmentos(1, 1, 0, 1, 1, 0, 1)
    elif (num == 3):
        asignar_segmentos(1, 1, 1, 1, 0, 0, 1)
    elif (num == 4):
        asignar_segmentos(0, 1, 1, 0, 0, 1, 1)
    elif (num == 5):
        asignar_segmentos(1, 0, 1, 1, 0, 1, 1)
    elif (num == 6):
        asignar_segmentos(1, 0, 1, 1, 1, 1, 1)
    elif (num == 7):
        asignar_segmentos(1, 1, 1, 0, 0, 0, 0)
    elif (num == 8):
        asignar_segmentos(1, 1, 1, 1, 1, 1, 1)
    elif (num == 9):
        asignar_segmentos(1, 1, 1, 1, 0, 1, 1)
    else:
        asignar_segmentos(0, 0, 0, 0, 0, 0, 0)

# Función para resetear el valor de los dígitos en 0
def rst_digitos():
    dig_1.value(1)
    dig_2.value(1)
    dig_3.value(1)
    dig_4.value(1)

# Función para actualizar los dígitos del display
def actualizar_display(digitos):
    #print(digitos)
    rst_digitos()

    cambiar_digito(int(digitos[3]))     # Carga el valor de las unidades
    dig_4.value(0)                      # Muestra el valor de las unidades
    time.sleep_ms(5)
    dig_4.value(1)

    cambiar_digito(int(digitos[2]))     # Carga el valor de las decenas
    dig_3.value(0)                      # Muestra el valor de las decenas
    time.sleep_ms(5)
    dig_3.value(1)

    cambiar_digito(int(digitos[1]))     # Carga el valor de las centenas
    dig_2.value(0)                      # Muestra el valor de las centenas
    time.sleep_ms(5)
    dig_2.value(1)

    cambiar_digito(int(digitos[0]))     # Carga el valor de las unidades de millar
    dig_1.value(0)                      # Muestra el valor de las unidades de millar
    time.sleep_ms(5)
# Controles de los botones
bot_inc = Pin(21, Pin.IN, Pin.PULL_UP)
bot_dec = Pin(18, Pin.IN, Pin.PULL_UP)
bot_rst = Pin(16, Pin.IN, Pin.PULL_UP)
bot_inc.irq(inc_conta, machine.Pin.IRQ_FALLING)
bot_dec.irq(trigger=Pin.IRQ_FALLING, handler=dec_conta)
bot_rst.irq(trigger=Pin.IRQ_FALLING, handler=rst_conta)
while(1):
    digitos = get_digitos(conta)        # Actualiza constantemente el valor del contador
    actualizar_display(digitos)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT