import machine
import math
import time


SEVEN_SEGMENT_START_PIN = 0
DISPLAY_COUNT = 4
DECIMAL_PRECISION = 1


digit_list_hex = [
    0x40,  
    0x79,  
    0x24,  
    0x30,  
    0x19,  
    0x12,  
    0x02,  
    0x78,  
    0x00,  
    0x10,  
    0x08,  
    0x03,  
    0x46,  
    0x21,  
    0x06,  
    0x0E,  
    0x7F   
]


display_value = 0
segment_pins = []
display_select_pins = []
current_display_index = DISPLAY_COUNT - 1  
display_timer = None
counter_timer = None




def disable_display_timer():
    global display_timer
    display_timer.deinit()


def enable_display_timer():
    global display_timer
    display_timer.init(period=30, mode=machine.Timer.PERIODIC, callback=scan_display)


def scan_display(timer_int):
    global current_display_index, display_value

   
    digit = int((display_value // math.pow(10, current_display_index))) % 10

   
    display_digit(digit, current_display_index, 
        current_display_index == DECIMAL_PRECISION and 0 != DECIMAL_PRECISION)


    current_display_index = (current_display_index - 1)
    if current_display_index < 0:
        current_display_index = DISPLAY_COUNT - 1


def display_digit(digit_value, digit_index, dp_enable=False):
   
    if digit_value < 0 or digit_value > len(digit_list_hex):
        return

    
    for pin in display_select_pins:
        pin.value(0)

    
    mask = digit_list_hex[digit_value]
    for i in range(7):  
        segment_pins[i].value((mask >> i) & 1)

    
    segment_pins[7].value(1 if dp_enable else 0)  

  
    if digit_index == -1:
        for pin in display_select_pins:
            pin.value(1)
    
    elif 0 <= digit_index < DISPLAY_COUNT:
        display_select_pins[digit_index].value(1)


def display_value_test():
    global display_value

    disable_display_timer()
    current_display_index = 0

    for i in range(0, len(digit_list_hex)):
        display_digit(i, -1, i % 2 != 0)
        time.sleep(0.5)

    for i in range(0, len(digit_list_hex)):
        display_digit(i, DISPLAY_COUNT - 1 - (i % DISPLAY_COUNT), True)
        time.sleep(0.5)        

    display_digit(16, -1, False)
    enable_display_timer()

def count_display_value(timer_int):
    global display_value
    display_value += 5
    if display_value == 200:
        display_value = 0


def setup():
    global segment_pins, display_select_pins
    global display_timer, counter_timer


    for i in range(SEVEN_SEGMENT_START_PIN + 8, SEVEN_SEGMENT_START_PIN + 8 + DISPLAY_COUNT):
        pin = machine.Pin(i, machine.Pin.OUT)
        pin.value(0)
        display_select_pins.append(pin)


    for i in range(SEVEN_SEGMENT_START_PIN, SEVEN_SEGMENT_START_PIN + 8):
        pin = machine.Pin(i, machine.Pin.OUT)
        pin.value(1)
        segment_pins.append(pin)

    
    display_timer = machine.Timer()
    enable_display_timer()

    counter_timer = machine.Timer()
    counter_timer.init(period=100, mode=machine.Timer.PERIODIC, callback=count_display_value)

if __name__ == '__main__':
    setup()
$abcdeabcde151015202530354045505560fghijfghij
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT