Просмотр исходного кода

Version 1.1.6

added support for GDEH0213B72 2.13" b/w, replacement for GDE0213B1
ZinggJM 7 лет назад
Родитель
Сommit
77a9546b36

BIN
MyEPDs_UpdateInfos.pdf


+ 12 - 0
README.md

@@ -38,10 +38,18 @@
 - Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 - Good Dispay ePaper for Arduino : https://forum.arduino.cc/index.php?topic=436411.0
 
+### Note on documentation
+- GxEPD2 uses Adafruit_GFX for Graphics and Text support, which is well documented there
+- GxEPD2 uses meaningful method names, and has some comments in the header files
+- consult the header files GxEPD2_BW.h, GxEPD2_3C.h and GxEPD2_GFX.h
+- for the concept of paged drawing and picture loop see: 
+- https://github.com/olikraus/u8glib/wiki/tpictureloop
+
 ### Supported SPI e-paper panels from Good Display:
 - GDEP015OC1      1.54" b/w
 - GDEW0154Z04   1.54" b/w/r 200x200
 - GDE0213B1         2.13" b/w
+- GDEH0213B72       2.13" b/w, replacement for GDE0213B1
 - GDEW0213I5F    2.13" b/w flexible
 - GDEW0213Z16   2.13" b/w/r
 - GDEH029A1        2.9" b/w
@@ -58,6 +66,10 @@
 #### other supported panels
 - ED060SCT        6" grey levels, on Waveshare e-Paper IT8951 Driver HAT
 
+### Version 1.1.6
+- added support for GDEH0213B72 2.13" b/w, replacement for GDE0213B1
+- changed SPI speed for IT8951 Driver HAT to 24MHz for write, 10MHz for read
+- minor fixes, e.g. centering of text bounding box in GxEPD2_Example
 #### Version 1.1.5
 - added support for 6" ED060SCT on Waveshare e-Paper IT8951 Driver HAT
 - uses 3.3V data lines, but 5V supply (~80mA active, ~20mA stand-by, sleep doesn't work)

+ 115 - 47
examples/GxEPD2_Example/GxEPD2_Example.ino

@@ -51,7 +51,8 @@
 #if defined (ESP8266)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
-//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
 //GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029T5
@@ -78,7 +79,8 @@
 // ***** for mapping of Waveshare e-Paper ESP8266 Driver Board *****
 // select one , can use full buffer size (full HEIGHT)
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16));
-//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16));
 //GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029T5
@@ -102,7 +104,8 @@
 #if defined(ESP32)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
-//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
 //GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029T5
@@ -127,7 +130,8 @@
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1));
-//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1));
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1));
 //GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW029T5
@@ -151,7 +155,8 @@
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
-//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
 //GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5
@@ -174,7 +179,8 @@
 // NOTE: the 11-pinholes for pin connectors are not through level converter, and the VCC pin is 5V, only FCP connector pins are through level converter
 // select one and adapt to your mapping
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7));
-//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7));
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7));
 //GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029T5
@@ -200,6 +206,7 @@
 
 // comment out unused bitmaps to reduce code space used
 #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
+#include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
 #include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
 #include "bitmaps/Bitmaps128x296.h" // 2.9"  b/w
 #include "bitmaps/Bitmaps176x264.h" // 2.7"  b/w
@@ -219,6 +226,7 @@
 
 // select only one to fit in code space
 #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
+//#include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
 //#include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
 //#include "bitmaps/Bitmaps128x296.h" // 2.9"  b/w
 //#include "bitmaps/Bitmaps176x264.h" // 2.7"  b/w
@@ -271,6 +279,11 @@ void loop()
 {
 }
 
+// note for partial update window and setPartialWindow() method:
+// partial update window size and position is on byte boundary in physical x direction
+// the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation
+// see also comment in GxEPD2_BW.h, GxEPD2_3C.h or GxEPD2_GFX.h for method setPartialWindow()
+
 const char HelloWorld[] = "Hello World!";
 const char HelloArduino[] = "Hello Arduino!";
 const char HelloEpaper[] = "Hello E-Paper!";
@@ -283,8 +296,9 @@ void helloWorld()
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  // center bounding box by transposition of origin:
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   display.setFullWindow();
   display.firstPage();
   do
@@ -311,10 +325,10 @@ void helloWorldForDummies()
   display.setTextColor(GxEPD_BLACK);
   // Adafruit_GFX has a handy method getTextBounds() to determine the boundary box for a text for the actual font
   int16_t tbx, tby; uint16_t tbw, tbh; // boundary box window
-  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for 0, 0, fortunately (negative tby!)
-  // center the boundary box of the text
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for origin 0, 0, fortunately (negative tby!)
+  // center bounding box by transposition of origin:
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   // full window mode is the initial mode, set it anyway
   display.setFullWindow();
   // here we use paged drawing, even if the processor has enough RAM for full buffer
@@ -371,26 +385,25 @@ void helloFullScreenPartialMode()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // center update text
   display.getTextBounds(fullscreen, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t utx = (display.width() - tbw) / 2;
+  uint16_t utx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t uty = ((display.height() / 4) - tbh / 2) - tby;
   // center update mode
   display.getTextBounds(updatemode, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t umx = (display.width() - tbw) / 2;
+  uint16_t umx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t umy = ((display.height() * 3 / 4) - tbh / 2) - tby;
   // center HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t hwx = (display.width() - tbw) / 2;
-  uint16_t y;
+  uint16_t hwx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t hwy = ((display.height() - tbh) / 2) - tby;
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    y = (display.height() + tbh) / 2; // y is base line!
-    display.setCursor(hwx, y);
+    display.setCursor(hwx, hwy);
     display.print(HelloWorld);
-    y = display.height() / 4 + tbh / 2; // y is base line!
-    display.setCursor(utx, y);
+    display.setCursor(utx, uty);
     display.print(fullscreen);
-    y = display.height() * 3 / 4 + tbh / 2; // y is base line!
-    display.setCursor(umx, y);
+    display.setCursor(umx, umy);
     display.print(updatemode);
   }
   while (display.nextPage());
@@ -406,13 +419,14 @@ void helloArduino()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
   // height might be different
   display.getTextBounds(HelloArduino, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t y = display.height() / 4 + tbh / 2; // y is base line!
+  uint16_t y = ((display.height() / 4) - tbh / 2) - tby; // y is base line!
   // make the window big enough to cover (overwrite) descenders of previous text
   uint16_t wh = FreeMonoBold9pt7b.yAdvance;
-  display.setPartialWindow(0, y - tbh, display.width(), wh);
+  uint16_t wy = (display.height() / 4) - wh / 2;
+  display.setPartialWindow(0, wy, display.width(), wh);
   display.firstPage();
   do
   {
@@ -435,13 +449,14 @@ void helloEpaper()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
   // height might be different
   display.getTextBounds(HelloEpaper, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t y = display.height() * 3 / 4 + tbh / 2; // y is base line!
+  uint16_t y = (display.height() * 3 / 4) + tbh / 2; // y is base line!
   // make the window big enough to cover (overwrite) descenders of previous text
   uint16_t wh = FreeMonoBold9pt7b.yAdvance;
-  display.setPartialWindow(0, y - tbh, display.width(), wh);
+  uint16_t wy = (display.height() * 3 / 4) - wh / 2;
+  display.setPartialWindow(0, wy, display.width(), wh);
   display.firstPage();
   do
   {
@@ -457,16 +472,17 @@ void deepSleepTest()
 {
   //Serial.println("deepSleepTest");
   const char hibernating[] = "hibernating ...";
-  const char wokeup[] = "woke up from deep sleep";
-  const char again[] = "hibernating again ...";
+  const char wokeup[] = "woke up";
+  const char from[] = "from deep sleep";
+  const char again[] = "again";
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   // center text
   display.getTextBounds(hibernating, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   display.setFullWindow();
   display.firstPage();
   do
@@ -479,23 +495,35 @@ void deepSleepTest()
   display.hibernate();
   delay(5000);
   display.getTextBounds(wokeup, 0, 0, &tbx, &tby, &tbw, &tbh);
-  x = (display.width() - tbw) / 2;
+  uint16_t wx = (display.width() - tbw) / 2;
+  uint16_t wy = (display.height() / 3) + tbh / 2; // y is base line!
+  display.getTextBounds(from, 0, 0, &tbx, &tby, &tbw, &tbh);
+  uint16_t fx = (display.width() - tbw) / 2;
+  uint16_t fy = (display.height() * 2 / 3) + tbh / 2; // y is base line!
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    display.setCursor(x, y);
+    display.setCursor(wx, wy);
     display.print(wokeup);
+    display.setCursor(fx, fy);
+    display.print(from);
   }
   while (display.nextPage());
   delay(5000);
+  display.getTextBounds(hibernating, 0, 0, &tbx, &tby, &tbw, &tbh);
+  uint16_t hx = (display.width() - tbw) / 2;
+  uint16_t hy = (display.height() / 3) + tbh / 2; // y is base line!
   display.getTextBounds(again, 0, 0, &tbx, &tby, &tbw, &tbh);
-  x = (display.width() - tbw) / 2;
+  uint16_t ax = (display.width() - tbw) / 2;
+  uint16_t ay = (display.height() * 2 / 3) + tbh / 2; // y is base line!
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    display.setCursor(x, y);
+    display.setCursor(hx, hy);
+    display.print(hibernating);
+    display.setCursor(ax, ay);
     display.print(again);
   }
   while (display.nextPage());
@@ -583,6 +611,12 @@ void drawFont(const char name[], const GFXfont* f)
   display.println("pqrstuvwxyz{|}~ ");
 }
 
+// note for partial update window and setPartialWindow() method:
+// partial update window size and position is on byte boundary in physical x direction
+// the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation
+// see also comment in GxEPD2_BW.h, GxEPD2_3C.h or GxEPD2_GFX.h for method setPartialWindow()
+// showPartialUpdate() purposely uses values that are not multiples of 8 to test this
+
 void showPartialUpdate()
 {
   // some useful background
@@ -651,6 +685,9 @@ void showPartialUpdate()
 void drawBitmaps()
 {
   display.setFullWindow();
+#ifdef _GxBitmaps104x212_H_
+  drawBitmaps104x212();
+#endif
 #ifdef _GxBitmaps128x250_H_
   drawBitmaps128x250();
 #endif
@@ -749,10 +786,10 @@ void drawBitmaps200x200()
       display.writeScreenBuffer(); // use default for white
       display.writeImage(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
       display.refresh(true);
-      if ((display.epd2.hasFastPartialUpdate) && (display.epd2.panel == GxEPD2::GDEW027W3))
+      if (display.epd2.hasFastPartialUpdate)
       {
-        // for differential update: set previous buffer equal to current (IL91874 doesn't switch on refresh)
-        // display.writeScreenBuffer(); // above is enough for the other controllers
+        // for differential update: set previous buffer equal to current buffer in controller
+        display.epd2.writeScreenBufferAgain(); // use default for white
         display.epd2.writeImageAgain(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
       }
       delay(2000);
@@ -771,6 +808,37 @@ void drawBitmaps200x200()
 }
 #endif
 
+#ifdef _GxBitmaps104x212_H_
+void drawBitmaps104x212()
+{
+#if !defined(__AVR)
+  const unsigned char* bitmaps[] =
+  {
+    WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
+  };
+#else
+  const unsigned char* bitmaps[] =
+  {
+    WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
+  };
+#endif
+  if (display.epd2.panel == GxEPD2::GDEW0213I5F)
+  {
+    for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
+    {
+      display.firstPage();
+      do
+      {
+        display.fillScreen(GxEPD_WHITE);
+        display.drawBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
+      }
+      while (display.nextPage());
+      delay(2000);
+    }
+  }
+}
+#endif
+
 #ifdef _GxBitmaps128x250_H_
 void drawBitmaps128x250()
 {
@@ -785,7 +853,7 @@ void drawBitmaps128x250()
     Bitmap128x250_1, logo128x250, first128x250, second128x250, third128x250
   };
 #endif
-  if (display.epd2.panel == GxEPD2::GDE0213B1)
+  if ((display.epd2.panel == GxEPD2::GDE0213B1) || (display.epd2.panel == GxEPD2::GDEH0213B72))
   {
     bool m = display.mirror(true);
     for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
@@ -930,15 +998,15 @@ void drawBitmaps800x600()
 #if defined(ESP8266) || defined(ESP32)
   if (display.epd2.panel == GxEPD2::ED060SCT)
   {
-//    Serial.print("sizeof(WS_zoo_800x600) is "); Serial.println(sizeof(WS_zoo_800x600));
+    //    Serial.print("sizeof(WS_zoo_800x600) is "); Serial.println(sizeof(WS_zoo_800x600));
     display.drawNative(WS_zoo_800x600, 0, 0, 0, 800, 600, false, false, true);
     delay(2000);
-//    Serial.print("sizeof(WS_pic_1200x825) is "); Serial.println(sizeof(WS_pic_1200x825));
-//    display.drawNative((const uint8_t*)WS_pic_1200x825, 0, 0, 0, 1200, 825, false, false, true);
-//    delay(2000);
-//    Serial.print("sizeof(WS_acaa_1024x731) is "); Serial.println(sizeof(WS_acaa_1024x731));
-//    display.drawNative(WS_acaa_1024x731, 0, 0, 0, 1024, 731, false, false, true);
-//    delay(2000);
+    //    Serial.print("sizeof(WS_pic_1200x825) is "); Serial.println(sizeof(WS_pic_1200x825));
+    //    display.drawNative((const uint8_t*)WS_pic_1200x825, 0, 0, 0, 1200, 825, false, false, true);
+    //    delay(2000);
+    //    Serial.print("sizeof(WS_acaa_1024x731) is "); Serial.println(sizeof(WS_acaa_1024x731));
+    //    display.drawNative(WS_acaa_1024x731, 0, 0, 0, 1024, 731, false, false, true);
+    //    delay(2000);
   }
 #endif
 }

+ 46 - 15
examples/GxEPD2_Example/GxEPD2_boards_added.h

@@ -72,27 +72,58 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
 #endif
 
+// mapping suggestion for ESP32, e.g. LOLIN32 D32 PRO
+// BUSY -> 15, RST -> 2, DC -> 0, CS -> 5, CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V
+// note: use explicit value for CS, as SS is re-defined to TF_CS(4) in pins_arduino.h for Board: "LOLIN D32 PRO"
+
 #if defined(ESP32) && defined(ARDUINO_LOLIN_D32_PRO)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
-//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213I5F
-//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5
-//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213I5F
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+// 3-color e-papers
+//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
+// HRDY -> 4, RST -> 16, CS -> 5, SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+#endif
+
+// mapping suggestion for ESP32, e.g. TTGO T8 ESP32-WROVER
+// BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V
+// for use with Board: "ESP32 Dev Module":
+
+#if defined(ESP32) && defined(ARDUINO_ESP32_DEV)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213I5F
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029T5
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
 // 3-color e-papers
-//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
-//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
 // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
 // HRDY -> 4, RST -> 16, CS -> SS(5), SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
 // note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
-//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
 #endif
 
 #endif

+ 121 - 36
examples/GxEPD2_WS_ESP32_Driver/GxEPD2_WS_ESP32_Driver.ino

@@ -35,7 +35,8 @@
 // use Board "ESP32 Dev Module" to build with Arduino IDE
 // select one, can use full buffer size (full HEIGHT)
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25));
-//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0213B72
 //GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0213I5F
 //GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25));
 //GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029T5
@@ -53,6 +54,7 @@
 
 // comment out unused bitmaps to reduce code space used
 #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
+#include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
 #include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
 #include "bitmaps/Bitmaps128x296.h" // 2.9"  b/w
 #include "bitmaps/Bitmaps176x264.h" // 2.7"  b/w
@@ -109,6 +111,11 @@ void loop()
 {
 }
 
+// note for partial update window and setPartialWindow() method:
+// partial update window size and position is on byte boundary in physical x direction
+// the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation
+// see also comment in GxEPD2_BW.h, GxEPD2_3C.h or GxEPD2_GFX.h for method setPartialWindow()
+
 const char HelloWorld[] = "Hello World!";
 const char HelloArduino[] = "Hello Arduino!";
 const char HelloEpaper[] = "Hello E-Paper!";
@@ -121,8 +128,9 @@ void helloWorld()
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  // center bounding box by transposition of origin:
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   display.setFullWindow();
   display.firstPage();
   do
@@ -149,10 +157,10 @@ void helloWorldForDummies()
   display.setTextColor(GxEPD_BLACK);
   // Adafruit_GFX has a handy method getTextBounds() to determine the boundary box for a text for the actual font
   int16_t tbx, tby; uint16_t tbw, tbh; // boundary box window
-  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for 0, 0, fortunately (negative tby!)
-  // center the boundary box of the text
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for origin 0, 0, fortunately (negative tby!)
+  // center bounding box by transposition of origin:
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   // full window mode is the initial mode, set it anyway
   display.setFullWindow();
   // here we use paged drawing, even if the processor has enough RAM for full buffer
@@ -209,26 +217,25 @@ void helloFullScreenPartialMode()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // center update text
   display.getTextBounds(fullscreen, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t utx = (display.width() - tbw) / 2;
+  uint16_t utx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t uty = ((display.height() / 4) - tbh / 2) - tby;
   // center update mode
   display.getTextBounds(updatemode, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t umx = (display.width() - tbw) / 2;
+  uint16_t umx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t umy = ((display.height() * 3 / 4) - tbh / 2) - tby;
   // center HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t hwx = (display.width() - tbw) / 2;
-  uint16_t y;
+  uint16_t hwx = ((display.width() - tbw) / 2) - tbx;
+  uint16_t hwy = ((display.height() - tbh) / 2) - tby;
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    y = (display.height() + tbh) / 2; // y is base line!
-    display.setCursor(hwx, y);
+    display.setCursor(hwx, hwy);
     display.print(HelloWorld);
-    y = display.height() / 4 + tbh / 2; // y is base line!
-    display.setCursor(utx, y);
+    display.setCursor(utx, uty);
     display.print(fullscreen);
-    y = display.height() * 3 / 4 + tbh / 2; // y is base line!
-    display.setCursor(umx, y);
+    display.setCursor(umx, umy);
     display.print(updatemode);
   }
   while (display.nextPage());
@@ -244,13 +251,14 @@ void helloArduino()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
   // height might be different
   display.getTextBounds(HelloArduino, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t y = display.height() / 4 + tbh / 2; // y is base line!
+  uint16_t y = ((display.height() / 4) - tbh / 2) - tby; // y is base line!
   // make the window big enough to cover (overwrite) descenders of previous text
   uint16_t wh = FreeMonoBold9pt7b.yAdvance;
-  display.setPartialWindow(0, y - tbh, display.width(), wh);
+  uint16_t wy = (display.height() / 4) - wh / 2;
+  display.setPartialWindow(0, wy, display.width(), wh);
   display.firstPage();
   do
   {
@@ -273,13 +281,14 @@ void helloEpaper()
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
   // height might be different
   display.getTextBounds(HelloEpaper, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t y = display.height() * 3 / 4 + tbh / 2; // y is base line!
+  uint16_t y = (display.height() * 3 / 4) + tbh / 2; // y is base line!
   // make the window big enough to cover (overwrite) descenders of previous text
   uint16_t wh = FreeMonoBold9pt7b.yAdvance;
-  display.setPartialWindow(0, y - tbh, display.width(), wh);
+  uint16_t wy = (display.height() * 3 / 4) - wh / 2;
+  display.setPartialWindow(0, wy, display.width(), wh);
   display.firstPage();
   do
   {
@@ -295,16 +304,17 @@ void deepSleepTest()
 {
   //Serial.println("deepSleepTest");
   const char hibernating[] = "hibernating ...";
-  const char wokeup[] = "woke up from deep sleep";
-  const char again[] = "hibernating again ...";
+  const char wokeup[] = "woke up";
+  const char from[] = "from deep sleep";
+  const char again[] = "again";
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   // center text
   display.getTextBounds(hibernating, 0, 0, &tbx, &tby, &tbw, &tbh);
-  uint16_t x = (display.width() - tbw) / 2;
-  uint16_t y = (display.height() + tbh) / 2; // y is base line!
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
   display.setFullWindow();
   display.firstPage();
   do
@@ -317,23 +327,35 @@ void deepSleepTest()
   display.hibernate();
   delay(5000);
   display.getTextBounds(wokeup, 0, 0, &tbx, &tby, &tbw, &tbh);
-  x = (display.width() - tbw) / 2;
+  uint16_t wx = (display.width() - tbw) / 2;
+  uint16_t wy = (display.height() / 3) + tbh / 2; // y is base line!
+  display.getTextBounds(from, 0, 0, &tbx, &tby, &tbw, &tbh);
+  uint16_t fx = (display.width() - tbw) / 2;
+  uint16_t fy = (display.height() * 2 / 3) + tbh / 2; // y is base line!
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    display.setCursor(x, y);
+    display.setCursor(wx, wy);
     display.print(wokeup);
+    display.setCursor(fx, fy);
+    display.print(from);
   }
   while (display.nextPage());
   delay(5000);
+  display.getTextBounds(hibernating, 0, 0, &tbx, &tby, &tbw, &tbh);
+  uint16_t hx = (display.width() - tbw) / 2;
+  uint16_t hy = (display.height() / 3) + tbh / 2; // y is base line!
   display.getTextBounds(again, 0, 0, &tbx, &tby, &tbw, &tbh);
-  x = (display.width() - tbw) / 2;
+  uint16_t ax = (display.width() - tbw) / 2;
+  uint16_t ay = (display.height() * 2 / 3) + tbh / 2; // y is base line!
   display.firstPage();
   do
   {
     display.fillScreen(GxEPD_WHITE);
-    display.setCursor(x, y);
+    display.setCursor(hx, hy);
+    display.print(hibernating);
+    display.setCursor(ax, ay);
     display.print(again);
   }
   while (display.nextPage());
@@ -421,6 +443,12 @@ void drawFont(const char name[], const GFXfont* f)
   display.println("pqrstuvwxyz{|}~ ");
 }
 
+// note for partial update window and setPartialWindow() method:
+// partial update window size and position is on byte boundary in physical x direction
+// the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation
+// see also comment in GxEPD2_BW.h, GxEPD2_3C.h or GxEPD2_GFX.h for method setPartialWindow()
+// showPartialUpdate() purposely uses values that are not multiples of 8 to test this
+
 void showPartialUpdate()
 {
   // some useful background
@@ -489,6 +517,9 @@ void showPartialUpdate()
 void drawBitmaps()
 {
   display.setFullWindow();
+#ifdef _GxBitmaps104x212_H_
+  drawBitmaps104x212();
+#endif
 #ifdef _GxBitmaps128x250_H_
   drawBitmaps128x250();
 #endif
@@ -503,6 +534,9 @@ void drawBitmaps()
 #endif
 #ifdef _GxBitmaps640x384_H_
   drawBitmaps640x384();
+#endif
+#ifdef _WS_Bitmaps800x600_H_
+  drawBitmaps800x600();
 #endif
   // 3-color
 #ifdef _GxBitmaps3c104x212_H_
@@ -584,10 +618,10 @@ void drawBitmaps200x200()
       display.writeScreenBuffer(); // use default for white
       display.writeImage(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
       display.refresh(true);
-      if ((display.epd2.hasFastPartialUpdate) && (display.epd2.panel == GxEPD2::GDEW027W3))
+      if (display.epd2.hasFastPartialUpdate)
       {
-        // for differential update: set previous buffer equal to current (IL91874 doesn't switch on refresh)
-        // display.writeScreenBuffer(); // above is enough for the other controllers
+        // for differential update: set previous buffer equal to current buffer in controller
+        display.epd2.writeScreenBufferAgain(); // use default for white
         display.epd2.writeImageAgain(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
       }
       delay(2000);
@@ -606,6 +640,37 @@ void drawBitmaps200x200()
 }
 #endif
 
+#ifdef _GxBitmaps104x212_H_
+void drawBitmaps104x212()
+{
+#if !defined(__AVR)
+  const unsigned char* bitmaps[] =
+  {
+    WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
+  };
+#else
+  const unsigned char* bitmaps[] =
+  {
+    WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
+  };
+#endif
+  if (display.epd2.panel == GxEPD2::GDEW0213I5F)
+  {
+    for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
+    {
+      display.firstPage();
+      do
+      {
+        display.fillScreen(GxEPD_WHITE);
+        display.drawBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
+      }
+      while (display.nextPage());
+      delay(2000);
+    }
+  }
+}
+#endif
+
 #ifdef _GxBitmaps128x250_H_
 void drawBitmaps128x250()
 {
@@ -620,7 +685,7 @@ void drawBitmaps128x250()
     Bitmap128x250_1, logo128x250, first128x250, second128x250, third128x250
   };
 #endif
-  if (display.epd2.panel == GxEPD2::GDE0213B1)
+  if ((display.epd2.panel == GxEPD2::GDE0213B1) || (display.epd2.panel == GxEPD2::GDEH0213B72))
   {
     bool m = display.mirror(true);
     for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
@@ -759,6 +824,26 @@ void drawBitmaps640x384()
 }
 #endif
 
+#ifdef _WS_Bitmaps800x600_H_
+void drawBitmaps800x600()
+{
+#if defined(ESP8266) || defined(ESP32)
+  if (display.epd2.panel == GxEPD2::ED060SCT)
+  {
+    //    Serial.print("sizeof(WS_zoo_800x600) is "); Serial.println(sizeof(WS_zoo_800x600));
+    display.drawNative(WS_zoo_800x600, 0, 0, 0, 800, 600, false, false, true);
+    delay(2000);
+    //    Serial.print("sizeof(WS_pic_1200x825) is "); Serial.println(sizeof(WS_pic_1200x825));
+    //    display.drawNative((const uint8_t*)WS_pic_1200x825, 0, 0, 0, 1200, 825, false, false, true);
+    //    delay(2000);
+    //    Serial.print("sizeof(WS_acaa_1024x731) is "); Serial.println(sizeof(WS_acaa_1024x731));
+    //    display.drawNative(WS_acaa_1024x731, 0, 0, 0, 1024, 731, false, false, true);
+    //    delay(2000);
+  }
+#endif
+}
+#endif
+
 struct bitmap_pair
 {
   const unsigned char* black;
@@ -838,7 +923,7 @@ void drawBitmaps3c200x200()
         display.writeScreenBuffer(); // use default for white
         display.writeImage(bitmap_pairs[i].black, bitmap_pairs[i].red, x, y, 200, 200, false, false, true);
         display.refresh();
-        delay(2000);
+        delay(1000);
         x += 40;
         y += 40;
         if ((x >= int16_t(display.epd2.WIDTH)) || (y >= int16_t(display.epd2.HEIGHT))) break;

+ 1 - 1
library.properties

@@ -1,5 +1,5 @@
 name=GxEPD2
-version=1.1.5
+version=1.1.6
 author=Jean-Marc Zingg
 maintainer=Jean-Marc Zingg
 sentence=Arduino Display Library for SPI E-Paper displays from Dalian Good Display and Waveshare. 

+ 1 - 0
src/GxEPD2.h

@@ -31,6 +31,7 @@ class GxEPD2
     {
       GDEP015OC1, Waveshare_1_54_bw = GDEP015OC1,
       GDE0213B1,  Waveshare_2_13_bw = GDE0213B1,
+      GDEH0213B72,  Waveshare_2_13_bw_B72 = GDEH0213B72,
       GDEW0213I5F, Waveshare_2_13_flex = GDEW0213I5F,
       GDEH029A1,  Waveshare_2_9_bw = GDEH029A1,
       GDEW029T5,  Waveshare_2_9_bw_T5 = GDEW029T5,

+ 1 - 0
src/GxEPD2_BW.h

@@ -16,6 +16,7 @@
 #include "GxEPD2_EPD.h"
 #include "epd/GxEPD2_154.h"
 #include "epd/GxEPD2_213.h"
+#include "epd/GxEPD2_213_B72.h"
 #include "epd/GxEPD2_213_flex.h"
 #include "epd/GxEPD2_290.h"
 #include "epd/GxEPD2_290_T5.h"

+ 5 - 0
src/GxEPD2_EPD.h

@@ -39,6 +39,11 @@ class GxEPD2_EPD
     virtual void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0;
     virtual void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0;
     // for differential update: set current and previous buffers equal (for fast partial update to work correctly)
+    virtual void writeScreenBufferAgain(uint8_t value) // init controller memory (default white)
+    {
+      // most controllers with differential update do switch buffers on refresh, can use:
+      writeScreenBuffer(value);
+    }
     virtual void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false)
     {
       // most controllers with differential update do switch buffers on refresh, can use:

+ 540 - 0
src/bitmaps/Bitmaps104x212.h

@@ -0,0 +1,540 @@
+#ifndef _GxBitmaps104x212_H_
+#define _GxBitmaps104x212_H_
+
+#if defined(ESP8266) || defined(ESP32)
+#include <pgmspace.h>
+#else
+#include <avr/pgmspace.h>
+#endif
+
+#include "WS_Bitmaps104x212.h"
+
+const unsigned char Bitmap104x212_1[] PROGMEM =
+{
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X0F,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X07,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XF0,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X3F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,
+0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XF0,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XF8,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X78,0X00,0X00,0X01,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFE,0X00,0X00,
+0X00,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0X80,0X00,0X00,0X7F,0X80,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XF0,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X3F,0XFE,0X00,0X00,0X1F,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X1F,0XFF,0XC0,0X00,0X0F,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,
+0XF0,0X00,0X07,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFE,0X00,0X03,
+0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0X80,0X03,0XFF,0X80,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XE0,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X03,0XFF,0XF8,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,0X03,0X80,0X00,
+0X00,0XFF,0XFC,0X01,0XFF,0XFE,0X00,0X00,0X00,0X00,0X07,0XE0,0X00,0X00,0X3F,0XFF,
+0X81,0XFF,0XFF,0X00,0X00,0X00,0X00,0X07,0XF8,0X00,0X00,0X1F,0XFF,0XE3,0XFF,0XFF,
+0XE0,0X00,0X00,0X00,0X07,0XFF,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,
+0X00,0X07,0XFF,0XF0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X03,0XFF,
+0XFE,0X00,0X00,0XFF,0XFF,0XFC,0X03,0XFF,0X00,0X00,0X00,0X00,0XFF,0XFF,0XC0,0X00,
+0X3F,0XFF,0XF8,0X01,0XFF,0XC0,0X00,0X00,0X00,0X3F,0XFF,0XFC,0X00,0X0F,0XFF,0XF8,
+0X01,0XFF,0XE0,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XC0,0X07,0XFF,0XF9,0XF9,0XFF,0XF0,
+0X00,0X00,0X00,0X03,0XFF,0XFF,0XFC,0X07,0XFF,0XF8,0X01,0XFF,0XF8,0X00,0X00,0X00,
+0X00,0X7F,0XFF,0XFF,0X8F,0XFF,0XF8,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,0X1F,0XFF,
+0XFF,0XFF,0XFF,0XFC,0X03,0XFF,0XFE,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFC,0X03,0XFF,
+0XFF,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF8,0X01,0XFF,0XFF,0X80,0X00,
+0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XF8,0X01,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,
+0X00,0X7F,0XFF,0XFF,0XF9,0XF9,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,
+0XFF,0XF8,0X01,0XFF,0XFF,0XC0,0X00,0X07,0XE0,0X00,0X00,0X00,0XFF,0XFF,0XF8,0X01,
+0XFF,0XFF,0XE0,0X00,0X0F,0XFC,0X00,0X00,0X00,0XFF,0XFF,0XFC,0X03,0XFF,0XFF,0XE0,
+0X00,0X0F,0XFF,0XF0,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X07,0XFF,
+0XFF,0XFC,0X01,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XE0,0X00,0X03,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XE0,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF9,0XFF,0XFF,0XE0,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XC0,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,
+0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFC,0X03,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0XFF,
+0XFF,0XFF,0XFF,0XF8,0X01,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,
+0XF8,0X01,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XF9,0XF9,0XFF,
+0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XF8,0X01,0XFF,0XFF,0X80,0X00,
+0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XF8,0X01,0XFF,0XFF,0X00,0X00,0X00,0X02,0X00,
+0X00,0X00,0X0F,0XFF,0XFC,0X03,0XFF,0XFF,0X00,0X00,0X03,0XCE,0X00,0X00,0X00,0X01,
+0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0XFF,0XF9,0X83,
+0XFF,0XFF,0X00,0X00,0X07,0XFC,0X00,0X00,0X00,0X00,0X7F,0XF9,0X01,0XFF,0XFE,0X00,
+0X00,0X06,0X70,0X00,0X00,0X00,0X00,0X3F,0XF9,0X01,0XFF,0XFE,0X00,0X00,0X06,0X60,
+0X00,0X00,0X00,0X00,0X3F,0XF9,0X39,0XFF,0XFC,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,
+0X00,0X1F,0XF8,0X11,0XFF,0XFC,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X1F,0XF8,
+0X11,0XFF,0XF8,0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X1F,0XFF,0X13,0XFF,0XF0,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X06,0X66,0X00,0X00,
+0X00,0X03,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X06,0X66,0X00,0X00,0X00,0XFF,0XFF,
+0XFF,0XFF,0XFC,0X00,0X00,0X00,0X06,0X66,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XE0,
+0X00,0X00,0X00,0X06,0X66,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,
+0X07,0XFE,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,
+0X0F,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,0X1F,0XFF,0XFF,
+0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0X80,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X03,0XC0,0X00,0X3F,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,
+0X00,0X1F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X06,0X60,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X06,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,
+0XFE,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,
+0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X0F,0X80,0X00,0X00,0X00,0X00,0X00,0X06,0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,
+0X00,0X00,0X00,0X00,0X3E,0X00,0X00,0X00,0X00,0X00,0X01,0XFC,0X00,0X00,0X00,0X00,
+0X01,0XFE,0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X07,0XF8,0X00,
+0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X00,0X00,0X00,0X07,0XD8,0X00,0X00,0X00,0X00,
+0X00,0X0E,0X00,0X00,0X00,0X00,0X00,0X07,0XD8,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,
+0X00,0X00,0X00,0X00,0X07,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,
+0X00,0X01,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X7F,0XFF,0X80,0X00,0X00,0X3E,
+0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X40,0X00,0X80,0X00,0X00,0X06,0X00,0X00,0X00,
+0X00,0X00,0X00,0X0C,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X0C,0X40,0X00,0X80,0X00,0X03,0XC0,0X00,0X00,0X00,0X00,0X00,0X0F,0XFC,0X7F,0XFF,
+0X80,0X00,0X07,0XE0,0X00,0X00,0X00,0X00,0X00,0X0F,0XFC,0X40,0X00,0X80,0X00,0X07,
+0XE0,0X00,0X00,0X00,0X00,0X00,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X06,0X60,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X06,0X60,0X00,0X00,0X00,0X00,0X00,
+0X00,0X0C,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X7C,0X40,
+0X00,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X40,0X00,0X80,0X00,
+0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X0F,0XF0,0X40,0X00,0X80,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X0F,0XB0,0X40,0X00,0X80,0X00,0X00,0X30,0X00,0X00,0X00,0X0F,
+0XC0,0X0F,0XB0,0X40,0X00,0X80,0X00,0X00,0X30,0X00,0X00,0X00,0X3F,0XF0,0X0F,0XF0,
+0X40,0X00,0X80,0X00,0X00,0X30,0X00,0X00,0X00,0X70,0X38,0X03,0XFC,0X7F,0XFF,0X80,
+0X00,0X00,0X30,0X00,0X00,0X00,0X60,0X18,0X00,0X7C,0X40,0X00,0X80,0X00,0X00,0X00,
+0X00,0X00,0X00,0X60,0X18,0X00,0X0C,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
+0X60,0X18,0X00,0X00,0X7F,0XFF,0X80,0X00,0X06,0X66,0X00,0X00,0X00,0X7F,0XF8,0X07,
+0X80,0X40,0X00,0X80,0X00,0X06,0X66,0X00,0X00,0X00,0X7F,0XF8,0X0F,0XC0,0X40,0X00,
+0X80,0X00,0X06,0X66,0X00,0X00,0X00,0X00,0X00,0X0F,0XC0,0X40,0X00,0X80,0X00,0X06,
+0X66,0X00,0X00,0X00,0X00,0X00,0X0C,0XC0,0X40,0X00,0X80,0X00,0X07,0XFE,0X00,0X00,
+0X00,0X1E,0X00,0X0C,0XC0,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X7E,0X00,
+0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X61,0X00,0X0F,0XFC,0X40,
+0X00,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X61,0X00,0X0F,0XFC,0X40,0X00,0X80,0X00,
+0X00,0X00,0X00,0X00,0X00,0X61,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,
+0X00,0X00,0X7F,0XF8,0X00,0X00,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,
+0XF8,0X06,0X78,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0XFC,
+0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0XFC,0X7F,0XFF,0X80,
+0X00,0X00,0X00,0X00,0X00,0X00,0X63,0X18,0X0C,0XCC,0X40,0X00,0X80,0X00,0X07,0XFE,
+0X00,0X00,0X00,0X63,0X18,0X0C,0XCC,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,
+0X63,0X18,0X0F,0XDC,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X63,0X18,0X0F,
+0XDC,0X40,0X00,0X80,0X00,0X00,0X60,0X00,0X00,0X00,0X63,0X18,0X07,0X98,0X40,0X00,
+0X80,0X00,0X00,0X60,0X00,0X00,0X00,0X7F,0XF8,0X00,0X00,0X40,0X00,0X80,0X00,0X07,
+0XFE,0X00,0X00,0X00,0X7F,0XF8,0X00,0X00,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,
+0X00,0X00,0X00,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,
+0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFC,0X40,
+0X00,0X80,0X00,0X01,0X08,0X00,0X0C,0X38,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,
+0X03,0X9C,0X00,0X0C,0X38,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X07,0X9E,0X00,
+0X00,0X00,0X00,0X00,0X03,0XF0,0X40,0X00,0X80,0X00,0X07,0X0E,0X00,0X00,0X00,0X03,
+0X90,0X07,0XF8,0X40,0X00,0X80,0X00,0X06,0X06,0X00,0X03,0X10,0X06,0X98,0X0F,0XFC,
+0X7F,0XFF,0X80,0X00,0X07,0X0E,0X00,0X07,0X98,0X0C,0X98,0X0E,0X1C,0X7F,0XFF,0X80,
+0X00,0X07,0XFE,0X00,0X0D,0X98,0X0C,0X98,0X0C,0X0C,0X40,0X00,0X80,0X00,0X03,0XFC,
+0X00,0X0D,0X98,0X04,0X98,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X01,0XF8,0X00,0X0D,0X98,
+0X07,0XE0,0X0F,0XFC,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X07,0XB0,0X01,0XE0,0X0F,
+0XFC,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X7F,0XFF,
+0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0X80,0X00,0X07,
+0XFE,0X00,0X0C,0X00,0X7F,0XF8,0X00,0X00,0X40,0X00,0X80,0X00,0X07,0XFE,0X00,0X0C,
+0X00,0X7F,0XF8,0X00,0X00,0X40,0X00,0X80,0X00,0X00,0XFC,0X00,0X0C,0X00,0X00,0X00,
+0X00,0X00,0X7F,0XFF,0X80,0X00,0X03,0XF0,0X00,0X07,0XF8,0X00,0X00,0X00,0X00,0X7F,
+0XFF,0X80,0X00,0X07,0XFE,0X00,0X0F,0XF8,0X03,0XE0,0X00,0X00,0X40,0X00,0X80,0X00,
+0X07,0XFE,0X00,0X00,0X00,0X07,0XF0,0X03,0XF0,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,
+0X00,0X00,0X0E,0X38,0X07,0XF8,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F,0XF8,0X0E,
+0X18,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F,0XF8,0X06,0X10,0X0E,0X1C,
+0X40,0X00,0X80,0X00,0X07,0XFE,0X00,0X00,0X30,0X7F,0XF8,0X0C,0X0C,0X40,0X00,0X80,
+0X00,0X07,0XFE,0X00,0X00,0X18,0X7F,0XF8,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X07,0XFE,
+0X00,0X00,0X18,0X00,0X00,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X0F,0XF8,
+0X00,0X00,0X0F,0XFC,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X0F,0XE0,0X6F,0XF8,0X00,
+0X00,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X6F,0XF8,0X00,0X00,0X7F,0XFF,
+0X80,0X00,0X00,0X00,0X00,0X0C,0X18,0X00,0X00,0X03,0XF0,0X40,0X00,0X80,0X00,0X00,
+0X00,0X00,0X0C,0X08,0X00,0X00,0X07,0XF8,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X7F,
+0XF8,0X0C,0X18,0X0F,0XFC,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X3F,0XF0,0X0F,0X70,
+0X0E,0X1C,0X7F,0XFF,0X80,0X00,0X03,0XBC,0X00,0X0C,0X00,0X03,0XE0,0X0C,0X0C,0X40,
+0X00,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,0X03,0XE0,0X0E,0X1C,0X40,0X00,0X80,0X00,
+0X07,0XFE,0X00,0X07,0XF8,0X0F,0X78,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X06,0X46,0X00,
+0X0D,0XF0,0X08,0X18,0X07,0XF8,0X7F,0XFF,0X80,0X00,0X07,0X5E,0X00,0X0D,0X90,0X00,
+0X00,0X03,0XF0,0X40,0X00,0X80,0X00,0X07,0X1E,0X00,0X0D,0X98,0X00,0X00,0X00,0X00,
+0X40,0X00,0X80,0X00,0X03,0X18,0X00,0X0D,0XF8,0X03,0X90,0X00,0X00,0X40,0X00,0X80,
+0X00,0X00,0X00,0X00,0X04,0XF0,0X07,0X98,0X03,0XF0,0X40,0X00,0X80,0X00,0X00,0X00,
+0X00,0X00,0X00,0X0C,0X98,0X07,0XF8,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X00,0X00,
+0X0C,0X98,0X0F,0XFC,0X7F,0XFF,0X80,0X00,0X07,0XFE,0X00,0X03,0X90,0X0C,0X98,0X0E,
+0X1C,0X40,0X00,0X80,0X00,0X07,0XFE,0X00,0X07,0X98,0X07,0XF0,0X0C,0X0C,0X7F,0XFF,
+0X80,0X00,0X03,0X80,0X00,0X0D,0X98,0X03,0XE0,0X0E,0X1C,0X40,0X00,0X80,0X00,0X01,
+0X80,0X00,0X0D,0X98,0X00,0X00,0X0F,0XFC,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X0D,
+0X98,0X00,0X00,0X07,0XF8,0X40,0X00,0X80,0X00,0X00,0X00,0X00,0X07,0XF0,0X7F,0XF8,
+0X03,0XF0,0X40,0X00,0X80,0X00,0X00,0X06,0X00,0X03,0XE0,0X7F,0XF8,0X00,0X00,0X7F,
+0XFF,0X80,0X00,0X00,0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X00,0X80,0X00,
+0X00,0X06,0X00,0X00,0X00,0X00,0X00,0X02,0X70,0X40,0X00,0X80,0X00,0X00,0X00,0X00,
+0X60,0X00,0X60,0X00,0X07,0X78,0X7F,0XFF,0X80,0X00,0X00,0X00,0X00,0X63,0X00,0X61,
+0X00,0X0F,0X7C,0X7F,0XFF,0X80,0X00,0X03,0X86,0X00,0X63,0X00,0X61,0X00,0X0E,0X6C,
+0X40,0X00,0X80,0X00,0X07,0XC6,0X00,0X63,0X00,0X61,0X00,0X0C,0X6C,0X7F,0XFF,0X80,
+0X00,0X07,0XE6,0X00,0X63,0X00,0X61,0X00,0X0E,0X1C,0X40,0X00,0X80,0X00,0X06,0X36,
+0X00,0X7F,0XF8,0X7F,0XF8,0X0F,0XFC,0X40,0X00,0X80,0X00,0X07,0X9E,0X00,0X7F,0XF8,
+0X7F,0XF8,0X07,0XF8,0X40,0X00,0X80,0X00,0X07,0X8E,0X00,0X00,0X00,0X00,0X00,0X03,
+0XF0,0X7F,0XFF,0X80,0X00,0X01,0X86,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,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 Bitmap104x212_2[] PROGMEM =
+{
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XDF,0XF0,0X00,0X01,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0X1F,0XF0,0X3F,
+0X01,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X0C,0X1F,0XF0,0X7F,0X81,0XF7,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X08,0X1F,0XF0,0XE1,0XC1,0X80,0X3F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF1,0XC0,0X7F,0XF0,0XC0,0XC1,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,
+0XC1,0XFF,0XF0,0XC0,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0XFF,0XF0,
+0XC0,0XC1,0XF6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0XFF,0XC1,0XE4,
+0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0XFF,0XC1,0XEC,0XBF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0X00,0X01,0XE9,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF0,0X00,0X1F,0XF0,0X00,0X01,0XE1,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,
+0XF0,0X78,0X01,0XF3,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFC,0X01,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XCC,0X01,0XF1,0X7F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0X1F,0XF0,0XCC,0X01,0XE1,0X3F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF1,0XC7,0X1F,0XF0,0XCC,0X01,0XED,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,
+0X1F,0XF0,0XFF,0XC1,0XED,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0XFF,
+0XC1,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0X00,0X01,0XF0,0X7F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0XCC,0XC1,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,
+0XC7,0X1F,0XF0,0XCC,0XC1,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,
+0XCC,0XC1,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0XCC,0XC1,0XE0,
+0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0XCC,0XC1,0XBF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XC1,0XAF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF0,0XFF,0XC1,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0XFF,
+0XF0,0X00,0X01,0XC0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0XFF,0XF0,0X00,0X01,
+0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X07,0XFF,0XF0,0X00,0X01,0XF1,0X7F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0X00,0X01,0XE1,0X3F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF1,0XC7,0XFF,0XF0,0X00,0X01,0XED,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,
+0XFF,0XF0,0X00,0X01,0XED,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0X0E,
+0X81,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0X1E,0XC1,0XF0,0X7F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0X36,0XC1,0XFF,0XBF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0X36,0XC1,0XC6,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
+0X00,0X1F,0XF0,0X36,0XC1,0X80,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
+0X1F,0X81,0XB9,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9F,0XF0,0X0F,0X01,0XBB,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0XF0,0X00,0X01,0XBB,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XC0,0X1F,0XF0,0X00,0X01,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X00,0X7F,0XF0,0XFF,0XC1,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0XFF,
+0XF0,0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X38,0XFF,0XF0,0X00,0X01,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XF8,0XFF,0XF0,0X00,0X01,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF0,0X38,0XFF,0XF0,0X0F,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF0,0X00,0XFF,0XF0,0X1F,0X81,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
+0X7F,0XF0,0X39,0XC1,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X1F,0XF0,0X30,
+0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0XF0,0X18,0X81,0XF0,0X3F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9F,0XF0,0XFF,0XC1,0XE0,0X3F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XFF,0XC1,0XEB,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,
+0X1F,0XFF,0XF0,0X00,0X01,0XE9,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0XFF,0XF0,
+0X00,0X01,0XEC,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X07,0XFF,0XF0,0XBF,0XC1,0XF6,
+0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0XBF,0XC1,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0X00,0X01,0XA0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF1,0XC7,0XFF,0XF0,0X00,0X01,0XA0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,
+0XF0,0X30,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0XFF,0XF0,0X39,0XC1,
+0XEF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0X0F,0X01,0X80,0X3F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0X0F,0X01,0XC0,0X7F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF0,0X00,0X1F,0XF0,0X39,0XC1,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF0,0X30,0XC1,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,
+0X01,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X01,0XE0,0X3F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X0E,0X81,0XE0,0X3F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X1E,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF1,0XFF,0XF0,0X36,0XC1,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,
+0X36,0XC1,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X36,0XC1,0XEB,
+0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X1F,0X81,0XE9,0XBF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF1,0XFF,0X1F,0XF0,0X0F,0X01,0XEC,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF1,0XC7,0X1F,0XF0,0X00,0X01,0XF6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,
+0XF0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0XFF,0XC1,
+0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0XFF,0XC1,0X81,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,0X1F,0XF0,0X00,0X01,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF1,0XC7,0X1F,0XF0,0X00,0X01,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC7,
+0X1F,0XF0,0XC0,0X01,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0XCC,
+0X01,0X80,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0XCC,0X01,0X80,0X3F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XF0,0XCC,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0XCC,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF0,0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
+0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XEF,
+0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0X80,0X3F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XC0,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF0,0X00,0X01,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF9,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,
+0XEF,0XFF,0XFF,0XF0,0X01,0XFF,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XE0,0X3F,0XFF,
+0XE0,0X00,0XFF,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XE0,0X3F,0XFF,0XC0,0X00,0X7F,
+0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XFF,0XC7,
+0XFF,0XFF,0XFF,0XF9,0XF0,0X7F,0XFF,0X00,0X00,0X3F,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,
+0XF9,0XE0,0X3F,0XFF,0X00,0X00,0X1F,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XF9,0XEF,0XBF,
+0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XF9,0XEF,0XBF,0XFE,0X00,0X00,
+0X0F,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XF9,0XE0,0X3F,0XFE,0X02,0X00,0X0F,0XFF,0XF0,
+0X00,0X1F,0XFF,0XFF,0XF9,0XF0,0X7F,0XFE,0X03,0X80,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,
+0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XC0,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XF0,
+0X7F,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XE0,0X3F,0XFE,0X00,
+0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XEF,0XBF,0XFE,0X03,0XFE,0X0F,0XFF,
+0XFE,0XFE,0XFF,0XFF,0XFF,0XF9,0XF7,0X7F,0XFE,0X03,0XC0,0X0F,0XFF,0XF8,0X7C,0X3F,
+0XFF,0XFF,0XF9,0XE0,0X0F,0XFE,0X03,0X80,0X0F,0XFF,0XF8,0X7C,0X3F,0XFF,0XFF,0XF9,
+0XE0,0X0F,0XFE,0X02,0X00,0X0F,0XFF,0XF0,0XFE,0X1F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,
+0X00,0X06,0X0F,0XFF,0XF1,0XFF,0X1F,0XFF,0XFF,0XF9,0XF0,0X7F,0XFE,0X00,0XFE,0X0F,
+0XFF,0XF1,0XFF,0X1F,0XFF,0XFF,0XF9,0XE0,0X3F,0XFE,0X03,0XFE,0X0F,0XFF,0XF1,0XFF,
+0X1F,0XFF,0XFF,0XF9,0XEF,0XBF,0XFE,0X03,0XFC,0X0F,0XFF,0XF1,0XFF,0X1F,0XFF,0XFF,
+0XF9,0XF7,0X7F,0XFE,0X03,0X8C,0X0F,0XFF,0XF8,0X7C,0X3F,0XFF,0XFF,0XF9,0XE0,0X0F,
+0XFE,0X03,0XFC,0X0F,0XFF,0XF8,0X00,0X3F,0XFF,0XFF,0XF9,0XE0,0X0F,0XFE,0X03,0XFE,
+0X0F,0XFF,0XFC,0X00,0X7F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X01,0XFE,0X0F,0XFF,0XFF,
+0X01,0XFF,0XFF,0XFF,0XF9,0XE0,0X3F,0XFE,0X00,0X0E,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF9,0XE0,0X3F,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,
+0X7F,0XFE,0X00,0X06,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XFF,0XBF,0XFE,0X00,
+0X06,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XE0,0X3F,0XFE,0X00,0X06,0X0F,0XFF,
+0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XE0,0X7F,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFC,0X3F,
+0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XF0,0X7F,0XFF,0XFF,0XF9,
+0XDC,0X7F,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XC1,0XFF,0XFF,0XFF,0XF9,0X98,0X3F,0XFE,
+0X00,0X00,0X0F,0XFF,0XFF,0X07,0XFF,0XFF,0XFF,0XF9,0XB9,0XBF,0XFE,0X01,0XE0,0X0F,
+0XFF,0XFC,0X1F,0XFF,0XFF,0XFF,0XF9,0XB1,0XBF,0XFE,0X03,0XF0,0X0F,0XFF,0XF8,0X7F,
+0XFF,0XFF,0XFF,0XF9,0XB3,0XBF,0XFE,0X03,0XF0,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,
+0XF9,0X83,0X3F,0XFE,0X03,0X30,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XC7,0X7F,
+0XFE,0X03,0XFE,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,
+0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,
+0XFF,0XF9,0XFF,0XFF,0XFE,0X01,0X9C,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XFF,
+0XFF,0XFE,0X03,0XBE,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,
+0XBE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0X66,0X0F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XEE,0X0F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XEE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,
+0XFF,0XFF,0XFE,0X01,0XCC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,
+0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFC,0X30,0X7F,0XFF,0XFF,
+0XF9,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XF8,0X00,0X3F,0XFF,0XFF,0XF9,0XFF,0XFF,
+0XFE,0X00,0XF8,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X01,0XFC,
+0X0F,0XFF,0XF3,0X87,0X9F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XF3,
+0XCF,0X9F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XF3,0XCF,0X9F,0XFF,
+0XFF,0XF9,0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XF0,0XFE,0X1F,0XFF,0XFF,0XF9,0XFF,
+0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XF8,0XFE,0X3F,0XFF,0XFF,0XF9,0XFF,0XFF,0XFE,0X03,
+0XFE,0X0F,0XFF,0XFC,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X00,0X00,0X0F,0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,
+0XFF,0XF0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0XF8,0X0F,0XFF,0XF0,0X00,
+0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X01,0XFC,0X0F,0XFF,0XFC,0X7F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFE,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X03,0X06,0X0F,0XFF,0XFE,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0X06,
+0X0F,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
+0XF8,0X0F,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X01,0XFC,0X0F,0XFF,
+0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XFC,0X3F,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X03,0XFE,0X0F,0XFF,0XF8,0X0F,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X01,0XFC,0X0F,
+0XFF,0XF0,0X07,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0XF8,0X0F,0XFF,0XF3,0XC3,
+0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XF3,0XE0,0X9F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0XF8,0X0F,0XFF,0XF3,0XF0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X01,0XFC,0X0F,0XFF,0XF0,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,
+0X0F,0XFF,0XF8,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XFC,
+0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0X06,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X01,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
+0XF8,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X01,0XBC,0X0F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XBE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFE,0X03,0XBE,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X03,0X36,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0X06,0X0F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X03,0XFE,0X0F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X01,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0XF8,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,
+0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,};
+
+const unsigned char Bitmap104x212_3[] PROGMEM =
+{
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,
+0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X17,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF8,0X14,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
+0X08,0X87,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFC,0X07,0XFF,0XF8,0X00,0X07,0XFF,
+0XFF,0XFF,0XF7,0XFF,0XFF,0XC0,0X70,0X00,0XFF,0XF8,0X10,0X07,0XFF,0XFF,0XFF,0XF7,
+0XFF,0XFF,0X00,0X20,0X00,0X7F,0XF8,0X1F,0X87,0XFF,0XFF,0XFF,0XF7,0XFF,0XFE,0X00,
+0X00,0X00,0X3F,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF0,0X7F,0XFC,0X00,0X00,0XF0,0X3F,
+0XF8,0X00,0X07,0XFF,0XFF,0XFB,0XE0,0X1F,0XF8,0X1E,0X01,0XF8,0X1F,0XF8,0X0C,0X87,
+0XFF,0XFF,0XF9,0XC7,0X8F,0XF8,0X3F,0X03,0XFC,0X1F,0XF8,0X14,0X87,0XFF,0XFF,0XF3,
+0XC7,0XCF,0XF8,0X7F,0X07,0XFE,0X1F,0XF8,0X14,0X87,0XFF,0XFF,0XF3,0XC7,0XCF,0XF8,
+0X7F,0X87,0XFE,0X1F,0XF8,0X0F,0X07,0XFF,0XFF,0XF3,0XC7,0XCF,0XF8,0X7F,0X07,0XFE,
+0X1F,0XF8,0X00,0X07,0XFF,0XFF,0XF9,0XE7,0X9F,0XF8,0X3F,0X03,0XFC,0X1F,0XF8,0X50,
+0X07,0XFF,0XFF,0XF8,0X72,0X1F,0XF8,0X1E,0X01,0XF8,0X1F,0XF8,0X7F,0X87,0XFF,0XFF,
+0XFE,0X00,0X7F,0XFC,0X00,0X00,0XF0,0X3F,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0X81,0XFF,
+0XFE,0X00,0X00,0X00,0X3F,0XF8,0X50,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0X00,0X20,
+0X00,0X7F,0XF8,0X7F,0X87,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XC0,0X70,0X00,0XFF,0XF8,
+0X10,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFC,0X03,0XFF,0XF8,0X00,0X07,0XFF,
+0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0X07,0XFF,0XFF,0XFF,0XF7,
+0XCF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X10,0X87,0XFF,0XFF,0XFF,0XF7,0XCF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XF8,0X10,0X87,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF8,0X0F,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,
+0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,
+0X81,0XFF,0XFF,0XFF,0XFF,0XFC,0X3F,0XF8,0X00,0X07,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,
+0XFF,0XFF,0XF8,0X1F,0XF8,0X00,0X07,0XFF,0XFF,0XF8,0X76,0X1F,0XFF,0XFF,0XFF,0XF8,
+0X1F,0XF8,0X00,0X07,0XFF,0XFF,0XF9,0XF7,0X9F,0XFF,0XFF,0XFF,0XF8,0X1F,0XF8,0X00,
+0X07,0XFF,0XFF,0XF3,0XF7,0XCF,0XFF,0XFF,0XFF,0XFC,0X3F,0XF8,0X0C,0X87,0XFF,0XFF,
+0XF3,0XF7,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X14,0X87,0XFF,0XFF,0XF3,0XF7,0XCF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X14,0X87,0XFF,0XFF,0XF9,0XF7,0X9F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF8,0X0F,0X07,0XFF,0XFF,0XF8,0X76,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
+0X00,0X07,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X10,0X07,0XFF,
+0XFF,0XFF,0X81,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X1F,0X87,0XFF,0XFF,0XFF,0XF7,
+0XFF,0XFF,0XFE,0X00,0X3F,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XF0,
+0X00,0X07,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XC0,0X00,0X01,0XFF,
+0XF8,0X0F,0X07,0XFF,0XFF,0XF0,0X00,0X0F,0XFF,0X00,0X00,0X00,0XFF,0XF8,0X10,0X87,
+0XFF,0XFF,0XF0,0X00,0X0F,0XFE,0X00,0X03,0X80,0X7F,0XF8,0X10,0X87,0XFF,0XFF,0XF1,
+0XF7,0XFF,0XFC,0X03,0X81,0XF0,0X3F,0XF8,0X0F,0X07,0XFF,0XFF,0XF9,0XF7,0XFF,0XFC,
+0X0F,0XC1,0XFC,0X1F,0XF8,0X00,0X07,0XFF,0XFF,0XFD,0XF7,0XFF,0XF8,0X3F,0XE0,0XFC,
+0X1F,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XF8,0X3F,0XF0,0XFE,0X1F,0XF8,0X0F,
+0X87,0XFF,0XFF,0XFC,0XF0,0X3F,0XF8,0X7F,0XF0,0XFE,0X1F,0XF8,0X10,0X07,0XFF,0XFF,
+0XF8,0XF0,0X1F,0XF8,0X7F,0XF0,0XFE,0X1F,0XF8,0X08,0X07,0XFF,0XFF,0XF1,0XE7,0X8F,
+0XF8,0X3F,0XE0,0XFC,0X1F,0XF8,0X0F,0X87,0XFF,0XFF,0XF3,0XE7,0XCF,0XF8,0X3F,0XC0,
+0XFC,0X1F,0XF8,0X10,0X07,0XFF,0XFF,0XC0,0X00,0X03,0XFC,0X0F,0X81,0XF8,0X3F,0XF8,
+0X08,0X07,0XFF,0XFF,0XF3,0XC7,0XCF,0XFC,0X00,0X01,0XF8,0X7F,0XF8,0X1F,0X87,0XFF,
+0XFF,0XF1,0XC7,0X8F,0XFE,0X00,0X03,0XFE,0X7F,0XF8,0X00,0X07,0XFF,0XFF,0XF8,0X16,
+0X1F,0XFF,0X80,0X07,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFC,0X36,0X7F,0XFF,0XE0,
+0X1F,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,
+0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X38,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XF8,0X44,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF8,0X42,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X21,
+0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF8,0X07,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0XF0,
+0X03,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X07,0XE0,0X00,0XFF,0XF8,
+0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X07,0XC0,0X00,0XFF,0XF8,0X18,0X07,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFC,0X07,0XC0,0XE0,0X7F,0XF8,0X07,0X07,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFC,0X1F,0X83,0XF0,0X7F,0XF8,0X00,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,
+0X00,0X00,0X0F,0XF8,0X07,0X27,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X0F,
+0XF8,0X18,0X27,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X0F,0XF8,0X00,0X07,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0X07,0XF8,0X7F,0XF8,0X1F,0X87,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFC,0X0E,0X0F,0XF0,0X7F,0XF8,0X00,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X00,0X0F,0XC0,0XFF,0XF8,0X00,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X1F,0X00,
+0XFF,0XF8,0X1F,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X3F,0X01,0XFF,0XF8,0X00,
+0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X7F,0X03,0XFF,0XF8,0X00,0X07,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XF8,0X37,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X48,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF8,0X48,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
+0X48,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0X87,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,
+0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0X1E,0X7F,0XFF,
+0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0X80,0X7F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,
+0X00,0X01,0XFF,0XFF,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X1E,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,
+0X00,0X00,0X01,0XFF,0XFF,0XFC,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,
+0XFF,0XFF,0XE0,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0X80,
+0X7F,0XF9,0XE7,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X09,0XFF,0XF9,0XE7,
+0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFC,0X19,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X09,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,
+0X01,0XFF,0XFF,0X80,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XF0,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X7F,0XFF,
+0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,
+0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFC,0X07,0XFF,0XFF,0XF0,0X00,0X00,
+0X00,0X01,0XFF,0XFF,0XF8,0X7F,0XF8,0X07,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,
+0XFF,0XFE,0X7F,0XF9,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7E,0X7F,
+0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XF9,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XF8,0X07,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFC,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X7E,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X07,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X07,0XFF,0XFC,0X0F,0XFF,0XFF,0XF0,0X00,0X00,0X00,
+0X01,0XFF,0XFE,0X66,0X7F,0XFB,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X00,0X7F,0XFB,0XF7,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFB,
+0XF7,0XC0,0X07,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X7F,0XFC,0X0F,0XC0,0X07,
+0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X7E,0X7F,0XFC,0X0F,0XEF,0XBF,0XF0,0X00,0X00,
+0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0X30,0XFF,0XFF,0XFF,0XFC,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X60,0X7F,
+0XC8,0X07,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X40,0X7F,0XC8,0X07,0XFF,
+0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X02,0X7F,0XFF,0XFF,0XE0,0X1F,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFE,0X06,0X7F,0XFB,0XF7,0XE0,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0X08,0XFF,0XFB,0XF7,0XCF,0XC7,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,
+0XFF,0XC0,0X07,0XDF,0XE7,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X7E,0X7F,0XE0,0X0F,
+0XCF,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFB,0XFF,0XC0,0X0F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XE0,0X1F,0XF0,0X00,0X00,0X00,
+0X01,0XFF,0XFE,0X00,0X7F,0XF8,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X7E,0X7F,0XF8,0X0F,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X81,0XFF,0XFF,0XF7,0XC0,0X07,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XF7,0XC0,0X07,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XF8,0X07,0XE7,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,
+0XFE,0X3E,0X7F,0XF8,0X07,0XF3,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X7E,0X7F,
+0XFF,0XFF,0XF9,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,
+0X00,0X00,0X01,0XFF,0XFE,0X00,0X7F,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X7E,0X7F,0XC0,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFC,0X0F,0XF3,0XE7,0XF0,
+0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XF8,0X07,0XF0,0X87,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0X81,0XFF,0XF9,0XE7,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0X00,0XFF,0XFB,0XF7,0XFC,0X1F,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X7F,0XF9,
+0XE7,0XF0,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3E,0X7F,0XFC,0X0F,0XF3,0XE7,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7E,0X7F,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFE,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X7F,
+0XFD,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7E,0X7F,0XF9,0X87,0XFF,
+0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFB,0X37,0XFF,0XFF,0XF0,0X00,
+0X00,0X00,0X01,0XFF,0XFF,0XC1,0XFF,0XFA,0X37,0XE1,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0X00,0XFF,0XF8,0X67,0XE0,0X67,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
+0X7F,0XFC,0X67,0XCC,0X67,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X3E,0X7F,0XFF,0XFF,
+0XDF,0X27,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X7C,0X7F,0XFF,0XFF,0XDF,0X07,0XF0,
+0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X7F,0XFE,0X3F,0XC7,0X87,0XF0,0X00,0X00,0X00,
+0X01,0XFF,0XFF,0X00,0XFF,0XFC,0X37,0XE7,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0X81,0XFF,0XF9,0XB7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,
+0XB7,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFB,0XB7,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1,0XFF,0XF9,0XA7,0XFF,0XFF,0XF0,0X00,0X00,
+0X00,0X01,0XFF,0XFF,0X00,0XFF,0XFC,0X0F,0XC0,0X07,0XF0,0X00,0X00,0X00,0X01,0XFF,
+0XFE,0X00,0X7F,0XFE,0X1F,0XC0,0X07,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X3E,0X7F,
+0XFF,0XFF,0XF7,0XFF,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X7C,0X7F,0XFF,0XF7,0XF9,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XF1,0XE7,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0XFF,0XC0,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0X81,0XFF,0XCE,0X1F,0XE1,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XCE,0X3F,0XC0,0X67,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF3,0XFF,0XCE,0X7F,
+0XCC,0X27,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X10,0XFF,0XCE,0X7F,0XDF,0X27,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X10,0XFF,0XC0,0X07,0XDF,0X87,0XF0,0X00,0X00,0X00,
+0X01,0XFF,0XFE,0X72,0X7F,0XC0,0X07,0XE7,0XC7,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,
+0X7E,0X7F,0XFF,0XFF,0XE7,0XE7,0XF0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X3C,0X7F,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,};
+
+#endif

+ 210 - 0
src/bitmaps/WS_Bitmaps104x212.h

@@ -0,0 +1,210 @@
+/**
+ *  @filename   :   imagedata.cpp
+ *  @brief      :   data file for epd demo
+ *
+ *  Copyright (C) Waveshare     August 22 2017
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documnetation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to  whom the Software is
+ * furished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef _WS_Bitmaps104x212_H_
+#define _WS_Bitmaps104x212_H_
+
+#if defined(ESP8266) || defined(ESP32)
+#include <pgmspace.h>
+#else
+#include <avr/pgmspace.h>
+#endif
+
+const unsigned char WS_Bitmap104x212[2762] PROGMEM = { /* 0X00,0X01,0X68,0X00,0XD4,0X00, */
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,
+    0XFC,0X0C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0X1C,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0X9C,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X07,0XDC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X38,0X07,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X74,0X06,0X7C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X66,0X06,0X7C,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X66,0X02,0X7C,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE4,0X00,0X3C,0X00,0X00,0X01,0X80,0X00,0X00,
+    0X00,0X00,0X00,0X01,0XC0,0X00,0X3C,0X00,0X0E,0X01,0X80,0X00,0X00,0X00,0X00,0X00,
+    0X7F,0XC0,0X00,0X3C,0X00,0X0E,0X01,0X80,0X00,0X00,0X00,0X00,0X1F,0XC0,0X00,0X00,
+    0X7C,0X00,0X0E,0XE1,0X80,0X00,0X00,0X00,0X00,0X3F,0X00,0X00,0X00,0X7C,0X00,0X0E,
+    0XE1,0X80,0X00,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00,
+    0X00,0X00,0X00,0X70,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X04,0X00,0X00,
+    0XC0,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X04,0X00,0X01,0XC0,0X00,0X00,
+    0X01,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X0C,0X00,0X07,0X80,0X00,0X00,0X01,0XFC,0X00,
+    0X0E,0XE1,0X80,0X00,0X1E,0X00,0X0F,0X00,0X00,0X00,0X03,0XDC,0X00,0X0E,0XE1,0X80,
+    0X00,0X1E,0X00,0X3C,0X00,0X00,0X00,0X3F,0X1C,0X00,0X0E,0XE1,0X80,0X00,0X3B,0X00,
+    0X78,0X00,0X00,0X00,0XFE,0X1C,0X00,0X0F,0XE1,0X80,0X00,0X3B,0X00,0X70,0X00,0X00,
+    0X01,0XFE,0X1E,0X00,0X0F,0XFF,0X80,0X00,0X33,0X00,0X70,0X00,0X00,0X07,0XF8,0X1E,
+    0X00,0X0F,0XFF,0X80,0X00,0X33,0X00,0X7C,0X00,0X00,0X07,0XC0,0X0E,0X00,0X0F,0XFF,
+    0X80,0X00,0X73,0X00,0X3F,0XFF,0XC0,0X07,0XFF,0XCE,0X00,0X00,0X00,0X00,0X00,0X63,
+    0X00,0X1F,0XFF,0XC0,0X01,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X63,0X00,0X1F,0XFF,
+    0XC0,0X00,0XFF,0XFF,0X00,0X07,0XF0,0X80,0X00,0X63,0X00,0XFF,0X80,0X00,0X00,0X00,
+    0XF7,0X80,0X07,0XF0,0X80,0X00,0X63,0X00,0XFE,0X00,0X00,0X00,0X00,0X7F,0X80,0X07,
+    0XF9,0X80,0X00,0X63,0X01,0XF8,0X00,0X00,0X00,0X00,0X3F,0X80,0X0E,0X3B,0X80,0X00,
+    0X63,0X03,0XE0,0X00,0X00,0X00,0X00,0X3F,0X80,0X0E,0X3F,0X80,0X00,0X63,0X07,0X80,
+    0X00,0X00,0X00,0X00,0X1F,0X80,0X0E,0X3F,0X00,0X00,0X63,0X0F,0X00,0X00,0X00,0X00,
+    0X00,0X1F,0X80,0X0E,0X3F,0X00,0X00,0X63,0X1E,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,
+    0X0E,0X3E,0X00,0X00,0X63,0XFC,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00,
+    0X00,0X67,0XF8,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00,0X00,0X67,0XF0,
+    0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00,0X00,0X67,0XE0,0X00,0X00,0X00,
+    0X00,0X00,0X0F,0X80,0X0E,0X38,0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X1F,
+    0X80,0X0E,0X38,0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X0E,0X78,
+    0X00,0X00,0X7F,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X0F,0XFF,0X80,0X00,0X7F,
+    0X00,0X00,0X00,0X00,0X07,0XFF,0XF8,0X00,0X0F,0XFF,0X80,0X00,0X3F,0X00,0X00,0X00,
+    0X00,0X3F,0X01,0XF0,0X00,0X0F,0XFF,0X00,0X00,0X3F,0X00,0X00,0X00,0X00,0XF8,0X01,
+    0XE0,0X00,0X00,0X00,0X00,0X00,0X3E,0X00,0X00,0X00,0X07,0XE0,0X00,0XF0,0X00,0X00,
+    0X00,0X00,0X00,0X1E,0X00,0X00,0X00,0X0F,0X80,0X00,0X78,0X00,0X07,0XFF,0X80,0X00,
+    0X1E,0X00,0X00,0X00,0X1F,0X00,0X00,0X3C,0X00,0X07,0XFF,0X80,0X00,0X1E,0X00,0X00,
+    0X00,0X1E,0X00,0X00,0X1E,0X00,0X07,0XFF,0X80,0X00,0X0E,0X00,0X00,0X00,0X18,0X00,
+    0X00,0X07,0X00,0X0F,0X18,0X00,0X00,0X06,0X00,0X00,0X00,0X18,0X00,0X00,0X07,0X80,
+    0X0E,0X18,0X00,0X00,0X07,0X00,0X00,0X00,0X70,0X00,0X00,0X07,0X80,0X0E,0X18,0X00,
+    0X00,0X07,0X00,0X00,0X01,0XE0,0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X07,0X00,
+    0X00,0X0F,0XE0,0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X03,0X80,0X00,0X3F,0XF0,
+    0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X03,0X80,0X00,0X00,0X3F,0X00,0X00,0X03,
+    0X80,0X0E,0X18,0X00,0X00,0X03,0XC0,0X00,0X00,0X3F,0X00,0X00,0X03,0X80,0X0E,0X18,
+    0X00,0X00,0X03,0XC0,0X00,0X00,0X3E,0X00,0X00,0X07,0X80,0X0F,0X18,0X00,0X00,0X01,
+    0XE0,0X00,0X00,0X3C,0X04,0X00,0X07,0X80,0X07,0XFF,0X80,0X00,0X01,0XE0,0X00,0X00,
+    0X3C,0X04,0X00,0X07,0X80,0X07,0XFF,0X80,0X00,0X00,0XF0,0X00,0X00,0X1C,0X1C,0X60,
+    0X07,0X80,0X03,0XFF,0X80,0X00,0X00,0XF0,0X00,0X00,0X1E,0X3F,0XF0,0X07,0X80,0X00,
+    0X00,0X00,0X00,0X00,0X7F,0XF8,0X00,0X1F,0X7F,0XF0,0X07,0X80,0X00,0X00,0X00,0X00,
+    0X00,0X7F,0XFF,0X80,0X1F,0XFF,0XF0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X3F,0XFF,
+    0XC0,0X0F,0XFF,0XE0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X0F,0XFF,0XF0,0X00,0X7C,
+    0XC0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X03,0XFF,0XF8,0X00,0X18,0XE0,0X07,0X80,
+    0X00,0XE0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X00,0XF0,0X07,0X80,0X00,0XE0,0X00,
+    0X00,0X00,0X00,0XFF,0XFF,0X00,0X00,0XF0,0X0F,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,
+    0XFF,0XFF,0X80,0X00,0XF0,0X0E,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X7F,0XFF,0XE0,
+    0X00,0XF0,0X0E,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XF0,0X0E,
+    0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XE0,0X00,0XF0,0X0E,0X00,0X00,0XE0,
+    0X00,0X00,0X00,0X00,0X00,0X7F,0XF0,0X00,0XF0,0X06,0X00,0X00,0XE0,0X00,0X00,0X00,
+    0X00,0X00,0X07,0XF0,0X00,0XF0,0X07,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0X01,
+    0XF0,0X00,0XF0,0X07,0X80,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X98,0X00,0XF0,
+    0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X01,0XF0,0X07,0X80,0X0F,
+    0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1E,0X01,0XF0,0X07,0X00,0X0F,0XFF,0X80,0X00,
+    0X00,0X00,0X00,0X00,0X0F,0X81,0XF0,0X0E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X07,0X81,0XF0,0X0E,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X81,
+    0XF0,0X0E,0X00,0X0C,0X7F,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC1,0XF0,0X0E,0X00,
+    0X0E,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X01,0XC0,0XE0,0X0F,0X00,0X0E,0XE3,0X80,
+    0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0X07,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00,
+    0X00,0X00,0X00,0XE0,0X00,0X07,0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X60,0X00,0X07,0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X07,
+    0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X07,0X80,0X0E,0XE3,
+    0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X70,0X00,0X0F,0X00,0X0E,0XE3,0X80,0X00,0X00,
+    0X00,0X00,0X00,0X00,0XF0,0X00,0X0E,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X01,
+    0XFF,0XFF,0XC0,0X0E,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XF8,
+    0X0E,0X00,0X0F,0XE3,0X80,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFC,0X0F,0X00,0X07,
+    0XE3,0X80,0X00,0X00,0X00,0X0F,0XFC,0X00,0X03,0XFF,0XFF,0X00,0X07,0XE3,0X80,0X00,
+    0X00,0X00,0X3F,0XE0,0X7F,0XFC,0X7F,0XFF,0X80,0X07,0XC3,0X80,0X00,0X00,0X00,0XFF,
+    0XCF,0XFF,0XFF,0XE7,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X3F,0XFF,0XFF,
+    0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,0XFF,0XFF,0XFF,0XFE,0XFF,0X80,
+    0X0E,0X01,0X80,0X00,0X00,0X0F,0X81,0XFF,0XFF,0XFF,0XFE,0X7F,0X00,0X0E,0X01,0X80,
+    0X00,0X00,0X1F,0X00,0XFF,0XFF,0XFF,0XFE,0X3E,0X00,0X0E,0XE1,0X80,0X00,0X00,0X7E,
+    0X00,0XFF,0XFF,0XFF,0XFF,0XBE,0X00,0X0E,0XE1,0X80,0X00,0X00,0XFC,0X01,0XFF,0X7F,
+    0XFF,0XFF,0XC7,0X80,0X0E,0XE1,0X80,0X00,0X01,0XF8,0X00,0XFE,0X3F,0XFF,0XFF,0XC3,
+    0X80,0X0E,0XE1,0X80,0X00,0X03,0XF0,0X00,0X7F,0XFF,0XFF,0XFF,0XE3,0X80,0X0E,0XE1,
+    0X80,0X00,0X03,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XF1,0X80,0X0E,0XE1,0X80,0X00,0X03,
+    0XC0,0X01,0XFF,0XFF,0XFF,0XFF,0XF1,0XC0,0X0E,0XE1,0X80,0X00,0X03,0X80,0X03,0XFF,
+    0XFF,0XFF,0XFF,0XF8,0XE0,0X0E,0XE1,0X80,0X00,0X07,0X00,0X01,0XFF,0XFF,0XFF,0XFF,
+    0XFC,0XE0,0X0E,0XE1,0X80,0X00,0X0E,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0X70,0X0F,
+    0XE1,0X80,0X00,0X1C,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFE,0X70,0X0F,0XE1,0X80,0X00,
+    0X1C,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00,
+    0X20,0X7F,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00,0X30,0X1F,0XFF,
+    0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00,0X38,0X0F,0XFF,0XFF,0XFF,0XF0,
+    0X00,0X00,0X00,0X00,0X38,0X00,0X00,0X1E,0X03,0XFF,0XFF,0XFF,0XF0,0X0C,0X00,0X00,
+    0X00,0X78,0X00,0X00,0X0F,0XE0,0X7F,0XFF,0XFE,0XF0,0X0E,0X00,0X00,0X00,0X70,0X00,
+    0X00,0X01,0XFC,0X00,0X0F,0XF9,0X80,0X07,0X80,0X00,0X00,0XF0,0X00,0X00,0X00,0X7F,
+    0XC0,0X01,0XE7,0X80,0X07,0XC0,0X00,0X00,0XE0,0X00,0X00,0X00,0X0F,0XFF,0XFE,0X3F,
+    0X00,0X01,0XE0,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFE,0X00,0X00,0XF8,
+    0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFE,0X00,0X00,0X7C,0X00,0X00,0XF0,
+    0X00,0X00,0X00,0X00,0X01,0XFF,0XFC,0X00,0X00,0X1F,0X00,0X00,0XF0,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X1C,0X00,0X00,0X0F,0X80,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X1C,0X00,0X00,0X07,0X80,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,
+    0X1F,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X3E,0X00,0X00,
+    0X78,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0XF8,0X00,0X00,0X78,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X1C,0X00,0X01,0XF0,0X00,0X00,0X7C,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X1C,0X00,0X07,0XE0,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,
+    0X0F,0X80,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X0E,0X00,0X00,
+    0X00,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X0C,0X00,0X00,0X00,0X0E,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X07,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X0C,
+    0X00,0X03,0XFF,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X07,0XFF,
+    0X80,0X00,0X03,0XC0,0X00,0X07,0X00,0X00,0X00,0X0C,0X00,0X07,0XFF,0X80,0X00,0X01,
+    0XF0,0X00,0X0F,0X00,0X00,0X00,0X0C,0X00,0X07,0X3B,0X00,0X00,0X00,0X78,0X00,0X3F,
+    0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X3C,0X00,0X3E,0X00,0X00,0X00,
+    0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X0F,0X00,0X7C,0X00,0X00,0X00,0X0E,0X00,0X0E,
+    0X18,0X00,0X00,0X00,0X07,0X00,0XF8,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,
+    0X00,0X07,0X01,0XF0,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X03,0X01,
+    0XC0,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X01,0X80,0X00,0X00,0X00,
+    0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X00,0X80,0X00,0X00,0X00,0X00,0X0E,0X00,
+    0X0E,0X18,0X00,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X0F,0X18,0X00,
+    0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X07,0XFF,0X80,0X00,0X00,0X00,
+    0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X07,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X00,
+    0X00,0X00,0X0E,0X00,0X03,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0E,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0F,0X00,0X0F,0XFF,0X00,0X00,0X00,
+    0X00,0XE0,0X00,0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0XF0,0X00,
+    0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,
+    0X0F,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,
+    0X03,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00,
+    0X00,0X00,0X70,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X78,
+    0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X38,0X00,0X00,0X00,
+    0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X0F,0X80,
+    0X00,0X03,0X80,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80,
+    0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X1F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,
+    0X3C,0X00,0X00,0X00,0X00,0X1F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0X1E,0X00,0X00,
+    0X00,0X00,0X1F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X1F,0X00,0X00,0X00,0X00,0X1F,
+    0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X0F,0X00,0X00,0X00,0X00,0X3F,0X80,0X00,0X03,
+    0X80,0X00,0X00,0X00,0X07,0X80,0X00,0X00,0X00,0X3F,0X80,0X00,0X03,0X80,0X00,0X00,
+    0X00,0X07,0X80,0X00,0X00,0X00,0X3F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X07,0XC0,
+    0X00,0X00,0X00,0X3B,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X03,0XC0,0X00,0X00,0X00,
+    0X79,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X01,0XC0,0X00,0X00,0X00,0X7B,0X80,0X00,
+    0X07,0X80,0X00,0X00,0X00,0X01,0XC0,0X00,0X00,0X00,0XF3,0X80,0X0F,0XFF,0X80,0X00,
+    0X00,0X00,0X00,0XF0,0X00,0X00,0X01,0XF3,0X80,0X0F,0XFF,0X00,0X00,0X00,0X00,0X00,
+    0X38,0X00,0X00,0X01,0XE3,0X80,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,0X3C,0X00,0X00,
+    0X01,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3E,0X00,0X00,0X01,0XC3,0X80,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X01,0X83,0X80,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X0F,0XC0,0X00,0X03,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X07,0XE0,0X00,0X07,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF0,
+    0X00,0X1E,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XC3,
+    0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XE3,0X80,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XDF,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X03,0X8F,0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X03,0X0F,0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X87,
+    0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XC7,0XF3,0X80,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF3,0XE3,0X80,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X7F,0X83,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X3F,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+    0X00,0X00,0X00,0X00,
+};
+
+#endif

+ 350 - 0
src/epd/GxEPD2_213_B72.cpp

@@ -0,0 +1,350 @@
+// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
+// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines!
+//
+// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
+// Controller: IL3897 :
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#include "GxEPD2_213_B72.h"
+
+GxEPD2_213_B72::GxEPD2_213_B72(int8_t cs, int8_t dc, int8_t rst, int8_t busy) :
+  GxEPD2_EPD(cs, dc, rst, busy, HIGH, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
+{
+}
+
+void GxEPD2_213_B72::clearScreen(uint8_t value)
+{
+  if (_initial)
+  {
+    _Init_Full();
+    _writeCommand(0x26); // preset previous
+    for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+    {
+      _writeData(0xFF); // 0xFF is white
+    }
+    _writeCommand(0x24); // set current
+    for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+    {
+      _writeData(value);
+    }
+    _Update_Full();
+    _initial = false;
+  }
+  if (!_using_partial_mode) _Init_Part();
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+  _writeCommand(0x24); // set current
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _writeData(value);
+  }
+  _Update_Part();
+  _writeCommand(0x26); // set previous same
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _writeData(value);
+  }
+}
+
+void GxEPD2_213_B72::writeScreenBuffer(uint8_t value)
+{
+  if (_initial) clearScreen(value);
+  else _writeScreenBuffer(value);
+}
+
+void GxEPD2_213_B72::_writeScreenBuffer(uint8_t value)
+{
+  if (!_using_partial_mode) _Init_Part();
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+  _writeCommand(0x24);
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _writeData(value);
+  }
+}
+
+void GxEPD2_213_B72::writeScreenBufferAgain(uint8_t value)
+{
+  if (!_using_partial_mode) _Init_Part();
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+  _writeCommand(0x26);
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _writeData(value);
+  }
+}
+
+void GxEPD2_213_B72::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_213_B72::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_213_B72::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
+  x -= x % 8; // byte boundary
+  w = wb * 8; // byte boundary
+  int16_t x1 = x < 0 ? 0 : x; // limit
+  int16_t y1 = y < 0 ? 0 : y; // limit
+  int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
+  int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
+  int16_t dx = x1 - x;
+  int16_t dy = y1 - y;
+  w1 -= dx;
+  h1 -= dy;
+  if ((w1 <= 0) || (h1 <= 0)) return;
+  if (!_using_partial_mode) _Init_Part();
+  _setPartialRamArea(x1, y1, w1, h1);
+  _writeCommand(command);
+  for (int16_t i = 0; i < h1; i++)
+  {
+    for (int16_t j = 0; j < w1 / 8; j++)
+    {
+      uint8_t data;
+      // use wb, h of bitmap for index!
+      int16_t idx = mirror_y ? j + dx / 8 + ((h - 1 - (i + dy))) * wb : j + dx / 8 + (i + dy) * wb;
+      if (pgm)
+      {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+        data = pgm_read_byte(&bitmap[idx]);
+#else
+        data = bitmap[idx];
+#endif
+      }
+      else
+      {
+        data = bitmap[idx];
+      }
+      if (invert) data = ~data;
+      else _writeData(data);
+    }
+  }
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_213_B72::writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (black)
+  {
+    writeImage(black, x, y, w, h, invert, mirror_y, pgm);
+  }
+}
+
+void GxEPD2_213_B72::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (data1)
+  {
+    writeImage(data1, x, y, w, h, invert, mirror_y, pgm);
+  }
+}
+
+void GxEPD2_213_B72::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+  writeImageAgain(bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_213_B72::drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (black)
+  {
+    drawImage(black, x, y, w, h, invert, mirror_y, pgm);
+  }
+}
+
+void GxEPD2_213_B72::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (data1)
+  {
+    drawImage(data1, x, y, w, h, invert, mirror_y, pgm);
+  }
+}
+
+void GxEPD2_213_B72::refresh(bool partial_update_mode)
+{
+  if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
+  else
+  {
+    if (_using_partial_mode) _Init_Full();
+    _Update_Full();
+  }
+}
+
+void GxEPD2_213_B72::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  x -= x % 8; // byte boundary
+  w -= x % 8; // byte boundary
+  int16_t x1 = x < 0 ? 0 : x; // limit
+  int16_t y1 = y < 0 ? 0 : y; // limit
+  int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
+  int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
+  w1 -= x1 - x;
+  h1 -= y1 - y;
+  if (!_using_partial_mode) _Init_Part();
+  _setPartialRamArea(x1, y1, w1, h1);
+  _Update_Part();
+}
+
+void GxEPD2_213_B72::powerOff(void)
+{
+  _PowerOff();
+}
+
+void GxEPD2_213_B72::hibernate()
+{
+  _PowerOff();
+  if (_rst >= 0)
+  {
+    _writeCommand(0x10); // deep sleep mode
+    _writeData(0x1);     // enter deep sleep
+    _hibernating = true;
+  }
+}
+
+void GxEPD2_213_B72::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
+{
+  _writeCommand(0x11); // set ram entry mode
+  _writeData(0x03);    // x increase, y increase : normal mode
+  _writeCommand(0x44);
+  _writeData(x / 8);
+  _writeData((x + w - 1) / 8);
+  _writeCommand(0x45);
+  _writeData(y % 256);
+  _writeData(y / 256);
+  _writeData((y + h - 1) % 256);
+  _writeData((y + h - 1) / 256);
+  _writeCommand(0x4e);
+  _writeData(x / 8);
+  _writeCommand(0x4f);
+  _writeData(y % 256);
+  _writeData(y / 256);
+}
+
+void GxEPD2_213_B72::_PowerOn()
+{
+  if (!_power_is_on)
+  {
+    _writeCommand(0x22);
+    _writeData(0xc0);
+    _writeCommand(0x20);
+    _waitWhileBusy("_PowerOn", power_on_time);
+  }
+  _power_is_on = true;
+}
+
+void GxEPD2_213_B72::_PowerOff()
+{
+  _writeCommand(0x22);
+  _writeData(0xc3);
+  _writeCommand(0x20);
+  _waitWhileBusy("_PowerOff", power_off_time);
+  _power_is_on = false;
+  _using_partial_mode = false;
+}
+
+void GxEPD2_213_B72::_InitDisplay()
+{
+  if (_hibernating) _reset();
+  _writeCommand(0x74); //set analog block control
+  _writeData(0x54);
+  _writeCommand(0x7E); //set digital block control
+  _writeData(0x3B);
+  _writeCommand(0x01); //Driver output control
+  _writeData(0xF9);    // (HEIGHT - 1) % 256
+  _writeData(0x00);    // (HEIGHT - 1) / 256
+  _writeData(0x00);
+  _writeCommand(0x3C); //BorderWavefrom
+  _writeData(0x03);
+  _writeCommand(0x2C); //VCOM Voltage
+  _writeData(0x70);    // NA ??
+  _writeCommand(0x03); //Gate Driving voltage Control
+  _writeData(0x15);    // 19V
+  _writeCommand(0x04); //Source Driving voltage Control
+  _writeData(0x41);    // VSH1 15V
+  _writeData(0xA8);    // VSH2 5V
+  _writeData(0x32);    // VSL -15V
+  _writeCommand(0x3A); //Dummy Line
+  _writeData(0x30);
+  _writeCommand(0x3B); //Gate time
+  _writeData(0x0A);
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+}
+
+const uint8_t GxEPD2_213_B72::LUT_DATA_full[] PROGMEM =
+{
+  0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, //LUT0: BB:     VS 0 ~7
+  0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, //LUT1: BW:     VS 0 ~7
+  0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, //LUT2: WB:     VS 0 ~7
+  0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, //LUT3: WW:     VS 0 ~7
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT4: VCOM:   VS 0 ~7
+  0x03, 0x03, 0x00, 0x00, 0x02, // TP0 A~D RP0
+  0x09, 0x09, 0x00, 0x00, 0x02, // TP1 A~D RP1
+  0x03, 0x03, 0x00, 0x00, 0x02, // TP2 A~D RP2
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP3 A~D RP3
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP4 A~D RP4
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP5 A~D RP5
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP6 A~D RP6
+};
+
+const uint8_t GxEPD2_213_B72::LUT_DATA_part[] PROGMEM =
+{
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT0: BB:     VS 0 ~7
+  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT1: BW:     VS 0 ~7
+  0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT2: WB:     VS 0 ~7
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT3: WW:     VS 0 ~7
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //LUT4: VCOM:   VS 0 ~7
+  0x0A, 0x00, 0x00, 0x00, 0x00, // TP0 A~D RP0
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP1 A~D RP1
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP2 A~D RP2
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP3 A~D RP3
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP4 A~D RP4
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP5 A~D RP5
+  0x00, 0x00, 0x00, 0x00, 0x00, // TP6 A~D RP6
+};
+
+void GxEPD2_213_B72::_Init_Full()
+{
+  _InitDisplay();
+  _writeCommand(0x32);
+  _writeDataPGM(LUT_DATA_full, sizeof(LUT_DATA_full));
+  _PowerOn();
+  _using_partial_mode = false;
+}
+
+void GxEPD2_213_B72::_Init_Part()
+{
+  _InitDisplay();
+  _writeCommand(0x2C); //VCOM Voltage
+  _writeData(0x26);    // NA ??
+  _writeCommand(0x32);
+  _writeDataPGM(LUT_DATA_part, sizeof(LUT_DATA_part));
+  _PowerOn();
+  _using_partial_mode = true;
+}
+
+void GxEPD2_213_B72::_Update_Full()
+{
+  _writeCommand(0x22);
+  _writeData(0xc4);
+  _writeCommand(0x20);
+  _waitWhileBusy("_Update_Full", full_refresh_time);
+}
+
+void GxEPD2_213_B72::_Update_Part()
+{
+  _writeCommand(0x22);
+  _writeData(0x04);
+  _writeCommand(0x20);
+  _waitWhileBusy("_Update_Part", partial_refresh_time);
+}

+ 71 - 0
src/epd/GxEPD2_213_B72.h

@@ -0,0 +1,71 @@
+// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
+// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines!
+//
+// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
+// Controller: IL3897 :
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_213_B72_H_
+#define _GxEPD2_213_B72_H_
+
+#include "../GxEPD2_EPD.h"
+
+class GxEPD2_213_B72 : public GxEPD2_EPD
+{
+  public:
+    // attributes
+    static const uint16_t WIDTH = 128;
+    static const uint16_t HEIGHT = 250;
+    static const GxEPD2::Panel panel = GxEPD2::GDEH0213B72;
+    static const bool hasColor = false;
+    static const bool hasPartialUpdate = true;
+    static const bool hasFastPartialUpdate = true;
+    static const uint16_t power_on_time = 100; // ms, e.g. 91291us
+    static const uint16_t power_off_time = 180; // ms, e.g. 172648us
+    static const uint16_t full_refresh_time = 1700; // ms, e.g. 1686008us
+    static const uint16_t partial_refresh_time = 200; // ms, e.g. 192385us
+    // constructor
+    GxEPD2_213_B72(int8_t cs, int8_t dc, int8_t rst, int8_t busy);
+    // methods (virtual)
+    //  Support for Bitmaps (Sprites) to Controller Buffer and to Screen
+    void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white)
+    void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white)
+    void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white)
+    // write to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // for differential update: set current and previous buffers equal (for fast partial update to work correctly)
+    void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen
+    void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen
+    void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time
+    void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0)
+  private:
+    void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void _writeScreenBuffer(uint8_t value);
+    void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
+    void _PowerOn();
+    void _PowerOff();
+    void _InitDisplay();
+    void _Init_Full();
+    void _Init_Part();
+    void _Update_Full();
+    void _Update_Part();
+  private:
+    static const uint8_t LUT_DATA_full[];
+    static const uint8_t LUT_DATA_part[];
+};
+
+#endif

+ 12 - 3
src/epd/GxEPD2_270.cpp

@@ -52,9 +52,8 @@ void GxEPD2_270::clearScreen(uint8_t value)
 
 void GxEPD2_270::writeScreenBuffer(uint8_t value)
 {
-  //if (_initial) clearScreen(value);
-  //else _writeScreenBuffer(value);
-  clearScreen(value);
+  if (_initial) clearScreen(value);
+  else _writeScreenBuffer(value);
 }
 
 void GxEPD2_270::_writeScreenBuffer(uint8_t value)
@@ -67,6 +66,16 @@ void GxEPD2_270::_writeScreenBuffer(uint8_t value)
   }
 }
 
+void GxEPD2_270::writeScreenBufferAgain(uint8_t value)
+{
+  _Init_Part();
+  _setPartialRamArea(0x14, 0, 0, WIDTH, HEIGHT);
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _writeData(value);
+  }
+}
+
 void GxEPD2_270::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
 {
   _writeImage(0x15, bitmap, x, y, w, h, invert, mirror_y, pgm);

+ 1 - 0
src/epd/GxEPD2_270.h

@@ -35,6 +35,7 @@ class GxEPD2_270 : public GxEPD2_EPD
     //  Support for Bitmaps (Sprites) to Controller Buffer and to Screen
     void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white)
     void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white)
