import machine
import micropython
import time
# Búfer para errores en la ISR
micropython.alloc_emergency_exception_buf(100)
# Variables del Reloj (Registros de tiempo)
segundos = 50
minutos = 11
horas = 20
actualizar_pantalla = False # Bandera (Flag) para el bucle principal
# ISR del Timer de Hardware Real
def isr_reloj_tick(timer):
global segundos, minutos, horas, actualizar_pantalla
segundos += 1
if segundos >= 60:
segundos = 0
minutos += 1
if minutos >= 60:
minutos = 0
horas += 1
if horas >= 24:
horas = 0
# Levantamos una bandera para avisar al Main que cambie la hora en la pantalla
actualizar_pantalla = True
# Inicialización del ÚNICO Timer de Hardware Real
reloj_hw = machine.Timer()
# Disparo exacto cada 1000 ms (1 segundo)
reloj_hw.init(period=1000, mode=machine.Timer.PERIODIC, callback=isr_reloj_tick)
print("Reloj por Hardware Iniciado...")
try:
while True:
# El bucle principal solo dibuja cuando el hardware dice que pasó 1 segundo
if actualizar_pantalla:
# Formateo de string (Permitido aquí en el Main, prohibido en la ISR)
print(f"Hora Actual: {horas:02d}:{minutos:02d}:{segundos:02d}")
# Aquí podrías agregar el código para actualizar un display LCD o una OLED
# oled.text(f"{horas:02d}:{minutos:02d}", 0, 0)
actualizar_pantalla = False # Bajamos la bandera
# La CPU puede hacer otras tareas pesadas aquí sin retrasar el reloj
time.sleep_ms(10)
except KeyboardInterrupt:
reloj_hw.deinit()
print("\nReloj detenido.")