epd4in2.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. # *****************************************************************************
  2. # * | File : epd4in2.py
  3. # * | Author : Waveshare team
  4. # * | Function : Electronic paper driver
  5. # * | Info :
  6. # *----------------
  7. # * | This version: V4.0
  8. # * | Date : 2019-06-20
  9. # # | Info : python demo
  10. # -----------------------------------------------------------------------------
  11. # Permission is hereby granted, free of charge, to any person obtaining a copy
  12. # of this software and associated documnetation files (the "Software"), to deal
  13. # in the Software without restriction, including without limitation the rights
  14. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  15. # copies of the Software, and to permit persons to whom the Software is
  16. # furished to do so, subject to the following conditions:
  17. #
  18. # The above copyright notice and this permission notice shall be included in
  19. # all copies or substantial portions of the Software.
  20. #
  21. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  22. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23. # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  24. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  25. # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  26. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  27. # THE SOFTWARE.
  28. #
  29. import logging
  30. from . import epdconfig
  31. from PIL import Image
  32. import RPi.GPIO as GPIO
  33. # Display resolution
  34. EPD_WIDTH = 400
  35. EPD_HEIGHT = 300
  36. GRAY1 = 0xff #white
  37. GRAY2 = 0xC0
  38. GRAY3 = 0x80 #gray
  39. GRAY4 = 0x00 #Blackest
  40. class EPD:
  41. def __init__(self):
  42. self.reset_pin = epdconfig.RST_PIN
  43. self.dc_pin = epdconfig.DC_PIN
  44. self.busy_pin = epdconfig.BUSY_PIN
  45. self.cs_pin = epdconfig.CS_PIN
  46. self.width = EPD_WIDTH
  47. self.height = EPD_HEIGHT
  48. self.GRAY1 = GRAY1 #white
  49. self.GRAY2 = GRAY2
  50. self.GRAY3 = GRAY3 #gray
  51. self.GRAY4 = GRAY4 #Blackest
  52. lut_vcom0 = [
  53. 0x00, 0x17, 0x00, 0x00, 0x00, 0x02,
  54. 0x00, 0x17, 0x17, 0x00, 0x00, 0x02,
  55. 0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,
  56. 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  57. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  58. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60. ]
  61. lut_ww = [
  62. 0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
  63. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  64. 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
  65. 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  66. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  67. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  68. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69. ]
  70. lut_bw = [
  71. 0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
  72. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  73. 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
  74. 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  75. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  76. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78. ]
  79. lut_wb = [
  80. 0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
  81. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  82. 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
  83. 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  84. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  85. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87. ]
  88. lut_bb = [
  89. 0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
  90. 0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
  91. 0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
  92. 0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
  93. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96. ]
  97. #******************************partial screen update LUT*********************************/
  98. EPD_4IN2_Partial_lut_vcom1 =[
  99. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  100. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  101. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  102. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  103. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  104. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  105. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  106. 0x00 ,0x00, ]
  107. EPD_4IN2_Partial_lut_ww1 =[
  108. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  109. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  110. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  111. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  112. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  113. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  114. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,]
  115. EPD_4IN2_Partial_lut_bw1 =[
  116. 0x80 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  117. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  118. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  119. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  120. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  121. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  122. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  123. EPD_4IN2_Partial_lut_wb1 =[
  124. 0x40 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  125. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  126. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  127. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  128. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  129. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  130. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  131. EPD_4IN2_Partial_lut_bb1 =[
  132. 0x00 ,0x19 ,0x01 ,0x00 ,0x00 ,0x01,
  133. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  134. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  135. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  136. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  137. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  138. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00, ]
  139. #******************************gray*********************************/
  140. #0~3 gray
  141. EPD_4IN2_4Gray_lut_vcom =[
  142. 0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  143. 0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  144. 0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
  145. 0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
  146. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  147. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  148. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
  149. ]
  150. #R21
  151. EPD_4IN2_4Gray_lut_ww =[
  152. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  153. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  154. 0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  155. 0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  156. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  157. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  158. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  159. ]
  160. #R22H r
  161. EPD_4IN2_4Gray_lut_bw =[
  162. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  163. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  164. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  165. 0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
  166. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  167. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  168. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  169. ]
  170. #R23H w
  171. EPD_4IN2_4Gray_lut_wb =[
  172. 0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  173. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  174. 0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  175. 0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
  176. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  177. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  178. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  179. ]
  180. #R24H b
  181. EPD_4IN2_4Gray_lut_bb =[
  182. 0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
  183. 0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
  184. 0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
  185. 0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
  186. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  187. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  188. 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
  189. ]
  190. # Hardware reset
  191. def reset(self):
  192. epdconfig.digital_write(self.reset_pin, 1)
  193. epdconfig.delay_ms(200)
  194. epdconfig.digital_write(self.reset_pin, 0)
  195. epdconfig.delay_ms(5)
  196. epdconfig.digital_write(self.reset_pin, 1)
  197. epdconfig.delay_ms(200)
  198. def send_command(self, command):
  199. epdconfig.digital_write(self.dc_pin, 0)
  200. epdconfig.digital_write(self.cs_pin, 0)
  201. epdconfig.spi_writebyte([command])
  202. epdconfig.digital_write(self.cs_pin, 1)
  203. def send_data(self, data):
  204. epdconfig.digital_write(self.dc_pin, 1)
  205. epdconfig.digital_write(self.cs_pin, 0)
  206. epdconfig.spi_writebyte([data])
  207. epdconfig.digital_write(self.cs_pin, 1)
  208. def ReadBusy(self):
  209. self.send_command(0x71)
  210. while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
  211. self.send_command(0x71)
  212. epdconfig.delay_ms(100)
  213. def set_lut(self):
  214. self.send_command(0x20) # vcom
  215. for count in range(0, 44):
  216. self.send_data(self.lut_vcom0[count])
  217. self.send_command(0x21) # ww --
  218. for count in range(0, 42):
  219. self.send_data(self.lut_ww[count])
  220. self.send_command(0x22) # bw r
  221. for count in range(0, 42):
  222. self.send_data(self.lut_bw[count])
  223. self.send_command(0x23) # wb w
  224. for count in range(0, 42):
  225. self.send_data(self.lut_bb[count])
  226. self.send_command(0x24) # bb b
  227. for count in range(0, 42):
  228. self.send_data(self.lut_wb[count])
  229. def Partial_SetLut(self):
  230. self.send_command(0x20);
  231. for count in range(0, 44):
  232. self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
  233. self.send_command(0x21);
  234. for count in range(0, 42):
  235. self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
  236. self.send_command(0x22);
  237. for count in range(0, 42):
  238. self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
  239. self.send_command(0x23);
  240. for count in range(0, 42):
  241. self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
  242. self.send_command(0x24);
  243. for count in range(0, 42):
  244. self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
  245. def Gray_SetLut(self):
  246. self.send_command(0x20) #vcom
  247. for count in range(0, 42):
  248. self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count])
  249. self.send_command(0x21) #red not use
  250. for count in range(0, 42):
  251. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  252. self.send_command(0x22) #bw r
  253. for count in range(0, 42):
  254. self.send_data(self.EPD_4IN2_4Gray_lut_bw[count])
  255. self.send_command(0x23) #wb w
  256. for count in range(0, 42):
  257. self.send_data(self.EPD_4IN2_4Gray_lut_wb[count])
  258. self.send_command(0x24) #bb b
  259. for count in range(0, 42):
  260. self.send_data(self.EPD_4IN2_4Gray_lut_bb[count])
  261. self.send_command(0x25) #vcom
  262. for count in range(0, 42):
  263. self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
  264. def init(self):
  265. if (epdconfig.module_init() != 0):
  266. return -1
  267. # EPD hardware init start
  268. self.reset()
  269. self.send_command(0x01) # POWER SETTING
  270. self.send_data(0x03) # VDS_EN, VDG_EN
  271. self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
  272. self.send_data(0x2b) # VDH
  273. self.send_data(0x2b) # VDL
  274. self.send_command(0x06) # boost soft start
  275. self.send_data(0x17)
  276. self.send_data(0x17)
  277. self.send_data(0x17)
  278. self.send_command(0x04) # POWER_ON
  279. self.ReadBusy()
  280. self.send_command(0x00) # panel setting
  281. self.send_data(0xbf) # KW-BF KWR-AF BWROTP 0f
  282. self.send_data(0x0d)
  283. self.send_command(0x30) # PLL setting
  284. self.send_data(0x3c) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
  285. self.send_command(0x61) # resolution setting
  286. self.send_data(0x01)
  287. self.send_data(0x90) # 128
  288. self.send_data(0x01)
  289. self.send_data(0x2c)
  290. self.send_command(0x82) # vcom_DC setting
  291. self.send_data(0x28)
  292. self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
  293. self.send_data(0x97) # 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
  294. self.set_lut()
  295. # EPD hardware init end
  296. return 0
  297. def Init_4Gray(self):
  298. if (epdconfig.module_init() != 0):
  299. return -1
  300. # EPD hardware init start
  301. self.reset()
  302. self.send_command(0x01) #POWER SETTING
  303. self.send_data (0x03)
  304. self.send_data (0x00) #VGH=20V,VGL=-20V
  305. self.send_data (0x2b) #VDH=15V
  306. self.send_data (0x2b) #VDL=-15V
  307. self.send_data (0x13)
  308. self.send_command(0x06) #booster soft start
  309. self.send_data (0x17) #A
  310. self.send_data (0x17) #B
  311. self.send_data (0x17) #C
  312. self.send_command(0x04)
  313. self.ReadBusy()
  314. self.send_command(0x00) #panel setting
  315. self.send_data(0x3f) #KW-3f KWR-2F BWROTP 0f BWOTP 1f
  316. self.send_command(0x30) #PLL setting
  317. self.send_data (0x3c) #100hz
  318. self.send_command(0x61) #resolution setting
  319. self.send_data (0x01) #400
  320. self.send_data (0x90)
  321. self.send_data (0x01) #300
  322. self.send_data (0x2c)
  323. self.send_command(0x82) #vcom_DC setting
  324. self.send_data (0x12)
  325. self.send_command(0X50) #VCOM AND DATA INTERVAL SETTING
  326. self.send_data(0x97)
  327. def getbuffer(self, image):
  328. # logging.debug("bufsiz = ",int(self.width/8) * self.height)
  329. buf = [0xFF] * (int(self.width/8) * self.height)
  330. image_monocolor = image.convert('1')
  331. imwidth, imheight = image_monocolor.size
  332. pixels = image_monocolor.load()
  333. # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  334. if(imwidth == self.width and imheight == self.height):
  335. logging.debug("Horizontal")
  336. for y in range(imheight):
  337. for x in range(imwidth):
  338. # Set the bits for the column of pixels at the current position.
  339. if pixels[x, y] == 0:
  340. buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
  341. elif(imwidth == self.height and imheight == self.width):
  342. logging.debug("Vertical")
  343. for y in range(imheight):
  344. for x in range(imwidth):
  345. newx = y
  346. newy = self.height - x - 1
  347. if pixels[x, y] == 0:
  348. buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8))
  349. return buf
  350. def getbuffer_4Gray(self, image):
  351. # logging.debug("bufsiz = ",int(self.width/8) * self.height)
  352. buf = [0xFF] * (int(self.width / 4) * self.height)
  353. image_monocolor = image.convert('L')
  354. imwidth, imheight = image_monocolor.size
  355. pixels = image_monocolor.load()
  356. i=0
  357. # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight)
  358. if(imwidth == self.width and imheight == self.height):
  359. logging.debug("Vertical")
  360. for y in range(imheight):
  361. for x in range(imwidth):
  362. # Set the bits for the column of pixels at the current position.
  363. if(pixels[x, y] == 0xC0):
  364. pixels[x, y] = 0x80
  365. elif (pixels[x, y] == 0x80):
  366. pixels[x, y] = 0x40
  367. i= i+1
  368. if(i%4 == 0):
  369. buf[int((x + (y * self.width))/4)] = ((pixels[x-3, y]&0xc0) | (pixels[x-2, y]&0xc0)>>2 | (pixels[x-1, y]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6)
  370. elif(imwidth == self.height and imheight == self.width):
  371. logging.debug("Horizontal")
  372. for x in range(imwidth):
  373. for y in range(imheight):
  374. newx = y
  375. newy = x
  376. if(pixels[x, y] == 0xC0):
  377. pixels[x, y] = 0x80
  378. elif (pixels[x, y] == 0x80):
  379. pixels[x, y] = 0x40
  380. i= i+1
  381. if(i%4 == 0):
  382. buf[int((newx + (newy * self.width))/4)] = ((pixels[x, y-3]&0xc0) | (pixels[x, y-2]&0xc0)>>2 | (pixels[x, y-1]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6)
  383. return buf
  384. def display(self, image):
  385. self.send_command(0x92);
  386. self.set_lut();
  387. self.send_command(0x10)
  388. for i in range(0, int(self.width * self.height / 8)):
  389. self.send_data(0xFF)
  390. self.send_command(0x13)
  391. for i in range(0, int(self.width * self.height / 8)):
  392. self.send_data(image[i])
  393. self.send_command(0x12)
  394. self.ReadBusy()
  395. def EPD_4IN2_PartialDisplay(self, X_start, Y_start, X_end, Y_end, Image):
  396. # EPD_WIDTH = 400
  397. # EPD_HEIGHT = 300
  398. if(EPD_WIDTH % 8 != 0):
  399. Width = int(EPD_WIDTH / 8) + 1;
  400. else:
  401. Width = int(EPD_WIDTH / 8);
  402. Height = EPD_HEIGHT;
  403. if(X_start % 8 != 0):
  404. X_start = int(X_start/8)*8+8
  405. if(X_end % 8 != 0):
  406. X_end = int(X_end/8)*8+8
  407. self.Partial_SetLut();
  408. self.send_command(0x91); #This command makes the display enter partial mode
  409. self.send_command(0x90); #resolution setting
  410. self.send_data (int(X_start/256));
  411. self.send_data (int(X_start%256)); #x-start
  412. self.send_data (int(X_end /256));
  413. self.send_data (int(X_end %256)-1); #x-end
  414. self.send_data (int(Y_start/256));
  415. self.send_data (int(Y_start%256)); #y-start
  416. self.send_data (int(Y_end/256));
  417. self.send_data (int(Y_end%256)-1); #y-end
  418. self.send_data (0x28);
  419. self.send_command(0x10); #writes Old data to SRAM for programming
  420. for j in range(0, int(Y_end - Y_start)):
  421. for i in range(0, int(X_end/8) - int(X_start/8)):
  422. self.send_data(Image[(Y_start + j)*Width + int(X_start/8) + i]);
  423. self.send_command(0x13); #writes New data to SRAM.
  424. for j in range(0, int(Y_end - Y_start)):
  425. for i in range(0, int(X_end/8) - int(X_start/8)):
  426. self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]);
  427. self.send_command(0x12); #DISPLAY REFRESH
  428. epdconfig.delay_ms(200) #The delay here is necessary, 200uS at least!!!
  429. self.ReadBusy()
  430. def display_4Gray(self, image):
  431. self.send_command(0x92);
  432. self.set_lut();
  433. self.send_command(0x10)
  434. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): # EPD_WIDTH * EPD_HEIGHT / 4
  435. temp3=0
  436. for j in range(0, 2):
  437. temp1 = image[i*2+j]
  438. for k in range(0, 2):
  439. temp2 = temp1&0xC0
  440. if(temp2 == 0xC0):
  441. temp3 |= 0x01#white
  442. elif(temp2 == 0x00):
  443. temp3 |= 0x00 #black
  444. elif(temp2 == 0x80):
  445. temp3 |= 0x01 #gray1
  446. else: #0x40
  447. temp3 |= 0x00 #gray2
  448. temp3 <<= 1
  449. temp1 <<= 2
  450. temp2 = temp1&0xC0
  451. if(temp2 == 0xC0): #white
  452. temp3 |= 0x01
  453. elif(temp2 == 0x00): #black
  454. temp3 |= 0x00
  455. elif(temp2 == 0x80):
  456. temp3 |= 0x01 #gray1
  457. else : #0x40
  458. temp3 |= 0x00 #gray2
  459. if(j!=1 or k!=1):
  460. temp3 <<= 1
  461. temp1 <<= 2
  462. self.send_data(temp3)
  463. self.send_command(0x13)
  464. for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)): #5808*4 46464
  465. temp3=0
  466. for j in range(0, 2):
  467. temp1 = image[i*2+j]
  468. for k in range(0, 2):
  469. temp2 = temp1&0xC0
  470. if(temp2 == 0xC0):
  471. temp3 |= 0x01#white
  472. elif(temp2 == 0x00):
  473. temp3 |= 0x00 #black
  474. elif(temp2 == 0x80):
  475. temp3 |= 0x00 #gray1
  476. else: #0x40
  477. temp3 |= 0x01 #gray2
  478. temp3 <<= 1
  479. temp1 <<= 2
  480. temp2 = temp1&0xC0
  481. if(temp2 == 0xC0): #white
  482. temp3 |= 0x01
  483. elif(temp2 == 0x00): #black
  484. temp3 |= 0x00
  485. elif(temp2 == 0x80):
  486. temp3 |= 0x00 #gray1
  487. else: #0x40
  488. temp3 |= 0x01 #gray2
  489. if(j!=1 or k!=1):
  490. temp3 <<= 1
  491. temp1 <<= 2
  492. self.send_data(temp3)
  493. self.Gray_SetLut()
  494. self.send_command(0x12)
  495. epdconfig.delay_ms(200)
  496. self.ReadBusy()
  497. # pass
  498. def Clear(self):
  499. self.send_command(0x10)
  500. for i in range(0, int(self.width * self.height / 8)):
  501. self.send_data(0xFF)
  502. self.send_command(0x13)
  503. for i in range(0, int(self.width * self.height / 8)):
  504. self.send_data(0xFF)
  505. self.send_command(0x12)
  506. self.ReadBusy()
  507. def sleep(self):
  508. self.send_command(0x02) # POWER_OFF
  509. self.ReadBusy()
  510. self.send_command(0x07) # DEEP_SLEEP
  511. self.send_data(0XA5)
  512. epdconfig.delay_ms(2000)
  513. epdconfig.module_exit()
  514. ### END OF FILE ###