import rp2
from rp2 import PIO
from machine import Pin
from time import sleep, ticks_ms

# ------ #
# sevseg #
# ------ #

@rp2.asm_pio(out_init=[PIO.OUT_LOW]*8, sideset_init=[PIO.OUT_LOW]*4)
def sevseg():
    wrap_target()
    label("0")
    pull(noblock)           .side(0)      # 0
    mov(x, osr)             .side(0)      # 1
    out(pins, 8)            .side(1)      # 2
    out(pins, 8)            .side(2)      # 3
    out(pins, 8)            .side(4)      # 4
    out(pins, 8)            .side(8)      # 5
    jmp("0")                .side(0)      # 6
    wrap()

# Inicializa o StateMachine para o display de 7 segmentos
sm = rp2.StateMachine(0, sevseg, freq=2000, out_base=Pin(2), sideset_base=Pin(10))
sm.active(1)

# Definição dos dígitos para o display de 7 segmentos (0-9)
digits = [
    0b11000000, # 0
    0b11111001, # 1
    0b10100100, # 2 
    0b10110000, # 3
    0b10011001, # 4
    0b10010010, # 5
    0b10000010, # 6
    0b11111000, # 7
    0b10000000, # 8
    0b10011000, # 9
]

# Função para codificar a hora e os minutos em formato HHMM
def segmentize(hour, minute):
    return (
        digits[minute % 10] | digits[minute // 10 % 10] << 8
        | digits[hour % 10] << 16 
        | digits[hour // 10 % 10] << 24
    )

# Inicializa as variáveis de hora e minuto
hour = 12
minute = 0

# Armazena o tempo da última atualização
last_update = ticks_ms()

# Loop principal para mostrar a hora
while True:
    current_time = ticks_ms()
    # Verifica se se passaram 60.000 ms (60 segundos)
    if current_time - last_update >= 60000: 
        minute += 1
        last_update = current_time  # Atualiza o tempo da última atualização
        if minute >= 60:
            minute = 0
            hour += 1
            if hour >= 24:
                hour = 0

    # Envia a hora formatada para o display de 7 segmentos
    sm.put(segmentize(hour, minute))

    # Aguarda 100 ms antes de verificar novamente
    sleep(0.1)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT