Преглед изворни кода

Version 1.3.7

- added support for GDEW0102T4 1.02" b/w 80x128 panel or Waveshare 1.02" b/w board
- the GDEW0102T4 panel has a different connector than the other SPI panels
- the GDEW0102T4 panel can be used with the DESPI-C102 connection module
- https://buy-lcd.com/products/connection-board-demo-kit-for-102-inch-e-ink-display-despi-c102
- my test have been done with the Waveshare 1.02" b/w board
ZinggJM пре 5 година
родитељ
комит
7457c3e4a8
35 измењених фајлова са 1185 додато и 9 уклоњено
  1. 8 1
      README.md
  2. 63 7
      examples/GxEPD2_Example/GxEPD2_Example.ino
  3. 4 0
      examples/GxEPD2_Example/GxEPD2_display_selection.h
  4. 5 0
      examples/GxEPD2_Example/GxEPD2_display_selection_added.h
  5. 1 0
      examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h
  6. 1 0
      examples/GxEPD2_Example/GxEPD2_selection_check.h
  7. 4 0
      examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h
  8. 5 0
      examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h
  9. 1 0
      examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h
  10. 1 0
      examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h
  11. 4 0
      examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h
  12. 5 0
      examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h
  13. 1 0
      examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h
  14. 1 0
      examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h
  15. 1 0
      examples/GxEPD2_MinimumExample/GxEPD2_display_selection_new_style.h
  16. 1 0
      examples/GxEPD2_MinimumExample/GxEPD2_selection_check.h
  17. 1 0
      examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h
  18. 1 0
      examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h
  19. 1 0
      examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h
  20. 1 0
      examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h
  21. 1 0
      examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h
  22. 1 0
      examples/GxEPD2_SD_Example/GxEPD2_selection_check.h
  23. 1 0
      examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h
  24. 1 0
      examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h
  25. 1 0
      examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h
  26. 1 0
      examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h
  27. 1 0
      examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h
  28. 1 0
      examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h
  29. 1 1
      library.properties
  30. 1 0
      src/GxEPD2.h
  31. 1 0
      src/GxEPD2_BW.h
  32. 432 0
      src/bitmaps/Bitmaps80x128.h
  33. 120 0
      src/bitmaps/WS_Bitmaps80x128.h
  34. 429 0
      src/epd/GxEPD2_102.cpp
  35. 83 0
      src/epd/GxEPD2_102.h

+ 8 - 1
README.md

@@ -52,6 +52,7 @@
 - https://github.com/olikraus/u8glib/wiki/tpictureloop
 
 ### Supported SPI e-paper panels from Good Display:
+- GDEW0102T4     1.02" b/w
 - GDEP015OC1     1.54" b/w
 - GDEH0154D67    1.54" b/w, replacement for GDEP015OC1
 - GDEW0154T8     1.54" b/w 152x152
@@ -104,7 +105,13 @@
 - promotion panels from suppliers are welcome, to add support to GxEPD2
 - donation panels from users are welcome, to add support to GxEPD2
 
-### Version 1.3.6
+### Version 1.3.7
+- added support for GDEW0102T4 1.02" b/w 80x128 panel or Waveshare 1.02" b/w board
+- the GDEW0102T4 panel has a different connector than the other SPI panels
+- the GDEW0102T4 panel can be used with the DESPI-C102 connection module
+- https://buy-lcd.com/products/connection-board-demo-kit-for-102-inch-e-ink-display-despi-c102
+- my test have been done with the Waveshare 1.02" b/w board
+#### Version 1.3.6
 - added support for Waveshare 2.9" b/w V2, driver class GxEPD2_290_T94_V2
 - Waveshare 2.9" b/w V2 uses a GDEM029T94 variant without partial update wft in OTP
 - driver class GxEPD2_290_T94_V2 uses partial update wft written to registers

+ 63 - 7
examples/GxEPD2_Example/GxEPD2_Example.ino

@@ -43,6 +43,7 @@
 //                  therefore bitmaps may get optimized out by the linker
 
 // comment out unused bitmaps to reduce code space used
+#include "bitmaps/Bitmaps80x128.h"  // 1.02" b/w
 #include "bitmaps/Bitmaps152x152.h" // 1.54" b/w
 #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
 #include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
@@ -74,6 +75,7 @@
 #else
 
 // select only one to fit in code space
+//#include "bitmaps/Bitmaps80x128.h"  // 1.02" b/w
 #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
@@ -113,6 +115,11 @@ void setup()
   //delay(1000);
   showFont("FreeMonoBold9pt7b", &FreeMonoBold9pt7b);
   delay(1000);
+  if (display.epd2.WIDTH < 104)
+  {
+    showFont("glcdfont", 0);
+    delay(1000);
+  }
   drawBitmaps();
 #if !defined(__AVR) // takes too long!
   if (display.epd2.panel == GxEPD2::ACeP565)
@@ -158,6 +165,7 @@ void helloWorld()
   //Serial.println("helloWorld");
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
@@ -232,6 +240,7 @@ void helloFullScreenPartialMode()
   display.setPartialWindow(0, 0, display.width(), display.height());
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(GxEPD_BLACK);
   const char* updatemode;
   if (display.epd2.hasFastPartialUpdate)
@@ -280,6 +289,7 @@ void helloArduino()
   //Serial.println("helloArduino");
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
@@ -310,6 +320,7 @@ void helloEpaper()
   //Serial.println("helloEpaper");
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   // align with centered HelloWorld
@@ -317,7 +328,7 @@ void helloEpaper()
   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) - tby; // y is base line!
   // make the window big enough to cover (overwrite) descenders of previous text
   uint16_t wh = FreeMonoBold9pt7b.yAdvance;
   uint16_t wy = (display.height() * 3 / 4) - wh / 2;
@@ -392,10 +403,10 @@ void helloValue(double v, int digits)
   int16_t tbx, tby; uint16_t tbw, tbh;
   display.getTextBounds(valueString, 0, 0, &tbx, &tby, &tbw, &tbh);
   uint16_t x = ((display.width() - tbw) / 2) - tbx;
-  uint16_t y = (display.height() * 3 / 4) + tbh / 2; // y is base line!
+  uint16_t y = ((display.height() * 3 / 4) - tbh / 2) - tby; // y is base line!
   // show what happens, if we use the bounding box for partial window
   uint16_t wx = (display.width() - tbw) / 2;
-  uint16_t wy = (display.height() * 3 / 4) - tbh / 2;
+  uint16_t wy = ((display.height() * 3 / 4) - tbh / 2) - tby; // y is base line!
   display.setPartialWindow(wx, wy, tbw, tbh);
   display.firstPage();
   do
@@ -438,6 +449,7 @@ void deepSleepTest()
   const char again[] = "again";
   display.setRotation(1);
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(GxEPD_BLACK);
   int16_t tbx, tby; uint16_t tbw, tbh;
   // center text
@@ -457,10 +469,10 @@ void deepSleepTest()
   delay(5000);
   display.getTextBounds(wokeup, 0, 0, &tbx, &tby, &tbw, &tbh);
   uint16_t wx = (display.width() - tbw) / 2;
