浏览代码

Added fast refresh and improved partial refresh effect to the 4.2inch e-Paper

SSYYL 3 年之前
父节点
当前提交
d6e11eaae6

+ 64 - 51
Arduino/epd4in2/epd4in2.cpp

@@ -39,7 +39,6 @@ Epd::Epd() {
     height = EPD_HEIGHT;
 };
 
-
 int Epd::Init(void) {
     /* this calls the peripheral hardware interface, see epdif */
     if (IfInit() != 0) {
@@ -47,23 +46,38 @@ int Epd::Init(void) {
     }
     /* EPD hardware init start */
     Reset();
-    SendCommand(POWER_SETTING);
+    SendCommand(0x01);
     SendData(0x03);                  // VDS_EN, VDG_EN
     SendData(0x00);                  // VCOM_HV, VGHL_LV[1], VGHL_LV[0]
     SendData(0x2b);                  // VDH
     SendData(0x2b);                  // VDL
-    SendData(0xff);                  // VDHR
-    SendCommand(BOOSTER_SOFT_START);
+
+    SendCommand(0x06);
     SendData(0x17);
     SendData(0x17);
     SendData(0x17);                  //07 0f 17 1f 27 2F 37 2f
-    SendCommand(POWER_ON);
+    SendCommand(0x04);
     WaitUntilIdle();
-    SendCommand(PANEL_SETTING);
+    SendCommand(0x00);
     SendData(0xbf);    // KW-BF   KWR-AF  BWROTP 0f
-    SendData(0x0b);
-    SendCommand(PLL_CONTROL);
+
+    SendCommand(0x30);
     SendData(0x3c);        // 3A 100HZ   29 150Hz 39 200HZ  31 171HZ
+
+    SendCommand(0x61); // resolution setting
+    SendData(0x01);
+    SendData(0x90); //128
+    SendData(0x01); //
+    SendData(0x2c);
+
+    SendCommand(0x82); // vcom_DC setting
+    SendData(0x12);
+
+    SendCommand(0X50); // VCOM AND DATA INTERVAL SETTING
+    SendData(0x97); // 97white border 77black border    VBDF 17|D7 VBDW 97 VBDB 57    VBDF F7 VBDW 77 VBDB 37  VBDR B7
+
+    SetLut();
+    
     /* EPD hardware init end */
     return 0;
 }
@@ -304,27 +318,27 @@ void Epd::Set_4GrayDisplay(const char *Image, int x, int y, int w, int l)
 void Epd::SetLut(void) {
     unsigned int count;     
     SendCommand(LUT_FOR_VCOM);                            //vcom
-    for(count = 0; count < 44; count++) {
+    for(count = 0; count < 36; count++) {
         SendData(lut_vcom0[count]);
     }
     
     SendCommand(LUT_WHITE_TO_WHITE);                      //ww --
-    for(count = 0; count < 42; count++) {
+    for(count = 0; count < 36; count++) {
         SendData(lut_ww[count]);
     }   
     
     SendCommand(LUT_BLACK_TO_WHITE);                      //bw r
-    for(count = 0; count < 42; count++) {
+    for(count = 0; count < 36; count++) {
         SendData(lut_bw[count]);
     } 
 
     SendCommand(LUT_WHITE_TO_BLACK);                      //wb w
-    for(count = 0; count < 42; count++) {
+    for(count = 0; count < 36; count++) {
         SendData(lut_bb[count]);
     } 
 
     SendCommand(LUT_BLACK_TO_BLACK);                      //bb b
-    for(count = 0; count < 42; count++) {
+    for(count = 0; count < 36; count++) {
         SendData(lut_wb[count]);
     } 
 }
@@ -387,9 +401,7 @@ void Epd::DisplayFrame(const unsigned char* frame_buffer) {
         DelayMs(2);                  
     }
 
-    SetLut();
-
-    SendCommand(DISPLAY_REFRESH); 
+    SendCommand(0x12); 
     DelayMs(100);
     WaitUntilIdle();
 }
@@ -457,55 +469,56 @@ void Epd::Sleep() {
 
 const unsigned char lut_vcom0[] =
 {
-0x00, 0x17, 0x00, 0x00, 0x00, 0x02,        
-0x00, 0x17, 0x17, 0x00, 0x00, 0x02,        
-0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,        
-0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,        
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x02,  
+  0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+  0x00, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00,   
 
 };
 const unsigned char lut_ww[] ={
-0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+  0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
 };
 const unsigned char lut_bw[] ={
-0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+  0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       
 };
 
 const unsigned char lut_bb[] ={
-0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+  0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
              
 };
 
 const unsigned char lut_wb[] ={
-0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x20, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+  0x10, 0x08, 0x08, 0x00, 0x00, 0x02, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
             
 };
 

+ 33 - 20
RaspberryPi_JetsonNano/c/examples/EPD_4in2_test.c

@@ -30,6 +30,7 @@
 #include "EPD_Test.h"
 #include "EPD_4in2.h"
 #include <string.h>
+#include <time.h> 
 
 int EPD_4in2_test(void)
 {
@@ -39,9 +40,14 @@ int EPD_4in2_test(void)
     }
 
     printf("e-Paper Init and Clear...\r\n");
-    EPD_4IN2_Init();
+    EPD_4IN2_Init_Fast();
+
+    struct timespec start={0,0}, finish={0,0}; 
+    clock_gettime(CLOCK_REALTIME,&start);
     EPD_4IN2_Clear();
     DEV_Delay_ms(500);
+    clock_gettime(CLOCK_REALTIME,&finish);
+    Debug("%ld S\r\n",finish.tv_sec-start.tv_sec);	
 
     //Create a new image cache
     UBYTE *BlackImage;
@@ -56,6 +62,9 @@ int EPD_4in2_test(void)
     
 
 #if 1  // show bmp
+
+    EPD_4IN2_Init_Fast();
+    
     printf("show window BMP-----------------\r\n");
     Paint_SelectImage(BlackImage);
     Paint_Clear(WHITE);
@@ -68,9 +77,10 @@ int EPD_4in2_test(void)
     GUI_ReadBmp("./pic/4in2.bmp", 0, 0);
     EPD_4IN2_Display(BlackImage);
     DEV_Delay_ms(2000);
+
 #endif        
 
-#if 0   // show image for array   
+#if 1   // show image for array   
     printf("show image for array\r\n");
     Paint_SelectImage(BlackImage);
     Paint_Clear(WHITE);
@@ -79,7 +89,7 @@ int EPD_4in2_test(void)
     DEV_Delay_ms(500);
 #endif
 
-#if 1   // Drawing on the image
+#if 1  // Drawing on the image
     //1.Select Image
     printf("SelectImage:BlackImage\r\n");
     Paint_SelectImage(BlackImage);
@@ -102,15 +112,18 @@ int EPD_4in2_test(void)
     Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
     Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
     Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
-    Paint_DrawString_CN(130, 0, " ÄãºÃabc", &Font12CN, BLACK, WHITE);
-    Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
+    Paint_DrawString_CN(130, 0, "���abc", &Font12CN, BLACK, WHITE);
+    Paint_DrawString_CN(130, 20, "΢ѩ����", &Font24CN, WHITE, BLACK);
 
     printf("EPD_Display\r\n");
     EPD_4IN2_Display(BlackImage);
 	DEV_Delay_ms(2000);
+
 #endif
-	printf("Support for partial refresh, but the refresh effect is not good, but it is not recommended\r\n");
+	
 #if 0
+    printf("Support for partial refresh, but the refresh effect is not good, but it is not recommended\r\n");
+    EPD_4IN2_Init_Partial();
 	printf("Partial refresh\r\n");
     PAINT_TIME sPaint_time;
     sPaint_time.Hour = 12;
@@ -142,6 +155,8 @@ int EPD_4in2_test(void)
 		}
     }
 #endif
+#if 1
+    EPD_4IN2_Init_Fast();
 	EPD_4IN2_Clear();
 	EPD_4IN2_Init_4Gray();
 	printf("show Gray------------------------\r\n");
@@ -155,7 +170,7 @@ int EPD_4in2_test(void)
 	Paint_NewImage(BlackImage, EPD_4IN2_WIDTH, EPD_4IN2_HEIGHT, 0, WHITE);
 	Paint_SetScale(4);
 	Paint_Clear(WHITE);
-#if 0
+
 	Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
     Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
     Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
@@ -171,24 +186,23 @@ int EPD_4in2_test(void)
     Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
     Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
     Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
-    Paint_DrawString_CN(140, 0, "ÄãºÃabc", &Font12CN, GRAY1, GRAY4);
-    Paint_DrawString_CN(140, 40, "ÄãºÃabc", &Font12CN, GRAY2, GRAY3);
-    Paint_DrawString_CN(140, 80, "ÄãºÃabc", &Font12CN, GRAY3, GRAY2);
-    Paint_DrawString_CN(140, 120, "ÄãºÃabc", &Font12CN, GRAY4, GRAY1);
+    Paint_DrawString_CN(140, 0, "���abc", &Font12CN, GRAY1, GRAY4);
+    Paint_DrawString_CN(140, 40, "���abc", &Font12CN, GRAY2, GRAY3);
+    Paint_DrawString_CN(140, 80, "���abc", &Font12CN, GRAY3, GRAY2);
+    Paint_DrawString_CN(140, 120, "���abc", &Font12CN, GRAY4, GRAY1);
 	
-    Paint_DrawString_CN(220, 0, "΢ѩµç×Ó", &Font24CN, GRAY1, GRAY4);
-    Paint_DrawString_CN(220, 40, "΢ѩµç×Ó", &Font24CN, GRAY2, GRAY3);
-    Paint_DrawString_CN(220, 80, "΢ѩµç×Ó", &Font24CN, GRAY3, GRAY2);
-    Paint_DrawString_CN(220, 120, "΢ѩµç×Ó", &Font24CN, GRAY4, GRAY1);
+    Paint_DrawString_CN(220, 0, "΢ѩ����", &Font24CN, GRAY1, GRAY4);
+    Paint_DrawString_CN(220, 40, "΢ѩ����", &Font24CN, GRAY2, GRAY3);
+    Paint_DrawString_CN(220, 80, "΢ѩ����", &Font24CN, GRAY3, GRAY2);
+    Paint_DrawString_CN(220, 120, "΢ѩ����", &Font24CN, GRAY4, GRAY1);
 	
 	EPD_4IN2_4GrayDisplay(BlackImage);
 	DEV_Delay_ms(2000);
-#endif	
-#if 1
+
 	Paint_Clear(WHITE);
     EPD_4IN2_4GrayDisplay(gImage_4in2_4Gray1);
 	DEV_Delay_ms(2000);
-	
+
 	GUI_ReadBmp_4Gray("./pic/4in2_Scale.bmp",0 , 0);
 	EPD_4IN2_4GrayDisplay(BlackImage);
 	DEV_Delay_ms(2000);
@@ -198,8 +212,7 @@ int EPD_4in2_test(void)
     EPD_4IN2_4GrayDisplay(BlackImage);
 	DEV_Delay_ms(2000);
 #endif	
-	EPD_4IN2_Clear();
-    EPD_4IN2_Init();
+    EPD_4IN2_Init_Fast();
     EPD_4IN2_Clear();
     printf("Goto Sleep...\r\n");
     EPD_4IN2_Sleep();

+ 2 - 2
RaspberryPi_JetsonNano/c/examples/main.c

@@ -44,7 +44,7 @@ int main(void)
 
     // EPD_2in13_test();
 	// EPD_2in13_V2_test();
-	EPD_2in13_V3_test();
+	// EPD_2in13_V3_test();
     // EPD_2in13bc_test();
     // EPD_2in13b_V3_test();
     // EPD_2in13d_test();
@@ -53,7 +53,7 @@ int main(void)
 
 	// EPD_4in01f_test();
 
-    // EPD_4in2_test();
+    EPD_4in2_test();
 	// EPD_4in2_V2_test();
     // EPD_4in2bc_test();
     // EPD_4in2b_V2_test();

+ 226 - 169
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2.c

@@ -113,173 +113,184 @@
 #include "Debug.h"
 
 static const unsigned char EPD_4IN2_lut_vcom0[] = {
-    0x00, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x00, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x00, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 					
+	};
 static const unsigned char EPD_4IN2_lut_ww[] = {
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	};
 static const unsigned char EPD_4IN2_lut_bw[] = {
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	};
 static const unsigned char EPD_4IN2_lut_wb[] = {
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	};
 static const unsigned char EPD_4IN2_lut_bb[] = {
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x20, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x10, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	};
 
 /******************************partial screen update LUT*********************************/
 const unsigned char EPD_4IN2_Partial_lut_vcom1[] ={
-0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00,	};
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
 
 const unsigned char EPD_4IN2_Partial_lut_ww1[] ={
-0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,};
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
 
 const unsigned char EPD_4IN2_Partial_lut_bw1[] ={
-0x80	,0x19	,0x01	,0x00	,0x00	,0x01,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	};
+    0x20, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+};
 
 const unsigned char EPD_4IN2_Partial_lut_wb1[] ={
-0x40	,0x19	,0x01	,0x00	,0x00	,0x01,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	};
+    0x10, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+};
 
 const unsigned char EPD_4IN2_Partial_lut_bb1[] ={
-0x00	,0x19	,0x01	,0x00	,0x00	,0x01,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	};
+    0x00, 0x01,0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+};
+
 
 /******************************gray*********************************/
 //0~3 gray
 const unsigned char EPD_4IN2_4Gray_lut_vcom[] =
 {
-0x00	,0x0A	,0x00	,0x00	,0x00	,0x01,
-0x60	,0x14	,0x14	,0x00	,0x00	,0x01,
-0x00	,0x14	,0x00	,0x00	,0x00	,0x01,
-0x00	,0x13	,0x0A	,0x01	,0x00	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00
+    0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
 				
 };
 //R21
 const unsigned char EPD_4IN2_4Gray_lut_ww[] ={
-0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-0x10	,0x14	,0x0A	,0x00	,0x00	,0x01,
-0xA0	,0x13	,0x01	,0x00	,0x00	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R22H	r
 const unsigned char EPD_4IN2_4Gray_lut_bw[] ={
-0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-0x99	,0x0C	,0x01	,0x03	,0x04	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R23H	w
 const unsigned char EPD_4IN2_4Gray_lut_wb[] ={
-0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-0x99	,0x0B	,0x04	,0x04	,0x01	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R24H	b
 const unsigned char EPD_4IN2_4Gray_lut_bb[] ={
-0x80	,0x0A	,0x00	,0x00	,0x00	,0x01,
-0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-0x20	,0x14	,0x0A	,0x00	,0x00	,0x01,
-0x50	,0x13	,0x01	,0x00	,0x00	,0x01,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 
-
 /******************************************************************************
 function :	Software reset
 parameter:
 ******************************************************************************/
 static void EPD_4IN2_Reset(void)
 {
-    DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
+
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
+	
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
 }
 
 /******************************************************************************
@@ -338,35 +349,6 @@ static void EPD_4IN2_TurnOnDisplay(void)
 function :	set the look-up tables
 parameter:
 ******************************************************************************/
-static void EPD_4IN2_SetLut(void)
-{
-    UWORD count;
-    EPD_4IN2_SendCommand(0x20);         //g vcom
-    for(count=0; count<44; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_vcom0[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x21);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_ww[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x22);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_bw[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x23);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_wb[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x24);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_bb[count]);
-    }
-}
-
 static void EPD_4IN2_Partial_SetLut(void)
 {
 	unsigned int count;
@@ -388,7 +370,31 @@ static void EPD_4IN2_Partial_SetLut(void)
 
 	EPD_4IN2_SendCommand(0x24);
 	for(count=0;count<42;count++)	     
-		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bb1[count]);}   
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bb1[count]);} 
+}
+
+static void EPD_4IN2_SetLut(void)
+{
+	unsigned int count;
+	EPD_4IN2_SendCommand(0x20);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_vcom0[count]);}
+
+	EPD_4IN2_SendCommand(0x21);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_ww[count]);}   
+	
+	EPD_4IN2_SendCommand(0x22);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_bw[count]);} 
+
+	EPD_4IN2_SendCommand(0x23);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_wb[count]);} 
+
+	EPD_4IN2_SendCommand(0x24);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_bb[count]);}   
 }
 
 //LUT download
