Explorar o código

Add new program 13.3inch e-Paper (B) routine, add 13.3inch e-Paper (K) local brush display and four grayscale display, fix some program problems

shhds hai 1 ano
pai
achega
6f636242d9
Modificáronse 63 ficheiros con 7151 adicións e 6870 borrados
  1. 313 0
      Arduino/epd13in3b/epd13in3b.cpp
  2. 65 0
      Arduino/epd13in3b/epd13in3b.h
  3. 49 0
      Arduino/epd13in3b/epd13in3b.ino
  4. 68 0
      Arduino/epd13in3b/epdif.cpp
  5. 52 0
      Arduino/epd13in3b/epdif.h
  6. 223 0
      Arduino/epd13in3b/imagedata.cpp
  7. 30 0
      Arduino/epd13in3b/imagedata.h
  8. 251 2
      Arduino/epd13in3k/epd13in3k.cpp
  9. 7 1
      Arduino/epd13in3k/epd13in3k.h
  10. 1 1
      Arduino/epd13in3k/epdif.cpp
  11. 5 1
      Arduino/epd2in66g/epdif.cpp
  12. 2 1
      Arduino/epd2in66g/epdif.h
  13. 21 4
      Arduino/epd4in26/epd4in26.cpp
  14. 357 0
      Arduino/epd5in79g/epd5in79g.cpp
  15. 74 0
      Arduino/epd5in79g/epd5in79g.h
  16. 60 0
      Arduino/epd5in79g/epd5in79g.ino
  17. 68 0
      Arduino/epd5in79g/epdif.cpp
  18. 52 0
      Arduino/epd5in79g/epdif.h
  19. 474 0
      Arduino/epd5in79g/imagedata.cpp
  20. 30 0
      Arduino/epd5in79g/imagedata.h
  21. 9 1
      RaspberryPi_JetsonNano/c/Makefile
  22. 166 0
      RaspberryPi_JetsonNano/c/examples/EPD_13in3b_test.c
  23. 91 4
      RaspberryPi_JetsonNano/c/examples/EPD_13in3k_test.c
  24. 1 0
      RaspberryPi_JetsonNano/c/examples/EPD_Test.h
  25. 3 0
      RaspberryPi_JetsonNano/c/examples/main.c
  26. 7 7
      RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.c
  27. 389 0
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3b.c
  28. 50 0
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3b.h
  29. 322 2
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3k.c
  30. 6 0
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3k.h
  31. 1 1
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in26.c
  32. BIN=BIN
      RaspberryPi_JetsonNano/c/pic/13in3b_b.bmp
  33. BIN=BIN
      RaspberryPi_JetsonNano/c/pic/13in3b_r.bmp
  34. BIN=BIN
      RaspberryPi_JetsonNano/c/pic/13in3k_Scale.bmp
  35. 88 0
      RaspberryPi_JetsonNano/python/examples/epd_13in3b_test.py
  36. 66 25
      RaspberryPi_JetsonNano/python/examples/epd_13in3k_test.py
  37. BIN=BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/__init__.cpython-37.pyc
  38. BIN=BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd13in3k.cpython-37.pyc
  39. BIN=BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-37.pyc
  40. 299 0
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd13in3b.py
  41. 349 13
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd13in3k.py
  42. 13 14
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.py
  43. BIN=BIN
      RaspberryPi_JetsonNano/python/pic/13in3b_b.bmp
  44. BIN=BIN
      RaspberryPi_JetsonNano/python/pic/13in3b_r.bmp
  45. BIN=BIN
      RaspberryPi_JetsonNano/python/pic/13in3k_Scale.bmp
  46. 97 0
      STM32/STM32-F103ZET6/MDK-ARM/DebugConfig/EPD_13in3b_test_STM32F103ZE.dbgconf
  47. 20 0
      STM32/STM32-F103ZET6/MDK-ARM/RTE/_EPD_13in3b_test/RTE_Components.h
  48. 0 1
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvguix.liuyujian
  49. 328 83
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvoptx
  50. 420 0
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvprojx
  51. 7 8
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.build_log.htm
  52. 428 1443
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.htm
  53. 661 144
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.map
  54. 1 1
      STM32/STM32-F103ZET6/MDK-ARM/startup_stm32f103xe.lst
  55. 160 0
      STM32/STM32-F103ZET6/User/Examples/EPD_13in3b_test.c
  56. 83 4
      STM32/STM32-F103ZET6/User/Examples/EPD_13in3k_test.c
  57. 2 0
      STM32/STM32-F103ZET6/User/Examples/ImageData.h
  58. 0 5104
      STM32/STM32-F103ZET6/User/Examples/ImageData2.c
  59. 463 0
      STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3b.c
  60. 52 0
      STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3b.h
  61. 357 1
      STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3k.c
  62. 7 0
      STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3k.h
  63. 3 4
      STM32/STM32-F103ZET6/User/e-Paper/EPD_4in26.c

+ 313 - 0
Arduino/epd13in3b/epd13in3b.cpp

@@ -0,0 +1,313 @@
+/**
+ *  @filename   :   epd13in3b.cpp
+ *  @brief      :   Implements for e-paper library
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare     2024 04 08
+ *
+ * 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.
+ */
+
+#include <stdlib.h>
+#include "epd13in3b.h"
+
+Epd::~Epd() {
+};
+
+Epd::Epd() {
+    reset_pin = RST_PIN;
+    dc_pin = DC_PIN;
+    cs_pin = CS_PIN;
+    busy_pin = BUSY_PIN;
+    width = EPD_WIDTH;
+    height = EPD_HEIGHT;
+};
+
+int Epd::Init(void) {
+    if (IfInit() != 0) {
+        return -1;
+    }
+    Reset();
+    ReadBusy();
+
+    SendCommand(0x12);
+    ReadBusy();
+
+    SendCommand(0x0C);
+    SendData(0xAE);
+    SendData(0xC7);
+    SendData(0xC3);
+    SendData(0xC0);
+    SendData(0x80);
+
+    SendCommand(0x01); 
+    SendData(0xA7);
+    SendData(0x02);  
+    SendData(0x00);
+
+    SendCommand(0x11); 
+    SendData(0x03);
+
+    SendCommand(0x44); 
+    SendData(0x00);
+    SendData(0x00);  
+    SendData(0xBF);
+    SendData(0x03); 
+    
+    SendCommand(0x45); 
+    SendData(0x00);
+    SendData(0x00); 
+    SendData(0xA7);
+    SendData(0x02);
+
+    SendCommand(0x3C);
+    SendData(0x01);
+
+    SendCommand(0x18);
+    SendData(0x80);
+
+    SendCommand(0x4E);
+    SendData(0x00);
+    SendData(0x00);
+
+    SendCommand(0x4F);
+    SendData(0x00);
+    SendData(0x00);
+
+    ReadBusy();
+
+    return 0;
+}
+
+/**
+ *  @brief: basic function for sending commands
+ */
+void Epd::SendCommand(unsigned char command) {
+    DigitalWrite(dc_pin, LOW);
+    SpiTransfer(command);
+}
+
+/**
+ *  @brief: basic function for sending data
+ */
+void Epd::SendData(unsigned char data) {
+    DigitalWrite(dc_pin, HIGH);
+    SpiTransfer(data);
+}
+
+/**
+ *  @brief: Wait until the busy_pin goes HIGH
+ */
+void Epd::ReadBusy(void) {
+    unsigned char busy;
+    Serial.print("e-Paper Busy\r\n ");
+    do{
+        DelayMs(20);
+        busy = DigitalRead(busy_pin);
+    }while(busy == 1);
+    Serial.print("e-Paper Busy Release\r\n ");
+    DelayMs(20);
+}
+
+
+/**
+ *  @brief: Refresh function
+ */
+void Epd::TurnOnDisplay(void) {
+    SendCommand(0x22);
+    SendData(0xF7);
+    SendCommand(0x20);  
+    ReadBusy();
+}
+
+void Epd::TurnOnDisplay_Part(void)
+{
+	SendCommand(0x22); //Display Update Control
+	SendData(0xFF);
+	SendCommand(0x20); //Activate Display Update Sequence
+	ReadBusy();
+}
+
+/**
+ *  @brief: module reset.
+ *          often used to awaken the module in deep sleep,
+ *          see Epd::Sleep();
+ */
+void Epd::Reset(void) {
+    DigitalWrite(reset_pin, HIGH);
+    DelayMs(200);
+    DigitalWrite(reset_pin, LOW);                //module reset    
+    DelayMs(2);
+    DigitalWrite(reset_pin, HIGH);
+    DelayMs(200);
+}
+
+void Epd::Clear(void) {
+    
+    SendCommand(0x24);
+    for(unsigned long i=0; i<height*width/8; i++)	{
+        SendData(0xFF);
+    }
+
+    SendCommand(0x26);
+    for(unsigned long i=0; i<height*width/8; i++)	{
+        SendData(0x00);
+    }
+    TurnOnDisplay();
+}
+
+void Epd::Displaypart(const unsigned char* pbuffer, unsigned long xStart, unsigned long yStart, unsigned long Picture_Width,  unsigned long Picture_Height, unsigned char Block) {
+    if(Block == 0){
+        SendCommand(0x24);
+    }else{
+        SendCommand(0x26);
+    }
+    
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            if( (j>=yStart) && (j<yStart+Picture_Height) && (i*8>=xStart) && (i*8<xStart+Picture_Width)){
+                if(Block == 0){
+                    SendData((pgm_read_byte(&(pbuffer[i-xStart/8 + (Picture_Width)/8*(j-yStart)]))) );
+                }else if(Block == 1){
+                    SendData(~(pgm_read_byte(&(pbuffer[i-xStart/8 + (Picture_Width)/8*(j-yStart)]))) );
+                }
+            }else {
+                if(Block == 0){
+                    SendData(0xFF);
+                }else{
+                    SendData(0x00);
+                }
+            }
+        }
+    }
+    
+    if(Block != 0){
+        TurnOnDisplay();
+    }
+}
+
+void Epd::DisplayFrame(const unsigned char *blackimage, const unsigned char *ryimage) {
+    
+    SendCommand(0x24);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(blackimage[i + j * width/8]);
+        }
+    }
+
+    SendCommand(0x26);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(ryimage[i + j * width/8]);
+        }
+    }
+
+    TurnOnDisplay();
+}
+
+void Epd::Display_Base(const unsigned char *blackimage, const unsigned char *ryimage) {
+    
+    SendCommand(0x24);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(blackimage[i + j * width/8]);
+        }
+    }
+
+    SendCommand(0x26);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(ryimage[i + j * width/8]);
+        }
+    }
+
+    TurnOnDisplay();
+
+    SendCommand(0x26);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(blackimage[i + j * width/8]);
+        }
+    }
+
+}
+
+void Epd::Display_Part(unsigned char *Image, unsigned long x, unsigned long y, unsigned long w, unsigned long l)
+{
+	unsigned long i;
+	unsigned long HEIGHT = l;
+	unsigned long WIDTH =  (w % 8 == 0)? (w / 8 ): (w / 8 + 1);
+
+	SendCommand(0x3C);        // Border       Border setting 
+	SendData(0x80);
+
+    SendCommand(0x44); 
+    SendData(x & 0xFF);
+    SendData((x>>8) & 0x03);  
+    SendData((x+w-1) & 0xFF);
+    SendData(((x+w-1)>>8) & 0x03);
+    
+    SendCommand(0x45); 
+    SendData(y & 0xFF);
+    SendData((y>>8) & 0x03);
+    SendData((y+l-1) & 0xFF);
+    SendData(((y+l-1)>>8) & 0x03);
+
+	SendCommand(0x4E);
+    SendData(x & 0xFF);
+    SendData((x>>8) & 0x03);  
+
+    SendCommand(0x4F);
+    SendData(y & 0xFF);
+    SendData((y>>8) & 0x03);
+
+	SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for (unsigned long j = 0; j < HEIGHT; j++) {
+        for (unsigned long i = 0; i < WIDTH; i++) {
+            SendData(Image[i + j * WIDTH]);
+        }
+    }
+	TurnOnDisplay_Part();	
+
+    SendCommand(0x26);   //write RAM for black(0)/white (1)
+	for (unsigned long j = 0; j < HEIGHT; j++) {
+        for (unsigned long i = 0; i < WIDTH; i++) {
+            SendData(Image[i + j * WIDTH]);
+        }
+    }
+}
+
+/**
+ *  @brief: After this command is transmitted, the chip would enter the 
+ *          deep-sleep mode to save power. 
+ *          The deep sleep mode would return to standby by hardware reset. 
+ *          The only one parameter is a check code, the command would be
+ *          executed if check code = 0xA5. 
+ *          You can use EPD_Reset() to awaken
+ */
+void Epd::Sleep(void) {
+    SendCommand(0x10);
+    SendData(0x03);
+    DelayMs(100);
+    ReadBusy();
+}
+
+/* END OF FILE */
+
+

+ 65 - 0
Arduino/epd13in3b/epd13in3b.h

@@ -0,0 +1,65 @@
+/**
+ *  @filename   :   epd7in5b_V2.h
+ *  @brief      :   Header file for e-paper library epd7in5b.cpp
+ *  @author     :   Yehui from Waveshare
+ *  
+ *  Copyright (C) Waveshare      Nov 30 2020
+ *
+ * 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 EPD7IN5B_H
+#define EPD7IN5B_H
+
+#include "epdif.h"
+
+// Display resolution
+#define EPD_WIDTH       960
+#define EPD_HEIGHT      680
+
+class Epd : EpdIf {
+public:
+    unsigned long width;
+    unsigned long height;
+
+    Epd();
+    ~Epd();
+    int  Init(void);
+    void ReadBusy(void);
+    void Reset(void);
+    void TurnOnDisplay(void);
+    void TurnOnDisplay_Part(void);
+    void Clear(void);
+    void Displaypart(const unsigned char* pbuffer, unsigned long xStart, unsigned long yStart,unsigned long Picture_Width,unsigned long Picture_Height, unsigned char Block);
+    void DisplayFrame(const unsigned char *blackimage, const unsigned char *ryimage);
+    void Display_Base(const unsigned char *blackimage, const unsigned char *ryimage);
+    void Display_Part(unsigned char *Image, unsigned long x, unsigned long y, unsigned long w, unsigned long l);
+    void SendCommand(unsigned char command);
+    void SendData(unsigned char data);
+    void Sleep(void);
+private:
+    unsigned int reset_pin;
+    unsigned int dc_pin;
+    unsigned int cs_pin;
+    unsigned int busy_pin;
+};
+
+#endif /* EPD7IN5B_H */
+
+/* END OF FILE */

+ 49 - 0
Arduino/epd13in3b/epd13in3b.ino

@@ -0,0 +1,49 @@
+/**
+ *  @filename   :   epd7in5b_V2-demo.ino
+ *  @brief      :   7.5inch b V2 e-paper display demo
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare      Nov 30 2020
+ *
+ * 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.
+ */
+
+#include <SPI.h>
+#include "epd13in3b.h"
+#include "imagedata.h"
+
+void setup() {
+  // put your setup code here, to run once:
+    Serial.begin(115200);
+    Epd epd;
+    if (epd.Init() != 0) {
+        Serial.print("e-Paper init failed");
+        return;
+    }
+    // epd.Clear();
+    epd.Displaypart(IMAGE_DATA,250, 100,240,103, 0);
+    epd.Displaypart(IMAGE_DATA,250, 300,240,103, 1);
+
+    epd.Sleep();
+}
+
+void loop() {
+  // put your main code here, to run repeatedly:
+
+}

+ 68 - 0
Arduino/epd13in3b/epdif.cpp

@@ -0,0 +1,68 @@
+/**
+ *  @filename   :   epdif.cpp
+ *  @brief      :   Implements EPD interface functions
+ *                  Users have to implement all the functions in epdif.cpp
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare     August 10 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.
+ */
+
+#include "epdif.h"
+#include <SPI.h>
+
+EpdIf::EpdIf() {
+};
+
+EpdIf::~EpdIf() {
+};
+
+void EpdIf::DigitalWrite(int pin, int value) {
+    digitalWrite(pin, value);
+}
+
+int EpdIf::DigitalRead(int pin) {
+    return digitalRead(pin);
+}
+
+void EpdIf::DelayMs(unsigned int delaytime) {
+    delay(delaytime);
+}
+
+void EpdIf::SpiTransfer(unsigned char data) {
+    digitalWrite(CS_PIN, LOW);
+    SPI.transfer(data);
+    digitalWrite(CS_PIN, HIGH);
+}
+
+int EpdIf::IfInit(void) {
+    pinMode(CS_PIN, OUTPUT);
+    pinMode(RST_PIN, OUTPUT);
+    pinMode(DC_PIN, OUTPUT);
+    pinMode(BUSY_PIN, INPUT); 
+
+    pinMode(PWR_PIN, OUTPUT);
+    DigitalWrite(PWR_PIN, 1);
+
+    SPI.begin();
+    SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
+    return 0;
+}
+

+ 52 - 0
Arduino/epd13in3b/epdif.h

@@ -0,0 +1,52 @@
+/**
+ *  @filename   :   epdif.h
+ *  @brief      :   Header file of epdif.cpp providing EPD interface functions
+ *                  Users have to implement all the functions in epdif.cpp
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare     August 10 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 EPDIF_H
+#define EPDIF_H
+
+#include <Arduino.h>
+
+// Pin definition
+#define RST_PIN         8
+#define DC_PIN          9
+#define CS_PIN          10
+#define BUSY_PIN        7
+#define PWR_PIN         6
+
+class EpdIf {
+public:
+    EpdIf(void);
+    ~EpdIf(void);
+
+    static int  IfInit(void);
+    static void DigitalWrite(int pin, int value); 
+    static int  DigitalRead(int pin);
+    static void DelayMs(unsigned int delaytime);
+    static void SpiTransfer(unsigned char data);
+};
+
+#endif

+ 223 - 0
Arduino/epd13in3b/imagedata.cpp

@@ -0,0 +1,223 @@
+/**
+ *  @filename   :   imagedata.cpp
+ *  @brief      :   data file for epd demo
+ *
+ *  Copyright (C) Waveshare     August 16 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.
+ */
+
+#include "imagedata.h"
+#include <avr/pgmspace.h>
+
+const unsigned char IMAGE_DATA[3096] PROGMEM = { //0X00,0X01,0XF0,0X00,0X67,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X01,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
+0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XC0,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XC0,0X00,0X00,
+0X00,0X00,0X01,0XF8,0X78,0X0F,0X00,0X0F,0XFF,0XFF,0XFF,0XC0,0X00,0X01,0XF0,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XC0,0X00,0X00,0X00,0X00,
+0X01,0XF8,0X78,0X0F,0X00,0X0F,0XFF,0XFF,0XFF,0XC0,0X00,0X01,0XF0,0X00,0X00,0X1F,
+0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X01,0XF8,0X3F,0XFF,0XFF,0XFF,0XFC,0X03,0XF0,
+0X78,0X0F,0X00,0X0F,0XFF,0XFF,0XFF,0XC0,0X00,0X01,0XF0,0X00,0X00,0X3F,0XFF,0XFF,
+0XF8,0X00,0X00,0X00,0X00,0X01,0XF8,0X3F,0XFF,0XFF,0XFF,0XFC,0X07,0XEF,0X7B,0XCF,
+0X00,0X0F,0XFF,0XFF,0XFF,0XC0,0X00,0X01,0XF0,0X00,0X00,0X3F,0XFF,0XFF,0XFC,0X00,
+0X00,0X00,0X00,0X01,0XF8,0X3F,0XFF,0XFF,0XFF,0XFC,0X0F,0XEF,0X7B,0XCF,0X00,0X00,
+0X00,0X7C,0X00,0X00,0X00,0X03,0XF0,0X00,0X00,0X3F,0XFF,0XFF,0XFE,0X00,0X00,0X00,
+0X00,0X01,0XF8,0X3F,0XFF,0XFF,0XFF,0XFC,0X1F,0XCF,0X7B,0XDF,0X00,0X3F,0XFF,0XFF,
+0XFF,0XF0,0X1F,0XFF,0XFF,0XFF,0X00,0X3F,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X01,
+0XF8,0X3F,0XFF,0XFF,0XFF,0XFC,0X3F,0X8F,0X7B,0XDF,0X00,0X3F,0XFF,0XFF,0XFF,0XF0,
+0X1F,0XFF,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,
+0XFF,0XFE,0XFF,0XFC,0X3F,0X0F,0X7B,0XDF,0XFE,0X3F,0XFF,0XFF,0XFF,0XF0,0X1F,0XFF,
+0XFF,0XFF,0X00,0X00,0X00,0X1F,0XF0,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFC,
+0XFF,0XFC,0X1E,0XFF,0XFF,0XFF,0XFE,0X3F,0XFF,0XFF,0XFF,0XF0,0X1F,0XFF,0XFF,0XFF,
+0X00,0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XF8,0XFF,0XFC,
+0X1D,0XFF,0XFF,0XFF,0XFE,0X3C,0X00,0X7C,0X01,0XF0,0X1F,0XFF,0XFF,0XFF,0X00,0X00,
+0X00,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XF0,0XFF,0XFC,0X09,0XFF,
+0XFF,0XFF,0XFE,0X3D,0XFE,0X7F,0XFF,0XF0,0X1F,0X01,0XF0,0X1F,0X00,0X00,0X03,0XFF,
+0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XE0,0XFF,0XFC,0X03,0XFF,0XFF,0XFE,
+0XF8,0X3D,0XFE,0X7F,0XFF,0XF0,0X1F,0X01,0XF0,0X1F,0X00,0X00,0X03,0XFE,0X00,0X00,
+0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XE0,0XFF,0XFC,0X03,0XF0,0X00,0X7E,0XF8,0X3D,
+0XFE,0X7F,0XFF,0XF0,0X1F,0X01,0XF0,0X1F,0X00,0X00,0X03,0XF0,0X00,0X00,0X00,0X00,
+0X00,0X00,0X0F,0XFF,0XFF,0XE0,0XFF,0XFC,0X07,0XE0,0X00,0XFE,0XF8,0X3C,0X00,0X7C,
+0X01,0XF0,0X1F,0XFF,0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
+0X0E,0X0F,0X0F,0XC1,0XF1,0XFC,0X0F,0XEF,0XFF,0XFE,0XF8,0X3D,0XFE,0X7F,0XFF,0XF0,
+0X1F,0XFF,0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0X0F,
+0X07,0XC3,0XE0,0XFC,0X1F,0XEF,0XFF,0XFE,0XF8,0X3D,0XFE,0X7F,0XFE,0XF0,0X1F,0XFF,
+0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0E,0X0F,0X07,0X83,
+0XE0,0XFC,0X3F,0XEF,0XFF,0XFE,0XF8,0X01,0XFE,0X7F,0XFE,0X00,0X1F,0XFF,0XFF,0XFF,
+0X03,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X0F,0X07,0X07,0X83,0XC0,0X7C,
+0X3F,0XEF,0XFF,0XFF,0XF8,0X00,0X00,0X7C,0X00,0X00,0X1F,0X03,0XF0,0X1F,0X03,0XFF,
+0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X0F,0X07,0X03,0X87,0XC0,0X7C,0X3F,0XE0,
+0X00,0X3F,0XF8,0X00,0X00,0X00,0X00,0X00,0X1F,0X01,0XF0,0X1F,0X03,0XFF,0XFF,0XFF,
+0XFF,0XC0,0X00,0X00,0X00,0X00,0X0F,0X06,0X03,0X07,0X80,0X3C,0X3F,0XE3,0XFF,0X0F,
+0XF0,0X00,0X00,0X00,0X00,0X00,0X1F,0X01,0XF0,0X1F,0X03,0XFF,0XFF,0XFF,0XFF,0XC0,
+0X00,0X00,0X00,0X00,0X0F,0X00,0X01,0X0F,0X80,0X3C,0X1F,0XE3,0XFF,0X0F,0XF0,0X07,
+0XFF,0XFF,0XFF,0X80,0X1F,0XFF,0XFF,0XFF,0X00,0X00,0X07,0XE0,0X00,0X00,0X00,0X00,
+0X00,0X00,0X0F,0X80,0X00,0X0F,0X80,0X3C,0X19,0XE3,0XFF,0X0F,0XF0,0X07,0XFF,0XFF,
+0XFF,0X80,0X1F,0XFF,0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
+0X0F,0X80,0X60,0X0F,0X04,0X1C,0X01,0XE3,0XFF,0X0F,0XE0,0X07,0XFF,0XFF,0XFF,0X80,
+0X1F,0XFF,0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,
+0X60,0X1E,0X04,0X1C,0X01,0XE3,0XCF,0X0F,0XE0,0X03,0XFF,0XFF,0XFF,0X80,0X1F,0XFF,
+0XFF,0XFF,0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XC0,0X70,0X1E,
+0X0E,0X0C,0X01,0XE3,0XCF,0XF7,0XE0,0X00,0X00,0X00,0X0F,0X80,0X1F,0XFF,0XFF,0XFF,
+0X00,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XC0,0XF0,0X3C,0X1F,0X04,
+0X01,0XE3,0XCF,0XF7,0XC0,0X03,0XFF,0XFF,0XFF,0X80,0X1F,0X01,0XF0,0X01,0XC0,0X00,
+0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XE0,0XF0,0X78,0X1F,0X0C,0X01,0XE7,
+0XCF,0XFF,0XE0,0X03,0XFF,0XFF,0XFF,0X80,0X1F,0X01,0XF0,0X03,0XF0,0X00,0X03,0XE0,
+0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XE0,0XF0,0X78,0X3E,0X0C,0X01,0XE7,0XCF,0XFF,
+0XF0,0X03,0XFF,0XFF,0XFF,0X80,0X1F,0X01,0XF0,0X03,0XF0,0X00,0X03,0XE0,0X00,0X00,
+0X00,0X00,0X00,0X00,0X0F,0XE0,0XF8,0X78,0X3E,0X1C,0X01,0XE7,0XCF,0XFF,0XF0,0X01,
+0XFF,0XFF,0XFF,0X80,0X00,0X01,0XF0,0X03,0XF0,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,
+0X00,0X00,0X0F,0XF1,0XF8,0X78,0X3C,0X1C,0X01,0XEF,0X8F,0XBF,0XF8,0X00,0X00,0X00,
+0X0F,0X80,0X00,0X01,0XF0,0X03,0XE0,0X00,0X03,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
+0X0F,0XFF,0XFF,0XFF,0XFC,0X3C,0X01,0XEF,0X8F,0XFF,0XFC,0X07,0XFF,0XFF,0XFF,0X80,
+0X00,0X01,0XFF,0XFF,0XE0,0X03,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,
+0XFF,0XFF,0XF0,0X3C,0X01,0XFF,0X8F,0XFE,0XFF,0X07,0XFF,0XFF,0XFF,0X80,0X00,0X01,
+0XFF,0XFF,0XE0,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,
+0XF0,0X7C,0X01,0XFF,0X01,0XFC,0X7E,0X07,0XFF,0XFF,0XFF,0X80,0X00,0X01,0XFF,0XFF,
+0XC0,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF0,0X7C,
+0X01,0XE7,0X00,0XF8,0X3C,0X07,0XFF,0XFF,0XFF,0X80,0X00,0X00,0XFF,0XFF,0XC0,0X01,
+0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF0,0X7C,0X01,0XE6,
+0X00,0XF0,0X18,0X00,0X00,0X00,0X0F,0X80,0X00,0X00,0X7F,0XFF,0X80,0X01,0XFF,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF0,0XFC,0X01,0XE0,0X00,0X60,
+0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF1,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XF3,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,
+0X0F,0XFF,0XFF,0XFF,0XF7,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X0F,0XFF,
+0XFF,0XFF,0XFF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,
+0XFF,0X83,0XCE,0X71,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0X03,0X3F,0XFF,0XFF,
+0XFF,0XFF,0XFE,0X3F,0XFF,0XFE,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0X83,
+0XC6,0X33,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFF,0XFF,0X3F,0X3F,0XFF,0XF3,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0X23,
+0X8E,0X79,0X8F,0X80,0X1F,0X1E,0X1E,0X3F,0X3F,0X3C,0X7C,0X20,0X83,0X8E,0X4F,0X3C,
+0X30,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XC4,0X23,0X07,0X33,
+0X07,0X08,0X0E,0X0C,0X18,0X1F,0X3F,0X30,0X38,0X20,0X82,0X06,0X06,0X30,0X30,0XFE,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XE4,0X03,0X33,0X32,0X32,0X78,
+0XC6,0X44,0X39,0X9F,0X07,0X31,0XB1,0XF3,0X8E,0X66,0X22,0X31,0XE7,0XFE,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XE0,0X07,0XC3,0X02,0X03,0X18,0XC7,0X84,
+0X70,0X1F,0X3F,0X30,0X13,0XF3,0X9C,0X62,0X62,0X33,0XE1,0XFE,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0XFF,0XE1,0X87,0X03,0X06,0X03,0X88,0XC6,0X04,0X70,0X1F,
+0X3F,0X30,0X13,0XF3,0X9C,0X62,0X62,0X33,0XF0,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0XFF,0XE1,0X86,0X33,0X06,0X7F,0XC0,0XC4,0X44,0X71,0XFF,0X3F,0X33,
+0XF3,0XF3,0X9C,0X62,0X62,0X33,0XFC,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0XFF,0XE1,0X8E,0X23,0X8F,0X3F,0XC8,0XC4,0X44,0X78,0XFF,0X3F,0X31,0XF9,0XF1,
+0X9E,0X06,0X62,0X31,0XFC,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,
+0XF1,0X8F,0X03,0X8F,0X86,0X18,0XC6,0X04,0X7C,0X1F,0X03,0X3C,0X3C,0X30,0X9F,0X0E,
+0X62,0X3C,0X61,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
+0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
+0X00,0X00,};

+ 30 - 0
Arduino/epd13in3b/imagedata.h

@@ -0,0 +1,30 @@
+/**
+ *  @filename   :   imagedata.h
+ *  @brief      :   head file for imagedata.cpp
+ *
+ *  Copyright (C) Waveshare     July 10 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.
+ */
+
+extern const unsigned char IMAGE_DATA[];
+
+/* FILE END */
+
+

+ 251 - 2
Arduino/epd13in3k/epd13in3k.cpp

@@ -27,6 +27,49 @@
 #include <stdlib.h>
 #include "epd13in3k.h"
 
+const unsigned char Lut_Partial[]={										
+0x15,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x2A,	0x88,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x15,	0x44,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x08,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x01,	0x01,	0x01,	0x00,						
+0x0A,	0x00,	0x05,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x01,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x18,						
+0x00,	0x00,									
+};	
+
+const unsigned char LUT_DATA_4Gray[112] =    //112bytes
+{											
+0x80,	0x48,	0x4A,	0x22,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x0A,	0x48,	0x68,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x88,	0x48,	0x60,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0xA8,	0x48,	0x45,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x07,	0x23,	0x17,	0x02,	0x00,						
+0x05,	0x01,	0x05,	0x01,	0x02,						
+0x08,	0x02,	0x01,	0x04,	0x04,						
+0x00,	0x02,	0x00,	0x02,	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,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x30,						
+0x00,	0x00,	
+};
+
 Epd::~Epd() {
 };
 
