import rp2
from rp2 import PIO
from machine import Pin
from time import sleep_ms
import time
# PIO Programm für 7-Segment-Anzeige
@rp2.asm_pio(out_init=[PIO.OUT_LOW]*8, sideset_init=[PIO.OUT_LOW]*4)
def sevseg():
wrap_target()
label("start")
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("start") .side(0) # 6
wrap()
# Initialisiere State Machine für 7-Segment-Anzeige
def init_sevseg_sm():
sm = rp2.StateMachine(0, sevseg, freq=2000, out_base=Pin(2), sideset_base=Pin(10))
sm.active(1)
return sm
# Pin-Definitionen für die Buttons
def init_buttons():
start_stop_pin = Pin(14, Pin.IN, Pin.PULL_UP)
reset_pin = Pin(15, Pin.IN, Pin.PULL_UP)
return start_stop_pin, reset_pin
# Binäre Darstellung der Ziffern 0-9
def get_digit_patterns():
digits = [
0b11000000, # 0
0b11111001, # 1
0b10100100, # 2
0b10110000, # 3
0b10011001, # 4
0b10010010, # 5
0b10000010, # 6
0b11111000, # 7
0b10000000, # 8
0b10010000 # 9
]
return digits
# Funktion zum Konvertieren von Minuten und Sekunden in binäre Darstellung für 7-Segment-Anzeige
def segmentize(minute, second, digits):
return (
digits[minute // 10] << 24 | digits[minute % 10] << 16
| digits[second // 10] << 8 | digits[second % 10]
)
# Hauptprogramm für die Stoppuhr
def stopwatch(sm, digits, start_stop_pin, reset_pin):
seconds = 0
minutes = 0
start_stop_pressed = False
reset_pressed = False
is_running = False
start_time = 0
while True:
# Button-Status überprüfen
if not start_stop_pin.value():
start_stop_pressed = True
else:
if start_stop_pressed:
# Start/Stop-Logik umkehren, wenn der Button losgelassen wird
is_running = not is_running
start_stop_pressed = False
if is_running:
print("Zeit gestartet")
if not start_time:
start_time = time.ticks_ms()
else:
start_time = time.ticks_ms() - (seconds * 1000 + minutes * 60000)
else:
print("Zeit gestoppt")
if not reset_pin.value():
reset_pressed = True
else:
if reset_pressed:
print("Zeit zurückgesetzt")
# Reset-Logik ausführen, wenn der Button losgelassen wird
seconds = 0
minutes = 0
is_running = False
start_time = 0
sm.put(segmentize(seconds, minutes, digits)) # Setze die Anzeige direkt auf 00:00
reset_pressed = False
# Stoppuhr aktualisieren, wenn aktiv
if is_running:
current_time = time.ticks_ms()
elapsed_time = current_time - start_time
seconds = (elapsed_time // 1000) % 60
minutes = (elapsed_time // 60000) % 60
sm.put(segmentize(minutes, seconds, digits))
# Kurze Verzögerung
sleep_ms(100)
# Hauptprogramm
def main():
sm = init_sevseg_sm()
start_stop_pin, reset_pin = init_buttons()
digits = get_digit_patterns()
stopwatch(sm, digits, start_stop_pin, reset_pin)
# Hauptprogramm aufrufen
main()