@@ -425,7 +431,8 @@ static void EPD_4IN2_4Gray_lut(void)
 function :	Initialize the e-Paper register
 parameter:
 ******************************************************************************/
-void EPD_4IN2_Init(void)
+
+void EPD_4IN2_Init_Partial(void)
 {
     EPD_4IN2_Reset();
 
@@ -445,7 +452,6 @@ void EPD_4IN2_Init(void)
 
     EPD_4IN2_SendCommand(0x00); // panel setting
     EPD_4IN2_SendData(0xbf); // KW-BF   KWR-AF	BWROTP 0f	BWOTP 1f
-    EPD_4IN2_SendData(0x0d);
 
     EPD_4IN2_SendCommand(0x30); // PLL setting
     EPD_4IN2_SendData(0x3C); // 3A 100HZ   29 150Hz 39 200HZ	31 171HZ
@@ -457,14 +463,56 @@ void EPD_4IN2_Init(void)
     EPD_4IN2_SendData(0x2c);
 
     EPD_4IN2_SendCommand(0x82); // vcom_DC setting
-    EPD_4IN2_SendData(0x28);
+    EPD_4IN2_SendData(0x12);
 
     EPD_4IN2_SendCommand(0X50); // VCOM AND DATA INTERVAL SETTING
-    EPD_4IN2_SendData(0x97); // 97white border 77black border		VBDF 17|D7 VBDW 97 VBDB 57		VBDF F7 VBDW 77 VBDB 37  VBDR B7
+    EPD_4IN2_SendData(0x07); // 97white border 77black border		VBDF 17|D7 VBDW 97 VBDB 57		VBDF F7 VBDW 77 VBDB 37  VBDR B7
 
-    EPD_4IN2_SetLut();
+    EPD_4IN2_Partial_SetLut();
 }
 
+//UC8176C
+void EPD_4IN2_Init_Fast(void)
+{
+	EPD_4IN2_Reset();
+	EPD_4IN2_SendCommand(0x01);			//POWER SETTING 
+	EPD_4IN2_SendData (0x03);	          
+	EPD_4IN2_SendData (0x00);
+	EPD_4IN2_SendData (0x2b);  
+	EPD_4IN2_SendData (0x2b);
+
+	EPD_4IN2_SendCommand(0x06);         //boost soft start
+	EPD_4IN2_SendData (0x17);		//A
+	EPD_4IN2_SendData (0x17);		//B
+	EPD_4IN2_SendData (0x17);		//C       
+
+	EPD_4IN2_SendCommand(0x04);  
+	EPD_4IN2_ReadBusy();
+
+	EPD_4IN2_SendCommand(0x00);			//panel setting
+	EPD_4IN2_SendData(0xbf);		//KW-bf   KWR-2F	BWROTP 0f	BWOTP 1f
+
+
+	EPD_4IN2_SendCommand(0x30);			
+	EPD_4IN2_SendData (0x3c);      	// 3A 100HZ   29 150Hz 39 200HZ	31 171HZ
+
+	EPD_4IN2_SendCommand(0x61);			//resolution setting
+	EPD_4IN2_SendData (0x01);        	 
+	EPD_4IN2_SendData (0x90);	 //400	
+	EPD_4IN2_SendData (0x01);	 //300
+	EPD_4IN2_SendData (0x2c);	   
+
+
+	EPD_4IN2_SendCommand(0x82);			//vcom_DC setting  	
+	EPD_4IN2_SendData (0x12);	
+
+	EPD_4IN2_SendCommand(0X50);
+	EPD_4IN2_SendData(0x97);
+
+	EPD_4IN2_SetLut();		
+		
+}	
+
 void EPD_4IN2_Init_4Gray(void)
 {
 	EPD_4IN2_Reset();
@@ -524,8 +572,9 @@ void EPD_4IN2_Clear(void)
             EPD_4IN2_SendData(0xFF);
         }
     }
+
 	EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH 		
-	DEV_Delay_ms(10);	
+	DEV_Delay_ms(1);	
     EPD_4IN2_TurnOnDisplay();
 }
 
@@ -539,34 +588,37 @@ void EPD_4IN2_Display(UBYTE *Image)
     Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
     Height = EPD_4IN2_HEIGHT;
 
+	EPD_4IN2_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2_SendData(0x00);
+        }
+    }
+
     EPD_4IN2_SendCommand(0x13);
     for (UWORD j = 0; j < Height; j++) {
         for (UWORD i = 0; i < Width; i++) {
             EPD_4IN2_SendData(Image[i + j * Width]);
         }
     }