@@ -84,11 +127,138 @@ int Epd::Init(void) {
 
     SendCommand(0x4E);
     SendData(0x00);
+    SendData(0x00);
 
     SendCommand(0x4F);
     SendData(0x00);
     SendData(0x00);
 
+    ReadBusy();
+
+    return 0;
+}
+
+int Epd::Init_Part(void) {
+    unsigned int count;
+
+    if (IfInit() != 0) {
+        return -1;
+    }
+    Reset();
+    ReadBusy();
+
+    SendCommand(0x3C);  
+	SendData(0x80);
+
+    SendCommand(0x32);
+    for(count = 0; count < 105 ; count++) {
+        SendData(Lut_Partial[count]);
+    }
+
+    SendCommand(0x03);
+	SendData(Lut_Partial[105]);
+
+	SendCommand(0x04);  
+	SendData(Lut_Partial[106]);
+	SendData(Lut_Partial[107]);
+	SendData(Lut_Partial[108]); 
+
+	SendCommand(0x2C); 
+	SendData(Lut_Partial[109]);
+
+    SendCommand(0x37); 
+    SendData(0x00);  
+    SendData(0x00);  
+    SendData(0x00);  
+    SendData(0x00);  
+    SendData(0x00); 
+    SendData(0x40);  
+    SendData(0x00);  
+    SendData(0x00);   
+    SendData(0x00);  
+    SendData(0x00);  
+
+    SendCommand(0x3C); 
+    SendData(0x80);   
+
+    SendCommand(0x22); 
+    SendData(0xC0);   
+    SendCommand(0x20); 
+
+    ReadBusy();
+
+    return 0;
+}
+
+int Epd::Init_4GRAY(void) {
+    unsigned int count;
+
+    if (IfInit() != 0) {
+        return -1;
+    }
+    ReadBusy();   
+	SendCommand(0x12);  //SWRESET
+	ReadBusy();   
+
+	SendCommand(0x0C); //set soft start     
+	SendData(0xAE);
+	SendData(0xC7);
+	SendData(0xC3);
+	SendData(0xC0);
+	SendData(0x80);
+
+	SendCommand(0x01); 
+    SendData(0xA7);
+    SendData(0x02);  
+    SendData(0x00);
+
+	SendCommand(0x11);
+	SendData(0x03); 
+
+	SendCommand(0x44); 
+    SendData(0x00);
+    SendData(0x00);  
+    SendData(0xBF);
+    SendData(0x03); 
+    
+    SendCommand(0x45); 
+    SendData(0x00);
+    SendData(0x00); 
+    SendData(0xA7);
+    SendData(0x02);
+
+	SendCommand(0x3C);        // Border       Border setting 
+	SendData(0x00);
+
+	SendCommand(0x18); // use the internal temperature sensor
+	SendData(0x80);
+	
+	SendCommand(0x4E);
+    SendData(0x00);
+    SendData(0x00);
+
+    SendCommand(0x4F);
+    SendData(0x00);
+    SendData(0x00);
+
+    SendCommand(0x32);
+    for(count = 0; count < 105 ; count++) {
+        SendData(LUT_DATA_4Gray[count]);
+    }
+
+    SendCommand(0x03);
+	SendData(LUT_DATA_4Gray[105]);
+
+	SendCommand(0x04);  
+	SendData(LUT_DATA_4Gray[106]);
+	SendData(LUT_DATA_4Gray[107]);
+	SendData(LUT_DATA_4Gray[108]); 
+
+	SendCommand(0x2C); 
+	SendData(LUT_DATA_4Gray[109]);
+	
+	ReadBusy();
+
     return 0;
 }
 
@@ -132,6 +302,23 @@ void Epd::TurnOnDisplay(void) {
     ReadBusy();
 }
 
+void Epd::TurnOnDisplay_Part(void)
+{
+	SendCommand(0x22); //Display Update Control
+	SendData(0xCF);
+	SendCommand(0x20); //Activate Display Update Sequence
+	ReadBusy();
+}
+
+void Epd::TurnOnDisplay_4GRAY(void)
+{
+    SendCommand(0x22);
+    SendData(0xC7);
+	SendCommand(0x20);
+    ReadBusy();
+}
+
+
 /**
  *  @brief: module reset.
  *          often used to awaken the module in deep sleep,
@@ -141,7 +328,7 @@ void Epd::Reset(void) {
     DigitalWrite(reset_pin, HIGH);
     DelayMs(20); 
     DigitalWrite(reset_pin, LOW);                //module reset    
-    DelayMs(4);
+    DelayMs(2);
     DigitalWrite(reset_pin, HIGH);
     DelayMs(20);    
 }
@@ -172,6 +359,68 @@ void Epd::Displaypart(const unsigned char* pbuffer, unsigned long xStart, unsign
     TurnOnDisplay();
 }
 
+void Epd::Display_Base(const unsigned char* frame_buffer) {
+    
+    SendCommand(0x24);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(frame_buffer[i + j * width/8]);
+        }
+    }
+
+    SendCommand(0x26);
+    for (unsigned long j = 0; j < height; j++) {
+        for (unsigned long i = 0; i < width/8; i++) {
+            SendData(frame_buffer[i + j * width/8]);
+        }
+    }
+
+    TurnOnDisplay();
+}
+
+void Epd::Display_Part(unsigned char *Image, unsigned long x, unsigned long y, unsigned long w, unsigned long l)
+{
+	unsigned long i;
+	unsigned long HEIGHT = l;
+	unsigned long WIDTH =  (w % 8 == 0)? (w / 8 ): (w / 8 + 1);
+
+    Reset();
+
+	SendCommand(0x18); // use the internal temperature sensor
+	SendData(0x80);
+
+	SendCommand(0x3C);        // Border       Border setting 
+	SendData(0x80);
+
+    SendCommand(0x44); 
+    SendData(x & 0xFF);
+    SendData((x>>8) & 0x03);  
+    SendData((x+w-1) & 0xFF);
+    SendData(((x+w-1)>>8) & 0x03);
+    
+    SendCommand(0x45); 
+    SendData(y & 0xFF);
+    SendData((y>>8) & 0x03);
+    SendData((y+l-1) & 0xFF);
+    SendData(((y+l-1)>>8) & 0x03);
+
+	SendCommand(0x4E);
+    SendData(x & 0xFF);
+    SendData((x>>8) & 0x03);  
+
+    SendCommand(0x4F);
+    SendData(y & 0xFF);
+    SendData((y>>8) & 0x03);
+
+	SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for (unsigned long j = 0; j < HEIGHT; j++) {
+        for (unsigned long i = 0; i < WIDTH; i++) {
+            SendData(Image[i + j * WIDTH]);
+        }
+    }
+	TurnOnDisplay_Part();	
+}
+
 /**
  *  @brief: After this command is transmitted, the chip would enter the 
  *          deep-sleep mode to save power. 
@@ -182,7 +431,7 @@ void Epd::Displaypart(const unsigned char* pbuffer, unsigned long xStart, unsign
  */
 void Epd::Sleep(void) {
     SendCommand(0x10);
-    SendData(0x01);
+    SendData(0x03);
     DelayMs(100);
     ReadBusy();
 }

+ 7 - 1
Arduino/epd13in3k/epd13in3k.h

@@ -38,15 +38,21 @@ public:
     Epd();
     ~Epd();
     int  Init(void);
+    int Init_Part(void);
+    int Init_4GRAY(void);
     void ReadBusy(void);
     void Reset(void);
     void TurnOnDisplay(void);
+    void TurnOnDisplay_Part(void);
+    void TurnOnDisplay_4GRAY(void);
     void DisplayFrame(const unsigned char* frame_buffer);
     void SendCommand(unsigned char command);
     void SendData(unsigned char data);
     void Sleep(void);
     void Clear(void);
-    void Epd::Displaypart(const unsigned char* pbuffer, unsigned long Start_X, unsigned long Start_Y,unsigned long END_X,unsigned long END_Y);
+    void Displaypart(const unsigned char* pbuffer, unsigned long Start_X, unsigned long Start_Y,unsigned long END_X,unsigned long END_Y);
+    void Display_Base(const unsigned char* frame_buffer);
+    void Display_Part(unsigned char *Image, unsigned long x, unsigned long y, unsigned long w, unsigned long l);
  
 private:
     unsigned int reset_pin;

+ 1 - 1
Arduino/epd13in3k/epdif.cpp

@@ -62,7 +62,7 @@ int EpdIf::IfInit(void) {
     DigitalWrite(PWR_PIN, 1);
 
     SPI.begin();
-    SPI.beginTransaction(SPISettings(7000000, MSBFIRST, SPI_MODE0));
+    SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
     return 0;
 }
 

+ 5 - 1
Arduino/epd2in66g/epdif.cpp

@@ -4,7 +4,7 @@
  *                  Users have to implement all the functions in epdif.cpp
  *  @author     :   Yehui from Waveshare
  *
- *  Copyright (C) Waveshare     August 10 2017
+ *  Copyright (C) Waveshare    2024/03/06
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documnetation files (the "Software"), to deal
@@ -58,7 +58,11 @@ int EpdIf::IfInit(void) {
     pinMode(DC_PIN, OUTPUT);
     pinMode(BUSY_PIN, INPUT); 
 
+    pinMode(PWR_PIN, OUTPUT);
+    DigitalWrite(PWR_PIN, 1);
+
     SPI.begin();
     SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
     return 0;
 }
+

+ 2 - 1
Arduino/epd2in66g/epdif.h

@@ -4,7 +4,7 @@
  *                  Users have to implement all the functions in epdif.cpp
  *  @author     :   Yehui from Waveshare
  *
- *  Copyright (C) Waveshare     August 10 2017
+ *  Copyright (C) Waveshare     2024/03/06
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documnetation files (the "Software"), to deal
@@ -35,6 +35,7 @@
 #define DC_PIN          9
 #define CS_PIN          10
 #define BUSY_PIN        7
+#define PWR_PIN         6
 
 class EpdIf {
 public:

+ 21 - 4
Arduino/epd4in26/epd4in26.cpp

@@ -154,6 +154,8 @@ int Epd::Init_Fast(void) {
 }
 
 int Epd::Init_4GRAY(void) {
+    unsigned int count;
+
     if (IfInit() != 0) {
         return -1;
     }
@@ -191,7 +193,22 @@ int Epd::Init_4GRAY(void) {
 
 	ReadBusy();
 
-    SetLut();
+    
+    SendCommand(0x32); //vcom
+    for(count = 0; count < 105 ; count++) {
+        SendData(LUT_DATA_4Gray[count]);
+    }
+
+    SendCommand(0x03); //VGH      
+	SendData(LUT_DATA_4Gray[105]);
+
+	SendCommand(0x04); //      
+	SendData(LUT_DATA_4Gray[106]); //VSH1   
+	SendData(LUT_DATA_4Gray[107]); //VSH2   
+	SendData(LUT_DATA_4Gray[108]); //VSL   
+
+	SendCommand(0x2C);     //VCOM Voltage
+	SendData(LUT_DATA_4Gray[109]);    //0x1C
 
     return 0;
 }
@@ -409,10 +426,10 @@ void Epd::Display_Part(unsigned char *Image, unsigned long x, unsigned long y, u
  *          You can use EPD_Reset() to awaken
  */
 void Epd::Sleep(void) {
-    SendCommand(0X02);
+    SendCommand(0x10);
+    SendData(0x03);
+    DelayMs(100);
     ReadBusy();
-    SendCommand(0X07);
-    SendData(0xA5);
 }
 
 void Epd::Clear(void) {

+ 357 - 0
Arduino/epd5in79g/epd5in79g.cpp

@@ -0,0 +1,357 @@
+/**
+ *  @filename   :   epd2in66g.cpp
+ *  @brief      :   Implements for e-paper library
+ *  @author     :   Waveshare
+ *
+ *  Copyright (C) Waveshare     2022/08/17
+ *
+ * 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.
+ */
+
+#include <stdlib.h>
+#include "epd5in79g.h"
+
+Epd::~Epd() {
+};
+
+Epd::Epd() {
+    reset_pin = RST_PIN;
+    dc_pin = DC_PIN;
+    cs_pin = CS_PIN;
+    busy_pin = BUSY_PIN;
+    WIDTH = EPD_WIDTH;
+    HEIGHT = EPD_HEIGHT;
+};
+
+int Epd::Init() {
+    /* this calls the peripheral hardware interface, see epdif */
+    if (IfInit() != 0) {
+        return -1;
+    }
+    Reset();
+
+    SendCommand(0xA2);	//********************
+    SendData(0x01);
+
+    SendCommand(0x00);	//0x00
+    SendData(0x03);	
+    SendData(0x29);
+
+    SendCommand(0xA2);	//********************
+    SendData(0x02);	
+
+    SendCommand(0x00);	//0x00
+    SendData(0x07);	
+    SendData(0x29);
+
+    SendCommand(0xA2);	//********************
+    SendData(0x00);	
+
+    SendCommand(0x50);	//
+    SendData(0x97);	
+
+    SendCommand(0x61); //0x61	
+    SendData(0x01);	
+    SendData(0x8c);	
+    SendData(0x01);	
+    SendData(0x10); 	
+
+    SendCommand(0x06);	//0x06
+    SendData(0x38);	
+    SendData(0x38);
+    SendData(0x38);
+    SendData(0x00);	//////////////////////////////////////////
+
+    SendCommand(0xE9);	//0xE0
+    SendData(0x01);
+
+    SendCommand(0xE0);	//0xE0
+    SendData(0x01);
+
+    SendCommand(0x04);
+    ReadBusyH();  //while(1);	
+    return 0;
+}
+
+/**
+ *  @brief: basic function for sending commands
+ */
+void Epd::SendCommand(unsigned char command) {
+    DigitalWrite(dc_pin, LOW);
+    SpiTransfer(command);
+}
+
+/**
+ *  @brief: basic function for sending data
+ */
+void Epd::SendData(unsigned char data) {
+    DigitalWrite(dc_pin, HIGH);
+    SpiTransfer(data);
+}
+
+/**
+ *  @brief: Wait until the busy_pin goes LOW
+ */
+void Epd::ReadBusyH(void) {
+    Serial.print("e-Paper busy H\r\n ");
+    while(DigitalRead(busy_pin) == LOW) {      //LOW: busy, HIGH: idle
+        DelayMs(5);
+    } 
+    Serial.print("e-Paper busy release H\r\n ");    
+}
+
+void Epd::ReadBusyL(void) {
+    Serial.print("e-Paper busy L\r\n ");
+    while(DigitalRead(busy_pin) == HIGH) {      //LOW: idle, HIGH: busy
+        DelayMs(5);
+    }      
+    Serial.print("e-Paper busy release L\r\n ");
+}
+
+/**
+ *  @brief: module reset.
+ *          often used to awaken the module in deep sleep,
+ *          see Epd::Sleep();
+ */
+void Epd::Reset(void) {
+    DigitalWrite(reset_pin, HIGH);
+    DelayMs(20);    
+    DigitalWrite(reset_pin, LOW);                //module reset    
+    DelayMs(2);
+    DigitalWrite(reset_pin, HIGH);
+    DelayMs(20);     
+}
+
+/******************************************************************************
+function :	Turn On Display
+parameter:
+******************************************************************************/
+void Epd::TurnOnDisplay(void)
+{
+    SendCommand(0xA2); 
+    SendData(0x00);
+
+    SendCommand(0x12); 
+    SendData(0x00);
+    ReadBusyH();
+}
+
+/******************************************************************************
+function :	Clear screen
+parameter:
+******************************************************************************/
+void Epd::Clear(UBYTE color)
+{
+    UWORD Width, Height;
+    Width = (WIDTH % 8 == 0)? (WIDTH / 8 ): (WIDTH / 8 + 1);
+    Height = HEIGHT;
+
+    SendCommand(0xA2);	//********************
+    SendData(0x01);
+    SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            SendData((color<<6) | (color<<4) | (color<<2) | color);
+        }
+    }
+
+    SendCommand(0xA2);	//********************
+    SendData(0x02);
+    SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            SendData((color<<6) | (color<<4) | (color<<2) | color);
+        }
+    }
+
+    TurnOnDisplay();
+}
+
+/******************************************************************************
+function :	Sends the image buffer in RAM to e-Paper and displays
+parameter:
+******************************************************************************/
+void Epd::Display(UBYTE *Image)
+{
+    UWORD Width, Height, Width1;
+    Width1 = (WIDTH % 4 == 0)? (WIDTH / 4 ): (WIDTH / 4 + 1);
+    Width =(WIDTH % 8 == 0)?(WIDTH / 8 ):(WIDTH / 8 + 1);
+    Height = HEIGHT;
+
+    SendCommand(0xA2);	//********************
+    SendData(0x01);
+    SendCommand(0x10);
+    
+    for (UWORD j = 0; j < Height/2; j++) {
+
+        for (UWORD i = 0; i < Width; i++) {
+            SendData(pgm_read_byte(&Image[i + j * Width1]));
+        }
+
+        for (UWORD i = 0; i < Width; i++) {
+            SendData(pgm_read_byte(&Image[i + (Height - j - 1) * Width1]));
+        }
+    }
+
+    SendCommand(0xA2);	//********************
+    SendData(0x02);
+    SendCommand(0x10);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            SendData(pgm_read_byte(&Image[j * Width1 + i + Width]));
+        }
+
+        for (UWORD i = 0; i < Width; i++) {
+            SendData(pgm_read_byte(&Image[(Height - j - 1) * Width1 + i + Width]));
+        }
+    }
+    TurnOnDisplay();
+}
+
+void Epd::Display_part(UBYTE *Image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_height)
+{
+    UWORD Width, Width1, Width2, Height, i, j, xend, yend;
+    Width = (WIDTH % 8 == 0)? (WIDTH / 8 ): (WIDTH / 8 + 1);
+    Height = HEIGHT;
+    xend = xstart + image_width;
+    yend = ystart + image_height;
+
+    if(xstart>395)
+    {
+        xstart = xstart - 396 ;
+        xend = xstart + image_width;
+        SendCommand(0xA2);
+        SendData(0x01);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                if(j >= ystart && i < xend/4 && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(j - ystart) * image_width/4 + i - xstart/4]));
+                else
+                    SendData(0x55);
+            }
+            for (UWORD i = 0; i < Width; i++) {
+                if((Height - j) < yend && i < xend/4 && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(yend - (Height - j)) * image_width/4 + i- xstart/4]));
+                else
+                    SendData(0x55);
+            } 
+        }
+
+        SendCommand(0xA2);
+        SendData(0x02);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                    SendData(0x55);
+            }
+        }
+    }
+    else if(xend<396)
+    {
+        xend = xstart + image_width;
+        SendCommand(0xA2);
+        SendData(0x01);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                    SendData(0x55);
+            }
+        }
+
+        SendCommand(0xA2);
+        SendData(0x02);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                if(j >= ystart && i < xend/4 && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(j - ystart) * image_width/4 + i - xstart/4]));
+                else
+                    SendData(0x55);
+            }
+            for (UWORD i = 0; i < Width; i++) {
+                if((Height - j) < yend && i < xend/4 && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(yend - (Height - j)) * image_width/4 + i- xstart/4]));
+                else
+                    SendData(0x55);
+            } 
+        }
+
+    }
+    else
+    {
+        xend = xstart + image_width;
+        Width1 = ((395 - xstart) % 4 == 0)?((395 - xstart) / 4 ):((395 - xstart) / 4 + 1);
+        Width2 = ((xend - 396) % 4 == 0)?((xend - 396) / 4 ):((xend - 396) / 4 + 1);
+        SendCommand(0xA2);
+        SendData(0x01);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                if(j >= ystart && i < Width2)
+                    SendData(pgm_read_byte(&Image[(j - ystart) * image_width/4 + i + Width1]));
+                else
+                    SendData(0x55);
+            }
+            for (UWORD i = 0; i < Width; i++) {
+                if((Height - j) < yend && i < Width2)
+                    SendData(pgm_read_byte(&Image[(yend - (Height - j)) * image_width/4 + i + Width1]));
+                else
+                    SendData(0x55);
+            } 
+        }
+
+        SendCommand(0xA2);
+        SendData(0x02);
+        SendCommand(0x10);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                if(j >= ystart && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(j - ystart) * image_width/4 + i - xstart/4]));
+                else
+                    SendData(0x55);
+            }
+            for (UWORD i = 0; i < Width; i++) {
+                if((Height - j) < yend && i >= xstart/4)
+                    SendData(pgm_read_byte(&Image[(yend - (Height - j)) * image_width/4 + i- xstart/4]));
+                else
+                    SendData(0x55);
+            } 
+        }
+    }
+    TurnOnDisplay();
+}
+
+/******************************************************************************
+function :	Enter sleep mode
+parameter:
+******************************************************************************/
+void Epd::Sleep(void)
+{
+    // SendCommand(0x02); // POWER_OFF
+    // SendData(0X00);
+    // ReadBusyH();
+    
+    SendCommand(0x07); // DEEP_SLEEP
+    SendData(0XA5);
+}
+
+/* END OF FILE */
+
+

+ 74 - 0
Arduino/epd5in79g/epd5in79g.h

@@ -0,0 +1,74 @@
+/**
+ *  @filename   :   epd2in66g.h
+ *  @brief      :   Header file for e-paper display library epd4in37g.cpp
+ *  @author     :   Waveshare
+ *  
+ *  Copyright (C) Waveshare     2022/08/17
+ *
+ * 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 EPD2IN66G_H
+#define EPD2IN66G_H
+
+#include "epdif.h"
+
+// Display resolution
+#define EPD_WIDTH       792
+#define EPD_HEIGHT      272
+
+// Color
+#define  black   0x0
+#define  white   0x1
+#define  yellow  0x2
+#define  red     0x3
+
+#define UWORD   unsigned int
+#define UBYTE   unsigned char
+#define UDOUBLE unsigned long
+
+class Epd : EpdIf {
+public:
+    unsigned long WIDTH;
+    unsigned long HEIGHT;
+
+    Epd();
+    ~Epd();
+    int  Init();
+    void SendCommand(unsigned char command);
+    void SendData(unsigned char data);
+    void Reset(void);
+    void ReadBusyH(void);
+    void ReadBusyL(void);
+    void TurnOnDisplay(void);
+    void Clear(UBYTE color);
+    void Display(UBYTE *Image);
+    void Display_part(UBYTE *Image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_height);
+    void Sleep(void);
+
+private:
+    unsigned int reset_pin;
+    unsigned int dc_pin;
+    unsigned int cs_pin;
+    unsigned int busy_pin;
+};
+
+#endif /* EPD4IN37_H */
+
+/* END OF FILE */

+ 60 - 0
Arduino/epd5in79g/epd5in79g.ino

@@ -0,0 +1,60 @@
+/**
+ *  @filename   :   epd2in66g-demo.ino
+ *  @brief      :   2.66inch e-Paper (G) display demo
+ *  @author     :   Waveshare
+ *
+ *  Copyright (C) Waveshare     2022/08/17
+ *
+ * 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.
+ */
+
+#include <SPI.h>
+#include "epd5in79g.h"
+#include "imagedata.h"
+
+Epd epd;
+
+void setup() {
+  // put your setup code here, to run once:
+  Serial.begin(115200);
+  Serial.print("e-Paper init  \r\n");
+  if (epd.Init() != 0) {
+      Serial.print("e-Paper init failed");
+      return;
+  }
+
+  Serial.print("White \r\n");
+  epd.Clear(white);
+  delay(2000);
+
+  Serial.print("Small Image \r\n");
+  epd.Display_part(Image4color, 16, 16, 168, 168);
+  delay(2000);
+
+  Serial.print("Clear...\r\n");
+  epd.Clear(white);
+  delay(2000);
+
+  Serial.print("Goto Sleep...\r\n");
+  epd.Sleep();
+}
+
+void loop() {
+
+}

+ 68 - 0
Arduino/epd5in79g/epdif.cpp

@@ -0,0 +1,68 @@
+/**
+ *  @filename   :   epdif.cpp
+ *  @brief      :   Implements EPD interface functions
+ *                  Users have to implement all the functions in epdif.cpp
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare    2024/03/06
+ *
+ * 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.
+ */
+
+#include "epdif.h"
+#include <SPI.h>
+
+EpdIf::EpdIf() {
+};
+
+EpdIf::~EpdIf() {
+};
+
+void EpdIf::DigitalWrite(int pin, int value) {
+    digitalWrite(pin, value);
+}
+
+int EpdIf::DigitalRead(int pin) {
+    return digitalRead(pin);
+}
+
+void EpdIf::DelayMs(unsigned int delaytime) {
+    delay(delaytime);
+}
+
+void EpdIf::SpiTransfer(unsigned char data) {
+    digitalWrite(CS_PIN, LOW);
+    SPI.transfer(data);
+    digitalWrite(CS_PIN, HIGH);
+}
+
+int EpdIf::IfInit(void) {
+    pinMode(CS_PIN, OUTPUT);
+    pinMode(RST_PIN, OUTPUT);
+    pinMode(DC_PIN, OUTPUT);
+    pinMode(BUSY_PIN, INPUT); 
+
+    pinMode(PWR_PIN, OUTPUT);
+    DigitalWrite(PWR_PIN, 1);
+
+    SPI.begin();
+    SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
+    return 0;
+}
+

+ 52 - 0
Arduino/epd5in79g/epdif.h

