from machine import Pin
from time import sleep_ms
class LCD:
def __init__(self, rs, e, d4, d5, d6, d7):
self.rs = Pin(rs, Pin.OUT)
self.e = Pin(e, Pin.OUT)
self.data_pins = [Pin(d4, Pin.OUT), Pin(d5, Pin.OUT), Pin(d6, Pin.OUT), Pin(d7, Pin.OUT)]
self.init_lcd()
def pulse_enable(self):
self.e.on()
sleep(0.001)
self.e.off()
sleep(0.001)
def send_nibble(self, data):
for i in range(4):
self.data_pins[i].value((data >> i) & 1)
self.pulse_enable()
def send_byte(self, data, rs_mode):
self.rs.value(rs_mode) # 0 = command, 1 = data
self.send_nibble(data >> 4) # Send upper nibble
self.send_nibble(data & 0x0F) # Send lower nibble
def command(self, cmd):
self.send_byte(cmd, 0)
def write_char(self, char):
self.send_byte(ord(char), 1)
def clear(self):
self.command(0x01)
sleep(0.002)
def move_to(self, col, row):
addr = col + (0x40 if row == 1 else 0x00)
self.command(0x80 | addr)
def write_string(self, text):
for char in text:
self.write_char(char)
def init_lcd(self):
sleep(0.02) # Wait for power-on
self.send_nibble(0x03)
sleep(0.005)
self.send_nibble(0x03)
sleep(0.005)
self.send_nibble(0x03)
sleep(0.001)
self.send_nibble(0x02) # Set to 4-bit mode
self.command(0x28) # Function set: 4-bit, 2-line, 5x8 dots
self.command(0x0C) # Display on, cursor off, no blinking
self.command(0x06) # Entry mode: Increment cursor, no shift
self.clear()
def scroll_text(lcd, text, row=0, delay=0.3):
if len(text) <= 16:
lcd.move_to(0, row)
lcd.write_string(text)
else:
for i in range(len(text) - 16 + 1):
lcd.move_to(0, row)
lcd.write_string(text[i:i + 16])
sleep(delay)
lcd.move_to(0, row)
lcd.write_string(" " * 16) # Clear the row after scrolling
# Main Program
lcd = LCD(rs=4, e=5, d4=18, d5=19, d6=21, d7=22)
while True:
lcd.clear()
lcd.write_string("Hello, World!")
sleep(2)
lcd.clear()
scroll_text(lcd, "This is a scrolling text example in MicroPython!", row=0, delay=0.2)