-		
+
+	EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH 		
+	DEV_Delay_ms(10);		
     EPD_4IN2_TurnOnDisplay();
 }
 
 void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end, UBYTE *Image)
 {
 	UWORD Width, Height;
+	static UBYTE DATA[EPD_4IN2_WIDTH * EPD_4IN2_HEIGHT / 8] = {0x00};
+
     Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
     Height = EPD_4IN2_HEIGHT;
 	
 	X_start = (X_start % 8 == 0)? (X_start): (X_start/8*8+8);
 	X_end = (X_end % 8 == 0)? (X_end): (X_end/8*8+8);
 	
-	EPD_4IN2_SendCommand(0X50);
-	EPD_4IN2_SendData(0xf7);
-	DEV_Delay_ms(100);
-	
-	EPD_4IN2_SendCommand(0x82);			//vcom_DC setting  	
-	EPD_4IN2_SendData (0x08);	
-	EPD_4IN2_SendCommand(0X50);
-	EPD_4IN2_SendData(0x47);		
-	EPD_4IN2_Partial_SetLut();
+
 	EPD_4IN2_SendCommand(0x91);		//This command makes the display enter partial mode
 	EPD_4IN2_SendCommand(0x90);		//resolution setting
 	EPD_4IN2_SendData ((X_start)/256);
@@ -585,13 +637,14 @@ void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end
 	EPD_4IN2_SendCommand(0x10);	       //writes Old data to SRAM for programming
     for (UWORD j = 0; j < Y_end - Y_start; j++) {
         for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
-            EPD_4IN2_SendData(Image[(Y_start + j)*Width + X_start/8 + i]);
+            EPD_4IN2_SendData(DATA[(Y_start + j)*Width + X_start/8 + i]);
         }
     }
 	EPD_4IN2_SendCommand(0x13);				 //writes New data to SRAM.
     for (UWORD j = 0; j < Y_end - Y_start; j++) {
         for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
             EPD_4IN2_SendData(~Image[(Y_start + j)*Width + X_start/8 + i]);
+			DATA[(Y_start + j)*Width + X_start/8 + i] = ~Image[(Y_start + j)*Width + X_start/8 + i];
         }
     }
 
@@ -703,8 +756,12 @@ parameter:
 ******************************************************************************/
 void EPD_4IN2_Sleep(void)
 {
-    // EPD_4IN2_SendCommand(0x02); // POWER_OFF
-    // EPD_4IN2_ReadBusy();
+	EPD_4IN2_SendCommand(0x50); // DEEP_SLEEP
+    EPD_4IN2_SendData(0XF7);
+
+    EPD_4IN2_SendCommand(0x02); // POWER_OFF
+    EPD_4IN2_ReadBusy();
+
     EPD_4IN2_SendCommand(0x07); // DEEP_SLEEP
     EPD_4IN2_SendData(0XA5);
 }

+ 2 - 1
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2.h

@@ -118,7 +118,8 @@
 #define EPD_4IN2_WIDTH       400
 #define EPD_4IN2_HEIGHT      300
 
-void EPD_4IN2_Init(void);
+void EPD_4IN2_Init_Fast(void);
+void EPD_4IN2_Init_Partial(void);
 void EPD_4IN2_Clear(void);
 void EPD_4IN2_Display(UBYTE *Image);
 void EPD_4IN2_Sleep(void);

+ 10 - 8
RaspberryPi_JetsonNano/python/examples/epd_4in2_test.py

@@ -78,18 +78,20 @@ try:
     logging.info("Clear...")
     epd.Clear()
     
-    Himage3 = Image.new('1', (epd.width, epd.height), 0)  # 255: clear the frame
-    draw = ImageDraw.Draw(Himage3)
-    print("Support for partial refresh, but the refresh effect is not good, but it is not recommended")
-    print("Local refresh is off by default and is not recommended.")
     if(0):
+        print("Support for partial refresh, but the refresh effect is not good, but it is not recommended")
+        print("Local refresh is off by default and is not recommended.")
+        Himage3 = Image.new('1', (epd.width, epd.height), 0)  # 255: clear the frame
+        draw = ImageDraw.Draw(Himage3)
+        epd.init_Partial() 
         for j in range(0, int(20)):
-            draw.rectangle((8, 80, 44, 155), fill = 0)
-            draw.text((8, 80), str(j) , font = font35, fill = 1)
-            draw.text((8, 120), str(20-j) , font = font35, fill = 1)
+            draw.rectangle((8, 80, 48, 155), fill = 255)
+            draw.text((8, 80), str(j) , font = font35, fill = 0)
+            draw.text((8, 120), str(20-j) , font = font35, fill = 0)
             epd.EPD_4IN2_PartialDisplay(8, 80, 42, 155, epd.getbuffer(Himage3))
             time.sleep(2);
-
+            
+    
     '''4Gray display'''
     logging.info("5.4Gray display--------------------------------")
     epd.Init_4Gray()

+ 223 - 169
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd4in2.py

@@ -1,5 +1,5 @@
 # *****************************************************************************
-# * | File        :	  epd4in2.py
+# * | File        :   epd4in2.py
 # * | Author      :   Waveshare team
 # * | Function    :   Electronic paper driver
 # * | Info        :
@@ -56,167 +56,179 @@ class EPD:
         self.GRAY2  = GRAY2
         self.GRAY3  = GRAY3 #gray
         self.GRAY4  = GRAY4 #Blackest
+        self.DATA   = [0x00] * 15000
 
     lut_vcom0 = [
-    0x00, 0x17, 0x00, 0x00, 0x00, 0x02,        
-    0x00, 0x17, 0x17, 0x00, 0x00, 0x02,        
-    0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,        
-    0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,        
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 
     ]
     lut_ww = [
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+    0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     ]
     lut_bw = [
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+    0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     ]
     lut_wb = [
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xA0, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+    0x50, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     ]
     lut_bb = [
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x20, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01, 
+    0x10, 0x08, 0x08, 0x00, 0x00, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     ]
     #******************************partial screen update LUT*********************************/
     EPD_4IN2_Partial_lut_vcom1 =[
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00,	]
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    ]
 
     EPD_4IN2_Partial_lut_ww1 =[
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,]
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    ]
 
     EPD_4IN2_Partial_lut_bw1 =[
-    0x80	,0x19	,0x01	,0x00	,0x00	,0x01,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	]
+    0x20, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    ]
 
     EPD_4IN2_Partial_lut_wb1 =[
-    0x40	,0x19	,0x01	,0x00	,0x00	,0x01,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	]
+    0x10, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    ]
 
     EPD_4IN2_Partial_lut_bb1 =[
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,	]
+    0x00, 0x01,0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    ]
 
     #******************************gray*********************************/
     #0~3 gray
     EPD_4IN2_4Gray_lut_vcom =[
-    0x00	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x60	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x00	,0x00	,0x00	,0x01,
-    0x00	,0x13	,0x0A	,0x01	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00
+    0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
     ]
     #R21
     EPD_4IN2_4Gray_lut_ww =[
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x10	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0xA0	,0x13	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
     ]
-    #R22H	r
+    #R22H r
     EPD_4IN2_4Gray_lut_bw =[
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x99	,0x0C	,0x01	,0x03	,0x04	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
     ]
-    #R23H	w
+    #R23H w
     EPD_4IN2_4Gray_lut_wb =[
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x99	,0x0B	,0x04	,0x04	,0x01	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
     ]
-    #R24H	b
+    #R24H b
     EPD_4IN2_4Gray_lut_bb =[
-    0x80	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x20	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x50	,0x13	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+    0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
     ]
     
     # Hardware reset
     def reset(self):
         epdconfig.digital_write(self.reset_pin, 1)
-        epdconfig.delay_ms(20) 
+        epdconfig.delay_ms(10) 
         epdconfig.digital_write(self.reset_pin, 0)
-        epdconfig.delay_ms(5)
+        epdconfig.delay_ms(10)
         epdconfig.digital_write(self.reset_pin, 1)
-        epdconfig.delay_ms(20)   
+        epdconfig.delay_ms(10)   
         epdconfig.digital_write(self.reset_pin, 0)
-        epdconfig.delay_ms(5)
+        epdconfig.delay_ms(10)
         epdconfig.digital_write(self.reset_pin, 1)
-        epdconfig.delay_ms(20)   
+        epdconfig.delay_ms(10)   
         epdconfig.digital_write(self.reset_pin, 0)
-        epdconfig.delay_ms(5)
+        epdconfig.delay_ms(10)
         epdconfig.digital_write(self.reset_pin, 1)
-        epdconfig.delay_ms(20)
+        epdconfig.delay_ms(10)
 
     def send_command(self, command):
         epdconfig.digital_write(self.dc_pin, 0)
@@ -238,33 +250,33 @@ class EPD:
 
     def set_lut(self):
         self.send_command(0x20)               # vcom
-        for count in range(0, 44):
+        for count in range(0, 36):
             self.send_data(self.lut_vcom0[count])
             
         self.send_command(0x21)         # ww --
-        for count in range(0, 42):
+        for count in range(0, 36):
             self.send_data(self.lut_ww[count])
             
         self.send_command(0x22)         # bw r
-        for count in range(0, 42):
+        for count in range(0, 36):
             self.send_data(self.lut_bw[count])
             
         self.send_command(0x23)         # wb w
-        for count in range(0, 42):
+        for count in range(0, 36):
             self.send_data(self.lut_bb[count])
             
         self.send_command(0x24)         # bb b
-        for count in range(0, 42):
+        for count in range(0, 36):
             self.send_data(self.lut_wb[count])
 
 
     def Partial_SetLut(self):
         self.send_command(0x20);
-        for count in range(0, 44):	     
+        for count in range(0, 44):      
             self.send_data(self.EPD_4IN2_Partial_lut_vcom1[count])
 
         self.send_command(0x21);
-        for count in range(0, 42):	     
+        for count in range(0, 42):      
             self.send_data(self.EPD_4IN2_Partial_lut_ww1[count])
         
         self.send_command(0x22);
@@ -272,29 +284,29 @@ class EPD:
             self.send_data(self.EPD_4IN2_Partial_lut_bw1[count])
 
         self.send_command(0x23);
-        for count in range(0, 42):	     
+        for count in range(0, 42):      
             self.send_data(self.EPD_4IN2_Partial_lut_wb1[count])
 
         self.send_command(0x24);
-        for count in range(0, 42):	     
+        for count in range(0, 42):      
             self.send_data(self.EPD_4IN2_Partial_lut_bb1[count])
 
 
        
     def Gray_SetLut(self):
-        self.send_command(0x20)						#vcom
+        self.send_command(0x20)      #vcom
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_vcom[count]) 
 