@@ -0,0 +1,52 @@
+/**
+ *  @filename   :   epdif.h
+ *  @brief      :   Header file of epdif.cpp providing EPD interface functions
+ *                  Users have to implement all the functions in epdif.cpp
+ *  @author     :   Yehui from Waveshare
+ *
+ *  Copyright (C) Waveshare     2024/03/06
+ *
+ * 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 EPDIF_H
+#define EPDIF_H
+
+#include <Arduino.h>
+
+// Pin definition
+#define RST_PIN         8
+#define DC_PIN          9
+#define CS_PIN          10
+#define BUSY_PIN        7
+#define PWR_PIN         6
+
+class EpdIf {
+public:
+    EpdIf(void);
+    ~EpdIf(void);
+
+    static int  IfInit(void);
+    static void DigitalWrite(int pin, int value); 
+    static int  DigitalRead(int pin);
+    static void DelayMs(unsigned int delaytime);
+    static void SpiTransfer(unsigned char data);
+};
+
+#endif

+ 474 - 0
Arduino/epd5in79g/imagedata.cpp

@@ -0,0 +1,474 @@
+/**
+ *  @filename   :   imagedata.cpp
+ *  @brief      :   data file for epd demo
+ *
+ *  Copyright (C) Waveshare     2022/08/16
+ *
+ * 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.
+ */
+
+#include "imagedata.h"
+#include <avr/pgmspace.h>
+
+// 4 Color Image Data 168*168 
+const unsigned char Image4color[7056] PROGMEM = {
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,
+0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF5,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
+0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,
+0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,
+0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,
+0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,
+0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0x80,0x00,
+0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xFC,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,0x80,0x0A,0xAA,0x80,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3F,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0A,0xAA,0x80,0x0A,0xAA,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,
+0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,0x80,0x0A,0xAA,0xA0,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x02,0xAA,0x80,0x02,0x8A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x3F,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,
+0x80,0x00,0x02,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x80,0x00,0x0A,0xA8,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x2A,0x80,0x00,0x3A,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0F,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x7F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x2A,0x80,0x00,
+0x2A,0xA0,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFD,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0x00,0x00,0x00,
+0x01,0x50,0x00,0x00,0x00,0x00,0x00,0x2A,0x80,0x00,0xAA,0x80,0x00,0x00,0x00,0x00,
+0x15,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x57,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,
+0x00,0x2A,0x80,0x02,0xAA,0x00,0x00,0x00,0x00,0x00,0x55,0x50,0x00,0x00,0x00,0x3F,
+0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,
+0xF0,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x2A,0x80,0x0A,0xAB,0x00,
+0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF5,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x15,0x55,
+0x00,0x00,0x00,0x00,0x00,0x2A,0x80,0x2A,0xA8,0x00,0x00,0x00,0x00,0x01,0x55,0x50,
+0x00,0x00,0x00,0x03,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x2A,
+0x80,0x2A,0xAA,0xA8,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x3F,0xFF,
+0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xF0,0x00,0x00,
+0x00,0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,0x2A,0x80,0x2A,0xAA,0xA8,0x00,0x00,
+0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,
+0x00,0x00,0x00,0x2A,0x80,0x2A,0xAA,0xA8,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,
+0x00,0x00,0x0F,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,
+0xFF,0xC0,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,
+0xAA,0xA8,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xF5,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
+0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,
+0x54,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,
+0x00,0x3F,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xF0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x15,
+0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,
+0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x57,
+0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF5,0x55,0x55,0x55,
+0x55,0x55,0x55,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x50,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3F,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xF0,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,
+0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,
+0x55,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x03,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xD5,
+0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x5F,0xFF,
+0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x3F,0xFF,0xF5,0x55,0x55,0x55,0x55,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFD,0x55,0x55,
+0x55,0x55,0x7F,0xFF,0xF0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x04,0x00,0x00,0x0F,0xFF,0xFD,0x55,0x55,0x55,0x55,0x7F,0xFF,0xC0,0x00,
+0x01,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x03,
+0xFF,0xFD,0x55,0x55,0x55,0x55,0xFF,0xFF,0xC0,0x00,0x01,0x55,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x03,0xFF,0xFF,0x55,0x55,0x55,0x55,
+0xFF,0xFF,0x00,0x00,0x05,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x05,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,
+0x55,0x40,0x00,0x00,0xFF,0xFF,0x55,0x55,0x55,0x57,0xFF,0xFF,0x00,0x00,0x15,0x55,
+0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x50,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x55,0x50,0x00,0x00,0xFF,0xFF,
+0xD5,0x55,0x55,0x57,0xFF,0xFF,0x00,0x00,0x05,0x55,0x55,0x50,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x15,0x55,0x55,0x40,0x00,0x00,0xFF,0xFF,0xD5,0x55,0x55,0x5F,0xFF,0xFC,
+0x00,0x00,0x01,0x55,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x05,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x55,0x00,
+0x00,0x00,0x3F,0xFF,0xF5,0x55,0x55,0x5F,0xFF,0xFC,0x00,0x00,0x00,0x15,0x55,0x55,
+0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x55,0x50,0x00,0x00,0x00,0x3F,0xFF,0xF5,0x55,
+0x55,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x01,0x55,0x55,0x50,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,
+0x55,0x55,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x55,0x55,0x7F,0xFF,0xF0,0x00,0x00,
+0x00,0x00,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x54,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x54,0x00,0x00,0x00,0x00,
+0x0F,0xFF,0xFD,0x55,0x55,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x05,0x55,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x55,0x40,0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0x55,0x55,0x7F,
+0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x54,0x00,
+0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0x55,0x55,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,
+0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,
+0xFF,0x55,0x55,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x55,0xFF,0xFF,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xFF,0xFF,0x55,0x55,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,
+0x57,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xD5,0x57,0xFF,0xFC,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x55,
+0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x3F,0xFF,0xD5,0x57,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xD5,0x57,0xFF,
+0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x01,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xD5,0x5F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x55,0x50,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
+0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x35,0x55,0x55,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF5,
+0x55,0x55,0x5F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF5,0x55,0x55,0x5F,0xF0,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,
+0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3F,0xF5,0x55,0x55,0x5F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xD5,0x55,0x55,
+0x57,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xD5,0x55,0x55,0x57,0xFF,0xC0,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x7F,0xFF,
+0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0xFF,0xD5,0x55,0x55,0x57,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x00,0xAA,0x80,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xD5,0x55,0x55,0x57,0xFF,
+0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xA8,0x00,0x00,0x00,0x03,
+0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x02,0xAA,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x3F,0xFF,0x55,0x55,0x55,0x55,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x2A,0xAA,0x80,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,
+0x00,0x0A,0xAA,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x55,
+0x55,0x55,0x55,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,
+0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x0A,0xA0,0xA8,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFD,0x55,0x55,0x55,0x55,0x7F,0xFC,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,0xA0,0x00,0x00,0x03,0xFF,0xFD,
+0x7F,0xFF,0xC0,0x00,0x00,0x0A,0x80,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0xFF,0xFD,0x55,0x55,0x55,0x55,0x7F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x02,0x0A,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x0A,
+0x80,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF5,0x55,0x55,0x55,
+0x55,0x5F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xA0,0x00,
+0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x0A,0x80,0xAA,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0xFF,0xF5,0x55,0x55,0x55,0x55,0x5F,0xFF,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,
+0xC0,0x00,0x00,0x0A,0xA2,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
+0xF5,0x55,0x55,0x55,0x55,0x5F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x02,0xAA,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x0A,0xAA,0xAA,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF5,0x55,0x55,0x55,0x55,0x5F,
+0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0x80,0x00,0x00,0x03,
+0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x02,0xAA,0xAB,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xFF,0xF5,0x55,0x55,0x55,0x55,0x5B,0xFF,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x02,0xAA,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,
+0x00,0x00,0xAA,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF5,0x55,
+0x55,0x55,0x55,0x55,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,
+0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x02,0xA8,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x7F,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xA0,0x00,0x00,0x03,0xFF,0xFD,
+0x7F,0xFF,0xC0,0x00,0x00,0x00,0x0E,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x3F,0xFD,0x55,0x55,0x55,0x55,0x55,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x02,0x0A,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x00,
+0xAA,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF5,0x55,0x55,0x55,
+0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,0xA0,0x00,
+0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xC0,0x00,0x00,0x00,0xAA,0x80,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x3F,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xAA,0xA0,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,
+0xC0,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x2A,0xAA,0x80,0x00,0x00,0x03,0xFF,0xFD,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0x00,0x00,0x00,0x0F,
+0xFF,0xFD,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x15,0x55,0x57,0xD5,0x57,0xF5,0x55,0x55,0x55,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x5F,
+0xFF,0xFF,0xFF,0x55,0x55,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x55,0x7F,0xFF,0xFF,0xFF,0xF5,0x55,0x55,
+0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,
+0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x05,0x55,0x57,0xFF,0xFF,0xFF,0xFF,0xF1,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x53,0xFF,0xFF,0xFF,
+0xFF,0xC0,0x15,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0F,0xFF,0xF5,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x55,0x55,0x40,0x3F,0xFF,0xFF,0xFC,0x00,0x01,0x55,0x55,0x50,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x5F,0xFF,
+0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x54,
+0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x15,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xF5,0x57,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x01,0x55,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
+0xFF,0xD5,0x57,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x15,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x50,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xD5,0x57,0xFF,0xFC,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x54,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x3F,0xFF,0xD5,0x57,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x05,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xD5,
+0x55,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,
+0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x40,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x55,0xFF,0xFF,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0xFF,0xFF,0x55,0x55,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x05,0x54,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x55,0xFF,
+0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x05,0x55,0x40,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x40,0x01,0x54,0x00,
+0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x55,0x55,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,
+0x05,0x55,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x05,0x50,0x01,0x55,0x40,0x00,0x00,0x00,0x00,0x03,0xFF,
+0xFD,0x55,0x55,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x55,0x55,0x40,0x00,0x00,0x55,
+0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x54,0x05,0x55,0x54,0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0x55,0x55,0x7F,0xFF,0xF0,
+0x00,0x00,0x00,0x01,0x55,0x55,0x50,0x00,0x01,0x55,0x40,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x55,0x55,0x00,0x00,
+0x00,0x00,0x0F,0xFF,0xFD,0x55,0x55,0x5F,0xFF,0xF0,0x00,0x00,0x00,0x15,0x55,0x55,
+0x40,0x00,0x05,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x01,0x45,0x55,0x55,0x50,0x00,0x00,0x00,0x0F,0xFF,0xF5,0x55,
+0x55,0x5F,0xFF,0xFC,0x00,0x00,0x01,0x55,0x55,0x54,0x00,0x00,0x15,0x50,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+0x55,0x55,0x55,0x00,0x00,0x00,0x3F,0xFF,0xF5,0x55,0x55,0x5F,0xFF,0xFC,0x00,0x00,
+0x05,0x55,0x55,0x50,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x55,0x40,0x00,0x00,
+0x3F,0xFF,0xF5,0x55,0x55,0x57,0xFF,0xFF,0x00,0x00,0x15,0x55,0x55,0x00,0x00,0x01,
+0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x01,0x55,0x55,0x50,0x00,0x00,0xFF,0xFF,0xD5,0x55,0x55,0x57,
+0xFF,0xFF,0x00,0x00,0x05,0x55,0x50,0x00,0x00,0x15,0x50,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,
+0x55,0x40,0x00,0x00,0xFF,0xFF,0xD5,0x55,0x55,0x55,0xFF,0xFF,0x00,0x00,0x01,0x55,
+0x00,0x00,0x00,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0xFF,0xFF,
+0x55,0x55,0x55,0x55,0xFF,0xFF,0xC0,0x00,0x01,0x54,0x00,0x00,0x01,0x54,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x55,0x00,0x00,0x03,0xFF,0xFF,0x55,0x55,0x55,0x55,0x7F,0xFF,
+0xC0,0x00,0x00,0x40,0x00,0x00,0x05,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+0x00,0x03,0xFF,0xFD,0x55,0x55,0x55,0x55,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,
+0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFD,0x55,0x55,
+0x55,0x55,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFD,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFC,0x00,
+0x00,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
+0xFF,0xF5,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x05,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,
+0x57,0xFF,0xFF,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xC0,0x00,0x00,
+0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x55,
+0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xF0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,
+0xFF,0xF0,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0F,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFD,0x55,0x55,0x55,
+0x55,0x55,0x55,0x5F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x40,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x40,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
+0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,
+0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,
+0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0F,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFC,0x00,
+0x00,0x00,0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFD,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x55,
+0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x00,
+0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x5F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x00,
+0x02,0xA8,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,
+0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xF0,0x00,0x00,
+0x00,0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x2A,0xA8,0x00,0x00,0x00,0x00,
+0x00,0x05,0x55,0x40,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,
+0x00,0x00,0x00,0x00,0xAA,0xA8,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,
+0x00,0x00,0x0F,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,
+0xFF,0xFC,0x00,0x00,0x00,0x00,0x15,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA0,
+0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x50,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFD,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xC0,0x00,0x00,0x00,
+0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x55,0x54,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x5F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x15,0x54,0x00,0x00,0x00,0x00,
+0x00,0x02,0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x50,0x00,0x00,0x00,0x0F,
+0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,
+0xFC,0x00,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0xA8,0x00,0x00,
+0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xD5,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x40,
+0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+0x00,0x00,0x00,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x7F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0xAA,0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFD,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xF0,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0xAA,0x80,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0xA8,0x2A,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xA8,0x2A,
+0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xFC,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xA8,0xAA,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0xAA,0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,
+0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xAA,0xAA,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xFC,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x3F,0xFF,0xFF,0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0A,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xF5,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,
+0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,
+0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,
+0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,
+0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xF5,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFD,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
+0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,
+0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0xFF,
+0xFF,0xFF,0xFF,0xD5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+};
+
+

+ 30 - 0
Arduino/epd5in79g/imagedata.h

@@ -0,0 +1,30 @@
+/**
+ *  @filename   :   imagedata.h
+ *  @brief      :   head file for imagedata.cpp
+ *
+ *  Copyright (C) Waveshare     2022/08/16
+ *
+ * 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.
+ */
+
+extern const unsigned char Image4color[];
+
+/* FILE END */
+
+

+ 9 - 1
RaspberryPi_JetsonNano/c/Makefile

@@ -192,6 +192,9 @@ else ifeq ($(EPD), epd7in5bHD)
 else ifeq ($(EPD), epd10in2b)
 	OBJ_C_EPD = ${DIR_EPD}/EPD_10in2b.c
 	OBJ_C_Examples = ${DIR_Examples}/EPD_10in2b_test.c
+else ifeq ($(EPD), epd13in3b)
+	OBJ_C_EPD = ${DIR_EPD}/EPD_13in3b.c
+	OBJ_C_Examples = ${DIR_Examples}/EPD_13in3b_test.c
 else ifeq ($(EPD), epd13in3k)
 	OBJ_C_EPD = ${DIR_EPD}/EPD_13in3k.c
 	OBJ_C_Examples = ${DIR_Examples}/EPD_13in3k_test.c
@@ -219,7 +222,7 @@ ifeq ($(USELIB_RPI), USE_BCM2835_LIB)
 else ifeq ($(USELIB_RPI), USE_WIRINGPI_LIB)
 	LIB_RPI += -lwiringPi -lm 
 else ifeq ($(USELIB_RPI), USE_LGPIO_LIB)
-	LIB_RPI += -llgpio -lm 
+	LIB_RPI += -llgpio -lm
 else ifeq ($(USELIB_RPI), USE_DEV_LIB)
 	LIB_RPI += -lgpiod -lm 
 endif
@@ -267,9 +270,14 @@ ${DIR_BIN}/%.o:$(DIR_GUI)/%.c
 	$(CC) $(CFLAGS) -c	$< -o $@ -I $(DIR_Config) $(DEBUG)
 
 RPI_DEV:
+ifeq ($(USELIB_RPI), USE_DEV_LIB)
 	$(CC) $(CFLAGS) $(DEBUG_RPI) -c	 $(DIR_Config)/dev_hardware_SPI.c -o $(DIR_BIN)/dev_hardware_SPI.o $(LIB_RPI) $(DEBUG)
+	$(CC) $(CFLAGS) $(DEBUG_RPI) -c	 $(DIR_Config)/DEV_Config.c -o $(DIR_BIN)/DEV_Config.o $(LIB_RPI) $(DEBUG)
 	$(CC) $(CFLAGS) $(DEBUG_RPI) -c	 $(DIR_Config)/RPI_gpiod.c -o $(DIR_BIN)/RPI_gpiod.o $(LIB_RPI) $(DEBUG)
+else
+	$(CC) $(CFLAGS) $(DEBUG_RPI) -c	 $(DIR_Config)/dev_hardware_SPI.c -o $(DIR_BIN)/dev_hardware_SPI.o $(LIB_RPI) $(DEBUG)
 	$(CC) $(CFLAGS) $(DEBUG_RPI) -c	 $(DIR_Config)/DEV_Config.c -o $(DIR_BIN)/DEV_Config.o $(LIB_RPI) $(DEBUG)
+endif
 	
 JETSON_DEV:
 	$(CC) $(CFLAGS) $(DEBUG_JETSONI) -c	 $(DIR_Config)/sysfs_software_spi.c -o $(DIR_BIN)/sysfs_software_spi.o $(LIB_JETSONI) $(DEBUG)

+ 166 - 0
RaspberryPi_JetsonNano/c/examples/EPD_13in3b_test.c

@@ -0,0 +1,166 @@
+/*****************************************************************************
+* | File      	:   EPD_13IN3B_test.c
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B) test demo
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+#
+# 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.
+#
+******************************************************************************/
+#include "EPD_Test.h"
+#include "EPD_13in3b.h"
+#include <time.h> 
+
+int EPD_13in3b_test(void)
+{
+    printf("EPD_13IN3B_test Demo\r\n");
+    if(DEV_Module_Init()!=0){
+        return -1;
+    }
+
+    printf("e-Paper Init and Clear...\r\n");
+	EPD_13IN3B_Init();
+    EPD_13IN3B_Clear();
+
+
+    //Create a new image cache named IMAGE_BW and fill it with white
+    UBYTE *BlackImage, *RYImage; // Red or Yellow
+    UDOUBLE Imagesize = ((EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1)) * EPD_13IN3B_HEIGHT;
+    if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
+        printf("Failed to apply for black memory...\r\n");
+        return -1;
+    }
+    if((RYImage = (UBYTE *)malloc(Imagesize)) == NULL) {
+        printf("Failed to apply for red memory...\r\n");
+        return -1;
+    }
+    printf("NewImage:BlackImage and RYImage\r\n");
+    Paint_NewImage(BlackImage, EPD_13IN3B_WIDTH, EPD_13IN3B_HEIGHT, 0, WHITE);
+    Paint_NewImage(RYImage, EPD_13IN3B_WIDTH, EPD_13IN3B_HEIGHT, 0, WHITE);
+
+    //Select Image
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(WHITE);
+    Paint_SelectImage(RYImage);
+    Paint_Clear(WHITE);
+	
+#if 1   // show bmp
+    printf("show bmp------------------------\r\n");
+    Paint_SelectImage(BlackImage);
+    GUI_ReadBmp("./pic/13in3b_b.bmp", 0, 0);
+    Paint_SelectImage(RYImage);
+    GUI_ReadBmp("./pic/13in3b_r.bmp", 0, 0);
+    EPD_13IN3B_Display_Base(BlackImage, RYImage);
+    DEV_Delay_ms(3000);
+#endif
+
+#if 1  // Drawing on the image
+    /*Horizontal screen*/
+    //1.Draw black image
+    EPD_13IN3B_Init();
+    printf("Draw black image\r\n");
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(WHITE);
+    Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 110, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);      
+    Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);    
+    Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
+    Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
+    
+    //2.Draw red image
+    printf("Draw red image\r\n");
+    Paint_SelectImage(RYImage);
+    Paint_Clear(WHITE);
+    Paint_DrawCircle(160, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawCircle(210, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);  
+    Paint_DrawString_CN(130, 0,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
+    Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
+    Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
+
+    printf("EPD_Display\r\n");
+    EPD_13IN3B_Display_Base(BlackImage, RYImage);
+    DEV_Delay_ms(2000);
+#endif
+
+#if 1
+	printf("Partial refresh\r\n");
+    Paint_NewImage(BlackImage, Font20.Width * 7, Font20.Height, 0, WHITE);
+    Debug("Partial refresh\r\n");
+    Paint_SelectImage(BlackImage);
+    Paint_Clear(WHITE);
+	
+    PAINT_TIME sPaint_time;
+    sPaint_time.Hour = 12;
+    sPaint_time.Min = 34;
+    sPaint_time.Sec = 56;
+    UBYTE num = 10;
+    for (;;) {
+        sPaint_time.Sec = sPaint_time.Sec + 1;
+        if (sPaint_time.Sec == 60) {
+            sPaint_time.Min = sPaint_time.Min + 1;
+            sPaint_time.Sec = 0;
+            if (sPaint_time.Min == 60) {
+                sPaint_time.Hour =  sPaint_time.Hour + 1;
+                sPaint_time.Min = 0;
+                if (sPaint_time.Hour == 24) {
+                    sPaint_time.Hour = 0;
+                    sPaint_time.Min = 0;
+                    sPaint_time.Sec = 0;
+                }
+            }
+        }
+        Paint_ClearWindows(0, 0, Font20.Width * 7, Font20.Height, WHITE);
+        Paint_DrawTime(0, 0, &sPaint_time, &Font20, WHITE, BLACK);
+        num = num - 1;
+        if(num == 0) {
+            break;
+        }
+		EPD_13IN3B_Display_Partial(BlackImage, 10, 130, 10 + Font20.Width * 7, 130 + Font20.Height);
+		DEV_Delay_ms(500);//Analog clock 1s
+    }
+#endif
+
+	printf("Clear...\r\n");
+    EPD_13IN3B_Init();
+    EPD_13IN3B_Clear();
+	
+    printf("Goto Sleep...\r\n");
+    EPD_13IN3B_Sleep();
+    free(BlackImage);
+    free(RYImage);
+    BlackImage = NULL;
+    RYImage = NULL;
+    DEV_Delay_ms(2000);//important, at least 2s
+    // close 5V
+    printf("close 5V, Module enters 0 power consumption ...\r\n");
+    DEV_Module_Exit();
+    return 0;
+}

+ 91 - 4
RaspberryPi_JetsonNano/c/examples/EPD_13in3k_test.c

@@ -58,7 +58,7 @@ int EPD_13in3k_test(void)
     Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 0, WHITE);
 	Paint_Clear(WHITE);
 	
-#if 0   // show bmp
+#if 1   // show bmp
 	Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 0, WHITE);
     printf("show bmp------------------------\r\n");
     Paint_SelectImage(BlackImage);
@@ -85,7 +85,7 @@ int EPD_13in3k_test(void)
     DEV_Delay_ms(3000);
 #endif
 
-#if 1  //show image for array  
+#if 0  //show image for array  
     Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 0, WHITE);  
     printf("show image for array\r\n");
     Paint_SelectImage(BlackImage);
@@ -96,7 +96,7 @@ int EPD_13in3k_test(void)
     DEV_Delay_ms(3000);
 #endif
 
-#if 0  // Drawing on the image
+#if 1  // Drawing on the image
 	Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 0, WHITE);  	
     printf("Drawing\r\n");
     //1.Select Image
@@ -143,11 +143,98 @@ int EPD_13in3k_test(void)
     Paint_DrawLine(480, 480, 750, 270, BLACK, DOT_PIXEL_3X3, LINE_STYLE_DOTTED);
     Paint_DrawLine(750, 270, 200, 310, BLACK, DOT_PIXEL_3X3, LINE_STYLE_SOLID);	
 	
