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)