+# -*- coding: utf-8 -*-\r
+import time\r
+from machine import Pin,I2C\r
+\r
+RGB1602_SDA = Pin(4)\r
+RGB1602_SCL = Pin(5)\r
+\r
+RGB1602_I2C = I2C(0,sda = RGB1602_SDA,scl = RGB1602_SCL ,freq = 400000)\r
+\r
+#Device I2C Arress\r
+LCD_ADDRESS = (0x7c>>1)\r
+RGB_ADDRESS = (0xc0>>1)\r
+\r
+#color define\r
+\r
+REG_RED = 0x04\r
+REG_GREEN = 0x03\r
+REG_BLUE = 0x02\r
+REG_MODE1 = 0x00\r
+REG_MODE2 = 0x01\r
+REG_OUTPUT = 0x08\r
+LCD_CLEARDISPLAY = 0x01\r
+LCD_RETURNHOME = 0x02\r
+LCD_ENTRYMODESET = 0x04\r
+LCD_DISPLAYCONTROL = 0x08\r
+LCD_CURSORSHIFT = 0x10\r
+LCD_FUNCTIONSET = 0x20\r
+LCD_SETCGRAMADDR = 0x40\r
+LCD_SETDDRAMADDR = 0x80\r
+\r
+#flags for display entry mode\r
+LCD_ENTRYRIGHT = 0x00\r
+LCD_ENTRYLEFT = 0x02\r
+LCD_ENTRYSHIFTINCREMENT = 0x01\r
+LCD_ENTRYSHIFTDECREMENT = 0x00\r
+\r
+#flags for display on/off control\r
+LCD_DISPLAYON = 0x04\r
+LCD_DISPLAYOFF = 0x00\r
+LCD_CURSORON = 0x02\r
+LCD_CURSOROFF = 0x00\r
+LCD_BLINKON = 0x01\r
+LCD_BLINKOFF = 0x00\r
+\r
+#flags for display/cursor shift\r
+LCD_DISPLAYMOVE = 0x08\r
+LCD_CURSORMOVE = 0x00\r
+LCD_MOVERIGHT = 0x04\r
+LCD_MOVELEFT = 0x00\r
+\r
+#flags for function set\r
+LCD_8BITMODE = 0x10\r
+LCD_4BITMODE = 0x00\r
+LCD_2LINE = 0x08\r
+LCD_1LINE = 0x00\r
+LCD_5x8DOTS = 0x00\r
+\r
+\r
+class RGB1602:\r
+ def __init__(self, col, row):\r
+ self._row = row\r
+ self._col = col\r
+\r
+ self._showfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;\r
+ self.begin(self._row,self._col)\r
+\r
+ \r
+ def command(self,cmd):\r
+ RGB1602_I2C.writeto_mem(LCD_ADDRESS, 0x80, chr(cmd))\r
+\r
+ def write(self,data):\r
+ RGB1602_I2C.writeto_mem(LCD_ADDRESS, 0x40, chr(data))\r
+ \r
+ def setReg(self,reg,data):\r
+ RGB1602_I2C.writeto_mem(RGB_ADDRESS, reg, chr(data))\r
+\r
+\r
+ def setRGB(self,r,g,b):\r
+ self.setReg(REG_RED,r)\r
+ self.setReg(REG_GREEN,g)\r
+ self.setReg(REG_BLUE,b)\r
+\r
+ def setCursor(self,col,row):\r
+ if(row == 0):\r
+ col|=0x80\r
+ else:\r
+ col|=0xc0;\r
+ RGB1602_I2C.writeto(LCD_ADDRESS, bytearray([0x80,col]))\r
+\r
+ def clear(self):\r
+ self.command(LCD_CLEARDISPLAY)\r
+ time.sleep(0.002)\r
+ def printout(self,arg):\r
+ if(isinstance(arg,int)):\r
+ arg=str(arg)\r
+\r
+ for x in bytearray(arg,'utf-8'):\r
+ self.write(x)\r
+\r
+\r
+ def display(self):\r
+ self._showcontrol |= LCD_DISPLAYON \r
+ self.command(LCD_DISPLAYCONTROL | self._showcontrol)\r
+\r
+ \r
+ def begin(self,cols,lines):\r
+ if (lines > 1):\r
+ self._showfunction |= LCD_2LINE \r
+ \r
+ self._numlines = lines \r
+ self._currline = 0 \r
+\r
+ \r
+ \r
+ time.sleep(0.05)\r
+\r
+\r
+ # Send function set command sequence\r
+ self.command(LCD_FUNCTIONSET | self._showfunction)\r
+ #delayMicroseconds(4500); # wait more than 4.1ms\r
+ time.sleep(0.005)\r
+ # second try\r
+ self.command(LCD_FUNCTIONSET | self._showfunction);\r
+ #delayMicroseconds(150);\r
+ time.sleep(0.005)\r
+ # third go\r
+ self.command(LCD_FUNCTIONSET | self._showfunction)\r
+ # finally, set # lines, font size, etc.\r
+ self.command(LCD_FUNCTIONSET | self._showfunction)\r
+ # turn the display on with no cursor or blinking default\r
+ self._showcontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF \r
+ self.display()\r
+ # clear it off\r
+ self.clear()\r
+ # Initialize to default text direction (for romance languages)\r
+ self._showmode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT \r
+ # set the entry mode\r
+ self.command(LCD_ENTRYMODESET | self._showmode);\r
+ # backlight init\r
+ self.setReg(REG_MODE1, 0)\r
+ # set LEDs controllable by both PWM and GRPPWM registers\r
+ self.setReg(REG_OUTPUT, 0xFF)\r
+ # set MODE2 values\r
+ # 0010 0000 -> 0x20 (DMBLNK to 1, ie blinky mode)\r
+ self.setReg(REG_MODE2, 0x20)\r
+ self.setColorWhite()\r
+\r
+ def setColorWhite(self):\r
+ self.setRGB(255, 255, 255)\r