from machine import Pin
from time import sleep

# Configuración de los pines de salida para el display
A = Pin(15, Pin.OUT)
B = Pin(2, Pin.OUT)
C = Pin(4, Pin.OUT)
D = Pin(5, Pin.OUT)
E = Pin(18, Pin.OUT)
F = Pin(19, Pin.OUT)
G = Pin(21, Pin.OUT)
P = Pin(22, Pin.OUT)  # Indicador de signo negativo

# Configuración de los pines de entrada para el encoder
SA = Pin(25, Pin.IN)  # CLK
SB = Pin(26, Pin.IN)  # DT

# Definición de los segmentos para los números del display de 0 a 9
Serie = ("1111110", "0110000", "1101101", "1111001", "0110011", 
         "1011011", "1011111", "1110000", "1111111", "1111011")

# Variables globales
pul = 0
dat = 0

# Función para desplegar un número en el display
def Dis(x, negativo=False):
    A.value(int(x[0]))
    B.value(int(x[1]))
    C.value(int(x[2]))
    D.value(int(x[3]))
    E.value(int(x[4]))
    F.value(int(x[5]))
    G.value(int(x[6]))
    P.value(1 if negativo else 0)  # Activa P si el número es negativo

# Función para incrementar el contador
def Anti(pin):
    global pul, dat
    if SA.value() == 0:
        pul += 1
        print("Pulsos:", pul)
        while SB.value() == 0:
            sleep(0.002)
        if pul >= 15:
            pul = 0
            if dat < 9:   # Limitar el valor superior a 9
                dat += 1
            Dis(Serie[abs(dat)], negativo=(dat < 0))

# Función para decrementar el contador
def Hora(pin):
    global pul, dat
    if SB.value() == 0:
        pul -= 1
        print("Pulsos:", pul)
        while SA.value() == 0:
            sleep(0.002)
        if pul <= -15:
            pul = 0
            if dat > -9:  # Limitar el valor inferior a -9
                dat -= 1
            Dis(Serie[abs(dat)], negativo=(dat < 0))

# Configuración de interrupciones
SA.irq(trigger=Pin.IRQ_FALLING, handler=Hora)
SB.irq(trigger=Pin.IRQ_FALLING, handler=Anti)

# Mostrar el valor inicial
Dis(Serie[dat])

# Bucle principal
while True:
    pass