-        self.send_command(0x21)						#red not use
+        self.send_command(0x21)      #red not use
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_ww[count]) 
 
-        self.send_command(0x22)							#bw r
+        self.send_command(0x22)       #bw r
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_bw[count]) 
 
-        self.send_command(0x23)							#wb w
+        self.send_command(0x23)       #wb w
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_wb[count]) 
 
@@ -302,7 +314,7 @@ class EPD:
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_bb[count]) 
 
-        self.send_command(0x25)						#vcom
+        self.send_command(0x25)      #vcom
         for count in range(0, 42):
             self.send_data(self.EPD_4IN2_4Gray_lut_ww[count])
       
@@ -329,64 +341,105 @@ class EPD:
         
         self.send_command(0x00) # panel setting
         self.send_data(0xbf) # KW-BF   KWR-AF  BWROTP 0f
-        self.send_data(0x0d)
         
         self.send_command(0x30) # PLL setting
         self.send_data(0x3c) # 3A 100HZ   29 150Hz 39 200HZ  31 171HZ
 
-        self.send_command(0x61)	# resolution setting
+        self.send_command(0x61) # resolution setting
         self.send_data(0x01)
         self.send_data(0x90) # 128
-        self.send_data(0x01)		
+        self.send_data(0x01)  
         self.send_data(0x2c)
 
-        self.send_command(0x82)	# vcom_DC setting
-        self.send_data(0x28)
+        self.send_command(0x82) # vcom_DC setting
+        self.send_data(0x12)
 
-        self.send_command(0X50)	# VCOM AND DATA INTERVAL SETTING
-        self.send_data(0x97) # 97white border 77black border		VBDF 17|D7 VBDW 97 VBDB 57		VBDF F7 VBDW 77 VBDB 37  VBDR B7
+        self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
+        self.send_data(0x97) # 97white border 77black border  VBDF 17|D7 VBDW 97 VBDB 57  VBDF F7 VBDW 77 VBDB 37  VBDR B7
     
         self.set_lut()
         # EPD hardware init end
         return 0
         
+    def init_Partial(self):
+        if (epdconfig.module_init() != 0):
+            return -1
+        # EPD hardware init start
+        self.reset()
+        
+        self.send_command(0x01) # POWER SETTING
+        self.send_data(0x03) # VDS_EN, VDG_EN
+        self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0]
+        self.send_data(0x2b) # VDH
+        self.send_data(0x2b) # VDL
+        
+        self.send_command(0x06) # boost soft start
+        self.send_data(0x17)
+        self.send_data(0x17)
+        self.send_data(0x17)
+        
+        self.send_command(0x04) # POWER_ON
+        self.ReadBusy()
+        
+        self.send_command(0x00) # panel setting
+        self.send_data(0xbf) # KW-BF   KWR-AF  BWROTP 0f
+        
+        self.send_command(0x30) # PLL setting
+        self.send_data(0x3c) # 3A 100HZ   29 150Hz 39 200HZ  31 171HZ
+
+        self.send_command(0x61) # resolution setting
+        self.send_data(0x01)
+        self.send_data(0x90) # 128
+        self.send_data(0x01)  
+        self.send_data(0x2c)
+
+        self.send_command(0x82) # vcom_DC setting
+        self.send_data(0x12)
+
+        self.send_command(0X50) # VCOM AND DATA INTERVAL SETTING
+        self.send_data(0x07) # 97white border 77black border  VBDF 17|D7 VBDW 97 VBDB 57  VBDF F7 VBDW 77 VBDB 37  VBDR B7
+    
+        self.Partial_SetLut();
+        # EPD hardware init end
+        return 0
+        
     def Init_4Gray(self):
         if (epdconfig.module_init() != 0):
             return -1
         # EPD hardware init start
         self.reset()
         
-        self.send_command(0x01)			#POWER SETTING
+        self.send_command(0x01)   #POWER SETTING
         self.send_data (0x03)
         self.send_data (0x00)       #VGH=20V,VGL=-20V
-        self.send_data (0x2b)		#VDH=15V															 
-        self.send_data (0x2b)		#VDL=-15V
+        self.send_data (0x2b)  #VDH=15V                
+        self.send_data (0x2b)  #VDL=-15V
         self.send_data (0x13)
 
         self.send_command(0x06)         #booster soft start
-        self.send_data (0x17)		#A
-        self.send_data (0x17)		#B
-        self.send_data (0x17)		#C 
+        self.send_data (0x17)  #A
+        self.send_data (0x17)  #B
+        self.send_data (0x17)  #C 
 
         self.send_command(0x04)
         self.ReadBusy()
 
-        self.send_command(0x00)			#panel setting
-        self.send_data(0x3f)		#KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f
+        self.send_command(0x00)   #panel setting
+        self.send_data(0x3f)  #KW-3f   KWR-2F BWROTP 0f BWOTP 1f
 
-        self.send_command(0x30)			#PLL setting
-        self.send_data (0x3c)      	#100hz 
+        self.send_command(0x30)   #PLL setting
+        self.send_data (0x3c)       #100hz 
 
-        self.send_command(0x61)			#resolution setting
-        self.send_data (0x01)		#400
-        self.send_data (0x90)     	 
-        self.send_data (0x01)		#300
+        self.send_command(0x61)   #resolution setting
+        self.send_data (0x01)  #400
+        self.send_data (0x90)       
+        self.send_data (0x01)  #300
         self.send_data (0x2c)
 
-        self.send_command(0x82)			#vcom_DC setting
+        self.send_command(0x82)   #vcom_DC setting
         self.send_data (0x12)
 
-        self.send_command(0X50)			#VCOM AND DATA INTERVAL SETTING			
+        self.send_command(0X50)   #VCOM AND DATA INTERVAL SETTING   
         self.send_data(0x97)
 
     def getbuffer(self, image):
@@ -451,7 +504,7 @@ class EPD:
         return buf
 
     def display(self, image):
-        self.send_command(0x92);	
+        self.send_command(0x92); 
         self.set_lut();
         self.send_command(0x10)
         for i in range(0, int(self.width * self.height / 8)):
@@ -478,40 +531,41 @@ class EPD:
         if(X_end % 8 != 0):
             X_end = int(X_end/8)*8+8
         
-        self.Partial_SetLut();
-        self.send_command(0x91);		#This command makes the display enter partial mode
-        self.send_command(0x90);		#resolution setting
+        
+        self.send_command(0x91);  #This command makes the display enter partial mode
+        self.send_command(0x90);  #resolution setting
         self.send_data (int(X_start/256));
         self.send_data (int(X_start%256));   #x-start    
         
-        self.send_data (int(X_end /256));		
+        self.send_data (int(X_end /256));  
         self.send_data (int(X_end %256)-1);  #x-end
 
         self.send_data (int(Y_start/256));
         self.send_data (int(Y_start%256));   #y-start    
         
 
-        self.send_data (int(Y_end/256));		
+        self.send_data (int(Y_end/256));  
         self.send_data (int(Y_end%256)-1);  #y-end
-        self.send_data (0x28);	
+        self.send_data (0x28); 
 
-        self.send_command(0x10);	       #writes Old data to SRAM for programming
+        self.send_command(0x10);        #writes Old data to SRAM for programming
         for j in range(0, int(Y_end - Y_start)):
             for i in range(0, int(X_end/8) - int(X_start/8)):
-                self.send_data(Image[(Y_start + j)*Width + int(X_start/8) + i]);
+                self.send_data(self.DATA[(Y_start + j)*Width + int(X_start/8) + i]);
             
-        self.send_command(0x13);				 #writes New data to SRAM.
+        self.send_command(0x13);     #writes New data to SRAM.
         for j in range(0, int(Y_end - Y_start)):
             for i in range(0, int(X_end/8) - int(X_start/8)):
                 self.send_data(~Image[(Y_start + j)*Width + int(X_start/8) + i]);
+                self.DATA[(Y_start + j)*Width + int(X_start/8) + i] = ~Image[(Y_start + j)*Width + int(X_start/8) + i]
             
-        self.send_command(0x12);		 #DISPLAY REFRESH 		             
+        self.send_command(0x12);   #DISPLAY REFRESH                
         epdconfig.delay_ms(200)    #The delay here is necessary, 200uS at least!!!     
         self.ReadBusy()
 
 
     def display_4Gray(self, image):
-        self.send_command(0x92);	
+        self.send_command(0x92); 
         self.set_lut();
         self.send_command(0x10)
         for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)):                   # EPD_WIDTH * EPD_HEIGHT / 4
@@ -528,7 +582,7 @@ class EPD:
                         temp3 |= 0x01  #gray1
                     else: #0x40
                         temp3 |= 0x00 #gray2
-                    temp3 <<= 1	
+                    temp3 <<= 1 
                     
                     temp1 <<= 2
                     temp2 = temp1&0xC0 
@@ -539,13 +593,13 @@ class EPD:
                     elif(temp2 == 0x80):
                         temp3 |= 0x01 #gray1
                     else :   #0x40
-                            temp3 |= 0x00	#gray2	
-                    if(j!=1 or k!=1):				
+                            temp3 |= 0x00 #gray2 
+                    if(j!=1 or k!=1):    
                         temp3 <<= 1
                     temp1 <<= 2
             self.send_data(temp3)
             
-        self.send_command(0x13)	    
+        self.send_command(0x13)     
                
         for i in range(0, int(EPD_WIDTH * EPD_HEIGHT / 8)):                #5808*4  46464
             temp3=0
@@ -561,7 +615,7 @@ class EPD:
                         temp3 |= 0x00  #gray1
                     else: #0x40
                         temp3 |= 0x01 #gray2
-                    temp3 <<= 1	
+                    temp3 <<= 1 
                     
                     temp1 <<= 2
                     temp2 = temp1&0xC0 
@@ -572,8 +626,8 @@ class EPD:
                     elif(temp2 == 0x80):
                         temp3 |= 0x00 #gray1
                     else:    #0x40
-                            temp3 |= 0x01	#gray2
-                    if(j!=1 or k!=1):					
+                            temp3 |= 0x01 #gray2
+                    if(j!=1 or k!=1):     
                         temp3 <<= 1
                     temp1 <<= 2
             self.send_data(temp3)

文件差异内容过多而无法显示
+ 1797 - 0
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvguix.liuyujian


+ 4 - 3
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvoptx

@@ -145,7 +145,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>ST-LINKIII-KEIL_SWO</Key>
-          <Name>-U38FF6D064246373030270457 -O2254 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103ZE$Flash\STM32F10x_512.FLM)</Name>
+          <Name>-U50FF6E066675545724371487 -O2254 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103ZE$Flash\STM32F10x_512.FLM)</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
       <Breakpoint>
