CircuitPython-Grove/grove-rgb-lcd/rgblcd.py
2025-06-15 13:32:00 +02:00

68 lines
2.3 KiB
Python

from microcontroller import delay_us
import board
import busio
DISPLAY_TEXT_ADDR = 0x3e
DISPLAY_RGB_ADDR = 0x62
class RGBLCD:
def __init__(self, i2cbus: busio.I2C, lcdaddr=DISPLAY_TEXT_ADDR, rgbaddr=DISPLAY_RGB_ADDR):
self._lcdaddr = lcdaddr
self._rgbaddr = rgbaddr
self.bus = i2cbus
# set backlight to (R,G,B) (values from 0..255 for each)
def setRGB(self, r,g,b):
self.bus.writeto(self._rgbaddr,bytes((0,0)))
self.bus.writeto(self._rgbaddr,bytes((1,0)))
self.bus.writeto(self._rgbaddr,bytes((0x08,0xaa)))
self.bus.writeto(self._rgbaddr,bytes((4,r)))
self.bus.writeto(self._rgbaddr,bytes((3,g)))
self.bus.writeto(self._rgbaddr,bytes((2,b)))
# send command to display (no need for external use)
def textCommand(self, cmd):
self.bus.writeto(self._lcdaddr,bytes((0x80,cmd)))
# set display text \n for second line(or auto wrap)
def setText(self, text):
self.textCommand(0x01) # clear display
delay_us(50000)
self.textCommand(0x08 | 0x04) # display on, no cursor
self.textCommand(0x28) # 2 lines
delay_us(50000)
count = 0
row = 0
for c in text:
if c == '\n' or count == 16:
count = 0
row += 1
if row == 2:
break
self.textCommand(0xc0)
if c == '\n':
continue
count += 1
self.bus.writeto(self._lcdaddr,bytes((0x40,ord(c))))
#Update the display without erasing the display
def setText_norefresh(self, text):
self.textCommand(0x02) # return home
delay_us(50000)
self.textCommand(0x08 | 0x04) # display on, no cursor
self.textCommand(0x28) # 2 lines
delay_us(50000)
count = 0
row = 0
while len(text) < 32: #clears the rest of the screen
text += ' '
for c in text:
if c == '\n' or count == 16:
count = 0
row += 1
if row == 2:
break
self.textCommand(0xc0)
if c == '\n':
continue
count += 1
self.bus.writeto(self._lcdaddr,bytes((0x40,ord(c))))