-  uint16_t wy = (display.height() / 3) + tbh / 2; // y is base line!
+  uint16_t wy = ((display.height() / 3) - tbh / 2) - tby; // 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!
+  uint16_t fy = ((display.height() * 2 / 3) - tbh / 2) - tby; // y is base line!
   display.firstPage();
   do
   {
@@ -474,10 +486,10 @@ void deepSleepTest()
   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!
+  uint16_t hy = ((display.height() / 3) - tbh / 2) - tby; // y is base line!
   display.getTextBounds(again, 0, 0, &tbx, &tby, &tbw, &tbh);
   uint16_t ax = (display.width() - tbw) / 2;
-  uint16_t ay = (display.height() * 2 / 3) + tbh / 2; // y is base line!
+  uint16_t ay = ((display.height() * 2 / 3) - tbh / 2) - tby; // y is base line!
   display.firstPage();
   do
   {
@@ -588,9 +600,11 @@ void showPartialUpdate()
   uint16_t box_w = 70;
   uint16_t box_h = 20;
   uint16_t cursor_y = box_y + box_h - 6;
+  if (display.epd2.WIDTH < 104) cursor_y = box_y + 6;
   float value = 13.95;
   uint16_t incr = display.epd2.hasFastPartialUpdate ? 1 : 3;
   display.setFont(&FreeMonoBold9pt7b);
+  if (display.epd2.WIDTH < 104) display.setFont(0);
   display.setTextColor(GxEPD_BLACK);
   // show where the update box is
   for (uint16_t r = 0; r < 4; r++)
@@ -646,6 +660,9 @@ void showPartialUpdate()
 void drawBitmaps()
 {
   display.setFullWindow();
+#ifdef _GxBitmaps80x128_H_
+  drawBitmaps80x128();
+#endif
 #ifdef _GxBitmaps152x152_H_
   drawBitmaps152x152();
 #endif
@@ -720,6 +737,45 @@ void drawBitmaps()
   }
 }
 
+#ifdef _GxBitmaps80x128_H_
+void drawBitmaps80x128()
+{
+#if !defined(__AVR)
+  const unsigned char* bitmaps[] =
+  {
+    Bitmap80x128_1, Bitmap80x128_2, Bitmap80x128_3, Bitmap80x128_4, Bitmap80x128_5
+  };
+#else
+  const unsigned char* bitmaps[] =
+  {
+    Bitmap80x128_1, Bitmap80x128_2, Bitmap80x128_3, Bitmap80x128_4, Bitmap80x128_5
+  };
+#endif
+  if ((display.epd2.WIDTH == 80) && (display.epd2.HEIGHT == 128))
+  {
+    for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
+    {
+      display.firstPage();
+      do
+      {
+        display.fillScreen(GxEPD_WHITE);
+        display.drawInvertedBitmap(0, 0, bitmaps[i], 80, 128, GxEPD_BLACK);
+      }
+      while (display.nextPage());
+      delay(2000);
+    }
+    display.firstPage();
+    do
+    {
+      display.fillScreen(GxEPD_WHITE);
+      display.drawBitmap(0, 0, WS_Bitmap80x128, 80, 128, GxEPD_BLACK);
+    }
+    while (display.nextPage());
+    delay(2000);
+  }
+}
+#endif
+
 #ifdef _GxBitmaps152x152_H_
 void drawBitmaps152x152()
 {

+ 4 - 0
examples/GxEPD2_Example/GxEPD2_display_selection.h

@@ -15,6 +15,7 @@
 
 #if defined (ESP8266)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154T8 152x152
@@ -125,6 +126,7 @@
 
 #if defined(ESP32)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -191,6 +193,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154T8 152x152
@@ -248,6 +251,7 @@
 #endif
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 5 - 0
examples/GxEPD2_Example/GxEPD2_display_selection_added.h

@@ -22,6 +22,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(//*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152
@@ -86,6 +87,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154T8 152x152
@@ -146,6 +148,7 @@
 
 #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_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154T8 152x152
@@ -204,6 +207,7 @@
 
 #if defined(ESP32) && defined(ARDUINO_ESP32_DEV)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -316,6 +320,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 1 - 0
examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 4 - 0
examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h

@@ -15,6 +15,7 @@
 
 #if defined (ESP8266)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154T8 152x152
@@ -125,6 +126,7 @@
 
 #if defined(ESP32)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -191,6 +193,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154T8 152x152
@@ -248,6 +251,7 @@
 #endif
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 5 - 0
examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h

@@ -22,6 +22,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(//*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152
@@ -86,6 +87,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154T8 152x152
@@ -146,6 +148,7 @@
 
 #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_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154T8 152x152
@@ -204,6 +207,7 @@
 
 #if defined(ESP32) && defined(ARDUINO_ESP32_DEV)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -316,6 +320,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 1 - 0
examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 4 - 0
examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h

@@ -15,6 +15,7 @@
 
 #if defined (ESP8266)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154T8 152x152
@@ -125,6 +126,7 @@
 
 #if defined(ESP32)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -191,6 +193,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154T8 152x152
@@ -248,6 +251,7 @@
 #endif
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 5 - 0
examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h

@@ -22,6 +22,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(//*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152
@@ -86,6 +87,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154T8 152x152
@@ -146,6 +148,7 @@
 
 #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_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154T8 152x152
@@ -204,6 +207,7 @@
 
 #if defined(ESP32) && defined(ARDUINO_ESP32_DEV)
 // select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154T8 152x152
@@ -316,6 +320,7 @@
 #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram
 #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
 // select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4
 //GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 no longer available
 //GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67
 //GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8 152x152

+ 1 - 0
examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_MinimumExample/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_MinimumExample/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_SD_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 0
examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h

@@ -19,6 +19,7 @@
 //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
 
 // select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GxEPD2_102   80x128, UC8175
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, no longer available
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681
 //#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373)

+ 1 - 0
examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h

@@ -13,6 +13,7 @@
 // Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0
 // Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0
 
+#define GxEPD2_102_IS_BW true
 #define GxEPD2_154_IS_BW true
 #define GxEPD2_154_D67_IS_BW true
 #define GxEPD2_154_T8_IS_BW true

+ 1 - 1
library.properties

@@ -1,5 +1,5 @@
 name=GxEPD2
-version=1.3.6
+version=1.3.7
 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

@@ -35,6 +35,7 @@ class GxEPD2
   public:
     enum Panel
     {
+      GDEW0102T4, Waveshare_1_02_bw = GDEW0102T4,
       GDEP015OC1, Waveshare_1_54_bw = GDEP015OC1,
       GDEH0154D67, Waveshare_1_54_bw_D67 = GDEH0154D67,
       GDEW0154T8,

+ 1 - 0
src/GxEPD2_BW.h

@@ -31,6 +31,7 @@
 #endif
 
 #include "GxEPD2_EPD.h"
+#include "epd/GxEPD2_102.h"
 #include "epd/GxEPD2_154.h"
 #include "epd/GxEPD2_154_D67.h"
 #include "epd/GxEPD2_154_T8.h"

+ 432 - 0
src/bitmaps/Bitmaps80x128.h

@@ -0,0 +1,432 @@
+#ifndef _GxBitmaps80x128_H_
+#define _GxBitmaps80x128_H_
+
+#if defined(ESP8266) || defined(ESP32)
+#include <pgmspace.h>
+#else
+#include <avr/pgmspace.h>
+#endif
+
+#include "WS_Bitmaps80x128.h"
+
+const unsigned char Bitmap80x128_1[1280]PROGMEM =
+{ /* 0X81,0X01,0X80,0X00,0X50,0X00, */
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X0F, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X80, 0X17, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X03, 0XFF,
+  0XFE, 0X40, 0X27, 0XFF, 0XFF, 0XFF, 0XFF, 0XA0, 0X38, 0XFF, 0XFE, 0X10, 0X87, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XA0, 0X3A, 0XFF, 0XFE, 0X09, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XA0, 0X3A, 0XFF, 0XFE, 0X26,
+  0X47, 0XFF, 0XFF, 0XFF, 0XFF, 0XA0, 0X3A, 0XFF, 0XFE, 0X40, 0X27, 0XFF, 0XFF, 0XFF, 0XFF, 0XA0,
+  0X38, 0XFF, 0XFE, 0X80, 0X17, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X03, 0XFF, 0XFF, 0X00, 0X0F, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0X01, 0XFF, 0XFF, 0XF1, 0XFC,
+  0X07, 0XFF, 0XFF, 0XF1, 0XFE, 0X00, 0XFF, 0XFF, 0XE1, 0XF8, 0X03, 0XFF, 0XFF, 0XC1, 0XFC, 0X00,
+  0X7F, 0XFF, 0XC1, 0XF0, 0X01, 0XFF, 0XFF, 0X81, 0XFC, 0X38, 0X7F, 0XFF, 0XC1, 0XF0, 0XE1, 0XFF,
+  0XFE, 0X01, 0XF8, 0X7C, 0X3F, 0XFF, 0X81, 0XE1, 0XF0, 0XFF, 0XFE, 0X01, 0XF8, 0XFE, 0X38, 0XFF,
+  0X01, 0XE3, 0XF8, 0XFF, 0XFE, 0X11, 0XF8, 0XFE, 0X38, 0XFF, 0X01, 0XE3, 0XF8, 0XFF, 0XFF, 0XF1,
+  0XF8, 0XFE, 0X38, 0XFE, 0X11, 0XE3, 0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0XFE, 0X3F, 0XFC, 0X31, 0XE3,
+  0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0XFE, 0X3F, 0XFC, 0X31, 0XE3, 0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0XFE,
+  0X3F, 0XF8, 0X71, 0XE3, 0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0XFE, 0X3F, 0XF0, 0XF1, 0XE3, 0XF8, 0XFF,
+  0XFF, 0XF1, 0XF8, 0XFE, 0X3F, 0XF0, 0X00, 0X63, 0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0XFE, 0X3F, 0XF0,
+  0X00, 0X63, 0XF8, 0XFF, 0XFF, 0XF1, 0XF8, 0X7C, 0X3F, 0XF0, 0X00, 0X61, 0XF0, 0XFF, 0XFF, 0XF1,
+  0XFC, 0X38, 0X7F, 0XFF, 0XF1, 0XF0, 0XE1, 0XFF, 0XFF, 0XF1, 0XFC, 0X00, 0X78, 0XFF, 0XF1, 0XF0,
+  0X01, 0XFF, 0XFF, 0XF1, 0XFE, 0X00, 0XF8, 0XFF, 0XF1, 0XF8, 0X03, 0XFF, 0XFF, 0XF1, 0XFF, 0X01,
+  0XF8, 0XFF, 0XF1, 0XFC, 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, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 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, 0X39, 0XCF, 0X9F, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X79, 0X8F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0X73, 0X0E, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XF3, 0XCF, 0X9F, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFC, 0XF3, 0XCF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XE7, 0XCF,
+  0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XE7, 0XCF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBD, 0XFF, 0XBF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF,
+  0XFF, 0XF7, 0X5D, 0XFF, 0XBF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFF, 0XFB, 0X5B, 0X1C, 0XA1, 0XC7,
+  0X1C, 0XB1, 0XBB, 0XFF, 0XFF, 0XFB, 0X5A, 0XEB, 0X2E, 0XBA, 0XEB, 0X2E, 0XBB, 0XFF, 0XFF, 0XFA,
+  0XEA, 0X0B, 0XAE, 0X83, 0X3B, 0XB0, 0XD7, 0XFF, 0XFF, 0XFA, 0XEA, 0XFB, 0XAE, 0XBF, 0XDB, 0XAE,
+  0XD7, 0XFF, 0XFF, 0XFD, 0XF6, 0XEB, 0X2E, 0XBA, 0XEB, 0X2C, 0XEF, 0XFF, 0XFF, 0XFD, 0XF7, 0X1C,
+  0XAE, 0XC7, 0X1C, 0XB2, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0X7F, 0X3F, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X63, 0X7F, 0XF9, 0X9F, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XF9, 0XF9, 0X30, 0XE1, 0X99, 0XFF, 0XFF, 0XFC, 0X80, 0X9F,
+  0XFC, 0X39, 0X32, 0X64, 0XDB, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0X99, 0X32, 0X64, 0XD3, 0XFF,
+  0XFF, 0XFF, 0XC1, 0XFF, 0XF9, 0X99, 0X32, 0X64, 0XC7, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFC, 0X3C,
+  0X32, 0X64, 0XE7, 0XFF, 0XFF, 0XFF, 0X7F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFE,
+  0X77, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+};
+
+const unsigned char Bitmap80x128_2[1280]PROGMEM =
+{ /* 0X81,0X01,0X80,0X00,0X50,0X00, */
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X0F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X1F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0X00, 0X00, 0X3F, 0XFF,
+  0X00, 0X00, 0X70, 0X00, 0X00, 0X4C, 0X00, 0X00, 0X3F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X48,
+  0X00, 0X00, 0X7F, 0XFF, 0X00, 0X00, 0X70, 0X00, 0X00, 0X48, 0X00, 0X00, 0X7F, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X7F, 0X00, 0X00, 0X7F, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0XFF, 0XFF, 0X00, 0X00, 0X3C, 0X20, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0X00, 0X00, 0X7E, 0X20,
+  0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0X00, 0X00, 0X43, 0X20, 0X00, 0X49, 0X00, 0X00, 0XFF, 0XFF,
+  0X00, 0X00, 0X41, 0XA0, 0X00, 0X49, 0X00, 0X01, 0XFF, 0XFF, 0X00, 0X00, 0X40, 0XE0, 0X00, 0X49,
+  0X00, 0X01, 0XFF, 0XFF, 0X00, 0X00, 0X60, 0X60, 0X00, 0X49, 0X00, 0X01, 0XFF, 0XFF, 0X00, 0X00,
+  0X20, 0X20, 0X00, 0X7F, 0X00, 0X03, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X03, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XC0, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF,
+  0X00, 0X00, 0X7F, 0XE0, 0X00, 0X30, 0X00, 0X07, 0XFF, 0XFF, 0X00, 0X00, 0X40, 0X20, 0X00, 0X48,
+  0X00, 0X07, 0XFF, 0XFF, 0X00, 0X00, 0X40, 0X20, 0X00, 0X48, 0X00, 0X0F, 0XFF, 0XFF, 0X00, 0X00,
+  0X40, 0X20, 0X00, 0X48, 0X00, 0X0F, 0XFF, 0XFF, 0X00, 0X00, 0X7F, 0XE0, 0X00, 0X7F, 0X00, 0X0F,
+  0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XC0, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X00, 0X1F, 0XFF, 0XFF,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X0E, 0X00, 0X1F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X20, 0X00, 0X34,
+  0X00, 0X3F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X20, 0X00, 0X44, 0X00, 0X3F, 0XFF, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X34, 0X00, 0X3F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0E, 0X00, 0X3F,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X00, 0X7F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF,
+  0X00, 0X00, 0X7F, 0XE0, 0X00, 0X30, 0X00, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X7F, 0XE0, 0X00, 0X48,
+  0X00, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X30, 0X00, 0X00, 0X48, 0X00, 0XFF, 0XFF, 0XFF, 0X00, 0X00,
+  0X10, 0X00, 0X00, 0X48, 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0X01, 0XFF,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X03, 0XFF, 0XFF, 0XFF,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X03, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04,
+  0X03, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X49, 0X07, 0XFF,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X49, 0X07, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X49, 0X0F, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X49, 0X0F, 0XFF, 0XFF, 0XFF,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0X0F, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X1F, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X00, 0X30, 0X00, 0X1F, 0X06, 0X07, 0XC3, 0XF9, 0XCF, 0XFF, 0X00, 0X30, 0X00, 0X1F, 0X06, 0X07,
+  0XC3, 0XF9, 0XCF, 0XFF, 0X00, 0X33, 0XFF, 0X9F, 0XE0, 0X60, 0XC0, 0X1E, 0X0F, 0XFF, 0X00, 0X33,
+  0XFF, 0X9F, 0XE0, 0X60, 0XC0, 0X1E, 0X0F, 0XFF, 0X00, 0X33, 0XFF, 0X9F, 0XE0, 0X60, 0XC0, 0X1E,
+  0X0F, 0XFF, 0X00, 0X33, 0X81, 0X9C, 0XE7, 0XE7, 0XC7, 0XE7, 0XFF, 0XFF, 0X00, 0X33, 0X81, 0X9C,
+  0XE7, 0XE7, 0XC7, 0XE7, 0XFF, 0XFF, 0X00, 0X33, 0X81, 0X9F, 0XFE, 0X18, 0X04, 0XF8, 0X3F, 0XFF,
+  0X00, 0X33, 0X81, 0X9F, 0XFE, 0X18, 0X04, 0XF8, 0X3F, 0XFF, 0X00, 0X33, 0X81, 0X9F, 0XFF, 0XFF,
+  0X00, 0X00, 0X3F, 0XFF, 0X00, 0X33, 0X81, 0X9F, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0X00, 0X33,
+  0X81, 0X9F, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0X00, 0X33, 0XFF, 0X9F, 0XE6, 0X67, 0X3F, 0X19,
+  0XCF, 0XFF, 0X00, 0X33, 0XFF, 0X9F, 0XE6, 0X67, 0X3F, 0X19, 0XCF, 0XFF, 0X00, 0X30, 0X00, 0X1C,
+  0X00, 0X18, 0X3B, 0X1F, 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFC, 0XE7, 0X80, 0X3F, 0X1F, 0XCF, 0XFF,
+  0X00, 0X3F, 0XFF, 0XFC, 0XE7, 0X80, 0X3F, 0X1F, 0XCF, 0XFF, 0X00, 0X3F, 0XFF, 0XFC, 0XE7, 0X80,
+  0X3F, 0X1F, 0XCF, 0XFF, 0X00, 0X3F, 0XFE, 0X00, 0XE0, 0X18, 0X00, 0X06, 0X0F, 0XFF, 0X00, 0X3F,
+  0XFE, 0X00, 0XE0, 0X18, 0X00, 0X06, 0X0F, 0XFF, 0X00, 0X30, 0X60, 0X60, 0XF9, 0XFF, 0X03, 0XF8,
+  0X0F, 0XFF, 0X00, 0X30, 0X60, 0X60, 0XF9, 0XFF, 0X03, 0XF8, 0X0F, 0XFF, 0X00, 0X30, 0X60, 0X60,
+  0XF9, 0XFF, 0X03, 0XF8, 0X0F, 0XFF, 0X00, 0X33, 0XE7, 0X83, 0X07, 0XFF, 0XF8, 0XE0, 0X0F, 0XFF,
+  0X00, 0X33, 0XE7, 0X83, 0X07, 0XFF, 0XF8, 0XE0, 0X0F, 0XFF, 0X00, 0X30, 0X7F, 0XE0, 0X18, 0X78,
+  0X04, 0X1E, 0X0F, 0XFF, 0X00, 0X30, 0X7F, 0XE0, 0X18, 0X78, 0X04, 0X1E, 0X0F, 0XFF, 0X00, 0X3F,
+  0XF8, 0X00, 0XF8, 0X18, 0X07, 0X00, 0X0F, 0XFF, 0X00, 0X3F, 0XF8, 0X00, 0XF8, 0X18, 0X07, 0X00,
+  0X0F, 0XFF, 0X00, 0X3F, 0X9E, 0X7C, 0XF8, 0X7F, 0X3F, 0XFF, 0XCF, 0XFF, 0X00, 0X3F, 0X9E, 0X7C,
+  0XF8, 0X7F, 0X3F, 0XFF, 0XCF, 0XFF, 0X00, 0X33, 0XFE, 0X1F, 0XE0, 0X00, 0X3F, 0XE0, 0X3F, 0XFF,
+  0X00, 0X33, 0XFE, 0X1F, 0XE0, 0X00, 0X3F, 0XE0, 0X3F, 0XFF, 0X00, 0X3C, 0X61, 0XFF, 0X19, 0XFF,
+  0X03, 0XE1, 0XCF, 0XFF, 0X00, 0X3C, 0X61, 0XFF, 0X19, 0XFF, 0X03, 0XE1, 0XCF, 0XFF, 0X00, 0X3C,
+  0X61, 0XFF, 0X19, 0XFF, 0X03, 0XE1, 0XCF, 0XFF, 0X00, 0X3F, 0X9F, 0X80, 0XE6, 0X60, 0XC0, 0X18,
+  0X0F, 0XFF, 0X00, 0X3F, 0X9F, 0X80, 0XE6, 0X60, 0XC0, 0X18, 0X0F, 0XFF, 0X00, 0X3F, 0XFF, 0XFC,
+  0XF9, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFC, 0XF9, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X00, 0X3F, 0XFF, 0XFC, 0XF9, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X30, 0X00, 0X1C, 0XE6, 0X67,
+  0X38, 0X00, 0X0F, 0XFF, 0X00, 0X30, 0X00, 0X1C, 0XE6, 0X67, 0X38, 0X00, 0X0F, 0XFF, 0X00, 0X33,
+  0XFF, 0X9C, 0X06, 0X7F, 0XFB, 0XFF, 0XCF, 0XFF, 0X00, 0X33, 0XFF, 0X9C, 0X06, 0X7F, 0XFB, 0XFF,
+  0XCF, 0XFF, 0X00, 0X33, 0X81, 0X9C, 0XE6, 0X60, 0X3B, 0X01, 0XCF, 0XFF, 0X00, 0X33, 0X81, 0X9C,
+  0XE6, 0X60, 0X3B, 0X01, 0XCF, 0XFF, 0X00, 0X33, 0X81, 0X9F, 0X1E, 0X78, 0X3B, 0X01, 0XCF, 0XFF,
+  0X00, 0X33, 0X81, 0X9F, 0X1E, 0X78, 0X3B, 0X01, 0XCF, 0XFF, 0X00, 0X33, 0X81, 0X9C, 0XFF, 0X87,
+  0XFB, 0X01, 0XCF, 0XFF, 0X00, 0X33, 0X81, 0X9C, 0XFF, 0X87, 0XFB, 0X01, 0XCF, 0XFF, 0X00, 0X33,
+  0XFF, 0X9C, 0XE6, 0X78, 0XFB, 0XFF, 0XCF, 0XFF, 0X00, 0X33, 0XFF, 0X9C, 0XE6, 0X78, 0XFB, 0XFF,
+  0XCF, 0XFF, 0X00, 0X33, 0XFF, 0X9C, 0XE6, 0X78, 0XFB, 0XFF, 0XCF, 0XFF, 0X00, 0X30, 0X00, 0X1C,
+  0X00, 0X67, 0X38, 0X00, 0X0F, 0XFF, 0X00, 0X30, 0X00, 0X1C, 0X00, 0X67, 0X38, 0X00, 0X0F, 0XFF,
+  0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00,
+  0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X01,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+};
+
+const unsigned char Bitmap80x128_3[1280]PROGMEM =
+{ /* 0X81,0X01,0X80,0X00,0X50,0X00, */
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 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, 0X00,
+  0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFE, 0XFF, 0XFE, 0XFF, 0XDF, 0XFF, 0XFF, 0XDF, 0XFC, 0XFF, 0XFE, 0XFF, 0XFF, 0X3F, 0XDF,
+  0XFF, 0XFF, 0X9F, 0XFC, 0XFF, 0XFE, 0XFF, 0XFF, 0XC3, 0XDF, 0XFF, 0XFF, 0X1F, 0XFC, 0X7F, 0XFE,
+  0XFF, 0XFF, 0X3F, 0XDF, 0XFF, 0XFF, 0X0F, 0XFC, 0X77, 0XFE, 0XFF, 0XFE, 0XFF, 0XDF, 0XFF, 0XFF,
+  0X0F, 0XFC, 0X6F, 0XFE, 0XFF, 0XFF, 0XFB, 0XDF, 0XFF, 0XFF, 0X0F, 0XFC, 0X1F, 0XFE, 0XF8, 0X3F,
+  0XC7, 0XDF, 0XFF, 0XFF, 0X07, 0XFC, 0X1F, 0XFE, 0XF7, 0XDF, 0X2F, 0XDF, 0XFF, 0XFF, 0X07, 0XFC,
+  0X03, 0XFE, 0XF7, 0XDE, 0XEF, 0XDF, 0XFF, 0XFF, 0X03, 0XF8, 0X00, 0XFE, 0XF7, 0XDF, 0X2F, 0XDF,
+  0XFF, 0XFF, 0X03, 0XF0, 0X00, 0XFE, 0XF0, 0X1F, 0XC7, 0XDF, 0XFF, 0XFF, 0X03, 0XE1, 0XFF, 0XFE,
+  0XFF, 0XFF, 0XFB, 0XDF, 0XFF, 0XFF, 0X01, 0XC3, 0XFF, 0XFE, 0XFF, 0XFF, 0XFB, 0XDF, 0XFF, 0XFF,
+  0X01, 0X87, 0XFF, 0XFE, 0XF8, 0X3F, 0XFB, 0XDF, 0XFF, 0XFF, 0X01, 0X0F, 0XFF, 0XFE, 0XF7, 0XDF,
+  0XFB, 0XDF, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0XFE, 0XF7, 0XDE, 0X03, 0XDF, 0XFF, 0XFF, 0X80, 0X3F,
+  0XFF, 0XFE, 0XF7, 0XDF, 0XFF, 0XDF, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0XFE, 0XF8, 0X3F, 0XFF, 0XDF,
+  0XFF, 0XFF, 0X80, 0X07, 0XFF, 0XFE, 0XFF, 0XFE, 0X1F, 0XDF, 0XFF, 0XFF, 0X80, 0X00, 0XFF, 0XFE,
+  0XFF, 0XFE, 0XDF, 0XDF, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFE, 0XF8, 0X3E, 0XDF, 0XDF, 0XFF, 0XFE,
+  0X00, 0X00, 0X07, 0XFE, 0XF7, 0XDE, 0X03, 0XDF, 0XFF, 0XFC, 0X00, 0X00, 0X01, 0XFE, 0XF7, 0XDF,
+  0XFF, 0XDF, 0XFF, 0XF8, 0X3F, 0XE0, 0X01, 0XFE, 0XF7, 0XDF, 0XFF, 0XDF, 0XFF, 0XF0, 0XFF, 0XFF,
+  0XF1, 0XFE, 0XF8, 0X3F, 0X67, 0XDF, 0XFF, 0XE1, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFE, 0XDB, 0XDF,
+  0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFE, 0XDB, 0XDF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0XFA, 0X3F, 0X37, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XF6, 0XDF, 0XFF, 0XDF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFE, 0XF7, 0XDF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XF7, 0XDE,
+  0X03, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XF8, 0X3F, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0X07, 0XDF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFE, 0XFB, 0XDF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0XFF, 0XFE, 0XFB, 0XDF, 0XFF, 0XB7, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFE, 0XFB, 0XDF, 0XFF, 0XB7,
+  0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFE, 0X03, 0XDF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF,
+  0XFF, 0XDF, 0XFF, 0X80, 0XFC, 0X00, 0X00, 0XFE, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFC, 0X00,
+  0X00, 0XFE, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFB, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0X80, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCB,
+  0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00,
+  0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0X80, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X86, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XB2, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB8, 0XFC, 0X00,
+  0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80,
+  0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XBE, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFC, 0X00,
+  0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFD, 0XDF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80,
+  0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFC, 0X00, 0X00, 0XFF, 0XFE, 0X1F,
+  0XFF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00,
+  0X00, 0XFF, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF,
+  0XFF, 0XC1, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFE, 0X3F, 0XFF, 0XFF, 0XFF, 0XBE, 0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XDF, 0XFF, 0XFF, 0XFF, 0XBE,
+  0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XDF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F,
+  0X83, 0XFF, 0XFF, 0XC1, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0X7D, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF4, 0X1F, 0X7D, 0XFF, 0XFF, 0X81, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0X81, 0XFF,
+  0XFF, 0XF8, 0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XDF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF8, 0X1F, 0X93, 0XFF, 0XFF, 0X81, 0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XFF, 0X6D, 0XFF, 0XFF, 0X81,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X6D, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF,
+  0X93, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0XFF, 0XFF, 0X81, 0XFC, 0X00,
+  0X00, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X1F, 0X7D, 0XFF, 0XFF, 0XB6, 0XFC, 0X00, 0X00, 0XFF,
+  0XFF, 0XFF, 0X93, 0XFF, 0XFF, 0XB6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XEF, 0XFF, 0XFF, 0XB6,
+  0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XDF, 0X93, 0XFF, 0XFF, 0XB6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0XDF,
+  0X7D, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XFF, 0X80, 0XFC, 0X00,
+  0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFD, 0XBF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFD, 0X5F, 0XFF, 0XFF, 0XFF, 0XE3, 0XFC, 0X00, 0X00, 0XFF,
+  0XFD, 0X5F, 0X93, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XDF, 0X6D, 0XFF, 0XFF, 0X9C,
+  0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0X6D, 0XFF, 0XFF, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X5F,
+  0X93, 0XFF, 0XFF, 0X80, 0XFC, 0X00, 0X00, 0XFF, 0XFD, 0X5F, 0XFF, 0XFF, 0XFF, 0X80, 0XFC, 0X00,
+  0X00, 0XFF, 0XFD, 0X5F, 0X9D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X65, 0XFF,
+  0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0X79, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF9, 0X9F, 0XBD, 0XFF, 0XFF, 0XD1, 0XFC, 0X00, 0X00, 0XFF, 0XF6, 0X7F, 0XFF, 0XFF, 0XFF, 0X94,
+  0XFC, 0X00, 0X00, 0XFF, 0XF6, 0XFF, 0XFF, 0XFF, 0XFF, 0XB6, 0XFF, 0XFF, 0XFF, 0XFF, 0XF6, 0XFF,
+  0X01, 0XFF, 0XFF, 0X9C, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X1F, 0XBF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+};
+
+const unsigned char Bitmap80x128_4[1280]PROGMEM =
+{ /* 0X81,0X01,0X80,0X00,0X50,0X00, */
+  0XF0, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00,
+  0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X40, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF0, 0X70, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X3C, 0X01, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF0, 0X0F, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X3C, 0X01, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XCF, 0XFF, 0XFF, 0XF0, 0X70, 0X01, 0XFF, 0XFE, 0X00, 0XFF, 0XCF, 0XFF, 0XFF, 0XF0, 0X40,
+  0X01, 0XFF, 0XF8, 0X00, 0X3F, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XF1, 0XE7, 0X1F, 0XCE,
+  0XFF, 0XFF, 0XF0, 0X00, 0X61, 0XFF, 0XF3, 0XF3, 0XCF, 0XCE, 0XDF, 0XFF, 0XF0, 0X07, 0XE1, 0XFF,
+  0XE7, 0XF9, 0XE7, 0XCE, 0XDF, 0XFF, 0XF0, 0X3F, 0X81, 0XFF, 0XE7, 0XF9, 0XE7, 0XCE, 0XDF, 0XFF,
+  0XF0, 0X71, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCE, 0XDF, 0XFF, 0XF0, 0X71, 0X01, 0XFF, 0XE7, 0XF9,
+  0XE7, 0XCE, 0XDF, 0XFF, 0XF0, 0X3F, 0X81, 0XFF, 0XE3, 0XF1, 0XE7, 0XCE, 0X01, 0XFF, 0XF0, 0X07,
+  0XE1, 0XFF, 0XF1, 0XE3, 0X8F, 0XCE, 0X01, 0XFF, 0XF0, 0X00, 0X61, 0XFF, 0XF8, 0X07, 0X0F, 0XCF,
+  0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFC, 0X0F, 0X3F, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X21, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XCF, 0XF7, 0XFF, 0XF0, 0X00, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X01, 0XFF,
+  0XF0, 0X00, 0X21, 0XFF, 0XFE, 0X00, 0XFF, 0XCE, 0X01, 0XFF, 0XF0, 0X00, 0X21, 0XFF, 0XF8, 0X00,
+  0X3F, 0XCE, 0X77, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XF1, 0XE7, 0X1F, 0XCF, 0X37, 0XFF, 0XF0, 0X7F,
+  0XE1, 0XFF, 0XF3, 0XF3, 0XCF, 0XCF, 0X97, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF,
+  0XC7, 0XFF, 0XF0, 0X3C, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF, 0XE7, 0XFF, 0XF0, 0X7E, 0X01, 0XFF,
+  0XE7, 0XF9, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X42, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCE, 0X01, 0XFF,
+  0XF0, 0X42, 0X01, 0XFF, 0XE3, 0XF1, 0XE7, 0XCE, 0X01, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XF1, 0XE3,
+  0X8F, 0XCF, 0XFF, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XF8, 0X07, 0X0F, 0XCF, 0XFF, 0XFF, 0XF0, 0X00,
+  0X01, 0XFF, 0XFC, 0X0F, 0X3F, 0XCF, 0X1D, 0XFF, 0XF0, 0X31, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE,
+  0X0D, 0XFF, 0XF0, 0X73, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XE5, 0XFF, 0XF0, 0X62, 0X21, 0XFF,
+  0XFE, 0X00, 0XFF, 0XCE, 0XF1, 0XFF, 0XF0, 0X46, 0X21, 0XFF, 0XF8, 0X00, 0X3F, 0XCE, 0XF9, 0XFF,
+  0XF0, 0X44, 0X61, 0XFF, 0XF1, 0XE7, 0X1F, 0XCE, 0X79, 0XFF, 0XF0, 0X7C, 0XE1, 0XFF, 0XF3, 0XF3,
+  0XCF, 0XCF, 0X7D, 0XFF, 0XF0, 0X38, 0XC1, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X00,
+  0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF,
+  0X03, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XE7, 0XF9, 0XE7, 0XCE, 0X01, 0XFF, 0XF0, 0X00, 0X01, 0XFF,
+  0XE3, 0XF1, 0XE7, 0XCE, 0XFD, 0XFF, 0XF0, 0X1F, 0X81, 0XFF, 0XF1, 0XE3, 0X8F, 0XCE, 0XFD, 0XFF,
+  0XF0, 0X3F, 0XC1, 0XFF, 0XF8, 0X07, 0X0F, 0XCE, 0XFD, 0XFF, 0XF0, 0X60, 0X61, 0XFF, 0XFC, 0X0F,
+  0X3F, 0XCE, 0X01, 0XFF, 0XF0, 0X40, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0X03, 0XFF, 0XF0, 0X40,
+  0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XFE, 0X00, 0XFF, 0XCF,
+  0XFF, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XF8, 0X00, 0X3F, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF,
+  0XF1, 0XE7, 0X1F, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XF3, 0XF3, 0XCF, 0XCE, 0X01, 0XFF,
+  0XF0, 0X00, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCE, 0X01, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XE7, 0XF9,
+  0XE7, 0XCF, 0X3F, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF, 0XBF, 0XFF, 0XF0, 0X1F,
+  0X81, 0XFF, 0XE7, 0XF9, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X3F, 0XC1, 0XFF, 0XE3, 0XF1, 0XE7, 0XCF,
+  0XFF, 0XFF, 0XF0, 0X60, 0X61, 0XFF, 0XF1, 0XE3, 0X8F, 0XCF, 0XFF, 0XFF, 0XF0, 0X40, 0X21, 0XFF,
+  0XF8, 0X07, 0X0F, 0XCF, 0X03, 0XFF, 0XF0, 0X40, 0X21, 0XFF, 0XFC, 0X0F, 0X3F, 0XCE, 0X01, 0XFF,
+  0XF0, 0X7F, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XFD, 0XFF, 0XF0, 0X7F, 0XE1, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XCE, 0XFD, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XFD, 0XFF, 0XF0, 0X1F,
+  0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X01, 0XFF, 0XF0, 0X3F, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF,
+  0X03, 0XFF, 0XF0, 0X60, 0X61, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XF0, 0X40, 0X21, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XCE, 0XFF, 0XFF, 0XF0, 0X40, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X1F, 0XFF,
+  0XF0, 0X60, 0X61, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0X03, 0XFF, 0XF0, 0X3F, 0XC1, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XCF, 0XF1, 0XFF, 0XF0, 0X1F, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XF1, 0XFF, 0XF0, 0X00,
+  0X01, 0XFF, 0XFF, 0X3F, 0XE7, 0XCF, 0X03, 0XFF, 0XF0, 0X1F, 0X81, 0XFF, 0XFF, 0X3F, 0XE7, 0XCE,
+  0X1F, 0XFF, 0XF0, 0X3F, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X1F, 0XFF, 0XF0, 0X60, 0X61, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XCF, 0X03, 0XFF, 0XF0, 0X40, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XF1, 0XFF,
+  0XF0, 0X40, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XF1, 0XFF, 0XF0, 0X60, 0X61, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XCF, 0X03, 0XFF, 0XF0, 0X3F, 0XC1, 0XFF, 0XFF, 0XFF, 0XE7, 0XCE, 0X1F, 0XFF, 0XF0, 0X1F,
+  0X81, 0XFF, 0XFF, 0XFF, 0XE7, 0XCE, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF,
+  0XFF, 0XFF, 0XF0, 0X13, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XDD, 0XFF, 0XF0, 0X73, 0XE1, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XCE, 0XDD, 0XFF, 0XF0, 0X62, 0X61, 0XFF, 0XFF, 0XE0, 0X3F, 0XCE, 0XDD, 0XFF,
+  0XF0, 0X42, 0X21, 0XFF, 0XFF, 0XC0, 0X1F, 0XCE, 0XDD, 0XFF, 0XF0, 0X40, 0X21, 0XFF, 0XFF, 0X8F,
+  0X8F, 0XCE, 0XDD, 0XFF, 0XF0, 0X60, 0X61, 0XFF, 0XFF, 0X1F, 0XC7, 0XCE, 0XDD, 0XFF, 0XF0, 0X3F,
+  0XC1, 0XFF, 0XFF, 0X3F, 0XE7, 0XCE, 0X01, 0XFF, 0XF0, 0X1F, 0X81, 0XFF, 0XFF, 0X3F, 0XE7, 0XCE,
+  0X01, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0X3F, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF,
+  0XFF, 0X3F, 0XE7, 0XCF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, 0X1F, 0XC7, 0XCF, 0X87, 0XFF,
+  0XF0, 0X00, 0X01, 0XFF, 0XFF, 0X8F, 0X8F, 0XCF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0,
+  0X1F, 0XCE, 0X79, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XCE, 0XFD, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE,
+  0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0XFD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XE0, 0X00, 0X07, 0XCE, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XCE, 0X01, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X1F, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XCF, 0XA3, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XCF, 0X21, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XCE,
+  0X6D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XCE, 0XED, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0X1F, 0XFF, 0XCE, 0XED, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XCE, 0XFD, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XCE, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF,
+  0XFF, 0XCE, 0X79, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XCF, 0X03, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XCF, 0X87, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+};
+
+const unsigned char Bitmap80x128_5[1280]PROGMEM =
+{ /* 0X81,0X01,0X80,0X00,0X50,0X00, */
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF7, 0XFE, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF9, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF,
+  0XFE, 0X1E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF9, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XFF, 0XF7, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XDE,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC1, 0XFE, 0X3E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XBE, 0XF9, 0X7E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XF7, 0X7E, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XF9, 0X7E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0X80,
+  0XFE, 0X3E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC1, 0XFF, 0XDE,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XFF, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XBE, 0XF0, 0X1E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XFF, 0XFE, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC1, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF,
+  0XF0, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF6, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XC1, 0XF6, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XF0, 0X1E,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XBE, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC1, 0XFB, 0X3E, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF6, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF,
+  0XF6, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XD1, 0XF9, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XB6, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XFF, 0XFE,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XBE, 0XF0, 0X1E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XC1, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF8, 0X3E, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF,
+  0XF7, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF7, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XFF, 0XF7, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XF0, 0X1E,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XF7, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X6F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X6F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8,
+  0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X37, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X97, 0XF8, 0X00, 0X01, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0XEF, 0XFF, 0XFF, 0XFF, 0X0D, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X65, 0XF8,
+  0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X71, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0X0F, 0XFF,
+  0XFF, 0XFF, 0X39, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XBD, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF,
+  0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01, 0XFF, 0XFF,
+  0X1F, 0XFF, 0XFF, 0XFF, 0X7D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XEF, 0XFF, 0XFF, 0XFF, 0X7D, 0XF8,
+  0X00, 0X01, 0XFF, 0XFE, 0XEF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0X1F, 0XC1,
+  0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01,
+  0XFF, 0XFA, 0X0F, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFF,
+  0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XEF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01, 0XFF, 0XFC,
+  0X0F, 0XC9, 0XFF, 0XFF, 0X9F, 0XF8, 0X00, 0X01, 0XFF, 0XFE, 0XFF, 0XB6, 0XFF, 0XFF, 0XDF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XB6, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XEF, 0XC9,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEF, 0XFF, 0XFF, 0XFF, 0X83, 0XF8, 0X00, 0X01,
+  0XFF, 0XFE, 0X1F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X7D, 0XF8, 0X00, 0X01, 0XFF, 0XF8, 0X0F, 0XBE, 0XFF, 0XFF, 0X7D, 0XF8, 0X00, 0X01, 0XFF, 0XFF,
+  0XFF, 0XC9, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XF7, 0XFF, 0XFF, 0X83, 0XF8,
+  0X00, 0X01, 0XFF, 0XFE, 0XEF, 0XC9, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XEF, 0XBE,
+  0XFF, 0XFF, 0X03, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XFF, 0XF1, 0XF8, 0X00, 0X01,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XDF, 0XFF, 0XFF, 0XFF,
+  0X03, 0XF8, 0X00, 0X01, 0XFF, 0XFE, 0XAF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE,
+  0XAF, 0XC9, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X6F, 0XB6, 0XFF, 0XFF, 0XF1, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB6, 0XFF, 0XFF, 0X03, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0X2F, 0XC9,
+  0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XAF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01,
+  0XFF, 0XFE, 0XAF, 0XCE, 0XFF, 0XFF, 0X6D, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0X1F, 0XB2, 0XFF, 0XFF,
+  0X6D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBC, 0XFF, 0XFF, 0X6D, 0XF8, 0X00, 0X01, 0XFF, 0XFC,
+  0XCF, 0XDE, 0XFF, 0XFF, 0X6D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0X3F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01, 0XFF, 0XFB, 0X7F, 0X80,
+  0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01, 0XFF, 0XF8, 0X0F, 0XDF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X39, 0XF8, 0X00, 0X01, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8,
+  0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X01,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XA3, 0XF8, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X29, 0XF8, 0X00, 0X01, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0X6D, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X39, 0XF8,
+  0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+  0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF,
+};
+
+#endif

+ 120 - 0
src/bitmaps/WS_Bitmaps80x128.h

@@ -0,0 +1,120 @@
+/**
+    @filename   :   imagedata.cpp
+    @brief      :   data file for epd demo
+
+    Copyright (C) Waveshare     September 5 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_Bitmaps80x128_H_
+#define _WS_Bitmaps80x128_H_
+
+#if defined(ESP8266) || defined(ESP32)
+#include <pgmspace.h>
+#else
+#include <avr/pgmspace.h>
+#endif
+
+
+const unsigned char WS_Bitmap80x128[] PROGMEM =
+{
+  0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0X08,
+  0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X03, 0X0C, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X06, 0X06, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X04, 0X02, 0X00, 0X00,
+  0X01, 0X80, 0XC0, 0X00, 0X00, 0X00, 0X04, 0X02, 0X00, 0X00, 0X01, 0X80, 0XF8, 0X00, 0X00, 0X00,
+  0X04, 0X02, 0X00, 0X00, 0X01, 0X80, 0X3F, 0X00, 0X00, 0X00, 0X06, 0X06, 0X00, 0X00, 0X01, 0X80,
+  0X07, 0XE0, 0X00, 0X00, 0X03, 0XFC, 0X00, 0X00, 0X01, 0X80, 0X07, 0XF0, 0X00, 0X00, 0X01, 0XF8,
+  0X00, 0X00, 0X01, 0X80, 0X1F, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0XF8, 0X10,
+  0X3F, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0XE0, 0X00, 0X7F, 0XC0, 0X03, 0X00, 0X00, 0X00,
+  0X01, 0X80, 0X00, 0X00, 0X40, 0X00, 0X07, 0X80, 0X00, 0XC0, 0X01, 0X80, 0X7F, 0X80, 0X40, 0X00,
+  0X04, 0X80, 0X00, 0XF8, 0X01, 0X80, 0XFF, 0X80, 0X60, 0X00, 0X07, 0X80, 0X00, 0X3F, 0X01, 0X80,
+  0X91, 0X83, 0XFF, 0XC0, 0X03, 0X00, 0X00, 0X07, 0XE1, 0X80, 0X98, 0X83, 0XFF, 0XC0, 0X00, 0X00,
+  0X00, 0X07, 0XF1, 0X80, 0X88, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0X11, 0X80, 0XC8, 0X80,
+  0X40, 0X40, 0X03, 0XF8, 0X00, 0XF8, 0X11, 0X80, 0X6F, 0X80, 0X40, 0X40, 0X07, 0XFC, 0X00, 0XE0,
+  0X01, 0X80, 0X27, 0X01, 0XFF, 0XC0, 0X04, 0X66, 0X00, 0X00, 0X01, 0X80, 0X00, 0X01, 0XFF, 0XC0,
+  0X04, 0X22, 0X00, 0X7F, 0X81, 0X80, 0X00, 0X00, 0X40, 0X00, 0X04, 0X22, 0X00, 0XFF, 0X81, 0X87,
+  0XFF, 0X80, 0X00, 0X00, 0X07, 0XE6, 0X00, 0X91, 0X81, 0X87, 0XFF, 0X82, 0X00, 0X00, 0X03, 0XC4,
+  0X00, 0X98, 0X81, 0X83, 0XC0, 0X03, 0X80, 0X00, 0X00, 0X00, 0X00, 0X88, 0X81, 0X80, 0XF0, 0X03,
+  0XE0, 0X00, 0X00, 0X00, 0X00, 0XC8, 0X81, 0X80, 0X3E, 0X02, 0X7E, 0X00, 0X03, 0XC2, 0X00, 0X6F,
+  0X81, 0X80, 0X0F, 0X82, 0X1F, 0XC0, 0X07, 0XE2, 0X00, 0X27, 0X01, 0X80, 0X0F, 0X82, 0X01, 0XC0,
+  0X04, 0X32, 0X00, 0X00, 0X01, 0X80, 0X3E, 0X02, 0X00, 0X00, 0X04, 0X1A, 0X00, 0X00, 0X01, 0X80,
+  0XF0, 0X02, 0X00, 0X00, 0X04, 0X0E, 0X07, 0XFF, 0X81, 0X83, 0XC0, 0X00, 0X00, 0X00, 0X07, 0X06,
+  0X07, 0XFF, 0X81, 0X87, 0XFF, 0X80, 0X00, 0X00, 0X03, 0X02, 0X00, 0XC1, 0X81, 0X87, 0XFF, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80,
+  0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X60, 0X00, 0XC1, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X60, 0X00, 0X7F, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X20, 0X00, 0X3E, 0X01, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X60, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X60,
+  0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X40, 0X00, 0X7F, 0X81, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X60, 0X00, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X20, 0X00, 0X80,
+  0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X03, 0XBC, 0X00, 0XC0, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFE, 0X00, 0XFF, 0X81, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X04, 0X42, 0X00, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X04, 0X42,
+  0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X04, 0X42, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X07, 0X0E, 0X00, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X03, 0X0C, 0X00, 0XFF,
+  0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X03, 0XC2, 0X00, 0X00, 0X81, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X07, 0XE2, 0X00, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X04, 0X32,
+  0X00, 0XFF, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X04, 0X1A, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X04, 0X0E, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X07, 0X06, 0X01, 0X0E,
+  0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X03, 0X02, 0X03, 0X1F, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X06, 0X11, 0X81, 0X80, 0X00, 0X02, 0X00, 0X00, 0X00, 0X00, 0X04, 0X10, 0X81, 0X80,
+  0X03, 0XFF, 0XC0, 0X00, 0X00, 0X00, 0X04, 0X30, 0X81, 0X80, 0X03, 0XFF, 0XC0, 0X00, 0X00, 0X00,
+  0X04, 0X20, 0X81, 0X80, 0X01, 0X82, 0X00, 0X00, 0X00, 0X20, 0X04, 0X20, 0X81, 0X80, 0X00, 0XE2,
+  0X00, 0X00, 0X00, 0X20, 0X06, 0X61, 0X81, 0X80, 0X00, 0X72, 0X00, 0X00, 0X0C, 0X01, 0X83, 0XC3,
+  0X01, 0X80, 0X00, 0X1A, 0X00, 0X00, 0X00, 0X00, 0X01, 0X82, 0X01, 0X80, 0X00, 0X0E, 0X00, 0X00,
+  0X01, 0XFC, 0X00, 0X00, 0X01, 0X80, 0X00, 0X06, 0X00, 0X00, 0X03, 0XFE, 0X00, 0X00, 0X01, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X03, 0XFE, 0X00, 0X00, 0X01, 0X80, 0X00, 0X07, 0X00, 0X00, 0X07, 0XFF,
+  0X00, 0X00, 0X01, 0X80, 0X01, 0XEF, 0X80, 0X00, 0X37, 0XFF, 0X60, 0X00, 0X01, 0X80, 0X03, 0XF8,
+  0XC0, 0X00, 0X07, 0XFF, 0X00, 0X00, 0X01, 0X80, 0X02, 0X30, 0X40, 0X00, 0X03, 0XFE, 0X00, 0X00,
+  0X01, 0X80, 0X02, 0X10, 0X40, 0X00, 0X03, 0XFE, 0X00, 0X00, 0X01, 0X80, 0X03, 0X10, 0XC0, 0X00,
+  0X01, 0XFC, 0X00, 0X00, 0X01, 0X80, 0X01, 0X81, 0X80, 0X00, 0X0C, 0X01, 0X80, 0X00, 0X01, 0X80,
+  0X00, 0X81, 0X80, 0X00, 0X00, 0X20, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X20,
+  0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X01, 0X81, 0X80, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X01, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF,
+  0XC1, 0X80, 0X00, 0XE0, 0X40, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XC1, 0X80, 0X03, 0XF8, 0X40, 0X00,
+  0X00, 0X1F, 0XE0, 0XFF, 0XC1, 0X80, 0X03, 0X1C, 0X40, 0X00, 0X00, 0X3F, 0X80, 0X1F, 0XC1, 0X80,
+  0X02, 0X06, 0X40, 0X00, 0X00, 0X3F, 0X00, 0X0F, 0XC1, 0X80, 0X02, 0X03, 0X40, 0X00, 0X00, 0XFC,
+  0X0F, 0X07, 0XC1, 0X80, 0X03, 0X01, 0XC0, 0X00, 0X00, 0XFC, 0X07, 0X83, 0XC1, 0X80, 0X01, 0X80,
+  0XC0, 0X00, 0X00, 0XFE, 0X03, 0XFF, 0XC1, 0X80, 0X00, 0X80, 0X40, 0X00, 0X01, 0XFF, 0XC0, 0X7F,
+  0XC1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC1, 0XF0, 0X7F, 0XC1, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X01, 0XC1, 0XF0, 0X7F, 0XC1, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XC0, 0XF8, 0X7F, 0XC1, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X01, 0XE0, 0X13, 0XFF, 0XC1, 0X80, 0X03, 0XFF, 0XC0, 0X00, 0X01, 0XF0,
+  0X0F, 0XFF, 0XC1, 0X80, 0X03, 0XFF, 0XC0, 0X00, 0X01, 0XFF, 0X01, 0XFF, 0XC1, 0X80, 0X01, 0X80,
+  0X00, 0X00, 0X01, 0XFF, 0XC0, 0X7F, 0XC1, 0X80, 0X00, 0XC0, 0X00, 0X00, 0X01, 0XFF, 0XC0, 0X7F,
+  0X81, 0X80, 0X00, 0X40, 0X00, 0X00, 0X01, 0XFE, 0X01, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X01, 0XFC, 0X1F, 0XFF, 0X81, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X0F, 0XFF, 0X81, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X00, 0XFF, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF,
+  0XC0, 0X7E, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X00, 0X7E, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X01, 0XFC, 0X03, 0XFC, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X1F, 0XF8,
+  0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X7F, 0XF0, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00,
+  0X01, 0XFC, 0X7F, 0XF0, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XC0, 0X01, 0X80,
+  0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFF, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00,
+  0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
+  0X01, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X80, 0X00, 0X00, 0X00, 0X00,
+};
+
+#endif

+ 429 - 0
src/epd/GxEPD2_102.cpp

@@ -0,0 +1,429 @@
+// 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
+// Panel: GDEW0102T4 : https://www.good-display.com/product/207.html
+// Controller: UC8175 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8175-1.pdf
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#include "GxEPD2_102.h"
+
+GxEPD2_102::GxEPD2_102(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)
+{
+}
+
+void GxEPD2_102::clearScreen(uint8_t value)
+{
+  writeScreenBuffer(value);
+  refresh(true);
+  writeScreenBuffer(value);
+}
+
+void GxEPD2_102::writeScreenBuffer(uint8_t value)
+{
+  _initial_write = false; // initial full screen buffer clean done
+  if (!_using_partial_mode) _Init_Part();
+  if (_initial_refresh)
+  {
+    _writeCommand(0x10); // init old data
+    _startTransfer();
+    for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+    {
+      _transfer(value);
+    }
+    _endTransfer();
+  }
+  _writeCommand(0x13);
+  _startTransfer();
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _transfer(value);
+  }
+  _endTransfer();
+}
+
+void GxEPD2_102::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(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::_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)
+{
+  if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
+  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();
+  //uint32_t start = micros();
+  _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _writeCommand(command);
+  _startTransfer();
+  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;
+      _transfer(data);
+    }
+  }
+  _endTransfer();
+  _writeCommand(0x92); // partial out
+  //Serial.print("GxEPD2_102::writeImage took "); Serial.println(micros() - start);
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_102::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
+  if ((x_part < 0) || (x_part >= w_bitmap)) return;
+  if ((y_part < 0) || (y_part >= h_bitmap)) return;
+  int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
+  x_part -= x_part % 8; // byte boundary
+  w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
+  h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
+  x -= x % 8; // byte boundary
+  w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
+  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();
+  _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _writeCommand(command);
+  _startTransfer();
+  for (int16_t i = 0; i < h1; i++)
+  {
+    for (int16_t j = 0; j < w1 / 8; j++)
+    {
+      uint8_t data;
+      // use wb_bitmap, h_bitmap of bitmap for index!
+      int16_t idx = mirror_y ? x_part / 8 + j + dx / 8 + ((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + (y_part + i + dy) * wb_bitmap;
+      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;
+      _transfer(data);
+    }
+  }
+  _endTransfer();
+  _writeCommand(0x92); // partial out
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_102::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_102::writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (black)
+  {
+    writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  }
+}
+
+void GxEPD2_102::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_102::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);
+  writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                               int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+  writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::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)
+{
+  writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+  writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                               int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+  writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::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)
+{
+  writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+  writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_102::refresh(bool partial_update_mode)
+{
+  if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
+  else
+  {
+    if (_using_partial_mode) _Init_Full();
+    _Update_Full();
+    _initial_refresh = false; // initial full update done
+  }
+}
+
+void GxEPD2_102::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  if (_initial_refresh) return refresh(false); // initial update needs be full update
+  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();
+  if (usePartialUpdateWindow) _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _Update_Part();
+  if (usePartialUpdateWindow) _writeCommand(0x92); // partial out
+}
+
+void GxEPD2_102::powerOff(void)
+{
+  _PowerOff();
+}
+
+void GxEPD2_102::hibernate()
+{
+  _PowerOff();
+  if (_rst >= 0)
+  {
+    _writeCommand(0x07); // deep sleep
+    _writeData(0xA5);    // check code
+    _hibernating = true;
+  }
+}
+
+void GxEPD2_102::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
+{
+  uint16_t xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte)
+  uint16_t ye = y + h - 1;
+  x &= 0xFFF8; // byte boundary
+  _writeCommand(0x90); // partial window
+  _writeData(x);
+  _writeData(xe);
+  _writeData(y);
+  _writeData(ye);
+  _writeData(0x00);
+}
+
+void GxEPD2_102::_PowerOn()
+{
+  if (!_power_is_on)
+  {
+    _writeCommand(0x04);
+    _waitWhileBusy("_PowerOn", power_on_time);
+  }
+  _power_is_on = true;
+}
+
+void GxEPD2_102::_PowerOff()
+{
+  _writeCommand(0x02); // power off
+  _waitWhileBusy("_PowerOff", power_off_time);
+  _power_is_on = false;
+  _using_partial_mode = false;
+}
+
+void GxEPD2_102::_InitDisplay()
+{
+  if (_hibernating) _reset();
+  _writeCommand(0xD2); // ??
+  _writeData(0x3F);
+  _writeCommand(0x00); // Panel Setting Register
+  _writeData (useOTPforFullRefresh ? 0x4F : 0x6F);   // LUT from OTP or from Registers
+  _writeCommand(0x01); // Power Setting
+  _writeData (0x03);   // internal VDH/VDL VGH/VGL
+  _writeData (0x00);   // VDG_LVL +15,-15
+  _writeData (0x2b);   // VDH_LVL +11
+  _writeData (0x2b);   // VDL_LVL -11
+  _writeCommand(0x06); // Charge Pump Setting
+  _writeData(0x3f);    // 50ms, Stength 4, 8kHz
+  _writeCommand(0x2A); // LUT Option
+  _writeData(0x00);    // no all gate on
+  _writeData(0x00);    // 0..5 : 10s, 20..30 : 4.8s
+  _writeCommand(0x30); // PLL
+  _writeData(0x13);    // 30 Hz
+  _writeCommand(0x50); // VCOM and Data interval setting
+  _writeData(0x57);    // default
+  _writeCommand(0x60); // TCON
+  _writeData(0x22);    // 24us
+  _writeCommand(0x61); // Resolution Setting
+  _writeData (0x50);   // HRES 80
+  _writeData (0x80);   // VRES 128
+  _writeCommand(0x82); // Vcom DC Setting
+  _writeData(0x12);    // -1 V
+  _writeCommand(0xe3); // Power Saving
+  _writeData(0x33);    //
+}
+
+const unsigned char GxEPD2_102::lut_w_full[] PROGMEM =
+{
+  0x60, 0x5A, 0x5A, 0x00, 0x00, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const unsigned char GxEPD2_102::lut_b_full[] PROGMEM =
+{
+  0x90, 0x5A, 0x5A, 0x00, 0x00, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const unsigned char GxEPD2_102::lut_w_partial[] PROGMEM =
+{
+  0x60, 0x01, 0x01, 0x00, 0x00, 0x01,
+  0x80, 0x0f, 0x00, 0x00, 0x00, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const unsigned char GxEPD2_102::lut_b_partial[] PROGMEM =
+{
+  0x90, 0x01, 0x01, 0x00, 0x00, 0x01,
+  0x40, 0x0f, 0x00, 0x00, 0x00, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+void GxEPD2_102::_Init_Full()
+{
+  _InitDisplay();
+  _writeCommand(0x23);
+  _writeDataPGM(lut_w_full, sizeof(lut_w_full));
+  _writeCommand(0x24);
+  _writeDataPGM(lut_b_full, sizeof(lut_b_full));
+  _PowerOn();
+  _using_partial_mode = false;
+}
+
+void GxEPD2_102::_Init_Part()
+{
+  _InitDisplay();
+  _writeCommand(0x00); // Panel Setting Register
+  _writeData (0x6F);   // LUT from Registers
+  _writeCommand(0x30); // PLL
+  _writeData(0x05);    // 15Hz
+  _writeCommand(0x50); // VCOM and Data interval setting
+  _writeData(0xF2);    // DDX 11 : differential, VBD 11 : vcom, CDI 2 : 5 hsync
+  _writeCommand(0x82); // Vcom DC Setting
+  _writeData(0x00);    // -0.1 V
+  _writeCommand(0x23);
+  _writeDataPGM(lut_w_partial, sizeof(lut_w_partial));
+  _writeCommand(0x24);
+  _writeDataPGM(lut_b_partial, sizeof(lut_b_partial));
+  _PowerOn();
+  _using_partial_mode = true;
+}
+
+void GxEPD2_102::_Update_Full()
+{
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Full", full_refresh_time);
+}
+
+void GxEPD2_102::_Update_Part()
+{
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Part", partial_refresh_time);
+}

+ 83 - 0
src/epd/GxEPD2_102.h

@@ -0,0 +1,83 @@
+// 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
+// Panel: GDEW0102T4 : https://www.good-display.com/product/207.html
+// Controller: UC8175 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8175-1.pdf
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_102_H_
+#define _GxEPD2_102_H_
+
+#include "../GxEPD2_EPD.h"
+
+class GxEPD2_102 : public GxEPD2_EPD
+{
+  public:
+    // attributes
+    static const uint16_t WIDTH = 80;
+    static const uint16_t HEIGHT = 128;
+    static const GxEPD2::Panel panel = GxEPD2::GDEW0102T4;
+    static const bool hasColor = false;
+    static const bool hasPartialUpdate = true;
+    static const bool usePartialUpdateWindow = false; // set false for better image
+    static const bool hasFastPartialUpdate = true;
+    static const bool useOTPforFullRefresh = true;
+    static const uint16_t power_on_time = 250; // ms, e.g. 210453us
+    static const uint16_t power_off_time = 250; // ms, e.g. 202366us
+    static const uint16_t full_refresh_time = 3600; // ms, e.g. 3507492us
+    static const uint16_t partial_refresh_time = 1200; // ms, e.g. 1102149us
+    // constructor
+    GxEPD2_102(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)
+    // 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 writeImageForFullRefresh(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 writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_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);
+    void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_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 drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_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);
+    void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_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, 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 _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                         int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    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 unsigned char lut_w_full[];
+    static const unsigned char lut_b_full[];
+    static const unsigned char lut_w_partial[];
+    static const unsigned char lut_b_partial[];
+};
+
+#endif