-    EPD_13IN3K_Display(BlackImage);
+    EPD_13IN3K_Display_Base(BlackImage);
+    DEV_Delay_ms(3000);
+#endif
+
+#if 1
+    printf("Partial refresh\r\n");
+    // If you didn't use the EPD_13IN3K_Display_Base() function to refresh the image before,
+    // use the EPD_13IN3K_color_Base() function to refresh the background color, 
+    // otherwise the background color will be garbled 
+    EPD_13IN3K_Init_Part();
+    // EPD_13IN3K_color_Base(WHITE);   
+	printf("Partial refresh\r\n");
+    Paint_NewImage(BlackImage, 200, 50, 0, WHITE);
+	PAINT_TIME sPaint_time;
+    sPaint_time.Hour = 12;
+    sPaint_time.Min = 34;
+    sPaint_time.Sec = 56;
+    UBYTE num = 10;
+	for (;;) {
+		sPaint_time.Sec = sPaint_time.Sec + 1;
+		if (sPaint_time.Sec == 60) {
+			sPaint_time.Min = sPaint_time.Min + 1;
+			sPaint_time.Sec = 0;
+			if (sPaint_time.Min == 60) {
+				sPaint_time.Hour =  sPaint_time.Hour + 1;
+				sPaint_time.Min = 0;
+				if (sPaint_time.Hour == 24) {
+					sPaint_time.Hour = 0;
+					sPaint_time.Min = 0;
+					sPaint_time.Sec = 0;
+				}
+			}
+		}
+		Paint_Clear(WHITE);
+		Paint_DrawTime(20, 10, &sPaint_time, &Font20, WHITE, BLACK);
+		EPD_13IN3K_Display_Part(BlackImage, 10, 150, 200, 50);
+		DEV_Delay_ms(500);//Analog clock 1s
+		num = num - 1;
+		if(num == 0) {
+			break;
+		}
+    }
+#endif
+
+#if 1 // show image for array
+    free(BlackImage);
+    printf("show Gray------------------------\r\n");
+    Imagesize = ((EPD_13IN3K_WIDTH % 4 == 0)? (EPD_13IN3K_WIDTH / 4 ): (EPD_13IN3K_WIDTH / 4 + 1)) * EPD_13IN3K_HEIGHT;
+    if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
+        printf("Failed to apply for black memory...\r\n");
+        return -1;
+    }
+    EPD_13IN3K_Init_4GRAY();
+    printf("4 grayscale display\r\n");
+    Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 90, WHITE);
+    Paint_SetScale(4);
+    Paint_Clear(0xff);
+    
+    Paint_DrawPoint(10, 80, GRAY4, DOT_PIXEL_1X1, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 90, GRAY4, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 100, GRAY4, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawLine(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawLine(70, 70, 20, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawRectangle(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawRectangle(80, 70, 130, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawCircle(45, 95, 20, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawCircle(105, 95, 20, GRAY2, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawLine(85, 95, 125, 95, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawLine(105, 75, 105, 115, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawString_EN(10, 0, "waveshare", &Font16, GRAY4, GRAY1);
+    Paint_DrawString_EN(10, 20, "hello world", &Font12, GRAY3, GRAY1);
+    Paint_DrawNum(10, 33, 123456789, &Font12, GRAY4, GRAY2);
+    Paint_DrawNum(10, 50, 987654321, &Font16, GRAY1, GRAY4);
+    Paint_DrawString_CN(150, 0,"ÄãºÃabc", &Font12CN, GRAY4, GRAY1);
+    Paint_DrawString_CN(150, 20,"ÄãºÃabc", &Font12CN, GRAY3, GRAY2);
+    Paint_DrawString_CN(150, 40,"ÄãºÃabc", &Font12CN, GRAY2, GRAY3);
+    Paint_DrawString_CN(150, 60,"ÄãºÃabc", &Font12CN, GRAY1, GRAY4);
+    Paint_DrawString_CN(10, 130, "΢ѩµç×Ó", &Font24CN, GRAY1, GRAY4);
+    EPD_13IN3K_4GrayDisplay(BlackImage);
     DEV_Delay_ms(3000);
+
+    Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT, 0, WHITE);
+    Paint_SetScale(4);
+    Paint_Clear(WHITE);
+    GUI_ReadBmp_4Gray("./pic/13in3k_Scale.bmp", 0, 0);
+    EPD_13IN3K_4GrayDisplay(BlackImage);
+    DEV_Delay_ms(3000);
+
 #endif
 
 	printf("Clear...\r\n");
+    EPD_13IN3K_Init();
     EPD_13IN3K_Clear();
 	
     printf("Goto Sleep...\r\n");

+ 1 - 0
RaspberryPi_JetsonNano/c/examples/EPD_Test.h

@@ -120,5 +120,6 @@ int EPD_7in5b_HD_test(void);
 
 int EPD_10in2b_test(void);
 
+int EPD_13in3b_test(void);
 int EPD_13in3k_test(void);
 #endif

+ 3 - 0
RaspberryPi_JetsonNano/c/examples/main.c

@@ -201,6 +201,9 @@ int main(void)
 #elif epd10in2b
     EPD_10in2b_test();
     
+#elif epd13in3b
+    EPD_13in3b_test();
+
 #elif epd13in3k
     EPD_13in3k_test();
 #else

+ 7 - 7
RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.c

@@ -423,13 +423,13 @@ void DEV_Module_Exit(void)
     DEV_Digital_Write(EPD_PWR_PIN, 0);
 	DEV_Digital_Write(EPD_DC_PIN, 0);
 	DEV_Digital_Write(EPD_RST_PIN, 0);
-#elif USE_DEV_LIB 
-    DEV_Digital_Write(EPD_CS_PIN, 0);
-    DEV_Digital_Write(EPD_PWR_PIN, 0);
-	DEV_Digital_Write(EPD_DC_PIN, 0);
-	DEV_Digital_Write(EPD_RST_PIN, 0);
-    lgSpiClose(SPI_Handle);
-    lgGpiochipClose(GPIO_Handle);
+#elif USE_LGPIO_LIB 
+    // DEV_Digital_Write(EPD_CS_PIN, 0);
+    // DEV_Digital_Write(EPD_PWR_PIN, 0);
+	// DEV_Digital_Write(EPD_DC_PIN, 0);
+	// DEV_Digital_Write(EPD_RST_PIN, 0);
+    // lgSpiClose(SPI_Handle);
+    // lgGpiochipClose(GPIO_Handle);
 #elif USE_DEV_LIB
 	DEV_HARDWARE_SPI_end();
 	DEV_Digital_Write(EPD_CS_PIN, 0);

+ 389 - 0
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3b.c

@@ -0,0 +1,389 @@
+/*****************************************************************************
+* | File      	:  	EPD_13in3b.c
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+* -----------------------------------------------------------------------------
+#
+# 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.
+#
+******************************************************************************/
+#include "EPD_13in3b.h"
+#include "Debug.h"
+
+/******************************************************************************
+function :	Software reset
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_Reset(void)
+{
+    DEV_Digital_Write(EPD_RST_PIN, 1);
+    DEV_Delay_ms(100);
+    DEV_Digital_Write(EPD_RST_PIN, 0);
+    DEV_Delay_ms(2);
+    DEV_Digital_Write(EPD_RST_PIN, 1);
+    DEV_Delay_ms(100);
+}
+
+/******************************************************************************
+function :	send command
+parameter:
+     Reg : Command register
+******************************************************************************/
+static void EPD_13IN3B_SendCommand(UBYTE Reg)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 0);
+    DEV_Digital_Write(EPD_CS_PIN, 0);
+    DEV_SPI_WriteByte(Reg);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	send data
+parameter:
+    Data : Write data
+******************************************************************************/
+static void EPD_13IN3B_SendData(UBYTE Data)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 1);
+    DEV_Digital_Write(EPD_CS_PIN, 0);
+    DEV_SPI_WriteByte(Data);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	Wait until the busy_pin goes LOW
+parameter:
+******************************************************************************/
+void EPD_13IN3B_ReadBusy(void)
+{
+    Debug("e-Paper busy\r\n");
+	while(1)
+	{	 //=1 BUSY
+		if(DEV_Digital_Read(EPD_BUSY_PIN)==0) 
+			break;
+		DEV_Delay_ms(20);
+	}
+	DEV_Delay_ms(20);
+    Debug("e-Paper busy release\r\n");
+}
+
+/******************************************************************************
+function :	Turn On Display
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_TurnOnDisplay(void)
+{
+	EPD_13IN3B_SendCommand(0x22); //Display Update Control
+	EPD_13IN3B_SendData(0xF7);
+	EPD_13IN3B_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3B_ReadBusy();
+}
+
+static void EPD_13IN3B_TurnOnDisplay_Part(void)
+{
+	EPD_13IN3B_SendCommand(0x22); //Display Update Control
+	EPD_13IN3B_SendData(0xFF);
+	EPD_13IN3B_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3B_ReadBusy();
+}
+
+/******************************************************************************
+function :	Setting the display window
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
+{
+    EPD_13IN3B_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendData(Xend & 0xFF);
+    EPD_13IN3B_SendData((Xend>>8) & 0x03);
+	
+    EPD_13IN3B_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
+    EPD_13IN3B_SendData(Ystart & 0xFF);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+    EPD_13IN3B_SendData(Yend & 0xFF);
+    EPD_13IN3B_SendData((Yend>>8) & 0x03);
+}
+
+/******************************************************************************
+function :	Set Cursor
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_SetCursor(UWORD Xstart, UWORD Ystart)
+{
+    EPD_13IN3B_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+
+    EPD_13IN3B_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
+    EPD_13IN3B_SendData(Ystart & 0xFF);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+}
+
+/******************************************************************************
+function :	Initialize the e-Paper register
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Init(void)
+{
+	EPD_13IN3B_Reset();
+	DEV_Delay_ms(100);
+
+	EPD_13IN3B_ReadBusy();   
+	EPD_13IN3B_SendCommand(0x12);
+	EPD_13IN3B_ReadBusy();   
+
+	EPD_13IN3B_SendCommand(0x0C);    
+	EPD_13IN3B_SendData(0xAE);
+	EPD_13IN3B_SendData(0xC7);
+	EPD_13IN3B_SendData(0xC3);
+	EPD_13IN3B_SendData(0xC0);
+	EPD_13IN3B_SendData(0x80);
+
+	EPD_13IN3B_SendCommand(0x01); 
+	EPD_13IN3B_SendData((EPD_13IN3B_HEIGHT-1)%256);
+	EPD_13IN3B_SendData((EPD_13IN3B_HEIGHT-1)/256);
+	EPD_13IN3B_SendData(0x00);
+
+	EPD_13IN3B_SendCommand(0x11);    
+	EPD_13IN3B_SendData(0x03); 
+
+	EPD_13IN3B_SetWindows(0, 0, EPD_13IN3B_WIDTH-1, EPD_13IN3B_HEIGHT-1);
+
+	EPD_13IN3B_SendCommand(0x3C); 
+	EPD_13IN3B_SendData(0x01);
+
+	EPD_13IN3B_SendCommand(0x18); 
+	EPD_13IN3B_SendData(0x80);
+
+    // EPD_13IN3B_SendCommand(0x22);  
+    // EPD_13IN3B_SendData(0xB1); 
+    // EPD_13IN3B_SendCommand(0x20); 
+	
+	EPD_13IN3B_SetCursor(0, 0);
+	
+	EPD_13IN3B_ReadBusy();
+}
+/******************************************************************************
+function :	Clear screen
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Clear(void)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3B_HEIGHT;
+	UWORD width = EPD_13IN3B_WIDTH/8;	
+	
+	EPD_13IN3B_SendCommand(0x24); 
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3B_SendData(0xff);
+	}
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+    
+	EPD_13IN3B_TurnOnDisplay();
+}
+
+void EPD_13IN3B_Clear_Black(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+void EPD_13IN3B_Clear_Red(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0xFF);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0xFF);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+/******************************************************************************
+function :	Sends the image buffer in RAM to e-Paper and displays
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+//Partial refresh of background display, this function is necessary, please do not delete it!!!
+void EPD_13IN3B_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+}
+
+//Partial refresh display
+void EPD_13IN3B_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
+{
+    if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend / 8;
+    }
+    else
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
+    }
+    
+
+    UDOUBLE i, Width;
+	Width = Xend -  Xstart;
+	UDOUBLE IMAGE_COUNTER = Width * (Yend-Ystart);
+    printf("IMAGE_COUNTER = %d\r\n", IMAGE_COUNTER);
+
+    Xstart = Xstart * 8;
+	Xend =Xend * 8 - 1;
+	Yend -= 1;	
+
+    EPD_13IN3B_SendCommand(0x3C);    
+    EPD_13IN3B_SendData(0x80);
+
+    EPD_13IN3B_SendCommand(0x44);
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendData(Xend & 0xFF);
+    EPD_13IN3B_SendData((Xend>>8) & 0x03);
+	
+    EPD_13IN3B_SendCommand(0x45);   
+    EPD_13IN3B_SendData(Ystart & 0xff);   
+    EPD_13IN3B_SendData((Ystart>>8) & 0x01);  
+    EPD_13IN3B_SendData(Yend & 0xff);
+    EPD_13IN3B_SendData((Yend>>8) & 0x03); 
+
+    EPD_13IN3B_SendCommand(0x4E); 
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendCommand(0x4F);   
+    EPD_13IN3B_SendData(Ystart & 0xff);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+
+    EPD_13IN3B_SendCommand(0x24); 
+    for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3B_SendData(Image[i]);
+	}
+
+	EPD_13IN3B_TurnOnDisplay_Part();
+
+    EPD_13IN3B_SendCommand(0x26); 
+    for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3B_SendData(Image[i]);
+	}
+
+}
+
+/******************************************************************************
+function :	Enter sleep mode
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Sleep(void)
+{
+	EPD_13IN3B_SendCommand(0x10); 
+	EPD_13IN3B_SendData(0x03); 
+	DEV_Delay_ms(100);
+}

+ 50 - 0
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3b.h

@@ -0,0 +1,50 @@
+/*****************************************************************************
+* | File      	:   EPD_13in3b.h
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+* -----------------------------------------------------------------------------
+#
+# 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 __EPD_13IN3B_B_H_
+#define __EPD_13IN3B_B_H_
+
+#include "DEV_Config.h"
+
+// Display resolution
+#define EPD_13IN3B_WIDTH       960
+#define EPD_13IN3B_HEIGHT      680
+
+void EPD_13IN3B_Init(void);
+void EPD_13IN3B_Clear(void);
+void EPD_13IN3B_Clear_Black(void);
+void EPD_13IN3B_Clear_Red(void);
+void EPD_13IN3B_Display(const UBYTE *blackimage, const UBYTE *ryimage);
+void EPD_13IN3B_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage);
+void EPD_13IN3B_Display_Base_White(void);
+void EPD_13IN3B_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
+void EPD_13IN3B_Sleep(void);
+
+#endif

+ 322 - 2
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3k.c

@@ -31,6 +31,49 @@
 #include "EPD_13in3k.h"
 #include "Debug.h"
 
+const unsigned char Lut_Partial[]={										
+0x15,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x2A,	0x88,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x15,	0x44,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x08,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x01,	0x01,	0x01,	0x00,						
+0x0A,	0x00,	0x05,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x01,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x18,						
+0x00,	0x00,									
+};	
+
+const unsigned char LUT_DATA_4Gray[112] =    //112bytes
+{											
+0x80,	0x48,	0x4A,	0x22,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x0A,	0x48,	0x68,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x88,	0x48,	0x60,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0xA8,	0x48,	0x45,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x07,	0x23,	0x17,	0x02,	0x00,						
+0x05,	0x01,	0x05,	0x01,	0x02,						
+0x08,	0x02,	0x01,	0x04,	0x04,						
+0x00,	0x02,	0x00,	0x02,	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,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x30,						
+0x00,	0x00,	
+};
+
 /******************************************************************************
 function :	Software reset
 parameter:
@@ -100,6 +143,42 @@ static void EPD_13IN3K_TurnOnDisplay(void)
 	EPD_13IN3K_ReadBusy();
 }
 
+static void EPD_13IN3K_TurnOnDisplay_Part(void)
+{
+	EPD_13IN3K_SendCommand(0x22); //Display Update Control
+	EPD_13IN3K_SendData(0xCF);
+	EPD_13IN3K_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3K_ReadBusy();
+}
+
+static void EPD_13IN3K_TurnOnDisplay_4GRAY(void)
+{
+	EPD_13IN3K_SendCommand(0x22); //Display Update Control
+	EPD_13IN3K_SendData(0xC7);
+	EPD_13IN3K_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3K_ReadBusy();
+}
+
+static void EPD_13IN3K_Lut(const UBYTE *LUT)
+{
+    unsigned int count;
+    EPD_13IN3K_SendCommand(0x32);
+    for(count = 0; count < 105 ; count++) {
+        EPD_13IN3K_SendData(LUT[count]);
+    }
+
+    EPD_13IN3K_SendCommand(0x03);
+	EPD_13IN3K_SendData(LUT[105]);
+
+	EPD_13IN3K_SendCommand(0x04);  
+	EPD_13IN3K_SendData(LUT[106]);
+	EPD_13IN3K_SendData(LUT[107]);
+	EPD_13IN3K_SendData(LUT[108]); 
+
+	EPD_13IN3K_SendCommand(0x2C);
+	EPD_13IN3K_SendData(LUT[109]);
+}
+
 /******************************************************************************
 function :	Setting the display window
 parameter:
@@ -134,6 +213,8 @@ static void EPD_13IN3K_SetCursor(UWORD Xstart, UWORD Ystart)
     EPD_13IN3K_SendData((Ystart>>8) & 0x03);
 }
 
+
+
 /******************************************************************************
 function :	Initialize the e-Paper register
 parameter:
@@ -179,6 +260,77 @@ void EPD_13IN3K_Init(void)
 	EPD_13IN3K_ReadBusy();
 }
 
+void EPD_13IN3K_Init_Part(void)
+{
+	EPD_13IN3K_Reset();
+	DEV_Delay_ms(100); 
+
+	EPD_13IN3K_SendCommand(0x3C);        // Border       Border setting 
+	EPD_13IN3K_SendData(0x80);
+
+    EPD_13IN3K_Lut(Lut_Partial);
+
+    EPD_13IN3K_SendCommand(0x37); 
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00); 
+    EPD_13IN3K_SendData(0x40);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);   
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+
+    EPD_13IN3K_SendCommand(0x3C); 
+    EPD_13IN3K_SendData(0x80);   
+
+    EPD_13IN3K_SendCommand(0x22); 
+    EPD_13IN3K_SendData(0xC0);   
+    EPD_13IN3K_SendCommand(0x20); 
+
+    EPD_13IN3K_ReadBusy();
+}
+
+void EPD_13IN3K_Init_4GRAY(void)
+{
+	EPD_13IN3K_Reset();
+	DEV_Delay_ms(100);
+
+	EPD_13IN3K_ReadBusy();   
+	EPD_13IN3K_SendCommand(0x12);  //SWRESET
+	EPD_13IN3K_ReadBusy();   
+
+	EPD_13IN3K_SendCommand(0x0C); //set soft start     
+	EPD_13IN3K_SendData(0xAE);
+	EPD_13IN3K_SendData(0xC7);
+	EPD_13IN3K_SendData(0xC3);
+	EPD_13IN3K_SendData(0xC0);
+	EPD_13IN3K_SendData(0x80);
+
+	EPD_13IN3K_SendCommand(0x01);   //      drive output control    
+	EPD_13IN3K_SendData((EPD_13IN3K_HEIGHT-1)%256); //  Y  
+	EPD_13IN3K_SendData((EPD_13IN3K_HEIGHT-1)/256); //  Y 
+	EPD_13IN3K_SendData(0x00);
+
+	EPD_13IN3K_SendCommand(0x11);        //    data  entry  mode
+	EPD_13IN3K_SendData(0x03);           //       X-mode  x+ y-    
+
+	EPD_13IN3K_SetWindows(0, 0, EPD_13IN3K_WIDTH-1, EPD_13IN3K_HEIGHT-1);
+
+	EPD_13IN3K_SendCommand(0x3C);        // Border       Border setting 
+	EPD_13IN3K_SendData(0x00);
+
+	EPD_13IN3K_SendCommand(0x18); // use the internal temperature sensor
+	EPD_13IN3K_SendData(0x80);
+	
+	EPD_13IN3K_SetCursor(0, 0);
+
+    EPD_13IN3K_Lut(LUT_DATA_4Gray);
+	
+	EPD_13IN3K_ReadBusy();
+}
+
 /******************************************************************************
 function :	Clear screen
 parameter:
@@ -189,7 +341,7 @@ void EPD_13IN3K_Clear(void)
 	UWORD height = EPD_13IN3K_HEIGHT;
 	UWORD width = EPD_13IN3K_WIDTH/8;	
 	
-	EPD_13IN3K_SendCommand(0x24);   //write RAM for black(0)/white (1)
+	EPD_13IN3K_SendCommand(0x24);
 	for(i=0; i<height; i++)
 	{
 		for(j=0; j<width; j++)
@@ -198,6 +350,28 @@ void EPD_13IN3K_Clear(void)
 	EPD_13IN3K_TurnOnDisplay();
 }
 
+void EPD_13IN3K_color_Base(UBYTE color)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;	
+	
+	EPD_13IN3K_SendCommand(0x24);
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(color);
+	}
+
+    EPD_13IN3K_SendCommand(0x26);
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(color);
+	}
+	EPD_13IN3K_TurnOnDisplay();
+}
+
 /******************************************************************************
 function :	Sends the image buffer in RAM to e-Paper and displays
 parameter:
@@ -217,6 +391,152 @@ void EPD_13IN3K_Display(UBYTE *Image)
 	EPD_13IN3K_TurnOnDisplay();	
 }
 
+void EPD_13IN3K_Display_Base(UBYTE *Image)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;
+	
+	EPD_13IN3K_SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(Image[j + i*width]);
+	}
+
+    EPD_13IN3K_SendCommand(0x26);   //write RAM for black(0)/white (1)
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(Image[j + i*width]);
+	}
+	EPD_13IN3K_TurnOnDisplay();	
+}
+
+void EPD_13IN3K_Display_Part(UBYTE *Image, UWORD x, UWORD y, UWORD w, UWORD l)
+{
+	UWORD Ystart = y;
+	UWORD Yend =  y + l;
+    UWORD Xstart = x;
+    UWORD Xend = x + w;
+
+
+    if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend / 8;
+    }
+    else
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
+    }
+
+    UWORD i, Width;
+	Width = Xend -  Xstart;
+	UWORD IMAGE_COUNTER = Width * (Yend-Ystart);
+
+    Xend -= 1;
+	Yend -= 1;	
+
+	EPD_13IN3K_SetWindows(Xstart*8, y, Xend*8, y+l-1);
+
+	EPD_13IN3K_SetCursor(Xstart*8, y);
+
+	EPD_13IN3K_SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3K_SendData(Image[i]);
+	}
+
+	EPD_13IN3K_TurnOnDisplay_Part();	
+}
+
+void EPD_13IN3K_4GrayDisplay(UBYTE *Image)
+{
+    UDOUBLE i,j,k;
+    UBYTE temp1,temp2,temp3;
+    UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;
+
+    // old  data
+    EPD_13IN3K_SendCommand(0x24);
+    for(i=0; i<height*width; i++) {            
+        temp3=0;
+        for(j=0; j<2; j++) {
+            temp1 = Image[i*2+j];
+            for(k=0; k<2; k++) {
+                temp2 = temp1&0xC0;
+                if(temp2 == 0xC0)
+                    temp3 |= 0x00;
+                else if(temp2 == 0x00)
+                    temp3 |= 0x01; 
+                else if(temp2 == 0x80)
+                    temp3 |= 0x01; 
+                else //0x40
+                    temp3 |= 0x00; 
+                temp3 <<= 1;
+
+                temp1 <<= 2;
+                temp2 = temp1&0xC0 ;
+                if(temp2 == 0xC0) 
+                    temp3 |= 0x00;
+                else if(temp2 == 0x00) 
+                    temp3 |= 0x01;
+                else if(temp2 == 0x80)
+                    temp3 |= 0x01; 
+                else    //0x40
+                    temp3 |= 0x00;	
+                if(j!=1 || k!=1)
+                    temp3 <<= 1;
+
+                temp1 <<= 2;
+            }
+
+        }
+        EPD_13IN3K_SendData(temp3);
+        // printf("%x",temp3);
+    }
+
+    EPD_13IN3K_SendCommand(0x26);   //write RAM for black(0)/white (1)
+    for(i=0; i<height*width; i++) {        
+        temp3=0;
+        for(j=0; j<2; j++) {
+            temp1 = Image[i*2+j];
+            for(k=0; k<2; k++) {
+                temp2 = temp1&0xC0 ;
+                if(temp2 == 0xC0)
+                    temp3 |= 0x00;//white
+                else if(temp2 == 0x00)
+                    temp3 |= 0x01;  //black
+                else if(temp2 == 0x80)
+                    temp3 |= 0x00;  //gray1
+                else //0x40
+                    temp3 |= 0x01; //gray2
+                temp3 <<= 1;
+
+                temp1 <<= 2;
+                temp2 = temp1&0xC0 ;
+                if(temp2 == 0xC0)  //white
+                    temp3 |= 0x00;
+                else if(temp2 == 0x00) //black
+                    temp3 |= 0x01;
+                else if(temp2 == 0x80)
+                    temp3 |= 0x00; //gray1
+                else    //0x40
+                    temp3 |= 0x01;	//gray2
+                if(j!=1 || k!=1)
+                    temp3 <<= 1;
+
+                temp1 <<= 2;
+            }
+        }
+        EPD_13IN3K_SendData(temp3);
+        // printf("%x",temp3);
+    }
+
+    EPD_13IN3K_TurnOnDisplay_4GRAY();
+}
+
 /******************************************************************************
 function :	Enter sleep mode
 parameter:
@@ -224,6 +544,6 @@ parameter:
 void EPD_13IN3K_Sleep(void)
 {
 	EPD_13IN3K_SendCommand(0x10); //enter deep sleep
-	EPD_13IN3K_SendData(0x01); 
+	EPD_13IN3K_SendData(0x03); 
 	DEV_Delay_ms(100);
 }

+ 6 - 0
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_13in3k.h

@@ -38,8 +38,14 @@
 #define EPD_13IN3K_HEIGHT      680
 
 void EPD_13IN3K_Init(void);
+void EPD_13IN3K_Init_Part(void);
+void EPD_13IN3K_Init_4GRAY(void);
 void EPD_13IN3K_Clear(void);
+void EPD_13IN3K_color_Base(UBYTE color);
 void EPD_13IN3K_Display(UBYTE *Image);
+void EPD_13IN3K_Display_Base(UBYTE *Image);
+void EPD_13IN3K_Display_Part(UBYTE *Image, UWORD x, UWORD y, UWORD w, UWORD l);
+void EPD_13IN3K_4GrayDisplay(UBYTE *Image);
 void EPD_13IN3K_Sleep(void);
 
 #endif

+ 1 - 1
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in26.c

@@ -536,6 +536,6 @@ parameter:
 void EPD_4in26_Sleep(void)
 {
 	EPD_4in26_SendCommand(0x10); //enter deep sleep
-	EPD_4in26_SendData(0x01); 
+	EPD_4in26_SendData(0x03); 
 	DEV_Delay_ms(100);
 }

BIN=BIN
RaspberryPi_JetsonNano/c/pic/13in3b_b.bmp


BIN=BIN
RaspberryPi_JetsonNano/c/pic/13in3b_r.bmp


BIN=BIN
RaspberryPi_JetsonNano/c/pic/13in3k_Scale.bmp


+ 88 - 0
RaspberryPi_JetsonNano/python/examples/epd_13in3b_test.py

@@ -0,0 +1,88 @@
+#!/usr/bin/python
+# -*- coding:utf-8 -*-
+import sys
+import os
+picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
+libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
+if os.path.exists(libdir):
+    sys.path.append(libdir)
+
+import logging
+from waveshare_epd import epd13in3b
+import time
+from PIL import Image,ImageDraw,ImageFont
+import traceback
+
+logging.basicConfig(level=logging.DEBUG)
+
+try:
+    logging.info("epd13in3k Demo")
+    epd = epd13in3b.EPD()
+    
+    logging.info("init and Clear")
+    epd.init()
+    epd.Clear()
+
+    font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
+    font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
+    font35 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 35)
+
+    logging.info("2.read bmp file")
+    HBlackimage = Image.open(os.path.join(picdir, '13in3b_r.bmp')) 
+    HRedimage = Image.open(os.path.join(picdir, '13in3b_b.bmp'))
+    epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage))
+    time.sleep(2)
+
+    # Drawing on the Horizontal image
+    logging.info("3.Drawing on the Horizontal image...")
+    HBlackimage = Image.new('1', (epd.width, epd.height), 255)  
+    HRedimage = Image.new('1', (epd.width, epd.height), 255) 
+    drawblack = ImageDraw.Draw(HBlackimage)
+    drawred = ImageDraw.Draw(HRedimage)
+    drawblack.text((10, 0), 'hello world', font = font24, fill = 0)
+    drawred.text((10, 20), '13.3inch e-Paper (B)', font = font24, fill = 0)
+    drawblack.text((150, 0), u'微雪电子', font = font24, fill = 0)
+    drawred.line((20, 50, 70, 100), fill = 0)
+    drawblack.line((70, 50, 20, 100), fill = 0)
+    drawred.rectangle((20, 50, 70, 100), outline = 0)
+    drawblack.line((165, 50, 165, 100), fill = 0)
+    drawred.line((140, 75, 190, 75), fill = 0)
+    drawblack.arc((140, 50, 190, 100), 0, 360, fill = 0)
+    drawred.rectangle((80, 50, 130, 100), fill = 0)
+    drawblack.chord((200, 50, 250, 100), 0, 360, fill = 0)
+    epd.display_Base(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage))
+    time.sleep(2)
+
+    # partial update
+    logging.info("4.show time")
+    '''
+    # If you didn't use the epd.display_Base() function to refresh the image before,
+    # use the epd.Clear_Base() function to refresh the background color, 
+    # otherwise the background color will be garbled 
+    '''
+    # epd.Clear_Base()
+    # Himage = Image.new('1', (epd.height ,epd.width), 0xff)
+    # draw = ImageDraw.Draw(time_image)
+    num = 0
+    while (True):
+        drawblack.rectangle((0, 110, 120, 150), fill = 255)
+        drawblack.text((10, 120), time.strftime('%H:%M:%S'), font = font24, fill = 0)
+        epd.display_Partial(epd.getbuffer(HBlackimage),0, 110, 120, 160)
+        num = num + 1
+        if(num == 10):
+            break
+
+    logging.info("Clear...")
+    epd.init()
+    epd.Clear()
+
+    logging.info("Goto Sleep...")
+    epd.sleep()
+    
+except IOError as e:
+    logging.info(e)
+    
+except KeyboardInterrupt:    
+    logging.info("ctrl + c:")
+    epd13in3b.epdconfig.module_exit(cleanup=True)
+    exit()

+ 66 - 25
RaspberryPi_JetsonNano/python/examples/epd_13in3k_test.py

@@ -25,27 +25,10 @@ try:
 
     font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
     font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
-
-    # Drawing on the Horizontal image
-    logging.info("1.Drawing on the Horizontal image...")
-    Himage = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
-    draw = ImageDraw.Draw(Himage)
-    draw.text((10, 0), 'hello world', font = font24, fill = 0)
-    draw.text((10, 20), '13.3inch e-Paper (K)', font = font24, fill = 0)
-    draw.text((150, 0), u'微雪电子', font = font24, fill = 0)
-    draw.line((20, 50, 70, 100), fill = 0)
-    draw.line((70, 50, 20, 100), fill = 0)
-    draw.rectangle((20, 50, 70, 100), outline = 0)
-    draw.line((165, 50, 165, 100), fill = 0)
-    draw.line((140, 75, 190, 75), fill = 0)
-    draw.arc((140, 50, 190, 100), 0, 360, fill = 0)
-    draw.rectangle((80, 50, 130, 100), fill = 0)
-    draw.chord((200, 50, 250, 100), 0, 360, fill = 0)
-    epd.display(epd.getbuffer(Himage))
-    time.sleep(2)
+    font35 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 35)
 
     # Drawing on the Vertical image
-    logging.info("2.Drawing on the Vertical image...")
+    logging.info("1.Drawing on the Vertical image...")
     Limage = Image.new('1', (epd.height, epd.width), 255)  # 255: clear the frame
     draw = ImageDraw.Draw(Limage)
     draw.text((2, 0), 'hello world', font = font18, fill = 0)
@@ -62,18 +45,76 @@ try:
     epd.display(epd.getbuffer(Limage))
     time.sleep(2)
 
-    logging.info("3.read bmp file")
+    logging.info("2.read bmp file")
     Himage = Image.open(os.path.join(picdir, '13in3.bmp'))
     epd.display(epd.getbuffer(Himage))
     time.sleep(2)
 
-    logging.info("4.read bmp file on window")
-    Himage2 = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
-    bmp = Image.open(os.path.join(picdir, '100x100.bmp'))
-    Himage2.paste(bmp, (50,10))
-    epd.display(epd.getbuffer(Himage2))
+    # Drawing on the Horizontal image
+    logging.info("3.Drawing on the Horizontal image...")
+    Himage = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
+    draw = ImageDraw.Draw(Himage)
+    draw.text((10, 0), 'hello world', font = font24, fill = 0)
+    draw.text((10, 20), '13.3inch e-Paper (K)', font = font24, fill = 0)
+    draw.text((150, 0), u'微雪电子', font = font24, fill = 0)
+    draw.line((20, 50, 70, 100), fill = 0)
+    draw.line((70, 50, 20, 100), fill = 0)
+    draw.rectangle((20, 50, 70, 100), outline = 0)
+    draw.line((165, 50, 165, 100), fill = 0)
+    draw.line((140, 75, 190, 75), fill = 0)
+    draw.arc((140, 50, 190, 100), 0, 360, fill = 0)
+    draw.rectangle((80, 50, 130, 100), fill = 0)
+    draw.chord((200, 50, 250, 100), 0, 360, fill = 0)
+    epd.display_Base(epd.getbuffer(Himage))
     time.sleep(2)
 
+    # partial update
+    logging.info("4.show time")
+    epd.init_Part()
+    '''
+    # If you didn't use the epd.display_Base() function to refresh the image before,
+    # use the epd.display_Base_color() function to refresh the background color, 
+    # otherwise the background color will be garbled 
+    '''
+    # epd.display_Base_color(0xff)
+    # Himage = Image.new('1', (epd.height ,epd.width), 0xff)
+    # draw = ImageDraw.Draw(time_image)
+    num = 0
+    while (True):
+        draw.rectangle((0, 110, 120, 150), fill = 255)
+        draw.text((10, 120), time.strftime('%H:%M:%S'), font = font24, fill = 0)
+        epd.display_Partial(epd.getbuffer(Himage),0, 110, 120, 160)
+        num = num + 1
+        if(num == 10):
+            break
+
+    '''4Gray display'''
+    logging.info("4Gray display--------------------------------")
+    epd.init_4GRAY()
+    
+    Limage = Image.new('L', (epd.width, epd.height), 255)  # 255: clear the frame
+    draw = ImageDraw.Draw(Limage)
+    draw.text((20, 0), u'微雪电子', font = font35, fill = epd.GRAY2)
+    draw.text((20, 35), u'微雪电子', font = font35, fill = epd.GRAY3)
+    draw.text((20, 70), u'微雪电子', font = font35, fill = epd.GRAY4)
+    draw.text((40, 110), 'hello world', font = font18, fill = epd.GRAY4)
+    draw.line((10, 140, 60, 190), fill = epd.GRAY4)
+    draw.line((60, 140, 10, 190), fill = epd.GRAY4)
+    draw.rectangle((10, 140, 60, 190), outline = epd.GRAY4)
+    draw.line((95, 140, 95, 190), fill = epd.GRAY4)
+    draw.line((70, 165, 120, 165), fill = epd.GRAY4)
+    draw.arc((70, 140, 120, 190), 0, 360, fill = epd.GRAY4)
+    draw.rectangle((10, 200, 60, 250), fill = epd.GRAY4)
+    draw.chord((70, 200, 120, 250), 0, 360, fill = epd.GRAY4)
+    epd.display_4Gray(epd.getbuffer_4Gray(Limage))
+    time.sleep(2)
+    
+    #display 4Gra bmp
+    Himage = Image.open(os.path.join(picdir, '13in3k_Scale.bmp'))
+    epd.display_4Gray(epd.getbuffer_4Gray(Himage))
+    time.sleep(2)
+
+
     logging.info("Clear...")
     epd.init()
     epd.Clear()

BIN=BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/__init__.cpython-37.pyc


BIN=BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd13in3k.cpython-37.pyc


BIN=BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-37.pyc


+ 299 - 0
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd13in3b.py

@@ -0,0 +1,299 @@
+# *****************************************************************************
+# * | File        :	  epd13in3b.py
+# * | Author      :   Waveshare team
+# * | Function    :   Electronic paper driver
+# * | Info        :
+# *----------------
+# * | This version:   V1.0
+# * | Date        :   2024-04-08
+# # | Info        :   python demo
+# -----------------------------------------------------------------------------
+# 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.
+#
+
+
+import logging
+from . import epdconfig
+
+# Display resolution
+EPD_WIDTH       = 960
+EPD_HEIGHT      = 680
+
+GRAY1  = 0xff #white
+GRAY2  = 0xC0
+GRAY3  = 0x80 #gray
+GRAY4  = 0x00 #Blackest
+
+logger = logging.getLogger(__name__)
+
+class EPD:
+    def __init__(self):
+        self.reset_pin = epdconfig.RST_PIN
+        self.dc_pin = epdconfig.DC_PIN
+        self.busy_pin = epdconfig.BUSY_PIN
+        self.cs_pin = epdconfig.CS_PIN
+        self.width = EPD_WIDTH
+        self.height = EPD_HEIGHT
+        if (epdconfig.module_init() != 0):
+            return -1
+    
+    # Hardware reset
+    def reset(self):
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(20) 
+        epdconfig.digital_write(self.reset_pin, 0)
+        epdconfig.delay_ms(2)
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(20)   
+
+    def send_command(self, command):
+        epdconfig.digital_write(self.dc_pin, 0)
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.spi_writebyte([command])
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def send_data(self, data):
+        epdconfig.digital_write(self.dc_pin, 1)
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.spi_writebyte([data])
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def send_data2(self, data):
+        epdconfig.digital_write(self.dc_pin, 1)
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.SPI.writebytes2(data)
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def ReadBusy(self):
+        logger.debug("e-Paper busy")
+        busy = epdconfig.digital_read(self.busy_pin)
+        while(busy == 1):
+            busy = epdconfig.digital_read(self.busy_pin)
+            epdconfig.delay_ms(20)
+        epdconfig.delay_ms(20)
+        logger.debug("e-Paper busy release")
+
+    def TurnOnDisplay(self):
+        self.send_command(0x22) #Display Update Control
+        self.send_data(0xF7)
+        self.send_command(0x20) #Activate Display Update Sequence
+        self.ReadBusy()
+
+    def TurnOnDisplay_Part(self):
+        self.send_command(0x22) #Display Update Control
+        self.send_data(0xFF)
+        self.send_command(0x20) #Activate Display Update Sequence
+        self.ReadBusy()
+        
+    def init(self):
+        # EPD hardware init start
+        self.reset()
+        self.ReadBusy()
+
+        self.send_command(0x12) #SWRESET
+        self.ReadBusy()
+
+        self.send_command(0x0C) 
+        self.send_data(0xAE)
+        self.send_data(0xC7)  
+        self.send_data(0xC3)
+        self.send_data(0xC0)
+        self.send_data(0x80)
+
+        self.send_command(0x01) 
+        self.send_data(0xA7)
+        self.send_data(0x02)  
+        self.send_data(0x00)
+
+        self.send_command(0x11) 
+        self.send_data(0x03)
+
+        self.send_command(0x44) 
+        self.send_data(0x00)
+        self.send_data(0x00)  
+        self.send_data(0xBF)
+        self.send_data(0x03) 
+        
+        self.send_command(0x45) 
+        self.send_data(0x00)
+        self.send_data(0x00)  
+        self.send_data(0xA7)
+        self.send_data(0x02)
+
+        self.send_command(0x3C)
+        self.send_data(0x01)
+
+        self.send_command(0x18) 
+        self.send_data(0x80)
+
+        self.send_command(0x4E) 
+        self.send_data(0x00)
+        self.send_data(0x00)
+
+        self.send_command(0x4F) 
+        self.send_data(0x00)
+        self.send_data(0x00) 
+        self.ReadBusy()
+
+        # EPD hardware init end
+        return 0
+
+
+    def getbuffer(self, image):
+        # logger.debug("bufsiz = ",int(self.width/8) * self.height)
+        buf = [0xFF] * (int(self.width / 8) * self.height)
+        image_monocolor = image.convert('1')
+        imwidth, imheight = image_monocolor.size
+        pixels = image_monocolor.load()
+        # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
+        if imwidth == self.width and imheight == self.height:
+            logger.debug("Horizontal")
+            for y in range(imheight):
+                for x in range(imwidth):
+                    # Set the bits for the column of pixels at the current position.
+                    if pixels[x, y] == 0:
+                        buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
+        elif imwidth == self.height and imheight == self.width:
+            logger.debug("Vertical")
+            for y in range(imheight):
+                for x in range(imwidth):
+                    newx = y
+                    newy = self.height - x - 1
+                    if pixels[x, y] == 0:
+                        buf[int((newx + newy * self.width) / 8)] &= ~(0x80 >> (y % 8))
+        return buf
+
+    def Clear(self):
+        self.send_command(0x24)
+        self.send_data2([0xFF] * (int(self.width/8) * self.height))
+        self.send_command(0x26)
+        self.send_data2([0x00] * (int(self.width/8) * self.height))
+
+        self.TurnOnDisplay()
+
+    def Clear_Base(self):
+        self.send_command(0x24)
+        self.send_data2([0xFF] * (int(self.width/8) * self.height))
+        self.send_command(0x26)
+        self.send_data2([0x00] * (int(self.width/8) * self.height))
+
+        self.TurnOnDisplay()
+        self.send_command(0x26)
+        self.send_data2([0xFF] * (int(self.width/8) * self.height))
+    
+    def display(self, blackimage, ryimage):
+        if(self.width % 8 == 0):
+            Width = self.width // 8
+        else:
+            Width = self.width // 8 +1
+        Height = self.height
+        if (blackimage != None):
+            self.send_command(0x24)
+            self.send_data2(blackimage)        
+        if (ryimage != None):
+            for j in range(Height):
+                for i in range(Width):
+                    ryimage[i + j * Width] = ~ryimage[i + j * Width]
+            self.send_command(0x26)
+            self.send_data2(ryimage)
+
+        self.TurnOnDisplay()
+
+    def display_Base(self, blackimage, ryimage):
+        if(self.width % 8 == 0):
+            Width = self.width // 8
+        else:
+            Width = self.width // 8 +1
+        Height = self.height
+        if (blackimage != None):
+            self.send_command(0x24)
+            self.send_data2(blackimage)        
+        if (ryimage != None):
+            for j in range(Height):
+                for i in range(Width):
+                    ryimage[i + j * Width] = ~ryimage[i + j * Width]
+            self.send_command(0x26)
+            self.send_data2(ryimage)
+
+        self.TurnOnDisplay()
+
+        self.send_command(0x26)
+        self.send_data2(blackimage)
+
+    def display_Partial(self, Image, Xstart, Ystart, Xend, Yend):
+        if((Xstart % 8 + Xend % 8 == 8 & Xstart % 8 > Xend % 8) | Xstart % 8 + Xend % 8 == 0 | (Xend - Xstart)%8 == 0):
+            Xstart = Xstart // 8
+            Xend = Xend // 8
+        else:
+            Xstart = Xstart // 8 
+            if Xend % 8 == 0:
+                Xend = Xend // 8
+            else:
+                Xend = Xend // 8 + 1
+                
+        if(self.width % 8 == 0):
+            Width = self.width // 8
+        else:
+            Width = self.width // 8 +1
+        Height = self.height
+
+        Xend -= 1
+        Yend -= 1
+
+        self.send_command(0x3C) 
+        self.send_data(0x80)
+	
+        self.send_command(0x44) 
+        self.send_data((Xstart*8) & 0xff) 
+        self.send_data((Xstart>>5) & 0x01) 
+        self.send_data((Xend*8) & 0xff)  
+        self.send_data((Xend>>5) & 0x01) 
+        self.send_command(0x45)   
+        self.send_data(Ystart & 0xff) 
+        self.send_data((Ystart>>8) & 0x01)  
+        self.send_data(Yend & 0xff) 
+        self.send_data((Yend>>8) & 0x01)   
+
+        self.send_command(0x4E) 
+        self.send_data((Xstart*8) & 0xff)
+        self.send_data((Xstart>>5) & 0x01)  
+        self.send_command(0x4F) 
+        self.send_data(Ystart & 0xff)
+        self.send_data((Ystart>>8) & 0x01)
+
+        self.send_command(0x24) 
+        for j in range(Height):
+            for i in range(Width):
+                if((j > Ystart-1) & (j < (Yend + 1)) & (i > Xstart-1) & (i < (Xend + 1))):
+                    self.send_data(Image[i + j * Width])
+        self.TurnOnDisplay_Part()
+
+        self.send_command(0x26) 
+        for j in range(Height):
+            for i in range(Width):
+                if((j > Ystart-1) & (j < (Yend + 1)) & (i > Xstart-1) & (i < (Xend + 1))):
+                    self.send_data(Image[i + j * Width])
+
+    def sleep(self):
+        self.send_command(0x10) # DEEP_SLEEP
+        self.send_data(0x03)
+        
+        epdconfig.delay_ms(2000)
+        epdconfig.module_exit()
+### END OF FILE ###

+ 349 - 13
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd13in3k.py

@@ -1,11 +1,11 @@
 # *****************************************************************************
-# * | File        :	  epd7in5.py
+# * | File        :	  epd13in3k.py
 # * | Author      :   Waveshare team
 # * | Function    :   Electronic paper driver
 # * | Info        :
 # *----------------
-# * | This version:   V4.0
-# * | Date        :   2019-06-20
+# * | This version:   V1.0
+# * | Date        :   2023-09-08
 # # | Info        :   python demo
 # -----------------------------------------------------------------------------
 # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -35,6 +35,11 @@ from . import epdconfig
 EPD_WIDTH       = 960
 EPD_HEIGHT      = 680
 
+GRAY1  = 0xff #white
+GRAY2  = 0xC0
+GRAY3  = 0x80 #gray
+GRAY4  = 0x00 #Blackest
+
 logger = logging.getLogger(__name__)
 
 class EPD:
@@ -45,6 +50,53 @@ class EPD:
         self.cs_pin = epdconfig.CS_PIN
         self.width = EPD_WIDTH
         self.height = EPD_HEIGHT
+        self.GRAY1  = GRAY1 #white
+        self.GRAY2  = GRAY2
+        self.GRAY3  = GRAY3 #gray
+        self.GRAY4  = GRAY4 #Blackest
+
+        self.Lut_Partial=[									
+            0x15,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x2A,	0x88,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x15,	0x44,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x00,	0x08,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x00,	0x01,	0x01,	0x01,	0x00,						
+            0x0A,	0x00,	0x05,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x00,	0x00,						
+            0x00,	0x00,	0x00,	0x01,	0x01,						
+            0x22,	0x22,	0x22,	0x22,	0x22,						
+            0x17,	0x41,	0xA8,	0x32,	0x18,						
+            0x00,	0x00,]
+
+        self.LUT_DATA_4Gray =[											
+            0x80,	0x48,	0x4A,	0x22,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x0A,	0x48,	0x68,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x88,	0x48,	0x60,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0xA8,	0x48,	0x45,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+            0x07,	0x23,	0x17,	0x02,	0x00,						
+            0x05,	0x01,	0x05,	0x01,	0x02,						
+            0x08,	0x02,	0x01,	0x04,	0x04,						
+            0x00,	0x02,	0x00,	0x02,	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,	0x01,						
+            0x22,	0x22,	0x22,	0x22,	0x22,						
+            0x17,	0x41,	0xA8,	0x32,	0x30,						
+            0x00,	0x00,]
+
+        if (epdconfig.module_init() != 0):
+            return -1
     
     # Hardware reset
     def reset(self):
@@ -87,10 +139,37 @@ class EPD:
         self.send_data(0xF7)
         self.send_command(0x20) #Activate Display Update Sequence
         self.ReadBusy()
+
+    def TurnOnDisplay_Part(self):
+        self.send_command(0x22) #Display Update Control
+        self.send_data(0xCF)
+        self.send_command(0x20) #Activate Display Update Sequence
+        self.ReadBusy()
+
+    def TurnOnDisplay_4GRAY(self):
+        self.send_command(0x22) #Display Update Control
+        self.send_data(0xC7)
+        self.send_command(0x20) #Activate Display Update Sequence
+        self.ReadBusy()
+
+    def Lut(self, LUT):
+        self.send_command(0x32)
+        for i in range(105):
+            self.send_data(LUT[i])
+
+        self.send_command(0x03) 
+        self.send_data(LUT[105])
+
+        self.send_command(0x04)  
+        self.send_data(LUT[106])
+        self.send_data(LUT[107]) 
+        self.send_data(LUT[108])
+
+        self.send_command(0x2C)
+        self.send_data(LUT[109])
         
     def init(self):
-        if (epdconfig.module_init() != 0):
-            return -1
+        
         # EPD hardware init start
         self.reset()
         self.ReadBusy()
@@ -110,8 +189,8 @@ class EPD:
         self.send_data(0x02)  
         self.send_data(0x00)
 
-        self.send_command(0x11)  # data  entry  mode
-        self.send_data(0x03)  # X-mode
+        self.send_command(0x11)
+        self.send_data(0x03)
 
         self.send_command(0x44) 
         self.send_data(0x00)
@@ -125,14 +204,15 @@ class EPD:
         self.send_data(0xA7)
         self.send_data(0x02)
 
-        self.send_command(0x3C)  # BorderWavefrom
+        self.send_command(0x3C) 
         self.send_data(0x05)
 
-        self.send_command(0x18)  # use the internal temperature sensor
+        self.send_command(0x18) 
         self.send_data(0x80)
 
         self.send_command(0x4E) 
         self.send_data(0x00)
+        self.send_data(0x00)
 
         self.send_command(0x4F) 
         self.send_data(0x00)
@@ -141,6 +221,87 @@ class EPD:
         # EPD hardware init end
         return 0
 
+    def init_Part(self):
+        self.reset()
+
+        self.send_command(0x3C)    
+        self.send_data(0x80)
+
+        self.Lut(self.Lut_Partial)
+
+        self.send_command(0x37) 
+        self.send_data(0x00)  
+        self.send_data(0x00)  
+        self.send_data(0x00)  
+        self.send_data(0x00)  
+        self.send_data(0x00) 
+        self.send_data(0x40)  
+        self.send_data(0x00)  
+        self.send_data(0x00)   
+        self.send_data(0x00)  
+        self.send_data(0x00)  
+
+        self.send_command(0x3C) 
+        self.send_data(0x80)   
+
+        self.send_command(0x22) 
+        self.send_data(0xC0)   
+        self.send_command(0x20) 
+
+        self.ReadBusy()
+    def init_4GRAY(self):
+        self.reset()
+
+        self.ReadBusy()   
+        self.send_command(0x12)
+        self.ReadBusy()   
+
+        self.send_command(0x0C)   
+        self.send_data(0xAE)
+        self.send_data(0xC7)
+        self.send_data(0xC3)
+        self.send_data(0xC0)
+        self.send_data(0x80)
+
+        self.send_command(0x01) 
+        self.send_data(0xA7)
+        self.send_data(0x02)  
+        self.send_data(0x00)
+
+        self.send_command(0x11)
+        self.send_data(0x03) 
+
+        self.send_command(0x44) 
+        self.send_data(0x00)
+        self.send_data(0x00)  
+        self.send_data(0xBF)
+        self.send_data(0x03) 
+        
+        self.send_command(0x45) 
+        self.send_data(0x00)
+        self.send_data(0x00)  
+        self.send_data(0xA7)
+        self.send_data(0x02)
+
+        self.send_command(0x3C)
+        self.send_data(0x00)
+
+        self.send_command(0x18) 
+        self.send_data(0x80)
+        
+        self.send_command(0x4E) 
+        self.send_data(0x00)
+        self.send_data(0x00)
+
+        self.send_command(0x4F) 
+        self.send_data(0x00)
+        self.send_data(0x00) 
+
+        self.Lut(self.LUT_DATA_4Gray)
+        
+        self.ReadBusy()
+
+
     def getbuffer(self, image):
         # logger.debug("bufsiz = ",int(self.width/8) * self.height)
         buf = [0xFF] * (int(self.width / 8) * self.height)
@@ -165,22 +326,197 @@ class EPD:
                         buf[int((newx + newy * self.width) / 8)] &= ~(0x80 >> (y % 8))
         return buf
 
+    def getbuffer_4Gray(self, image):
+        # logger.debug("bufsiz = ",int(self.width/8) * self.height)
+        buf = [0xFF] * (int(self.width / 4) * self.height)
+        image_monocolor = image.convert('L')
+        imwidth, imheight = image_monocolor.size
+        pixels = image_monocolor.load()
+        i=0
+        # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
+        if(imwidth == self.width and imheight == self.height):
+            logger.debug("Vertical")
+            for y in range(imheight):
+                for x in range(imwidth):
+                    # Set the bits for the column of pixels at the current position.
+                    if(pixels[x, y] == 0xC0):
+                        pixels[x, y] = 0x80
+                    elif (pixels[x, y] == 0x80):
+                        pixels[x, y] = 0x40
+                    i= i+1
+                    if(i%4 == 0):
+                        buf[int((x + (y * self.width))/4)] = ((pixels[x-3, y]&0xc0) | (pixels[x-2, y]&0xc0)>>2 | (pixels[x-1, y]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6)
+                        
+        elif(imwidth == self.height and imheight == self.width):
+            logger.debug("Horizontal")
+            for x in range(imwidth):
+                for y in range(imheight):
+                    newx = y
+                    newy = self.height - x - 1
+                    if(pixels[x, y] == 0xC0):
+                        pixels[x, y] = 0x80
+                    elif (pixels[x, y] == 0x80):
+                        pixels[x, y] = 0x40
+                    i= i+1
+                    if(i%4 == 0):
+                        buf[int((newx + (newy * self.width))/4)] = ((pixels[x, y-3]&0xc0) | (pixels[x, y-2]&0xc0)>>2 | (pixels[x, y-1]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6) 
+        return buf
+
+    def Clear(self):
+        buf = [0xFF] * (int(self.width/8) * self.height)
+        self.send_command(0x24)
+        self.send_data2(buf)
+
+        self.TurnOnDisplay()
+    
     def display(self, image):
         self.send_command(0x24)
         self.send_data2(image)
 
         self.TurnOnDisplay()
 
-    def Clear(self):
-        buf = [0xFF] * (int(self.width/8) * self.height)
+    def display_Base(self, image):
         self.send_command(0x24)
-        self.send_data2(buf)
+        self.send_data2(image)
+
+        self.send_command(0x26)
+        self.send_data2(image)
 
         self.TurnOnDisplay()
 
+    def display_Base_color(self, color):
+        if(self.width % 8 == 0):
+            Width = self.width // 8
+        else:
+            Width = self.width // 8 +1
+        Height = self.height
+        self.send_command(0x24)   #Write Black and White image to RAM
+        for j in range(Height):
+            for i in range(Width):
+                self.send_data(color)
+                
+        self.send_command(0x26)  #Write Black and White image to RAM
+        for j in range(Height):
+            for i in range(Width):
+                self.send_data(color)
+        # self.TurnOnDisplay()
+
+    def display_Partial(self, Image, Xstart, Ystart, Xend, Yend):
+        if((Xstart % 8 + Xend % 8 == 8 & Xstart % 8 > Xend % 8) | Xstart % 8 + Xend % 8 == 0 | (Xend - Xstart)%8 == 0):
+            Xstart = Xstart // 8
+            Xend = Xend // 8
+        else:
+            Xstart = Xstart // 8 
+            if Xend % 8 == 0:
+                Xend = Xend // 8
+            else:
+                Xend = Xend // 8 + 1
+                
+        if(self.width % 8 == 0):
+            Width = self.width // 8
+        else:
+            Width = self.width // 8 +1
+        Height = self.height
+
+        Xend -= 1
+        Yend -= 1
+	
+        self.send_command(0x44)   
+        self.send_data((Xstart*8) & 0xff)  
+        self.send_data((Xstart>>5) & 0x01)  
+        self.send_data((Xend*8) & 0xff)  
+        self.send_data((Xend>>5) & 0x01) 
+        self.send_command(0x45)     
+        self.send_data(Ystart & 0xff)  
+        self.send_data((Ystart>>8) & 0x01)  
+        self.send_data(Yend & 0xff)
+        self.send_data((Yend>>8) & 0x01)   
+
+        self.send_command(0x4E) 
+        self.send_data((Xstart*8) & 0xff) 
+        self.send_data((Xstart>>5) & 0x01) 
+        self.send_command(0x4F)   
+        self.send_data(Ystart & 0xff)
+        self.send_data((Ystart>>8) & 0x01)
+
+        self.send_command(0x24)  
+        for j in range(Height):
+            for i in range(Width):
+                if((j > Ystart-1) & (j < (Yend + 1)) & (i > Xstart-1) & (i < (Xend + 1))):
+                    self.send_data(Image[i + j * Width])
+        self.TurnOnDisplay_Part()
+    
+    def display_4Gray(self, image):
+        self.send_command(0x24)
+        for i in range(0, 81600): 
+            temp3=0
+            for j in range(0, 2):
+                temp1 = image[i*2+j]
+                for k in range(0, 2):
+                    temp2 = temp1&0xC0 
+                    if(temp2 == 0xC0):
+                        temp3 |= 0x00
+                    elif(temp2 == 0x00):
+                        temp3 |= 0x01  
+                    elif(temp2 == 0x80): 
+                        temp3 |= 0x01 
+                    else: #0x40
+                        temp3 |= 0x00 
+                    temp3 <<= 1	
+                    
+                    temp1 <<= 2
+                    temp2 = temp1&0xC0 
+                    if(temp2 == 0xC0): 
+                        temp3 |= 0x00
+                    elif(temp2 == 0x00): 
+                        temp3 |= 0x01
+                    elif(temp2 == 0x80):
+                        temp3 |= 0x01
+                    else :   #0x40
+                        temp3 |= 0x00	
+                    if(j!=1 or k!=1):				
+                        temp3 <<= 1
+                    temp1 <<= 2
+            self.send_data(temp3)
+            
+        self.send_command(0x26)	       
+        for i in range(0, 81600): 
+            temp3=0
+            for j in range(0, 2):
+                temp1 = image[i*2+j]
+                for k in range(0, 2):
+                    temp2 = temp1&0xC0 
+                    if(temp2 == 0xC0):
+                        temp3 |= 0x00
+                    elif(temp2 == 0x00):
+                        temp3 |= 0x01
+                    elif(temp2 == 0x80):
+                        temp3 |= 0x00
+                    else: #0x40
+                        temp3 |= 0x01 
+                    temp3 <<= 1	
+                    
+                    temp1 <<= 2
+                    temp2 = temp1&0xC0 
+                    if(temp2 == 0xC0): 
+                        temp3 |= 0x00
+                    elif(temp2 == 0x00): 
+                        temp3 |= 0x01
+                    elif(temp2 == 0x80):
+                        temp3 |= 0x00 
+                    else:    #0x40
+                            temp3 |= 0x01	
+                    if(j!=1 or k!=1):					
+                        temp3 <<= 1
+                    temp1 <<= 2
+            self.send_data(temp3)
+        
+        self.TurnOnDisplay_4GRAY()
+
+
     def sleep(self):
         self.send_command(0x10) # DEEP_SLEEP
-        self.send_data(0x01)
+        self.send_data(0x03)
         
         epdconfig.delay_ms(2000)
         epdconfig.module_exit()

+ 13 - 14
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.py

@@ -108,21 +108,20 @@ class RaspberryPi:
         return 0
 
     def module_exit(self, cleanup=False):
-        logger.debug("spi end")
-        self.SPI.close()
-
-        
-        self.GPIO_RST_PIN.off()
-        self.GPIO_DC_PIN.off()
-        self.GPIO_PWR_PIN.off()
         logger.debug("close 5V, Module enters 0 power consumption ...")
-        
-        if cleanup:
-            self.GPIO_RST_PIN.close()
-            self.GPIO_DC_PIN.close()
-            # self.GPIO_CS_PIN.close()
-            self.GPIO_PWR_PIN.close()
-            self.GPIO_BUSY_PIN.close()
+
+        # logger.debug("spi end")
+        # self.SPI.close()
+        # self.GPIO_RST_PIN.off()
+        # self.GPIO_DC_PIN.off()
+        # self.GPIO_PWR_PIN.off()
+
+        # if cleanup:
+        #     self.GPIO_RST_PIN.close()
+        #     self.GPIO_DC_PIN.close()
+        #     # self.GPIO_CS_PIN.close()
+        #     self.GPIO_PWR_PIN.close()
+        #     self.GPIO_BUSY_PIN.close()
 
         
 

BIN=BIN
RaspberryPi_JetsonNano/python/pic/13in3b_b.bmp


BIN=BIN
RaspberryPi_JetsonNano/python/pic/13in3b_r.bmp


BIN=BIN
RaspberryPi_JetsonNano/python/pic/13in3k_Scale.bmp


+ 97 - 0
STM32/STM32-F103ZET6/MDK-ARM/DebugConfig/EPD_13in3b_test_STM32F103ZE.dbgconf

@@ -0,0 +1,97 @@
+// <<< Use Configuration Wizard in Context Menu >>>
+// <h> Debug MCU Configuration
+//   <o0.0>    DBG_SLEEP
+// <i> Debug Sleep Mode
+// <i> 0: (FCLK=On, HCLK=Off) FCLK is clocked by the system clock as previously configured by the software while HCLK is disabled
+// <i> 1: (FCLK=On, HCLK=On) HCLK is fed by the same clock that is provided to FCLK
+//   <o0.1>    DBG_STOP
+// <i> Debug Stop Mode
+// <i> 0: (FCLK=Off, HCLK=Off) Clock controller disables all clocks
+// <i> 1: (FCLK=On, HCLK=On) FCLK and HCLK are provided by the internal RC oscillator which remains active
+//   <o0.2>    DBG_STANDBY
+// <i> Debug Standby Mode
+// <i> 0: (FCLK=Off, HCLK=Off) The whole digital part is unpowered.
+// <i> 1: (FCLK=On, HCLK=On) Digital part is powered and FCLK and HCLK are provided by the internal RC oscillator which remains active
+//   <o0.8>    DBG_IWDG_STOP
+// <i> Debug independent watchdog stopped when core is halted
+// <i> 0: The watchdog counter clock continues even if the core is halted
+// <i> 1: The watchdog counter clock is stopped when the core is halted
+//   <o0.9>    DBG_WWDG_STOP
+// <i> Debug window watchdog stopped when core is halted
+// <i> 0: The window watchdog counter clock continues even if the core is halted
+// <i> 1: The window watchdog counter clock is stopped when the core is halted
+//   <o0.10>   DBG_TIM1_STOP
+// <i> Timer 1 counter stopped when core is halted
+// <i> 0: The clock of the involved Timer Counter is fed even if the core is halted
+// <i> 1: The clock of the involved Timer counter is stopped when the core is halted
+//   <o0.11>   DBG_TIM2_STOP
+// <i> Timer 2 counter stopped when core is halted
+// <i> 0: The clock of the involved Timer Counter is fed even if the core is halted
+// <i> 1: The clock of the involved Timer counter is stopped when the core is halted
+//   <o0.12>   DBG_TIM3_STOP
+// <i> Timer 3 counter stopped when core is halted
+// <i> 0: The clock of the involved Timer Counter is fed even if the core is halted
+// <i> 1: The clock of the involved Timer counter is stopped when the core is halted
+//   <o0.13>   DBG_TIM4_STOP
+// <i> Timer 4 counter stopped when core is halted
+// <i> 0: The clock of the involved Timer Counter is fed even if the core is halted
+// <i> 1: The clock of the involved Timer counter is stopped when the core is halted
+//   <o0.14>   DBG_CAN1_STOP
+// <i> Debug CAN1 stopped when Core is halted
+// <i> 0: Same behavior as in normal mode
+// <i> 1: CAN1 receive registers are frozen
+//   <o0.15>   DBG_I2C1_SMBUS_TIMEOUT
+// <i> I2C1 SMBUS timeout mode stopped when Core is halted
+// <i> 0: Same behavior as in normal mode
+// <i> 1: The SMBUS timeout is frozen
+//   <o0.16>   DBG_I2C2_SMBUS_TIMEOUT
+// <i> I2C2 SMBUS timeout mode stopped when Core is halted
+// <i> 0: Same behavior as in normal mode
+// <i> 1: The SMBUS timeout is frozen
+//   <o0.17>   DBG_TIM8_STOP
+// <i> Timer 8 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.18>   DBG_TIM5_STOP
+// <i> Timer 5 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.19>   DBG_TIM6_STOP
+// <i> Timer 6 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.20>   DBG_TIM7_STOP
+// <i> Timer 7 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.21>   DBG_CAN2_STOP
+// <i> Debug CAN2 stopped when Core is halted
+// <i> 0: Same behavior as in normal mode
+// <i> 1: CAN2 receive registers are frozen
+//   <o0.25>   DBG_TIM12_STOP
+// <i> Timer 12 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.26>   DBG_TIM13_STOP
+// <i> Timer 13 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.27>   DBG_TIM14_STOP
+// <i> Timer 14 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.28>   DBG_TIM9_STOP
+// <i> Timer 9 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.29>   DBG_TIM10_STOP
+// <i> Timer 10 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+//   <o0.30>   DBG_TIM11_STOP
+// <i> Timer 11 counter stopped when core is halted
+// <i> 0: The clock of the involved timer counter is fed even if the core is halted, and the outputs behave normally.
+// <i> 1: The clock of the involved timer counter is stopped when the core is halted, and the outputs are disabled (as if there were an emergency stop in response to a break event).
+// </h>
+DbgMCU_CR = 0x00000007;
+// <<< end of configuration section >>>

+ 20 - 0
STM32/STM32-F103ZET6/MDK-ARM/RTE/_EPD_13in3b_test/RTE_Components.h

@@ -0,0 +1,20 @@
+
+/*
+ * Auto generated Run-Time-Environment Component Configuration File
+ *      *** Do not modify ! ***
+ *
+ * Project: 'epd-demo' 
+ * Target:  'EPD_13in3b_test' 
+ */
+
+#ifndef RTE_COMPONENTS_H
+#define RTE_COMPONENTS_H
+
+
+/*
+ * Define the Device Header File: 
+ */
+#define CMSIS_device_header "stm32f10x.h"
+
+
+#endif /* RTE_COMPONENTS_H */

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvguix.liuyujian


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 328 - 83
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvoptx


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 420 - 0
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvprojx


+ 7 - 8
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.build_log.htm

@@ -5,7 +5,7 @@
 <h2>Tool Versions:</h2>
 IDE-Version: ¦ÌVision V5.26.2.0
 Copyright (C) 2018 ARM Ltd and ARM Germany GmbH. All rights reserved.
-License Information:  ,  , LIC=RC93N-YLJYL-JJH6S-LI3Z1-D1AV2-99PL8
+License Information:  ,  , LIC=YA39H-W805E-Y8MFK-ZY00J-1SV4X-ZCYU2
  
 Tool Versions:
 Toolchain:       MDK-ARM Plus  Version: 5.26.2.0
@@ -22,15 +22,14 @@ Dialog DLL:      TCM.DLL V1.36.1.0
  
 <h2>Project:</h2>
 E:\ÏîÄ¿\e-Paper\Code\E-Paper_code\STM32\STM32-F103ZET6\MDK-ARM\epd-demo.uvprojx
-Project File Date:  03/06/2024
+Project File Date:  04/08/2024
 
 <h2>Output:</h2>
 *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\KEIL\azwz\ARM\ARMCC\Bin'
-Build target 'EPD_5in79_test'
-compiling ImageData2.c...
-compiling EPD_5in79_test.c...
+Build target 'EPD_13in3b_test'
+compiling EPD_13in3b_test.c...
 linking...
-Program Size: Code=26084 RO-data=27524 RW-data=264 ZI-data=53424  
+Program Size: Code=9980 RO-data=173852 RW-data=68 ZI-data=53428  
 FromELF: creating hex file...
 "epd-demo\epd-demo.axf" - 0 Error(s), 0 Warning(s).
 
@@ -48,14 +47,14 @@ Package Vendor: Keil
                 STMicroelectronics STM32F1 Series Device Support, Drivers and Examples
 
 <h2>Collection of Component include folders:</h2>
-  .\RTE\_EPD_5in79_test
+  .\RTE\_EPD_13in3b_test
   D:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Include
   D:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include
 
 <h2>Collection of Component Files used:</h2>
 
    * Component: ARM::CMSIS:CORE:5.6.0
-Build Time Elapsed:  00:00:02
+Build Time Elapsed:  00:00:01
 </pre>
 </body>
 </html>

+ 428 - 1443
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.htm

@@ -3,19 +3,19 @@
 <title>Static Call Graph - [epd-demo\epd-demo.axf]</title></head>
 <body><HR>
 <H1>Static Call Graph for image epd-demo\epd-demo.axf</H1><HR>
-<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Mar 06 11:55:54 2024
+<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Mon Apr 08 19:50:27 2024
 <BR><P>
-<H3>Maximum Stack Usage =        160 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
+<H3>Maximum Stack Usage =        736 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
 Call chain for Maximum Stack Depth:</H3>
-main &rArr; EPD_test &rArr; EPD_5in79_Display_Fast &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+main &rArr; EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 <P>
 <H3>
 Mutually Recursive functions
 </H3> <LI><a href="#[1c]">ADC1_2_IRQHandler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[1c]">ADC1_2_IRQHandler</a><BR>
- <LI><a href="#[6a]">Error_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[6a]">Error_Handler</a><BR>
- <LI><a href="#[3]">MemManage_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[3]">MemManage_Handler</a><BR>
  <LI><a href="#[4]">BusFault_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[4]">BusFault_Handler</a><BR>
+ <LI><a href="#[3]">MemManage_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[3]">MemManage_Handler</a><BR>
  <LI><a href="#[5]">UsageFault_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[5]">UsageFault_Handler</a><BR>
+ <LI><a href="#[6e]">Error_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[6e]">Error_Handler</a><BR>
 </UL>
 <P>
 <H3>
@@ -23,7 +23,7 @@ Function Pointers
 </H3><UL>
  <LI><a href="#[1c]">ADC1_2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[39]">ADC3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[4]">BusFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[4]">BusFault_Handler</a> from stm32f1xx_it.o(i.BusFault_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1f]">CAN1_RX1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[20]">CAN1_SCE_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[15]">DMA1_Channel1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -37,7 +37,7 @@ Function Pointers
  <LI><a href="#[43]">DMA2_Channel2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[44]">DMA2_Channel3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[45]">DMA2_Channel4_5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[7]">DebugMon_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[7]">DebugMon_Handler</a> from stm32f1xx_it.o(i.DebugMon_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[10]">EXTI0_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[32]">EXTI15_10_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[11]">EXTI1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -47,15 +47,15 @@ Function Pointers
  <LI><a href="#[21]">EXTI9_5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[e]">FLASH_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3a]">FSMC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[2]">HardFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[2]">HardFault_Handler</a> from stm32f1xx_it.o(i.HardFault_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2a]">I2C1_ER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[29]">I2C1_EV_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2c]">I2C2_ER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2b]">I2C2_EV_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[3]">MemManage_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[1]">NMI_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[3]">MemManage_Handler</a> from stm32f1xx_it.o(i.MemManage_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[1]">NMI_Handler</a> from stm32f1xx_it.o(i.NMI_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[b]">PVD_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[8]">PendSV_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[8]">PendSV_Handler</a> from stm32f1xx_it.o(i.PendSV_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[f]">RCC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[33]">RTC_Alarm_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[d]">RTC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -64,29 +64,9 @@ Function Pointers
  <LI><a href="#[2d]">SPI1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2e]">SPI2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3d]">SPI3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[4b]">SPI_2linesRxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[4d]">SPI_2linesRxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[4c]">SPI_2linesTxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[4e]">SPI_2linesTxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[59]">SPI_AbortRx_ISR</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[58]">SPI_AbortTx_ISR</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[5c]">SPI_DMAAbortOnError</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[53]">SPI_DMAError</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[56]">SPI_DMAHalfReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[51]">SPI_DMAHalfTransmitCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[54]">SPI_DMAHalfTransmitReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[57]">SPI_DMAReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[5b]">SPI_DMARxAbortCallback</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[52]">SPI_DMATransmitCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[55]">SPI_DMATransmitReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[5a]">SPI_DMATxAbortCallback</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[4f]">SPI_RxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[50]">SPI_RxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[49]">SPI_TxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[4a]">SPI_TxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
- <LI><a href="#[6]">SVC_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[9]">SysTick_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[47]">SystemInit</a> from system_stm32f1xx.o(.text) referenced from startup_stm32f103xe.o(.text)
+ <LI><a href="#[6]">SVC_Handler</a> from stm32f1xx_it.o(i.SVC_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[9]">SysTick_Handler</a> from stm32f1xx_it.o(i.SysTick_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[47]">SystemInit</a> from system_stm32f1xx.o(i.SystemInit) referenced from startup_stm32f103xe.o(.text)
  <LI><a href="#[c]">TAMPER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[22]">TIM1_BRK_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[25]">TIM1_CC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -104,27 +84,17 @@ Function Pointers
  <LI><a href="#[36]">TIM8_UP_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3e]">UART4_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3f]">UART5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[66]">UART_DMAAbortOnError</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[5f]">UART_DMAError</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[60]">UART_DMAReceiveCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[63]">UART_DMARxAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[61]">UART_DMARxHalfCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[65]">UART_DMARxOnlyAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[5d]">UART_DMATransmitCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[62]">UART_DMATxAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[5e]">UART_DMATxHalfCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
- <LI><a href="#[64]">UART_DMATxOnlyAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
  <LI><a href="#[2f]">USART1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[30]">USART2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[31]">USART3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[34]">USBWakeUp_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1d]">USB_HP_CAN1_TX_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1e]">USB_LP_CAN1_RX0_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[5]">UsageFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[5]">UsageFault_Handler</a> from stm32f1xx_it.o(i.UsageFault_Handler) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[a]">WWDG_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[48]">__main</a> from entry.o(.ARM.Collect$$$$00000000) referenced from startup_stm32f103xe.o(.text)
- <LI><a href="#[67]">fputc</a> from usart.o(.text) referenced from printf3.o(i.__0printf$3)
- <LI><a href="#[46]">main</a> from main.o(.text) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
+ <LI><a href="#[49]">fputc</a> from usart.o(i.fputc) referenced from printf3.o(i.__0printf$3)
+ <LI><a href="#[46]">main</a> from main.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
 </UL>
 <P>
 <H3>
@@ -133,25 +103,25 @@ Global Symbols
 <P><STRONG><a name="[48]"></a>__main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
 </UL>
-<P><STRONG><a name="[119]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
+<P><STRONG><a name="[91]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
 
-<P><STRONG><a name="[68]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
-<BR><BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
+<P><STRONG><a name="[4a]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
+<BR><BR>[Calls]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
 </UL>
 
-<P><STRONG><a name="[115]"></a>__main_after_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
-<BR><BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
+<P><STRONG><a name="[4f]"></a>__main_after_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
+<BR><BR>[Called By]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
 </UL>
 
-<P><STRONG><a name="[11a]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
+<P><STRONG><a name="[92]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
 
-<P><STRONG><a name="[11b]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
+<P><STRONG><a name="[93]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
 
-<P><STRONG><a name="[11c]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
+<P><STRONG><a name="[94]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
 
-<P><STRONG><a name="[11d]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
+<P><STRONG><a name="[95]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
 
-<P><STRONG><a name="[11e]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
+<P><STRONG><a name="[96]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
 
 <P><STRONG><a name="[0]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f103xe.o(.text))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
@@ -340,1668 +310,683 @@ Global Symbols
 <P><STRONG><a name="[a]"></a>WWDG_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f103xe.o(.text))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<P><STRONG><a name="[6a]"></a>Error_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, main.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24 + In Cycle
-<LI>Call Chain = Error_Handler &rArr;  Error_Handler (Cycle)
-</UL>
-<BR>[Calls]<UL><LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-</UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
-<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<P><STRONG><a name="[4d]"></a>__aeabi_memset</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_memset$wrapper
+<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
 </UL>
 
-<P><STRONG><a name="[6c]"></a>SystemClock_Config</STRONG> (Thumb, 88 bytes, Stack size 72 bytes, main.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = SystemClock_Config &rArr; HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
-</UL>
-<BR>[Calls]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
-</UL>
+<P><STRONG><a name="[97]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
-<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, main.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 160<LI>Call Chain = main &rArr; EPD_test &rArr; EPD_5in79_Display_Fast &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
-<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
-<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
-</UL>
-<P><STRONG><a name="[71]"></a>MX_GPIO_Init</STRONG> (Thumb, 86 bytes, Stack size 32 bytes, gpio.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = MX_GPIO_Init &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
-</UL>
+<P><STRONG><a name="[98]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
-<P><STRONG><a name="[73]"></a>MX_SPI1_Init</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = MX_SPI1_Init &rArr; HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<P><STRONG><a name="[4c]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
 </UL>
 
-<P><STRONG><a name="[79]"></a>HAL_SPI_MspInit</STRONG> (Thumb, 80 bytes, Stack size 24 bytes, spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_SPI_MspInit &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
-</UL>
-<BR>[Called By]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
+<P><STRONG><a name="[88]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
 
-<P><STRONG><a name="[7a]"></a>HAL_SPI_MspDeInit</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_DeInit
-</UL>
-<BR>[Called By]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_DeInit
-</UL>
+<P><STRONG><a name="[99]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
 
-<P><STRONG><a name="[72]"></a>MX_USART1_UART_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, usart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = MX_USART1_UART_Init &rArr; HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<P><STRONG><a name="[4e]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
 </UL>
 
-<P><STRONG><a name="[7d]"></a>HAL_UART_MspInit</STRONG> (Thumb, 100 bytes, Stack size 32 bytes, usart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = HAL_UART_MspInit &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
-</UL>
-<BR>[Called By]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
-<LI><a href="#[f0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MultiProcessor_Init
-<LI><a href="#[ef]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_LIN_Init
-<LI><a href="#[ee]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_HalfDuplex_Init
-</UL>
+<P><STRONG><a name="[9a]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
 
-<P><STRONG><a name="[7e]"></a>HAL_UART_MspDeInit</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, usart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_DeInit
-</UL>
-<BR>[Called By]<UL><LI><a href="#[f1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DeInit
+<P><STRONG><a name="[90]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
 </UL>
 
-<P><STRONG><a name="[67]"></a>fputc</STRONG> (Thumb, 20 bytes, Stack size 16 bytes, usart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = fputc &rArr; HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> printf3.o(i.__0printf$3)
-</UL>
-<P><STRONG><a name="[1]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<P><STRONG><a name="[4b]"></a>__scatterload</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main_after_scatterload
 </UL>
-<P><STRONG><a name="[2]"></a>HardFault_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = HardFault_Handler &rArr; __2printf
-</UL>
-<BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[3]"></a>MemManage_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR><BR>[Calls]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
-</UL>
-<BR>[Called By]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
+<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[4]"></a>BusFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+
+<P><STRONG><a name="[9b]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
+
+<P><STRONG><a name="[4]"></a>BusFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.BusFault_Handler))
 <BR><BR>[Calls]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
 </UL>
 <BR>[Called By]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
 </UL>
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<P><STRONG><a name="[5]"></a>UsageFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR><BR>[Calls]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
-</UL>
-<BR>[Called By]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[6]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[7]"></a>DebugMon_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[8]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[9]"></a>SysTick_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
-<BR><BR>[Calls]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_IncTick
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
-</UL>
-<P><STRONG><a name="[da]"></a>HAL_MspInit</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, stm32f1xx_hal_msp.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_MspInit
-</UL>
-<BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
-</UL>
-
-<P><STRONG><a name="[74]"></a>EPD_test</STRONG> (Thumb, 182 bytes, Stack size 16 bytes, epd_5in79_test.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 160<LI>Call Chain = EPD_test &rArr; EPD_5in79_Display_Fast &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SelectImage
-<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_NewImage
-<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawBitMap
-<LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_Clear
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Sleep
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Fast
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init
-<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Fast
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear
-<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
-<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
-<LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
-</UL>
-
-<P><STRONG><a name="[8f]"></a>EPD_5in79_ReadBusy</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = EPD_5in79_ReadBusy &rArr; __2printf
-</UL>
-<BR>[Calls]<UL><LI><a href="#[90]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_ReadPin
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-</UL>
-<BR>[Called By]<UL><LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Partial
-<LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_4Gray
-<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Partial
-<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Fast
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init
-<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Fast
-</UL>
-
-<P><STRONG><a name="[82]"></a>EPD_5in79_Init</STRONG> (Thumb, 212 bytes, Stack size 8 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_5in79_Init &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[88]"></a>EPD_5in79_Init_Fast</STRONG> (Thumb, 286 bytes, Stack size 8 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_5in79_Init_Fast &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[93]"></a>EPD_5in79_Init_Partial</STRONG> (Thumb, 36 bytes, Stack size 8 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-</UL>
-
-<P><STRONG><a name="[94]"></a>EPD_5in79_Init_4Gray</STRONG> (Thumb, 258 bytes, Stack size 8 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Lut
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-</UL>
-
-<P><STRONG><a name="[83]"></a>EPD_5in79_Clear</STRONG> (Thumb, 94 bytes, Stack size 16 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = EPD_5in79_Clear &rArr; EPD_5in79_TurnOnDisplay &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[97]"></a>EPD_5in79_Clear_Black</STRONG> (Thumb, 156 bytes, Stack size 16 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[98]"></a>EPD_5in79_Display</STRONG> (Thumb, 160 bytes, Stack size 32 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[99]"></a>EPD_5in79_Display_Base</STRONG> (Thumb, 256 bytes, Stack size 32 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[9a]"></a>EPD_5in79_Display_Base_color</STRONG> (Thumb, 188 bytes, Stack size 24 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[8a]"></a>EPD_5in79_Display_Fast</STRONG> (Thumb, 182 bytes, Stack size 32 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_5in79_Display_Fast &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[9b]"></a>EPD_5in79_Display_Partial</STRONG> (Thumb, 778 bytes, Stack size 80 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-</UL>
-
-<P><STRONG><a name="[9c]"></a>EPD_5in79_4GrayDisplay</STRONG> (Thumb, 448 bytes, Stack size 32 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[9e]"></a>EPD_5in79_4GrayDisplay_Partial</STRONG> (Thumb, 278 bytes, Stack size 32 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-
-<P><STRONG><a name="[8b]"></a>EPD_5in79_Sleep</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_5in79_Sleep &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[9f]"></a>DEV_SPI_WriteByte</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, dev_config.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<P><STRONG><a name="[50]"></a>DEV_Module_Exit</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(i.DEV_Module_Exit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Exit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
+<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-
-<P><STRONG><a name="[a1]"></a>DEV_SPI_Write_nByte</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, dev_config.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[81]"></a>DEV_Module_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(.text))
+<P><STRONG><a name="[52]"></a>DEV_Module_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(i.DEV_Module_Init))
 <BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[8d]"></a>DEV_Module_Exit</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Exit
+<P><STRONG><a name="[53]"></a>DEV_SPI_WriteByte</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, dev_config.o(i.DEV_SPI_WriteByte))
+<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<BR>[Calls]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
 </UL>
 
-<P><STRONG><a name="[85]"></a>Paint_NewImage</STRONG> (Thumb, 56 bytes, Stack size 16 bytes, gui_paint.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_NewImage
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-</UL>
-
-<P><STRONG><a name="[86]"></a>Paint_SelectImage</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, gui_paint.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<P><STRONG><a name="[7]"></a>DebugMon_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.DebugMon_Handler))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[a2]"></a>Paint_SetRotate</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<P><STRONG><a name="[55]"></a>EPD_13IN3B_Clear</STRONG> (Thumb, 82 bytes, Stack size 24 bytes, epd_13in3b.o(i.EPD_13IN3B_Clear))
+<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_13IN3B_Clear &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-
-<P><STRONG><a name="[a3]"></a>Paint_SetScale</STRONG> (Thumb, 80 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
 </UL>
-
-<P><STRONG><a name="[a4]"></a>Paint_SetMirroring</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[a5]"></a>Paint_SetPixel</STRONG> (Thumb, 238 bytes, Stack size 16 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-</UL>
-<BR>[Called By]<UL><LI><a href="#[b7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawBitMap_Paste
-<LI><a href="#[ad]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
-<LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
-<LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[a6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_ClearWindows
+<P><STRONG><a name="[59]"></a>EPD_13IN3B_Display_Base</STRONG> (Thumb, 156 bytes, Stack size 32 bytes, epd_13in3b.o(i.EPD_13IN3B_Display_Base))
+<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = EPD_13IN3B_Display_Base &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-
-<P><STRONG><a name="[87]"></a>Paint_Clear</STRONG> (Thumb, 156 bytes, Stack size 12 bytes, gui_paint.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = Paint_Clear
+<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
 </UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[a6]"></a>Paint_ClearWindows</STRONG> (Thumb, 52 bytes, Stack size 32 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<P><STRONG><a name="[5a]"></a>EPD_13IN3B_Display_WritePicture</STRONG> (Thumb, 206 bytes, Stack size 32 bytes, epd_13in3b.o(i.EPD_13IN3B_Display_WritePicture))
+<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = EPD_13IN3B_Display_WritePicture &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-
-<P><STRONG><a name="[a7]"></a>Paint_DrawPoint</STRONG> (Thumb, 180 bytes, Stack size 40 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
 </UL>
-<BR>[Called By]<UL><LI><a href="#[aa]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
-<LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[a8]"></a>Paint_DrawLine</STRONG> (Thumb, 662 bytes, Stack size 48 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<P><STRONG><a name="[5b]"></a>EPD_13IN3B_Init</STRONG> (Thumb, 274 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_Init &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[a9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
 </UL>
-
-<P><STRONG><a name="[a9]"></a>Paint_DrawRectangle</STRONG> (Thumb, 170 bytes, Stack size 48 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[aa]"></a>Paint_DrawCircle</STRONG> (Thumb, 528 bytes, Stack size 72 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<P><STRONG><a name="[5d]"></a>EPD_13IN3B_ReadBusy</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_ReadBusy))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = EPD_13IN3B_ReadBusy &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[ab]"></a>Paint_DrawChar</STRONG> (Thumb, 172 bytes, Stack size 40 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_ReadPin
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[b6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawTime
-<LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
 </UL>
 
-<P><STRONG><a name="[ac]"></a>Paint_DrawString_EN</STRONG> (Thumb, 116 bytes, Stack size 48 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<P><STRONG><a name="[60]"></a>EPD_13IN3B_Sleep</STRONG> (Thumb, 24 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_Sleep))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_Sleep &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
-<LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
 </UL>
-
-<P><STRONG><a name="[ad]"></a>Paint_DrawString_CN</STRONG> (Thumb, 518 bytes, Stack size 40 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[ae]"></a>Paint_DrawNum</STRONG> (Thumb, 140 bytes, Stack size 576 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+<P><STRONG><a name="[61]"></a>EPD_test</STRONG> (Thumb, 578 bytes, Stack size 32 bytes, epd_13in3b_test.o(i.EPD_test))
+<BR><BR>[Stack]<UL><LI>Max Depth = 736<LI>Call Chain = EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[af]"></a>Paint_DrawNumDecimals</STRONG> (Thumb, 258 bytes, Stack size 592 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[b1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_i2d
-<LI><a href="#[b4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_fmul
-<LI><a href="#[b5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_f2iz
-<LI><a href="#[b2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
-<LI><a href="#[b0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
-<LI><a href="#[b3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2f
-<LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+<BR>[Calls]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SelectImage
+<LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_NewImage
+<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
+<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_Clear
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
+<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
+<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[b6]"></a>Paint_DrawTime</STRONG> (Thumb, 282 bytes, Stack size 72 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[89]"></a>Paint_DrawBitMap</STRONG> (Thumb, 44 bytes, Stack size 16 bytes, gui_paint.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_DrawBitMap
-</UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<P><STRONG><a name="[6e]"></a>Error_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, main.o(i.Error_Handler))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24 + In Cycle
+<LI>Call Chain = Error_Handler &rArr;  Error_Handler (Cycle)
 </UL>
-
-<P><STRONG><a name="[b7]"></a>Paint_DrawBitMap_Paste</STRONG> (Thumb, 198 bytes, Stack size 56 bytes, gui_paint.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<BR>[Calls]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[11f]"></a>Paint_DrawBitMap_Block</STRONG> (Thumb, 54 bytes, Stack size 20 bytes, gui_paint.o(.text), UNUSED)
-
-<P><STRONG><a name="[47]"></a>SystemInit</STRONG> (Thumb, 60 bytes, Stack size 0 bytes, system_stm32f1xx.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
+<BR>[Called By]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
 </UL>
-<P><STRONG><a name="[120]"></a>SystemCoreClockUpdate</STRONG> (Thumb, 108 bytes, Stack size 0 bytes, system_stm32f1xx.o(.text), UNUSED)
 
-<P><STRONG><a name="[78]"></a>HAL_SPI_Init</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
-</UL>
-<BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
+<P><STRONG><a name="[5c]"></a>HAL_Delay</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal.o(i.HAL_Delay))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_Delay
 </UL>
-<BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-
-<P><STRONG><a name="[b8]"></a>HAL_SPI_DeInit</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspDeInit
+<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[a0]"></a>HAL_SPI_Transmit</STRONG> (Thumb, 358 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<P><STRONG><a name="[7c]"></a>HAL_GPIO_Init</STRONG> (Thumb, 462 bytes, Stack size 40 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_Write_nByte
-<LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+<BR>[Called By]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
 </UL>
 
-<P><STRONG><a name="[bd]"></a>HAL_SPI_TransmitReceive</STRONG> (Thumb, 484 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Called By]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
+<P><STRONG><a name="[5f]"></a>HAL_GPIO_ReadPin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_ReadPin))
+<BR><BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
 </UL>
 
-<P><STRONG><a name="[be]"></a>HAL_SPI_Receive</STRONG> (Thumb, 344 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<P><STRONG><a name="[51]"></a>HAL_GPIO_WritePin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_WritePin))
+<BR><BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
 </UL>
 
-<P><STRONG><a name="[c1]"></a>HAL_SPI_TxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
-<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
+<P><STRONG><a name="[6f]"></a>HAL_GetTick</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(i.HAL_GetTick))
+<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
+<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
+<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
 </UL>
 
-<P><STRONG><a name="[c0]"></a>HAL_SPI_ErrorCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAAbortOnError
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
-<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAError
-<LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
-<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
-<LI><a href="#[d5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_IRQHandler
+<P><STRONG><a name="[8a]"></a>HAL_IncTick</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(i.HAL_IncTick))
+<BR><BR>[Called By]<UL><LI><a href="#[9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
 </UL>
 
-<P><STRONG><a name="[121]"></a>HAL_SPI_Transmit_IT</STRONG> (Thumb, 140 bytes, Stack size 12 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-
-<P><STRONG><a name="[c3]"></a>HAL_SPI_RxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
-<LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+<P><STRONG><a name="[70]"></a>HAL_Init</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, stm32f1xx_hal.o(i.HAL_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_Init &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[c5]"></a>HAL_SPI_TxRxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
-<LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+<BR>[Calls]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspInit
+<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriorityGrouping
 </UL>
-
-<P><STRONG><a name="[c7]"></a>HAL_SPI_TransmitReceive_IT</STRONG> (Thumb, 146 bytes, Stack size 20 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[c6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_IT
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[c6]"></a>HAL_SPI_Receive_IT</STRONG> (Thumb, 192 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[c7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_IT
+<P><STRONG><a name="[72]"></a>HAL_InitTick</STRONG> (Thumb, 54 bytes, Stack size 16 bytes, stm32f1xx_hal.o(i.HAL_InitTick))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[c8]"></a>HAL_SPI_TxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfTransmitCplt
+<BR>[Calls]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[c9]"></a>HAL_SPI_Transmit_DMA</STRONG> (Thumb, 202 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<BR>[Called By]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
 </UL>
 
-<P><STRONG><a name="[cb]"></a>HAL_SPI_RxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfReceiveCplt
+<P><STRONG><a name="[73]"></a>HAL_MspInit</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, stm32f1xx_hal_msp.o(i.HAL_MspInit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_MspInit
 </UL>
-
-<P><STRONG><a name="[cc]"></a>HAL_SPI_TxRxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfTransmitReceiveCplt
+<BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
 </UL>
 
-<P><STRONG><a name="[cd]"></a>HAL_SPI_TransmitReceive_DMA</STRONG> (Thumb, 268 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<P><STRONG><a name="[75]"></a>HAL_NVIC_SetPriority</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(i.HAL_NVIC_SetPriority))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_NVIC_SetPriority
 </UL>
-<BR>[Called By]<UL><LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_DMA
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[ce]"></a>HAL_SPI_Receive_DMA</STRONG> (Thumb, 262 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
-<LI><a href="#[cd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_DMA
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
 </UL>
 
-<P><STRONG><a name="[cf]"></a>HAL_SPI_Abort</STRONG> (Thumb, 274 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
-</UL>
-
-<P><STRONG><a name="[d1]"></a>HAL_SPI_AbortCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATxAbortCallback
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
-<LI><a href="#[d2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort_IT
+<P><STRONG><a name="[71]"></a>HAL_NVIC_SetPriorityGrouping</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(i.HAL_NVIC_SetPriorityGrouping))
+<BR><BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
 </UL>
 
-<P><STRONG><a name="[d2]"></a>HAL_SPI_Abort_IT</STRONG> (Thumb, 264 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<P><STRONG><a name="[77]"></a>HAL_RCC_ClockConfig</STRONG> (Thumb, 280 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_ClockConfig))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[122]"></a>HAL_SPI_DMAPause</STRONG> (Thumb, 38 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-
-<P><STRONG><a name="[123]"></a>HAL_SPI_DMAResume</STRONG> (Thumb, 72 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-
-<P><STRONG><a name="[d4]"></a>HAL_SPI_DMAStop</STRONG> (Thumb, 66 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetSysClockFreq
+<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-
-<P><STRONG><a name="[d5]"></a>HAL_SPI_IRQHandler</STRONG> (Thumb, 220 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<BR>[Called By]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
 
-<P><STRONG><a name="[124]"></a>HAL_SPI_GetState</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-
-<P><STRONG><a name="[125]"></a>HAL_SPI_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
-
-<P><STRONG><a name="[d6]"></a>HAL_InitTick</STRONG> (Thumb, 54 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = HAL_InitTick &rArr; HAL_NVIC_SetPriority
-</UL>
-<BR>[Calls]<UL><LI><a href="#[d7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
-<LI><a href="#[d8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
-</UL>
-<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
-<LI><a href="#[de]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_DeInit
-<LI><a href="#[dd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SetTickFreq
+<P><STRONG><a name="[8d]"></a>HAL_RCC_GetPCLK1Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetPCLK1Freq))
+<BR><BR>[Called By]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
 </UL>
 
-<P><STRONG><a name="[70]"></a>HAL_Init</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, stm32f1xx_hal.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_Init &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
-</UL>
-<BR>[Calls]<UL><LI><a href="#[da]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspInit
-<LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
-<LI><a href="#[d9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriorityGrouping
-</UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<P><STRONG><a name="[8c]"></a>HAL_RCC_GetPCLK2Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetPCLK2Freq))
+<BR><BR>[Called By]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
 </UL>
 
-<P><STRONG><a name="[dc]"></a>HAL_MspDeInit</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[db]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DeInit
+<P><STRONG><a name="[78]"></a>HAL_RCC_GetSysClockFreq</STRONG> (Thumb, 74 bytes, Stack size 20 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetSysClockFreq))
+<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = HAL_RCC_GetSysClockFreq
 </UL>
-
-<P><STRONG><a name="[db]"></a>HAL_DeInit</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, stm32f1xx_hal.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[dc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspDeInit
+<BR>[Called By]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
 </UL>
 
-<P><STRONG><a name="[80]"></a>HAL_IncTick</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
+<P><STRONG><a name="[79]"></a>HAL_RCC_OscConfig</STRONG> (Thumb, 778 bytes, Stack size 40 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_OscConfig))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_RCC_OscConfig
 </UL>
-
-<P><STRONG><a name="[ba]"></a>HAL_GetTick</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
-<LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
-<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
-<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
-<LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
-<LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[f3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive
-<LI><a href="#[f2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
-<LI><a href="#[e7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_PollForTransfer
-<LI><a href="#[de]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_DeInit
-<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
-<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-
-<P><STRONG><a name="[126]"></a>HAL_GetTickPrio</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[dd]"></a>HAL_SetTickFreq</STRONG> (Thumb, 30 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<BR>[Called By]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
 
-<P><STRONG><a name="[127]"></a>HAL_GetTickFreq</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[75]"></a>HAL_Delay</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_Delay
+<P><STRONG><a name="[7a]"></a>HAL_SPI_Init</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(i.HAL_SPI_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Partial
-<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Fast
-<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
 </UL>
 
-<P><STRONG><a name="[128]"></a>HAL_SuspendTick</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[129]"></a>HAL_ResumeTick</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12a]"></a>HAL_GetHalVersion</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12b]"></a>HAL_GetREVID</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12c]"></a>HAL_GetDEVID</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12d]"></a>HAL_GetUIDw0</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12e]"></a>HAL_GetUIDw1</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[12f]"></a>HAL_GetUIDw2</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[130]"></a>HAL_DBGMCU_EnableDBGSleepMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[131]"></a>HAL_DBGMCU_DisableDBGSleepMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[132]"></a>HAL_DBGMCU_EnableDBGStopMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[133]"></a>HAL_DBGMCU_DisableDBGStopMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[134]"></a>HAL_DBGMCU_EnableDBGStandbyMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[135]"></a>HAL_DBGMCU_DisableDBGStandbyMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
-
-<P><STRONG><a name="[de]"></a>HAL_RCC_DeInit</STRONG> (Thumb, 202 bytes, Stack size 24 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-
-<P><STRONG><a name="[6e]"></a>HAL_RCC_OscConfig</STRONG> (Thumb, 776 bytes, Stack size 40 bytes, stm32f1xx_hal_rcc.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_RCC_OscConfig
+<P><STRONG><a name="[7b]"></a>HAL_SPI_MspInit</STRONG> (Thumb, 80 bytes, Stack size 24 bytes, spi.o(i.HAL_SPI_MspInit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_SPI_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Called By]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
 </UL>
 
-<P><STRONG><a name="[df]"></a>HAL_RCC_GetSysClockFreq</STRONG> (Thumb, 124 bytes, Stack size 20 bytes, stm32f1xx_hal_rcc.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = HAL_RCC_GetSysClockFreq
-</UL>
-<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-</UL>
-
-<P><STRONG><a name="[6f]"></a>HAL_RCC_ClockConfig</STRONG> (Thumb, 282 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
-</UL>
-<BR>[Calls]<UL><LI><a href="#[df]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetSysClockFreq
-<LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<P><STRONG><a name="[54]"></a>HAL_SPI_Transmit</STRONG> (Thumb, 358 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(i.HAL_SPI_Transmit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
 </UL>
-
-<P><STRONG><a name="[e0]"></a>HAL_RCC_MCOConfig</STRONG> (Thumb, 64 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+<BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
 </UL>
 
-<P><STRONG><a name="[136]"></a>HAL_RCC_EnableCSS</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-
-<P><STRONG><a name="[137]"></a>HAL_RCC_DisableCSS</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-
-<P><STRONG><a name="[138]"></a>HAL_RCC_GetHCLKFreq</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-
-<P><STRONG><a name="[ed]"></a>HAL_RCC_GetPCLK1Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<P><STRONG><a name="[74]"></a>HAL_SYSTICK_Config</STRONG> (Thumb, 40 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(i.HAL_SYSTICK_Config))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_SYSTICK_Config
 </UL>
-
-<P><STRONG><a name="[ec]"></a>HAL_RCC_GetPCLK2Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
 </UL>
-
-<P><STRONG><a name="[139]"></a>HAL_RCC_GetOscConfig</STRONG> (Thumb, 140 bytes, Stack size 8 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-
-<P><STRONG><a name="[13a]"></a>HAL_RCC_GetClockConfig</STRONG> (Thumb, 54 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-
-<P><STRONG><a name="[e2]"></a>HAL_RCC_CSSCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[e1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_NMI_IRQHandler
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
 </UL>
 
-<P><STRONG><a name="[e1]"></a>HAL_RCC_NMI_IRQHandler</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[e2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_CSSCallback
+<P><STRONG><a name="[7e]"></a>HAL_UART_Init</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(i.HAL_UART_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
 </UL>
-
-<P><STRONG><a name="[77]"></a>HAL_GPIO_Init</STRONG> (Thumb, 462 bytes, Stack size 40 bytes, stm32f1xx_hal_gpio.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_GPIO_Init
+<BR>[Calls]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
-<LI><a href="#[e0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_MCOConfig
+<BR>[Called By]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
 </UL>
 
-<P><STRONG><a name="[7b]"></a>HAL_GPIO_DeInit</STRONG> (Thumb, 256 bytes, Stack size 28 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspDeInit
-<LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspDeInit
+<P><STRONG><a name="[7f]"></a>HAL_UART_MspInit</STRONG> (Thumb, 100 bytes, Stack size 32 bytes, usart.o(i.HAL_UART_MspInit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = HAL_UART_MspInit &rArr; HAL_GPIO_Init
 </UL>
-
-<P><STRONG><a name="[90]"></a>HAL_GPIO_ReadPin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
+<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-
-<P><STRONG><a name="[76]"></a>HAL_GPIO_WritePin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Reset
-<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
-<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
 </UL>
 
-<P><STRONG><a name="[13b]"></a>HAL_GPIO_TogglePin</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
-
-<P><STRONG><a name="[13c]"></a>HAL_GPIO_LockPin</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
-
-<P><STRONG><a name="[e4]"></a>HAL_GPIO_EXTI_Callback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[e3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_EXTI_IRQHandler
+<P><STRONG><a name="[81]"></a>HAL_UART_Transmit</STRONG> (Thumb, 178 bytes, Stack size 32 bytes, stm32f1xx_hal_uart.o(i.HAL_UART_Transmit))
+<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
 </UL>
-
-<P><STRONG><a name="[e3]"></a>HAL_GPIO_EXTI_IRQHandler</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_EXTI_Callback
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
 </UL>
-
-<P><STRONG><a name="[13d]"></a>HAL_DMA_Init</STRONG> (Thumb, 112 bytes, Stack size 12 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[13e]"></a>HAL_DMA_DeInit</STRONG> (Thumb, 116 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[e5]"></a>HAL_DMA_Start</STRONG> (Thumb, 80 bytes, Stack size 16 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DMA_SetConfig
+<BR>[Called By]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fputc
 </UL>
 
-<P><STRONG><a name="[ca]"></a>HAL_DMA_Start_IT</STRONG> (Thumb, 112 bytes, Stack size 16 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DMA_SetConfig
+<P><STRONG><a name="[2]"></a>HardFault_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.HardFault_Handler))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = HardFault_Handler &rArr; __2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[fc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive_DMA
-<LI><a href="#[f9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit_DMA
-<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_DMA
-<LI><a href="#[cd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_DMA
-<LI><a href="#[c9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit_DMA
+<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[d0]"></a>HAL_DMA_Abort</STRONG> (Thumb, 70 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[101]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive
-<LI><a href="#[100]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit
-<LI><a href="#[fe]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort
-<LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
-<LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_DMAStop
-<LI><a href="#[cf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[d3]"></a>HAL_DMA_Abort_IT</STRONG> (Thumb, 296 bytes, Stack size 40 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
-<LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive_IT
-<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit_IT
-<LI><a href="#[103]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort_IT
-<LI><a href="#[d5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_IRQHandler
-<LI><a href="#[d2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort_IT
+<P><STRONG><a name="[83]"></a>MX_GPIO_Init</STRONG> (Thumb, 86 bytes, Stack size 32 bytes, gpio.o(i.MX_GPIO_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = MX_GPIO_Init &rArr; HAL_GPIO_Init
 </UL>
-
-<P><STRONG><a name="[e7]"></a>HAL_DMA_PollForTransfer</STRONG> (Thumb, 996 bytes, Stack size 56 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-
-<P><STRONG><a name="[13f]"></a>HAL_DMA_IRQHandler</STRONG> (Thumb, 572 bytes, Stack size 40 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[140]"></a>HAL_DMA_RegisterCallback</STRONG> (Thumb, 74 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[141]"></a>HAL_DMA_UnRegisterCallback</STRONG> (Thumb, 82 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[142]"></a>HAL_DMA_GetState</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-
-<P><STRONG><a name="[ff]"></a>HAL_DMA_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[101]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive
-<LI><a href="#[100]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit
-<LI><a href="#[fe]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort
-</UL>
-
-<P><STRONG><a name="[d9]"></a>HAL_NVIC_SetPriorityGrouping</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[d8]"></a>HAL_NVIC_SetPriority</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_NVIC_SetPriority
+<P><STRONG><a name="[84]"></a>MX_SPI1_Init</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, spi.o(i.MX_SPI1_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = MX_SPI1_Init &rArr; HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[e8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+<BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[143]"></a>HAL_NVIC_EnableIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[144]"></a>HAL_NVIC_DisableIRQ</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[145]"></a>HAL_NVIC_SystemReset</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[d7]"></a>HAL_SYSTICK_Config</STRONG> (Thumb, 40 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_SYSTICK_Config
+<P><STRONG><a name="[85]"></a>MX_USART1_UART_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, usart.o(i.MX_USART1_UART_Init))
+<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = MX_USART1_UART_Init &rArr; HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[e8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+<BR>[Calls]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[146]"></a>HAL_NVIC_GetPriorityGrouping</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[147]"></a>HAL_NVIC_GetPriority</STRONG> (Thumb, 82 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[148]"></a>HAL_NVIC_SetPendingIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[149]"></a>HAL_NVIC_GetPendingIRQ</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[14a]"></a>HAL_NVIC_ClearPendingIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[14b]"></a>HAL_NVIC_GetActive</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[14c]"></a>HAL_SYSTICK_CLKSourceConfig</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-
-<P><STRONG><a name="[ea]"></a>HAL_SYSTICK_Callback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_IRQHandler
+<P><STRONG><a name="[3]"></a>MemManage_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.MemManage_Handler))
+<BR><BR>[Calls]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
 </UL>
-
-<P><STRONG><a name="[e9]"></a>HAL_SYSTICK_IRQHandler</STRONG> (Thumb, 8 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ea]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Callback
+<BR>[Called By]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
 </UL>
-
-<P><STRONG><a name="[7c]"></a>HAL_UART_Init</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<P><STRONG><a name="[1]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.NMI_Handler))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<P><STRONG><a name="[65]"></a>Paint_Clear</STRONG> (Thumb, 158 bytes, Stack size 12 bytes, gui_paint.o(i.Paint_Clear))
+<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = Paint_Clear
 </UL>
-
-<P><STRONG><a name="[ee]"></a>HAL_HalfDuplex_Init</STRONG> (Thumb, 108 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[ef]"></a>HAL_LIN_Init</STRONG> (Thumb, 128 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<P><STRONG><a name="[86]"></a>Paint_DrawChar</STRONG> (Thumb, 176 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawChar))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[f0]"></a>HAL_MultiProcessor_Init</STRONG> (Thumb, 142 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[f1]"></a>HAL_UART_DeInit</STRONG> (Thumb, 50 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspDeInit
+<BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
 </UL>
 
-<P><STRONG><a name="[7f]"></a>HAL_UART_Transmit</STRONG> (Thumb, 176 bytes, Stack size 32 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
+<P><STRONG><a name="[6c]"></a>Paint_DrawCircle</STRONG> (Thumb, 532 bytes, Stack size 72 bytes, gui_paint.o(i.Paint_DrawCircle))
+<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = Paint_DrawCircle &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[f2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fputc
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[f3]"></a>HAL_UART_Receive</STRONG> (Thumb, 198 bytes, Stack size 40 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[f2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<P><STRONG><a name="[67]"></a>Paint_DrawLine</STRONG> (Thumb, 200 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawLine))
+<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[14d]"></a>HAL_UART_Transmit_IT</STRONG> (Thumb, 62 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[14e]"></a>HAL_UART_Receive_IT</STRONG> (Thumb, 82 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[f6]"></a>HAL_UART_ErrorCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAAbortOnError
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
+<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[f7]"></a>HAL_UART_TxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxHalfCplt
+<BR>[Called By]<UL><LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[f8]"></a>HAL_UART_TxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
-<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATransmitCplt
+<P><STRONG><a name="[6b]"></a>Paint_DrawNum</STRONG> (Thumb, 140 bytes, Stack size 576 bytes, gui_paint.o(i.Paint_DrawNum))
+<BR><BR>[Stack]<UL><LI>Max Depth = 704<LI>Call Chain = Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[f9]"></a>HAL_UART_Transmit_DMA</STRONG> (Thumb, 114 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
 </UL>
-
-<P><STRONG><a name="[fa]"></a>HAL_UART_RxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxHalfCplt
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[fb]"></a>HAL_UART_RxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[108]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Receive_IT
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAReceiveCplt
+<P><STRONG><a name="[66]"></a>Paint_DrawPoint</STRONG> (Thumb, 178 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawPoint))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[fc]"></a>HAL_UART_Receive_DMA</STRONG> (Thumb, 138 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[14f]"></a>HAL_UART_DMAPause</STRONG> (Thumb, 102 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[150]"></a>HAL_UART_DMAResume</STRONG> (Thumb, 94 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[fd]"></a>HAL_UART_DMAStop</STRONG> (Thumb, 88 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[f4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndTxTransfer
-<LI><a href="#[f5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
-<LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+<BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[fe]"></a>HAL_UART_Abort</STRONG> (Thumb, 138 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ff]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
-<LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+<P><STRONG><a name="[68]"></a>Paint_DrawRectangle</STRONG> (Thumb, 172 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawRectangle))
+<BR><BR>[Stack]<UL><LI>Max Depth = 176<LI>Call Chain = Paint_DrawRectangle &rArr; Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[100]"></a>HAL_UART_AbortTransmit</STRONG> (Thumb, 78 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ff]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
-<LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[101]"></a>HAL_UART_AbortReceive</STRONG> (Thumb, 88 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[ff]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
-<LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[102]"></a>HAL_UART_AbortCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[103]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort_IT
-<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxAbortCallback
-<LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxAbortCallback
+<P><STRONG><a name="[6a]"></a>Paint_DrawString_CN</STRONG> (Thumb, 398 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawString_CN))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawString_CN &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[103]"></a>HAL_UART_Abort_IT</STRONG> (Thumb, 188 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[102]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
 </UL>
-
-<P><STRONG><a name="[104]"></a>HAL_UART_AbortTransmitCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit_IT
-<LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxOnlyAbortCallback
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[105]"></a>HAL_UART_AbortTransmit_IT</STRONG> (Thumb, 78 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmitCpltCallback
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<P><STRONG><a name="[69]"></a>Paint_DrawString_EN</STRONG> (Thumb, 116 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawString_EN))
+<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[106]"></a>HAL_UART_AbortReceiveCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive_IT
-<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxOnlyAbortCallback
+<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[107]"></a>HAL_UART_AbortReceive_IT</STRONG> (Thumb, 88 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[106]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceiveCpltCallback
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[109]"></a>HAL_UART_IRQHandler</STRONG> (Thumb, 342 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[f8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxCpltCallback
-<LI><a href="#[f6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
-<LI><a href="#[f5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
-<LI><a href="#[108]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Receive_IT
-<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+<P><STRONG><a name="[63]"></a>Paint_NewImage</STRONG> (Thumb, 56 bytes, Stack size 16 bytes, gui_paint.o(i.Paint_NewImage))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_NewImage
 </UL>
-
-<P><STRONG><a name="[151]"></a>HAL_LIN_SendBreak</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[152]"></a>HAL_MultiProcessor_EnterMuteMode</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[153]"></a>HAL_MultiProcessor_ExitMuteMode</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[154]"></a>HAL_HalfDuplex_EnableTransmitter</STRONG> (Thumb, 66 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[155]"></a>HAL_HalfDuplex_EnableReceiver</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[156]"></a>HAL_UART_GetState</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[157]"></a>HAL_UART_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-
-<P><STRONG><a name="[113]"></a>__aeabi_llsr</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[b0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
-<LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[158]"></a>_ll_ushift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED)
-
-<P><STRONG><a name="[10b]"></a>__aeabi_memset</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[10c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_memset$wrapper
-<LI><a href="#[10a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
+<P><STRONG><a name="[64]"></a>Paint_SelectImage</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, gui_paint.o(i.Paint_SelectImage))
+<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[159]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[15a]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[10a]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+<P><STRONG><a name="[87]"></a>Paint_SetPixel</STRONG> (Thumb, 238 bytes, Stack size 16 bytes, gui_paint.o(i.Paint_SetPixel))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[6d]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
-<LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[15b]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[10c]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+<BR>[Called By]<UL><LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
 </UL>
 
-<P><STRONG><a name="[b4]"></a>__aeabi_fmul</STRONG> (Thumb, 100 bytes, Stack size 8 bytes, fmul.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<P><STRONG><a name="[8]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.PendSV_Handler))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[10d]"></a>__aeabi_dadd</STRONG> (Thumb, 322 bytes, Stack size 48 bytes, dadd.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[10f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_lasr
-<LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
-<LI><a href="#[111]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
-<LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<P><STRONG><a name="[6]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.SVC_Handler))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[b2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
-<LI><a href="#[112]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
+<P><STRONG><a name="[9]"></a>SysTick_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.SysTick_Handler))
+<BR><BR>[Calls]<UL><LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_IncTick
 </UL>
-
-<P><STRONG><a name="[112]"></a>__aeabi_dsub</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dadd.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[b2]"></a>__aeabi_drsub</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dadd.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<P><STRONG><a name="[8b]"></a>SystemClock_Config</STRONG> (Thumb, 88 bytes, Stack size 72 bytes, main.o(i.SystemClock_Config))
+<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = SystemClock_Config &rArr; HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
+<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
 </UL>
-
-<P><STRONG><a name="[b1]"></a>__aeabi_i2d</STRONG> (Thumb, 34 bytes, Stack size 16 bytes, dflti.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-</UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[b5]"></a>__aeabi_f2iz</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, ffixi.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<P><STRONG><a name="[47]"></a>SystemInit</STRONG> (Thumb, 60 bytes, Stack size 0 bytes, system_stm32f1xx.o(i.SystemInit))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
 </UL>
-
-<P><STRONG><a name="[b0]"></a>__aeabi_d2iz</STRONG> (Thumb, 62 bytes, Stack size 16 bytes, dfixi.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[113]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+<P><STRONG><a name="[5]"></a>UsageFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.UsageFault_Handler))
+<BR><BR>[Calls]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<BR>[Called By]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
 </UL>
-
-<P><STRONG><a name="[b3]"></a>__aeabi_d2f</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, d2f.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[114]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_float_round
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<P><STRONG><a name="[8e]"></a>__0printf$3</STRONG> (Thumb, 22 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
 </UL>
 
-<P><STRONG><a name="[15c]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
-
-<P><STRONG><a name="[118]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[117]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
-</UL>
+<P><STRONG><a name="[9c]"></a>__1printf$3</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
 
-<P><STRONG><a name="[10e]"></a>__aeabi_llsl</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-<LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<P><STRONG><a name="[5e]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = __2printf
 </UL>
-
-<P><STRONG><a name="[15d]"></a>_ll_shift_l</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED)
-
-<P><STRONG><a name="[10f]"></a>__aeabi_lasr</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, llsshr.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
+<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HardFault_Handler
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
 </UL>
 
-<P><STRONG><a name="[15e]"></a>_ll_sshift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llsshr.o(.text), UNUSED)
+<P><STRONG><a name="[9d]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
 
-<P><STRONG><a name="[15f]"></a>__I$use$fp</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, iusefp.o(.text), UNUSED)
+<P><STRONG><a name="[9e]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
 
-<P><STRONG><a name="[114]"></a>_float_round</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, fepilogue.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[b3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2f
-</UL>
-
-<P><STRONG><a name="[160]"></a>_float_epilogue</STRONG> (Thumb, 92 bytes, Stack size 4 bytes, fepilogue.o(.text), UNUSED)
-
-<P><STRONG><a name="[111]"></a>_double_round</STRONG> (Thumb, 30 bytes, Stack size 8 bytes, depilogue.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
-<LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
-</UL>
+<P><STRONG><a name="[9f]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
 
-<P><STRONG><a name="[110]"></a>_double_epilogue</STRONG> (Thumb, 156 bytes, Stack size 32 bytes, depilogue.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[113]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
-<LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
-<LI><a href="#[111]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
+<P><STRONG><a name="[49]"></a>fputc</STRONG> (Thumb, 20 bytes, Stack size 16 bytes, usart.o(i.fputc))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = fputc &rArr; HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[b1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_i2d
-<LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+<BR>[Calls]<UL><LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
 </UL>
-
-<P><STRONG><a name="[69]"></a>__scatterload</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text))
-<BR><BR>[Calls]<UL><LI><a href="#[115]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main_after_scatterload
+<BR>[Address Reference Count : 1]<UL><LI> printf3.o(i.__0printf$3)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
+<P><STRONG><a name="[6d]"></a>free</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, malloc.o(i.free))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = free
 </UL>
-
-<P><STRONG><a name="[161]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
-
-<P><STRONG><a name="[116]"></a>__0printf$3</STRONG> (Thumb, 22 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[117]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[162]"></a>__1printf$3</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
-
-<P><STRONG><a name="[6b]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = __2printf
-</UL>
-<BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
-<LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
-<LI><a href="#[aa]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
-<LI><a href="#[a9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
-<LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetMirroring
-<LI><a href="#[a3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetScale
-<LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetRotate
-<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HardFault_Handler
-<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, main.o(i.main))
+<BR><BR>[Stack]<UL><LI>Max Depth = 736<LI>Call Chain = main &rArr; EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-
-<P><STRONG><a name="[163]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
-
-<P><STRONG><a name="[164]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
-
-<P><STRONG><a name="[165]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
-
-<P><STRONG><a name="[8c]"></a>free</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, malloc.o(i.free))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = free
+<BR>[Calls]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
 </UL>
-
-<P><STRONG><a name="[84]"></a>malloc</STRONG> (Thumb, 92 bytes, Stack size 20 bytes, malloc.o(i.malloc))
+<P><STRONG><a name="[62]"></a>malloc</STRONG> (Thumb, 92 bytes, Stack size 20 bytes, malloc.o(i.malloc))
 <BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = malloc
 </UL>
-<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 <P>
 <H3>
 Local Symbols
 </H3>
-<P><STRONG><a name="[8e]"></a>EPD_5in79_Reset</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = EPD_5in79_Reset &rArr; HAL_Delay
-</UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-</UL>
-<BR>[Called By]<UL><LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_4Gray
-<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Partial
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Fast
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init
-</UL>
-
-<P><STRONG><a name="[91]"></a>EPD_5in79_SendCommand</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_5in79_SendCommand &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
-<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-</UL>
-<BR>[Called By]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay_Partial
-<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay
-<LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Partial
-<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base_color
-<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base
-<LI><a href="#[98]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display
-<LI><a href="#[97]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear_Black
-<LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_4Gray
-<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Partial
-<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Lut
-<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Sleep
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Fast
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init
-<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Fast
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear
-</UL>
-
-<P><STRONG><a name="[92]"></a>EPD_5in79_SendData</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
-<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-</UL>
-<BR>[Called By]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay_Partial
-<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay
-<LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Partial
-<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base_color
-<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base
-<LI><a href="#[98]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display
-<LI><a href="#[97]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear_Black
-<LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_4Gray
-<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Partial
-<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Lut
-<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay_4GRAY
-<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_TurnOnDisplay
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Sleep
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_Fast
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init
-<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Fast
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear
-</UL>
-
-<P><STRONG><a name="[96]"></a>EPD_5in79_TurnOnDisplay</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, epd_5in79.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_5in79_TurnOnDisplay &rArr; EPD_5in79_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-</UL>
-<BR>[Called By]<UL><LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base_color
-<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display_Base
-<LI><a href="#[98]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Display
-<LI><a href="#[97]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear_Black
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Clear
-</UL>
-
-<P><STRONG><a name="[9d]"></a>EPD_5in79_TurnOnDisplay_4GRAY</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_ReadBusy
-<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-</UL>
-<BR>[Called By]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay_Partial
-<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_4GrayDisplay
-</UL>
-
-<P><STRONG><a name="[95]"></a>EPD_5in79_Lut</STRONG> (Thumb, 88 bytes, Stack size 16 bytes, epd_5in79.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendData
-<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_SendCommand
-</UL>
-<BR>[Called By]<UL><LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_5in79_Init_4Gray
-</UL>
-
-<P><STRONG><a name="[b9]"></a>SPI_WaitFlagStateUntilTimeout</STRONG> (Thumb, 180 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[56]"></a>EPD_13IN3B_SendCommand</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_13in3b.o(i.EPD_13IN3B_SendCommand))
+<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_13IN3B_SendCommand &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
+<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
+<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
 </UL>
 
-<P><STRONG><a name="[bc]"></a>SPI_EndRxTransaction</STRONG> (Thumb, 92 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[57]"></a>EPD_13IN3B_SendData</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_13in3b.o(i.EPD_13IN3B_SendData))
+<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
-<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
-<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
+<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
+<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
 </UL>
 
-<P><STRONG><a name="[bf]"></a>SPI_CloseTx_ISR</STRONG> (Thumb, 120 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[58]"></a>EPD_13IN3B_TurnOnDisplay</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_TurnOnDisplay))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[c1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxCpltCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
+<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
 </UL>
-<BR>[Called By]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_TxISR_16BIT
-<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_TxISR_8BIT
+<BR>[Called By]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
+<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
 </UL>
 
-<P><STRONG><a name="[4a]"></a>SPI_TxISR_8BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_TxISR_8BIT &rArr; SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[49]"></a>SPI_TxISR_16BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_TxISR_16BIT &rArr; SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[c2]"></a>SPI_CloseRx_ISR</STRONG> (Thumb, 76 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
-<LI><a href="#[c3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_RxISR_16BIT
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_RxISR_8BIT
-</UL>
-
-<P><STRONG><a name="[50]"></a>SPI_RxISR_8BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_RxISR_8BIT &rArr; SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[4f]"></a>SPI_RxISR_16BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_RxISR_16BIT &rArr; SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[c4]"></a>SPI_CloseRxTx_ISR</STRONG> (Thumb, 140 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[7d]"></a>SPI_EndRxTxTransaction</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(i.SPI_EndRxTxTransaction))
+<BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[c5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxCpltCallback
-<LI><a href="#[c3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesRxISR_16BIT
-<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesTxISR_16BIT
-<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesRxISR_8BIT
-<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesTxISR_8BIT
+<BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
 </UL>
 
-<P><STRONG><a name="[4e]"></a>SPI_2linesTxISR_8BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesTxISR_8BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[4d]"></a>SPI_2linesRxISR_8BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesRxISR_8BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[4c]"></a>SPI_2linesTxISR_16BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesTxISR_16BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[4b]"></a>SPI_2linesRxISR_16BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesRxISR_16BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[53]"></a>SPI_DMAError</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAError
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[52]"></a>SPI_DMATransmitCplt</STRONG> (Thumb, 100 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMATransmitCplt &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[c1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxCpltCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[51]"></a>SPI_DMAHalfTransmitCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfTransmitCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxHalfCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[57]"></a>SPI_DMAReceiveCplt</STRONG> (Thumb, 106 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_DMAReceiveCplt &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
-<LI><a href="#[c3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[56]"></a>SPI_DMAHalfReceiveCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfReceiveCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[cb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxHalfCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[55]"></a>SPI_DMATransmitReceiveCplt</STRONG> (Thumb, 90 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMATransmitReceiveCplt &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[c5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxCpltCallback
-<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[54]"></a>SPI_DMAHalfTransmitReceiveCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfTransmitReceiveCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[cc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxHalfCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[59]"></a>SPI_AbortRx_ISR</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_AbortRx_ISR
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[58]"></a>SPI_AbortTx_ISR</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[5b]"></a>SPI_DMARxAbortCallback</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMARxAbortCallback &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
-<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
-<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[5a]"></a>SPI_DMATxAbortCallback</STRONG> (Thumb, 106 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMATxAbortCallback
-</UL>
-<BR>[Calls]<UL><LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[5c]"></a>SPI_DMAAbortOnError</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAAbortOnError
-</UL>
-<BR>[Calls]<UL><LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
-</UL>
-<P><STRONG><a name="[bb]"></a>SPI_EndRxTxTransaction</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[89]"></a>SPI_WaitFlagStateUntilTimeout</STRONG> (Thumb, 180 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(i.SPI_WaitFlagStateUntilTimeout))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
-<LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
-<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
-<LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
-<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-
-<P><STRONG><a name="[e6]"></a>DMA_SetConfig</STRONG> (Thumb, 42 bytes, Stack size 12 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[e5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start
-<LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<BR>[Called By]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
 </UL>
 
-<P><STRONG><a name="[e8]"></a>__NVIC_SetPriority</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[d7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
-<LI><a href="#[d8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
+<P><STRONG><a name="[76]"></a>__NVIC_SetPriority</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(i.__NVIC_SetPriority))
+<BR><BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
 </UL>
 
-<P><STRONG><a name="[eb]"></a>UART_SetConfig</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
+<P><STRONG><a name="[80]"></a>UART_SetConfig</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(i.UART_SetConfig))
 <BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UART_SetConfig
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ec]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK2Freq
-<LI><a href="#[ed]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK1Freq
+<BR>[Calls]<UL><LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK2Freq
+<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK1Freq
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
-<LI><a href="#[f0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MultiProcessor_Init
-<LI><a href="#[ef]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_LIN_Init
-<LI><a href="#[ee]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_HalfDuplex_Init
+<BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
 </UL>
 
-<P><STRONG><a name="[f2]"></a>UART_WaitOnFlagUntilTimeout</STRONG> (Thumb, 98 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text))
+<P><STRONG><a name="[82]"></a>UART_WaitOnFlagUntilTimeout</STRONG> (Thumb, 100 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(i.UART_WaitOnFlagUntilTimeout))
 <BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = UART_WaitOnFlagUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-</UL>
-<BR>[Called By]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
-<LI><a href="#[f3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive
-</UL>
-
-<P><STRONG><a name="[5f]"></a>UART_DMAError</STRONG> (Thumb, 74 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UART_DMAError
-</UL>
-<BR>[Calls]<UL><LI><a href="#[f6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
-<LI><a href="#[f4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndTxTransfer
-<LI><a href="#[f5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[5e]"></a>UART_DMATxHalfCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxHalfCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[f7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxHalfCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-<P><STRONG><a name="[5d]"></a>UART_DMATransmitCplt</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATransmitCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[f8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[61]"></a>UART_DMARxHalfCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxHalfCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[fa]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxHalfCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[60]"></a>UART_DMAReceiveCplt</STRONG> (Thumb, 60 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMAReceiveCplt
-</UL>
-<BR>[Calls]<UL><LI><a href="#[fb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[63]"></a>UART_DMARxAbortCallback</STRONG> (Thumb, 42 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxAbortCallback
-</UL>
-<BR>[Calls]<UL><LI><a href="#[102]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[62]"></a>UART_DMATxAbortCallback</STRONG> (Thumb, 42 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxAbortCallback
-</UL>
-<BR>[Calls]<UL><LI><a href="#[102]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[64]"></a>UART_DMATxOnlyAbortCallback</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxOnlyAbortCallback
-</UL>
-<BR>[Calls]<UL><LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmitCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[65]"></a>UART_DMARxOnlyAbortCallback</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxOnlyAbortCallback
-</UL>
-<BR>[Calls]<UL><LI><a href="#[106]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceiveCpltCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[66]"></a>UART_DMAAbortOnError</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMAAbortOnError
-</UL>
-<BR>[Calls]<UL><LI><a href="#[f6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
-</UL>
-<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
-</UL>
-<P><STRONG><a name="[108]"></a>UART_Receive_IT</STRONG> (Thumb, 140 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[fb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxCpltCallback
-</UL>
-<BR>[Called By]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
-</UL>
-
-<P><STRONG><a name="[f5]"></a>UART_EndRxTransfer</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
-<LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
-</UL>
-
-<P><STRONG><a name="[f4]"></a>UART_EndTxTransfer</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
-<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
+<BR>[Called By]<UL><LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
 </UL>
 
-<P><STRONG><a name="[117]"></a>_printf_core</STRONG> (Thumb, 436 bytes, Stack size 96 bytes, printf3.o(i._printf_core), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[118]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
+<P><STRONG><a name="[8f]"></a>_printf_core</STRONG> (Thumb, 436 bytes, Stack size 96 bytes, printf3.o(i._printf_core), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[90]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
 </UL>
-<BR>[Called By]<UL><LI><a href="#[116]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$3
+<BR>[Called By]<UL><LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$3
 </UL>
 <P>
 <H3>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 661 - 144
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.map


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

@@ -580,7 +580,7 @@ ARM Macro Assembler    Page 9
               00000000 
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=epd-demo\startup_stm32f103xe.d -oepd-demo\startup_stm32f103xe.o -I
-.\RTE\_EPD_5in79b_test -ID:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Inclu
+.\RTE\_EPD_13in3b_test -ID:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Inclu
 de -ID:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include --predefine=
 "__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 526" --predefine="_RTE_
 

+ 160 - 0
STM32/STM32-F103ZET6/User/Examples/EPD_13in3b_test.c

@@ -0,0 +1,160 @@
+/*****************************************************************************
+* | File      	:   EPD_13IN3B_test.c
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B) test demo
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+#
+# 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.
+#
+******************************************************************************/
+#include "EPD_Test.h"
+#include "EPD_13in3b.h"
+
+int EPD_test(void)
+{
+    printf("EPD_13IN3B_test Demo\r\n");
+    if(DEV_Module_Init()!=0){
+        return -1;
+    }
+
+    printf("e-Paper Init and Clear...\r\n");
+	EPD_13IN3B_Init();
+    EPD_13IN3B_Clear();
+
+
+    //Create a new image cache named IMAGE_BW and fill it with white
+    UBYTE *Image; // Red or Yellow
+    UDOUBLE Imagesize = ((EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1)) * EPD_13IN3B_HEIGHT;
+    if((Image = (UBYTE *)malloc(Imagesize/2)) == NULL) {
+        printf("Failed to apply for black memory...\r\n");
+        return -1;
+    }
+
+    printf("NewImage:Image\r\n");
+    Paint_NewImage(Image, EPD_13IN3B_WIDTH, EPD_13IN3B_HEIGHT/2, 0, WHITE);
+
+    //Select Image
+    Paint_SelectImage(Image);
+    Paint_Clear(WHITE);
+	
+#if 1   // show bmp
+    EPD_13IN3B_Display_Base(gImage_13in3b_b, gImage_13in3b_r);
+    DEV_Delay_ms(3000);
+#endif
+
+#if 1  // Drawing on the image
+    /*Horizontal screen*/
+    //1.Draw black image
+    EPD_13IN3B_Init();
+    Paint_NewImage(Image, EPD_13IN3B_WIDTH, EPD_13IN3B_HEIGHT/2, 0, WHITE);
+    printf("Draw black image\r\n");
+    Paint_SelectImage(Image);
+    Paint_Clear(WHITE);
+    Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 110, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);      
+    Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);    
+    Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
+    Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
+    EPD_13IN3B_Display_WritePicture(Image, 0);
+    Paint_Clear(WHITE);
+    EPD_13IN3B_Display_WritePicture(Image, 1);
+    
+    
+    //2.Draw red image
+    printf("Draw red image\r\n");
+    Paint_SelectImage(Image);
+    Paint_Clear(WHITE);
+    Paint_DrawCircle(160, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawCircle(210, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);  
+    Paint_DrawString_CN(130, 0,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
+    Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
+    Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
+    EPD_13IN3B_Display_WritePicture(Image, 2);
+    Paint_Clear(WHITE);
+    EPD_13IN3B_Display_WritePicture(Image, 3);
+    printf("EPD_Display\r\n");
+    DEV_Delay_ms(2000);
+#endif
+
+#if 0
+	printf("Partial refresh\r\n");
+    EPD_13IN3B_Clear_Base();
+    Paint_NewImage(Image, Font20.Width * 7, Font20.Height, 0, WHITE);
+    Debug("Partial refresh\r\n");
+    Paint_SelectImage(Image);
+    Paint_Clear(WHITE);
+	
+    PAINT_TIME sPaint_time;
+    sPaint_time.Hour = 12;
+    sPaint_time.Min = 34;
+    sPaint_time.Sec = 56;
+    UBYTE num = 10;
+    for (;;) {
+        sPaint_time.Sec = sPaint_time.Sec + 1;
+        if (sPaint_time.Sec == 60) {
+            sPaint_time.Min = sPaint_time.Min + 1;
+            sPaint_time.Sec = 0;
+            if (sPaint_time.Min == 60) {
+                sPaint_time.Hour =  sPaint_time.Hour + 1;
+                sPaint_time.Min = 0;
+                if (sPaint_time.Hour == 24) {
+                    sPaint_time.Hour = 0;
+                    sPaint_time.Min = 0;
+                    sPaint_time.Sec = 0;
+                }
+            }
+        }
+        Paint_ClearWindows(0, 0, Font20.Width * 7, Font20.Height, WHITE);
+        Paint_DrawTime(0, 0, &sPaint_time, &Font20, WHITE, BLACK);
+        num = num - 1;
+        if(num == 0) {
+            break;
+        }
+		EPD_13IN3B_Display_Partial(Image, 10, 130, 10 + Font20.Width * 7, 130 + Font20.Height);
+		DEV_Delay_ms(500);//Analog clock 1s
+    }
+#endif
+
+	printf("Clear...\r\n");
+    EPD_13IN3B_Init();
+    EPD_13IN3B_Clear();
+	
+    printf("Goto Sleep...\r\n");
+    EPD_13IN3B_Sleep();
+    free(Image);
+    Image = NULL;
+    DEV_Delay_ms(2000);//important, at least 2s
+    // close 5V
+    printf("close 5V, Module enters 0 power consumption ...\r\n");
+    DEV_Module_Exit();
+    return 0;
+}
+

+ 83 - 4
STM32/STM32-F103ZET6/User/Examples/EPD_13in3k_test.c

@@ -54,7 +54,7 @@ int EPD_test(void)
 	Paint_Clear(WHITE);
 	
 
-#if 1  //show image for array  
+#if 0  //show image for array  
     Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT/2, 0, WHITE);  
     printf("show image for array\r\n");
     Paint_SelectImage(BlackImage);
@@ -69,7 +69,7 @@ int EPD_test(void)
     DEV_Delay_ms(3000);
 #endif
 
-#if 1  // Drawing on the image
+#if 0  // Drawing on the image
 	Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH, EPD_13IN3K_HEIGHT/2, 0, WHITE);  	
     printf("Drawing\r\n");
     //1.Select Image
@@ -103,13 +103,92 @@ int EPD_test(void)
     Paint_DrawString_CN(130, 0,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
     Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
 	
-    EPD_13IN3K_WritePicture(BlackImage, 0);
+    EPD_13IN3K_WritePicture_Base(BlackImage, 0);
     Paint_Clear(WHITE);
-    EPD_13IN3K_WritePicture(BlackImage, 1);
+    EPD_13IN3K_WritePicture_Base(BlackImage, 1);
     DEV_Delay_ms(3000);
 #endif
 
+#if 0
+    printf("Partial refresh\r\n");
+    // If you didn't use the EPD_13IN3K_Display_Base() function to refresh the image before,
+    // use the EPD_13IN3K_color_Base() function to refresh the background color, 
+    // otherwise the background color will be garbled 
+    EPD_13IN3K_Init_Part();
+    // EPD_13IN3K_color_Base(WHITE);   
+	printf("Partial refresh\r\n");
+    Paint_NewImage(BlackImage, 200, 50, 0, WHITE);
+	PAINT_TIME sPaint_time;
+    sPaint_time.Hour = 12;
+    sPaint_time.Min = 34;
+    sPaint_time.Sec = 56;
+    UBYTE num = 10;
+	for (;;) {
+		sPaint_time.Sec = sPaint_time.Sec + 1;
+		if (sPaint_time.Sec == 60) {
+			sPaint_time.Min = sPaint_time.Min + 1;
+			sPaint_time.Sec = 0;
+			if (sPaint_time.Min == 60) {
+				sPaint_time.Hour =  sPaint_time.Hour + 1;
+				sPaint_time.Min = 0;
+				if (sPaint_time.Hour == 24) {
+					sPaint_time.Hour = 0;
+					sPaint_time.Min = 0;
+					sPaint_time.Sec = 0;
+				}
+			}
+		}
+		Paint_Clear(WHITE);
+		Paint_DrawTime(20, 10, &sPaint_time, &Font20, WHITE, BLACK);
+		EPD_13IN3K_Display_Part(BlackImage, 10, 150, 200, 50);
+		DEV_Delay_ms(500);//Analog clock 1s
+		num = num - 1;
+		if(num == 0) {
+			break;
+		}
+    }
+#endif
+    
+#if 1 // show image for array
+    free(BlackImage);
+    printf("show Gray------------------------\r\n");
+    Imagesize = ((EPD_13IN3K_WIDTH % 4 == 0)? (EPD_13IN3K_WIDTH / 4 ): (EPD_13IN3K_WIDTH / 4 + 1)) * EPD_13IN3K_HEIGHT;
+    if((BlackImage = (UBYTE *)malloc(Imagesize/4)) == NULL) {
+        printf("Failed to apply for black memory...\r\n");
+        return -1;
+    }
+    EPD_13IN3K_Init_4GRAY();
+    printf("4 grayscale display\r\n");
+    Paint_NewImage(BlackImage, EPD_13IN3K_WIDTH/2, EPD_13IN3K_HEIGHT/2, 0, WHITE);
+    Paint_SetScale(4);
+    Paint_Clear(0xff);
+    
+    Paint_DrawPoint(10, 80, GRAY4, DOT_PIXEL_1X1, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 90, GRAY4, DOT_PIXEL_2X2, DOT_STYLE_DFT);
+    Paint_DrawPoint(10, 100, GRAY4, DOT_PIXEL_3X3, DOT_STYLE_DFT);
+    Paint_DrawLine(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawLine(70, 70, 20, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
+    Paint_DrawRectangle(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawRectangle(80, 70, 130, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawCircle(45, 95, 20, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
+    Paint_DrawCircle(105, 95, 20, GRAY2, DOT_PIXEL_1X1, DRAW_FILL_FULL);
+    Paint_DrawLine(85, 95, 125, 95, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawLine(105, 75, 105, 115, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
+    Paint_DrawString_EN(10, 0, "waveshare", &Font16, GRAY4, GRAY1);
+    Paint_DrawString_EN(10, 20, "hello world", &Font12, GRAY3, GRAY1);
+    Paint_DrawNum(10, 33, 123456789, &Font12, GRAY4, GRAY2);
+    Paint_DrawNum(10, 50, 987654321, &Font16, GRAY1, GRAY4);
+    Paint_DrawString_CN(150, 0,"ÄãºÃabc", &Font12CN, GRAY4, GRAY1);
+    Paint_DrawString_CN(150, 20,"ÄãºÃabc", &Font12CN, GRAY3, GRAY2);
+    Paint_DrawString_CN(150, 40,"ÄãºÃabc", &Font12CN, GRAY2, GRAY3);
+    Paint_DrawString_CN(150, 60,"ÄãºÃabc", &Font12CN, GRAY1, GRAY4);
+    Paint_DrawString_CN(10, 130, "΢ѩµç×Ó", &Font24CN, GRAY1, GRAY4);
+    EPD_13IN3K_4GrayDisplay(BlackImage);
+    DEV_Delay_ms(3000);
+
+#endif
 	printf("Clear...\r\n");
+    EPD_13IN3K_Init();
     EPD_13IN3K_Clear();
 	
     printf("Goto Sleep...\r\n");

+ 2 - 0
STM32/STM32-F103ZET6/User/Examples/ImageData.h

@@ -46,6 +46,8 @@ extern const unsigned char gImage_7in3f[];
 extern const unsigned char gImage_7in3g[];
 
 extern const unsigned char gImage_13in3k[];
+extern const unsigned char gImage_13in3b_b[];
+extern const unsigned char gImage_13in3b_r[];
 
 extern const unsigned char gImage_2in66g[];
 

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 5104
STM32/STM32-F103ZET6/User/Examples/ImageData2.c


+ 463 - 0
STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3b.c

@@ -0,0 +1,463 @@
+/*****************************************************************************
+* | File      	:  	EPD_13in3b.c
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+* -----------------------------------------------------------------------------
+#
+# 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.
+#
+******************************************************************************/
+#include "EPD_13in3b.h"
+#include "Debug.h"
+
+/******************************************************************************
+function :	Software reset
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_Reset(void)
+{
+    DEV_Digital_Write(EPD_RST_PIN, 1);
+    DEV_Delay_ms(100);
+    DEV_Digital_Write(EPD_RST_PIN, 0);
+    DEV_Delay_ms(2);
+    DEV_Digital_Write(EPD_RST_PIN, 1);
+    DEV_Delay_ms(100);
+}
+
+/******************************************************************************
+function :	send command
+parameter:
+     Reg : Command register
+******************************************************************************/
+static void EPD_13IN3B_SendCommand(UBYTE Reg)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 0);
+    DEV_Digital_Write(EPD_CS_PIN, 0);
+    DEV_SPI_WriteByte(Reg);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	send data
+parameter:
+    Data : Write data
+******************************************************************************/
+static void EPD_13IN3B_SendData(UBYTE Data)
+{
+    DEV_Digital_Write(EPD_DC_PIN, 1);
+    DEV_Digital_Write(EPD_CS_PIN, 0);
+    DEV_SPI_WriteByte(Data);
+    DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+/******************************************************************************
+function :	Wait until the busy_pin goes LOW
+parameter:
+******************************************************************************/
+void EPD_13IN3B_ReadBusy(void)
+{
+    Debug("e-Paper busy\r\n");
+	while(1)
+	{	 //=1 BUSY
+		if(DEV_Digital_Read(EPD_BUSY_PIN)==0) 
+			break;
+		DEV_Delay_ms(20);
+	}
+	DEV_Delay_ms(20);
+    Debug("e-Paper busy release\r\n");
+}
+
+/******************************************************************************
+function :	Turn On Display
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_TurnOnDisplay(void)
+{
+	EPD_13IN3B_SendCommand(0x22); //Display Update Control
+	EPD_13IN3B_SendData(0xF7);
+	EPD_13IN3B_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3B_ReadBusy();
+}
+
+static void EPD_13IN3B_TurnOnDisplay_Part(void)
+{
+	EPD_13IN3B_SendCommand(0x22); //Display Update Control
+	EPD_13IN3B_SendData(0xFF);
+	EPD_13IN3B_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3B_ReadBusy();
+}
+
+/******************************************************************************
+function :	Setting the display window
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
+{
+    EPD_13IN3B_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendData(Xend & 0xFF);
+    EPD_13IN3B_SendData((Xend>>8) & 0x03);
+	
+    EPD_13IN3B_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
+    EPD_13IN3B_SendData(Ystart & 0xFF);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+    EPD_13IN3B_SendData(Yend & 0xFF);
+    EPD_13IN3B_SendData((Yend>>8) & 0x03);
+}
+
+/******************************************************************************
+function :	Set Cursor
+parameter:
+******************************************************************************/
+static void EPD_13IN3B_SetCursor(UWORD Xstart, UWORD Ystart)
+{
+    EPD_13IN3B_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+
+    EPD_13IN3B_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
+    EPD_13IN3B_SendData(Ystart & 0xFF);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+}
+
+/******************************************************************************
+function :	Initialize the e-Paper register
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Init(void)
+{
+	EPD_13IN3B_Reset();
+	DEV_Delay_ms(100);
+
+	EPD_13IN3B_ReadBusy();   
+	EPD_13IN3B_SendCommand(0x12);
+	EPD_13IN3B_ReadBusy();   
+
+	EPD_13IN3B_SendCommand(0x0C);    
+	EPD_13IN3B_SendData(0xAE);
+	EPD_13IN3B_SendData(0xC7);
+	EPD_13IN3B_SendData(0xC3);
+	EPD_13IN3B_SendData(0xC0);
+	EPD_13IN3B_SendData(0x80);
+
+	EPD_13IN3B_SendCommand(0x01); 
+	EPD_13IN3B_SendData((EPD_13IN3B_HEIGHT-1)%256);
+	EPD_13IN3B_SendData((EPD_13IN3B_HEIGHT-1)/256);
+	EPD_13IN3B_SendData(0x00);
+
+	EPD_13IN3B_SendCommand(0x11);    
+	EPD_13IN3B_SendData(0x03); 
+
+	EPD_13IN3B_SetWindows(0, 0, EPD_13IN3B_WIDTH-1, EPD_13IN3B_HEIGHT-1);
+
+	EPD_13IN3B_SendCommand(0x3C); 
+	EPD_13IN3B_SendData(0x01);
+
+	EPD_13IN3B_SendCommand(0x18); 
+	EPD_13IN3B_SendData(0x80);
+
+    // EPD_13IN3B_SendCommand(0x22);  
+    // EPD_13IN3B_SendData(0xB1); 
+    // EPD_13IN3B_SendCommand(0x20); 
+	
+	EPD_13IN3B_SetCursor(0, 0);
+	
+	EPD_13IN3B_ReadBusy();
+}
+/******************************************************************************
+function :	Clear screen
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Clear(void)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3B_HEIGHT;
+	UWORD width = EPD_13IN3B_WIDTH/8;	
+	
+	EPD_13IN3B_SendCommand(0x24); 
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3B_SendData(0xff);
+	}
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+    
+	EPD_13IN3B_TurnOnDisplay();
+}
+
+void EPD_13IN3B_Clear_Black(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+void EPD_13IN3B_Clear_Red(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0xFF);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(0xFF);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+void EPD_13IN3B_Clear_Base(void)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3B_HEIGHT;
+	UWORD width = EPD_13IN3B_WIDTH/8;	
+	
+	EPD_13IN3B_SendCommand(0x24); 
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3B_SendData(0xff);
+	}
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width; i++) {
+            EPD_13IN3B_SendData(0x00);
+        }
+    }
+    
+	EPD_13IN3B_TurnOnDisplay();
+    
+    EPD_13IN3B_SendCommand(0x26); 
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3B_SendData(0xff);
+	}
+}
+
+/******************************************************************************
+function :	Sends the image buffer in RAM to e-Paper and displays
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+}
+
+//Partial refresh of background display, this function is necessary, please do not delete it!!!
+void EPD_13IN3B_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+
+    EPD_13IN3B_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_13IN3B_TurnOnDisplay();
+
+    EPD_13IN3B_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_13IN3B_SendData(blackimage[i + j * Width]);
+        }
+    }
+}
+
+void EPD_13IN3B_Display_WritePicture(const UBYTE *image, UBYTE Block)
+{
+    UWORD Width, Height;
+    Width = (EPD_13IN3B_WIDTH % 8 == 0)? (EPD_13IN3B_WIDTH / 8 ): (EPD_13IN3B_WIDTH / 8 + 1);
+    Height = EPD_13IN3B_HEIGHT;
+    
+    if(Block == 0)
+    {
+        EPD_13IN3B_SendCommand(0x24);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                EPD_13IN3B_SendData(image[i + j * Width]);
+            }
+        }
+    }
+    else if(Block == 1)
+    {
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                EPD_13IN3B_SendData(image[i + j * Width]);
+            }
+        }
+    }
+    
+    if(Block == 2)
+    {
+        EPD_13IN3B_SendCommand(0x26);
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                EPD_13IN3B_SendData(~image[i + j * Width]);
+            }
+        }
+    }
+    else if(Block == 3)
+    {
+        for (UWORD j = 0; j < Height/2; j++) {
+            for (UWORD i = 0; i < Width; i++) {
+                EPD_13IN3B_SendData(~image[i + j * Width]);
+            }
+        }
+        EPD_13IN3B_TurnOnDisplay();
+    }
+}
+
+//Partial refresh display
+void EPD_13IN3B_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
+{
+    if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend / 8;
+    }
+    else
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
+    }
+    
+
+    UDOUBLE i, Width;
+	Width = Xend -  Xstart;
+	UDOUBLE IMAGE_COUNTER = Width * (Yend-Ystart);
+    printf("IMAGE_COUNTER = %d\r\n", IMAGE_COUNTER);
+
+    Xstart = Xstart * 8;
+	Xend =Xend * 8 - 1;
+	Yend -= 1;	
+
+    EPD_13IN3B_SendCommand(0x3C);    
+    EPD_13IN3B_SendData(0x80);
+
+    EPD_13IN3B_SendCommand(0x44);
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendData(Xend & 0xFF);
+    EPD_13IN3B_SendData((Xend>>8) & 0x03);
+	
+    EPD_13IN3B_SendCommand(0x45);   
+    EPD_13IN3B_SendData(Ystart & 0xff);   
+    EPD_13IN3B_SendData((Ystart>>8) & 0x01);  
+    EPD_13IN3B_SendData(Yend & 0xff);
+    EPD_13IN3B_SendData((Yend>>8) & 0x03); 
+
+    EPD_13IN3B_SendCommand(0x4E); 
+    EPD_13IN3B_SendData(Xstart & 0xFF);
+    EPD_13IN3B_SendData((Xstart>>8) & 0x03);
+    EPD_13IN3B_SendCommand(0x4F);   
+    EPD_13IN3B_SendData(Ystart & 0xff);
+    EPD_13IN3B_SendData((Ystart>>8) & 0x03);
+
+    EPD_13IN3B_SendCommand(0x24); 
+    for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3B_SendData(Image[i]);
+	}
+
+	EPD_13IN3B_TurnOnDisplay_Part();
+
+    EPD_13IN3B_SendCommand(0x26); 
+    for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3B_SendData(Image[i]);
+	}
+
+}
+
+/******************************************************************************
+function :	Enter sleep mode
+parameter:
+******************************************************************************/
+void EPD_13IN3B_Sleep(void)
+{
+	EPD_13IN3B_SendCommand(0x10); 
+	EPD_13IN3B_SendData(0x03); 
+	DEV_Delay_ms(100);
+}

+ 52 - 0
STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3b.h

@@ -0,0 +1,52 @@
+/*****************************************************************************
+* | File      	:   EPD_13in3b.h
+* | Author      :   Waveshare team
+* | Function    :   13.3inch e-paper (B)
+* | Info        :
+*----------------
+* |	This version:   V1.0
+* | Date        :   2024-04-08
+* | Info        :
+* -----------------------------------------------------------------------------
+#
+# 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 __EPD_13IN3B_B_H_
+#define __EPD_13IN3B_B_H_
+
+#include "DEV_Config.h"
+
+// Display resolution
+#define EPD_13IN3B_WIDTH       960
+#define EPD_13IN3B_HEIGHT      680
+
+void EPD_13IN3B_Init(void);
+void EPD_13IN3B_Clear(void);
+void EPD_13IN3B_Clear_Black(void);
+void EPD_13IN3B_Clear_Red(void);
+void EPD_13IN3B_Clear_Base(void);
+void EPD_13IN3B_Display(const UBYTE *blackimage, const UBYTE *ryimage);
+void EPD_13IN3B_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage);
+void EPD_13IN3B_Display_WritePicture(const UBYTE *image, UBYTE Block);
+void EPD_13IN3B_Display_Base_White(void);
+void EPD_13IN3B_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
+void EPD_13IN3B_Sleep(void);
+
+#endif

+ 357 - 1
STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3k.c

@@ -31,6 +31,49 @@
 #include "EPD_13in3k.h"
 #include "Debug.h"
 
+const unsigned char Lut_Partial[]={										
+0x15,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x2A,	0x88,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x15,	0x44,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x08,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x01,	0x01,	0x01,	0x00,						
+0x0A,	0x00,	0x05,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x00,	0x00,						
+0x00,	0x00,	0x00,	0x01,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x18,						
+0x00,	0x00,									
+};	
+
+const unsigned char LUT_DATA_4Gray[112] =    //112bytes
+{											
+0x80,	0x48,	0x4A,	0x22,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x0A,	0x48,	0x68,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x88,	0x48,	0x60,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0xA8,	0x48,	0x45,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	
+0x07,	0x23,	0x17,	0x02,	0x00,						
+0x05,	0x01,	0x05,	0x01,	0x02,						
+0x08,	0x02,	0x01,	0x04,	0x04,						
+0x00,	0x02,	0x00,	0x02,	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,	0x01,						
+0x22,	0x22,	0x22,	0x22,	0x22,						
+0x17,	0x41,	0xA8,	0x32,	0x30,						
+0x00,	0x00,	
+};
+
 /******************************************************************************
 function :	Software reset
 parameter:
@@ -100,6 +143,42 @@ static void EPD_13IN3K_TurnOnDisplay(void)
 	EPD_13IN3K_ReadBusy();
 }
 
+static void EPD_13IN3K_TurnOnDisplay_Part(void)
+{
+	EPD_13IN3K_SendCommand(0x22); //Display Update Control
+	EPD_13IN3K_SendData(0xCF);
+	EPD_13IN3K_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3K_ReadBusy();
+}
+
+static void EPD_13IN3K_TurnOnDisplay_4GRAY(void)
+{
+	EPD_13IN3K_SendCommand(0x22); //Display Update Control
+	EPD_13IN3K_SendData(0xC7);
+	EPD_13IN3K_SendCommand(0x20); //Activate Display Update Sequence
+	EPD_13IN3K_ReadBusy();
+}
+
+static void EPD_13IN3K_Lut(const UBYTE *LUT)
+{
+    unsigned int count;
+    EPD_13IN3K_SendCommand(0x32);
+    for(count = 0; count < 105 ; count++) {
+        EPD_13IN3K_SendData(LUT[count]);
+    }
+
+    EPD_13IN3K_SendCommand(0x03);
+	EPD_13IN3K_SendData(LUT[105]);
+
+	EPD_13IN3K_SendCommand(0x04);  
+	EPD_13IN3K_SendData(LUT[106]);
+	EPD_13IN3K_SendData(LUT[107]);
+	EPD_13IN3K_SendData(LUT[108]); 
+
+	EPD_13IN3K_SendCommand(0x2C);
+	EPD_13IN3K_SendData(LUT[109]);
+}
+
 /******************************************************************************
 function :	Setting the display window
 parameter:
@@ -179,6 +258,77 @@ void EPD_13IN3K_Init(void)
 	EPD_13IN3K_ReadBusy();
 }
 
+void EPD_13IN3K_Init_Part(void)
+{
+	EPD_13IN3K_Reset();
+	DEV_Delay_ms(100); 
+
+	EPD_13IN3K_SendCommand(0x3C);        // Border       Border setting 
+	EPD_13IN3K_SendData(0x80);
+
+    EPD_13IN3K_Lut(Lut_Partial);
+
+    EPD_13IN3K_SendCommand(0x37); 
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00); 
+    EPD_13IN3K_SendData(0x40);  
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);   
+    EPD_13IN3K_SendData(0x00);  
+    EPD_13IN3K_SendData(0x00);  
+
+    EPD_13IN3K_SendCommand(0x3C); 
+    EPD_13IN3K_SendData(0x80);   
+
+    EPD_13IN3K_SendCommand(0x22); 
+    EPD_13IN3K_SendData(0xC0);   
+    EPD_13IN3K_SendCommand(0x20); 
+
+    EPD_13IN3K_ReadBusy();
+}
+
+void EPD_13IN3K_Init_4GRAY(void)
+{
+	EPD_13IN3K_Reset();
+	DEV_Delay_ms(100);
+
+	EPD_13IN3K_ReadBusy();   
+	EPD_13IN3K_SendCommand(0x12);  //SWRESET
+	EPD_13IN3K_ReadBusy();   
+
+	EPD_13IN3K_SendCommand(0x0C); //set soft start     
+	EPD_13IN3K_SendData(0xAE);
+	EPD_13IN3K_SendData(0xC7);
+	EPD_13IN3K_SendData(0xC3);
+	EPD_13IN3K_SendData(0xC0);
+	EPD_13IN3K_SendData(0x80);
+
+	EPD_13IN3K_SendCommand(0x01);   //      drive output control    
+	EPD_13IN3K_SendData((EPD_13IN3K_HEIGHT-1)%256); //  Y  
+	EPD_13IN3K_SendData((EPD_13IN3K_HEIGHT-1)/256); //  Y 
+	EPD_13IN3K_SendData(0x00);
+
+	EPD_13IN3K_SendCommand(0x11);        //    data  entry  mode
+	EPD_13IN3K_SendData(0x03);           //       X-mode  x+ y-    
+
+	EPD_13IN3K_SetWindows(0, 0, EPD_13IN3K_WIDTH-1, EPD_13IN3K_HEIGHT-1);
+
+	EPD_13IN3K_SendCommand(0x3C);        // Border       Border setting 
+	EPD_13IN3K_SendData(0x00);
+
+	EPD_13IN3K_SendCommand(0x18); // use the internal temperature sensor
+	EPD_13IN3K_SendData(0x80);
+	
+	EPD_13IN3K_SetCursor(0, 0);
+
+    EPD_13IN3K_Lut(LUT_DATA_4Gray);
+	
+	EPD_13IN3K_ReadBusy();
+}
+
 /******************************************************************************
 function :	Clear screen
 parameter:
@@ -198,6 +348,29 @@ void EPD_13IN3K_Clear(void)
 	EPD_13IN3K_TurnOnDisplay();
 }
 
+void EPD_13IN3K_color_Base(UBYTE color)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;	
+	
+	EPD_13IN3K_SendCommand(0x24);
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(color);
+	}
+
+    EPD_13IN3K_SendCommand(0x26);
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(color);
+	}
+	EPD_13IN3K_TurnOnDisplay();
+}
+
+
 /******************************************************************************
 function :	Sends the image buffer in RAM to e-Paper and displays
 parameter:
@@ -217,6 +390,28 @@ void EPD_13IN3K_Display(UBYTE *Image)
 	EPD_13IN3K_TurnOnDisplay();	
 }
 
+void EPD_13IN3K_Display_Base(UBYTE *Image)
+{
+	UWORD i, j;
+	UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;
+	
+	EPD_13IN3K_SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(Image[j + i*width]);
+	}
+
+    EPD_13IN3K_SendCommand(0x26);   //write RAM for black(0)/white (1)
+	for(i=0; i<height; i++)
+	{
+		for(j=0; j<width; j++)
+			EPD_13IN3K_SendData(Image[j + i*width]);
+	}
+	EPD_13IN3K_TurnOnDisplay();	
+}
+
 void EPD_13IN3K_WritePicture(UBYTE *Image, UBYTE Block)
 {
     UDOUBLE Width, Height;
@@ -236,6 +431,167 @@ void EPD_13IN3K_WritePicture(UBYTE *Image, UBYTE Block)
 	}
 }
 
+void EPD_13IN3K_WritePicture_Base(UBYTE *Image, UBYTE Block)
+{
+	UDOUBLE Width, Height;
+	Width =(EPD_13IN3K_WIDTH % 8 == 0)?(EPD_13IN3K_WIDTH / 8 ):(EPD_13IN3K_WIDTH / 8 + 1);
+	Height = EPD_13IN3K_HEIGHT;
+	
+	EPD_13IN3K_SendCommand(0x24);
+	for (UDOUBLE j = 0; j < Height/2; j++) {
+        for (UDOUBLE i = 0; i < Width; i++) {
+            EPD_13IN3K_SendData(Image[i + j * Width]);
+        }
+	}
+    
+    EPD_13IN3K_SendCommand(0x26);
+	for (UDOUBLE j = 0; j < Height/2; j++) {
+        for (UDOUBLE i = 0; i < Width; i++) {
+            EPD_13IN3K_SendData(Image[i + j * Width]);
+        }
+	}
+    
+	if(Block == 1){
+		EPD_13IN3K_TurnOnDisplay();
+	}
+}
+
+void EPD_13IN3K_Display_Part(UBYTE *Image, UWORD x, UWORD y, UWORD w, UWORD l)
+{
+	UWORD Ystart = y;
+	UWORD Yend =  y + l;
+    UWORD Xstart = x;
+    UWORD Xend = x + w;
+
+
+    if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend / 8;
+    }
+    else
+    {
+        Xstart = Xstart / 8 ;
+        Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
+    }
+
+    UWORD i, Width;
+	Width = Xend -  Xstart;
+	UWORD IMAGE_COUNTER = Width * (Yend-Ystart);
+
+    Xend -= 1;
+	Yend -= 1;	
+
+	EPD_13IN3K_SetWindows(Xstart*8, y, Xend*8, y+l-1);
+
+	EPD_13IN3K_SetCursor(Xstart*8, y);
+
+	EPD_13IN3K_SendCommand(0x24);   //write RAM for black(0)/white (1)
+	for (i = 0; i < IMAGE_COUNTER; i++) {
+	    EPD_13IN3K_SendData(Image[i]);
+	}
+
+	EPD_13IN3K_TurnOnDisplay_Part();	
+}
+
+void EPD_13IN3K_4GrayDisplay(UBYTE *Image)
+{
+    UDOUBLE i,j,k,o;
+    UBYTE temp1,temp2,temp3;
+    UWORD height = EPD_13IN3K_HEIGHT;
+	UWORD width = EPD_13IN3K_WIDTH/8;
+
+    // old  data
+    EPD_13IN3K_SendCommand(0x24);
+    for(i=0; i<height; i++) { 
+        for(o=0; o<width; o++) {
+            if(i<height/2 && o <width/2)
+            {
+                temp3=0;
+                for(j=0; j<2; j++) {
+                    temp1 = Image[(o+i*width/2)*2+j];
+                    for(k=0; k<2; k++) {
+                        temp2 = temp1&0xC0;
+                        if(temp2 == 0xC0)
+                            temp3 |= 0x00;
+                        else if(temp2 == 0x00)
+                            temp3 |= 0x01; 
+                        else if(temp2 == 0x80)
+                            temp3 |= 0x01; 
+                        else //0x40
+                            temp3 |= 0x00; 
+                        temp3 <<= 1;
+
+                        temp1 <<= 2;
+                        temp2 = temp1&0xC0 ;
+                        if(temp2 == 0xC0) 
+                            temp3 |= 0x00;
+                        else if(temp2 == 0x00) 
+                            temp3 |= 0x01;
+                        else if(temp2 == 0x80)
+                            temp3 |= 0x01; 
+                        else    //0x40
+                            temp3 |= 0x00;	
+                        if(j!=1 || k!=1)
+                            temp3 <<= 1;
+
+                        temp1 <<= 2;
+                    }
+                }
+                EPD_13IN3K_SendData(temp3);
+                // printf("%x",temp3);
+            }
+            else
+                EPD_13IN3K_SendData(0x00);
+        }
+    }
+
+    EPD_13IN3K_SendCommand(0x26);   //write RAM for black(0)/white (1)
+    for(i=0; i<height; i++) { 
+        for(o=0; o<width; o++) {
+            if(i<height/2 && o <width/2)
+            {
+                temp3=0;
+                for(j=0; j<2; j++) {
+                    temp1 = Image[(o+i*width/2)*2+j];
+                    for(k=0; k<2; k++) {
+                        temp2 = temp1&0xC0 ;
+                        if(temp2 == 0xC0)
+                            temp3 |= 0x00;//white
+                        else if(temp2 == 0x00)
+                            temp3 |= 0x01;  //black
+                        else if(temp2 == 0x80)
+                            temp3 |= 0x00;  //gray1
+                        else //0x40
+                            temp3 |= 0x01; //gray2
+                        temp3 <<= 1;
+
+                        temp1 <<= 2;
+                        temp2 = temp1&0xC0 ;
+                        if(temp2 == 0xC0)  //white
+                            temp3 |= 0x00;
+                        else if(temp2 == 0x00) //black
+                            temp3 |= 0x01;
+                        else if(temp2 == 0x80)
+                            temp3 |= 0x00; //gray1
+                        else    //0x40
+                            temp3 |= 0x01;	//gray2
+                        if(j!=1 || k!=1)
+                            temp3 <<= 1;
+
+                        temp1 <<= 2;
+                    }
+                }
+                EPD_13IN3K_SendData(temp3);
+                // printf("%x",temp3);
+            }                
+            else
+                EPD_13IN3K_SendData(0x00);
+        }
+    }
+    EPD_13IN3K_TurnOnDisplay_4GRAY();
+}
+
 /******************************************************************************
 function :	Enter sleep mode
 parameter:
@@ -243,6 +599,6 @@ parameter:
 void EPD_13IN3K_Sleep(void)
 {
 	EPD_13IN3K_SendCommand(0x10); //enter deep sleep
-	EPD_13IN3K_SendData(0x01); 
+	EPD_13IN3K_SendData(0x03); 
 	DEV_Delay_ms(100);
 }

+ 7 - 0
STM32/STM32-F103ZET6/User/e-Paper/EPD_13in3k.h

@@ -38,9 +38,16 @@
 #define EPD_13IN3K_HEIGHT      680
 
 void EPD_13IN3K_Init(void);
+void EPD_13IN3K_Init_Part(void);
+void EPD_13IN3K_Init_4GRAY(void);
 void EPD_13IN3K_Clear(void);
+void EPD_13IN3K_color_Base(UBYTE color);
 void EPD_13IN3K_Display(UBYTE *Image);
+void EPD_13IN3K_Display_Base(UBYTE *Image);
 void EPD_13IN3K_WritePicture(UBYTE *Image, UBYTE Block);
+void EPD_13IN3K_WritePicture_Base(UBYTE *Image, UBYTE Block);
+void EPD_13IN3K_Display_Part(UBYTE *Image, UWORD x, UWORD y, UWORD w, UWORD l);
+void EPD_13IN3K_4GrayDisplay(UBYTE *Image);
 void EPD_13IN3K_Sleep(void);
 
 #endif

+ 3 - 4
STM32/STM32-F103ZET6/User/e-Paper/EPD_4in26.c

@@ -450,9 +450,8 @@ void EPD_4in26_4GrayDisplay(UBYTE *Image)
     UDOUBLE i,j,k;
     UBYTE temp1,temp2,temp3;
 
-    // old  data
     EPD_4in26_SendCommand(0x24);
-    for(i=0; i<24000; i++) {             //5808*4  46464
+    for(i=0; i<24000; i++) { 
         temp3=0;
         for(j=0; j<2; j++) {
             temp1 = Image[i*2+j];
@@ -493,7 +492,7 @@ void EPD_4in26_4GrayDisplay(UBYTE *Image)
      }
 
     EPD_4in26_SendCommand(0x26);   //write RAM for black(0)/white (1)
-    for(i=0; i<24000; i++) {             //5808*4  46464
+    for(i=0; i<24000; i++) { 
         temp3=0;
         for(j=0; j<2; j++) {
             temp1 = Image[i*2+j];
@@ -542,6 +541,6 @@ parameter:
 void EPD_4in26_Sleep(void)
 {
 	EPD_4in26_SendCommand(0x10); //enter deep sleep
-	EPD_4in26_SendData(0x01); 
+	EPD_4in26_SendData(0x03); 
 	DEV_Delay_ms(100);
 }

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio