<===
2025-11-18 13:36:10
# code.py — Тест LCD2004 (20x4) по I2C на RP2040-Zero + CircuitPython 9.x
# code.py — всё, победа! 4 строки, русский текст, счётчик
import time
import board
import busio
i2c = busio.I2C(board.GP15, board.GP14, frequency=40000)
while not i2c.try_lock():
pass
def lcd_cmd(b):
high = (b & 0xF0) | 0x0C
low = (b & 0xF0) | 0x08
i2c.writeto(0x27, bytes([high, low]))
high = ((b << 4) & 0xF0) | 0x0C
low = ((b << 4) & 0xF0) | 0x08
i2c.writeto(0x27, bytes([high, low]))
time.sleep(0.0005)
def lcd_data(b):
high = (b & 0xF0) | 0x0D
low = (b & 0xF0) | 0x09
i2c.writeto(0x27, bytes([high, low]))
high = ((b << 4) & 0xF0) | 0x0D
low = ((b << 4) & 0xF0) | 0x09
i2c.writeto(0x27, bytes([high, low]))
time.sleep(0.0005)
# инициализация
time.sleep(0.1)
lcd_cmd(0x33); time.sleep(0.005)
lcd_cmd(0x32)
lcd_cmd(0x2C) # 4 строки — вот эта команда была ключевой!
lcd_cmd(0x0C)
lcd_cmd(0x01); time.sleep(0.01)
lcd_cmd(0x06)
# печать строки с выравниванием пробелами
def print_line(text, line):
addr = [0x80, 0xC0, 0x94, 0xD4][line]
lcd_cmd(addr)
text20 = (text + " ")[:20] # вместо ljust
for c in text20:
lcd_data(ord(c))
print_line("1 01234567890123456789", 0)
print_line("2 ABCDEFGHIJKLMNOPQRST", 1)
print_line("3 ТРЕТЬЯ СТРОКА ВИДНА!", 2)
print_line("4 ЧЕТВЁРТАЯ ТОЖЕ ♥♥♥", 3)
count = 0
while True:
lcd_cmd(0xD4 + 14) # позиция 15 на 4-й строке
txt = f"{count:05d}"
lcd_cmd(0xD4 + 14)
for _ in range(6): lcd_data(ord(' ')) # стираем старые цифры
lcd_cmd(0xD4 + 14)
for c in txt: lcd_data(ord(c))
count += 1
time.sleep(0.4)