from machine import Pin as p
from machine import Timer
from utime import sleep
START_ID = 0
DIGIT_COUNT = 4
SEGMENTS = []
DIGITS = []
CLN = None
DOT = None
def init_pins():
global CLN
global DOT
# Segment pins
for i in range (START_ID, START_ID+7):
SEGMENTS.append(p(i, p.OUT))
# Digit pins
for i in range(START_ID+7, START_ID+7+DIGIT_COUNT):
DIGITS.append(p(i, p.OUT))
CLN = p(START_ID+7+DIGIT_COUNT, p.OUT)
DOT = p(START_ID+8+DIGIT_COUNT, p.OUT)
def show_digit(
digit: int,
digit_index: int,
colon_enabled: bool = False,
dot_enabled: bool = False
):
digit_list_hex = [
0x40, # 0
0x79, # 1
0x24, # 2
0x30, # 3
0x19, # 4
0x12, # 5
0x02, # 6
0x78, # 7
0x00, # 8
0x10, # 9
# 0x08, # A
# 0x03, # B
# 0x46, # C
# 0x21, # D
# 0x06, # E
# 0x0E, # F
]
if digit < 0 or digit > len(digit_list_hex)-1:
return 1
if digit_index < 0 or digit_index > len(DIGITS)-1:
return 1
for dig in DIGITS:
dig.value(1)
mask = digit_list_hex[digit]
for seg in SEGMENTS:
seg.value(0)
for i, seg in enumerate(SEGMENTS):
seg.value(not(mask >> i) & 1)
if colon_enabled:
CLN.value(1)
else:
CLN.value(0)
if dot_enabled:
DOT.value(1)
else:
DOT.value(0)
DIGITS[digit_index].value(0)
def show_number(number: str):
for i in range(len(DIGITS)):
show_digit(int(number[i]), i, False, i==2)
sleep(0.005)
def fill_zeros(number: int, target_length: int):
n = str(number)
zeros = "0"*(target_length - len(n))
return str(zeros+n)
# Timer to show the screen
time = 0
def update_time(t):
global time
if time > 9999:
time = 0
time += 1
timer = Timer()
timer.init(mode=Timer.PERIODIC, period=100, callback=update_time)
def main():
init_pins()
while True:
show_number(fill_zeros(time, 4))
if __name__ == "__main__":
main()