|
|
@@ -44,25 +44,47 @@ class EPD:
|
|
|
self.height = EPD_HEIGHT
|
|
|
|
|
|
WF_PARTIAL_2IN9 = [
|
|
|
- 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0A,0x0,0x0,0x0,0x0,0x0,0x2,
|
|
|
- 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
- 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
|
|
- 0x22,0x17,0x41,0xB0,0x32,0x36,
|
|
|
+ 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0A,0x0,0x0,0x0,0x0,0x0,0x2,
|
|
|
+ 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
|
|
+ 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
|
|
+ 0x22,0x17,0x41,0xB0,0x32,0x36,
|
|
|
+ ]
|
|
|
+
|
|
|
+ WS_20_30 = [
|
|
|
+ 0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
|
|
|
+ 0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
|
|
|
+ 0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
|
|
|
+ 0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x14, 0x8, 0x0, 0x0, 0x0, 0x0, 0x2,
|
|
|
+ 0xA, 0xA, 0x0, 0xA, 0xA, 0x0, 0x1,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x14, 0x8, 0x0, 0x1, 0x0, 0x0, 0x1,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
|
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0,
|
|
|
+ 0x22, 0x17, 0x41, 0x0, 0x32, 0x36
|
|
|
]
|
|
|
|
|
|
# Hardware reset
|
|
|
@@ -94,7 +116,7 @@ class EPD:
|
|
|
|
|
|
def TurnOnDisplay(self):
|
|
|
self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
|
|
|
- self.send_data(0xF7)
|
|
|
+ self.send_data(0xc7)
|
|
|
self.send_command(0x20) # MASTER_ACTIVATION
|
|
|
self.ReadBusy()
|
|
|
|
|
|
@@ -104,12 +126,25 @@ class EPD:
|
|
|
self.send_command(0x20) # MASTER_ACTIVATION
|
|
|
self.ReadBusy()
|
|
|
|
|
|
- def SendLut(self):
|
|
|
+ def lut(self, lut):
|
|
|
self.send_command(0x32)
|
|
|
for i in range(0, 153):
|
|
|
- self.send_data(self.WF_PARTIAL_2IN9[i])
|
|
|
+ self.send_data(lut[i])
|
|
|
self.ReadBusy()
|
|
|
|
|
|
+ def SetLut(self, lut):
|
|
|
+ self.lut(lut)
|
|
|
+ self.send_command(0x3f)
|
|
|
+ self.send_data(lut[153])
|
|
|
+ self.send_command(0x03); # gate voltage
|
|
|
+ self.send_data(lut[154])
|
|
|
+ self.send_command(0x04); # source voltage
|
|
|
+ self.send_data(lut[155]) # VSH
|
|
|
+ self.send_data(lut[156]) # VSH2
|
|
|
+ self.send_data(lut[157]) # VSL
|
|
|
+ self.send_command(0x2c); # VCOM
|
|
|
+ self.send_data(lut[158])
|
|
|
+
|
|
|
def SetWindow(self, x_start, y_start, x_end, y_end):
|
|
|
self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
|
|
|
# x point must be the multiple of 8 or the last 3 bits will be ignored
|
|
|
@@ -129,7 +164,6 @@ class EPD:
|
|
|
self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER
|
|
|
self.send_data(y & 0xFF)
|
|
|
self.send_data((y >> 8) & 0xFF)
|
|
|
- self.ReadBusy()
|
|
|
|
|
|
def init(self):
|
|
|
if (epdconfig.module_init() != 0):
|
|
|
@@ -137,26 +171,28 @@ class EPD:
|
|
|
# EPD hardware init start
|
|
|
self.reset()
|
|
|
|
|
|
- self.ReadBusy();
|
|
|
- self.send_command(0x12); #SWRESET
|
|
|
- self.ReadBusy();
|
|
|
+ self.ReadBusy()
|
|
|
+ self.send_command(0x12) #SWRESET
|
|
|
+ self.ReadBusy()
|
|
|
|
|
|
- self.send_command(0x01); #Driver output control
|
|
|
- self.send_data(0x27);
|
|
|
- self.send_data(0x01);
|
|
|
- self.send_data(0x00);
|
|
|
+ self.send_command(0x01) #Driver output control
|
|
|
+ self.send_data(0x27)
|
|
|
+ self.send_data(0x01)
|
|
|
+ self.send_data(0x00)
|
|
|
|
|
|
- self.send_command(0x11); #data entry mode
|
|
|
- self.send_data(0x03);
|
|
|
+ self.send_command(0x11) #data entry mode
|
|
|
+ self.send_data(0x03)
|
|
|
|
|
|
- self.SetWindow(0, 0, self.width-1, self.height-1);
|
|
|
+ self.SetWindow(0, 0, self.width-1, self.height-1)
|
|
|
|
|
|
- self.send_command(0x21); # Display update control
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x80);
|
|
|
+ self.send_command(0x21) # Display update control
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x80)
|
|
|
|
|
|
- self.SetCursor(0, 0);
|
|
|
- self.ReadBusy();
|
|
|
+ self.SetCursor(0, 0)
|
|
|
+ self.ReadBusy()
|
|
|
+
|
|
|
+ self.SetLut(self.WS_20_30)
|
|
|
# EPD hardware init end
|
|
|
return 0
|
|
|
|
|
|
@@ -218,26 +254,26 @@ class EPD:
|
|
|
epdconfig.digital_write(self.reset_pin, 1)
|
|
|
epdconfig.delay_ms(2)
|
|
|
|
|
|
- self.SendLut();
|
|
|
- self.send_command(0x37);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x40);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
- self.send_data(0x00);
|
|
|
+ self.SetLut(self.WF_PARTIAL_2IN9)
|
|
|
+ self.send_command(0x37)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x40)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
+ self.send_data(0x00)
|
|
|
|
|
|
- self.send_command(0x3C); #BorderWavefrom
|
|
|
- self.send_data(0x80);
|
|
|
+ self.send_command(0x3C) #BorderWavefrom
|
|
|
+ self.send_data(0x80)
|
|
|
|
|
|
- self.send_command(0x22);
|
|
|
- self.send_data(0xC0);
|
|
|
- self.send_command(0x20);
|
|
|
- self.ReadBusy();
|
|
|
+ self.send_command(0x22)
|
|
|
+ self.send_data(0xC0)
|
|
|
+ self.send_command(0x20)
|
|
|
+ self.ReadBusy()
|
|
|
|
|
|
self.SetWindow(0, 0, self.width - 1, self.height - 1)
|
|
|
self.SetCursor(0, 0)
|