+    void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white)
     // write to controller memory, without screen refresh; x and w should be multiple of 8
     void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
     void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);

+ 6 - 4
src/it8951/GxEPD2_it60.cpp

@@ -57,7 +57,8 @@
 
 GxEPD2_it60::GxEPD2_it60(int8_t cs, int8_t dc, int8_t rst, int8_t busy) :
   GxEPD2_EPD(cs, dc, rst, busy, LOW, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate),
-  _spi_settings(1000000, MSBFIRST, SPI_MODE0)
+  _spi_settings(24000000, MSBFIRST, SPI_MODE0),
+  _spi_settings_for_read(1000000, MSBFIRST, SPI_MODE0)
 {
 }
 
@@ -77,7 +78,7 @@ void GxEPD2_it60::init(uint32_t serial_diag_bitrate, bool initial, bool pulldown
     delay(200);
     digitalWrite(_rst, HIGH);
     delay(200);
-    _waitWhileBusy("init reset_to_ready", reset_to_redy_time);
+    _waitWhileBusy("init reset_to_ready", reset_to_ready_time);
   }
 
   _writeCommand16(USDEF_I80_CMD_GET_DEV_INFO);
@@ -118,7 +119,7 @@ void GxEPD2_it60::clearScreen(uint8_t value)
   {
     SPI.transfer(value);
 #if defined(ESP8266) || defined(ESP32)
-    if(0 == i % 10000) yield();
+    if (0 == i % 10000) yield();
 #endif
   }
   if (_cs >= 0) digitalWrite(_cs, HIGH);
