from machine import Pin, Timer
import time
leds = (0, 1, 2, 3, 4, 5, 6)
lista_Pin = [Pin(p, Pin.OUT) for p in leds]
DELAY = 250 # ms
LED = Pin(26, Pin.OUT)
b1 = Pin(19, Pin.IN, Pin.PULL_UP)
b2 = Pin(18, Pin.IN, Pin.PULL_UP)
b3 = Pin(17, Pin.IN, Pin.PULL_UP)
b4 = Pin(16, Pin.IN, Pin.PULL_UP)
tim = Timer()
tick = 0
# tiempo independiente por pin
rebotes = {
b1: 0,
b2: 0,
b3: 0,
b4: 0
}
acciones = {
b1: 1,
b2: 10
}
habi = [
Pin(12, Pin.OUT),
Pin(13, Pin.OUT),
Pin(14, Pin.OUT),
Pin(15, Pin.OUT)
]
digitos = {
# a b c d e f g
0: [1, 1, 1, 1, 1, 1, 0],
1: [0, 1, 1, 0, 0, 0, 0],
2: [1, 1, 0, 1, 1, 0, 1],
3: [1, 1, 1, 1, 0, 0, 1],
4: [0, 1, 1, 0, 0, 1, 1],
5: [1, 0, 1, 1, 0, 1, 1],
6: [1, 0, 1, 1, 1, 1, 1],
7: [1, 1, 1, 0, 0, 0, 0],
8: [1, 1, 1, 1, 1, 1, 1],
9: [1, 1, 1, 0, 0, 1, 1]
}
def salida(valor):
for pin, estado in zip(lista_Pin, digitos[valor]):
pin.value(estado)
def habilitador(k):
habi[k].value(0)
time.sleep_ms(3)
habi[k].value(1)
def mmss():
global conta_mmss
conta_mmss = (conta // 60) * 100 + (conta % 60)
def separar(valor):
return (
valor // 1000,
(valor // 100) % 10,
(valor // 10) % 10,
valor % 10
)
def numeros(digs):
for k in range(4):
salida(digs[k])
habilitador(k)
def temporizador():
global conta, digitos_actuales, decrementa
if conta > 0:
conta -= 1
mmss()
digitos_actuales = separar(conta_mmss)
else:
LED.value(0)
decrementa = 0
tim.deinit()
def timer_callback(t):
global tick
tick = 1
conta = 0
conta_mmss = 0
digitos_actuales = separar(conta_mmss)
decrementa = 0
def incrementa(pin):
global conta, rebotes, digitos_actuales
if decrementa == 0:
ahora = time.ticks_ms()
if time.ticks_diff(ahora, rebotes[pin]) < DELAY:
return
rebotes[pin] = ahora
conta = min(conta + acciones[pin], 1000)
mmss()
digitos_actuales = separar(conta_mmss)
def inicia(pin):
global rebotes, decrementa
if not decrementa and conta > 0:
ahora = time.ticks_ms()
if time.ticks_diff(ahora, rebotes[pin]) < DELAY:
return
rebotes[pin] = ahora
LED.value(1)
decrementa = 1
tim.init(period=1000, mode=Timer.PERIODIC, callback=timer_callback)
def rest_pausa(pin):
global rebotes, decrementa, conta, digitos_actuales
ahora = time.ticks_ms()
if time.ticks_diff(ahora, rebotes[pin]) < DELAY:
return
rebotes[pin] = ahora
if decrementa == 0:
conta = 0
mmss()
digitos_actuales = separar(conta_mmss)
else:
LED.value(0)
decrementa = 0
tim.deinit()
b1.irq(trigger=Pin.IRQ_FALLING, handler=incrementa)
b2.irq(trigger=Pin.IRQ_FALLING, handler=incrementa)
b3.irq(trigger=Pin.IRQ_FALLING, handler=inicia)
b4.irq(trigger=Pin.IRQ_FALLING, handler=rest_pausa)
for i in range(len(habi)):
habi[i].value(1)
while True:
numeros(digitos_actuales)
if tick:
tick = 0
if decrementa:
temporizador()