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))))