@@ -234,6 +234,7 @@
       <pMultCmdsp></pMultCmdsp>
       <DebugDescription>
         <Enable>1</Enable>
+        <EnableFlashSeq>0</EnableFlashSeq>
         <EnableLog>0</EnableLog>
         <Protocol>2</Protocol>
         <DbgClock>10000000</DbgClock>
@@ -819,7 +820,7 @@
 
   <Group>
     <GroupName>e-Paper</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -1303,7 +1304,7 @@
 
   <Group>
     <GroupName>GUI</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 2 - 1
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvprojx

@@ -16,7 +16,7 @@
         <TargetCommonOption>
           <Device>STM32F103ZE</Device>
           <Vendor>STMicroelectronics</Vendor>
-          <PackID>Keil.STM32F1xx_DFP.2.3.0</PackID>
+          <PackID>Keil.STM32F1xx_DFP.2.1.0</PackID>
           <PackURL>http://www.keil.com/pack/</PackURL>
           <Cpu>IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")</Cpu>
           <FlashUtilSpec></FlashUtilSpec>
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>

+ 26 - 23
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.build_log.htm

@@ -3,58 +3,61 @@
 <pre>
 <h1>µVision Build Log</h1>
 <h2>Tool Versions:</h2>
-IDE-Version: ¦ÌVision V5.25.2.0
+IDE-Version: ¦ÌVision V5.26.2.0
 Copyright (C) 2018 ARM Ltd and ARM Germany GmbH. All rights reserved.
-License Information: ass ass, ass, LIC=JL2UH-W872P-CJR6Z-JYZTW-ESB48-R6YF4
+License Information:  ,  , LIC=RC93N-YLJYL-JJH6S-LI3Z1-D1AV2-99PL8
  
 Tool Versions:
-Toolchain:       MDK-ARM Plus  Version: 5.25.2.0
-Toolchain Path:  D:\Program Files\keil5\ARM\ARMCC\Bin
+Toolchain:       MDK-ARM Plus  Version: 5.26.2.0
+Toolchain Path:  D:\KEIL\azwz\ARM\ARMCC\Bin
 C Compiler:      Armcc.exe V5.06 update 6 (build 750)
 Assembler:       Armasm.exe V5.06 update 6 (build 750)
 Linker/Locator:  ArmLink.exe V5.06 update 6 (build 750)
 Library Manager: ArmAr.exe V5.06 update 6 (build 750)
 Hex Converter:   FromElf.exe V5.06 update 6 (build 750)
-CPU DLL:         SARMCM3.DLL V5.25.2.0
-Dialog DLL:      DCM.DLL V1.17.1.0
-Target DLL:      STLink\ST-LINKIII-KEIL_SWO.dll V3.0.1.0
-Dialog DLL:      TCM.DLL V1.35.1.0
+CPU DLL:         SARMCM3.DLL V5.26.2.0
+Dialog DLL:      DCM.DLL V1.17.2.0
+Target DLL:      STLink\ST-LINKIII-KEIL_SWO.dll V3.0.5.0
+Dialog DLL:      TCM.DLL V1.36.1.0
  
 <h2>Project:</h2>
-E:\github\E-Paper_code\STM32\STM32-F103ZET6\MDK-ARM\epd-demo.uvprojx
-Project File Date:  11/01/2021
+E:\ÏîÄ¿\e-Paper\Code\4.2\bK\E-Paper_code\STM32\STM32-F103ZET6\MDK-ARM\epd-demo.uvprojx
+Project File Date:  01/19/2022
 
 <h2>Output:</h2>
-*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Program Files\keil5\ARM\ARMCC\Bin'
+*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\KEIL\azwz\ARM\ARMCC\Bin'
 Build target 'epd-demo'
-compiling EPD_2in66_test.c...
-compiling GUI_Paint.c...
+compiling EPD_4in2_test.c...
+compiling EPD_4in2.c...
+..\User\e-Paper\EPD_4in2.c(612): warning:  #550-D: variable "Height"  was set but never used
+  	UWORD Width, Height;
+..\User\e-Paper\EPD_4in2.c: 1 warning, 0 errors
 linking...
-Program Size: Code=24312 RO-data=21000 RW-data=76 ZI-data=41140  
+Program Size: Code=25928 RO-data=56420 RW-data=68 ZI-data=56140  
 FromELF: creating hex file...
-"epd-demo\epd-demo.axf" - 0 Error(s), 0 Warning(s).
+"epd-demo\epd-demo.axf" - 0 Error(s), 1 Warning(s).
 
 <h2>Software Packages used:</h2>
 
 Package Vendor: ARM
-                http://www.keil.com/pack/ARM.CMSIS.5.7.0.pack
-                ARM.CMSIS.5.7.0
+                http://www.keil.com/pack/ARM.CMSIS.5.4.0.pack
+                ARM.CMSIS.5.4.0
                 CMSIS (Cortex Microcontroller Software Interface Standard)
-   * Component: CORE Version: 5.4.0
+   * Component: CORE Version: 5.1.2
 
 Package Vendor: Keil
-                http://www.keil.com/pack/Keil.STM32F1xx_DFP.2.3.0.pack
-                Keil.STM32F1xx_DFP.2.3.0
+                http://www.keil.com/pack/Keil.STM32F1xx_DFP.2.1.0.pack
+                Keil.STM32F1xx_DFP.2.1.0
                 STMicroelectronics STM32F1 Series Device Support, Drivers and Examples
 
 <h2>Collection of Component include folders:</h2>
   .\RTE\_epd-demo
-  D:\Program Files\keil5\ARM\PACK\ARM\CMSIS\5.7.0\CMSIS\Core\Include
-  D:\Program Files\keil5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Include
+  D:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.4.0\CMSIS\Core\Include
+  D:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include
 
 <h2>Collection of Component Files used:</h2>
 
-   * Component: ARM::CMSIS:CORE:5.4.0
+   * Component: ARM::CMSIS:CORE:5.1.2
 Build Time Elapsed:  00:00:03
 </pre>
 </body>

文件差异内容过多而无法显示
+ 565 - 495
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.htm


文件差异内容过多而无法显示
+ 436 - 420
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.map


+ 5 - 5
STM32/STM32-F103ZET6/MDK-ARM/startup_stm32f103xe.lst

@@ -580,17 +580,17 @@ ARM Macro Assembler    Page 9
               00000000 
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=epd-demo\startup_stm32f103xe.d -oepd-demo\startup_stm32f103xe.o -I
-.\RTE\_epd-demo -I"D:\Program Files\keil5\ARM\PACK\ARM\CMSIS\5.7.0\CMSIS\Core\I
-nclude" -I"D:\Program Files\keil5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Incl
-ude" --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 525" -
+.\RTE\_epd-demo -ID:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.4.0\CMSIS\Core\Include -ID:
+\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include --predefine="__MICR
+OLIB SETA 1" --predefine="__UVISION_VERSION SETA 526" --predefine="_RTE_ SETA 1
 
 
 
 ARM Macro Assembler    Page 10 
 
 
--predefine="_RTE_ SETA 1" --predefine="STM32F10X_HD SETA 1" --list=startup_stm3
-2f103xe.lst startup_stm32f103xe.s
+" --predefine="STM32F10X_HD SETA 1" --list=startup_stm32f103xe.lst startup_stm3
+2f103xe.s
 
 
 

+ 1 - 1
STM32/STM32-F103ZET6/Src/main.c

@@ -126,7 +126,7 @@ int main(void)
 	
 //		EPD_4in01f_test();	
 		
-//		EPD_4in2_test();
+		EPD_4in2_test();
 //		EPD_4in2bc_test();
 //		EPD_4in2b_V2_test();
 //		EPD_5in65f_test();

+ 48 - 46
STM32/STM32-F103ZET6/User/Examples/EPD_4in2_test.c

@@ -39,7 +39,7 @@ int EPD_4in2_test(void)
     }
 
     printf("e-Paper Init and Clear...\r\n");
-    EPD_4IN2_Init();
+    EPD_4IN2_Init_Fast();
     EPD_4IN2_Clear();
     DEV_Delay_ms(500);
 
@@ -86,8 +86,8 @@ int EPD_4in2_test(void)
     Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
     Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
     Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
-    Paint_DrawString_CN(130, 0, " ÄãºÃabc", &Font12CN, BLACK, WHITE);
-    Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
+    Paint_DrawString_CN(130, 0, " ���abc", &Font12CN, BLACK, WHITE);
+    Paint_DrawString_CN(130, 20, "΢ѩ����", &Font24CN, WHITE, BLACK);
 
     printf("EPD_Display\r\n");
     EPD_4IN2_Display(BlackImage);
@@ -95,12 +95,13 @@ int EPD_4in2_test(void)
 #endif
 	printf("Support for partial refresh, but the refresh effect is not good, but it is not recommended\r\n");
 #if 0
+	EPD_4IN2_Init_Partial();
 	printf("Partial refresh\r\n");
-    PAINT_TIME sPaint_time;
-    sPaint_time.Hour = 12;
-    sPaint_time.Min = 34;
-    sPaint_time.Sec = 56;
-    UBYTE num = 20;
+	PAINT_TIME sPaint_time;
+	sPaint_time.Hour = 12;
+	sPaint_time.Min = 34;
+	sPaint_time.Sec = 56;
+	UBYTE num = 20;
 	for (;;) {
 		sPaint_time.Sec = sPaint_time.Sec + 1;
 		if (sPaint_time.Sec == 60) {
@@ -132,39 +133,39 @@ int EPD_4in2_test(void)
 	free(BlackImage);
 	BlackImage = NULL;
 	Imagesize = ((EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 4 ): (EPD_4IN2_WIDTH / 4 + 1)) * EPD_4IN2_HEIGHT;
-    if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
-        printf("Failed to apply for black memory...\r\n");
-        return -1;
-    }
+	if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
+			printf("Failed to apply for black memory...\r\n");
+			return -1;
+	}
 	Paint_NewImage(BlackImage, EPD_4IN2_WIDTH, EPD_4IN2_HEIGHT, 0, WHITE);
 	Paint_SetScale(4);
 	Paint_Clear(WHITE);
 	
 	Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
