<===

ProNotes

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)
← Previous Next →
Back to list