2
0

EPD_10in85.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /*****************************************************************************
  2. * | File : EPD_10in85.c
  3. * | Author : Waveshare team
  4. * | Function : 10.85inch e-paper
  5. * | Info :
  6. *----------------
  7. * | This version: V1.0
  8. * | Date : 2024-08-19
  9. * | Info :
  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. ******************************************************************************/
  30. #include "EPD_10in85.h"
  31. #include "Debug.h"
  32. #include <time.h>
  33. unsigned char partFlag0=0;
  34. unsigned char partFlag1=0;
  35. unsigned char oldDatas[EPD_10in85_WIDTH*EPD_10in85_HEIGHT/8];
  36. /******************************************************************************
  37. function : Software reset
  38. parameter:
  39. ******************************************************************************/
  40. static void EPD_10in85_Reset(void)
  41. {
  42. DEV_Digital_Write(EPD_RST_PIN, 1);
  43. DEV_Delay_ms(20);
  44. DEV_Digital_Write(EPD_RST_PIN, 0);
  45. DEV_Delay_ms(10);
  46. DEV_Digital_Write(EPD_RST_PIN, 1);
  47. DEV_Delay_ms(20);
  48. }
  49. /******************************************************************************
  50. function : send command
  51. parameter:
  52. Reg : Command register
  53. ******************************************************************************/
  54. static void EPD_10in85_SendCommand_0(UBYTE Reg)
  55. {
  56. DEV_Digital_Write(EPD_DC_PIN, 0);
  57. DEV_Digital_Write(EPD_CS_M_PIN, 0);
  58. DEV_SPI_WriteByte(Reg);
  59. DEV_Digital_Write(EPD_CS_M_PIN, 1);
  60. }
  61. static void EPD_10in85_SendCommand_1(UBYTE Reg)
  62. {
  63. DEV_Digital_Write(EPD_DC_PIN, 0);
  64. DEV_Digital_Write(EPD_CS_S_PIN, 0);
  65. DEV_SPI_WriteByte(Reg);
  66. DEV_Digital_Write(EPD_CS_S_PIN, 1);
  67. }
  68. static void EPD_10in85_SendCommand_ALL(UBYTE Reg)
  69. {
  70. DEV_Digital_Write(EPD_DC_PIN, 0);
  71. DEV_Digital_Write(EPD_CS_M_PIN, 0);
  72. DEV_SPI_WriteByte(Reg);
  73. DEV_Digital_Write(EPD_CS_M_PIN, 1);
  74. DEV_Digital_Write(EPD_CS_S_PIN, 0);
  75. DEV_SPI_WriteByte(Reg);
  76. DEV_Digital_Write(EPD_CS_S_PIN, 1);
  77. }
  78. /******************************************************************************
  79. function : send data
  80. parameter:
  81. Data : Write data
  82. ******************************************************************************/
  83. static void EPD_10in85_SendData_0(UBYTE Data)
  84. {
  85. DEV_Digital_Write(EPD_DC_PIN, 1);
  86. DEV_Digital_Write(EPD_CS_M_PIN, 0);
  87. DEV_SPI_WriteByte(Data);
  88. DEV_Digital_Write(EPD_CS_M_PIN, 1);
  89. }
  90. static void EPD_10in85_SendData_1(UBYTE Data)
  91. {
  92. DEV_Digital_Write(EPD_DC_PIN, 1);
  93. DEV_Digital_Write(EPD_CS_S_PIN, 0);
  94. DEV_SPI_WriteByte(Data);
  95. DEV_Digital_Write(EPD_CS_S_PIN, 1);
  96. }
  97. static void EPD_10in85_SendnData_0(UBYTE *Data, UDOUBLE Len)
  98. {
  99. DEV_Digital_Write(EPD_DC_PIN, 1);
  100. DEV_Digital_Write(EPD_CS_M_PIN, 0);
  101. DEV_SPI_Write_nByte(Data, Len);
  102. DEV_Digital_Write(EPD_CS_M_PIN, 1);
  103. }
  104. static void EPD_10in85_SendnData_1(UBYTE *Data, UDOUBLE Len)
  105. {
  106. DEV_Digital_Write(EPD_DC_PIN, 1);
  107. DEV_Digital_Write(EPD_CS_S_PIN, 0);
  108. DEV_SPI_Write_nByte(Data, Len);
  109. DEV_Digital_Write(EPD_CS_S_PIN, 1);
  110. }
  111. static void EPD_10in85_SendData_ALL(UBYTE Data)
  112. {
  113. DEV_Digital_Write(EPD_DC_PIN, 1);
  114. DEV_Digital_Write(EPD_CS_M_PIN, 0);
  115. DEV_Digital_Write(EPD_CS_S_PIN, 0);
  116. DEV_SPI_WriteByte(Data);
  117. DEV_Digital_Write(EPD_CS_M_PIN, 1);
  118. DEV_Digital_Write(EPD_CS_S_PIN, 1);
  119. }
  120. /******************************************************************************
  121. function : Wait until the busy_pin goes LOW
  122. parameter:
  123. ******************************************************************************/
  124. void EPD_10in85_ReadBusy(void)
  125. {
  126. Debug("e-Paper busy\r\n");
  127. // DEV_Delay_ms(1000);
  128. while(1)
  129. { //=0 BUSY
  130. if(DEV_Digital_Read(EPD_BUSY_PIN)==1)
  131. break;
  132. DEV_Delay_ms(10);
  133. }
  134. DEV_Delay_ms(10);
  135. Debug("e-Paper busy release\r\n");
  136. }
  137. /******************************************************************************
  138. function : Turn On Display
  139. parameter:
  140. ******************************************************************************/
  141. static void EPD_10in85_TurnOnDisplay(void)
  142. {
  143. EPD_10in85_SendCommand_ALL(0x12);
  144. EPD_10in85_ReadBusy();
  145. }
  146. /******************************************************************************
  147. function : Initialize the e-Paper register
  148. parameter:
  149. ******************************************************************************/
  150. void EPD_10in85_Init(void)
  151. {
  152. EPD_10in85_Reset();
  153. EPD_10in85_SendCommand_ALL(0x4D);
  154. EPD_10in85_SendData_ALL(0x55);
  155. EPD_10in85_SendCommand_ALL(0xA6);
  156. EPD_10in85_SendData_ALL(0x38);
  157. EPD_10in85_SendCommand_ALL(0xB4);
  158. EPD_10in85_SendData_ALL(0x5D);
  159. EPD_10in85_SendCommand_ALL(0xB6);
  160. EPD_10in85_SendData_ALL(0x80);
  161. EPD_10in85_SendCommand_ALL(0xB7);
  162. EPD_10in85_SendData_ALL(0x00);
  163. EPD_10in85_SendCommand_ALL(0xF7);
  164. EPD_10in85_SendData_ALL(0x02);
  165. EPD_10in85_SendCommand_1(0xAE);
  166. EPD_10in85_SendData_1(0xA0);
  167. EPD_10in85_SendCommand_ALL(0xE0);
  168. EPD_10in85_SendData_ALL(0x01);
  169. EPD_10in85_SendCommand_ALL(0x00);//Panel setting
  170. EPD_10in85_SendData_ALL(0x9F);
  171. EPD_10in85_SendData_ALL(0x0D);
  172. EPD_10in85_SendCommand_ALL(0x06);//boost
  173. EPD_10in85_SendData_ALL(0x57);
  174. EPD_10in85_SendData_ALL(0x24);
  175. EPD_10in85_SendData_ALL(0x28);
  176. EPD_10in85_SendData_ALL(0x32);
  177. EPD_10in85_SendData_ALL(0x08);
  178. EPD_10in85_SendData_ALL(0x48);
  179. EPD_10in85_SendCommand_ALL(0x61);//resolution setting
  180. EPD_10in85_SendData_ALL(0X02);//680 1360*480
  181. EPD_10in85_SendData_ALL(0XA8);
  182. EPD_10in85_SendData_ALL(0X01);//480
  183. EPD_10in85_SendData_ALL(0XE0);
  184. EPD_10in85_SendCommand_ALL(0x62);
  185. EPD_10in85_SendData_ALL(0x00);
  186. EPD_10in85_SendData_ALL(0x00);
  187. EPD_10in85_SendData_ALL(0x00);
  188. EPD_10in85_SendData_ALL(0x00);
  189. EPD_10in85_SendCommand_ALL(0x60);
  190. EPD_10in85_SendData_ALL(0x31);
  191. EPD_10in85_SendCommand_ALL(0x50);//VCOM and DATA interval setting(CDI)
  192. EPD_10in85_SendData_ALL(0x97);
  193. EPD_10in85_SendCommand_ALL(0xE8);
  194. EPD_10in85_SendData_ALL(0x01);
  195. EPD_10in85_SendCommand_ALL(0x04); //power on
  196. DEV_Delay_ms(200);
  197. EPD_10in85_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
  198. }
  199. void EPD_10in85_Init_Part(void)
  200. {
  201. EPD_10in85_Reset();
  202. EPD_10in85_SendCommand_ALL(0x4D);
  203. EPD_10in85_SendData_ALL(0x55);
  204. EPD_10in85_SendCommand_ALL(0xA6);
  205. EPD_10in85_SendData_ALL(0x38);
  206. EPD_10in85_SendCommand_ALL(0xB4);
  207. EPD_10in85_SendData_ALL(0x5D);
  208. EPD_10in85_SendCommand_ALL(0xB6);
  209. EPD_10in85_SendData_ALL(0x80);
  210. EPD_10in85_SendCommand_ALL(0xB7);
  211. EPD_10in85_SendData_ALL(0x00);
  212. EPD_10in85_SendCommand_ALL(0xF7);
  213. EPD_10in85_SendData_ALL(0x02);
  214. EPD_10in85_SendCommand_1(0xAE);
  215. EPD_10in85_SendData_1(0xA0);
  216. EPD_10in85_SendCommand_ALL(0xE0);
  217. EPD_10in85_SendData_ALL(0x01);
  218. EPD_10in85_SendCommand_ALL(0x00);//Panel setting
  219. EPD_10in85_SendData_ALL(0x9F);
  220. EPD_10in85_SendData_ALL(0x0D);
  221. EPD_10in85_SendCommand_ALL(0x06);//boost
  222. EPD_10in85_SendData_ALL(0x57);
  223. EPD_10in85_SendData_ALL(0x24);
  224. EPD_10in85_SendData_ALL(0x28);
  225. EPD_10in85_SendData_ALL(0x32);
  226. EPD_10in85_SendData_ALL(0x08);
  227. EPD_10in85_SendData_ALL(0x48);
  228. EPD_10in85_SendCommand_ALL(0x61);//resolution setting
  229. EPD_10in85_SendData_ALL(0X02);//680 1360*480
  230. EPD_10in85_SendData_ALL(0XA8);
  231. EPD_10in85_SendData_ALL(0X01);//480
  232. EPD_10in85_SendData_ALL(0XE0);
  233. EPD_10in85_SendCommand_ALL(0x62);
  234. EPD_10in85_SendData_ALL(0x00);
  235. EPD_10in85_SendData_ALL(0x00);
  236. EPD_10in85_SendData_ALL(0x00);
  237. EPD_10in85_SendData_ALL(0x00);
  238. EPD_10in85_SendCommand_ALL(0x82); // VCOM DC Setting
  239. EPD_10in85_SendData_ALL(0x12); // 1-0=11: internal power
  240. EPD_10in85_SendCommand_ALL(0x60);
  241. EPD_10in85_SendData_ALL(0x31);
  242. EPD_10in85_SendCommand_ALL(0x50); // VCOM and DATA interval setting
  243. EPD_10in85_SendData_ALL(0x97);
  244. EPD_10in85_SendCommand_ALL(0x50); // VCOM and DATA interval setting
  245. EPD_10in85_SendData_ALL(0x97);
  246. EPD_10in85_SendCommand_ALL(0xE0);
  247. EPD_10in85_SendData_ALL(0x03);
  248. EPD_10in85_SendCommand_ALL(0xE5); //100du
  249. EPD_10in85_SendData_ALL(0x64);
  250. EPD_10in85_SendCommand_ALL(0x04); //POWER ON
  251. DEV_Delay_ms(100);
  252. EPD_10in85_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
  253. }
  254. /******************************************************************************
  255. function : Clear screen
  256. parameter:
  257. ******************************************************************************/
  258. void EPD_10in85_Clear(void)
  259. {
  260. UWORD Width, Height;
  261. Width = (EPD_10in85_WIDTH % 8 == 0)? (EPD_10in85_WIDTH / 8 ): (EPD_10in85_WIDTH / 8 + 1);
  262. Height = EPD_10in85_HEIGHT;
  263. EPD_10in85_SendCommand_0(0x10);
  264. for (UWORD j = 0; j < Height; j++) {
  265. for (UWORD i = 0; i < Width; i++) {
  266. EPD_10in85_SendData_0(0xFF);
  267. }
  268. }
  269. EPD_10in85_SendCommand_0(0x13);
  270. for (UWORD j = 0; j < Height; j++) {
  271. for (UWORD i = 0; i < Width; i++) {
  272. EPD_10in85_SendData_0(0xFF);
  273. }
  274. }
  275. EPD_10in85_SendCommand_1(0x10);
  276. for (UWORD j = 0; j < Height; j++) {
  277. for (UWORD i = 0; i < Width; i++) {
  278. EPD_10in85_SendData_1(0xFF);
  279. }
  280. }
  281. EPD_10in85_SendCommand_1(0x13);
  282. for (UWORD j = 0; j < Height; j++) {
  283. for (UWORD i = 0; i < Width; i++) {
  284. EPD_10in85_SendData_1(0xFF);
  285. }
  286. }
  287. EPD_10in85_TurnOnDisplay();
  288. }
  289. void EPD_10in85_Clear_Black(void)
  290. {
  291. UWORD Width, Height;
  292. Width = (EPD_10in85_WIDTH % 8 == 0)? (EPD_10in85_WIDTH / 8 ): (EPD_10in85_WIDTH / 8 + 1);
  293. Height = EPD_10in85_HEIGHT;
  294. UBYTE buf[85] = {0x00};
  295. EPD_10in85_SendCommand_0(0x13);
  296. for (UWORD j = 0; j < Height; j++) {
  297. EPD_10in85_SendnData_0(buf,Width);
  298. }
  299. EPD_10in85_SendCommand_1(0x13);
  300. for (UWORD j = 0; j < Height; j++) {
  301. EPD_10in85_SendnData_1(buf,Width);
  302. }
  303. for (UWORD j = 0; j < Width; j++) {
  304. buf[j] = 0xFF;
  305. }
  306. EPD_10in85_SendCommand_0(0x10);
  307. for (UWORD j = 0; j < Height; j++) {
  308. EPD_10in85_SendnData_0(buf,Width);
  309. for (UWORD j = 0; j < Width; j++) {
  310. buf[j] = 0xFF;
  311. }
  312. }
  313. EPD_10in85_SendCommand_1(0x10);
  314. for (UWORD j = 0; j < Height; j++) {
  315. EPD_10in85_SendnData_1(buf,Width);
  316. for (UWORD j = 0; j < Width; j++) {
  317. buf[j] = 0xFF;
  318. }
  319. }
  320. EPD_10in85_TurnOnDisplay();
  321. }
  322. /******************************************************************************
  323. function : Sends the image buffer in RAM to e-Paper and displays
  324. parameter:
  325. Image : Image data
  326. ******************************************************************************/
  327. void EPD_10in85_Display(const UBYTE *Image)
  328. {
  329. UWORD Width, Height;
  330. Width = (EPD_10in85_WIDTH % 8 == 0)? (EPD_10in85_WIDTH / 8 ): (EPD_10in85_WIDTH / 8 + 1);
  331. Height = EPD_10in85_HEIGHT;
  332. UBYTE buf[85] = {0xFF};
  333. for (UWORD j = 0; j < Width; j++) {
  334. buf[j] = 0xFF;
  335. }
  336. EPD_10in85_SendCommand_0(0x10);
  337. for (UWORD j = 0; j < Height; j++) {
  338. EPD_10in85_SendnData_0(buf,Width);
  339. }
  340. EPD_10in85_SendCommand_0(0x13);
  341. for (UWORD j = 0; j < Height; j++) {
  342. EPD_10in85_SendnData_0((UBYTE *)&Image[j*Width*2],Width);
  343. }
  344. EPD_10in85_SendCommand_1(0x10);
  345. for (UWORD j = 0; j < Height; j++) {
  346. EPD_10in85_SendnData_1(buf,Width);
  347. }
  348. EPD_10in85_SendCommand_1(0x13);
  349. for (UWORD j = 0; j < Height; j++) {
  350. EPD_10in85_SendnData_1((UBYTE *)&Image[j*2*Width + Width],Width);
  351. }
  352. EPD_10in85_TurnOnDisplay();
  353. }
  354. void EPD_10in85_Display2(const UBYTE *Image)
  355. {
  356. UWORD Width, Height;
  357. Width = (EPD_10in85_WIDTH % 8 == 0)? (EPD_10in85_WIDTH / 8 ): (EPD_10in85_WIDTH / 8 + 1);
  358. Height = EPD_10in85_HEIGHT/2;
  359. EPD_10in85_SendCommand_0(0x10);
  360. for (UWORD j = 0; j < Height; j++) {
  361. for (UWORD i = 0; i < Width; i++) {
  362. EPD_10in85_SendData_0(Image[j*Width + i]);
  363. }
  364. }
  365. for (UWORD j = 0; j < Height; j++) {
  366. for (UWORD i = 0; i < Width; i++) {
  367. EPD_10in85_SendData_0(0xFF);
  368. }
  369. }
  370. EPD_10in85_SendCommand_0(0x13);
  371. for (UWORD j = 0; j < Height; j++) {
  372. for (UWORD i = 0; i < Width; i++) {
  373. EPD_10in85_SendData_0(Image[j*Width + i]);
  374. }
  375. }
  376. for (UWORD j = 0; j < Height; j++) {
  377. for (UWORD i = 0; i < Width; i++) {
  378. EPD_10in85_SendData_0(0xFF);
  379. }
  380. }
  381. EPD_10in85_SendCommand_1(0x10);
  382. for (UWORD j = 0; j < Height*2; j++) {
  383. for (UWORD i = 0; i < Width; i++) {
  384. EPD_10in85_SendData_1(0xFF);
  385. }
  386. }
  387. EPD_10in85_SendCommand_1(0x13);
  388. for (UWORD j = 0; j < Height*2; j++) {
  389. for (UWORD i = 0; i < Width; i++) {
  390. EPD_10in85_SendData_1(0xFF);
  391. }
  392. }
  393. EPD_10in85_TurnOnDisplay();
  394. }
  395. void EPD_10in85_DisplayPart(const UBYTE *Image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_heigh)
  396. {
  397. UDOUBLE Width, Height;
  398. Width = (EPD_10in85_WIDTH % 8 == 0)? (EPD_10in85_WIDTH / 8 ): (EPD_10in85_WIDTH / 8 + 1);
  399. Height = EPD_10in85_HEIGHT;
  400. UWORD Xend = ((xstart + image_width)%8 == 0)?((xstart + image_width) / 8 - 1): ((xstart + image_width) / 8 );
  401. UWORD Yend = ystart + image_heigh-1;
  402. xstart = xstart / 8;
  403. if(xstart > 85 )
  404. {
  405. Xend = Xend - 85;
  406. xstart = xstart - 85;
  407. EPD_10in85_SendCommand_0(0x10);
  408. for (UDOUBLE i = 0; i < Height; i++) {
  409. for (UDOUBLE j = 0; j < Width; j++) {
  410. EPD_10in85_SendData_0(0xff);
  411. }
  412. }
  413. EPD_10in85_SendCommand_0(0x13);
  414. for (UDOUBLE i = 0; i < Height; i++) {
  415. for (UDOUBLE j = 0; j < Width; j++) {
  416. EPD_10in85_SendData_0(0xff);
  417. }
  418. }
  419. EPD_10in85_SendCommand_1(0x10);
  420. for (UDOUBLE i = 0; i < Height; i++) {
  421. for (UDOUBLE j = 0; j < Width; j++) {
  422. if((i<Yend) && (i>=ystart) && (j<Xend) && (j>=xstart)) {
  423. EPD_10in85_SendData_1(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  424. }
  425. else
  426. EPD_10in85_SendData_1(0xff);
  427. }
  428. }
  429. EPD_10in85_SendCommand_1(0x13);
  430. for (UDOUBLE i = 0; i < Height; i++) {
  431. for (UDOUBLE j = 0; j < Width; j++) {
  432. if((i<Yend) && (i>=ystart) && (j<Xend) && (j>=xstart)) {
  433. EPD_10in85_SendData_1(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  434. }
  435. else
  436. EPD_10in85_SendData_1(0x55);
  437. }
  438. }
  439. }
  440. else if(Xend < 85 )
  441. {
  442. EPD_10in85_SendCommand_0(0x10);
  443. for (UDOUBLE i = 0; i < Height; i++) {
  444. for (UDOUBLE j = 0; j < Width; j++) {
  445. if((i<Yend) && (i>=ystart) && (j<Xend) && (j>=xstart)) {
  446. EPD_10in85_SendData_0(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  447. }
  448. else
  449. EPD_10in85_SendData_0(0xff);
  450. }
  451. }
  452. EPD_10in85_SendCommand_0(0x13);
  453. for (UDOUBLE i = 0; i < Height; i++) {
  454. for (UDOUBLE j = 0; j < Width; j++) {
  455. if((i<Yend) && (i>=ystart) && (j<Xend) && (j>=xstart)) {
  456. EPD_10in85_SendData_0(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  457. }
  458. else
  459. EPD_10in85_SendData_0(0xff);
  460. }
  461. }
  462. EPD_10in85_SendCommand_1(0x10);
  463. for (UDOUBLE i = 0; i < Height; i++) {
  464. for (UDOUBLE j = 0; j < Width; j++) {
  465. EPD_10in85_SendData_1(0xff);
  466. }
  467. }
  468. EPD_10in85_SendCommand_1(0x13);
  469. for (UDOUBLE i = 0; i < Height; i++) {
  470. for (UDOUBLE j = 0; j < Width; j++) {
  471. EPD_10in85_SendData_1(0xff);
  472. }
  473. }
  474. }
  475. else
  476. {
  477. EPD_10in85_SendCommand_0(0x10);
  478. for (UDOUBLE i = 0; i < Height; i++) {
  479. for (UDOUBLE j = 0; j < Width; j++) {
  480. if((i<Yend) && (i>=ystart) && (j>=xstart)) {
  481. EPD_10in85_SendData_0(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  482. }
  483. else
  484. EPD_10in85_SendData_0(0xff);
  485. }
  486. }
  487. EPD_10in85_SendCommand_0(0x13);
  488. for (UDOUBLE i = 0; i < Height; i++) {
  489. for (UDOUBLE j = 0; j < Width; j++) {
  490. if((i<Yend) && (i>=ystart) && (j>=xstart)) {
  491. EPD_10in85_SendData_0(Image[(j-xstart) + (image_width/8*(i-ystart))]);
  492. }
  493. else
  494. EPD_10in85_SendData_0(0xff);
  495. }
  496. }
  497. EPD_10in85_SendCommand_1(0x10);
  498. for (UDOUBLE i = 0; i < Height; i++) {
  499. for (UDOUBLE j = 0; j < Width; j++) {
  500. if((i<Yend) && (i>=ystart) && (j<Xend-170)) {
  501. EPD_10in85_SendData_1(Image[(j+170-xstart) + (image_width/8*(i-ystart))]);
  502. }
  503. else
  504. EPD_10in85_SendData_1(0xff);
  505. }
  506. }
  507. EPD_10in85_SendCommand_1(0x13);
  508. for (UDOUBLE i = 0; i < Height; i++) {
  509. for (UDOUBLE j = 0; j < Width; j++) {
  510. if((i<Yend) && (i>=ystart) && (j<Xend-170)) {
  511. EPD_10in85_SendData_1(Image[(j+170-xstart) + (image_width/8*(i-ystart))]);
  512. }
  513. else
  514. EPD_10in85_SendData_1(0xff);
  515. }
  516. }
  517. }
  518. EPD_10in85_TurnOnDisplay();
  519. }
  520. /******************************************************************************
  521. function : Sends the image buffer in RAM to e-Paper and partial refresh
  522. parameter:
  523. Image : Image data
  524. ******************************************************************************/
  525. void EPD_10in85b_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
  526. {
  527. if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
  528. {
  529. Xstart = Xstart / 8 ;
  530. Xend = Xend / 8;
  531. }
  532. else
  533. {
  534. Xstart = Xstart / 8 ;
  535. Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
  536. }
  537. UWORD Width, Height;
  538. Width = Xend - Xstart;
  539. Height = Yend - Ystart;
  540. UWORD IMAGE_COUNTER = Width * Height;
  541. if((Xend*8)<EPD_10in85_WIDTH)
  542. {
  543. EPD_10in85_SendCommand_ALL(0x61);
  544. EPD_10in85_SendData_ALL((Width*8)/256);
  545. EPD_10in85_SendData_ALL((Width*8)%256);
  546. EPD_10in85_SendData_ALL((Height+1)/256);
  547. EPD_10in85_SendData_ALL((Height+1)%256);
  548. EPD_10in85_SendCommand_ALL(0x62);
  549. EPD_10in85_SendData_ALL((Xstart*8)/256);
  550. EPD_10in85_SendData_ALL((Xstart*8)%256);
  551. EPD_10in85_SendData_ALL(Ystart/256);
  552. EPD_10in85_SendData_ALL(Ystart%256);
  553. if(partFlag0 == 0)
  554. {
  555. partFlag0 = 1;
  556. EPD_10in85_SendCommand_0(0x10);
  557. for (UWORD j = 0; j < Height; j++) {
  558. for (UWORD i = 0; i < Width; i++) {
  559. EPD_10in85_SendData_0(0xFF);
  560. }
  561. }
  562. }
  563. EPD_10in85_SendCommand_0(0x13);
  564. for (UWORD j = 0; j < Height; j++) {
  565. for (UWORD i = 0; i < Width; i++) {
  566. EPD_10in85_SendData_0(Image[j*Width + i]);
  567. }
  568. }
  569. EPD_10in85_TurnOnDisplay();
  570. EPD_10in85_SendCommand_0(0x10);
  571. for (UWORD i = 0; i < IMAGE_COUNTER; i++) {
  572. EPD_10in85_SendData_0(Image[i]);
  573. }
  574. }
  575. else if((Xstart*8)>EPD_10in85_WIDTH)
  576. {
  577. EPD_10in85_SendCommand_ALL(0x61);
  578. EPD_10in85_SendData_ALL((Width*8)/256);
  579. EPD_10in85_SendData_ALL((Width*8)%256);
  580. EPD_10in85_SendData_ALL(Height/256);
  581. EPD_10in85_SendData_ALL(Height%256);
  582. EPD_10in85_SendCommand_ALL(0x62);
  583. EPD_10in85_SendData_ALL((Xstart*8-EPD_10in85_WIDTH)/256);
  584. EPD_10in85_SendData_ALL((Xstart*8-EPD_10in85_WIDTH)%256);
  585. EPD_10in85_SendData_ALL(Ystart/256);
  586. EPD_10in85_SendData_ALL(Ystart%256);
  587. if(partFlag1 == 0)
  588. {
  589. partFlag1 = 1;
  590. EPD_10in85_SendCommand_1(0x10);
  591. for (UWORD i = 0; i < IMAGE_COUNTER; i++) {
  592. EPD_10in85_SendData_1(0xFF);
  593. }
  594. }
  595. EPD_10in85_SendCommand_1(0x13);
  596. for (UWORD i = 0; i < IMAGE_COUNTER; i++) {
  597. EPD_10in85_SendData_1(Image[i]);
  598. }
  599. EPD_10in85_TurnOnDisplay();
  600. EPD_10in85_SendCommand_1(0x10);
  601. for (UWORD i = 0; i < IMAGE_COUNTER; i++) {
  602. EPD_10in85_SendData_1(Image[i]);
  603. }
  604. }
  605. else
  606. {
  607. UWORD Width0 = EPD_10in85_WIDTH/8 - Xstart;
  608. UWORD Width1 = Xend - EPD_10in85_WIDTH/8;
  609. EPD_10in85_SendCommand_0(0x61);
  610. EPD_10in85_SendData_0((Width0*8)/256);
  611. EPD_10in85_SendData_0((Width0*8)%256);
  612. EPD_10in85_SendData_0(Height/256);
  613. EPD_10in85_SendData_0(Height%256);
  614. EPD_10in85_SendCommand_0(0x62);
  615. EPD_10in85_SendData_0((Xstart*8)/256);
  616. EPD_10in85_SendData_0((Xstart*8)%256);
  617. EPD_10in85_SendData_0(Ystart/256);
  618. EPD_10in85_SendData_0(Ystart%256);
  619. EPD_10in85_SendCommand_1(0x61);
  620. EPD_10in85_SendData_1((Width1*8)/256);
  621. EPD_10in85_SendData_1((Width1*8)%256);
  622. EPD_10in85_SendData_1(Height/256);
  623. EPD_10in85_SendData_1(Height%256);
  624. EPD_10in85_SendCommand_1(0x62);
  625. EPD_10in85_SendData_1(0x00);
  626. EPD_10in85_SendData_1(0x00);
  627. EPD_10in85_SendData_1(Ystart/256);
  628. EPD_10in85_SendData_1(Ystart%256);
  629. if(partFlag0 == 0)
  630. {
  631. partFlag0 = 1;
  632. EPD_10in85_SendCommand_0(0x10);
  633. for (UWORD j = 0; j < Height; j++) {
  634. for (UWORD i = 0; i < Width0; i++) {
  635. EPD_10in85_SendData_0(0xFF);
  636. }
  637. }
  638. }
  639. EPD_10in85_SendCommand_0(0x13);
  640. for (UWORD j = 0; j < Height; j++) {
  641. for (UWORD i = 0; i < Width0; i++) {
  642. EPD_10in85_SendData_0(Image[j*Width + i]);
  643. }
  644. }
  645. if(partFlag1 == 0)
  646. {
  647. partFlag1 = 1;
  648. EPD_10in85_SendCommand_1(0x10);
  649. for (UWORD j = 0; j < Height; j++) {
  650. for (UWORD i = 0; i < Width1; i++) {
  651. EPD_10in85_SendData_1(0xFF);
  652. }
  653. }
  654. }
  655. EPD_10in85_SendCommand_1(0x13);
  656. for (UWORD j = 0; j < Height; j++) {
  657. for (UWORD i = 0; i < Width1; i++) {
  658. EPD_10in85_SendData_1(Image[j*Width + i + Width0]);
  659. }
  660. }
  661. EPD_10in85_TurnOnDisplay();
  662. EPD_10in85_SendCommand_0(0x10);
  663. for (UWORD j = 0; j < Height; j++) {
  664. for (UWORD i = 0; i < Width0; i++) {
  665. EPD_10in85_SendData_0(Image[j*Width + i]);
  666. }
  667. }
  668. EPD_10in85_SendCommand_1(0x10);
  669. for (UWORD j = 0; j < Height; j++) {
  670. for (UWORD i = 0; i < Width1; i++) {
  671. EPD_10in85_SendData_1(Image[j*Width + i + Width0]);
  672. }
  673. }
  674. }
  675. }
  676. /******************************************************************************
  677. function : Enter sleep mode
  678. parameter:
  679. ******************************************************************************/
  680. void EPD_10in85_Sleep(void)
  681. {
  682. EPD_10in85_SendCommand_ALL(0x02);
  683. DEV_Delay_ms(100);
  684. EPD_10in85_ReadBusy();
  685. EPD_10in85_SendCommand_ALL(0X07); //enter deep sleep
  686. EPD_10in85_SendData_ALL(0xA5);
  687. DEV_Delay_ms(100);
  688. }