EPD_2in9_V2.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. /*****************************************************************************
  2. * | File : EPD_2in9_V2.c
  3. * | Author : Waveshare team
  4. * | Function : 2.9inch e-paper V2
  5. * | Info :
  6. *----------------
  7. * | This version: V1.2
  8. * | Date : 2023-12-21
  9. * | Info :
  10. * -----------------------------------------------------------------------------
  11. #
  12. # Permission is hereby granted, free of charge, to any person obtaining a copy
  13. # of this software and associated documnetation files (the "Software"), to deal
  14. # in the Software without restriction, including without limitation the rights
  15. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  16. # copies of the Software, and to permit persons to whom the Software is
  17. # furished to do so, subject to the following conditions:
  18. #
  19. # The above copyright notice and this permission notice shall be included in
  20. # all copies or substantial portions of the Software.
  21. #
  22. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  23. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  24. # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  25. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  26. # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  27. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  28. # THE SOFTWARE.
  29. #
  30. ******************************************************************************/
  31. #include "EPD_2in9_V2.h"
  32. #include "Debug.h"
  33. UBYTE _WF_PARTIAL_2IN9[159] =
  34. {
  35. 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  36. 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  37. 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  38. 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  39. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  40. 0x0A,0x0,0x0,0x0,0x0,0x0,0x2,
  41. 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
  42. 0x1,0x0,0x0,0x0,0x0,0x0,0x0,
  43. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  44. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  45. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  46. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  47. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  48. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  49. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  50. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  51. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  52. 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
  53. 0x22,0x17,0x41,0xB0,0x32,0x36,
  54. };
  55. UBYTE WS_20_30[159] =
  56. {
  57. 0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
  58. 0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
  59. 0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
  60. 0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
  61. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  62. 0x14, 0x8, 0x0, 0x0, 0x0, 0x0, 0x1,
  63. 0xA, 0xA, 0x0, 0xA, 0xA, 0x0, 0x1,
  64. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  65. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  66. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  67. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  68. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  69. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  70. 0x14, 0x8, 0x0, 0x1, 0x0, 0x0, 0x1,
  71. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
  72. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  73. 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  74. 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0,
  75. 0x22, 0x17, 0x41, 0x0, 0x32, 0x36
  76. };
  77. unsigned char Gray4[159] =
  78. {
  79. 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L0 //2.28s
  80. 0x20, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L1
  81. 0x28, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L2
  82. 0x2A, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L3
  83. 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L4
  84. 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group0
  85. 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, //TP, SR, RP of Group1
  86. 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group2
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group3
  88. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group4
  89. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group5
  90. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group6
  91. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group7
  92. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group8
  93. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group9
  94. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group10
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group11
  96. 0x24, 0x22, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, //FR, XON
  97. 0x22, 0x17, 0x41, 0xAE, 0x32, 0x28, //EOPT VGH VSH1 VSH2 VSL VCOM
  98. };
  99. unsigned char WF_FULL[159] =
  100. {
  101. 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L0 1.00S
  102. 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L1
  103. 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L2
  104. 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L3
  105. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L4
  106. 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group0
  107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group1
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group2
  109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group3
  110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group4
  111. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group5
  112. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group6
  113. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group7
  114. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group8
  115. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group9
  116. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group10
  117. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group11
  118. 0x24, 0x42, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, //FR, XON
  119. 0x22, 0x17, 0x41, 0xAE, 0x32, 0x38, //EOPT VGH VSH1 VSH2 VSL VCOM
  120. };
  121. /******************************************************************************
  122. function : Software reset
  123. parameter:
  124. ******************************************************************************/
  125. static void EPD_2IN9_V2_Reset(void)
  126. {
  127. DEV_Digital_Write(EPD_RST_PIN, 1);
  128. DEV_Delay_ms(10);
  129. DEV_Digital_Write(EPD_RST_PIN, 0);
  130. DEV_Delay_ms(2);
  131. DEV_Digital_Write(EPD_RST_PIN, 1);
  132. DEV_Delay_ms(10);
  133. }
  134. /******************************************************************************
  135. function : send command
  136. parameter:
  137. Reg : Command register
  138. ******************************************************************************/
  139. static void EPD_2IN9_V2_SendCommand(UBYTE Reg)
  140. {
  141. DEV_Digital_Write(EPD_DC_PIN, 0);
  142. DEV_Digital_Write(EPD_CS_PIN, 0);
  143. DEV_SPI_WriteByte(Reg);
  144. DEV_Digital_Write(EPD_CS_PIN, 1);
  145. }
  146. /******************************************************************************
  147. function : send data
  148. parameter:
  149. Data : Write data
  150. ******************************************************************************/
  151. static void EPD_2IN9_V2_SendData(UBYTE Data)
  152. {
  153. DEV_Digital_Write(EPD_DC_PIN, 1);
  154. DEV_Digital_Write(EPD_CS_PIN, 0);
  155. DEV_SPI_WriteByte(Data);
  156. DEV_Digital_Write(EPD_CS_PIN, 1);
  157. }
  158. /******************************************************************************
  159. function : Wait until the busy_pin goes LOW
  160. parameter:
  161. ******************************************************************************/
  162. void EPD_2IN9_V2_ReadBusy(void)
  163. {
  164. Debug("e-Paper busy\r\n");
  165. while(1)
  166. { //=1 BUSY
  167. if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
  168. break;
  169. DEV_Delay_ms(50);
  170. }
  171. DEV_Delay_ms(50);
  172. Debug("e-Paper busy release\r\n");
  173. }
  174. static void EPD_2IN9_V2_LUT(UBYTE *lut)
  175. {
  176. UBYTE count;
  177. EPD_2IN9_V2_SendCommand(0x32);
  178. for(count=0; count<153; count++)
  179. EPD_2IN9_V2_SendData(lut[count]);
  180. EPD_2IN9_V2_ReadBusy();
  181. }
  182. static void EPD_2IN9_V2_LUT_by_host(UBYTE *lut)
  183. {
  184. EPD_2IN9_V2_LUT((UBYTE *)lut); //lut
  185. EPD_2IN9_V2_SendCommand(0x3f);
  186. EPD_2IN9_V2_SendData(*(lut+153));
  187. EPD_2IN9_V2_SendCommand(0x03); // gate voltage
  188. EPD_2IN9_V2_SendData(*(lut+154));
  189. EPD_2IN9_V2_SendCommand(0x04); // source voltage
  190. EPD_2IN9_V2_SendData(*(lut+155)); // VSH
  191. EPD_2IN9_V2_SendData(*(lut+156)); // VSH2
  192. EPD_2IN9_V2_SendData(*(lut+157)); // VSL
  193. EPD_2IN9_V2_SendCommand(0x2c); // VCOM
  194. EPD_2IN9_V2_SendData(*(lut+158));
  195. }
  196. /******************************************************************************
  197. function : Turn On Display
  198. parameter:
  199. ******************************************************************************/
  200. static void EPD_2IN9_V2_TurnOnDisplay(void)
  201. {
  202. EPD_2IN9_V2_SendCommand(0x22); //Display Update Control
  203. EPD_2IN9_V2_SendData(0xC7);
  204. EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence
  205. EPD_2IN9_V2_ReadBusy();
  206. }
  207. static void EPD_2IN9_V2_TurnOnDisplay_Partial(void)
  208. {
  209. EPD_2IN9_V2_SendCommand(0x22); //Display Update Control
  210. EPD_2IN9_V2_SendData(0x0F);
  211. EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence
  212. EPD_2IN9_V2_ReadBusy();
  213. }
  214. /******************************************************************************
  215. function : Setting the display window
  216. parameter:
  217. ******************************************************************************/
  218. static void EPD_2IN9_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
  219. {
  220. EPD_2IN9_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
  221. EPD_2IN9_V2_SendData((Xstart>>3) & 0xFF);
  222. EPD_2IN9_V2_SendData((Xend>>3) & 0xFF);
  223. EPD_2IN9_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
  224. EPD_2IN9_V2_SendData(Ystart & 0xFF);
  225. EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF);
  226. EPD_2IN9_V2_SendData(Yend & 0xFF);
  227. EPD_2IN9_V2_SendData((Yend >> 8) & 0xFF);
  228. }
  229. /******************************************************************************
  230. function : Set Cursor
  231. parameter:
  232. ******************************************************************************/
  233. static void EPD_2IN9_V2_SetCursor(UWORD Xstart, UWORD Ystart)
  234. {
  235. EPD_2IN9_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
  236. EPD_2IN9_V2_SendData(Xstart & 0xFF);
  237. EPD_2IN9_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
  238. EPD_2IN9_V2_SendData(Ystart & 0xFF);
  239. EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF);
  240. }
  241. /******************************************************************************
  242. function : Initialize the e-Paper register
  243. parameter:
  244. ******************************************************************************/
  245. void EPD_2IN9_V2_Init(void)
  246. {
  247. EPD_2IN9_V2_Reset();
  248. DEV_Delay_ms(100);
  249. EPD_2IN9_V2_ReadBusy();
  250. EPD_2IN9_V2_SendCommand(0x12); // soft reset
  251. EPD_2IN9_V2_ReadBusy();
  252. EPD_2IN9_V2_SendCommand(0x01); //Driver output control
  253. EPD_2IN9_V2_SendData(0x27);
  254. EPD_2IN9_V2_SendData(0x01);
  255. EPD_2IN9_V2_SendData(0x00);
  256. EPD_2IN9_V2_SendCommand(0x11); //data entry mode
  257. EPD_2IN9_V2_SendData(0x03);
  258. EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
  259. EPD_2IN9_V2_SendCommand(0x21); // Display update control
  260. EPD_2IN9_V2_SendData(0x00);
  261. EPD_2IN9_V2_SendData(0x80);
  262. EPD_2IN9_V2_SetCursor(0, 0);
  263. EPD_2IN9_V2_ReadBusy();
  264. EPD_2IN9_V2_LUT_by_host(WS_20_30);
  265. }
  266. void EPD_2IN9_V2_Init_Fast(void)
  267. {
  268. EPD_2IN9_V2_Reset();
  269. DEV_Delay_ms(100);
  270. EPD_2IN9_V2_ReadBusy();
  271. EPD_2IN9_V2_SendCommand(0x12); // soft reset
  272. EPD_2IN9_V2_ReadBusy();
  273. EPD_2IN9_V2_SendCommand(0x01); //Driver output control
  274. EPD_2IN9_V2_SendData(0x27);
  275. EPD_2IN9_V2_SendData(0x01);
  276. EPD_2IN9_V2_SendData(0x00);
  277. EPD_2IN9_V2_SendCommand(0x11); //data entry mode
  278. EPD_2IN9_V2_SendData(0x03);
  279. EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
  280. EPD_2IN9_V2_SendCommand(0x3C);
  281. EPD_2IN9_V2_SendData(0x05);
  282. EPD_2IN9_V2_SendCommand(0x21); // Display update control
  283. EPD_2IN9_V2_SendData(0x00);
  284. EPD_2IN9_V2_SendData(0x80);
  285. EPD_2IN9_V2_SetCursor(0, 0);
  286. EPD_2IN9_V2_ReadBusy();
  287. EPD_2IN9_V2_LUT_by_host(WF_FULL);
  288. }
  289. void EPD_2IN9_V2_Gray4_Init(void)
  290. {
  291. EPD_2IN9_V2_Reset();
  292. DEV_Delay_ms(100);
  293. EPD_2IN9_V2_ReadBusy();
  294. EPD_2IN9_V2_SendCommand(0x12); // soft reset
  295. EPD_2IN9_V2_ReadBusy();
  296. EPD_2IN9_V2_SendCommand(0x74); //set analog block control
  297. EPD_2IN9_V2_SendData(0x54);
  298. EPD_2IN9_V2_SendCommand(0x7E); //set digital block control
  299. EPD_2IN9_V2_SendData(0x3B);
  300. EPD_2IN9_V2_SendCommand(0x01); //Driver output control
  301. EPD_2IN9_V2_SendData(0x27);
  302. EPD_2IN9_V2_SendData(0x01);
  303. EPD_2IN9_V2_SendData(0x00);
  304. EPD_2IN9_V2_SendCommand(0x11); //data entry mode
  305. EPD_2IN9_V2_SendData(0x03);
  306. EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
  307. EPD_2IN9_V2_SendCommand(0x3C);
  308. EPD_2IN9_V2_SendData(0x00);
  309. EPD_2IN9_V2_SendCommand(0x21); // Display update control
  310. EPD_2IN9_V2_SendData(0x00);
  311. EPD_2IN9_V2_SendData(0x80);
  312. EPD_2IN9_V2_SetCursor(0, 0);
  313. EPD_2IN9_V2_ReadBusy();
  314. EPD_2IN9_V2_LUT_by_host(Gray4);
  315. }
  316. /******************************************************************************
  317. function : Clear screen
  318. parameter:
  319. ******************************************************************************/
  320. void EPD_2IN9_V2_Clear(void)
  321. {
  322. UWORD i;
  323. EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1)
  324. for(i=0;i<4736;i++)
  325. {
  326. EPD_2IN9_V2_SendData(0xff);
  327. }
  328. EPD_2IN9_V2_SendCommand(0x26); //write RAM for black(0)/white (1)
  329. for(i=0;i<4736;i++)
  330. {
  331. EPD_2IN9_V2_SendData(0xff);
  332. }
  333. EPD_2IN9_V2_TurnOnDisplay();
  334. }
  335. /******************************************************************************
  336. function : Sends the image buffer in RAM to e-Paper and displays
  337. parameter:
  338. ******************************************************************************/
  339. void EPD_2IN9_V2_Display(UBYTE *Image)
  340. {
  341. UWORD i;
  342. EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1)
  343. for(i=0;i<4736;i++)
  344. {
  345. EPD_2IN9_V2_SendData(Image[i]);
  346. }
  347. EPD_2IN9_V2_TurnOnDisplay();
  348. }
  349. void EPD_2IN9_V2_Display_Base(UBYTE *Image)
  350. {
  351. UWORD i;
  352. EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM
  353. for(i=0;i<4736;i++)
  354. {
  355. EPD_2IN9_V2_SendData(Image[i]);
  356. }
  357. EPD_2IN9_V2_SendCommand(0x26); //Write Black and White image to RAM
  358. for(i=0;i<4736;i++)
  359. {
  360. EPD_2IN9_V2_SendData(Image[i]);
  361. }
  362. EPD_2IN9_V2_TurnOnDisplay();
  363. }
  364. void EPD_2IN9_V2_4GrayDisplay(UBYTE *Image)
  365. {
  366. UDOUBLE i,j,k;
  367. UBYTE temp1,temp2,temp3;
  368. // old data
  369. EPD_2IN9_V2_SendCommand(0x24);
  370. for(i=0; i<4736; i++) {
  371. temp3=0;
  372. for(j=0; j<2; j++) {
  373. temp1 = Image[i*2+j];
  374. for(k=0; k<2; k++) {
  375. temp2 = temp1&0xC0;
  376. if(temp2 == 0xC0)
  377. temp3 |= 0x00;
  378. else if(temp2 == 0x00)
  379. temp3 |= 0x01;
  380. else if(temp2 == 0x80)
  381. temp3 |= 0x01;
  382. else //0x40
  383. temp3 |= 0x00;
  384. temp3 <<= 1;
  385. temp1 <<= 2;
  386. temp2 = temp1&0xC0 ;
  387. if(temp2 == 0xC0)
  388. temp3 |= 0x00;
  389. else if(temp2 == 0x00)
  390. temp3 |= 0x01;
  391. else if(temp2 == 0x80)
  392. temp3 |= 0x01;
  393. else //0x40
  394. temp3 |= 0x00;
  395. if(j!=1 || k!=1)
  396. temp3 <<= 1;
  397. temp1 <<= 2;
  398. }
  399. }
  400. EPD_2IN9_V2_SendData(temp3);
  401. // printf("%x ",temp3);
  402. }
  403. EPD_2IN9_V2_SendCommand(0x26); //write RAM for black(0)/white (1)
  404. for(i=0; i<4736; i++) {
  405. temp3=0;
  406. for(j=0; j<2; j++) {
  407. temp1 = Image[i*2+j];
  408. for(k=0; k<2; k++) {
  409. temp2 = temp1&0xC0 ;
  410. if(temp2 == 0xC0)
  411. temp3 |= 0x00;//white
  412. else if(temp2 == 0x00)
  413. temp3 |= 0x01; //black
  414. else if(temp2 == 0x80)
  415. temp3 |= 0x00; //gray1
  416. else //0x40
  417. temp3 |= 0x01; //gray2
  418. temp3 <<= 1;
  419. temp1 <<= 2;
  420. temp2 = temp1&0xC0 ;
  421. if(temp2 == 0xC0) //white
  422. temp3 |= 0x00;
  423. else if(temp2 == 0x00) //black
  424. temp3 |= 0x01;
  425. else if(temp2 == 0x80)
  426. temp3 |= 0x00; //gray1
  427. else //0x40
  428. temp3 |= 0x01; //gray2
  429. if(j!=1 || k!=1)
  430. temp3 <<= 1;
  431. temp1 <<= 2;
  432. }
  433. }
  434. EPD_2IN9_V2_SendData(temp3);
  435. // printf("%x ",temp3);
  436. }
  437. EPD_2IN9_V2_TurnOnDisplay();
  438. }
  439. void EPD_2IN9_V2_Display_Partial(UBYTE *Image)
  440. {
  441. UWORD i;
  442. //Reset
  443. DEV_Digital_Write(EPD_RST_PIN, 0);
  444. DEV_Delay_ms(1);
  445. DEV_Digital_Write(EPD_RST_PIN, 1);
  446. DEV_Delay_ms(2);
  447. EPD_2IN9_V2_LUT(_WF_PARTIAL_2IN9);
  448. EPD_2IN9_V2_SendCommand(0x37);
  449. EPD_2IN9_V2_SendData(0x00);
  450. EPD_2IN9_V2_SendData(0x00);
  451. EPD_2IN9_V2_SendData(0x00);
  452. EPD_2IN9_V2_SendData(0x00);
  453. EPD_2IN9_V2_SendData(0x00);
  454. EPD_2IN9_V2_SendData(0x40);
  455. EPD_2IN9_V2_SendData(0x00);
  456. EPD_2IN9_V2_SendData(0x00);
  457. EPD_2IN9_V2_SendData(0x00);
  458. EPD_2IN9_V2_SendData(0x00);
  459. EPD_2IN9_V2_SendCommand(0x3C); //BorderWavefrom
  460. EPD_2IN9_V2_SendData(0x80);
  461. EPD_2IN9_V2_SendCommand(0x22);
  462. EPD_2IN9_V2_SendData(0xC0);
  463. EPD_2IN9_V2_SendCommand(0x20);
  464. EPD_2IN9_V2_ReadBusy();
  465. EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
  466. EPD_2IN9_V2_SetCursor(0, 0);
  467. EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM
  468. for(i=0;i<4736;i++)
  469. {
  470. EPD_2IN9_V2_SendData(Image[i]);
  471. }
  472. EPD_2IN9_V2_TurnOnDisplay_Partial();
  473. }
  474. /******************************************************************************
  475. function : Enter sleep mode
  476. parameter:
  477. ******************************************************************************/
  478. void EPD_2IN9_V2_Sleep(void)
  479. {
  480. EPD_2IN9_V2_SendCommand(0x10); //enter deep sleep
  481. EPD_2IN9_V2_SendData(0x01);
  482. DEV_Delay_ms(100);
  483. }