# pico_7seg_count.py (MicroPython)
from machine import Pin
import utime
# сегменттерді GPIO-ға байлау (өз кабельдеріңізге байланысты өзгертіңіз)
seg_pins = {
'a': Pin(0, Pin.OUT),
'b': Pin(1, Pin.OUT),
'c': Pin(2, Pin.OUT),
'd': Pin(3, Pin.OUT),
'e': Pin(4, Pin.OUT),
'f': Pin(5, Pin.OUT),
'g': Pin(6, Pin.OUT),
'dp': Pin(7, Pin.OUT)
}
# цифр (анод/катод драйверлері) — 4 цифр
digits = [Pin(8, Pin.OUT), Pin(9, Pin.OUT), Pin(10, Pin.OUT), Pin(11, Pin.OUT)]
# сегменттік маскалар цифрлар үшін (0..9). 1 = сегментті жандыру.
# Тізім: a,b,c,d,e,f,g (dp оқшау)
SEG_MAP = {
0: (1,1,1,1,1,1,0),
1: (0,1,1,0,0,0,0),
2: (1,1,0,1,1,0,1),
3: (1,1,1,1,0,0,1),
4: (0,1,1,0,0,1,1),
5: (1,0,1,1,0,1,1),
6: (1,0,1,1,1,1,1),
7: (1,1,1,0,0,0,0),
8: (1,1,1,1,1,1,1),
9: (1,1,1,1,0,1,1)
}
def clear_segments():
for s in seg_pins.values():
s.value(0)
def show_digit(pos, digit, dot=False):
"""
pos: 0..3 (which digit)
digit: 0..9
dot: boolean for decimal point
"""
# Барлық цифрларды өшіріп алыңыз (ингредиенттердің өшуі)
for d in digits:
d.value(0) # common cathode -> 0 өшіреді, 1 қосады
# сегменттерді орнату
seg_vals = SEG_MAP.get(digit, (0,0,0,0,0,0,0))
seg_order = ['a','b','c','d','e','f','g']
for name, v in zip(seg_order, seg_vals):
seg_pins[name].value(v)
seg_pins['dp'].value(1 if dot else 0)
# белсенді цифрды қосу
digits[pos].value(1)
# қысқа уақыт ұстап тұру (мультиплексинг рем)
utime.sleep_ms(3)
# сөндіру
digits[pos].value(0)
def display_number(num_str, duration_ms):
"""
num_str - 1..4 таңба (мыс. " 42" немесе "0123")
duration_ms - қанша уақыт (миллисекунд) осы мән көрсетілсін (төмендегі цикл ішінде)
"""
start = utime.ticks_ms()
while utime.ticks_diff(utime.ticks_ms(), start) < duration_ms:
# әр цифрды көрсету
for pos in range(4):
ch = ' '
if pos < len(num_str):
ch = num_str[pos]
if ch == ' ':
# барлық сегменттерді сөндіру (бос цифр)
clear_segments()
# қысқа пауза
utime.sleep_ms(1)
else:
digit = int(ch)
show_digit(pos, digit)
# Басты цикл: мәнді 0.5 с сайын жаңарту
value = 0
try:
while True:
s = f"{value:>4}" # оң жаққа туралау, максимум 4 символ
# display_number бұл мәтінді duration_ms ішінде мультиплекс арқылы көрсетеді
display_number(s, 500) # 500 ms -> 0.5 s
value = (value + 1) % 10000 # 0..9999 диапазон
except KeyboardInterrupt:
clear_segments()
for d in digits:
d.value(0)