-    Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
-    Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
-    Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
-    Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
-    Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
-    Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
-    Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
-    Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL);
-    Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
-    Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
-    Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);
-    Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
-    Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
-    Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
-    Paint_DrawString_CN(140, 0, "ÄãºÃabc", &Font12CN, GRAY1, GRAY4);
-    Paint_DrawString_CN(140, 40, "ÄãºÃabc", &Font12CN, GRAY2, GRAY3);
-    Paint_DrawString_CN(140, 80, "ÄãºÃabc", &Font12CN, GRAY3, GRAY2);
-    Paint_DrawString_CN(140, 120, "ÄãºÃabc", &Font12CN, GRAY4, GRAY1);
-	
-    Paint_DrawString_CN(220, 0, "΢ѩµç×Ó", &Font24CN, GRAY1, GRAY4);
-    Paint_DrawString_CN(220, 40, "΢ѩµç×Ó", &Font24CN, GRAY2, GRAY3);
-    Paint_DrawString_CN(220, 80, "΢ѩµç×Ó", &Font24CN, GRAY3, GRAY2);
-    Paint_DrawString_CN(220, 120, "΢ѩµç×Ó", &Font24CN, GRAY4, GRAY1);
-	
+	Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+	Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+	Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+	Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+	Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+	Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+	Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+	Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+	Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+	Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+	Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);
+	Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
+	Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
+	Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
+	Paint_DrawString_CN(140, 0, "���abc", &Font12CN, GRAY1, GRAY4);
+	Paint_DrawString_CN(140, 40, "���abc", &Font12CN, GRAY2, GRAY3);
+	Paint_DrawString_CN(140, 80, "���abc", &Font12CN, GRAY3, GRAY2);
+	Paint_DrawString_CN(140, 120, "���abc", &Font12CN, GRAY4, GRAY1);
+
+	Paint_DrawString_CN(220, 0, "΢ѩ����", &Font24CN, GRAY1, GRAY4);
+	Paint_DrawString_CN(220, 40, "΢ѩ����", &Font24CN, GRAY2, GRAY3);
+	Paint_DrawString_CN(220, 80, "΢ѩ����", &Font24CN, GRAY3, GRAY2);
+	Paint_DrawString_CN(220, 120, "΢ѩ����", &Font24CN, GRAY4, GRAY1);
+
 	EPD_4IN2_4GrayDisplay(BlackImage);
 	DEV_Delay_ms(500);
 	
@@ -172,18 +173,19 @@ int EPD_4in2_test(void)
   EPD_4IN2_4GrayDisplay(gImage_4in2_4Gray);
 	DEV_Delay_ms(2000);
 
-	
+
 	EPD_4IN2_Clear();
 	
-    printf("Goto Sleep...\r\n");
-    EPD_4IN2_Sleep();
-    free(BlackImage);
-    BlackImage = NULL;
+	EPD_4IN2_Init_Fast();
+	printf("Goto Sleep...\r\n");
+	EPD_4IN2_Sleep();
+	free(BlackImage);
+	BlackImage = NULL;
+
+	// close 5V
+	printf("close 5V, Module enters 0 power consumption ...\r\n");
+	DEV_Module_Exit();
 	
-    // close 5V
-    printf("close 5V, Module enters 0 power consumption ...\r\n");
-    DEV_Module_Exit();
-    
-    return 0;
+	return 0;
 }
 

+ 432 - 379
STM32/STM32-F103ZET6/User/e-Paper/EPD_4in2.c

@@ -113,177 +113,184 @@
 #include "Debug.h"
 
 static const unsigned char EPD_4IN2_lut_vcom0[] = {
-    0x00, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x00, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x00, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x00, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x00, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 					
+	};
 static const unsigned char EPD_4IN2_lut_ww[] = {
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	};
 static const unsigned char EPD_4IN2_lut_bw[] = {
-    0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	};
 static const unsigned char EPD_4IN2_lut_wb[] = {
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x50, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	};
 static const unsigned char EPD_4IN2_lut_bb[] = {
-    0x80, 0x17, 0x00, 0x00, 0x00, 0x02,
-    0x90, 0x17, 0x17, 0x00, 0x00, 0x02,
-    0x80, 0x0A, 0x01, 0x00, 0x00, 0x01,
-    0x50, 0x0E, 0x0E, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+	0x20, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,	
+	0x10, 0x08, 0x08, 0x00, 0x00, 0x02,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	
+	};
 
 /******************************partial screen update LUT*********************************/
-const unsigned char EPD_4IN2_Partial_lut_vcom1[] = {
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00,
+const unsigned char EPD_4IN2_Partial_lut_vcom1[] ={
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
-const unsigned char EPD_4IN2_Partial_lut_ww1[] = {
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_Partial_lut_ww1[] ={
+    0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
-const unsigned char EPD_4IN2_Partial_lut_bw1[] = {
-    0x80	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_Partial_lut_bw1[] ={
+    0x20, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 };
 
-const unsigned char EPD_4IN2_Partial_lut_wb1[] = {
-    0x40	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_Partial_lut_wb1[] ={
+    0x10, 0x01, 0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 };
 
-const unsigned char EPD_4IN2_Partial_lut_bb1[] = {
-    0x00	,0x19	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_Partial_lut_bb1[] ={
+    0x00, 0x01,0x20, 0x01, 0x00, 0x01, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00,0x00, 0x00, 0x00, 0x00, 
 };
 
+
 /******************************gray*********************************/
 //0~3 gray
-const unsigned char EPD_4IN2_4Gray_lut_vcom[] = {
-    0x00	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x60	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x00	,0x00	,0x00	,0x01,
-    0x00	,0x13	,0x0A	,0x01	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00
-
+const unsigned char EPD_4IN2_4Gray_lut_vcom[] =
+{
+    0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
+				
 };
 //R21
-const unsigned char EPD_4IN2_4Gray_lut_ww[] = {
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x10	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0xA0	,0x13	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_4Gray_lut_ww[] ={
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R22H	r
-const unsigned char EPD_4IN2_4Gray_lut_bw[] = {
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x99	,0x0C	,0x01	,0x03	,0x04	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_4Gray_lut_bw[] ={
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R23H	w
-const unsigned char EPD_4IN2_4Gray_lut_wb[] = {
-    0x40	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x00	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x99	,0x0B	,0x04	,0x04	,0x01	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_4Gray_lut_wb[] ={
+    0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 //R24H	b
-const unsigned char EPD_4IN2_4Gray_lut_bb[] = {
-    0x80	,0x0A	,0x00	,0x00	,0x00	,0x01,
-    0x90	,0x14	,0x14	,0x00	,0x00	,0x01,
-    0x20	,0x14	,0x0A	,0x00	,0x00	,0x01,
-    0x50	,0x13	,0x01	,0x00	,0x00	,0x01,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
-    0x00	,0x00	,0x00	,0x00	,0x00	,0x00,
+const unsigned char EPD_4IN2_4Gray_lut_bb[] ={
+    0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
+    0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
+    0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
+    0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
+    0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
 };
 
-
 /******************************************************************************
 function :	Software reset
 parameter:
 ******************************************************************************/
 static void EPD_4IN2_Reset(void)
 {
-    DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
+
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
+	
     DEV_Digital_Write(EPD_RST_PIN, 0);
-    DEV_Delay_ms(2);
+    DEV_Delay_ms(10);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-    DEV_Delay_ms(20);
+    DEV_Delay_ms(10);
 }
 
 /******************************************************************************
@@ -319,9 +326,9 @@ parameter:
 void EPD_4IN2_ReadBusy(void)
 {
     Debug("e-Paper busy\r\n");
-    EPD_4IN2_SendCommand(0x71);
+	EPD_4IN2_SendCommand(0x71);
     while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) {      //LOW: idle, HIGH: busy
-        EPD_4IN2_SendCommand(0x71);
+		EPD_4IN2_SendCommand(0x71);
         DEV_Delay_ms(100);
     }
     Debug("e-Paper busy release\r\n");
@@ -342,105 +349,90 @@ static void EPD_4IN2_TurnOnDisplay(void)
 function :	set the look-up tables
 parameter:
 ******************************************************************************/
-static void EPD_4IN2_SetLut(void)
+static void EPD_4IN2_Partial_SetLut(void)
 {
-    UWORD count;
-    EPD_4IN2_SendCommand(0x20);         //g vcom
-    for(count=0; count<44; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_vcom0[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x21);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_ww[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x22);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_bw[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x23);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_wb[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x24);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_lut_bb[count]);
-    }
+	unsigned int count;
+	EPD_4IN2_SendCommand(0x20);
+	for(count=0;count<44;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_vcom1[count]);}
+
+	EPD_4IN2_SendCommand(0x21);
+	for(count=0;count<42;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_ww1[count]);}   
+	
+	EPD_4IN2_SendCommand(0x22);
+	for(count=0;count<42;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bw1[count]);} 
+
+	EPD_4IN2_SendCommand(0x23);
+	for(count=0;count<42;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_wb1[count]);} 
+
+	EPD_4IN2_SendCommand(0x24);
+	for(count=0;count<42;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bb1[count]);} 
 }
 
-static void EPD_4IN2_Partial_SetLut(void)
+static void EPD_4IN2_SetLut(void)
 {
-    unsigned int count;
-    EPD_4IN2_SendCommand(0x20);
-    for(count=0; count<44; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_Partial_lut_vcom1[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x21);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_Partial_lut_ww1[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x22);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bw1[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x23);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_Partial_lut_wb1[count]);
-    }
-
-    EPD_4IN2_SendCommand(0x24);
-    for(count=0; count<42; count++) {
-        EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bb1[count]);
-    }
+	unsigned int count;
+	EPD_4IN2_SendCommand(0x20);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_vcom0[count]);}
+
+	EPD_4IN2_SendCommand(0x21);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_ww[count]);}   
+	
+	EPD_4IN2_SendCommand(0x22);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_bw[count]);} 
+
+	EPD_4IN2_SendCommand(0x23);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_wb[count]);} 
+
+	EPD_4IN2_SendCommand(0x24);
+	for(count=0;count<36;count++)	     
+		{EPD_4IN2_SendData(EPD_4IN2_lut_bb[count]);}   
 }
 
 //LUT download
 static void EPD_4IN2_4Gray_lut(void)
 {
-    unsigned int count;
-    {
-        EPD_4IN2_SendCommand(0x20);							//vcom
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_vcom[count]);
-        }
-
-        EPD_4IN2_SendCommand(0x21);							//red not use
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);
-        }
-
-        EPD_4IN2_SendCommand(0x22);							//bw r
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bw[count]);
-        }
-
-        EPD_4IN2_SendCommand(0x23);							//wb w
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_wb[count]);
-        }
-
-        EPD_4IN2_SendCommand(0x24);							//bb b
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bb[count]);
-        }
-
-        EPD_4IN2_SendCommand(0x25);							//vcom
-        for(count=0; count<42; count++) {
-            EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);
-        }
-    }
+	unsigned int count;	 
+	{
+		EPD_4IN2_SendCommand(0x20);							//vcom
+		for(count=0;count<42;count++)
+			{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_vcom[count]);}
+		
+	EPD_4IN2_SendCommand(0x21);							//red not use
+	for(count=0;count<42;count++)
+		{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);}
+
+		EPD_4IN2_SendCommand(0x22);							//bw r
+		for(count=0;count<42;count++)
+			{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bw[count]);}
+
+		EPD_4IN2_SendCommand(0x23);							//wb w
+		for(count=0;count<42;count++)
+			{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_wb[count]);}
+
+		EPD_4IN2_SendCommand(0x24);							//bb b
+		for(count=0;count<42;count++)
+			{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bb[count]);}
+
+		EPD_4IN2_SendCommand(0x25);							//vcom
+		for(count=0;count<42;count++)
+			{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);}
+	}	         
 }
 /******************************************************************************
 function :	Initialize the e-Paper register
 parameter:
 ******************************************************************************/
