from machine import I2C
from time import sleep_ms
class SimpleI2cLcd:
LCD_CLR = 0x01
LCD_HOME = 0x02
def __init__(self, i2c, addr, rows, cols):
self.i2c = i2c
self.addr = addr
self.rows = rows
self.cols = cols
self.backlight = 0x08
self.lcd_init()
def lcd_init(self):
sleep_ms(10)
self.lcd_write(0x03)
sleep_ms(1)
self.lcd_write(0x03)
sleep_ms(1)
self.lcd_write(0x03)
sleep_ms(1)
self.lcd_write(0x02)
self.lcd_write_cmd(0x28)
self.lcd_write_cmd(0x0C)
self.lcd_write_cmd(0x06)
self.clear()
def lcd_write(self, data, mode=0):
high = mode | (data & 0xF0) | self.backlight
low = mode | ((data << 4) & 0xF0) | self.backlight
self.i2c.writeto(self.addr, bytes([high | 0x04]))
self.i2c.writeto(self.addr, bytes([high]))
self.i2c.writeto(self.addr, bytes([low | 0x04]))
self.i2c.writeto(self.addr, bytes([low]))
def lcd_write_cmd(self, cmd):
self.lcd_write(cmd, 0)
def lcd_write_char(self, char):
self.lcd_write(ord(char), 0x01)
def clear(self):
self.lcd_write_cmd(self.LCD_CLR)
sleep_ms(2)
def home(self):
self.lcd_write_cmd(self.LCD_HOME)
sleep_ms(2)
def move_to(self, col, row):
row_offsets = [0x00, 0x40, 0x14, 0x54]
self.lcd_write_cmd(0x80 | (col + row_offsets[row]))
def putstr(self, string):
for ch in string:
if ch == '\n':
self.move_to(0, 1)
else:
self.lcd_write_char(ch)