@@ -146,7 +147,7 @@ void GxEPD2_it60::_writeScreenBuffer(uint8_t value)
   {
     SPI.transfer(value);
 #if defined(ESP8266) || defined(ESP32)
-    if(0 == i % 10000) yield();
+    if (0 == i % 10000) yield();
 #endif
   }
   if (_cs >= 0) digitalWrite(_cs, HIGH);
@@ -519,6 +520,7 @@ void GxEPD2_it60::_readData16(uint16_t* d, uint32_t n)
   for (uint32_t i = 0; i < n; i++)
   {
     *d++ = _transfer16(0);
+    //_waitWhileBusy("_readData16 data", default_wait_time);
   }
   if (_cs >= 0) digitalWrite(_cs, HIGH);
   SPI.endTransaction();

+ 2 - 1
src/it8951/GxEPD2_it60.h

@@ -29,7 +29,7 @@ class GxEPD2_it60 : public GxEPD2_EPD
     static const bool hasColor = false;
     static const bool hasPartialUpdate = true;
     static const bool hasFastPartialUpdate = true;
-    static const uint16_t reset_to_redy_time = 1800; // ms, e.g. 1721883us
+    static const uint16_t reset_to_ready_time = 1800; // ms, e.g. 1721883us
     static const uint16_t power_on_time = 10; // ms, e.g. 3879us
     static const uint16_t power_off_time = 200; // ms, e.g. 109875us
     static const uint16_t full_refresh_time = 600; // ms, e.g. 573921us
@@ -73,6 +73,7 @@ class GxEPD2_it60 : public GxEPD2_EPD
     };
     IT8951DevInfoStruct IT8951DevInfo;
     SPISettings _spi_settings;
+    SPISettings _spi_settings_for_read;
   private:
     void _writeScreenBuffer(uint8_t value);
     void _refresh(int16_t x, int16_t y, int16_t w, int16_t h, bool partial_update_mode);