-void EPD_4IN2_Init(void)
+
+void EPD_4IN2_Init_Partial(void)
 {
     EPD_4IN2_Reset();
 
@@ -460,7 +452,6 @@ void EPD_4IN2_Init(void)
 
     EPD_4IN2_SendCommand(0x00); // panel setting
     EPD_4IN2_SendData(0xbf); // KW-BF   KWR-AF	BWROTP 0f	BWOTP 1f
-    EPD_4IN2_SendData(0x0d);
 
     EPD_4IN2_SendCommand(0x30); // PLL setting
     EPD_4IN2_SendData(0x3C); // 3A 100HZ   29 150Hz 39 200HZ	31 171HZ
@@ -472,49 +463,91 @@ void EPD_4IN2_Init(void)
     EPD_4IN2_SendData(0x2c);
 
     EPD_4IN2_SendCommand(0x82); // vcom_DC setting
-    EPD_4IN2_SendData(0x28);
+    EPD_4IN2_SendData(0x12);
 
     EPD_4IN2_SendCommand(0X50); // VCOM AND DATA INTERVAL SETTING
-    EPD_4IN2_SendData(0x97); // 97white border 77black border		VBDF 17|D7 VBDW 97 VBDB 57		VBDF F7 VBDW 77 VBDB 37  VBDR B7
+    EPD_4IN2_SendData(0x07); // 97white border 77black border		VBDF 17|D7 VBDW 97 VBDB 57		VBDF F7 VBDW 77 VBDB 37  VBDR B7
 
-    EPD_4IN2_SetLut();
+    EPD_4IN2_Partial_SetLut();
 }
 
-void EPD_4IN2_Init_4Gray(void)
+//UC8176C
+void EPD_4IN2_Init_Fast(void)
 {
-    EPD_4IN2_Reset();
-    EPD_4IN2_SendCommand(0x01);			//POWER SETTING
-    EPD_4IN2_SendData (0x03);
-    EPD_4IN2_SendData (0x00);       //VGH=20V,VGL=-20V
-    EPD_4IN2_SendData (0x2b);		//VDH=15V
-    EPD_4IN2_SendData (0x2b);		//VDL=-15V
-    EPD_4IN2_SendData (0x13);
-
-    EPD_4IN2_SendCommand(0x06);         //booster soft start
-    EPD_4IN2_SendData (0x17);		//A
-    EPD_4IN2_SendData (0x17);		//B
-    EPD_4IN2_SendData (0x17);		//C
-
-    EPD_4IN2_SendCommand(0x04);
-    EPD_4IN2_ReadBusy();
+	EPD_4IN2_Reset();
+	EPD_4IN2_SendCommand(0x01);			//POWER SETTING 
+	EPD_4IN2_SendData (0x03);	          
+	EPD_4IN2_SendData (0x00);
+	EPD_4IN2_SendData (0x2b);  
+	EPD_4IN2_SendData (0x2b);
+
+	EPD_4IN2_SendCommand(0x06);         //boost soft start
+	EPD_4IN2_SendData (0x17);		//A
+	EPD_4IN2_SendData (0x17);		//B
+	EPD_4IN2_SendData (0x17);		//C       
 
-    EPD_4IN2_SendCommand(0x00);			//panel setting
-    EPD_4IN2_SendData(0x3f);		//KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f
+	EPD_4IN2_SendCommand(0x04);  
+	EPD_4IN2_ReadBusy();
 
-    EPD_4IN2_SendCommand(0x30);			//PLL setting
-    EPD_4IN2_SendData (0x3c);      	//100hz
+	EPD_4IN2_SendCommand(0x00);			//panel setting
+	EPD_4IN2_SendData(0xbf);		//KW-bf   KWR-2F	BWROTP 0f	BWOTP 1f
 
-    EPD_4IN2_SendCommand(0x61);			//resolution setting
-    EPD_4IN2_SendData (0x01);		//400
-    EPD_4IN2_SendData (0x90);
-    EPD_4IN2_SendData (0x01);		//300
-    EPD_4IN2_SendData (0x2c);
 
-    EPD_4IN2_SendCommand(0x82);			//vcom_DC setting
-    EPD_4IN2_SendData (0x12);
+	EPD_4IN2_SendCommand(0x30);			
+	EPD_4IN2_SendData (0x3c);      	// 3A 100HZ   29 150Hz 39 200HZ	31 171HZ
 
-    EPD_4IN2_SendCommand(0X50);			//VCOM AND DATA INTERVAL SETTING
-    EPD_4IN2_SendData(0x97);
+	EPD_4IN2_SendCommand(0x61);			//resolution setting
+	EPD_4IN2_SendData (0x01);        	 
+	EPD_4IN2_SendData (0x90);	 //400	
+	EPD_4IN2_SendData (0x01);	 //300
+	EPD_4IN2_SendData (0x2c);	   
+
+
+	EPD_4IN2_SendCommand(0x82);			//vcom_DC setting  	
+	EPD_4IN2_SendData (0x12);	
+
+	EPD_4IN2_SendCommand(0X50);
+	EPD_4IN2_SendData(0x97);
+
+	EPD_4IN2_SetLut();		
+		
+}	
+
+void EPD_4IN2_Init_4Gray(void)
+{
+	EPD_4IN2_Reset();
+	EPD_4IN2_SendCommand(0x01);			//POWER SETTING
+	EPD_4IN2_SendData (0x03);
+	EPD_4IN2_SendData (0x00);       //VGH=20V,VGL=-20V
+	EPD_4IN2_SendData (0x2b);		//VDH=15V															 
+	EPD_4IN2_SendData (0x2b);		//VDL=-15V
+	EPD_4IN2_SendData (0x13);
+
+	EPD_4IN2_SendCommand(0x06);         //booster soft start
+	EPD_4IN2_SendData (0x17);		//A
+	EPD_4IN2_SendData (0x17);		//B
+	EPD_4IN2_SendData (0x17);		//C 
+
+	EPD_4IN2_SendCommand(0x04);
+	EPD_4IN2_ReadBusy();
+
+	EPD_4IN2_SendCommand(0x00);			//panel setting
+	EPD_4IN2_SendData(0x3f);		//KW-3f   KWR-2F	BWROTP 0f	BWOTP 1f
+
+	EPD_4IN2_SendCommand(0x30);			//PLL setting
+	EPD_4IN2_SendData (0x3c);      	//100hz 
+
+	EPD_4IN2_SendCommand(0x61);			//resolution setting
+	EPD_4IN2_SendData (0x01);		//400
+	EPD_4IN2_SendData (0x90);     	 
+	EPD_4IN2_SendData (0x01);		//300
+	EPD_4IN2_SendData (0x2c);
+
+	EPD_4IN2_SendCommand(0x82);			//vcom_DC setting
+	EPD_4IN2_SendData (0x12);
+
+	EPD_4IN2_SendCommand(0X50);			//VCOM AND DATA INTERVAL SETTING			
+	EPD_4IN2_SendData(0x97);
 }
 /******************************************************************************
 function :	Clear screen
@@ -539,8 +572,9 @@ void EPD_4IN2_Clear(void)
             EPD_4IN2_SendData(0xFF);
         }
     }
-    EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH
-    DEV_Delay_ms(10);
+
+	EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH 		
+	DEV_Delay_ms(1);	
     EPD_4IN2_TurnOnDisplay();
 }
 
@@ -554,6 +588,13 @@ void EPD_4IN2_Display(UBYTE *Image)
     Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
     Height = EPD_4IN2_HEIGHT;
 
+	EPD_4IN2_SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2_SendData(0x00);
+        }
+    }
+
     EPD_4IN2_SendCommand(0x13);
     for (UWORD j = 0; j < Height; j++) {
         for (UWORD i = 0; i < Width; i++) {
@@ -561,143 +602,151 @@ void EPD_4IN2_Display(UBYTE *Image)
         }
     }
 
+	EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH 		
+	DEV_Delay_ms(10);		
     EPD_4IN2_TurnOnDisplay();
 }
 
 void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end, UBYTE *Image)
 {
-    UWORD Width;
-    Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
-
-    X_start = (X_start % 8 == 0)? (X_start): (X_start/8*8+8);
-    X_end = (X_end % 8 == 0)? (X_end): (X_end/8*8+8);
-
-    EPD_4IN2_SendCommand(0X50);
-    EPD_4IN2_SendData(0xf7);
-    DEV_Delay_ms(100);
-
-    EPD_4IN2_SendCommand(0x82);			//vcom_DC setting
-    EPD_4IN2_SendData (0x08);
-    EPD_4IN2_SendCommand(0X50);
-    EPD_4IN2_SendData(0x47);
-    EPD_4IN2_Partial_SetLut();
-    EPD_4IN2_SendCommand(0x91);		//This command makes the display enter partial mode
-    EPD_4IN2_SendCommand(0x90);		//resolution setting
-    EPD_4IN2_SendData ((X_start)/256);
-    EPD_4IN2_SendData ((X_start)%256);   //x-start
-
-    EPD_4IN2_SendData ((X_end )/256);
-    EPD_4IN2_SendData ((X_end )%256-1);  //x-end
-
-    EPD_4IN2_SendData (Y_start/256);
-    EPD_4IN2_SendData (Y_start%256);   //y-start
-
-    EPD_4IN2_SendData (Y_end/256);
-    EPD_4IN2_SendData (Y_end%256-1);  //y-end
-    EPD_4IN2_SendData (0x28);
-
-    EPD_4IN2_SendCommand(0x10);	       //writes Old data to SRAM for programming
-    for (UWORD j = 0; j < Y_end - Y_start; j++) {
-        for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
-            EPD_4IN2_SendData(Image[(Y_start + j)*Width + X_start/8 + i]);
-        }
-    }
-    EPD_4IN2_SendCommand(0x13);				 //writes New data to SRAM.
-    for (UWORD j = 0; j < Y_end - Y_start; j++) {
-        for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
-            EPD_4IN2_SendData(~Image[(Y_start + j)*Width + X_start/8 + i]);
-        }
-    }
-
-    EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH
-    DEV_Delay_ms(10);     //The delay here is necessary, 200uS at least!!!
-    EPD_4IN2_TurnOnDisplay();
+	UWORD Width, Height;
+	static UBYTE DATA[EPD_4IN2_WIDTH * EPD_4IN2_HEIGHT / 8] = {0x00};
+
+	Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
+	Height = EPD_4IN2_HEIGHT;
+	
+	X_start = (X_start % 8 == 0)? (X_start): (X_start/8*8+8);
+	X_end = (X_end % 8 == 0)? (X_end): (X_end/8*8+8);
+	
+
+	EPD_4IN2_SendCommand(0x91);		//This command makes the display enter partial mode
+	EPD_4IN2_SendCommand(0x90);		//resolution setting
+	EPD_4IN2_SendData ((X_start)/256);
+	EPD_4IN2_SendData ((X_start)%256);   //x-start    
+
+	EPD_4IN2_SendData ((X_end )/256);		
+	EPD_4IN2_SendData ((X_end )%256-1);  //x-end
+
+	EPD_4IN2_SendData (Y_start/256);
+	EPD_4IN2_SendData (Y_start%256);   //y-start    
+
+	EPD_4IN2_SendData (Y_end/256);		
+	EPD_4IN2_SendData (Y_end%256-1);  //y-end
+	EPD_4IN2_SendData (0x28);	
+
+	EPD_4IN2_SendCommand(0x10);	       //writes Old data to SRAM for programming
+	for (UWORD j = 0; j < Y_end - Y_start; j++) {
+			for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
+					EPD_4IN2_SendData(DATA[(Y_start + j)*Width + X_start/8 + i]);
+			}
+	}
+	EPD_4IN2_SendCommand(0x13);				 //writes New data to SRAM.
+	for (UWORD j = 0; j < Y_end - Y_start; j++) {
+			for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
+					EPD_4IN2_SendData(~Image[(Y_start + j)*Width + X_start/8 + i]);
+		DATA[(Y_start + j)*Width + X_start/8 + i] = ~Image[(Y_start + j)*Width + X_start/8 + i];
+			}
+	}
+
+	EPD_4IN2_SendCommand(0x12);		 //DISPLAY REFRESH 		             
+	DEV_Delay_ms(10);     //The delay here is necessary, 200uS at least!!!     
+	EPD_4IN2_TurnOnDisplay();
 }
 
 void EPD_4IN2_4GrayDisplay(const UBYTE *Image)
 {
-    UDOUBLE i,j,k;
+    UDOUBLE i,j,k,m;
     UBYTE temp1,temp2,temp3;
-    /****Color display description****
-          white  gray1  gray2  black
-    0x10|  01     01     00     00
-    0x13|  01     00     01     00
-    *********************************/
-    EPD_4IN2_SendCommand(0x10);
-
-    for(i=0; i<15000; i++) {             //5808*4  46464
-        temp3=0;
-        for(j=0; j<2; j++) {
-            temp1 = Image[i*2+j];
-            for(k=0; k<2; k++) {
-                temp2 = temp1&0xC0 ;
-                if(temp2 == 0xC0)
-                    temp3 |= 0x01;//white
-                else if(temp2 == 0x00)
-                    temp3 |= 0x00;  //black
-                else if(temp2 == 0x80)
-                    temp3 |= 0x01;  //gray1
-                else //0x40
-                    temp3 |= 0x00; //gray2
-                temp3 <<= 1;
-
-                temp1 <<= 2;
-                temp2 = temp1&0xC0 ;
-                if(temp2 == 0xC0)  //white
-                    temp3 |= 0x01;
-                else if(temp2 == 0x00) //black
-                    temp3 |= 0x00;
-                else if(temp2 == 0x80)
-                    temp3 |= 0x01; //gray1
-                else    //0x40
-                    temp3 |= 0x00;	//gray2
-                if(j!=1 || k!=1)
-                    temp3 <<= 1;
-
-                temp1 <<= 2;
-            }
-
-        }
-        EPD_4IN2_SendData(temp3);
-    }
+/****Color display description****
+      white  gray1  gray2  black
+0x10|  01     01     00     00
+0x13|  01     00     01     00
+*********************************/
+	EPD_4IN2_SendCommand(0x10);	       
+	// EPD_4IN2_HEIGHT
+	// EPD_4IN2_WIDTH
+	for(m = 0; m<EPD_4IN2_HEIGHT;m++)
+		for(i=0;i<EPD_4IN2_WIDTH/8;i++)
+		{
+			temp3=0;
+			for(j=0;j<2;j++)	
+			{
+				
+				temp1 = Image[(m*(EPD_4IN2_WIDTH/8)+i)*2+j];
+				for(k=0;k<2;k++)	
+				{
+					temp2 = temp1&0xC0 ;
+					if(temp2 == 0xC0)
+						temp3 |= 0x01;//white
+					else if(temp2 == 0x00)
+						temp3 |= 0x00;  //black
+					else if(temp2 == 0x80) 
+						temp3 |= 0x01;  //gray1
+					else //0x40
+						temp3 |= 0x00; //gray2
+					temp3 <<= 1;	
+					
+					temp1 <<= 2;
+					temp2 = temp1&0xC0 ;
+					if(temp2 == 0xC0)  //white
+						temp3 |= 0x01;
+					else if(temp2 == 0x00) //black
+						temp3 |= 0x00;
+					else if(temp2 == 0x80)
+						temp3 |= 0x01; //gray1
+					else    //0x40
+							temp3 |= 0x00;	//gray2	
+					if(j!=1 || k!=1)				
+						temp3 <<= 1;
+					
+					temp1 <<= 2;
+				}
+				
+			 }
+			EPD_4IN2_SendData(temp3);			
+		}
     // new  data
-    EPD_4IN2_SendCommand(0x13);
-    for(i=0; i<15000; i++) {             //5808*4  46464
-        temp3=0;
-        for(j=0; j<2; j++) {
-            temp1 = Image[i*2+j];
-            for(k=0; k<2; k++) {
-                temp2 = temp1&0xC0 ;
-                if(temp2 == 0xC0)
-                    temp3 |= 0x01;//white
-                else if(temp2 == 0x00)
-                    temp3 |= 0x00;  //black
-                else if(temp2 == 0x80)
-                    temp3 |= 0x00;  //gray1
-                else //0x40
-                    temp3 |= 0x01; //gray2
-                temp3 <<= 1;
-
-                temp1 <<= 2;
-                temp2 = temp1&0xC0 ;
-                if(temp2 == 0xC0)  //white
-                    temp3 |= 0x01;
-                else if(temp2 == 0x00) //black
-                    temp3 |= 0x00;
-                else if(temp2 == 0x80)
-                    temp3 |= 0x00; //gray1
-                else    //0x40
-                    temp3 |= 0x01;	//gray2
-                if(j!=1 || k!=1)
-                    temp3 <<= 1;
-
-                temp1 <<= 2;
-            }
-
-        }
-        EPD_4IN2_SendData(temp3);
-    }
-
+    EPD_4IN2_SendCommand(0x13);	 
+	for(m = 0; m<EPD_4IN2_HEIGHT;m++)
+		for(i=0;i<EPD_4IN2_WIDTH/8;i++)
+		{
+			temp3=0;
+			for(j=0;j<2;j++)	
+			{
+				temp1 = Image[(m*(EPD_4IN2_WIDTH/8)+i)*2+j];
+				for(k=0;k<2;k++)	
+				{
+					temp2 = temp1&0xC0 ;
+					if(temp2 == 0xC0)
+						temp3 |= 0x01;//white
+					else if(temp2 == 0x00)
+						temp3 |= 0x00;  //black
+					else if(temp2 == 0x80) 
+						temp3 |= 0x00;  //gray1
+					else //0x40
+						temp3 |= 0x01; //gray2
+					temp3 <<= 1;	
+					
+					temp1 <<= 2;
+					temp2 = temp1&0xC0 ;
+					if(temp2 == 0xC0)  //white
+						temp3 |= 0x01;
+					else if(temp2 == 0x00) //black
+						temp3 |= 0x00;
+					else if(temp2 == 0x80)
+						temp3 |= 0x00; //gray1
+					else    //0x40
+							temp3 |= 0x01;	//gray2
+					if(j!=1 || k!=1)					
+						temp3 <<= 1;
+					
+					temp1 <<= 2;
+				}
+				
+			 }
+			EPD_4IN2_SendData(temp3);	
+		}
+    
     EPD_4IN2_4Gray_lut();
     EPD_4IN2_TurnOnDisplay();
 }
@@ -707,8 +756,12 @@ parameter:
 ******************************************************************************/
 void EPD_4IN2_Sleep(void)
 {
+	EPD_4IN2_SendCommand(0x50); // DEEP_SLEEP
+    EPD_4IN2_SendData(0XF7);
+
     EPD_4IN2_SendCommand(0x02); // POWER_OFF
     EPD_4IN2_ReadBusy();
+
     EPD_4IN2_SendCommand(0x07); // DEEP_SLEEP
     EPD_4IN2_SendData(0XA5);
 }

+ 4 - 1
STM32/STM32-F103ZET6/User/e-Paper/EPD_4in2.h

@@ -118,7 +118,8 @@
 #define EPD_4IN2_WIDTH       400
 #define EPD_4IN2_HEIGHT      300
 
-void EPD_4IN2_Init(void);
+void EPD_4IN2_Init_Fast(void);
+void EPD_4IN2_Init_Partial(void);
 void EPD_4IN2_Clear(void);
 void EPD_4IN2_Display(UBYTE *Image);
 void EPD_4IN2_Sleep(void);
@@ -126,4 +127,6 @@ void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end
 
 void EPD_4IN2_Init_4Gray(void);
 void EPD_4IN2_4GrayDisplay(const UBYTE *Image);
+
+
 #endif

部分文件因为文件数量过多而无法显示