From a125f45b345a8424a833e48729e83072b17908ee Mon Sep 17 00:00:00 2001 From: Andrew Villeneuve Date: Thu, 7 May 2026 16:28:08 -0700 Subject: [PATCH] Touchscreen driver POC Example documentation --- CLAUDE.md | 82 +- custom_components/icnt86x/__init__.py | 6 + .../icnt86x/touchscreen/__init__.py | 32 + .../touchscreen/icnt86x_touchscreen.cpp | 131 + .../icnt86x/touchscreen/icnt86x_touchscreen.h | 33 + docs/Touch_e-Paper_Code/Version_CN.txt | 4 + docs/Touch_e-Paper_Code/Version_EN.txt | 4 + docs/Touch_e-Paper_Code/c/Makefile | 65 + .../Touch_e-Paper_Code/c/bin/2in13_TestCode.o | Bin 0 -> 16408 bytes .../c/bin/2in13_TestCode_V3.o | Bin 0 -> 16652 bytes .../c/bin/2in13_TestCode_V4.o | Bin 0 -> 16652 bytes docs/Touch_e-Paper_Code/c/bin/2in9_TestCode.o | Bin 0 -> 20304 bytes docs/Touch_e-Paper_Code/c/bin/DEV_Config.o | Bin 0 -> 10892 bytes docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V2.o | Bin 0 -> 11824 bytes docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V3.o | Bin 0 -> 13132 bytes docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V4.o | Bin 0 -> 13740 bytes docs/Touch_e-Paper_Code/c/bin/EPD_2in9_V2.o | Bin 0 -> 15648 bytes docs/Touch_e-Paper_Code/c/bin/GT1151.o | Bin 0 -> 9632 bytes docs/Touch_e-Paper_Code/c/bin/GUI_BMPfile.o | Bin 0 -> 15480 bytes docs/Touch_e-Paper_Code/c/bin/GUI_Paint.o | Bin 0 -> 29728 bytes docs/Touch_e-Paper_Code/c/bin/ICNT86X.o | Bin 0 -> 8496 bytes docs/Touch_e-Paper_Code/c/bin/font12.o | Bin 0 -> 4264 bytes docs/Touch_e-Paper_Code/c/bin/font12CN.o | Bin 0 -> 4640 bytes docs/Touch_e-Paper_Code/c/bin/font16.o | Bin 0 -> 6164 bytes docs/Touch_e-Paper_Code/c/bin/font20.o | Bin 0 -> 6924 bytes docs/Touch_e-Paper_Code/c/bin/font24.o | Bin 0 -> 9964 bytes docs/Touch_e-Paper_Code/c/bin/font24CN.o | Bin 0 -> 7664 bytes docs/Touch_e-Paper_Code/c/bin/font8.o | Bin 0 -> 3880 bytes docs/Touch_e-Paper_Code/c/bin/main.o | Bin 0 -> 6200 bytes .../c/examples/2in13_TestCode.c | 263 ++ .../c/examples/2in13_TestCode_V3.c | 264 ++ .../c/examples/2in13_TestCode_V4.c | 264 ++ .../c/examples/2in9_TestCode.c | 364 +++ docs/Touch_e-Paper_Code/c/examples/Test.h | 15 + docs/Touch_e-Paper_Code/c/examples/main.c | 10 + .../c/lib/Config/DEV_Config.c | 342 +++ .../c/lib/Config/DEV_Config.h | 78 + docs/Touch_e-Paper_Code/c/lib/Config/Debug.h | 47 + .../c/lib/Config/RPI_gpiod.c | 170 ++ .../c/lib/Config/RPI_gpiod.h | 88 + .../c/lib/Config/dev_hardware_SPI.c | 363 +++ .../c/lib/Config/dev_hardware_SPI.h | 120 + .../c/lib/Config/dev_hardware_i2c.c | 112 + .../c/lib/Config/dev_hardware_i2c.h | 61 + docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.c | 121 + docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.h | 27 + .../Touch_e-Paper_Code/c/lib/Driver/ICNT86X.c | 80 + .../Touch_e-Paper_Code/c/lib/Driver/ICNT86X.h | 26 + .../c/lib/EPD/EPD_2in13_V2.c | 398 +++ .../c/lib/EPD/EPD_2in13_V2.h | 74 + .../c/lib/EPD/EPD_2in13_V3.c | 473 ++++ .../c/lib/EPD/EPD_2in13_V3.h | 51 + .../c/lib/EPD/EPD_2in13_V4.c | 433 +++ .../c/lib/EPD/EPD_2in13_V4.h | 56 + .../c/lib/EPD/EPD_2in9_V2.c | 615 ++++ .../c/lib/EPD/EPD_2in9_V2.h | 53 + docs/Touch_e-Paper_Code/c/lib/Fonts/font12.c | 1384 +++++++++ .../Touch_e-Paper_Code/c/lib/Fonts/font12CN.c | 120 + docs/Touch_e-Paper_Code/c/lib/Fonts/font16.c | 1764 ++++++++++++ docs/Touch_e-Paper_Code/c/lib/Fonts/font20.c | 2142 ++++++++++++++ docs/Touch_e-Paper_Code/c/lib/Fonts/font24.c | 2520 +++++++++++++++++ .../Touch_e-Paper_Code/c/lib/Fonts/font24CN.c | 465 +++ docs/Touch_e-Paper_Code/c/lib/Fonts/font8.c | 1004 +++++++ docs/Touch_e-Paper_Code/c/lib/Fonts/fonts.h | 97 + .../c/lib/GUI/GUI_BMPfile.c | 286 ++ .../c/lib/GUI/GUI_BMPfile.h | 89 + docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.c | 798 ++++++ docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.h | 215 ++ docs/Touch_e-Paper_Code/c/main | Bin 0 -> 173772 bytes docs/Touch_e-Paper_Code/c/pic/2in13/Menu.bmp | Bin 0 -> 4062 bytes .../c/pic/2in13/Photo_1.bmp | Bin 0 -> 4062 bytes .../c/pic/2in13/Photo_1_0.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_1.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_2.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_3.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_4.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_5.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_1_6.bmp | Bin 0 -> 1038 bytes .../c/pic/2in13/Photo_2.bmp | Bin 0 -> 4062 bytes .../c/pic/2in13/Photo_2_0.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_1.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_2.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_3.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_4.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_5.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/Photo_2_6.bmp | Bin 0 -> 3014 bytes .../c/pic/2in13/White_board.bmp | Bin 0 -> 4062 bytes .../c/pic/2in9/2in9_Scale.bmp | Bin 0 -> 19062 bytes docs/Touch_e-Paper_Code/c/pic/2in9/Menu.bmp | Bin 0 -> 5182 bytes .../Touch_e-Paper_Code/c/pic/2in9/Photo_1.bmp | Bin 0 -> 5182 bytes .../c/pic/2in9/Photo_1_0.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_1.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_2.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_3.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_4.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_5.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_6.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_7.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_8.bmp | Bin 0 -> 614 bytes .../c/pic/2in9/Photo_1_9.bmp | Bin 0 -> 614 bytes .../Touch_e-Paper_Code/c/pic/2in9/Photo_2.bmp | Bin 0 -> 5182 bytes .../c/pic/2in9/Photo_2_0.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_1.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_2.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_3.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_4.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_5.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_6.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_7.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_8.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/Photo_2_9.bmp | Bin 0 -> 3822 bytes .../c/pic/2in9/White_board.bmp | Bin 0 -> 5182 bytes docs/Touch_e-Paper_Code/c/readme_CN.txt | 79 + docs/Touch_e-Paper_Code/c/readme_EN.txt | 86 + .../python/examples/.lgd-nfy0 | 0 .../python/examples/TP2in13_V3_test.py | 236 ++ .../python/examples/TP2in13_V4_test.py | 236 ++ .../python/examples/TP2in13_test.py | 235 ++ .../python/examples/TP2in9_test.py | 268 ++ .../python/lib/TP_lib/__init__.py | 0 .../python/lib/TP_lib/epd2in13_V2.py | 339 +++ .../python/lib/TP_lib/epd2in13_V3.py | 436 +++ .../python/lib/TP_lib/epd2in13_V4.py | 370 +++ .../python/lib/TP_lib/epd2in9_V2.py | 586 ++++ .../python/lib/TP_lib/epdconfig.py | 140 + .../python/lib/TP_lib/gt1151.py | 84 + .../python/lib/TP_lib/icnt86.py | 89 + .../python/lib/TP_lib/weather_2in9_V2.py | 261 ++ .../python/pic/2in13/Menu.bmp | Bin 0 -> 4062 bytes .../python/pic/2in13/Photo_1.bmp | Bin 0 -> 4062 bytes .../python/pic/2in13/Photo_1_0.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_1.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_2.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_3.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_4.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_5.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_1_6.bmp | Bin 0 -> 1038 bytes .../python/pic/2in13/Photo_2.bmp | Bin 0 -> 4062 bytes .../python/pic/2in13/Photo_2_0.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_1.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_2.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_3.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_4.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_5.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/Photo_2_6.bmp | Bin 0 -> 3014 bytes .../python/pic/2in13/White_board.bmp | Bin 0 -> 4062 bytes .../python/pic/2in9/2in9_Scale.bmp | Bin 0 -> 19062 bytes .../python/pic/2in9/Menu.bmp | Bin 0 -> 5182 bytes .../python/pic/2in9/Photo_1.bmp | Bin 0 -> 5182 bytes .../python/pic/2in9/Photo_1_0.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_1.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_2.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_3.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_4.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_5.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_6.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_7.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_8.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_1_9.bmp | Bin 0 -> 614 bytes .../python/pic/2in9/Photo_2.bmp | Bin 0 -> 5182 bytes .../python/pic/2in9/Photo_2_0.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_1.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_2.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_3.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_4.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_5.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_6.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_7.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_8.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/Photo_2_9.bmp | Bin 0 -> 3822 bytes .../python/pic/2in9/White_board.bmp | Bin 0 -> 5182 bytes .../python/pic/2in9/error.png | Bin 0 -> 749 bytes .../python/pic/2in9/icon/01d.png | Bin 0 -> 710 bytes .../python/pic/2in9/icon/01n.png | Bin 0 -> 612 bytes .../python/pic/2in9/icon/02d.png | Bin 0 -> 2470 bytes .../python/pic/2in9/icon/02n.png | Bin 0 -> 688 bytes .../python/pic/2in9/icon/03d.png | Bin 0 -> 572 bytes .../python/pic/2in9/icon/03n.png | Bin 0 -> 748 bytes .../python/pic/2in9/icon/04d.png | Bin 0 -> 710 bytes .../python/pic/2in9/icon/04n.png | Bin 0 -> 710 bytes .../python/pic/2in9/icon/09d.png | Bin 0 -> 2389 bytes .../python/pic/2in9/icon/09n.png | Bin 0 -> 836 bytes .../python/pic/2in9/icon/10d.png | Bin 0 -> 1022 bytes .../python/pic/2in9/icon/10n.png | Bin 0 -> 2517 bytes .../python/pic/2in9/icon/11d.png | Bin 0 -> 2556 bytes .../python/pic/2in9/icon/11n.png | Bin 0 -> 2553 bytes .../python/pic/2in9/icon/13d.png | Bin 0 -> 2338 bytes .../python/pic/2in9/icon/13n.png | Bin 0 -> 2690 bytes .../python/pic/2in9/icon/50d.png | Bin 0 -> 2140 bytes .../python/pic/2in9/icon/50n.png | Bin 0 -> 2226 bytes .../python/pic/2in9/screen_output.png | Bin 0 -> 1334 bytes .../python/pic/2in9/template.bmp | Bin 0 -> 5182 bytes docs/Touch_e-Paper_Code/python/pic/Font.ttc | Bin 0 -> 5177387 bytes .../python/pic/Roboto-Black.ttf | Bin 0 -> 171072 bytes .../python/pic/Roboto-Bold.ttf | Bin 0 -> 170348 bytes .../python/pic/Roboto-Regular.ttf | Bin 0 -> 171272 bytes docs/Touch_e-Paper_Code/python/readme_CN.txt | 59 + docs/Touch_e-Paper_Code/python/readme_EN.txt | 60 + docs/Touch_e-Paper_Code/python/setup.py | 10 + touch_i2c_cap.csv | 4 + waveshare-test.yaml | 30 +- 201 files changed, 19783 insertions(+), 34 deletions(-) create mode 100644 custom_components/icnt86x/__init__.py create mode 100644 custom_components/icnt86x/touchscreen/__init__.py create mode 100644 custom_components/icnt86x/touchscreen/icnt86x_touchscreen.cpp create mode 100644 custom_components/icnt86x/touchscreen/icnt86x_touchscreen.h create mode 100644 docs/Touch_e-Paper_Code/Version_CN.txt create mode 100644 docs/Touch_e-Paper_Code/Version_EN.txt create mode 100644 docs/Touch_e-Paper_Code/c/Makefile create mode 100644 docs/Touch_e-Paper_Code/c/bin/2in13_TestCode.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/2in13_TestCode_V3.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/2in13_TestCode_V4.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/2in9_TestCode.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/DEV_Config.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V2.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V3.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V4.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/EPD_2in9_V2.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/GT1151.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/GUI_BMPfile.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/GUI_Paint.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/ICNT86X.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font12.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font12CN.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font16.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font20.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font24.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font24CN.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/font8.o create mode 100644 docs/Touch_e-Paper_Code/c/bin/main.o create mode 100644 docs/Touch_e-Paper_Code/c/examples/2in13_TestCode.c create mode 100644 docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V3.c create mode 100644 docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V4.c create mode 100644 docs/Touch_e-Paper_Code/c/examples/2in9_TestCode.c create mode 100644 docs/Touch_e-Paper_Code/c/examples/Test.h create mode 100644 docs/Touch_e-Paper_Code/c/examples/main.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/DEV_Config.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/DEV_Config.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/Debug.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Driver/ICNT86X.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Driver/ICNT86X.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V2.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V2.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font12.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font12CN.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font16.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font20.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font24.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font24CN.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/font8.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/Fonts/fonts.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.h create mode 100644 docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.c create mode 100644 docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.h create mode 100644 docs/Touch_e-Paper_Code/c/main create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Menu.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_0.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_3.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_4.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_5.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_6.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_0.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_3.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_4.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_5.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_6.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in13/White_board.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/2in9_Scale.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Menu.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_0.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_3.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_4.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_5.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_6.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_7.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_8.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_9.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_0.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_1.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_2.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_3.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_4.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_5.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_6.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_7.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_8.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_9.bmp create mode 100644 docs/Touch_e-Paper_Code/c/pic/2in9/White_board.bmp create mode 100644 docs/Touch_e-Paper_Code/c/readme_CN.txt create mode 100644 docs/Touch_e-Paper_Code/c/readme_EN.txt create mode 100644 docs/Touch_e-Paper_Code/python/examples/.lgd-nfy0 create mode 100644 docs/Touch_e-Paper_Code/python/examples/TP2in13_V3_test.py create mode 100644 docs/Touch_e-Paper_Code/python/examples/TP2in13_V4_test.py create mode 100644 docs/Touch_e-Paper_Code/python/examples/TP2in13_test.py create mode 100644 docs/Touch_e-Paper_Code/python/examples/TP2in9_test.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/__init__.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V2.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V3.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V4.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in9_V2.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/epdconfig.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/gt1151.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/icnt86.py create mode 100644 docs/Touch_e-Paper_Code/python/lib/TP_lib/weather_2in9_V2.py create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Menu.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_0.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_3.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_4.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_5.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_6.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_0.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_3.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_4.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_5.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_6.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in13/White_board.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/2in9_Scale.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Menu.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_0.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_3.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_4.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_5.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_6.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_7.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_8.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_9.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_0.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_1.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_2.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_3.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_4.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_5.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_6.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_7.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_8.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_9.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/White_board.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/error.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/01d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/01n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/02d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/02n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/03d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/03n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/04d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/04n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/09d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/09n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/10d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/10n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/11d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/11n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/13d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/13n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/50d.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/icon/50n.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/screen_output.png create mode 100644 docs/Touch_e-Paper_Code/python/pic/2in9/template.bmp create mode 100644 docs/Touch_e-Paper_Code/python/pic/Font.ttc create mode 100644 docs/Touch_e-Paper_Code/python/pic/Roboto-Black.ttf create mode 100644 docs/Touch_e-Paper_Code/python/pic/Roboto-Bold.ttf create mode 100644 docs/Touch_e-Paper_Code/python/pic/Roboto-Regular.ttf create mode 100644 docs/Touch_e-Paper_Code/python/readme_CN.txt create mode 100644 docs/Touch_e-Paper_Code/python/readme_EN.txt create mode 100644 docs/Touch_e-Paper_Code/python/setup.py create mode 100644 touch_i2c_cap.csv diff --git a/CLAUDE.md b/CLAUDE.md index b8dc2d7..f1e65ab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,14 +1,30 @@ # Waveshare 2.9" E-Paper LVGL Project ## Goal Summary -- Extend the native waveshare_epaper component of esphome to support 2-bit grayscale -- Only concerned with this one target board: `2.90inv2-r2` +- Waveshare 2.9" Touch ePaper HAT driving LVGL UI via ESPHome on ESP32 +- 2-bit grayscale display support implemented via custom ESPHome component +- Touchscreen integration in progress ## Hardware - ESP32-WROOM-32 (nodemcu-32s board) -- Waveshare 2.9inch Touch ePaper HAT (296x128, 2-bit grayscale) -- Display model string: `2.90inv2-r2` (SSD1680 controller) -- Pin mapping: SCLK=GPIO23, MOSI=GPIO22, CS=GPIO19, DC=GPIO18, BUSY=GPIO4, RST=GPIO5 +- Waveshare 2.9inch Touch ePaper HAT (296x128, SSD1680 display, GT1151 touchscreen) + +### Pin Mapping +| Function | ESP Pin | HAT Pin | +|--- |--- |--- | +| Display SCLK | GPIO18 | Pin23/GPIO11/SPI0_SCLK | +| Display MOSI | GPIO23 | Pin19/GPIO10/SPI0_MOSI | +| Display CS | GPIO19 | Pin24/GPIO8/SPI0_CE0 | +| Display DC | GPIO17 | Pin22/GPIO25 | +| Display BUSY | GPIO4 | Pin24/GPIO24 | +| Display RST | GPIO5 | Pin11/GPIO17/SPI1_CE1 | +| Touch SDA | GPIO21 | Pin3/GPIO2/I2C1_SDA | +| Touch SCL | GPIO22 | Pin5/GPIO3/I2C1_SCL | +| Touch RST | GPIO15 | Pin13/GPIO27 | +| Touch INT | GPIO16 | Pin15/GPIO22 | + +Note: GPIO15 (Touch RST) is an ESP32 strapping pin, but only affects boot log +output (LOW silences it). No impact on UART download mode or OTA flashing. ## Software - ESPHome 2026.1.0 @@ -16,37 +32,41 @@ - Project directory: ~/Projects/waveshare-panel ## Current Status -- Display working correctly via ESPHome's native display library -- LVGL rendering confirmed working (black background visible) -- Custom component `waveshare_epaper_2bit` created and flashed, working identically to built-in driver -- Custom model name: `2.90inv2-r2-2bpp` +- 2-bit grayscale fully working via custom component `waveshare_epaper_2bit` +- LVGL rendering working, 4-shade colorspace confirmed +- Bayer ordered dithering implemented for gradient smoothing +- Touchscreen wiring complete, driver integration in progress -## Known Issues / Quirks -- LVGL color depth is hardcoded to 16-bit (RGB565) in ESPHome — only supported value -- Display renders in 1-bit monochrome despite panel supporting 2-bit grayscale -- Colors are inverted by default (bg_color: 0x000000 produces white background) -- Resolved: original timeout errors were caused by on_draw_end hammering the display +## Grayscale Implementation +Custom component model name: `2.90inv2-r2-2bpp` -## Working LVGL Config -- refer to the file waveshare-test.yaml - -## Goal: 2-bit Grayscale Support -The SSD1680 controller supports 4-shade grayscale via two bitplanes: -- Register 0x24: bitplane 1 -- Register 0x26: bitplane 2 +Key implementation details: +- Gray4 waveform LUT loaded via register 0x32 on every display() call +- Activation uses 0xC7 (custom LUT), not 0xF7 (which reloads OTP LUT) +- Always does full refresh — partial update removed from 2bpp class +- Second bitplane buffer (`buffer2_`) allocated in `initialize()` +Confirmed bitplane table for this panel with Gray4 LUT: | 0x24 | 0x26 | Result | |------|------|------------| -| 1 | 1 | White | -| 1 | 0 | Light grey | -| 0 | 1 | Dark grey | -| 0 | 0 | Black | +| 0 | 0 | White | +| 1 | 0 | Light grey | +| 0 | 1 | Dark grey | +| 1 | 1 | Black | -The ESPHome driver only writes to 0x24, discarding grayscale information. -The real problem is upstream — RGB565 is converted to 1-bit before display() is -called, so grayscale data is lost before the driver even sees it. Next step is to -find where this conversion happens in the ESPHome display pipeline so the patch -can preserve grayscale information through to the two-bitplane write. +Color convention: 0xFFFFFF=white, 0x000000=black (no inversion). +LVGL 4-shade palette: 0xFFFFFF, 0xAAAAAA, 0x555555, 0x000000 + +Dithering: 4×4 Bayer ordered dither, bias = bayer*2 - 15 (±15 range). +Amplitude chosen to keep 0xAAAAAA and 0x555555 as solid fills. + +## Touchscreen +- Controller: ICNT86X (I2C address 0x48; 0x30 also ACKs, likely DFU/bootloader interface) +- Custom component: `custom_components/icnt86x/` (ESPHome has no native ICNT86X driver) +- Touch count at register 0x1001, touch data at 0x1002 (7 bytes/point), clear by writing 0x00 to 0x1001 +- Waveshare's own driver inverts both axes: X = 295 - raw_x, Y = 127 - raw_y +- INT pulse is very brief (sub-ms); component works in polling mode regardless +- Coordinate transform (mirror_x, mirror_y, swap_xy) to be confirmed after first flash ## Relevant Files - Custom component: `custom_components/waveshare_epaper_2bit/` @@ -54,6 +74,6 @@ can preserve grayscale information through to the two-bitplane write. - `display.py` — component schema and model registration - `waveshare_epaper_2bit.cpp` — driver implementation - `waveshare_epaper_2bit.h` — header +- Main config: `waveshare-test.yaml` (pin table here is source of truth) - Build cache: `.esphome/build/waveshare-epaper-test/src/esphome/components/` - ESPHome source (venv): ~/Code/esphome-2026.1.0/ -- Applicable ESPHome source is copied into .esphome/build by the build system at compile time diff --git a/custom_components/icnt86x/__init__.py b/custom_components/icnt86x/__init__.py new file mode 100644 index 0000000..7d054f7 --- /dev/null +++ b/custom_components/icnt86x/__init__.py @@ -0,0 +1,6 @@ +import esphome.codegen as cg + +CODEOWNERS = ["@andrewmv"] +DEPENDENCIES = ["i2c"] + +icnt86x_ns = cg.esphome_ns.namespace("icnt86x") diff --git a/custom_components/icnt86x/touchscreen/__init__.py b/custom_components/icnt86x/touchscreen/__init__.py new file mode 100644 index 0000000..391816a --- /dev/null +++ b/custom_components/icnt86x/touchscreen/__init__.py @@ -0,0 +1,32 @@ +from esphome import pins +import esphome.codegen as cg +from esphome.components import i2c, touchscreen +import esphome.config_validation as cv +from esphome.const import CONF_ID, CONF_INTERRUPT_PIN, CONF_RESET_PIN + +from .. import icnt86x_ns + +ICNT86XTouchscreen = icnt86x_ns.class_( + "ICNT86XTouchscreen", + touchscreen.Touchscreen, + i2c.I2CDevice, +) + +CONFIG_SCHEMA = touchscreen.TOUCHSCREEN_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(ICNT86XTouchscreen), + cv.Optional(CONF_INTERRUPT_PIN): pins.internal_gpio_input_pin_schema, + cv.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, + } +).extend(i2c.i2c_device_schema(0x48)) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await touchscreen.register_touchscreen(var, config) + await i2c.register_i2c_device(var, config) + + if interrupt_pin := config.get(CONF_INTERRUPT_PIN): + cg.add(var.set_interrupt_pin(await cg.gpio_pin_expression(interrupt_pin))) + if reset_pin := config.get(CONF_RESET_PIN): + cg.add(var.set_reset_pin(await cg.gpio_pin_expression(reset_pin))) diff --git a/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.cpp b/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.cpp new file mode 100644 index 0000000..e86ac2f --- /dev/null +++ b/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.cpp @@ -0,0 +1,131 @@ +#include "icnt86x_touchscreen.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace icnt86x { + +static const char *const TAG = "icnt86x.touchscreen"; + +static const uint16_t REG_VERSION = 0x000A; +static const uint16_t REG_TOUCH_CNT = 0x1001; +static const uint16_t REG_TOUCH_DAT = 0x1002; + +static const uint8_t MAX_TOUCHES = 2; +static const uint8_t BYTES_PER_TOUCH = 7; + +// Observed event codes from protocol analysis +static const uint8_t EVENT_MOVE = 0x02; +static const uint8_t EVENT_DOWN = 0x03; +// 0x04 = idle/no-contact — chip reports count=1 with this code when untouched + +void ICNT86XTouchscreen::setup() { + if (this->reset_pin_ != nullptr) { + this->reset_pin_->setup(); + // Drive INT low before and during reset release. Many touch controllers + // sample INT at reset release to select interrupt output mode; if INT is + // left pulled high by the level shifter the chip comes up with INT disabled. + if (this->interrupt_pin_ != nullptr) { + this->interrupt_pin_->pin_mode(gpio::FLAG_OUTPUT); + this->interrupt_pin_->digital_write(false); + } + this->reset_pin_->digital_write(true); + delay(100); + this->reset_pin_->digital_write(false); + delay(100); + this->reset_pin_->digital_write(true); // INT still driven low at release + } + + // Allow chip 100ms to boot, then reconfigure INT as input before attaching ISR + this->set_timeout(100, [this]() { this->setup_internal_(); }); +} + +void ICNT86XTouchscreen::setup_internal_() { + if (this->interrupt_pin_ != nullptr) { + this->interrupt_pin_->setup(); // reconfigure as input after driving low during reset + } + + uint8_t ver[4]; + if (!this->read_reg16_(REG_VERSION, ver, sizeof(ver))) { + this->mark_failed(); + ESP_LOGE(TAG, "Failed to communicate with ICNT86X at 0x%02X", this->address_); + return; + } + + ESP_LOGI(TAG, "ICNT86X IC version: %02X%02X, FW version: %02X%02X", + ver[0], ver[1], ver[2], ver[3]); + + if (this->interrupt_pin_ != nullptr) { + this->attach_interrupt_(this->interrupt_pin_, gpio::INTERRUPT_FALLING_EDGE); + } + + this->setup_done_ = true; +} + +void ICNT86XTouchscreen::update_touches() { + // In polling mode loop() never runs, so is_touched_ is never reset between + // cycles. Reset it here so send_touches_() can detect the press→release + // transition via !is_touched_ && was_touched_. + this->is_touched_ = false; + + if (!this->setup_done_) { + this->skip_update_ = true; + return; + } + + uint8_t count = 0; + if (!this->read_reg16_(REG_TOUCH_CNT, &count, 1)) { + this->status_set_warning(); + this->skip_update_ = true; + return; + } + + this->write_reg16_(REG_TOUCH_CNT, 0x00); + + // Always allow send_touches_() to run — even with zero touches it needs to + // fire to propagate the release event when !is_touched_ && was_touched_. + this->skip_update_ = false; + + if (count == 0 || count > MAX_TOUCHES) + return; + + uint8_t data[MAX_TOUCHES * BYTES_PER_TOUCH]; + if (!this->read_reg16_(REG_TOUCH_DAT, data, count * BYTES_PER_TOUCH)) { + this->status_set_warning(); + this->skip_update_ = true; + return; + } + + for (uint8_t i = 0; i < count; i++) { + // Per-point layout (7 bytes): [id, x_lo, x_hi, y_lo, y_hi, pressure, event] + const uint8_t *p = &data[i * BYTES_PER_TOUCH]; + uint8_t event = p[6]; + if (event != EVENT_DOWN && event != EVENT_MOVE) + continue; + uint8_t id = p[0]; + int16_t x = ((uint16_t)p[2] << 8) | p[1]; + int16_t y = ((uint16_t)p[4] << 8) | p[3]; + this->add_raw_touch_position_(id, x, y); + } +} + +bool ICNT86XTouchscreen::read_reg16_(uint16_t reg, uint8_t *data, size_t len) { + uint8_t reg_buf[2] = {(uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF)}; + if (this->write(reg_buf, 2) != i2c::ERROR_OK) + return false; + return this->read(data, len) == i2c::ERROR_OK; +} + +bool ICNT86XTouchscreen::write_reg16_(uint16_t reg, uint8_t value) { + uint8_t buf[3] = {(uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF), value}; + return this->write(buf, 3) == i2c::ERROR_OK; +} + +void ICNT86XTouchscreen::dump_config() { + ESP_LOGCONFIG(TAG, "ICNT86X Touchscreen:"); + LOG_I2C_DEVICE(this); + LOG_PIN(" Interrupt Pin: ", this->interrupt_pin_); + LOG_PIN(" Reset Pin: ", this->reset_pin_); +} + +} // namespace icnt86x +} // namespace esphome diff --git a/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.h b/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.h new file mode 100644 index 0000000..357fe95 --- /dev/null +++ b/custom_components/icnt86x/touchscreen/icnt86x_touchscreen.h @@ -0,0 +1,33 @@ +#pragma once + +#include "esphome/components/i2c/i2c.h" +#include "esphome/components/touchscreen/touchscreen.h" +#include "esphome/core/component.h" +#include "esphome/core/hal.h" + +namespace esphome { +namespace icnt86x { + +class ICNT86XTouchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice { + public: + void setup() override; + void dump_config() override; + bool can_proceed() override { return this->setup_done_; } + + void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; } + void set_reset_pin(GPIOPin *pin) { this->reset_pin_ = pin; } + + protected: + void update_touches() override; + void setup_internal_(); + + bool read_reg16_(uint16_t reg, uint8_t *data, size_t len); + bool write_reg16_(uint16_t reg, uint8_t value); + + InternalGPIOPin *interrupt_pin_{nullptr}; + GPIOPin *reset_pin_{nullptr}; + bool setup_done_{false}; +}; + +} // namespace icnt86x +} // namespace esphome diff --git a/docs/Touch_e-Paper_Code/Version_CN.txt b/docs/Touch_e-Paper_Code/Version_CN.txt new file mode 100644 index 0000000..62a35cc --- /dev/null +++ b/docs/Touch_e-Paper_Code/Version_CN.txt @@ -0,0 +1,4 @@ +2021-03-03:新创建。 +2021-06-05:新添加 2.9inch Touch e-Paper HAT 例程。 +2022-04-13:新添加 2.13inch_V3 Touch e-Paper HAT 例程。 +2023-08-14:新添加 2.13inch_V4 Touch e-Paper HAT 例程。 diff --git a/docs/Touch_e-Paper_Code/Version_EN.txt b/docs/Touch_e-Paper_Code/Version_EN.txt new file mode 100644 index 0000000..65d8d36 --- /dev/null +++ b/docs/Touch_e-Paper_Code/Version_EN.txt @@ -0,0 +1,4 @@ +2021-03-03: newly built. +2021-06-05: Added 2.9inch Touch e-paper HAT routine. +2022-04-13: Added 2.13inch_V3 Touch e-paper HAT routine. +2023-08-14: Added 2.13inch_V4 Touch e-paper HAT routine. \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/Makefile b/docs/Touch_e-Paper_Code/c/Makefile new file mode 100644 index 0000000..7f569d5 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/Makefile @@ -0,0 +1,65 @@ +DIR_Config = ./lib/Config +DIR_Driver = ./lib/Driver +DIR_GUI = ./lib/GUI +DIR_FONTS = ./lib/Fonts +DIR_EPD = ./lib/EPD +DIR_Examples = ./examples +DIR_BIN = ./bin + +OBJ_C = $(wildcard ${DIR_Driver}/*.c ${DIR_GUI}/*.c ${DIR_EPD}/*.c ${DIR_Config}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c ) +OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C})) + +TARGET = main + +# USELIB = USE_BCM2835_LIB +# USELIB = USE_WIRINGPI_LIB +USELIB = USE_LGPIO_LIB +# USELIB = USE_GPIOD_LIB + +DEBUG = -D $(USELIB) + +ifeq ($(USELIB), USE_BCM2835_LIB) + LIB = -lbcm2835 -lm + OBJ_O := $(filter-out ${DIR_BIN}/RPI_gpiod.o ${DIR_BIN}/dev_hardware_SPI.o ${DIR_BIN}/dev_hardware_i2c.o, ${OBJ_O}) +else ifeq ($(USELIB), USE_WIRINGPI_LIB) + LIB = -lwiringPi -lm + OBJ_O := $(filter-out ${DIR_BIN}/RPI_gpiod.o ${DIR_BIN}/dev_hardware_SPI.o ${DIR_BIN}/dev_hardware_i2c.o, ${OBJ_O}) +else ifeq ($(USELIB), USE_LGPIO_LIB) + LIB += -llgpio -lm + OBJ_O := $(filter-out ${DIR_BIN}/RPI_gpiod.o ${DIR_BIN}/dev_hardware_SPI.o ${DIR_BIN}/dev_hardware_i2c.o, ${OBJ_O}) +else ifeq ($(USELIB), USE_GPIOD_LIB) + LIB = -lgpiod -lm +endif +LIB += -lpthread + +CC = gcc +MSG = -g -O0 -Wall +CFLAGS += $(MSG) $(DEBUG) + +${TARGET}:${OBJ_O} + $(CC) $(CFLAGS) $(OBJ_O) -o $@ $(LIB) + +$(shell mkdir -p $(DIR_BIN)) + +${DIR_BIN}/%.o:$(DIR_Examples)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_Driver) -I $(DIR_EPD) -I $(DIR_GUI) + +${DIR_BIN}/%.o:$(DIR_Driver)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) + +${DIR_BIN}/%.o:$(DIR_EPD)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) + +${DIR_BIN}/%.o:$(DIR_FONTS)/%.c + $(CC) $(CFLAGS) -c $< -o $@ $(DEBUG) + +${DIR_BIN}/%.o:$(DIR_GUI)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) $(DEBUG) + +${DIR_BIN}/%.o:$(DIR_Config)/%.c + $(CC) $(CFLAGS) -c $< -o $@ $(LIB) + + +clean : + rm $(DIR_BIN)/*.* + rm $(TARGET) diff --git a/docs/Touch_e-Paper_Code/c/bin/2in13_TestCode.o b/docs/Touch_e-Paper_Code/c/bin/2in13_TestCode.o new file mode 100644 index 0000000000000000000000000000000000000000..0a7d72d1993f3199ec4b9258458c35a2f0c31a61 GIT binary patch literal 16408 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 A9smFU literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/2in13_TestCode_V3.o b/docs/Touch_e-Paper_Code/c/bin/2in13_TestCode_V3.o new file mode 100644 index 0000000000000000000000000000000000000000..d01414aa643b2e968dc6ac83e9bcb97307b6739f GIT binary patch literal 16652 zcmch83v^u7dG0=E=8Q%f9clEiEz1gwjWNcyq>(J!0^3-&WMe%oBw_5}WIU2a(!fX~ zMk7CRNlFoE%p<8CXraWbRtjlJlM+g3>y?l;H1uBQUfQyj=?ypKwtmEf5>k?z-d>tQ zbiZ$(|7eZ|o2IO;p5>!&|9k)Yf9-!i&Y9z1+1a(rFbw5hhFYz1lv3HPy2WbJuv#rq ziXM4gUR06qT#B$9efW|J z&tCMY+4C;1QV#E1UWIwGZKd8^CVVP7dtRx2$WYZ=Akz@}CV19)^tp0twBECq*yqP{ zbJbz7(`|QsewX@1Zx}vNj~(s2WJG5#TEKS5x1+aTnu*Mww}8Irz2^dud6iP%k2JtH z_3$Ou8`0JaPt?zzXZv>`V=6lLx(|Ks#mzdF%@r)~IL9_KI&)zvJoh^Lk~X5g3-f)1 z&)49{(Yzv$@mqcwn;wary5uuH|HJ=mTO55e7Z@v+{fN!8b90X)&gcCvcV1A(zV(KV zwP$P@W0#+?3@G(D$CP4w|SyK{gssDb{P=rWz7%$QNXpL|pws5|dK#!|G1pU8^p0LP= zoHwa|SbU=GlnFUSw3A~=)VAft!i~+DU~Wz0I58$ynX2fy=2MqWN6wyqh8R7IvFtm~ z_?!g&?DDhcA0sw6_2uBd53~_=)}SZn=8EVaO^YPe>n!DPzQFJE^po@PosEtk2VvJz`0<9& z)1Vi@&R0Rx53Wbd#WO-P_SlCWcq#CHKb~22`B=JstVjIr$L@)E7`NOrJW%`IU?s3|~I?f@^i3#ZZDr9h8y1t$i z+V%Az(eY)-VC?S}`dgqG`{RBmw$#J9j&-&A9;w?4`Hn5E+7?%DFY22-ddneqrAIH; z%m*q(5683!?S7#-rr1Xx2#XGmrFTqkfb3V-J3i6x4d{DD=>4D@(DyWG<_p_v(f*Xs z{|_|QbiH@bmsRlPw9oO+=gHaouDSeJ9uz&t(Ej;rX3jm)=$v^t7E_V8UuP_MewvED z{rU{%Gwarg?rSjb2P#foI#Drmj%A*o$j37l_wsV~#W{rY-_2jHuk?ZYid)B={=tgN z+o$!54D$KVx8WCa^XqgS$|oChYYW%uhlI|8m+SQ1pcy-!jkr#ygsuY3b@~z0i5JJ( zo#O+)ggvhP%*iT`4V(u-j}4p$@8GOT8{B#DhS2Ujs1zF*GsfPHAJ;?91L|U(n~%3Z z=aZ1ZdEl<8j|fe_Ip^;a9qydZ3hmDMBZlL*cg`PJe)(~5edU_EE>CYwp59{7#GqBj!1b4F>T{6e`pbF!q|o%2^ZF6d|Td9Ipq z58$4}{SfY_aKDKA9PW2PI;GWYxsb+#t&#){{d}HAJDep1KKuTv90j~d}xea*@wp1m3?T8UD=1m*p+=~ zj9uA>#@OY2=uS*bi)#zU;I^@3HW3?4$1}sa`7+~kg?h&;yJ&ZOVmOt^+?Y6$%-SkD zmPy2ig}`|4iYHTv;Yc^A@obAHB3`Hgx^+2U`Z_d;#FM z2iUSn6G3|nQi9EzD7HTZyMs4qB5dCeUBMeQQE5L7k-^QHsIu>+v@M#bvG>7`;8smU z?ElI>Et*(q2Pkd3CRW>rsAq>J*4Y*8)3&$;LZdczMityuxeG*--9_7WYpa{>AeFXj zVvCKZWfklQ{T{em>_=!7lr*sg+F1rPPgL{Hq=z6pLF3q{6^ZCxVSkbj0#_TYd zg9o*3Df>HY84Mml-J~*OkWg5#lsi(%8M3V{DcuE20{+dQ0)93GnSHcNrwnV?gD8Ch zO#%NPi@P8t;2%d(^B!|~uT!C0Agt*Al1ES#@N=+3{|sqG59pfEOE9MBL8m+m&QP^Z zES=up1#?&x{3-hsAZ(#!)vPLd4S$NSHcNj94ESGww9sczv{#ns^6#i{NRcw5{}i zgD_Q)Q<(KKJqyUME7`6qzoZKOlDz-Seml)aP%gNDKV`+Gy9;lEWXHmeFw4sRGTA!C z!mq)k(k{nB$M$Yb1RdLZG*JZG|B)KLPk(yNpP?MOM3ehU=zORVe@gqE@+|!uaLS)! z`BtZFvb@(RKSBO|C2bH9`W!9Tughgs;XQ?05kUKSFo%1KA4i)L((o;zTu8%xnh4nE z&>Zg9M9{{|C>0*iM3H?1G=y)}M6vyM&=cOPi4yy>kRQHH6JdLtefDXh+{P1w3h&oM zrH!Ml3V&1+iT-JmKK0csO&@N9e%o4FPoKZ@uMpIHBI>JXVE$Q zj3)e*-N^|R{zFYzmHmk!6@FF|0cCEcxUc)DFw{qjpR1snvQ=fl!jS^#`x6K%D-2SF zvbW-IS&=3T`wsGjG-2ASN!USl@m20qWhKEwCcQMwZubYl8d zkc0MXIoe!|fh{XD3s4nWj!j)e323lLtT9s8s zqs}Gs#9^hDe2$%$7jQ2*fcpq;|oT}mq!&edtIa=A@wmn8PLrzJ~ zDy&fzXr-v|ayU{}VR*Zi`;D7Iv??d9Vm0_{Af*ywgRXBByU1&cS%sYTR%~0!swH*C zwxw=Ju3Oq(!AP}K{pOCPw6qEx=0%cy=|c7e%+;31Eix|)VFb!CLN#bvAm$@i5Cez# zXp8*9g-mcSjE{RA$80mzUt{o1<6lc`g`ZGSR!oM(k@)yzDlw(%r>8RYspMe&=+IDo zJTqRKN={54sU4k|PQ(Y3Vf?-sm~srge7&_jMntT zNODw&n{REeudA!ym7aiLryW&NYRe??*rb$xERPK&rn0T+;Y4ij`nn;yIF%h9PK?xz zF+y4aib(oN=XuUkGnE{jh^NqsAo3y1DWN-_F>0srXTs?@mCZ~KWn;VAyLO@i6FFBR zb6WZxor)zgnN)Hr>vWr*Kylb<98F}?liAo%Izuh6rfuimnBy^MjQ$8cMG*rBM`QXK z5+o+t%>xY$8yZl?{8pBsEIshPMTTYFXPKS#R(Ypoj#}2Kddv77t6;_o)LYgFYCmoH z#;l<4XopqMVVSpQHC zx^9Uw{ia!GL#ydGMl56e)0Y2~bd>#z){sI{)C)8&~@TP34b(U?`*VO4fm!A>jO zVJ*{za_H|Ijat@hmt{ultx&ghb*EME+g9PI74EdGuFmgu!imlq{Iz;4+ffx5waT25 zH9BSm*w$%V>*v%_BR0A(OJZ4N+r2%0+?ra;FG zOpXO%twe(SbC3S6VV z;^CF7qv*>Sx83Qw!GYTVkkIMCLjOLbgi;JCg4FXtL0;%apQC-(hd1JVF@^=fQRXlT zA0i4!_<~U@*lv|H0Cri6H@tt8|BXO8VQ_S>foDjMs~p${z~HTSpdWw{xY>b^0sI{n zri&-htfeznO^3DOUTagGRsRiZQ-@XZ4W=RTub_*6=Tq{IUq0#|Dzz6n{U056ug@PY zegDG-Za%Jl-^{PvYgxYGI?M3Q8g*t1cHmenJu(u@s#yD;7+);LCbJpUKNL?TRBUJr z?+jJjo&jz$U9s(bdv5J%Q&Y)LB+y}ZA~`ySep6%VOm=X31ofj6coB(C85N6hqiP0Q zcY9yop1#cJJzk=gev{!ljd_XPEW)5A?(mY zhq4O0AT~*u%?4}7E_uid-1MRKbyF7-`p1y=OU0X4kMvddi2wufbq;s)MObn|j zY{2k@8?YmU{kyTRj;YuP{GU>>!%3VIhU3||;>n`1skH}|O=n7w5Y_r|khvHo08T6f17(uhyuHnKg5WXc7JspW8Rnm9Q}cMxSV@hpge zOiUa~X3|KZEG4V{vGn1X4oIvE>JqttFwAmHL@lP=~b*f8Pa?2f7tla~*_BvW) z{YrbNPrx!mbV_4X5=T^u(R3z+nsR<=;cNjTX57Xm85F&~>I`LcbiOh?G4B!~>*a1N zm>sjB!y8m=dSZGiG2Fq+w-1MX~gT#uSJv}?s6o<@NaPLeU&1S%sgl<=iUf9?_w~8?hTKjbx z=sa|mE4|jVrl&F3SZAGK(*5+L*J0^SW->@Bb#rU$jgi%T@u|tdWPHMzY_%KLW+syj z*EEH&ffalvUU+$H{OYH3-c}zUE zU3v5;^XSXIbMl@FR}QO{ah1OX=Jr$1(I{8x*<|0poxbm!IXR7YVqE#%Z7SBEN+c%r zE2XwXDto2k0S0g1vUDM2OK41x{14JdMNKR z3?ZHG8Jy#sb9(4cWSz}0IWa0sj<^LH+LBX~i0nc`q!KUd@C^sTc3T{lU#^?Warwp_ zJW0cNJPS^U1^l$5mrpwjPKNGj1bJSGyJiL6Jrl1{Dni6!-9o%psW##&rPsR}EQ-CL zO)Sp?#E;;YY9bcKEcvci>PaH{KTm|*7l~`|TPM(5tJF(G^m~~IIrm^5*3{x`fcZh> zo?_xZoTP+)NRWGpc{Ms=tE`D)Ehgeux+)^R?}!lBJKt~BG%2;3^alKvPlP@Eo~vdf z)+^!)yu=lJh=|3VKU~)|W6vVu2i_-%H{zQyBJAQ%mo=N=4-tA^B5r{le&ANDsYK9Q zh>(9o>Q4&IPb=8(RpL$fZcOMmr2Q@8Hl?1y*3SN~5TW-RaUJ5q7yGE+M@0Q|#1?#e zCiM}-lJ!|4_#PAbEujzKP{aCrh~Rrg=-qf3%=!a@-xgerEtd6NMCv2rO!St}?+{_v zKCJ)byPF8UV?@-yCiT6=PJ5P!_A^4iCfH&-?UO{v=b6CVuGDeja*PXcHT)qWMkk5z zX;$z_!KVbD5qwVYG;uA)kGKQh|4IFe#0cyW`X#}a1z!<-Rq!>zbAmq*{E6T{3BDuv zt{_a-_9EOG;kHKZG4zA;kI4B)tPzX|t`tNFbo)9%OaV=5KfXyoVDQ$(H@h@TRCQ1CIqF9|*? z_-BGI3H~p^*9CtjsIX2^t}R$C$n}x+{MMDYMQ})PLhydUF9`Cp8}ff$@UI2`R`4GM ze=Zon1R#I8;8lWa1UCxq5bP1WU2sfrTJV0s-xmCe;6=gr1dFh4QtuMMm4Xd|I|XkM z{Fq=;a9Z$J1wSkJTY^suepB#_;NJ*d5PVzkUBN<3K-$HRN{H78Mg?yY>=5LKN95zz z8^lS$LxK+qo)G+^;M0O<1b-sP{ep7Ju+|W-5?m|TEchA0hXqdwens$41YaZ~=HC_i ze-g33|48U}h}h5H6S@csA@}jCiO|1}7*VQ0=q*I#Zbs-|6+A9@O7LmHZwbC6_?qBF zBINuZp-t>-)K^GEeU;GH3B66|4xy7mPYV5Cghu$3S?N4OQO@6S{sU2^%xYQ3LF@Gy zbQ9}AcS*ZmFF~h-o|N{7gg!2`s+&4Gj@M+sY{tPcx0Few>azI$R@Jej-$K_7;)P#b zChZWqIx#ps8cR-$q*dLpF2@H4Gk81dbaHAk@rhCXZl3Fa-|iD`2k29EL+NpRp$lCT z>1?77FH>u$vUs25?K6_$`@6dBecg5OEZ#E@PG=$Xm%n(dLm2t%wZ0fL?;||YOJDpd z6T_fdG=*5>JarK33}es!xD*>zMAklfbn-PSKhU#@X9-a^C9C;dF<=Tt4En~ zU3vFFo+|^@^JUsiJ21TZBHwLpC)BuoT2LmRdwma^@Pjl&F1L+)x!1lR&Z#X}M`$0W z)4YB3&FzDt8bqM}$W!4Kxi`CI@-4wUjj$k>+xAh=UcI|vNEmh0i(}us-n&qC`=F>c zLEa-YOfI)=9JE*7KFDJ{DX$o}8)u#k*e8mc*Z)`vd2UjGW*hHgf-YYS=R2^@UoPJX z;d2{iz~{Zl$LmYD-7@L>!1q-aY%Ix=6-gKjPR1i?Bn^ya z#LUQ-EJ-Pb#$3|cfi{G=vDi3Uaw#Q*Zv7NDp9FZ7-dsNls7>g2_Lnw@=<_a`f6E)Z8lPhM2vnF}iX!;4{-qYqzH zp_vO_HFM74Rm$dl%dN0Twx!e?i-k``XU-`#2pOtjGh`Yf-vgf2E`5&NMy>b7i|q4v zv$G8$vD0aHe14DmMQ;c`QI8evxoAXZE||bB$hV@mT|5$=IcEaB(RGdx?!nDEmOWRpyzMO8JkcZPbD`N+*_X5t^`4*W zBYfT#TaM-xd5quEOW5>C_~b>e@!8k@t!=UO9XZcfvFt-^o}Qh33~@f^d!gsNI{Ka0 zb*x=u%NRTSjHO?x$2g|U6A#AKs@8`9B^{W$?;L)|K;^F z7f!eIoIBle+c{?rFb0j#-xyu2bCh|#!I2X^d*NOW@>=Lw=u*+oXd8bCe?9@7jcT!; zcMd|Xo_n)`dj5g$ty0@IhtH69hYmo0ImQ6<=z&`1G0K?b4OLP$QC=Wr@RT|IFm2v& z%I?@Qrsa@nAiteBGmaBt$F=AeVte?=`A|4`ap+pcb?{sja)7pQzE(hwqdy4!zlolZ z$cLOasDD&^qV1FkIc2nyV@cGu6~)4d&6z-9P2)H*CQCf3?3oQGFP;v+cY8FP>XX9aS%$TLyd;P*ND$@%#1I@^!^u&W+^ zye{-K=moIzWzh74>k)JDjL?id_Mr!!_rKqdrC) zKSM6P%ugkHu7e$z6OX;qX8YX>n)#_jFY}-I!?mAf`iM2|G1|jA&LPf;G<1F)GB__C zUrz|_`1+9O_zGk&_IC;W9ng&ZF`pe<>fv0+y4rBJ)a`+M+m;S(i=($6^=&S_)sVZ) zr59`F1GS=uV_JrGpU@mr?4u8aL-aF{aa`sE{It1$0}YEE7}UUTFu%RE1kk7q3I<<;zqa|q|ZlfPVF=>zu_r;a)O z^D8fHpVluj$md1hmVcU^Tc;x^pJ*+tEnKG`5;_lFuG4pcX6$%2;yRrYx(+ng=|?~ZX8PS&|>;5-PpY~Vb27iU%4;LL;9g?8pat=PbrG4@XUxE^vIP#5c* zeEcYMo`MX{17}TrL}>cWIe)L{aOQkoXlKqJGHk!ybAI2_OOJ!&E7#Q3MS2^H^p=Yr zXa2p1vn73Z=3hwkYF}Y1=U<)FErxtM1|2#Ej=x+}pMf05U(V}OLepQ)>qkV7v!>oF zw6mt3mS+(9;+}s_PJZFnvvWD=&fVYt_3Rrw=ROQ%KF>Q>>%+DEryP#7;XaB1>jd8Y z!yg&@fQN89*D)!d06u~H8QkB;{Q~Z@xZlC8a2Wm3wuMhuZ3`@|MR^(SHr$=KAzEL^ zbF~5Y5bi1558-|S_j9<<;(iZz9hlp2_v23Crd>0*pT+$W?nv`ga-_L6nQmFr+&_`Y zXJRd}Xk>Vj@-EfZ@&RqFAJDeu1KQd?pl$63w5_{rTk8k-&>FkE53RAw`_LM@ybrCh z%lpt8ySxvru}k^Tn@CTKYxBn7=80rJ5gX3Lv!lBC66153dfO|jY-c<@no49hCJrU@ zmda0L6Y)_YFy1@j$y8!AoX>>gQ&XwK;jv6MJe-P;+!3BkOlGo&BasNE7;-6|Oy^^L ziGy8}@$rPER<2wb?##vyh6fU3*+gz4j0!Tce)oYyHlLhK6t^`sHH8Ngsj<0wRIrcE z!LY4K%M_(MGms(Wj#MI^6~a;J*w&Xgln+nAENR~r&&{KUGE?qm1sf70;9%-I@@*R? zF$#8#EwjL(WfVx|*x(ZKX`JVLjFs{keoWc&U*SOaKQQ0)g@Xbw&uad8c@g$@<@J?t z+3@*H#1@o!8<@QTb0NV9G(woyQ}Q5Kz&S)P{GIHMLy7WUy{MPqF>eE(rv|#b*EDij z@VvwR*Dlm50wwpe>MN|;di4&LaVzg1)Zf7JW_J7B;xC|V`ux5>XOj^Kptgi%j|thn z#fxu4Iq*yTc^h{r1-Gk`p8@>7|AxOM|A;?jar82m7!Bkp+YN>06*dw00cx&Ah3;vn z;51G}{*x8;s0uy{4gQ&Ou4%zv;gA3EDq0qNl=c6?=E=im|C2UPfaO2YJf8nfJL_ta z;4iro!aQ5iSW;hm7b-k|0|6xswMQw_$JX+%Vo)9pv;?jJTDPMnu%?81l@-9Bz`D{O z0DRUqwyf7gz}f*7feo4{w>|~C1J`LHWQ{>rV525#t@|J{ut^hj7S#tfYogIw3o`;+ zG!eGG#6InsSZ4hdMQ_!_3TueOHchOy-l4S4h3$Z-g&j}@cGT_w(PnL=Z9BEq8?2vE zT9+m^Ti<0%ckqwE-EQ4SqPLpa&}rRI3;HUDLF}+LQrhmoE=ar4`YQ_fXyrZ-JFOqH z&tB`BVCc8rB-?F^#?f+%#oz_@)n`HMvsN$$AJgXSx1OWbA20nLxJRwWNW{vn1~Fm1 zM$!AVZ7J(XqQeI)~*3j zc^plC-!O|k%pu<-ikkPR!+VViMj)*0{)$IX<@a&0gFlC~vIlfc@T)MU>_NNyNpJ=m zbYkiB{t=i%s^q)65C1G~U{%>S@u&O>PvvVszwZZ-7W_Dh*0Ks+{uIltc7AdySnKWb zPvEJw$u7^JzT!H&yb|>l8}0I5_)#G|-+(z4n{|EpcOWxRxju9cWhC&Y^15o4l{JbU zl^e_NK`eY0&Sk1{lP3Hy?UShV@ElRO#oG(+swXP9mY$}FC2+g4qw~ezT zo9yx_^6at8cd&d*MJGfA@1g~Jb-Ai8w7YZ*0%$#qj-meY$IxbnH1yG6A*7)JP53Rw zCN!vtfb}adhlVs!W-Ww<&`p{sx4r>Ap*@c2<}8xZH-46?cKE`CGK8nl%0zHGWv*sks#u-Z{31 zD?Udyo)V3kw_%}2RRuy{FMS)e))#5YA8UnhnZ7((u9wZ)&iG*!`V&oft*=wxQ=0JA z_9oLR^bJjzwS$Qf6?$3|e&wm7xNmx?Fc_u9&(u&&)$*!9=~xN$eFK83N&{4(tX241 zRi+8Ux}AJMO?a$25>|j+ytTKes*1n?6a%$;RaK=fR@V-ys*o-=D&2_;Ix&4Jz(M<+ z0`2)bm{nEfDM3~6U6c*8hRwmxGH7O_F8@D--tg;*w%}>>H%h8sgpnqym0I}ch?^16 zJBnSSH?TJx9e%a&yOdj2@>5hvpFI0ixN3BtCD>TBonE!@tK_IIsX&$8XVKlXsKewI zGy{SA@oa3I_-nM+C6#ew+3&(I&+&ZS?I0>`Vyf;A5VbauTJSvz*lCCH_#F#gqlTR! zJ*3BPU!ZjBVw+4ZSVlj)gn42?4qA<_YP)rOL5dOCqo;%C`2GbyWviXSp5vpc{>NIFB1`4H1K{tb=tj(5YQrZpmoAK%`C{XSpoh=NU4R`fa4p*E^yo8sY6b?D{iP~)uM=T zL%kD{YwEjd7^(KUKiF1JOY6{KP9)ju=d;gaZZKVLk$G_tBT$VIYDCLCF(0{%7&y#D z3;Bf$Y2;iOALlxT+2&DyfzY>%i0!{F~5~*C{qu-cY$G=_nMxbX0y7-^o*P4$!62|_h!iv)8A~GW2n8)^iG%o z@8NEP=3<%beq_PtZvinHkb97tGdldx9J-*S9+qg=4#Y+n`^qwb-Hem z^7uTShy|@4pD|_{llPgvljc?9rnlQPprXmVDx%9r?lUXK&9VuzvfHffHUm9osM}nu z3)RryGafa~nO&wQ+H3}U%`1A$k}sO2<7TMGG^65`I3s4&v+uWVGo-*Z`YRq@ z&N_;|lyO__u4`?$82|}AHq7_$LrSQ`kRnKZ9~9*IZVcGkcYJsw-WOw75Ey3;qwpc3 zfP^m@Hv?T}MGIhuxp3|KNBN%#q#XuZ_eyw%^jKoU4FC+@8XE=y7=asY_!z*~ZDP8( z63whXVm5Z0SKec;kC@HhGS_#T72jeSBL7Nu@$Xzp-u|0M{X?bpe5e1l!|wL^!=>-P z+Q7}l)#p9(TlbizcQj%e-Wem}X~zy6i)F^fVtEzo+8yJI#n@Cnt70P)cw4ACcMoxU z*%jM5u=}RIPL)f3A_3N&iRAbMdgLZD+5GVI80yE}HV2V%Pi zx^C?1lTOMU_Tx?kXP9AuqDD& zZm*xnq!W&MkE$HDTUgKS))vD4 zz1T%3RBQ}B=Tz)q5~qUEcs{Opj%aP`=!0d`Sy-2vo=j_Tj-guzJG#1J+9_Cj=QM^V zuktMguVb0iC5_-CgxLkp76bRXRP(-;s@{&oq589*ml$4UY!y8rEh;cKM@-&1f^qVj4@4R zM(&WHx2o7A+?PX3tTS;y;g0oX4yv5an;ZLX3U{=u4{wO9iA2LqlVhn&Jl})^=N9Dj zC@ZF>w;ULoLMflhHH{|Yd;z@$r&845l&b%ZOl(2%z`9lB8xJ?_jxy8u?8AX>X;s_! zT3)B6U9*nuNn}kSJj@}RgLA-6E;@qvl8Hw=3}GUDAeqe|SMrps21j6y8l1=+jOl>H zc0p;P5DgtGX9UaB1|D1COg%X{TQPq)2WwM2F)-#)d@9fZFrzxDc zwAQ6|a5A1sxzy_M)K>&^y;Zol;P0{%lO3HOM`8OY@0SVZ+ewdtTB$+L+B29jfW&e;^^u(eUk2?~F^I6D9!Wu`1UfSfTC6>(IS%^6`78WrG~}$UAjoN5{tSih+1;YB(8B+q1H1-Ky+VvgKNv!rNRt zcg*54l;^IBa!cW%b?)Nphiw&s2R*-QY%34?=GvUs67DuWwDNM^dAQm9P5ET+{`V~yMSRA9Y=XHZfatC4#kw}0rGpKC!(WG{=)KP)QFI@$W67 zCyMBUMfCke^ob(+R1y8PBKliJ^z%jZ&x+_bi)g;%aW49MWf6Tt5xuvFju+8)7Sa6G z%eg53lJA_{=fq{BYFS(rZ<2+5*mZg;RJu0j_wT*$JAhA3R zGm(lPj!hO08n@#Vty_9CqtmIxc6`||cLQqkhq%k1 zLHO2+{kGxT7#CO30qOmlFi&6cl*`1fw9CX1?Dg1#=Xt9c=GEvg9&qN2=_YQunUSK; zFod+fXRyzG_W5Ekk+(O)WO`hfY;p56bS86Ci0phrq!KUd@C^sTc5@t-U#gqKap}fw zJZ!^w94^yh0YB~N=kw3J!=rOvK^oTLZoCrjo{3i}6((Y_ZYN%?R3~w{((7F#7R7$h z9xTs8#E;;YY9bcKJo&Cw>J$bHtVQUgBA$)bpU(?*$^{+>LqI*o3nI<_D2` ziUn<{rB;w$i{J8zu!rAsHLk;Y zMZ6L(aRnbDVsYmW*Nq#nXA$v{=qVz8xPOKSyPhR(fkHMg)jC|e+v=y&k)=3?U~ev z5lhzRiQs!w=(mL4heHkP?5kAcb zo)UaQ@F~G(1WyxJVf={O@cp0EKSvD19-*HXd_nLf!IuSJ5j-pSbHR56|55N=!S@7V zvbGoD)(E#Xau1*%oPR{lKVqX`Sa6vjLZI7M3t|dr8mX=ksjCqwsIgtJQ*fss(nWc2 zxYTw)DNjQD^@!(9{gV^XqxAXEgP-u0OTE?uK7>&7bqV$h-YocW!Gz%Lf`!|(Xs0E(QgEH%Ho-o@TLs4ivw}wie^2mn!6ya3EqF%oF9pvF zzAecAQ%8GB5i{aKL4I6AIx4tDke?>7{${~ZL7o>_|0zL!fkygK!7mFwE%-gb=LPv$ z5&2&g{Dq*xI>mZRutAXPBkTFCD{-^nh+taqe!(vY{*fTR&SAg55d3SwzZd+apdS-} zeAR+W1o=4*>(>cx6YLYzAK0ONLg;BheptnRUljbB;03{73zlKsB;O)I{%lUVMR2>| zM+HA7m=v5A{B6O{2!3AhNx^Rmo)P>@!SjM|3%(~SdP>?K68f0XDv~=qiPvkueAdPZr<6^kB6)m&t0FAv_tKGJyc3LM zGd7{C6T{Qvv1EEIqavfa93LLe;x($>$*#%9)8qWzywCx^-6xz5(5E6JnMr)13tj0< zJ`urN*QQ(^@0Z+t#<;nf%UZgx7M#_7|JGWneAC)k7^q#<%SZQRS<_62ZGZO1x7`!Jp6 z?4xf^9~9Lv0`;e^3a7}u*(sB65$0)_1-YEITS2?^?t~#B)KM>veRF#6MA_+sqFN7m zkI*o=oVH2OZh5yr9^*-Q<+zK#o z({KcQ?u&f9zKq)`lfD;xUuQusXWSkK?e=3o{OCs={opyu@#ATfG3-+SeMMI*#T;@j xM;Fn_6}IgMUlc-k7DFhtybzE&U1_9_!SVZC9UXbJ!Oiy+?E6osb1sMP{{vmGF^d2I literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/2in9_TestCode.o b/docs/Touch_e-Paper_Code/c/bin/2in9_TestCode.o new file mode 100644 index 0000000000000000000000000000000000000000..80966f399d9e7da93bcce8daba027d1020a9dd3e GIT binary patch literal 20304 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 U*z#zDqguTS`@Y8xa@g(uFKDje{{R30 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/DEV_Config.o b/docs/Touch_e-Paper_Code/c/bin/DEV_Config.o new file mode 100644 index 0000000000000000000000000000000000000000..6aa18d02f66b2f8f89fdf5c4574e9ef400346a3c GIT binary patch literal 10892 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V3.o b/docs/Touch_e-Paper_Code/c/bin/EPD_2in13_V3.o new file mode 100644 index 0000000000000000000000000000000000000000..e09c440f99446236924ee22935c311fa68decbd0 GIT binary patch literal 13132 zcmcIq4Rn;%nZDo5e3MBs2?4@SAZSDo5Rwc5AtGo9Q3(k@LKGC*VUqchOgovG&JT*~ zR;=u))}Kn%+A5YH*t(}%-0bt*@4b_6 zVsKse?1h=BZp3@$la%MkL?L(sgQwr@YsH#~I{yWalXp;ao(a~SC9}TaO z@+ISmZk_4r+qo$FSBUSsz%MdR;7vfrTr4N!K-=pf4+HNL+dXHn%ZS|_VwVI?TdY@G$hoeva^SmzVmP0r^pn z-BjV@?W!O@W4jQqh4!#5jGb-Sgcz`y>DWySr@=QvejMnH?QP-X>--($?^UOnH(WnU zl$!Mz?Bnpy`NPi?bY$lI@Jju7s=YN5PvJ; zfAb9cE@Nl87d(3JzI7P;!v)ZIr;fbdTdDhMPo~hY6a=`CD!F`YGy$1V~FLHBn4{Uvpn1Ayg zF`tBP-}{J}ZDk*_KiG%wyyNx}+y5EHRfCwYmtFv0=RyC+Gw2(kkAHyrM$X``4!(AN z0DnI`gFhR-t~irFwCmd_$2If{(CiN!Z+%8-GZRp$ef!4pZ63Mu$j2;{s&R=N_q?Y* zuhsu9KUXJ|nLA^xYFVN7ZD=bxXxp%_m_L)eXn@QlmjLkJC+zI=eD|iAr|0ifLf5v>2@cHch0RQiqUr>+dfeHldL@KZRuT!*W`Z7Yu zp35?!vOlu?cKTX7|9WWrf6M%5>xO9+u(whDC`I?pz6ByX5DXll$_o7yftE4vzX-AW zXHH$u{1uS;>uPs0-^Bc^+7$D5;w$j-3|1ZtJcsYH|G-!1DSS;q@p39GRq;K5eW=<8 zQN?=HZ4ZYBAgWl&{6mw6ncsqN>@T}EEikmd=GrV`{_EN%82BzMD~D0)bHSydUjf6v zge17EjP6wUF@zReQO@cE;d&GduGAzHo{8=awrUa%@1@y=n$(1UL*b;t|nw>KiK(iw}pAqb;YXR96j*xsvhqF6;nq@v*{tZAp z{4RvinTwQ$`Edqb0hX55J z&LqaAX9A^fL0A1Oy$0q&UVV&l1R9amw(E`U0#)%ds6w|^_dpa3aIh;L$5-f6T2k>3 zbbp(h--ueuXX*J8dI$MiQDl-T`#7MY4|SE#o<&hjIm%R=?VI$dcFAc{QHHO|dDS|P ztg38rr`;}?R<3mOX}GAo$jz^VJba;>-vfDgm770^V8ddwnKrAnJj5A02RhvWUr>|Z zM&6oRRt2yTg;JAe;mf+vBbo9sN?x*pacmX~nLjv{18qHI1#2PNqD8E*_8M2*d<|;! z9Y{{wP5!VI`Uy;Y2lh<6m$f}?O>%i&OKX zFcMbA3iiNHM#r-Rp51sd)`Aj0*>Qfd9zRbp;A^blFvj6Y?dMBHKi61uOZ@CIezI=6 zb{RjJ>EA=~8&G`4N0b$_YNYwoUxK)Y;)Jq#tytz z>j0zqZPoKI&g);8$+9pC2CjGFb=boqQ$1Xf42%M)-pJ6Xs>+USl&Ud{SDs-CWT0rAAO z)igBUwR(EKj9C3o==!jp{%qo$zo6^KtGIV_hq4aNd4QepP}OyixRZR&dP?rC>Mq)x zHHlvK2j4(px2jpgEPP#65)ux$b?`H&yzX`sv94PzAF z60E_A**8yBR$dGdo{`x9t5;QCRC!@#=TtnGM1yr>Pl6HlHUd>;=P5$SvO1?)$dsQ0 z-VBS1LF;P7pUse5f0IkA z@Zs&tlqPjaoemv#3+mXkwwa%8hm)yI)`S|yQER(#Xy0@*&084-(<{+oQ!ue+Kodd> zil#G*e$iQ;8tJ!A{OWF`n^{fh0k{3*OlQNCev78{-o~-)oTg%DdCDqvRO!PKix}`%k7joI=M5-@Yh&#=( z>`-Gekt$r*IFKqhvEIaBe{*jlpL4BPWT3BaLaSEeqr_nenXnwaH|O_eoSbTEW(Dig zss6-(Qiv_ul1MFG7QJd&Qy)XtR!xI!a4sLmF|)CNuT)VIclwb>i}Q&g2RU>}E}t#* z<)fE%c3%ns*2q|nF4AJPHy3rX*<>P@hXC#iDP-fWa=^)_Gx=y=I!m8Wc3gT@)D03G z6GqvVvh^VNUs9HBcOBtB+v-Z$_Msz325jrdmy5ZFin&K%X$Lpj_A|D>+qT!+fo9vc zltQcP5!=^=WLwQw=$vhJZ!C(o+P?jEWtZ*SVAtc=>~F>s8_;i`O>hv3FJSc#qHxOg z-P~o*q3J*g*mDM0Tz`wkwg&u_{k9$Ye%FzsT{j=O8Daa&A$Y56e;3J+9XMqB2b;T_ zyCR6KyQ}-qAikMtwk`kM4R*PIca!Z;9O*g=u}M%P8#!cKgMV*V4%*=^+wQh&@V&vV zZMMrd*i~*L77#k^avi-r58%7Wwq54CMYpDM{{+Psvs|;?OlYz->$ew@iR%rvcI~`} zYc|w%?(4SCL!b8#7+^1oYSWl3VPyV>4P(+F8LTc}04oi%CXtFOKrB0;qUmHjn(pt< zIeE2xTeKw-T^5P9bZ*k~8(LT6o%GRdPAa}GJv0=9mmH>O3UgFNJ2yvju{}-{N=>fK zCh{&TEu3_mjLHqBv-t+z$a0D6ooHT{NT&NfimW!50CZg)v3#thRNQ@KkBUa~*Qa7b zj;FRv9)a{HV*@#8xd@lF(6`PmUBPUB)^V~tAx09TTgUL=O!Ij`<2_S)&!l(&M0lMli!XGPhXoW zmG=~~sm-a5L@twz?Tv1UW%G$xGP*sM$g3SWj7>>Tv_#S5Xz$+WU^<6R%g0&G<(sZ- zShsX#Lu=Errbt8MP=7KV%Qs?oTr(KU#wo}Y*6iueAeT?(8sqTq^ySxJ3xxz*s{Za9 zT!ZYM6^m&%(9pO!qLS&ms`-=Tiv@L14X<9oj`YPI2$YQff z7KYH>dO+Bb99k9KlaKW#9W&QB2HXzW$}|pBg;XvvkaFS;eQ1>)Aq-x$S35P6&SlX| zEPerIl*hU+9e4WnHc6AQL1{}3L5zh~n zdR~W@9d79Es&KfPM&(Tmo(gz`_LchJBG$cM;(06PemmaVsOYtcxPt-a@R&8j=TNDW&J-rAS%uM$ z6|ivJrQ93q`)DEK4wAdpOS)apmlDZ(M=vl2vu>MSN>R>-70c<6IU?Ga!0f@Gk41O2 zZhX4Ht%MI>CFcj8A-vD&?UzNjtliqvxwhN0yXmc>1mzEWvrLat zWyxaJyP`a}xzFOiw(eNxwyZyaBX?Rq^T%fQyQX7_OS3=dD9xlU32&>zEnHo`Zr!Se zgG9Mv*M#yP+BdCAm-BHb_!KfFD8bv&3dnd_KG zm-M#BTJS!xF|W?dNj z6CS;>B>HhlV7z0=*70)PxXEo#n?CSU;?~Et<0ea`kuhtD^?eH5tRM2Pf}1r%{?FiM zosho{Zq@}k2gs}g@)?N5%zJXi8^TKgH@Wd}UK?(5M8CeVj7j_oSAI|OE4<3{B)`I? z-IM%Ezhfv${N@)Ak@&~;o?r3R@mTV!DXK~O@({$65m7t%F!F}?6#Lr!y{CU1&yC|Z zj^hW$@q^>|qvQAyaI-H?L4W>eoc^cd_^-zCKY*KkhUJ5p3ua#-uLC#x2ze8@**D1f z+k@FB$Q_oKH>%{H1ULHtdC3zISL1ncH7`~ojJgl0lINE9Ht{aS*a_tf7Xou^DtTCz z)>)z|K1WNcn$W~OifcPlIjIdd>82dfghXsT#wUTR>FZ`0RJ_k~pbVx{<8;tztW ziQpZ=cL|RR&j5XmN*xsWlY+;Hc+R~noX-PaGxkAZ1b>HxWkA0X!PP|AbMK&>&jZ>I z5@COj$iE_Zn7CA_7loey(*89f?761vmtkMU+QW-FRZm2FmIy8OBu3PxaMA&nm_nnUyt3>o$4G|B} zeb_H(4>RRE2YMm~VY1*fLA)o$&$ddzMETBj-*M9pP1p7-1lI_1+^Fvq+%Cv*q&zM7 zmxB8RZxy^(@L|En1fLcBp5RM@Cj{RVgoF}+c@M6I(!5xC!+gUCvc%$I$f}a=s zvfwuaIgeQGhk`#Bd_(XLf~N(~#eAbZe-N7t<|~DNNO)5C4T84|J}CGI5#^o~&hrrc zza)4{@Ha%*ofaO(I-^~^V58s#MA&r*?-ArWrF~xXw+TKX@~;X%D*Oe(S494nU=b41iLBK!^ELGBlbW4hoRBJ36l zZx+5v_*&uJ!nXb50=Y^jT{+e)w7Vx7{Ra6q;rjW5ylTqr9l~oq zU_R^OpvmEHftvEpb$QjK-#0b&=J100hKbI{dV90Z9#|E%v1}|g zz#nVIMEJqTF$GYUYU;yFYX>iino{Y!(}cIDjd-<*H<_L?{aL1=msinkfg2k#GG0dX}Oh)1Jp6Mk?3o|WiZ-a!Gl&ElDg&wSz7#&kM{LYL4$ zlJSQ}v$i*OqZP)&MN=dK$~=cer%I)8JSZmPkLM#(hRO?I_j{}flZ>tv0&hF&v8Nt} z6SjkE$FyTT@}>;3>O2^n@(4`!nsIiOI3P5zfFxtbzZ~+``x4I_kg;CMO}#_Nn=;6% z#qf87=_HRXfxOq>Yw*YZr$02k=x;Cb^v8Z=dK522{snufN!0PPU(nd?Kg&IPj<>r* z?2P;|*m;wQ{UHcVo_gBx*=-Wr%k&^V-gdl+cJM69cCdd;zkCgObVCN?ZAo8Q2Aw(nwgz_U;Y==o^k_;p>)A>Qs z*4j$D_|q0#>$*>Ai7jjYT%}v9RM;)u`mFY6w?5l$*LL@@Akw9-`>Z~-t+u-C`=0xq z$(=Ev-EJ?;yyyMC?|k2Pe($+=^5Lu2tg>1vu%t2=(_ zJN${~w?_}2R?$B{osXXVg;hUx%B#js{?FO7|JkU;c@-TyX-E4`Z*|po`|ml2+>UNLZE`$UY{v9G)AxKSE`z^KYQy!(Nt7TkYJ$v>=_M_qT zQon3G(XCCDeS3WDq=kB(`mvMV(Adc!d_NZLJINSFfEMrxpa*yi*n@aCp-qoPx1Ib# z=h#Wk!+i9=f5F`LL;l1B^1C3v3iWmXk3etiKPLRbh2?%e4EZsa-7Uf^?TV0>&7F!l zW1&543v*{%u0;;LsKeY%4hisekgo)~b9=w=%9vXrpD5;R_*eklZ-MK8Az&ED@u$6> z+mat`=R*Dzut#h!JdbTFbZ23^RBW4o6ZvcqyNKA;0Vj&@Ue8>goJ;LWwP3<&`v$~1 zD`m`$Q*WUBI(Q}OyF+8AxHlljQv@_i^TgX|3K zZJ-T43-|&!Z7uNIfQ;P)d=5zddm!7fS*aJ9uZ4W)Am8oOPTF^ z5M{QHu^Hp@K*snMurdbw*2LhP;T*aTc3%U29T)=M17w^Qlo>Mtd^FS>_t^q0G7ZN$9zrtmy5} zQ+_104g1KplU}vqUV?63Wj=3{%ck?>!nW`HBXaSdBbR#I z6YFtrn5b`}u6$;=`lc3T_5<7gME$mt`@P;1-sne9c(G5_M`xb)L~lQ#qCe92%PY>4 z^M9SE|4u>oQ^t3Xr}W?Xa`yf|kk?Z{+CK>7p7R|b=jpcv zzXjxe@Hrs&gQLL8{h*fl*E@S`7s~99dtk@8RoNfkgM3FtdzbJWz-xlJ;qGVd4aZ$= znrNRLbLlJFJc`(C^PNDpIR#{!KMrJ@_XvIz$Tr7;Z1b(a$~HekTWK@rE8DyovWeRK z3CI^$w7IOksJjX_%xM6a0GfS}_v)Txe{txtP_kovJe$mg`iuG9SiVY4AP?n|BguF^ zsr8+>BDqLftq&-L%@CK*`W{aA!AHSvmScXlMr)ME3QYAXG@jdCc_zHXjUk#{UMTMoRZvof`>pT!u--FopSa1lU>W{Ge zz?3nTZ$V)DLC2;BhW5jb4J+A?XdA!pDOlFLh+6miI|Kg#41N|3^ItNF?o<#HNck64 zF}yGMYkd0`YZ3_d&}@k&!Qe5PE!CtxxQAw!Y0?<%CAnOarrr*CZ6& zLQR(@ZNa;cxPOHv?ZIVq(5=bE!IwySrYls92CGf^oHgIAU6a@N#3W^*&h5C)_H%`*8z#(YpfHi#v)b2!7G^CcAeWu z@cY#C2bKV`%6k`7lO{E9$N1C^)4}|@x=+)>_j~5!qawhW#Ju!Op!8SJ)qRy-eX}92 ztJlR26t(SYV>?$>UkFv;j=D_{`F$Mh>O+*=sU_9lq5Hd>GN)Npi=HomH&MO=RVJ%R zw*sn@s8cnwg`)cBp{stEXYv=dOHPyOYf-FetJ7t0RkOgEcHf|Uu~Ys4T-03dlv@!t zxYQ}%1bOf>r`(RZL9uD4%`z>YazDz}LzaIv7CvpP0}Wm1dTX!c-&(EI%UU!H$EY%g?vbwbo|K|8juiit>TiN`5w5bIbf}sqnMKeF{9Yn4?m&7YQqcoW4bWnFDGnqI(0Gl{VxmVYk_PTVu4 zxDji1S^k|BaXZK39!7N&chPvb+>NsdX$`TYpsaWIvytk zhg+q6v&Q3G3~^N2H@hrO4dYZ>{%k4Eky4ysMV#PxoO@wp;!GKjGX}AV)8LLX;|SYu z*x!S27jq~NJO|UJ4d_ej@C8pn>DhmyYTm#JeW?b{O0KCLfrRtH zI`C@-ImT43neWV|LhDE}4Z8H_F!1cps+LQcS$8ehvr}m%=Brbwd!FgMmaFOH(pomy zv04GE)(y!aNG~>4%{!RD9DS;Ax<*-3tc&WV)_Ch?)=jY*{PlRa@U*F#nkyi}Z5X$h zy31-VuUT5tI~BJ+(ZIDm8AjMX2~YZw#P&ErY0*mT}E*DoeFKfn*H`Vgi z)zmnCX&kI|*(^b&+VQy9$)`fgdXs0Nb@k%UW=f8~DPeVGv(6L3xy@`xSJQpnsL>F% zCe$$KRND!v9eJ9tzTBQEm{x<{X~0yS4ov{*mP}`q{Gw-E5$U%{{OUfVo91w-buLr9 zYzU(poKA4b>0)N7LFMi-qHxYkO3qa)=LtR-9sSKOa~5Rzbqu*jZNnt;Sii5URd`E` zGR{uQ8cFp>u3F!tBE@_zl1dMZ6cfovJU7}gl1dkE>KIBFlkxu4@L;4rRmeM5tTHq( zFrn2FS*6F z%CrF#p+PA6p>QfX)%xgyMz$5b!>$>&gMGHW#;(WrHFjgfuDZsq#rfYGvF8$c?J9sZ zXtx18AF*wRdG;dZ)E`$pZP)CXAo_fUjo1-F*w$>&ZYPt>u5mI;o4lecG$ z-Hu)xv^~S7fC&;Y&GM{S>mH9Xn+HlRI?riyhn^6aK^`BLI;L$ZohVyKv7S^uI}+cm zVwsUdEHgNmPZqSn%8jx0z1ONdRzey}LB)F4#q#l8$ygE|NN&uf3J%K;XL5xQ9}@Ga zo0GAER*z%`cCsigW3j@`>G){URW)14m8Y_)m`krqmlBF`F<-I(PTVU$)|*bjtyXp} zVuZn5GMP)}WBtWJ$dl<^saz(lVx#fg&SWmH1Ll(Pgif3r!OfX;QYGTMM^Zz>1;rps zB*un~n{=ZYuY2>x>r2FJJF$&ueNVg)S6lOic&;L|vixJ~p-;s}Vq4q_If}a$&8OW^sAFAJ zjbze8A^pYS9B0LJJ~fn1CiEzm4F`Kds4}ZR_JJanqO(Qx z#|L&6voYPCx8@V;9)VuTse~sJ_ub#wb4sIEnyqD$)k(d?W1JO>7BVVJL^LOb*~M+F zl<@T&4SkL%^_0`qgCp^wJi2rggFD`_TDR7S^wy|F+%e_sz_G)BJw`n%^==XyOyNYI z(Z>#)DqO27ro%9SOws9|2`5we95%zFu3owFvQYbmcs|>oil?1@p<~hfTsGA?&tW|M z1@SqH%Tk^X*5R0q<7nyP6F_%e;4aT6t?nQm1$mO>Wu75ixuDu z|7<>xlwWR%PrY*1t@ZLrz;$_f;CEeK9Q*5CoDVyAsL~hbwg-F;Fzbl$ZE1VzoXb-4 zP%!Jj*qiOLbz9lI2Dn)l3)msgb> zX{lG~7a%1IFW%_7FK@-{@hZFtaa~^3pxR1(k2ey~Evn!vEBLw!9V}<@M zaI^d#{x7aPs% zOw98PO*gLZbue4O$HDX3IGtVQ#d$*G{jhaD_Dv$*J}(pA zBm4&83E^3wr$ea&B7aoyI1%^9XNB{=;)y8r5;2N>70ZEfqJqnau-_z{_Z8X?6JdX^ z$R83sLhMxP8Q~{@w10sJ`&TKy1n+9G23r^6LqvNn7F~8|n&psmT?tOD%ux!i6mgm$-XrV% za2D|*=cfqj(WTmMkswmkyhpHCkiW0fp7Vp45&V$g9>F^VKP~tL!7mB^o#4}gKNdV8 z_>$mMjx*xCOK`s6VnN=UsOLS2$a@hnEqIIIUcpZbeqQhq!DE8o734jIeohI#Ecm8i zHRliXyq6H$1bHtZze14r67sErNx_`phXwBz{7XUprpqe`KPmi#@E3$Dw3+dIM0`TR_5Or%mvDU_M0vaL1Q8z<&hH+@%Sd1$ z=ism@;qSP@h2%{I71poF!u@&t$d$`Dgvtc}C@hvr4`yJZ%klpHTyhtzO4@iXo*v?_ zW8)(HLYFiZ5KDyz@J2R?H@M++rjQKdZE*))z~XJ1tIlAKuj9ijHmnWD3x!;&zgU3N zcYeJKrsy(#zho`W5BD#P*f#Vv6W_Qst1iuOpPh%Z4l42)ob_oJz~>_2*ar1=2=`<6 zMO$9Dg=_n_vx~xxbvPuv=x>En)ZZpQp4*IXDo(?06BCll=$3%H+p!FZaF1j=xRy*i zR-Zhs5mkIkh&G`-|+H_G(Ke&jWyMX8@*Pc|2I{Ol1lcCTP!v>7AO(e4vcHmYeM zQ*w|tydJ>El*yYyIK!Di1ZR7BeHI^gJC-4VE>vVY>hUrC@-WKihAco|`(`_5HN#CT tqAQF#4m&!*@aZ{6fAq_ku5MMwvDY4QRW$y1Zgksyuv00X+013^{uiJv%1HnK literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/EPD_2in9_V2.o b/docs/Touch_e-Paper_Code/c/bin/EPD_2in9_V2.o new file mode 100644 index 0000000000000000000000000000000000000000..7b12191c7e38476917c8c0231ee8dbe298e577ca GIT binary patch literal 15648 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/GUI_Paint.o b/docs/Touch_e-Paper_Code/c/bin/GUI_Paint.o new file mode 100644 index 0000000000000000000000000000000000000000..10b9331bcb6e5a3643659c6d678599c9d66e0a8e GIT binary patch literal 29728 zcmdUY3w%}8mG?g9+>_iSHxEc4529S2qCj#32mw)n1cW3!1k_L;myp~%G$d(qgHStD z1v<91wWd1tQ3`R?j(y5Fl%dpGUo*8GJNnhOI<3|O4I<-=PRFWW$2Q;pzxUe7NkEO$ z`M%$L$0q;1_FjAKwbx#2?R_4kpITY7%5fZJFGtN%!<147J9LY`K*KCGQB6>xgL4Pe z!7m)kduHviu*w*4RBykV)7$Swd;3+axBqCYy59jl1ayH916A390Tu0iSw;5@ycIn# z5ROe6P_f+uCr~~byS)EM?6LkAP<{yIqbNUv@}bzTA>*LKsMC?a?Ymd|MtJQN~3&GxD@YBABVb8;&V;Xd1`C~>$U8cUUi!PT#wyQSvr$T@7 zc{#oPv($lsKMoH5%XGA{j`PQwpDd7i>JWOS`k4C64^CvE!Cp}oM(N_mst5eoRpbVSnGRD?+WW9%SKJ?H$SVQ)K`1C7sV0(;T3uN0pm}6J$jpI&$r=05po&`Yq zSxj^#Ki8deIfymoJc>^ont+Nd2%c-;OiXgh}2ILf9F{Dj;ga` zeO|^oQ^raiH5UD!V>L*B+S|qz$EuNfvmS%TITqJ}df7TV7X6>|g5M4KQJyk>7W5~Y z{RRAl=vQL@S=O)TnY?iX$h>hBc*O$dfoJ;eQIW*nG2W*u7d+2_6-sL*JjsTA!&ZeU7 z`T3Z06yu@Ji>>IRjhtA;F&&4(R{*|)!bcgS`EEno(bLG_7>MDMludc9!Z%t5`Dn)) zv>z;kUqFBF-w)jW6#5opQoUH5NAS~!pIKH9#``FJ;nyd_R+mxj90T?`d19WKug({v z`agv>J&)7$#fqMUCjIxbKi4ceyk@ttAJ5DP@ z+4s=<^i81e9cbg+80)2?kBwhDwhdlEh4ixFo!c_4$M6sa@w1xnZt{LIgnq^VXB#f?PupeUOR{AsPXI^te@IF z4z!wue8j!Zo^6V4PAaSJ-zn=y-{ij999Ylkm_PR9ml?a0U>lYhNASCo^mW>~d>m{s z?tk_7XusXv$F=325w!2&DVO(mioem|20q9e~{6H$H$I`T|&Th2%wbD-m4+HxM&6~4i;i5uhZ+%u?u zj;y7%EzfV%jq;a)hq`kN=I)oF8^>Zhb>aF@_oLGOJlY2b2Xzh^eP*(IMGn{HkzVZc z!)MM2d{3V-fd{c(JbOL}3fh)7 zeULVQ?*9SZg6qQdI3#Uc6Xv}kf0BKz0J;{yjy$tbKk7yOs2BCy2Or?x_OQ&Kd)sH| zTc|q-f8e;xlRF)gC$~W7Q0yxMJYO-7SihTrdh2)0@6?;~WIpVQ4jwPS8tK?%E?0xc zsXJ|Q+IGb7gB&}@*yCNuG5ei4N7Ih)qCaIacW@u1p8c@F+oO1C=eJM8`z&~8iq7Pj z9MC^^wEnW!o}#y{AB(=wt00Q~0eZeVIQY5K>KWkqHF$>B61iam@`Clh*!%e3VdQA8 zGtVwuXXb3K^FzQW_Nd?)CJXBv;eN;cP|h$o1AOjX@rR>^9}pk^NX!VoAytht#nR>eK6H?p#RI5F?_1;W#(<__z?G^)3is? zo(J2~ALviqlj)1xgEMiyWvsIt5x>oY-)2THAIQVJZXLg;@17j`P;bBSr9If!dA`EF z3*BLpA|0QKIRiSyzJU9ruM7-gk6^6Yad7+@j^$CjqMuqhoG)$h4}*h88B5kS86wB-nY2YzjHge_I26xsF^L z>>cUMA+!tRpFI2sawYm4&Oz?M8gOmGvR)w|@8!9E%+;sMvo@E$j@*FUcJkn(M&7}3 zW0Q9X{G9Jt`K|mzkpH0b;rd$nW91L#k7ok;gL}e9-MEVZvE(he2P((? z4eigh;r>ORBQgfeK2Wdk^SB2yp17Z!<*1@Ba~$A|WfoWbMt z5gV68yRO>rWUm=ZAD$V4eK_uijdMyL$k4vcamT9LSo(~%!5I2*&Oy7;rXQx;DSgIZ zgZCgexHog%-a|j`+00Kj4-Wq7_b5v){f5qEd~Sfe#&ek7|FM6jAV*UU{ekCJ?%7&~ z&c!&>pQcZGpwI9bp+d`{zr8(5H~Qj`TUK&W$audvvwi-j`cDV^CzxXu4$8qj zljjoT!2ZKHXY+h_mHWRkYXR{hb@Vp^wimcz?ySLGT{R zo}CygwHT8*oUv4i@)7KxgUHhpa3$9QpeQ zXq^LiUx0Y${SRd@rlJ^QEOL3q`6zPJA@{@hj|B9v^PzsJm>g_wfgals-n*h*z+~dXFR9T&v;Jb81xJB(N?^N zVBH~%Yki3G)pFpA^tpc;94rdj?)rf3c;7S!wu_1Fc)#Q@E`f6(H;j7Tx9BwnP6yqN zbBuW}@+|IOAJF#%-%{!*N9n%d-ycum`c}MOXCg#vaD^ z25j?U*Z1l8Q5W}r8vdpG=8U!P4SkS%jQ2&Q;Gj46H7DG1gBW$elS&52v z9iwkDKd9KYjrN(Ojob6YSGh-%pK)O0cRFd*)8<3$FsTqUfhq_`qA+ploRx6^7FYgeS`Isa}(s? zUDiqZJIAB1k&p3AKGu^jPCntG|B{FCO&;2V{zrfQ0c2U9{U*wPs?XjIzp~@1|AOy3 z+&lgR-*5+|m`t4q{K`*#KvxyJpFma3$h6Z|bChV({KN{_(zwalQSIU5LFUXL%p@ zHQqB}?fSS6c{wZk_I3CKWKIY*aR(NW~0PC60xzc+F^Va(C)saht^LA`n%ArtF(%KGX1;8VvL(-_#VIo>p_tL)`c zcMp7HXdhQNpF{W4$y_4OJ1K|$#C=x3o8dYBePnT7K5X?Qedq&hb-MAiooFM(+iv`5 zTa9&0*m5(@x%%1ee}gSY{RfBMu@PmRTwR^z??hxrm?emeMQpK1ENFuou96Mcy? ze?CoYuHT&v9)A+=+dtSIr;htU>vD<@z<0Rb9Qz78HvJ82w%U$8exzS}dTsE$9enm1 zfzfmSARXS@tm8BgLJ$E{OfTfA@9XL8sBd0mgG&*pmU<=TgP$;#>A@Zk{i*rr1MKa=7FYaV%stPp-Ig=? z)BkcYbCCT`fZsso;2TJuMR>NbXOc7I%+EcQdo-Uf@P7UJoRRO@*(V44CeKV>ba$Wr z4iWdFn#TD+MSq5S#>a7AG5pM8Ddx!c>h_rh-f50_H(iW&zE`);MP5KV^XTYz>XnIY z-AzlPn-a-r%l5jaM08_&vM!m3&S=QQV;iNUz0=g5AC1k4F2+w;IeyJs6w4&f_Lk1h z_D-eR+S?L=KBij4?p!jXYff|*evgnVJYCK0-K`DLZHegGH5)gs-xy!Fe%;DBmRP-h z4HU$=RA&77#cgzwUo8#k}1SY8ut@3h=tzG%%lDi)aAruw?pM08DCM|U#XQP)|w zJ&{awMibOKbBIs#tZ!@G747Qo=xFauE{V>IE{HA)$XdCxK9Oi>X={o$v~+c}*6oUJ zYwvDrsOxM=bZJ}2m>cR^+LH0g&bn(iw4)>=Cv@+wXtFsGZENq`Ue`J#rn9cCDFF$m z^si}Yvx<+QyX|jgI))CXj91apSwCc|4;OH1|K_^Ru}|0PJ8Z8_$xfIzzH;5zg^bjp zrE6XH_Az&kmCc*K;M|3a$`^kNA&RHKxI#`I3Xu{VTUYS$6|N`GHt0IxU-(LSGeEj- zYBf$HZYcG~-~zlxa8g#IEyQn3-5L4h3w@FGGm97-uIu}_y$C&oU+!7O_>xM6-eP%H z-d>dbkPmNBp{?w3_QZ1b2>Xli?$8aV;#G+X`D|G}1GoPwv=o}SUoOO>1&r?R2Ulnr zzG-o9pL8FpQbMVr=h@_h{{|y?EQh9}-7Cz+S0pO*Q*`%=a(A-)N7RQ3a@V5ly~m1Q zVw_N6UMtJp)VL_`CYJGxQu)v4Q?u02OZe@TVchV~P^v*8jSY@U--l->DF?EaqAI-} z-BWraoL~Bxs7Sec992%QX8qR;&ny@+_66KnRMDBw+sf#s{6Ul~@)Fqn8i#(5&PCZW( z1rg3Rb*UzbBmaRxQ_t5#G;$03EYrmFND8Gb*Tk$yBga{xi8+y**{5>i5^%>Nv!Gn+ zs=Q?&7DVFIdbQTNJn|DtTce4kks?etwJPIpF!r*@Psz4+JpH0FatX&-m%R$as>lV@ zZGCtZx?U7{f&wniz7()JGLr(fWIh3g4Utp|xIDiOEwz#Fk+`C;6~q;hUg~zGR%dJE zB(=UO?HTlGh}=OUo<0NI&5@r`^j57~YvhM)*%t0ZU55&7#Dv1Bg?E83b0Ve9&dNH% z!9(Y=Q-}>=x*7G-p1|6Y~!p#O(<&K-In((mHs${rF}N*W>lqyxY+5h zvGsGhCjCh$lXjCSm$9)(`%8EcWIql%TX{!VeJxZ=pH#%EoJy24CcD|VcZW#2N&2l= z@yPTnU4D?|dB*K>ASSZNl-n@V$a$uGA39|&Hs!-CFEQm$Vjh{ovmfF!m+JbAbr>?7 zwJ7J4lwArzS&PTBtRgp}N7j-^CI$*c7NI8VJWZrPwJ<9WV1`-edl!Lw-2GY0)3ka& zqKJy@$Fzt$VWF(b?B_tZD$Mv}y+oZyeqG6SU3s7KeuQ%95ERT>>E4X8_X2*6i)5`% zD~F~=!>SyXRfOJ^RV^AGqPjIkL!ok!L-A{0Yr#YVu?!Tg({!7kdW7ck# zk3ewNCR6?M zL~cWyF=_V28N(*c-l&O`NFSQBH)$dq*#)y@Z`MS50eUk7;5eQYXb-?(L_-hgrTNi+YYv4KWvHw`A=A zm3tnHsdBq8nv;7rhH-PRLWMWPwm0j$WP1c`PHrvO+}s~RqL=$7mL!yW4V3Y7A4Qjx z+>5}In)?@E53A50IK~$|j$uc|F_;kh)yrS zuk1s)9L5cWwm}s)9LfSi4xSUK9N*KCH=%-)xHQ%0jMT)}@yp5eQbO3epI~|4G#D=b z67)v(91?C%Yr#(COz^bUZqJT_U8J(;PHs=K@H^z4=w%jax&y902ZD;4S^bWia{Y9r z_QJ5vJ}z7S=UIHmon(49=7*pg=(7#okbe=4_l|o$ncbeP`KzezJ8tzqX!?r$>)8KY z+h653k^fzHzUdz-d=L|Me(z>JC7M@4_4iz>I+UY*QbUZoFb)3#_;eCTQ$>G-O`PLy z%7UrbrzvM&7ry>7Dj&B)ips}FseF8t%Ew2k{HpCQD!)2P<<~~4{4c{Q7iH4~KX6l4 zN0oY=)7`fmcOCgRviJkHh%@(k{_VQ_Z&KwSxU)>f>(}M~&Ty2!iFtZGC$2NbeAt~t zV|qQWTxYELuzQxVo~ZV)d!e=F4e04S>Sn$I#L5?*OI03qiwvDC{2o{1F*lP6c|C9b zSz!YtqvC9-xUTST=?0IxSt!(E_C+2Gh~gJwMLt< zM$B5H)mS5Dt6?)U2$I%?jQ4SXYr_W zhLO{j|4l~zQAh04nxAdj&o}K?=W{o7zHj-P^Uomv_ni`MM{bYGzl%=%eW#MUfZG!) zyp&7#xHA+t-=W@*JNd6@J0uHMc6BJ{N!#98xQllBiKU_UMCyH~lhT0KZu~0J*_Vcw z$0ils=}1(FAKd9kRJ7**HCgX;mRh|(OSyMCs}0?3=5d$pugpB|a>~p+LS`O!ITx9E zgp0#DI21#Mafo}IY$Ip~JhhcmjyoxD!4EpLM`S}+qhZ{7gv4#!dcbpTXuWGh1zqQ9h=~dqAiwA7BnERuXZG`n+qBc z+1FUIq3{p1SDU4`7XCS53jRd{Eq2Z^bgP-=VyE2DSLgpH+m|>|Gs}j2?#`gkY3tVl*|NiQ{BiXG<2(LN$+x=BSb7$WfyiRmF$Uc0ap7Qm&QMS^Nm9KPi&( ztfY?Or%=6NNYVr=sTEb~jAyy{-%nW$$G(luz3+QS8fWUI{JvzkOV89R`F%-no6j_f z!Fuy#=>4d5#mUg_ic9LPc zR-N%@uW-nv^xp8K07q4--#U85tL#3P+ZiY7OpFLKBsjwIt)b zjKvuwePO`3DcRt~=1gEy*m2h6Iw+(~LC;b&r7sBdy|8d8ZYVNx9WN^*!w4jEBs0KM zj!v1w1LEE-7p?4BwMP*dWq1b7oWb_GWU~>Xd`Iy?FT%J_IsUkCPm`bD>=!iocM zsZIWbM%)NHDOLUopqsMWpFm_~2$d5xRwKWGzM8+9{8U1-KMCM8`V*S`iIB3Fzn$i< z`Q!HZPSe-?)B~1b9{AiwzY5?r`e}RoiF^FCy}ncP8#0|~q?~V2B+q(sWd_{H3xN} z6fdL7&-8Yb{3$XvLc*>RKfB4Fw8x)Q<>yxUi_P%41~zf{M!$i8W)1j70~;;Y`)RYQ zVG=Lxs6R10#ZRsBIc=Et3_=yGQtgi`^L>=O@kf2%Yb#-Czn|fClvMj^SfQ9dxysLI z96|WwtNkcz$&nEoL5`bGapQkwx`~J(W-Bh(g=QM(WtULBbBua=`HXs*Wvnl%_NVUl z&o1$&R{3Xwy~HmrWjPyKRQn5?{8*KL7KT0Q7wE#|693#9ztmLj9ExXh& zhTm#|vubGVDJ6bB$fN$;Qh!O6e?gT$zr>$b;%Dvl^Q!!5RsN(B-$=`=_RrYuPcQM$ zfGd>v8E_>?gZ5Sa)M|gG<{Ss|sDDDEXS7 ze!vf5mS%+*DOjkiYTtu4rEFo9SE^mnEAc0jDlwF_mH3&aGTm_I5UTuq19J!sx*r@N z1Pbz5=_YL0c)BvB(a%X);HUprN7tH_`qMaGm9KT#?~5){sZ}b`qkD74ppx&jd6A=j zB>WRPSxzZ!tmj(l&)_g$_0y<&qdx`U-r)O&a&Gi88~yz7`F^;{FEw=m7Yonx^AY!0 zs8V{zS?oK{A4k~juQCv%e&(M|8TAFkCheSv z{EV_{e;xw6(Vy4kpQkmNv6ez5O={7hloCBsNZV~x3z$P?dTB#@{M@yEq}e3OMq`?A z)X%K(3!d{coBizP{Rox}8^m5eZ;zkdJA%yhw(mz0$SB$1JM+El{U2>2;W9t3Ip7QP zp_do#5@-0Ua5w++o$wBtsL+^b0Vmq%M+qj=WX-SkC$GiMMJIqrB;F$J5PD@eeJ|WI zmfwB_xxAg>TeNdxjdHy7-F^{wMSu45{9S}>Jh9i$_S*L&%TL%J?g{?q=Y+p>diIX} zND{fbJ!GN$@P(%?H52-*GXGq-d6mDi#9v$G*EagiRsO|C{R@!1u$HBM5i&_L189N{ zpqw)9Qga)b{?L?%O{+S5?Wq;T;Vb=|Mjz=;dy?1Is6z!t)Gi30_42T@ROyAS);o>s zUEOHITE`-DTtOq%&j?Sc_Va5_KZObNnO-L#FO^UlhMZK*v^()?zZmHi+nChDduwp| zxX{mU@pCXTmBQBRczIP`&Th0!;SK~rcr3j?w33?OA(;LXyRsMqTQa=|-sM?>8 zv=5@VhCQN4vHJInCchjZvfn?aidlX}b@;^SidX$<;ivrQet)_(PKSg*qd77lBYC-~ zs$%R#tMP}*5R2Y5jV7{j+yU)0!ZbQPxn4sFZiKXh>X?Vsy=bF95n%-0y>w8l-8Af% zRsOj~edZ}RGSdg(VnT^uYp8kx*p`^u|8Hg*@s4~-*7F}#m4~@!hQC7}&8+s%-tT7} z2s+SFyJe;w@MpIAv%|Ii_!56MP6{UN9Pl%q-R{Rq{qacgsBOei6?I?n{q0B%-}bT) ziEx*UUcaivzqrb;-0k~~|KV5d)&x?S-{?aFgp+OlZ*7fX zcYbxZl{vqKr-->m=AzwxWtCrs{NOh}=Pxp-~|j3*iXw!h@J{t8sE zCwL*4l$QTocz~Uk4Y&SQ6EgU7UdAu|%)Nf3W_YudvqKRa0fz?ek^oH&ogH{4N99ri zj74bl3kZk~19Ik=O=^xkG)NMdg-UErl!?q>gTB?p-?MVM`2CWKuUQ}OOw={R`Gj77 z_M|G;Z{|HsO?>&r^_Q%xR2}hTVrNoywR|EGPpZ|4mZs*UisKus&g8c4M$|X8B^sjj z_>f1%96mexdDyQ*k!ZSRb)sH?xGsgvJ+smhJZFEjRC zbxBQ)s_ozxU!oztt1}LI+C0I6SZ>WcFLhDs&bNlv0X-7-x=JxLT=6GW6hPsYKCvIQyD47W&Q| z_tOD~q5o+qdihuEN+ygcM=({kC*vDhb|zXCOPi9rBoMCcY)K|`B=9pj+8I`FsN2=5 zUA_x9@@;ex<4qN<33wT!Lg`qDju@h5&AOHGO`EsWtQ=li6JA@`&4|Eq8+XGeYUJbdkkIj0T(W74_Vg|B3b+&|T(LTi#UAn?6>n{?zefCGo{DdW<<;=W@lES%)>P6; z?cKpeSWvql;3V3A&4-ohqIH)%dL`FPrc8a(~czw4XNM{&o(+2m`A&Rri1j7GysOsv8~4~dD|u4G-O z4#B$4CdKa{o&5!!-az$bt4<(-}IUiy`>vB^q$xtY<-LNaoUq1Pp@ zUBk~+mH9oK4&?Je7_bjA7PNFiQ3 zRR`2HF&_)W)co4{3SO@xZO8|8Iv#SA_{y~#HgC~0Vj8Alw5H;@%rnC_VH(r^FM$D3 z`0gTE$NWIsGiP(MW%FP*J?rEr+Uk%5wXs-HZdMrP844b(9sZ{no?6i@l7NO&LwRkv zo|N8t@KNsS&6jLY%;fR)CI#s!X*DIc=s1T*BzCHeIvtuhAgWAo2OKe{fU3x#;V)vCTc3+_n=ycKD*4>q8n8)yDQj&dx=AXy# zhO;v*Hq~uMeh^RMc8&drn}pq`soyqiPTd_Q?+nj$BfK478Dr6h>&(}_c1Pq_*8x9V zRJ%yUcW6Jcy9T#-6RI3%c;8}ntJtJ-o6gh0A!OmOnO0;kX^a*LfaQ>MZJM_s|1koxz*V6(?J1cA%r zn~T8Z;r#_(?gTDJ;VrcO(#BLex}AP+X|}fpXxl>c@cM)8!@X8SV?7=0P}j2TO_y#rqj zSepGAGnQui>r5c}GW{77mS%e`zIm`T`!gOa&GtEX)of|DGaf9>_FM2(k)_$rSg8ZX|~UrI!x>F12o%r(h>D#=12dwG~3^rHB7TVecN1S zeVz!=wuR{NT~^@o@G)xe@>E)o1V3Kc1}<-uw|e+|J9v4cyw6j3sU5iR<*dT{SH87V zG}$=y+d;f&))#$zJp7GQV>t#Sy##3UI_WCSZGO=f7muPZ1#R;@`CCBSyiR&2Xq(4L z-w4{~Y|^)awmF*g*Ff8xO!_crn}bRJJ!qS6N&hown_o$v1Z{IE>HiJd=1tQ4G{ELb z(o;aMj+&fEx)ij%INyb!ZBAtSO3*g{k=_j2<~q`W7nb#EdYzgsr*YZrhtA~Yc(Exl ze7v?b_GY*PC!S=Z!oSAqlFlRUoQBxV4b~88PJxCrcWZ&NJ#Lw*p?`W6IEm<6mEqS7q@6k0Mc>;5?-1N4ScB9+dCbj}^K&BPFc*`49$36osU%VY`A!f)-+|mqWKJgE zn?&^6i^N2}y+{GY7vd{0LFQ)iT|orjTR`$HgL4-zGoN7*9})UZ!6zTXRKSo6V zeXK|S0({KFacTsw7d#|*La>-0fPim<;9kK`=9&6~g0Bb`;173cxq{aV9uhnu$UTF4 z-A067uLG&qGx)@Z_L+r*N30d(9zy=tiQwN*X!uVME6g6k_F33F*nS88*eUx*iVfBX z-iB|cSRbBjaJ67>6!b;#CqXp@H1sK+il0ie2T}eU(3F3K^%%E!n!%)CpJ4NJQ_sDL z{Gk~_3%)1#Gq2QH*&4POb|5EU7!EX!xSnwBu_=6?dE^i6)a6&sp1PcV2Z&@D`)cF=P&l0S^ zL~xs6yWk!{=3(;PC-|b^JAxtKw2u?S_h*`aw%~<=)q2n0j1uF%w666P_XT+Sdx*B=|+auLyo!@Sxy#1^&lBOpuL_+THskZlf9f%hi1y_|Uo2QB_;JA-1bYPU7JN}~fCxEn2^~W2r2IU= z>4FOcD+Mw@1C{ITE^oHyA2Lcy&>jMpsmwL;%0c)Q?V3;vzpj|86+d{yvWK|Y+~IN3zV zpDb7^c%k5W!MI?%;HLz?D0oot2oZ9BB=mEFuL`~+n2K`~$ITZ!OOSuifc2LNHVbwT zA@@^4e^Ky&-~)m`6nt9nCBZj{=>M+J={Toxobg1|PZ7FIaJk^cf^~u)7ra5RNAPaJ zrv+aU92CsSHsci#G2U51FA}^+@G`+B!D|I?6ud*Qmk2oz2>nCBrv+aUd_%Ap=S$9a zIuZTm3tb`fRf64ue=hAkLf^)ZxFgm zaJOKOV6Pz3uySW(zC?`kZJs}Xd8EtCa{$u%+y=T__%=&>t3Zz0kcv-zzll_bBg4p}h>P)nj=&u7x^b44hZC&^f zyR+R8Y;52kjKN!%#&#v;x^3G!6Fa~))QUf_g1=_Mjzd+gd`&1FFqSH*Z{NN>f!9THJfh|-mlZL(q%oi1$2V=+1V>QaQ4_Oc69yZS^ z5oqImO_1*=%aw|v&R(|dQd9)Ty}!-GD92^J9d|p*whxNxB;>t_y~19$tpyc9c}F0R z_NP2-twZv7f5kquBd;H=SL&b0C>PuKvscja{ben3wD1rt-xs88o4yCW;6*-OcjL#F zNk0U>&j;+s`SSWIeuDFO1oMcYBj>>!X6^DFl(Fm`0DY~#Tq&f}q05d%3=E@og6|-N nm|q!j=K;E{1~4MQi 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/font12.o b/docs/Touch_e-Paper_Code/c/bin/font12.o new file mode 100644 index 0000000000000000000000000000000000000000..d29ffb3a01babb434316171ff0071998725fa1e7 GIT binary patch literal 4264 zcmb7H-)~!Y6+hSaI(A~$xlOXwT?4x>5{Ny)CavOSLhu9<0i?bxf54ECm;fOpP*fg}Dy=Gf&i99N(>G3g z@A-Vs_jAtoe9!mCb-ryWrwm+jg_PJ{l;MR-$+hCP<7%9?ELU)nGcy_Y zwv}T3qT`gbeby-t5J_-`@Z}MhgZMmzurpY+;vKeQG~^=lLB44`GUcTG@@p^Ky0XL3 z1a_UYm3DT8YdVAEi06WkE0xMhSqxA_NwPzCpE>tkcYxvUGhTGd5Shb04_4Q^$My&A zT4$~7K45(NRJN3L9FZIIS5?mYt~-Q-h&c?^XAv{>Jdbmreb-y-c<$dBcN|D2BkH!_ zY*s4DcfVe*Aklv@hwA_lH5p_wnUWe;+h@T+{_enY|HAzFl``sFUuXRA2O^4rwqlrjW=ZpN(k&6gkv0*hh#Hx zBqevzb)VzrZh5_q-0sURuBgm2Y0a;|E;w9?VY$4>oLOhc8Hlrb@j6^q`Uwr8?w+ZK_Ao~}Pu0&9T>wPYv+ z4s5cy(~;hpb)gFp9ASYhV-Y%e2e(yO-B=ML{yuDxNbDpm5i1sz>MN{_G2Tz+&+#%& zAN!c#Mfs?ipJ3Bdvl%GMiZ)sSMdHynm=KR~%_3Ixr>uMZd#_ zDIVka%njhNU*i=wpSAx89peg_=cX7_>;zcm`Q(p)t=PA@aX~c3C~p0biOe!Dnr}mm zziTdyPl6L0W8?DVlfV@F4STth^H33*_!dlTPn-cTD9U_c$vA49PE9Aw)QOaR3`NUOBJmuW2>dvisq={oiF1jo z)9_I}*oo0k5?jWm4KtNUNQwbN>`2I?l)y4iA{tZ2r;RXi!Z5B*vq$12A{D?)&WBt- zeSGmaCL;Qxn8e|}NSbJJo~}$|;OMyoH)#eBrU;SSUqHORjweE2<+t%s>ImUuj_G47 zkWuLOx`jq-v)Qlvg=%*v*KD-krQ`SV+w9y6 z>Np6wK3*+pxyc+rB*Ad*Y<^QD)Vq9bwL*HvbV9kN*e*Esd7cT-|98C zT7KQx#PGs=b{^)i@gVYu%tIV*=*fPrQ4h9NQ4TR=bw~_T*lzFmg-)YTY4xA1OZHz<`kK-e zr5j4)SB2n-O9lMfs{OjsKUVr3rGKIHZ6X&3D*d|B z{4HU>ca{F7(z{CUDgA-ce^dIN(o@(D?EfTd)HBZ-MHF@A1-x8pleBcJtt}spl7MU2*BIka zezU!^@yyR$7Q=7w*efE_dCSTpyOtAlM&tC)y18c};1}i{e7e zz@|m>z6(Rhot{2?agO@SD+Mjs^-3Z0tSfTRMI(QC@d?)dodA_W9?s^XZ(g5pm Vl7SMP6Z?gE7Ov7engp$R{{t;qASnO< literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/font12CN.o b/docs/Touch_e-Paper_Code/c/bin/font12CN.o new file mode 100644 index 0000000000000000000000000000000000000000..1831f90e15faff54237e38831e3f56140d76b320 GIT binary patch literal 4640 zcmc&%Yit`?6+ScLSK`D@n)Jo?;X=v=6+g0s)NPui!SuE4rmHr)?DEHq?TJ0Yv0cwN zNy)0VK!`=!e+UGke~?(TNPxscLRtwC#3BSL7w9jRI6r~~BPjB9nkw-U< zcBY-_@Z9RHl?RROo$Z~u)w$JKE8EC6rZ=Tmukeju$jlkCoJM@-*sXK5?ETC?orjs1 zGug~+=2m7i^Ybm~)hqnXdopt-mWj>X&)k3LtlVAQS>JJX-u=_NcTeA+t(}WyW~EoJ z@Q>e@nL`c7nQdgL?QD|saQf9VcO1vMedF!6Lr0Vc(yLea%U{dPo5!84S&AM1-L~^! z&WStix7u&l@BYL2?|c8*kUqUb{jt=uRHkqz-f4I4b^d~<-FeKV2Zlm7XM?<_P3xT- z8}eE2w7VX?B*n*)&yhu2wCO%u;B$|8^ujRjOB$o&?law)?%e3KF{hiZ_*{BMlPXcb z%^pzr@)>v)Ux|;2FNLZ^ehZtbhCcv{8VH9yuo#rkJLuEChekPh@Tlt-9AMJ{Ha&S{ z3=jwe&6-VWB=}W!h=lnfRs+FrF({E43=~`k*D`E4G;$sg{307hImhAA>)@fEqKRmy zhkg$XXSw&xKIRlY3NP*Kz}LV7;V-Z zA?6hRCi{LuR9I%^8LvXG_Geus;?=(3D*dSa0z1CJ&2#G0fPo(|zZUy5h8*}V^Xne} zH1kD|PceVq<$@Lcwk5gD2n+NDZ<*=+0j3 z9?XG8*waWER!+u7qFU^U*w8^t*%(EmvrsYY0n%b;qtnqd(JLbe5j_zM^g&`vXhhLs z(WvL5zz`nvMP#E`S4KD@dIBS*;W;qr3!OWB?l4NrYC$Wi``gtypc9jI`cdPFBrYYb{x> zwG6#rR+iEQ)3&H;7Sb2%H88SoHVi9O;b6-yVfQCnXlkBiiG4s(1k;J9ato=VTatD0 z>cS$KwUV($R;Avw6MS&;c@CbK%G<=lvwwb3FH{X;dlqKf)h;bOpU6#|PGnObNo5kr z<)vy}x05JvrlL1XY-qG*R+buIcGXIjOucFp?HRlUEO;xoEmmegSEf#}UpbMynxSgF zR!+DLSJNe4S)4w1IiFjgyv@~hOQcrKGRrlilqe#-Ykq1HZhqtL$X#bnu~(7r{zv+%)M*ec4Di%=BWtRjlNV>2K| zVU{a+Pq~_D-y&J&XAO6htoK40@m^GPS8iFio8}tPrCjc8V*HwJH43I)^A;pIb*kAg zCqCq9G@ruW(s}!kG6ou)qEINJ^eO%7zQCxmUpc59QVuKcQ;#UeLht8|xL5p^0R7AH z_iDWFe4>f{E=}4aJ71$9@uj^hkLuoek^LI+<+&>w;e7iT&@=iO=Cp_d6uSL zD;o&(9B?BWk|PhLiuL7X1D8pvR=155?#85L>&4GdYW~`@Dc#0FEwpUJ{~z)MeDV6- z-S7S1ygLB*v7E$@x%=q^vLB|ZEAqQ@0v0|g=S9ybwmnZBrqeyK?8o{kfpWa_(ETFw zW?*EFrEujuT0SpQWM1C0GKTxcv1k)A$k&$z_t$p>^}UEdu8-GQ)_2(#14=KUX#R6e zip=#X7$oPu0~nmY$WmnA3o!We+PEI%ys%y7HNj;JkC8&>=a~qReJ$wBd45=a0KZ?! zPUuYe*AXcF)^PsEV3Q*Kz666WoNn*E-nxB!rm(L1{{s)~`=kH> literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/font16.o b/docs/Touch_e-Paper_Code/c/bin/font16.o new file mode 100644 index 0000000000000000000000000000000000000000..d2feafac618eaa00f14160ca34c8c92090bb848b GIT binary patch literal 6164 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 YL$W%-j4E0mkBj5huzx?*AW)6_FBCMdZvX%Q literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/font24.o b/docs/Touch_e-Paper_Code/c/bin/font24.o new file mode 100644 index 0000000000000000000000000000000000000000..598b660cadcc486404714feeec142c5d61f002f3 GIT binary patch literal 9964 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/bin/font24CN.o b/docs/Touch_e-Paper_Code/c/bin/font24CN.o new file mode 100644 index 0000000000000000000000000000000000000000..b262f033a96ba9788750c2f8abec9feb332bc156 GIT binary patch literal 7664 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode.c b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode.c new file mode 100644 index 0000000..8abcdb1 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode.c @@ -0,0 +1,263 @@ +#include "Test.h" +#include "EPD_2in13_V2.h" +#include "GT1151.h" + +extern GT1151_Dev Dev_Now, Dev_Old; +extern int IIC_Address; +static pthread_t t1; +UBYTE flag_t = 1; + +char *PhotoPath_S[7] = {"./pic/2in13/Photo_1_0.bmp", + "./pic/2in13/Photo_1_1.bmp", "./pic/2in13/Photo_1_2.bmp", "./pic/2in13/Photo_1_3.bmp", "./pic/2in13/Photo_1_4.bmp", + "./pic/2in13/Photo_1_5.bmp", "./pic/2in13/Photo_1_6.bmp", + }; +char *PhotoPath_L[7] = {"./pic/2in13/Photo_2_0.bmp", + "./pic/2in13/Photo_2_1.bmp", "./pic/2in13/Photo_2_2.bmp", "./pic/2in13/Photo_2_3.bmp", "./pic/2in13/Photo_2_4.bmp", + "./pic/2in13/Photo_2_5.bmp", "./pic/2in13/Photo_2_6.bmp", + }; +char *PagePath[4] = {"./pic/2in13/Menu.bmp", "./pic/2in13/White_board.bmp", "./pic/2in13/Photo_1.bmp", "./pic/2in13/Photo_2.bmp"}; + + +void Handler(int signo) +{ + //System Exit + printf("\r\nHandler:exit\r\n"); + EPD_2IN13_V2_Sleep(); + DEV_Delay_ms(2000); + flag_t = 0; + pthread_join(t1, NULL); + DEV_ModuleExit(); + exit(0); +} + +void *pthread_irq(void *arg) +{ + while(flag_t) { + if(DEV_Digital_Read(INT) == 0) { + Dev_Now.Touch = 1; + } + else { + Dev_Now.Touch = 0; + } + DEV_Delay_ms(0.01); + } + printf("thread:exit\r\n"); + pthread_exit(NULL); +} + +void Show_Photo_Small(UBYTE small) +{ + for(UBYTE t=1; t<5; t++) { + // printf("t= %d , small= %d \r\n", t, small); + if(small*2+t > 6) + GUI_ReadBmp(PhotoPath_S[0], (t-1)/2*45+2, (t%2)*124+2); + else + GUI_ReadBmp(PhotoPath_S[small*2+t], (t-1)/2*45+2, (t%2)*124+2); + } +} + +void Show_Photo_Large(UBYTE large) +{ + if(large > 6) + GUI_ReadBmp(PhotoPath_L[0], 2, 2); + else + GUI_ReadBmp(PhotoPath_L[large], 2, 2); +} + +int TestCode_2in13(void) +{ + IIC_Address = 0x14; + + UDOUBLE i=0, j=0, k=0; + UBYTE Page=0, Photo_L=0, Photo_S=0; + UBYTE ReFlag=0, SelfFlag=0; + signal(SIGINT, Handler); + DEV_ModuleInit(); + + pthread_create(&t1, NULL, pthread_irq, NULL); + + EPD_2IN13_V2_Init(EPD_2IN13_V2_FULL); + + EPD_2IN13_V2_Clear(); + + GT_Init(); + DEV_Delay_ms(100); + //Create a new image cache + UBYTE *BlackImage; + UWORD Imagesize = ((EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1)) * EPD_2IN13_V2_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2IN13_V2_WIDTH, EPD_2IN13_V2_HEIGHT, 0, WHITE); + Paint_SelectImage(BlackImage); + Paint_SetMirroring(MIRROR_HORIZONTAL); + Paint_Clear(WHITE); + GUI_ReadBmp("./pic/2in13/Menu.bmp", 0, 0); + EPD_2IN13_V2_DisplayPartBaseImage(BlackImage); + EPD_2IN13_V2_Init(EPD_2IN13_V2_PART); + + while(1) { + // k++; + if(i > 12 || ReFlag == 1) { + if(Page == 1 && SelfFlag != 1) + EPD_2IN13_V2_DisplayPart(BlackImage); + else + EPD_2IN13_V2_DisplayPart_Wait(BlackImage); + i = 0; + k = 0; + j++; + ReFlag = 0; + printf("*** Draw Refresh ***\r\n"); + }else if(k++>30000000 && i>0 && Page == 1) { + EPD_2IN13_V2_DisplayPart(BlackImage); + i = 0; + k = 0; + j++; + printf("*** Overtime Refresh ***\r\n"); + }else if(j > 100 || SelfFlag) { + SelfFlag = 0; + j = 0; + EPD_2IN13_V2_Init(EPD_2IN13_V2_FULL); + EPD_2IN13_V2_DisplayPartBaseImage(BlackImage); + EPD_2IN13_V2_Init(EPD_2IN13_V2_PART); + printf("--- Self Refresh ---\r\n"); + } + + if(GT_Scan()==1 || (Dev_Now.X[0] == Dev_Old.X[0] && Dev_Now.Y[0] == Dev_Old.Y[0])) { // No new touch + // printf("%d %d \r\n", j, SelfFlag); + // printf("No new touch \r\n"); + continue; + } + + if(Dev_Now.TouchpointFlag) { + i++; + Dev_Now.TouchpointFlag = 0; + + if(Page == 0 && ReFlag == 0) { //main menu + if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 56 && Dev_Now.Y[0] < 95) { + printf("Photo ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath[Page], 0, 0); + Show_Photo_Small(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 153 && Dev_Now.Y[0] < 193) { + printf("Draw ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath[Page], 0, 0); + ReFlag = 1; + } + } + + if(Page == 1 && ReFlag == 0) { //white board + Paint_DrawPoint(Dev_Now.X[0], Dev_Now.Y[0], BLACK, Dev_Now.S[0]/8+1, DOT_STYLE_DFT); + + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 6 && Dev_Now.Y[0] < 30) { + printf("Home ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Clear ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + } + + if(Page == 2 && ReFlag == 0) { //photo menu + if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next page ...\r\n"); + Photo_S++; + if(Photo_S > 2) // 6 photos is a maximum of three pages + Photo_S=0; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_S == 0) + printf("Top page ...\r\n"); + else { + Photo_S--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + else if(Dev_Now.X[0] > 2 && Dev_Now.X[0] < 90 && Dev_Now.Y[0] > 2 && Dev_Now.Y[0] < 248 && ReFlag == 0) { + printf("Select photo ...\r\n"); + Page = 3; + GUI_ReadBmp(PagePath[Page], 0, 0); + Photo_L = Dev_Now.X[0]/46*2 + 2-Dev_Now.Y[0]/124 + Photo_S*2; + Show_Photo_Large(Photo_L); + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh small photo + ReFlag = 1; + GUI_ReadBmp(PagePath[Page], 0, 0); + Show_Photo_Small(Photo_S); // show small photo + } + } + + if(Page == 3 && ReFlag == 0) { //view the photo + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 4 && Dev_Now.Y[0] < 25) { + printf("Photo menu ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath[Page], 0, 0); + Show_Photo_Small(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next photo ...\r\n"); + Photo_L++; + if(Photo_L > 6) + Photo_L=1; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_L == 1) + printf("Top photo ...\r\n"); + else { + Photo_L--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh photo ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh large photo + ReFlag = 1; + Show_Photo_Large(Photo_L); + } + } + + } + } + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V3.c b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V3.c new file mode 100644 index 0000000..b0bb51f --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V3.c @@ -0,0 +1,264 @@ +#include "Test.h" +#include "EPD_2in13_V3.h" +#include "GT1151.h" + +extern GT1151_Dev Dev_Now, Dev_Old; +extern int IIC_Address; +static pthread_t t1_2in13_V3; +UBYTE flag_t_2in13_V3 = 1; + +char *PhotoPath_S_2in13_V3[7] = {"./pic/2in13/Photo_1_0.bmp", + "./pic/2in13/Photo_1_1.bmp", "./pic/2in13/Photo_1_2.bmp", "./pic/2in13/Photo_1_3.bmp", "./pic/2in13/Photo_1_4.bmp", + "./pic/2in13/Photo_1_5.bmp", "./pic/2in13/Photo_1_6.bmp", + }; +char *PhotoPath_L_2in13_V3[7] = {"./pic/2in13/Photo_2_0.bmp", + "./pic/2in13/Photo_2_1.bmp", "./pic/2in13/Photo_2_2.bmp", "./pic/2in13/Photo_2_3.bmp", "./pic/2in13/Photo_2_4.bmp", + "./pic/2in13/Photo_2_5.bmp", "./pic/2in13/Photo_2_6.bmp", + }; +char *PagePath_2in13_V3[4] = {"./pic/2in13/Menu.bmp", "./pic/2in13/White_board.bmp", "./pic/2in13/Photo_1.bmp", "./pic/2in13/Photo_2.bmp"}; + + +void Handler_2in13_V3(int signo) +{ + //System Exit + printf("\r\nHandler:exit\r\n"); + EPD_2in13_V3_Sleep(); + DEV_Delay_ms(2000); + flag_t_2in13_V3 = 0; + pthread_join(t1_2in13_V3, NULL); + DEV_ModuleExit(); + exit(0); +} + +void *pthread_irq_2in13_V3(void *arg) +{ + while(flag_t_2in13_V3) { + if(DEV_Digital_Read(INT) == 0) { + Dev_Now.Touch = 1; + } + else { + Dev_Now.Touch = 0; + } + DEV_Delay_ms(0.01); + } + printf("thread:exit\r\n"); + pthread_exit(NULL); +} + +void Show_Photo_Small_2in13_V3(UBYTE small) +{ + for(UBYTE t=1; t<5; t++) { + // printf("t= %d , small= %d \r\n", t, small); + if(small*2+t > 6) + GUI_ReadBmp(PhotoPath_S_2in13_V3[0], (t-1)/2*45+2, (t%2)*124+2); + else + GUI_ReadBmp(PhotoPath_S_2in13_V3[small*2+t], (t-1)/2*45+2, (t%2)*124+2); + } +} + +void Show_Photo_Large_2in13_V3(UBYTE large) +{ + if(large > 6) + GUI_ReadBmp(PhotoPath_L_2in13_V3[0], 2, 2); + else + GUI_ReadBmp(PhotoPath_L_2in13_V3[large], 2, 2); +} + +int TestCode_2in13_V3(void) +{ + IIC_Address = 0x14; + + UDOUBLE i=0, j=0, k=0; + UBYTE Page=0, Photo_L=0, Photo_S=0; + UBYTE ReFlag=0, SelfFlag=0; + signal(SIGINT, Handler_2in13_V3); + DEV_ModuleInit(); + + pthread_create(&t1_2in13_V3, NULL, pthread_irq_2in13_V3, NULL); + + EPD_2in13_V3_Init(EPD_2IN13_V3_FULL); + + EPD_2in13_V3_Clear(); + + GT_Init(); + DEV_Delay_ms(100); + //Create a new image cache + UBYTE *BlackImage; + UWORD Imagesize = ((EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1)) * EPD_2in13_V3_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2in13_V3_WIDTH, EPD_2in13_V3_HEIGHT, 0, WHITE); + Paint_SelectImage(BlackImage); + Paint_SetMirroring(MIRROR_ORIGIN); + Paint_Clear(WHITE); + GUI_ReadBmp("./pic/2in13/Menu.bmp", 0, 0); + EPD_2in13_V3_Display(BlackImage); + EPD_2in13_V3_Init(EPD_2IN13_V3_PART); + EPD_2in13_V3_Display_Partial_Wait(BlackImage); + + while(1) { + // k++; + if(i > 12 || ReFlag == 1) { + if(Page == 1 && SelfFlag != 1) + EPD_2in13_V3_Display_Partial(BlackImage); + else + EPD_2in13_V3_Display_Partial_Wait(BlackImage); + i = 0; + k = 0; + j++; + ReFlag = 0; + printf("*** Draw Refresh ***\r\n"); + }else if(k++>30000000 && i>0 && Page == 1) { + EPD_2in13_V3_Display_Partial(BlackImage); + i = 0; + k = 0; + j++; + printf("*** Overtime Refresh ***\r\n"); + }else if(j > 100 || SelfFlag) { + SelfFlag = 0; + j = 0; + EPD_2in13_V3_Init(EPD_2IN13_V3_FULL); + EPD_2in13_V3_Display_Base(BlackImage); + EPD_2in13_V3_Init(EPD_2IN13_V3_PART); + printf("--- Self Refresh ---\r\n"); + } + + if(GT_Scan()==1 || (Dev_Now.X[0] == Dev_Old.X[0] && Dev_Now.Y[0] == Dev_Old.Y[0])) { // No new touch + // printf("%d %d \r\n", j, SelfFlag); + // printf("No new touch \r\n"); + continue; + } + + if(Dev_Now.TouchpointFlag) { + i++; + Dev_Now.TouchpointFlag = 0; + + if(Page == 0 && ReFlag == 0) { //main menu + if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 56 && Dev_Now.Y[0] < 95) { + printf("Photo ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + Show_Photo_Small_2in13_V3(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 153 && Dev_Now.Y[0] < 193) { + printf("Draw ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + ReFlag = 1; + } + } + + if(Page == 1 && ReFlag == 0) { //white board + Paint_DrawPoint(Dev_Now.X[0], Dev_Now.Y[0], BLACK, Dev_Now.S[0]/8+1, DOT_STYLE_DFT); + + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 6 && Dev_Now.Y[0] < 30) { + printf("Home ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Clear ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + } + + if(Page == 2 && ReFlag == 0) { //photo menu + if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next page ...\r\n"); + Photo_S++; + if(Photo_S > 2) // 6 photos is a maximum of three pages + Photo_S=0; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_S == 0) + printf("Top page ...\r\n"); + else { + Photo_S--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + else if(Dev_Now.X[0] > 2 && Dev_Now.X[0] < 90 && Dev_Now.Y[0] > 2 && Dev_Now.Y[0] < 248 && ReFlag == 0) { + printf("Select photo ...\r\n"); + Page = 3; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + Photo_L = Dev_Now.X[0]/46*2 + 2-Dev_Now.Y[0]/124 + Photo_S*2; + Show_Photo_Large_2in13_V3(Photo_L); + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh small photo + ReFlag = 1; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + Show_Photo_Small_2in13_V3(Photo_S); // show small photo + } + } + + if(Page == 3 && ReFlag == 0) { //view the photo + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 4 && Dev_Now.Y[0] < 25) { + printf("Photo menu ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + Show_Photo_Small_2in13_V3(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next photo ...\r\n"); + Photo_L++; + if(Photo_L > 6) + Photo_L=1; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V3[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_L == 1) + printf("Top photo ...\r\n"); + else { + Photo_L--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh photo ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh large photo + ReFlag = 1; + Show_Photo_Large_2in13_V3(Photo_L); + } + } + + } + } + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V4.c b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V4.c new file mode 100644 index 0000000..36650d3 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/2in13_TestCode_V4.c @@ -0,0 +1,264 @@ +#include "Test.h" +#include "EPD_2in13_V4.h" +#include "GT1151.h" + +extern GT1151_Dev Dev_Now, Dev_Old; +extern int IIC_Address; +static pthread_t t1_2in13_V4; +UBYTE flag_t_2in13_V4 = 1; + +char *PhotoPath_S_2in13_V4[7] = {"./pic/2in13/Photo_1_0.bmp", + "./pic/2in13/Photo_1_1.bmp", "./pic/2in13/Photo_1_2.bmp", "./pic/2in13/Photo_1_3.bmp", "./pic/2in13/Photo_1_4.bmp", + "./pic/2in13/Photo_1_5.bmp", "./pic/2in13/Photo_1_6.bmp", + }; +char *PhotoPath_L_2in13_V4[7] = {"./pic/2in13/Photo_2_0.bmp", + "./pic/2in13/Photo_2_1.bmp", "./pic/2in13/Photo_2_2.bmp", "./pic/2in13/Photo_2_3.bmp", "./pic/2in13/Photo_2_4.bmp", + "./pic/2in13/Photo_2_5.bmp", "./pic/2in13/Photo_2_6.bmp", + }; +char *PagePath_2in13_V4[4] = {"./pic/2in13/Menu.bmp", "./pic/2in13/White_board.bmp", "./pic/2in13/Photo_1.bmp", "./pic/2in13/Photo_2.bmp"}; + + +void Handler_2in13_V4(int signo) +{ + //System Exit + printf("\r\nHandler:exit\r\n"); + EPD_2in13_V4_Sleep(); + DEV_Delay_ms(2000); + flag_t_2in13_V4 = 0; + pthread_join(t1_2in13_V4, NULL); + DEV_ModuleExit(); + exit(0); +} + +void *pthread_irq_2in13_V4(void *arg) +{ + while(flag_t_2in13_V4) { + if(DEV_Digital_Read(INT) == 0) { + Dev_Now.Touch = 1; + } + else { + Dev_Now.Touch = 0; + } + DEV_Delay_ms(0.01); + } + printf("thread:exit\r\n"); + pthread_exit(NULL); +} + +void Show_Photo_Small_2in13_V4(UBYTE small) +{ + for(UBYTE t=1; t<5; t++) { + // printf("t= %d , small= %d \r\n", t, small); + if(small*2+t > 6) + GUI_ReadBmp(PhotoPath_S_2in13_V4[0], (t-1)/2*45+2, (t%2)*124+2); + else + GUI_ReadBmp(PhotoPath_S_2in13_V4[small*2+t], (t-1)/2*45+2, (t%2)*124+2); + } +} + +void Show_Photo_Large_2in13_V4(UBYTE large) +{ + if(large > 6) + GUI_ReadBmp(PhotoPath_L_2in13_V4[0], 2, 2); + else + GUI_ReadBmp(PhotoPath_L_2in13_V4[large], 2, 2); +} + +int TestCode_2in13_V4(void) +{ + IIC_Address = 0x14; + + UDOUBLE i=0, j=0, k=0; + UBYTE Page=0, Photo_L=0, Photo_S=0; + UBYTE ReFlag=0, SelfFlag=0; + signal(SIGINT, Handler_2in13_V4); + DEV_ModuleInit(); + + pthread_create(&t1_2in13_V4, NULL, pthread_irq_2in13_V4, NULL); + + EPD_2in13_V4_Init(EPD_2IN13_V4_FULL); + + EPD_2in13_V4_Clear(); + + GT_Init(); + DEV_Delay_ms(100); + //Create a new image cache + UBYTE *BlackImage; + UWORD Imagesize = ((EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1)) * EPD_2in13_V4_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2in13_V4_WIDTH, EPD_2in13_V4_HEIGHT, 0, WHITE); + Paint_SelectImage(BlackImage); + Paint_SetMirroring(MIRROR_ORIGIN); + Paint_Clear(WHITE); + GUI_ReadBmp("./pic/2in13/Menu.bmp", 0, 0); + EPD_2in13_V4_Display(BlackImage); + EPD_2in13_V4_Init(EPD_2IN13_V4_PART); + EPD_2in13_V4_Display_Partial_Wait(BlackImage); + + while(1) { + // k++; + if(i > 12 || ReFlag == 1) { + if(Page == 1 && SelfFlag != 1) + EPD_2in13_V4_Display_Partial(BlackImage); + else + EPD_2in13_V4_Display_Partial_Wait(BlackImage); + i = 0; + k = 0; + j++; + ReFlag = 0; + printf("*** Draw Refresh ***\r\n"); + }else if(k++>30000000 && i>0 && Page == 1) { + EPD_2in13_V4_Display_Partial(BlackImage); + i = 0; + k = 0; + j++; + printf("*** Overtime Refresh ***\r\n"); + }else if(j > 100 || SelfFlag) { + SelfFlag = 0; + j = 0; + EPD_2in13_V4_Init(EPD_2IN13_V4_FULL); + EPD_2in13_V4_Display_Base(BlackImage); + EPD_2in13_V4_Init(EPD_2IN13_V4_PART); + printf("--- Self Refresh ---\r\n"); + } + + if(GT_Scan()==1 || (Dev_Now.X[0] == Dev_Old.X[0] && Dev_Now.Y[0] == Dev_Old.Y[0])) { // No new touch + // printf("%d %d \r\n", j, SelfFlag); + // printf("No new touch \r\n"); + continue; + } + + if(Dev_Now.TouchpointFlag) { + i++; + Dev_Now.TouchpointFlag = 0; + + if(Page == 0 && ReFlag == 0) { //main menu + if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 56 && Dev_Now.Y[0] < 95) { + printf("Photo ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + Show_Photo_Small_2in13_V4(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 29 && Dev_Now.X[0] < 92 && Dev_Now.Y[0] > 153 && Dev_Now.Y[0] < 193) { + printf("Draw ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + ReFlag = 1; + } + } + + if(Page == 1 && ReFlag == 0) { //white board + Paint_DrawPoint(Dev_Now.X[0], Dev_Now.Y[0], BLACK, Dev_Now.S[0]/8+1, DOT_STYLE_DFT); + + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 6 && Dev_Now.Y[0] < 30) { + printf("Home ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Clear ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 118 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + } + + if(Page == 2 && ReFlag == 0) { //photo menu + if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next page ...\r\n"); + Photo_S++; + if(Photo_S > 2) // 6 photos is a maximum of three pages + Photo_S=0; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_S == 0) + printf("Top page ...\r\n"); + else { + Photo_S--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 97 && Dev_Now.X[0] < 119 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + else if(Dev_Now.X[0] > 2 && Dev_Now.X[0] < 90 && Dev_Now.Y[0] > 2 && Dev_Now.Y[0] < 248 && ReFlag == 0) { + printf("Select photo ...\r\n"); + Page = 3; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + Photo_L = Dev_Now.X[0]/46*2 + 2-Dev_Now.Y[0]/124 + Photo_S*2; + Show_Photo_Large_2in13_V4(Photo_L); + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh small photo + ReFlag = 1; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + Show_Photo_Small_2in13_V4(Photo_S); // show small photo + } + } + + if(Page == 3 && ReFlag == 0) { //view the photo + if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 4 && Dev_Now.Y[0] < 25) { + printf("Photo menu ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + Show_Photo_Small_2in13_V4(Photo_S); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 57 && Dev_Now.Y[0] < 78) { + printf("Next photo ...\r\n"); + Photo_L++; + if(Photo_L > 6) + Photo_L=1; + ReFlag = 2; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 113 && Dev_Now.Y[0] < 136) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in13_V4[Page], 0, 0); + ReFlag = 1; + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 169 && Dev_Now.Y[0] < 190) { + printf("Last page ...\r\n"); + if(Photo_L == 1) + printf("Top photo ...\r\n"); + else { + Photo_L--; + ReFlag = 2; + } + } + else if(Dev_Now.X[0] > 96 && Dev_Now.X[0] < 117 && Dev_Now.Y[0] > 220 && Dev_Now.Y[0] < 242) { + printf("Refresh photo ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh large photo + ReFlag = 1; + Show_Photo_Large_2in13_V4(Photo_L); + } + } + + } + } + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/examples/2in9_TestCode.c b/docs/Touch_e-Paper_Code/c/examples/2in9_TestCode.c new file mode 100644 index 0000000..f0418f5 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/2in9_TestCode.c @@ -0,0 +1,364 @@ +#include "Test.h" +#include "EPD_2in9_V2.h" +#include "ICNT86X.h" +#include "time.h" + +extern ICNT86_Dev ICNT86_Dev_Now, ICNT86_Dev_Old; +extern int IIC_Address; +static pthread_t t1, t2; +UBYTE flag_2in9=1, dis_lock=1, dis_flag=1; +UBYTE *BlackImage, *BlackImage_ASYNC; + +char *PhotoPath_S_2in9[10] = {"./pic/2in9/Photo_1_0.bmp", + "./pic/2in9/Photo_1_1.bmp", "./pic/2in9/Photo_1_2.bmp", "./pic/2in9/Photo_1_3.bmp", "./pic/2in9/Photo_1_4.bmp", + "./pic/2in9/Photo_1_5.bmp", "./pic/2in9/Photo_1_6.bmp", "./pic/2in9/Photo_1_7.bmp", "./pic/2in9/Photo_1_8.bmp", + "./pic/2in9/Photo_1_9.bmp", + }; +char *PhotoPath_L_2in9[10] = {"./pic/2in9/Photo_2_0.bmp", + "./pic/2in9/Photo_2_1.bmp", "./pic/2in9/Photo_2_2.bmp", "./pic/2in9/Photo_2_3.bmp", "./pic/2in9/Photo_2_4.bmp", + "./pic/2in9/Photo_2_5.bmp", "./pic/2in9/Photo_2_6.bmp", "./pic/2in9/Photo_2_7.bmp", "./pic/2in9/Photo_2_8.bmp", + "./pic/2in9/Photo_2_9.bmp", + }; +char *PagePath_2in9[4] = {"./pic/2in9/Menu.bmp", "./pic/2in9/White_board.bmp", "./pic/2in9/Photo_1.bmp", "./pic/2in9/Photo_2.bmp"}; + + +void Handler_2in9(int signo) +{ + //System Exit + printf("\r\nHandler_2in9:exit\r\n"); + EPD_2IN9_V2_Sleep(); + DEV_Delay_ms(1000); + flag_2in9 = 0; + pthread_join(t1, NULL); + pthread_join(t2, NULL); + DEV_ModuleExit(); + exit(0); +} + +void *pthread_irq_2in9(void *arg) +{ + while(flag_2in9) { + if(DEV_Digital_Read(INT) == 0) { + ICNT86_Dev_Now.Touch = 1; + // printf("!"); + } + else { + ICNT86_Dev_Now.Touch = 0; + } + DEV_Delay_ms(0.01); + } + printf("thread1:exit\r\n"); + pthread_exit(NULL); +} + +void *pthread_dis_2in9(void *arg) +{ + while(flag_2in9) { + if(dis_flag) { + dis_lock = 1; + EPD_2IN9_V2_Display_Partial(BlackImage_ASYNC); + dis_flag = 0; + dis_lock = 0; + printf("ASYNC display over, unlock \r\n"); + } + else { + dis_lock = 0; + } + // DEV_Delay_ms(0.01); + } + + printf("thread2:exit\r\n"); + pthread_exit(NULL); +} + +void Show_Photo_Small_2in9(UBYTE small) +{ + for(UBYTE t=1; t<7; t++) { + // printf("t= %d , small= %d \r\n", t, small); + if(small*3+t > 9) // Max image is 9 + GUI_ReadBmp(PhotoPath_S_2in9[0], (t-1)%3*98+2, (t-1)/3*48+2); + else { + // printf("x is %d, y is %d \r\n", (t-1)%3*98, (t-1)/3*48); + GUI_ReadBmp(PhotoPath_S_2in9[small*3+t], (t-1)%3*98+2, (t-1)/3*48+2); + } + } +} + +void Show_Photo_Large_2in9(UBYTE large) +{ + if(large > 9) // Max image is 9 + GUI_ReadBmp(PhotoPath_L_2in9[0], 2, 2); + else + GUI_ReadBmp(PhotoPath_L_2in9[large], 2, 2); +} + +void Get_Current_Time(PAINT_TIME *pTime) +{ + time_t t; + struct tm *nowtime; + + time(&t); + nowtime = localtime(&t); + + pTime->Year = nowtime->tm_year + 1900; + pTime->Month = nowtime->tm_mon + 1; + pTime->Day = nowtime->tm_mday; + pTime->Hour = nowtime->tm_hour; + pTime->Min = nowtime->tm_min; +} + + +int Test4gray_2in9(void) +{ + EPD_2IN9_V2_Gray4_Init(); + UWORD Imagesize = ((EPD_2IN9_V2_WIDTH % 4 == 0)? (EPD_2IN9_V2_WIDTH / 4 ): (EPD_2IN9_V2_WIDTH / 4 + 1)) * EPD_2IN9_V2_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 0, WHITE); + Paint_SetScale(4); + Paint_Clear(WHITE); + GUI_ReadBmp_4Gray("./pic/2in9/2in9_Scale.bmp", 0, 0); + EPD_2IN9_V2_4GrayDisplay(BlackImage); + DEV_Delay_ms(3000); + free(BlackImage); +} + + +int TestCode_2in9(void) +{ + IIC_Address = 0x48; + + UDOUBLE i=0, j=0, k=0; + UBYTE Page=0, Photo_L=0, Photo_S=0; + UBYTE ReFlag=0, SelfFlag=0; + signal(SIGINT, Handler_2in9); + DEV_ModuleInit(); + + pthread_create(&t1, NULL, pthread_irq_2in9, NULL); + + /* + Because the touch display requires a relatively fast refresh speed, the default + needs to use partial refresh, and four gray levels cannot be used in this mode. + Here, only four gray level picture refresh demonstration is used + */ + // Test4gray_2in9(); + + EPD_2IN9_V2_Init(); + + EPD_2IN9_V2_Clear(); + + ICNT_Init(); + DEV_Delay_ms(100); + //Create a new image cache + UWORD Imagesize = ((EPD_2IN9_V2_WIDTH % 8 == 0)? (EPD_2IN9_V2_WIDTH / 8 ): (EPD_2IN9_V2_WIDTH / 8 + 1)) * EPD_2IN9_V2_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + if((BlackImage_ASYNC = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE); + Paint_SelectImage(BlackImage); + Paint_Clear(WHITE); + GUI_ReadBmp("./pic/2in9/Menu.bmp", 0, 0); + + PAINT_TIME sPaint_time, sPaint_time_f; + Get_Current_Time(&sPaint_time); + Get_Current_Time(&sPaint_time_f); + Paint_DrawTime(210, 45, &sPaint_time, &Font24, WHITE, WHITE); + Paint_DrawDate(212, 80, &sPaint_time, &Font12, WHITE, WHITE); + + EPD_2IN9_V2_Display_Base(BlackImage); + memcpy(BlackImage_ASYNC, BlackImage, Imagesize); + pthread_create(&t2, NULL, pthread_dis_2in9, NULL); + while(1) { + // k++; + if(i > 30 || ReFlag == 1) { + if(Page == 0) { + Get_Current_Time(&sPaint_time); + Paint_ClearWindows(210, 40, 290, 100, BLACK); + Paint_DrawTime(212, 45, &sPaint_time, &Font24, WHITE, WHITE); + Paint_DrawDate(212, 80, &sPaint_time, &Font12, WHITE, WHITE); + } + + if(Page == 1 && SelfFlag != 1 && dis_lock != 1) { + memcpy(BlackImage_ASYNC, BlackImage, Imagesize); + dis_flag = 1; + + i = 0; + k = 0; + j++; + ReFlag = 0; + printf("*** Draw Refresh ***\r\n"); + } + else if(!dis_lock){ + EPD_2IN9_V2_Display_Partial_Wait(BlackImage); + + i = 0; + k = 0; + j++; + ReFlag = 0; + printf("*** Touch Refresh ***\r\n"); + } + }else if(k++>50000000 && i>0 && Page == 1) { + EPD_2IN9_V2_Display_Partial(BlackImage); + i = 0; + k = 0; + j++; + printf("*** Overtime Refresh ***\r\n"); + }else if(j > 100 || SelfFlag) { + SelfFlag = 0; + j = 0; + EPD_2IN9_V2_Init(); + EPD_2IN9_V2_Display_Base(BlackImage); + printf("--- Self Refresh ---\r\n"); + } + + if(Page == 0 && ReFlag == 0) { //main menu + Get_Current_Time(&sPaint_time_f); + if(sPaint_time_f.Min != sPaint_time.Min) { + ReFlag = 1; + } + } + + + if(ICNT_Scan()==1 || (ICNT86_Dev_Now.X[0] == ICNT86_Dev_Old.X[0] && ICNT86_Dev_Now.Y[0] == ICNT86_Dev_Old.Y[0])) { // No new touch + // printf("%d %d \r\n", j, SelfFlag); + // printf("No new touch \r\n"); + continue; + } + + if(ICNT86_Dev_Now.TouchCount) { + i++; + if(Page == 0 && ReFlag == 0) { //main menu + if(ICNT86_Dev_Now.X[0] > 119 && ICNT86_Dev_Now.X[0] < 152 && ICNT86_Dev_Now.Y[0] > 31 && ICNT86_Dev_Now.Y[0] < 96) { + printf("Photo ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + Show_Photo_Small_2in9(Photo_S); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 39 && ICNT86_Dev_Now.X[0] < 80 && ICNT86_Dev_Now.Y[0] > 31 && ICNT86_Dev_Now.Y[0] < 96) { + printf("Draw ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + ReFlag = 1; + } + } + + if(Page == 1 && ReFlag == 0) { //white board + // Paint_DrawPoint(ICNT86_Dev_Now.X[0], ICNT86_Dev_Now.Y[0], BLACK, ICNT86_Dev_Now.P[0]/8+1, DOT_STYLE_DFT); + Paint_DrawPoint(ICNT86_Dev_Now.X[0], ICNT86_Dev_Now.Y[0], BLACK, 3, DOT_STYLE_DFT); + + if(ICNT86_Dev_Now.X[0] > 136 && ICNT86_Dev_Now.X[0] < 159 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 266 && ICNT86_Dev_Now.X[0] < 289 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Clear ...\r\n"); + Page = 1; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + } + + if(Page == 2 && ReFlag == 0) { //photo menu + if(ICNT86_Dev_Now.X[0] > 135 && ICNT86_Dev_Now.X[0] < 160 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 203 && ICNT86_Dev_Now.X[0] < 224 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Next page ...\r\n"); + Photo_S++; + if(Photo_S > 2) // 9 photos is a maximum of three pages + Photo_S=0; + ReFlag = 2; + } + else if(ICNT86_Dev_Now.X[0] > 71 && ICNT86_Dev_Now.X[0] < 92 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Last page ...\r\n"); + if(Photo_S == 0) + printf("Top page ...\r\n"); + else { + Photo_S--; + ReFlag = 2; + } + } + else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Refresh ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 2 && ICNT86_Dev_Now.X[0] < 293 && ICNT86_Dev_Now.Y[0] > 2 && ICNT86_Dev_Now.Y[0] < 96 && ReFlag == 0) { + printf("Select photo ...\r\n"); + Page = 3; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + Photo_L = ICNT86_Dev_Now.X[0]/96 + ICNT86_Dev_Now.Y[0]/48*3 + Photo_S*3 + 1; + Show_Photo_Large_2in9(Photo_L); + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh small photo + ReFlag = 1; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + Show_Photo_Small_2in9(Photo_S); // show small photo + } + } + + if(Page == 3 && ReFlag == 0) { //view the photo + if(ICNT86_Dev_Now.X[0] > 268 && ICNT86_Dev_Now.X[0] < 289 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Photo menu ...\r\n"); + Page = 2; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + Show_Photo_Small_2in9(Photo_S); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 203 && ICNT86_Dev_Now.X[0] < 224 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Next photo ...\r\n"); + Photo_L++; + if(Photo_L > 9) + Photo_L=1; + ReFlag = 2; + } + else if(ICNT86_Dev_Now.X[0] > 135 && ICNT86_Dev_Now.X[0] < 160 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Home ...\r\n"); + Page = 0; + GUI_ReadBmp(PagePath_2in9[Page], 0, 0); + ReFlag = 1; + } + else if(ICNT86_Dev_Now.X[0] > 71 && ICNT86_Dev_Now.X[0] < 92 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Last page ...\r\n"); + if(Photo_L == 1) + printf("Top photo ...\r\n"); + else { + Photo_L--; + ReFlag = 2; + } + } + else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) { + printf("Refresh photo ...\r\n"); + SelfFlag = 1; + ReFlag = 1; + } + if(ReFlag == 2) { // Refresh large photo + ReFlag = 1; + Show_Photo_Large_2in9(Photo_L); + } + } + + } + } + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/examples/Test.h b/docs/Touch_e-Paper_Code/c/examples/Test.h new file mode 100644 index 0000000..079dec7 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/Test.h @@ -0,0 +1,15 @@ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include //exit() +#include //signal() +#include //pthread_create() +#include "GUI_Paint.h" +#include "GUI_BMPfile.h" + +int TestCode_2in13(void); +int TestCode_2in13_V3(void); +int TestCode_2in13_V4(void); +int TestCode_2in9(void); + +#endif \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/examples/main.c b/docs/Touch_e-Paper_Code/c/examples/main.c new file mode 100644 index 0000000..3fcaeda --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/examples/main.c @@ -0,0 +1,10 @@ +#include "Test.h" + +int main() +{ + // TestCode_2in13(); + // TestCode_2in13_V3(); + // TestCode_2in13_V4(); + TestCode_2in9(); + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/DEV_Config.c b/docs/Touch_e-Paper_Code/c/lib/Config/DEV_Config.c new file mode 100644 index 0000000..fecd39d --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/DEV_Config.c @@ -0,0 +1,342 @@ +/***************************************************************************** +* | File : DEV_Config.c +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +*---------------- +* | This version: V2.0 +* | Date : 2020-06-17 +* | Info : Basic version +* +******************************************************************************/ +#include "DEV_Config.h" +#include +#include + +#if USE_LGPIO_LIB +int GPIO_Handle; +int SPI_Handle; +int IIC_Handle; +#endif + +/** + * GPIO +**/ +int EPD_RST_PIN; +int EPD_DC_PIN; +int EPD_CS_PIN; +int EPD_BUSY_PIN; +int IIC_Address; + + +uint32_t fd; +/***************************************** + GPIO +*****************************************/ +void DEV_Digital_Write(UWORD Pin, UBYTE Value) +{ +#ifdef USE_BCM2835_LIB + bcm2835_gpio_write(Pin, Value); +#elif USE_WIRINGPI_LIB + digitalWrite(Pin, Value); +#elif USE_LGPIO_LIB + lgGpioWrite(GPIO_Handle, Pin, Value); +#elif USE_GPIOD_LIB + GPIOD_Write(Pin, Value); +#endif +} + +UBYTE DEV_Digital_Read(UWORD Pin) +{ + UBYTE Read_value = 0; +#ifdef USE_BCM2835_LIB + Read_value = bcm2835_gpio_lev(Pin); +#elif USE_WIRINGPI_LIB + Read_value = digitalRead(Pin); +#elif USE_LGPIO_LIB + Read_value = lgGpioRead(GPIO_Handle,Pin); +#elif USE_GPIOD_LIB + Read_value = GPIOD_Read(Pin); +#endif + return Read_value; +} + +void DEV_GPIO_Mode(UWORD Pin, UWORD Mode) +{ +#ifdef USE_BCM2835_LIB + if(Mode == 0 || Mode == BCM2835_GPIO_FSEL_INPT){ + bcm2835_gpio_fsel(Pin, BCM2835_GPIO_FSEL_INPT); + }else { + bcm2835_gpio_fsel(Pin, BCM2835_GPIO_FSEL_OUTP); + } +#elif USE_WIRINGPI_LIB + if(Mode == 0 || Mode == INPUT) { + pinMode(Pin, INPUT); + pullUpDnControl(Pin, PUD_UP); + } else { + pinMode(Pin, OUTPUT); + // Debug (" %d OUT \r\n",Pin); + } +#elif USE_LGPIO_LIB + if(Mode == 0 || Mode == LG_SET_INPUT){ + lgGpioClaimInput(GPIO_Handle,LFLAGS,Pin); + // Debug("IN Pin = %d\r\n",Pin); + }else{ + lgGpioClaimOutput(GPIO_Handle, LFLAGS, Pin, LG_LOW); + // Debug("OUT Pin = %d\r\n",Pin); + } +#elif USE_GPIOD_LIB + if(Mode == 0 || Mode == GPIOD_IN){ + GPIOD_Direction(Pin, GPIOD_IN); + // Debug("IN Pin = %d\r\n",Pin); + }else{ + GPIOD_Direction(Pin, GPIOD_OUT); + // Debug("OUT Pin = %d\r\n",Pin); + } +#endif +} + +/** + * delay x ms +**/ +void DEV_Delay_ms(UDOUBLE xms) +{ +#ifdef USE_BCM2835_LIB + bcm2835_delay(xms); +#elif USE_WIRINGPI_LIB + delay(xms); +#elif USE_LGPIO_LIB + lguSleep(xms/1000.0); +#elif USE_GPIOD_LIB + UDOUBLE i; + for(i=0; i < xms; i++){ + usleep(1000); + } +#endif +} + +static void DEV_GPIO_Init(void) +{ + EPD_RST_PIN = 17; + EPD_DC_PIN = 25; + EPD_CS_PIN = 8; + EPD_BUSY_PIN = 24; + + DEV_GPIO_Mode(EPD_RST_PIN, 1); + DEV_GPIO_Mode(EPD_DC_PIN, 1); + DEV_GPIO_Mode(EPD_CS_PIN, 1); + DEV_GPIO_Mode(EPD_BUSY_PIN, 0); + + DEV_Digital_Write(EPD_CS_PIN, 1); + + DEV_GPIO_Mode(TRST, 1); + DEV_GPIO_Mode(INT, 0); +} + +/****************************************************************************** +function: Module Initialize, the library and initialize the pins, SPI protocol +parameter: +Info: +******************************************************************************/ +UBYTE DEV_ModuleInit(void) +{ + #ifdef USE_BCM2835_LIB + if(!bcm2835_init()) { + printf("bcm2835 init failed !!! \r\n"); + return 1; + } else { + printf("bcm2835 init success !!! \r\n"); + } + + DEV_GPIO_Init(); + + bcm2835_i2c_begin(); + bcm2835_i2c_setSlaveAddress(IIC_Address); + // bcm2835_i2c_setClockDivider(BCM2835_I2C_CLOCK_DIVIDER_2500); + + bcm2835_spi_begin(); //Start spi interface, set spi pin for the reuse function + bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); //High first transmission + bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); //spi mode 0 + bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_32); //Frequency + bcm2835_spi_chipSelect(BCM2835_SPI_CS0); //set CE0 + bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); //enable cs0 +#elif USE_WIRINGPI_LIB + // if(wiringPiSetup() < 0) {//use wiringpi Pin number table + if(wiringPiSetupGpio() < 0) { //use BCM2835 Pin number table + printf("set wiringPi lib failed !!! \r\n"); + return 1; + } else { + printf("set wiringPi lib success !!! \r\n"); + } + // GPIO Config + DEV_GPIO_Init(); + + // wiringPiSPISetup(0,10000000); + wiringPiSPISetupMode(0, 10000000, 0); + fd = wiringPiI2CSetup(IIC_Address); + + DEV_HARDWARE_I2C_begin("/dev/i2c-1"); + DEV_HARDWARE_I2C_setSlaveAddress(IIC_Address); +#elif USE_LGPIO_LIB + char buffer[NUM_MAXBUF]; + FILE *fp; + + fp = popen("cat /proc/cpuinfo | grep 'Raspberry Pi 5'", "r"); + if (fp == NULL) { + Debug("It is not possible to determine the model of the Raspberry PI\n"); + return -1; + } + + if(fgets(buffer, sizeof(buffer), fp) != NULL) + { + GPIO_Handle = lgGpiochipOpen(4); + if (GPIO_Handle < 0) + { + Debug( "gpiochip4 Export Failed\n"); + return -1; + } + } + else + { + GPIO_Handle = lgGpiochipOpen(0); + if (GPIO_Handle < 0) + { + Debug( "gpiochip0 Export Failed\n"); + return -1; + } + } + SPI_Handle = lgSpiOpen(0, 0, 10000000, 0); + IIC_Handle = lgI2cOpen(1,IIC_Address,0); + DEV_GPIO_Init(); +#elif USE_GPIOD_LIB + GPIOD_Export(); + DEV_GPIO_Init(); + + DEV_HARDWARE_I2C_begin("/dev/i2c-1"); + DEV_HARDWARE_I2C_setSlaveAddress(IIC_Address); + + DEV_HARDWARE_SPI_begin("/dev/spidev0.0"); + DEV_HARDWARE_SPI_setSpeed(10000000); +#endif + return 0; +} + +/** + * SPI +**/ +void DEV_SPI_WriteByte(uint8_t Value) +{ +#ifdef USE_BCM2835_LIB + bcm2835_spi_transfer(Value); +#elif USE_WIRINGPI_LIB + wiringPiSPIDataRW(0, &Value, 1); +#elif USE_LGPIO_LIB + lgSpiWrite(SPI_Handle,(char*)&Value, 1); +#elif USE_GPIOD_LIB + DEV_HARDWARE_SPI_TransferByte(Value); +#endif +} + +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len) +{ +#ifdef USE_BCM2835_LIB + char rData[Len]; + bcm2835_spi_transfernb(pData, rData, Len); +#elif USE_WIRINGPI_LIB + wiringPiSPIDataRW(0, pData, Len); +#elif USE_LGPIO_LIB + lgSpiWrite(SPI_Handle,(char*)pData, Len); +#elif USE_GPIOD_LIB + DEV_HARDWARE_SPI_Transfer(pData, Len); +#endif +} + +UBYTE I2C_Write_Byte(UWORD Reg, char *Data, UBYTE len) +{ + char wbuf[50]={(Reg>>8)&0xff, Reg&0xff}; + for(UBYTE i=0; i 1) + printf("wiringPi I2C WARING \r\n"); + wiringPiI2CWriteReg16(fd, wbuf[0], wbuf[1] | (wbuf[2]<<8)); +#elif USE_LGPIO_LIB + lgI2cWriteDevice(IIC_Handle, wbuf, len+2); +#elif USE_GPIOD_LIB + DEV_HARDWARE_I2C_write(wbuf, len+2); +#endif + + return 0; +} + +#ifdef USE_WIRINGPI_LIB +static I2C_Write_WiringPi(UWORD Reg) +{ + wiringPiI2CWriteReg8(fd, (Reg>>8) & 0xff, Reg & 0xff); +} +#endif + +UBYTE I2C_Read_Byte(UWORD Reg, char *Data, UBYTE len) +{ + char *rbuf = Data; + +#ifdef USE_BCM2835_LIB + I2C_Write_Byte(Reg, 0, 0); + if(bcm2835_i2c_read(rbuf, len) != BCM2835_I2C_REASON_OK) { + printf("READ ERROR \r\n"); + return -1; + } +#elif USE_WIRINGPI_LIB + I2C_Write_WiringPi(Reg); + for(UBYTE i=0; i +#elif USE_WIRINGPI_LIB + #include + #include + #include + #include "dev_hardware_i2c.h" +#elif USE_LGPIO_LIB + #include + #define LFLAGS 0 + #define NUM_MAXBUF 4 +#elif USE_GPIOD_LIB + #include "RPI_gpiod.h" + #include "dev_hardware_i2c.h" + #include "dev_hardware_SPI.h" +#endif + +#include +#include +#include +#include +#include +#include "Debug.h" + +// #define IIC_Address 0x14 +// #define IIC_Address_Read 0x29 +// #define IIC_Address_Write 0x28 + +/** + * data +**/ +#define UBYTE uint8_t +#define UWORD uint16_t +#define UDOUBLE uint32_t + +//TP Define +#define TRST 22 +#define INT 27 + +#define TRST_0 DEV_Digital_Write(TRST, 0) +#define TRST_1 DEV_Digital_Write(TRST, 1) + +#define INT_0 DEV_Digital_Write(INT, 0) +#define INT_1 DEV_Digital_Write(INT, 1) + +/** + * GPIOI config +**/ +extern int EPD_RST_PIN; +extern int EPD_DC_PIN; +extern int EPD_CS_PIN; +extern int EPD_BUSY_PIN; + +/*------------------------------------------------------------------------------------------------------*/ + +UBYTE DEV_ModuleInit(void); +void DEV_ModuleExit(void); + +void DEV_GPIO_Mode(UWORD Pin, UWORD Mode); +void DEV_Delay_ms(UDOUBLE xms); + +void DEV_Digital_Write(UWORD Pin, UBYTE Value); +UBYTE DEV_Digital_Read(UWORD Pin); + +void DEV_SPI_WriteByte(UBYTE Value); +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len); + +UBYTE I2C_Write_Byte(UWORD Reg, char *Data, UBYTE len); +UBYTE I2C_Read_Byte(UWORD Reg, char *Data, UBYTE len); +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/Debug.h b/docs/Touch_e-Paper_Code/c/lib/Config/Debug.h new file mode 100644 index 0000000..b92a411 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/Debug.h @@ -0,0 +1,47 @@ +/***************************************************************************** +* | File : Debug.h +* | Author : Waveshare team +* | Function : debug with printf +* | Info : +* Image scanning +* Please use progressive scanning to generate images or fonts +*---------------- +* | This version: V2.0 +* | Date : 2020-06-17 +* | Info : +* 1.USE_DEBUG -> DEBUG, If you need to see the debug information, +* clear the execution: make DEBUG=-DDEBUG +# +# 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 __DEBUG_H +#define __DEBUG_H + +#include + +#if 1 + #define Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else + #define Debug(__info,...) +#endif + +#endif + diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.c b/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.c new file mode 100644 index 0000000..130ca69 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.c @@ -0,0 +1,170 @@ +/***************************************************************************** +* | File : RPI_GPIOD.c +* | Author : Waveshare team +* | Function : Drive GPIO +* | Info : Read and write gpio +*---------------- +* | This version: V1.0 +* | Date : 2023-11-15 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# GPIOD_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 folGPIOD_LOWing conditions: +# +# The above copyright notice and this permission notice shall be included GPIOD_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. GPIOD_IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER GPIOD_IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# GPIOD_OUT OF OR GPIOD_IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS GPIOD_IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "RPI_gpiod.h" +#include +#include +#include +#include +#include +#include +#include +#include + +struct gpiod_chip *gpiochip; +struct gpiod_line *gpioline; +int ret; + +int GPIOD_Export() +{ + char buffer[NUM_MAXBUF]; + FILE *fp; + + fp = popen("cat /proc/cpuinfo | grep 'Raspberry Pi 5'", "r"); + if (fp == NULL) { + GPIOD_Debug("It is not possible to determine the model of the Raspberry PI\n"); + return -1; + } + + if(fgets(buffer, sizeof(buffer), fp) != NULL) + { + gpiochip = gpiod_chip_open("/dev/gpiochip4"); + if (gpiochip == NULL) + { + GPIOD_Debug( "gpiochip4 Export Failed\n"); + return -1; + } + } + else + { + gpiochip = gpiod_chip_open("/dev/gpiochip0"); + if (gpiochip == NULL) + { + GPIOD_Debug( "gpiochip0 Export Failed\n"); + return -1; + } + } + + + return 0; +} + +int GPIOD_Unexport(int Pin) +{ + gpioline = gpiod_chip_get_line(gpiochip, Pin); + if (gpioline == NULL) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + + gpiod_line_release(gpioline); + + GPIOD_Debug( "Unexport: Pin%d\r\n", Pin); + + return 0; +} + +int GPIOD_Unexport_GPIO(void) +{ + gpiod_line_release(gpioline); + gpiod_chip_close(gpiochip); + + return 0; +} + +int GPIOD_Direction(int Pin, int Dir) +{ + gpioline = gpiod_chip_get_line(gpiochip, Pin); + if (gpioline == NULL) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + + if(Dir == GPIOD_IN) + { + ret = gpiod_line_request_input(gpioline, "gpio"); + if (ret != 0) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + GPIOD_Debug("Pin%d:intput\r\n", Pin); + } + else + { + ret = gpiod_line_request_output(gpioline, "gpio", 0); + if (ret != 0) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + GPIOD_Debug("Pin%d:Output\r\n", Pin); + } + return 0; +} + +int GPIOD_Read(int Pin) +{ + gpioline = gpiod_chip_get_line(gpiochip, Pin); + if (gpioline == NULL) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + + ret = gpiod_line_get_value(gpioline); + if (ret < 0) + { + GPIOD_Debug( "failed to read value!\n"); + return -1; + } + + return(ret); +} + +int GPIOD_Write(int Pin, int value) +{ + gpioline = gpiod_chip_get_line(gpiochip, Pin); + if (gpioline == NULL) + { + GPIOD_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + + ret = gpiod_line_set_value(gpioline, value); + if (ret != 0) + { + GPIOD_Debug( "failed to write value! : Pin%d\n", Pin); + return -1; + } + return 0; +} diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.h b/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.h new file mode 100644 index 0000000..60712fe --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/RPI_gpiod.h @@ -0,0 +1,88 @@ +/***************************************************************************** +* | File : gpiod.h +* | Author : Waveshare team +* | Function : Drive GPIO +* | Info : Read and write gpio +*---------------- +* | This version: V1.0 +* | Date : 2023-11-15 +* | Info : Basic version +*d +# +# 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: +#D +# 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. +# +************************D******************************************************/ +#ifndef __GPIOD_ +#define __GPIOD_ + +#include +#include + +#define GPIOD_IN 0 +#define GPIOD_OUT 1 + +#define GPIOD_LOW 0 +#define GPIOD_HIGH 1 + +#define NUM_MAXBUF 4 +#define DIR_MAXSIZ 60 + +#define GPIOD_DEBUG 0 +#if GPIOD_DEBUG + #define GPIOD_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else + #define GPIOD_Debug(__info,...) +#endif + +// BCM GPIO for Jetson nano +#define GPIO4 4 // 7, 4 +#define GPIO17 7 // 11, 17 +#define GPIO18 18 // 12, 18 +#define GPIO27 27 // 13, 27 +#define GPIO22 22 // 15, 22 +#define GPIO23 23 // 16, 23 +#define GPIO24 24 // 18, 24 +#define SPI0_MOSI 10 // 19, 10 +#define SPI0_MISO 9 // 21, 9 +#define GPIO25 28 // 22, 25 +#define SPI0_SCK 11 // 23, 11 +#define SPI0_CS0 8 // 24, 8 +#define SPI0_CS1 7 // 26, 7 +#define GPIO5 5 // 29, 5 +#define GPIO6 6 // 31, 6 +#define GPIO12 12 // 32, 12 +#define GPIO13 13 // 33, 13 +#define GPIO19 19 // 35, 19 +#define GPIO16 16 // 36, 16 +#define GPIO26 26 // 37, 26 +#define GPIO20 20 // 38, 20 +#define GPIO21 21 // 40, 21 + +extern struct gpiod_chip *gpiochip; +extern struct gpiod_line *gpioline; +extern int ret; + +int GPIOD_Export(); +int GPIOD_Unexport(int Pin); +int GPIOD_Unexport_GPIO(void); +int GPIOD_Direction(int Pin, int Dir); +int GPIOD_Read(int Pin); +int GPIOD_Write(int Pin, int value); + +#endif \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.c b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.c new file mode 100644 index 0000000..4738b7b --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.c @@ -0,0 +1,363 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.c +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# 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 "dev_hardware_SPI.h" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +HARDWARE_SPI hardware_SPI; + +static uint8_t bits = 8; + +#define SPI_CS_HIGH 0x04 //Chip select high +#define SPI_LSB_FIRST 0x08 //LSB +#define SPI_3WIRE 0x10 //3-wire mode SI and SO same line +#define SPI_LOOP 0x20 //Loopback mode +#define SPI_NO_CS 0x40 //A single device occupies one SPI bus, so there is no chip select +#define SPI_READY 0x80 //Slave pull low to stop data transmission + +struct spi_ioc_transfer tr; + + +/****************************************************************************** +function: SPI port initialization +parameter: + SPI_device : Device name +Info: + /dev/spidev0.0 + /dev/spidev0.1 +******************************************************************************/ +void DEV_HARDWARE_SPI_begin(char *SPI_device) +{ + //device + int ret = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + DEV_HARDWARE_SPI_Debug("Failed to open SPI device\r\n"); + exit(1); + } else { + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + hardware_SPI.mode = 0; + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) { + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) { + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + } + tr.bits_per_word = bits; + + DEV_HARDWARE_SPI_Mode(SPI_MODE_0); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_SetBitOrder(SPI_BIT_ORDER_LSBFIRST); + DEV_HARDWARE_SPI_setSpeed(20000000); + DEV_HARDWARE_SPI_SetDataInterval(0); +} + +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed) +{ + //device + int ret = 0; + hardware_SPI.mode = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + exit(1); + } else { + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + + DEV_HARDWARE_SPI_Mode(mode); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_setSpeed(speed); + DEV_HARDWARE_SPI_SetDataInterval(0); +} + + +/****************************************************************************** +function: SPI device End +parameter: +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_end(void) +{ + hardware_SPI.mode = 0; + if (close(hardware_SPI.fd) != 0){ + DEV_HARDWARE_SPI_Debug("Failed to close SPI device\r\n"); + perror("Failed to close SPI device.\n"); + } +} + +/****************************************************************************** +function: Set SPI speed +parameter: +Info: Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed) +{ + uint32_t speed1 = hardware_SPI.speed; + + hardware_SPI.speed = speed; + + //Write speed + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't set max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + + //Read the speed of just writing + if (ioctl(hardware_SPI.fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't get max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + hardware_SPI.speed = speed; + tr.speed_hz = hardware_SPI.speed; + return 1; +} + +/****************************************************************************** +function: Set SPI Mode +parameter: +Info: + SPIMode: + SPI_MODE0 + SPI_MODE1 + SPI_MODE2 + SPI_MODE3 + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_Mode(SPIMode mode) +{ + hardware_SPI.mode &= 0xfC;//Clear low 2 digits + hardware_SPI.mode |= mode;//Setting mode + + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Set SPI CS Enable +parameter: +Info: + EN: + DISABLE + ENABLE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN) +{ + if(EN == ENABLE){ + hardware_SPI.mode |= SPI_NO_CS; + }else { + hardware_SPI.mode &= ~SPI_NO_CS; + } + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi CS EN\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Chip Select +parameter: +Info: + CS_Mode: + SPI_CS_Mode_LOW + SPI_CS_Mode_HIGH + SPI_CS_Mode_NONE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode) +{ + if(CS_Mode == SPI_CS_Mode_HIGH){ + hardware_SPI.mode |= SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + DEV_HARDWARE_SPI_Debug("CS HIGH \r\n"); + }else if(CS_Mode == SPI_CS_Mode_LOW){ + hardware_SPI.mode &= ~SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + }else if(CS_Mode == SPI_CS_Mode_NONE){ + hardware_SPI.mode |= SPI_NO_CS; + } + + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI bit order +parameter: +Info: + Order: + SPI_BIT_ORDER_LSBFIRST + SPI_BIT_ORDER_MSBFIRST + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order) +{ + if(Order == SPI_BIT_ORDER_LSBFIRST){ + hardware_SPI.mode |= SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_LSB_FIRST\r\n"); + }else if(Order == SPI_BIT_ORDER_MSBFIRST){ + hardware_SPI.mode &= ~SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_MSB_FIRST\r\n"); + } + + // DEV_HARDWARE_SPI_Debug("hardware_SPI.mode = 0x%02x\r\n", hardware_SPI.mode); + int fd = ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode); + DEV_HARDWARE_SPI_Debug("fd = %d\r\n",fd); + if (fd == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi SPI_LSB_FIRST\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI Bus Mode +parameter: +Info: + Order: + SPI_3WIRE_Mode + SPI_4WIRE_Mode + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode) +{ + if(mode == SPI_3WIRE_Mode){ + hardware_SPI.mode |= SPI_3WIRE; + }else if(mode == SPI_4WIRE_Mode){ + hardware_SPI.mode &= ~SPI_3WIRE; + } + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: + Time interval after transmission of one byte during continuous transmission +parameter: + us : Interval time (us) +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us) +{ + hardware_SPI.delay = us; + tr.delay_usecs = hardware_SPI.delay; +} + +/****************************************************************************** +function: SPI port sends one byte of data +parameter: + buf : Sent data +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf) +{ + uint8_t rbuf[1]; + tr.len = 1; + tr.tx_buf = (unsigned long)&buf; + tr.rx_buf = (unsigned long)rbuf; + + //ioctl Operation, transmission of data + if ( ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ) + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return rbuf[0]; +} + +/****************************************************************************** +function: The SPI port reads a byte +parameter: +Info: Return read data +******************************************************************************/ +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len) +{ + uint8_t rbuf[len]; + tr.len = len; + tr.tx_buf = (unsigned long)buf; + tr.rx_buf = (unsigned long)rbuf; + + //ioctl Operation, transmission of data + if (ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ){ + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return -1; + } + + return 1; +} + diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.h b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.h new file mode 100644 index 0000000..c80de24 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_SPI.h @@ -0,0 +1,120 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.h +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# 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 __DEV_HARDWARE_SPI_ +#define __DEV_HARDWARE_SPI_ + +#include + +#define DEV_HARDWARE_SPI_DEBUG 0 +#if DEV_HARDWARE_SPI_DEBUG +#define DEV_HARDWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define DEV_HARDWARE_SPI_Debug(__info,...) +#endif + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 +#define SPI_MODE_0 (0|0) +#define SPI_MODE_1 (0|SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL|0) +#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) + +typedef enum{ + SPI_MODE0 = SPI_MODE_0, /*!< CPOL = 0, CPHA = 0 */ + SPI_MODE1 = SPI_MODE_1, /*!< CPOL = 0, CPHA = 1 */ + SPI_MODE2 = SPI_MODE_2, /*!< CPOL = 1, CPHA = 0 */ + SPI_MODE3 = SPI_MODE_3 /*!< CPOL = 1, CPHA = 1 */ +}SPIMode; + +typedef enum{ + DISABLE = 0, + ENABLE = 1 +}SPICSEN; + +typedef enum{ + SPI_CS_Mode_LOW = 0, /*!< Chip Select 0 */ + SPI_CS_Mode_HIGH = 1, /*!< Chip Select 1 */ + SPI_CS_Mode_NONE = 3 /*!< No CS, control it yourself */ +}SPIChipSelect; + +typedef enum +{ + SPI_BIT_ORDER_LSBFIRST = 0, /*!< LSB First */ + SPI_BIT_ORDER_MSBFIRST = 1 /*!< MSB First */ +}SPIBitOrder; + +typedef enum +{ + SPI_3WIRE_Mode = 0, + SPI_4WIRE_Mode = 1 +}BusMode; + + +/** + * Define SPI attribute +**/ +typedef struct SPIStruct { + //GPIO + uint16_t SCLK_PIN; + uint16_t MOSI_PIN; + uint16_t MISO_PIN; + + uint16_t CS0_PIN; + uint16_t CS1_PIN; + + + uint32_t speed; + uint16_t mode; + uint16_t delay; + int fd; // +} HARDWARE_SPI; + + + + +void DEV_HARDWARE_SPI_begin(char *SPI_device); +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed); +void DEV_HARDWARE_SPI_end(void); + +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed); + +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf); +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len); + +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us); +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode); +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order); +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode); +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN); +int DEV_HARDWARE_SPI_Mode(SPIMode mode); + + +#endif \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.c b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.c new file mode 100644 index 0000000..335ab88 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.c @@ -0,0 +1,112 @@ +/***************************************************************************** +* | File : dev_hardware_i2c.c +* | Author : Waveshare team +* | Function : Read and write /dev/i2C, hardware I2C +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# 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 "dev_hardware_i2c.h" + +#include +#include //exit() +#include //define O_RDWR +#include +#include +#include +#include + + +HARDWARE_I2C hardware_i2c; + +/****************************************************************************** +function: I2C device initialization +parameter: + i2c_device : Device name +Info: /dev/i2c-* +******************************************************************************/ +void DEV_HARDWARE_I2C_begin(char *i2c_device) +{ + //device + if((hardware_i2c.fd = open(i2c_device, O_RDWR)) < 0) { //open I2C + perror("Failed to open i2c device.\n"); + printf("Failed to open i2c device\r\n"); + exit(1); + } else { + DEV_HARDWARE_I2C_Debug("open : %s\r\n", i2c_device); + } +} + +/****************************************************************************** +function: I2C device End +parameter: +Info: +******************************************************************************/ +void DEV_HARDWARE_I2C_end(void) +{ + if (close(hardware_i2c.fd) != 0){ + perror("Failed to close i2c device.\n"); + } +} + +/****************************************************************************** +function: Set the device address for I2C access +parameter: + addr : Device address accessed by I2C +Info: +******************************************************************************/ +void DEV_HARDWARE_I2C_setSlaveAddress(uint8_t addr) +{ + if(ioctl(hardware_i2c.fd, I2C_SLAVE, addr) < 0) { + printf("Failed to access bus.\n"); + exit(1); + } +} + +/****************************************************************************** +function: I2C Send data +parameter: + buf : Send data buffer address + len : Send data length +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_I2C_write(const char * buf, uint32_t len) +{ + write(hardware_i2c.fd, buf, len); + return 0; +} + +/****************************************************************************** +function: I2C read data +parameter: + buf : Sead data buffer address + len : Sead data length +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_I2C_read(char* buf, uint32_t len) +{ + read(hardware_i2c.fd, buf, len); + return 0; +} \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.h b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.h new file mode 100644 index 0000000..4c78d06 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Config/dev_hardware_i2c.h @@ -0,0 +1,61 @@ +/***************************************************************************** +* | File : dev_hardware_i2c.h +* | Author : Waveshare team +* | Function : Read and write /dev/i2C, hardware I2C +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# 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 __DEV_HARDWARE_I2C_ +#define __DEV_HARDWARE_I2C_ + +#include + + +#define DEV_HARDWARE_I2C_DEBUG 0 +#if DEV_HARDWARE_I2C_DEBUG +#define DEV_HARDWARE_I2C_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define DEV_HARDWARE_I2C_Debug(__info,...) +#endif + +/** + * Define I2C attribute +**/ +typedef struct I2CStruct { + //GPIO + uint16_t SCL_PIN; + uint16_t SDA_PIN; + + int fd; //I2C device file descriptor + uint16_t addr; //I2C device address +} HARDWARE_I2C; + +void DEV_HARDWARE_I2C_begin(char *i2c_device); +void DEV_HARDWARE_I2C_end(void); +void DEV_HARDWARE_I2C_setSlaveAddress(uint8_t addr); +uint8_t DEV_HARDWARE_I2C_write(const char * buf, uint32_t len); +uint8_t DEV_HARDWARE_I2C_read(char* buf, uint32_t len); +#endif \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.c b/docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.c new file mode 100644 index 0000000..e01bd36 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Driver/GT1151.c @@ -0,0 +1,121 @@ +#include "GT1151.h" + +GT1151_Dev Dev_Now, Dev_Old; +UBYTE GT_Gesture_Mode = 0; + +void GT_Reset(void) +{ + TRST_1; + DEV_Delay_ms(100); + TRST_0; + DEV_Delay_ms(100); + TRST_1; + DEV_Delay_ms(100); +} + +void GT_Write(UWORD Reg, char *Data, UBYTE len) +{ + I2C_Write_Byte(Reg, Data, len); +} + +void GT_Read(UWORD Reg, char *Data, UBYTE len) +{ + I2C_Read_Byte(Reg, Data, len); +} + +void GT_ReadVersion(void) +{ + char buf[4]; + GT_Read(0x8140, buf, 4); + printf("Product ID is %c %c %c %c \r\n", buf[0], buf[1], buf[2] ,buf[3]); +} + +void GT_Init(void) +{ + GT_Reset(); + GT_ReadVersion(); +} + +void GT_Gesture(void) +{ + char buf[3] ={0x08, 0x00, 0xf8}; + GT_Write(0x8040, &buf[0], 1); + GT_Write(0x8041, &buf[1], 1); + GT_Write(0x8042, &buf[2], 1); + GT_Gesture_Mode = 1; + printf("into gesture mode \r\n"); + DEV_Delay_ms(1); +} + +void GT_Gesture_Scan(void) +{ + char buf; + GT_Read(0x814c, &buf, 1); + if(buf == 0xcc) + { + printf("gesture mode exiting \r\n"); + GT_Gesture_Mode = 0; + GT_Reset(); + Dev_Old.X[0] = Dev_Now.X[0]; + Dev_Old.Y[0] = Dev_Now.Y[0]; + Dev_Old.S[0] = Dev_Now.S[0]; + } + else + { + buf = 0x00; + GT_Write(0x814c, &buf, 1); + } + +} + +UBYTE GT_Scan(void) +{ + char buf[100]; + char mask[1] = {0x00}; + + if (Dev_Now.Touch == 1) { + // Dev_Now.Touch = 0; + if(GT_Gesture_Mode == 1) + { + GT_Gesture_Scan(); + return 1; + } + else + { + GT_Read(0x814E, buf, 1); + if ((buf[0]&0x80) == 0x00) { //No new touch + GT_Write(0x814E, mask, 1); + DEV_Delay_ms(1); + // printf("buffers status is 0 \r\n"); + return 1; + } + else { + Dev_Now.TouchpointFlag = buf[0]&0x80; + Dev_Now.TouchCount = buf[0]&0x0f; + if (Dev_Now.TouchCount > 5 || Dev_Now.TouchCount < 1) { + GT_Write(0x814E, mask, 1); + // printf("TouchCount number is wrong \r\n"); + return 1; + } + GT_Read(0x814F, &buf[1], Dev_Now.TouchCount*8); + GT_Write(0x814E, mask, 1); + + Dev_Old.X[0] = Dev_Now.X[0]; + Dev_Old.Y[0] = Dev_Now.Y[0]; + Dev_Old.S[0] = Dev_Now.S[0]; + + for(UBYTE i=0; i 5 || ICNT86_Dev_Now.TouchCount < 1) { + ICNT_Write(0x1001, mask, 1); + ICNT86_Dev_Now.TouchCount = 0; + // printf("TouchCount number is wrong \r\n"); + return 1; + } + ICNT_Read(0x1002, buf, ICNT86_Dev_Now.TouchCount*7); + ICNT_Write(0x1001, mask, 1); + + ICNT86_Dev_Old.X[0] = ICNT86_Dev_Now.X[0]; + ICNT86_Dev_Old.Y[0] = ICNT86_Dev_Now.Y[0]; + ICNT86_Dev_Old.P[0] = ICNT86_Dev_Now.P[0]; + + for(UBYTE i=0; i EPD_2IN13_V2_Reset() +* EPD_SendCommand() => EPD_2IN13_V2_SendCommand() +* EPD_SendData() => EPD_2IN13_V2_SendData() +* EPD_WaitUntilIdle() => EPD_2IN13_V2_ReadBusy() +* EPD_Init() => EPD_2IN13_V2_Init() +* EPD_Clear() => EPD_2IN13_V2_Clear() +* EPD_Display() => EPD_2IN13_V2_Display() +* EPD_Sleep() => EPD_2IN13_V2_Sleep() +* 2.add: +* EPD_2IN13_V2_DisplayPartBaseImage() +* ----------------------------------------------------------------------------- +* V2.0(2018-11-14): +* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8] +* 2.Change:EPD_2IN13_V2_Display(UBYTE *Image) +* Need to pass parameters: pointer to cached data +* 3.Change: +* EPD_RST -> EPD_RST_PIN +* EPD_DC -> EPD_DC_PIN +* EPD_CS -> EPD_CS_PIN +* EPD_BUSY -> EPD_BUSY_PIN +# +# 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_2in13_V2.h" +#include "Debug.h" + +const unsigned char EPD_2IN13_V2_lut_full_update[]= { + 0x80,0x60,0x40,0x00,0x00,0x00,0x00, //LUT0: BB: VS 0 ~7 + 0x10,0x60,0x20,0x00,0x00,0x00,0x00, //LUT1: BW: VS 0 ~7 + 0x80,0x60,0x40,0x00,0x00,0x00,0x00, //LUT2: WB: VS 0 ~7 + 0x10,0x60,0x20,0x00,0x00,0x00,0x00, //LUT3: WW: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT4: VCOM: VS 0 ~7 + + 0x03,0x03,0x00,0x00,0x02, // TP0 A~D RP0 + 0x09,0x09,0x00,0x00,0x02, // TP1 A~D RP1 + 0x03,0x03,0x00,0x00,0x02, // TP2 A~D RP2 + 0x00,0x00,0x00,0x00,0x00, // TP3 A~D RP3 + 0x00,0x00,0x00,0x00,0x00, // TP4 A~D RP4 + 0x00,0x00,0x00,0x00,0x00, // TP5 A~D RP5 + 0x00,0x00,0x00,0x00,0x00, // TP6 A~D RP6 + + 0x15,0x41,0xA8,0x32,0x30,0x0A, +}; + +const unsigned char EPD_2IN13_V2_lut_partial_update[]= { //20 bytes + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT0: BB: VS 0 ~7 + 0x80,0x00,0x00,0x00,0x00,0x00,0x00, //LUT1: BW: VS 0 ~7 + 0x40,0x00,0x00,0x00,0x00,0x00,0x00, //LUT2: WB: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT3: WW: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT4: VCOM: VS 0 ~7 + + 0x0A,0x00,0x00,0x00,0x00, // TP0 A~D RP0 + 0x00,0x00,0x00,0x00,0x00, // TP1 A~D RP1 + 0x00,0x00,0x00,0x00,0x00, // TP2 A~D RP2 + 0x00,0x00,0x00,0x00,0x00, // TP3 A~D RP3 + 0x00,0x00,0x00,0x00,0x00, // TP4 A~D RP4 + 0x00,0x00,0x00,0x00,0x00, // TP5 A~D RP5 + 0x00,0x00,0x00,0x00,0x00, // TP6 A~D RP6 + + 0x15,0x41,0xA8,0x32,0x30,0x0A, +}; +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2IN13_V2_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(200); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2IN13_V2_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_2IN13_V2_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); +} + +static void EPD_2IN13_V2_SendData2(UBYTE *Data, UDOUBLE len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_Write_nByte(Data, len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +void EPD_2IN13_V2_ReadBusy(void) +{ + Debug("e-Paper busy\r\n"); + do { //LOW: idle, HIGH: busy + DEV_Delay_ms(1); + }while(DEV_Digital_Read(EPD_BUSY_PIN) == 1); + Debug("e-Paper busy release\r\n"); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2IN13_V2_TurnOnDisplay(void) +{ + EPD_2IN13_V2_SendCommand(0x22); + EPD_2IN13_V2_SendData(0xC7); + EPD_2IN13_V2_SendCommand(0x20); + EPD_2IN13_V2_ReadBusy(); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2IN13_V2_TurnOnDisplayPart(void) +{ + EPD_2IN13_V2_SendCommand(0x22); + EPD_2IN13_V2_SendData(0x0C); + EPD_2IN13_V2_SendCommand(0x20); + // EPD_2IN13_V2_ReadBusy(); +} + +static void EPD_2IN13_V2_TurnOnDisplayPart_Wait(void) +{ + EPD_2IN13_V2_SendCommand(0x22); + EPD_2IN13_V2_SendData(0x0C); + EPD_2IN13_V2_SendCommand(0x20); + EPD_2IN13_V2_ReadBusy(); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2IN13_V2_Init(UBYTE Mode) +{ + + UBYTE count; + EPD_2IN13_V2_Reset(); + + if(Mode == EPD_2IN13_V2_FULL) { + EPD_2IN13_V2_ReadBusy(); + EPD_2IN13_V2_SendCommand(0x12); // soft reset + EPD_2IN13_V2_ReadBusy(); + + EPD_2IN13_V2_SendCommand(0x74); //set analog block control + EPD_2IN13_V2_SendData(0x54); + EPD_2IN13_V2_SendCommand(0x7E); //set digital block control + EPD_2IN13_V2_SendData(0x3B); + + EPD_2IN13_V2_SendCommand(0x01); //Driver output control + EPD_2IN13_V2_SendData(0xF9); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + + EPD_2IN13_V2_SendCommand(0x11); //data entry mode + EPD_2IN13_V2_SendData(0x01); + + EPD_2IN13_V2_SendCommand(0x44); //set Ram-X address start/end position + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x0F); //0x0C-->(15+1)*8=128 + + EPD_2IN13_V2_SendCommand(0x45); //set Ram-Y address start/end position + EPD_2IN13_V2_SendData(0xF9); //0xF9-->(249+1)=250 + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + + EPD_2IN13_V2_SendCommand(0x3C); //BorderWavefrom + EPD_2IN13_V2_SendData(0x03); + + EPD_2IN13_V2_SendCommand(0x2C); //VCOM Voltage + EPD_2IN13_V2_SendData(0x55); // + + EPD_2IN13_V2_SendCommand(0x03); + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[70]); + + EPD_2IN13_V2_SendCommand(0x04); // + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[71]); + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[72]); + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[73]); + + EPD_2IN13_V2_SendCommand(0x3A); //Dummy Line + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[74]); + EPD_2IN13_V2_SendCommand(0x3B); //Gate time + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[75]); + + EPD_2IN13_V2_SendCommand(0x32); + for(count = 0; count < 70; count++) { + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[count]); + } + + EPD_2IN13_V2_SendCommand(0x4E); // set RAM x address count to 0; + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendCommand(0x4F); // set RAM y address count to 0X127; + EPD_2IN13_V2_SendData(0xF9); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_ReadBusy(); + } else if(Mode == EPD_2IN13_V2_PART) { + EPD_2IN13_V2_SendCommand(0x2C); //VCOM Voltage + EPD_2IN13_V2_SendData(0x26); + + EPD_2IN13_V2_ReadBusy(); + + EPD_2IN13_V2_SendCommand(0x32); + for(count = 0; count < 70; count++) { + EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_partial_update[count]); + } + + EPD_2IN13_V2_SendCommand(0x37); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x40); + EPD_2IN13_V2_SendData(0x00); + EPD_2IN13_V2_SendData(0x00); + + EPD_2IN13_V2_SendCommand(0x22); + EPD_2IN13_V2_SendData(0xC0); + + EPD_2IN13_V2_SendCommand(0x20); + EPD_2IN13_V2_ReadBusy(); + + EPD_2IN13_V2_SendCommand(0x3C); //BorderWavefrom + EPD_2IN13_V2_SendData(0x01); + } else { + Debug("error, the Mode is EPD_2IN13_FULL or EPD_2IN13_PART"); + } +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2IN13_V2_Clear(void) +{ + UWORD Width, Height; + Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); + Height = EPD_2IN13_V2_HEIGHT; + + EPD_2IN13_V2_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN13_V2_SendData(0XFF); + } + } + + EPD_2IN13_V2_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: +******************************************************************************/ +void EPD_2IN13_V2_Display(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); + Height = EPD_2IN13_V2_HEIGHT; + + EPD_2IN13_V2_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2IN13_V2_SendData(Image[i + j * Width]); + } + } + EPD_2IN13_V2_TurnOnDisplay(); +} + +/****************************************************************************** +function : The image of the previous frame must be uploaded, otherwise the + first few seconds will display an exception. +parameter: +******************************************************************************/ +void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); + Height = EPD_2IN13_V2_HEIGHT; + + // UDOUBLE Addr = 0; + EPD_2IN13_V2_SendCommand(0x24); + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // Addr = i + j * Width; + // EPD_2IN13_V2_SendData(Image[Addr]); + // } + // } + EPD_2IN13_V2_SendData2(Image, Height*Width); + EPD_2IN13_V2_SendCommand(0x26); + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // Addr = i + j * Width; + // EPD_2IN13_V2_SendData(Image[Addr]); + // } + // } + EPD_2IN13_V2_SendData2(Image, Height*Width); + EPD_2IN13_V2_TurnOnDisplay(); +} + +void EPD_2IN13_V2_DisplayPart_Wait(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); + Height = EPD_2IN13_V2_HEIGHT; + EPD_2IN13_V2_SendCommand(0x24); + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2IN13_V2_SendData(Image[i + j * Width]); + // } + // } + EPD_2IN13_V2_SendData2(Image, Height*Width); + EPD_2IN13_V2_TurnOnDisplayPart_Wait(); +} + +void EPD_2IN13_V2_DisplayPart(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1); + Height = EPD_2IN13_V2_HEIGHT; + EPD_2IN13_V2_SendCommand(0x24); + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2IN13_V2_SendData(Image[i + j * Width]); + // } + // } + EPD_2IN13_V2_SendData2(Image, Height*Width); + EPD_2IN13_V2_TurnOnDisplayPart(); +} + +/****************************************************************************** +function : Enter sleep mode +parameter: +******************************************************************************/ +void EPD_2IN13_V2_Sleep(void) +{ + EPD_2IN13_V2_SendCommand(0x22); //POWER OFF + EPD_2IN13_V2_SendData(0xC3); + EPD_2IN13_V2_SendCommand(0x20); + + EPD_2IN13_V2_SendCommand(0x10); //enter deep sleep + EPD_2IN13_V2_SendData(0x01); + DEV_Delay_ms(100); +} diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V2.h b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V2.h new file mode 100644 index 0000000..b577122 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V2.h @@ -0,0 +1,74 @@ +/***************************************************************************** +* | File : EPD_2in13_V2.h +* | Author : Waveshare team +* | Function : 2.13inch e-paper V2 +* | Info : +*---------------- +* | This version: V3.0 +* | Date : 2019-06-13 +* | Info : +* ----------------------------------------------------------------------------- +* V3.0(2019-06-13): +* 1.Change name: +* EPD_Reset() => EPD_2IN13_V2_Reset() +* EPD_SendCommand() => EPD_2IN13_V2_SendCommand() +* EPD_SendData() => EPD_2IN13_V2_SendData() +* EPD_WaitUntilIdle() => EPD_2IN13_V2_ReadBusy() +* EPD_Init() => EPD_2IN13_V2_Init() +* EPD_Clear() => EPD_2IN13_V2_Clear() +* EPD_Display() => EPD_2IN13_V2_Display() +* EPD_Sleep() => EPD_2IN13_V2_Sleep() +* 2.add: +* EPD_2IN13_V2_DisplayPartBaseImage() +* ----------------------------------------------------------------------------- +* V2.0(2018-11-14): +* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8] +* 2.Change:EPD_2IN13_V2_Display(UBYTE *Image) +* Need to pass parameters: pointer to cached data +* 3.Change: +* EPD_RST -> EPD_RST_PIN +* EPD_DC -> EPD_DC_PIN +* EPD_CS -> EPD_CS_PIN +* EPD_BUSY -> EPD_BUSY_PIN +# +# 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_2IN13_V2_H_ +#define _EPD_2IN13_V2_H_ + +#include "DEV_Config.h" + +// Display resolution +#define EPD_2IN13_V2_WIDTH 122 +#define EPD_2IN13_V2_HEIGHT 250 + +#define EPD_2IN13_V2_FULL 0 +#define EPD_2IN13_V2_PART 1 + +void EPD_2IN13_V2_Init(UBYTE Mode); +void EPD_2IN13_V2_Clear(void); +void EPD_2IN13_V2_Display(UBYTE *Image); +void EPD_2IN13_V2_DisplayPart(UBYTE *Image); +void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image); +void EPD_2IN13_V2_Sleep(void); + +void EPD_2IN13_V2_DisplayPart_Wait(UBYTE *Image); + +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.c b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.c new file mode 100644 index 0000000..5bbf694 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.c @@ -0,0 +1,473 @@ +/***************************************************************************** +* | File : EPD_2in13_V3.c +* | Author : Waveshare team +* | Function : 2.13inch e-paper V3 +* | Info : +*---------------- +* | This version: V1.1 +* | Date : 2021-10-30 +* | 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_2in13_V3.h" +#include "Debug.h" + +UBYTE WF_PARTIAL_2IN13_V3[159] = +{ + 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x10,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, + 0x22,0x17,0x41,0x00,0x32,0x36, +}; + +UBYTE WS_20_30_2IN13_V3[159] = +{ + 0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x4A, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x4A, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xF, 0x0, 0x0, 0xF, 0x0, 0x0, 0x2, + 0xF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, + 0x22, 0x17, 0x41, 0x0, 0x32, 0x36 +}; + +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2in13_V3_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2in13_V3_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_2in13_V3_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); +} + +static void EPD_2IN13_V3_SendData2(UBYTE *Data, UDOUBLE len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_Write_nByte(Data, len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +void EPD_2in13_V3_ReadBusy(void) +{ + Debug("e-Paper busy\r\n"); + while(1) + { //=1 BUSY + if(DEV_Digital_Read(EPD_BUSY_PIN)==0) + break; + DEV_Delay_ms(10); + } + DEV_Delay_ms(10); + Debug("e-Paper busy release\r\n"); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2in13_V3_TurnOnDisplay(void) +{ + EPD_2in13_V3_SendCommand(0x22); // Display Update Control + EPD_2in13_V3_SendData(0xc7); + EPD_2in13_V3_SendCommand(0x20); // Activate Display Update Sequence + EPD_2in13_V3_ReadBusy(); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2in13_V3_TurnOnDisplay_Partial(void) +{ + EPD_2in13_V3_SendCommand(0x22); // Display Update Control + EPD_2in13_V3_SendData(0x0C); // fast:0x0c, quality:0x0f, 0xcf + EPD_2in13_V3_SendCommand(0x20); // Activate Display Update Sequence + // EPD_2in13_V3_ReadBusy(); +} + +static void EPD_2in13_V3_TurnOnDisplay_Partial_Wait(void) +{ + EPD_2in13_V3_SendCommand(0x22); // Display Update Control + EPD_2in13_V3_SendData(0x0C); // fast:0x0c, quality:0x0f, 0xcf + EPD_2in13_V3_SendCommand(0x20); // Activate Display Update Sequence + EPD_2in13_V3_ReadBusy(); +} + +/****************************************************************************** +function : Set lut +parameter: + lut : lut data +******************************************************************************/ +static void EPD_2IN13_V3_LUT(UBYTE *lut) +{ + UBYTE count; + EPD_2in13_V3_SendCommand(0x32); + for(count=0; count<153; count++) + EPD_2in13_V3_SendData(lut[count]); + EPD_2in13_V3_ReadBusy(); +} + +/****************************************************************************** +function : Send lut data and configuration +parameter: + lut : lut data +******************************************************************************/ +static void EPD_2IN13_V2_LUT_by_host(UBYTE *lut) +{ + EPD_2IN13_V3_LUT((UBYTE *)lut); //lut + EPD_2in13_V3_SendCommand(0x3f); + EPD_2in13_V3_SendData(*(lut+153)); + EPD_2in13_V3_SendCommand(0x03); // gate voltage + EPD_2in13_V3_SendData(*(lut+154)); + EPD_2in13_V3_SendCommand(0x04); // source voltage + EPD_2in13_V3_SendData(*(lut+155)); // VSH + EPD_2in13_V3_SendData(*(lut+156)); // VSH2 + EPD_2in13_V3_SendData(*(lut+157)); // VSL + EPD_2in13_V3_SendCommand(0x2c); // VCOM + EPD_2in13_V3_SendData(*(lut+158)); +} + +/****************************************************************************** +function : Setting the display window +parameter: + Xstart : X-axis starting position + Ystart : Y-axis starting position + Xend : End position of X-axis + Yend : End position of Y-axis +******************************************************************************/ +static void EPD_2in13_V3_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + EPD_2in13_V3_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION + EPD_2in13_V3_SendData((Xstart>>3) & 0xFF); + EPD_2in13_V3_SendData((Xend>>3) & 0xFF); + + EPD_2in13_V3_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION + EPD_2in13_V3_SendData(Ystart & 0xFF); + EPD_2in13_V3_SendData((Ystart >> 8) & 0xFF); + EPD_2in13_V3_SendData(Yend & 0xFF); + EPD_2in13_V3_SendData((Yend >> 8) & 0xFF); +} + +/****************************************************************************** +function : Set Cursor +parameter: + Xstart : X-axis starting position + Ystart : Y-axis starting position +******************************************************************************/ +static void EPD_2in13_V3_SetCursor(UWORD Xstart, UWORD Ystart) +{ + EPD_2in13_V3_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER + EPD_2in13_V3_SendData(Xstart & 0xFF); + + EPD_2in13_V3_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER + EPD_2in13_V3_SendData(Ystart & 0xFF); + EPD_2in13_V3_SendData((Ystart >> 8) & 0xFF); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2in13_V3_Init(UBYTE Mode) +{ + if(Mode == EPD_2IN13_V3_FULL) + { + EPD_2in13_V3_Reset(); + DEV_Delay_ms(100); + + EPD_2in13_V3_ReadBusy(); + EPD_2in13_V3_SendCommand(0x12); //SWRESET + EPD_2in13_V3_ReadBusy(); + + EPD_2in13_V3_SendCommand(0x01); //Driver output control + EPD_2in13_V3_SendData(0xf9); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + + EPD_2in13_V3_SendCommand(0x11); //data entry mode + EPD_2in13_V3_SendData(0x03); + + EPD_2in13_V3_SetWindows(0, 0, EPD_2in13_V3_WIDTH-1, EPD_2in13_V3_HEIGHT-1); + EPD_2in13_V3_SetCursor(0, 0); + + EPD_2in13_V3_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V3_SendData(0x05); + + EPD_2in13_V3_SendCommand(0x21); // Display update control + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x80); + + EPD_2in13_V3_SendCommand(0x18); //Read built-in temperature sensor + EPD_2in13_V3_SendData(0x80); + + EPD_2in13_V3_ReadBusy(); + EPD_2IN13_V2_LUT_by_host(WS_20_30_2IN13_V3); + } + else if(Mode == EPD_2IN13_V3_PART) + { + //Reset + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(1); + DEV_Digital_Write(EPD_RST_PIN, 1); + + EPD_2IN13_V2_LUT_by_host(WF_PARTIAL_2IN13_V3); + + EPD_2in13_V3_SendCommand(0x37); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x40); ///RAM Ping-Pong enable + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + EPD_2in13_V3_SendData(0x00); + + EPD_2in13_V3_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V3_SendData(0xC0); + + EPD_2in13_V3_SendCommand(0x22); //Display Update Sequence Option + EPD_2in13_V3_SendData(0xC0); // Enable clock and Enable analog + EPD_2in13_V3_SendCommand(0x20); //Activate Display Update Sequence + EPD_2in13_V3_ReadBusy(); + + EPD_2in13_V3_SetWindows(0, 0, EPD_2in13_V3_WIDTH-1, EPD_2in13_V3_HEIGHT-1); + EPD_2in13_V3_SetCursor(0, 0); + } +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2in13_V3_Clear(void) +{ + UWORD Width, Height; + Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1); + Height = EPD_2in13_V3_HEIGHT; + + EPD_2in13_V3_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V3_SendData(0XFF); + } + } + + EPD_2in13_V3_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V3_Display(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1); + Height = EPD_2in13_V3_HEIGHT; + + EPD_2in13_V3_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V3_SendData(Image[i + j * Width]); + } + } + + EPD_2in13_V3_TurnOnDisplay(); +} + + +/****************************************************************************** +function : Refresh a base image +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V3_Display_Base(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1); + Height = EPD_2in13_V3_HEIGHT; + + EPD_2in13_V3_SendCommand(0x24); //Write Black and White image to RAM + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2in13_V3_SendData(Image[i + j * Width]); + // } + // } + + EPD_2IN13_V3_SendData2(Image, Height*Width); + EPD_2in13_V3_SendCommand(0x26); //Write Black and White image to RAM + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2in13_V3_SendData(Image[i + j * Width]); + // } + // } + + EPD_2IN13_V3_SendData2(Image, Height*Width); + EPD_2in13_V3_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and partial refresh +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V3_Display_Partial(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1); + Height = EPD_2in13_V3_HEIGHT; + + + + EPD_2in13_V3_SendCommand(0x24); //Write Black and White image to RAM + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2in13_V3_SendData(Image[i + j * Width]); + // } + // } + + EPD_2IN13_V3_SendData2(Image, Height*Width); + EPD_2in13_V3_TurnOnDisplay_Partial(); +} + +void EPD_2in13_V3_Display_Partial_Wait(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1); + Height = EPD_2in13_V3_HEIGHT; + + // //Reset + // DEV_Digital_Write(EPD_RST_PIN, 0); + // DEV_Delay_ms(1); + // DEV_Digital_Write(EPD_RST_PIN, 1); + + // EPD_2IN13_V2_LUT_by_host(WF_PARTIAL_2IN13_V3); + + // EPD_2in13_V3_SendCommand(0x37); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x40); ///RAM Ping-Pong enable + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + // EPD_2in13_V3_SendData(0x00); + + // EPD_2in13_V3_SendCommand(0x3C); //BorderWavefrom + // EPD_2in13_V3_SendData(0x80); + + // EPD_2in13_V3_SendCommand(0x22); //Display Update Sequence Option + // EPD_2in13_V3_SendData(0xC0); // Enable clock and Enable analog + // EPD_2in13_V3_SendCommand(0x20); //Activate Display Update Sequence + // EPD_2in13_V3_ReadBusy(); + + // EPD_2in13_V3_SetWindows(0, 0, EPD_2in13_V3_WIDTH-1, EPD_2in13_V3_HEIGHT-1); + // EPD_2in13_V3_SetCursor(0, 0); + + EPD_2in13_V3_SendCommand(0x24); //Write Black and White image to RAM + // for (UWORD j = 0; j < Height; j++) { + // for (UWORD i = 0; i < Width; i++) { + // EPD_2in13_V3_SendData(Image[i + j * Width]); + // } + // } + + EPD_2IN13_V3_SendData2(Image, Height*Width); + EPD_2in13_V3_TurnOnDisplay_Partial_Wait(); +} + +/****************************************************************************** +function : Enter sleep mode +parameter: +******************************************************************************/ +void EPD_2in13_V3_Sleep(void) +{ + EPD_2in13_V3_SendCommand(0x10); //enter deep sleep + EPD_2in13_V3_SendData(0x01); + DEV_Delay_ms(100); +} diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.h b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.h new file mode 100644 index 0000000..2013414 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V3.h @@ -0,0 +1,51 @@ +/***************************************************************************** +* | File : EPD_2Iin13_V3.h +* | Author : Waveshare team +* | Function : 2.13inch e-paper V3 +* | Info : +*---------------- +* | This version: V1.1 +* | Date : 2021-10-30 +* | 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_2in13_V3_H_ +#define __EPD_2in13_V3_H_ + +#include "DEV_Config.h" + +// Display resolution +#define EPD_2in13_V3_WIDTH 122 +#define EPD_2in13_V3_HEIGHT 250 + +#define EPD_2IN13_V3_FULL 0 +#define EPD_2IN13_V3_PART 1 + +void EPD_2in13_V3_Init(UBYTE Mode); +void EPD_2in13_V3_Clear(void); +void EPD_2in13_V3_Display(UBYTE *Image); +void EPD_2in13_V3_Display_Base(UBYTE *Image); +void EPD_2in13_V3_Display_Partial(UBYTE *Image); +void EPD_2in13_V3_Display_Partial_Wait(UBYTE *Image); +void EPD_2in13_V3_Sleep(void); + +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.c b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.c new file mode 100644 index 0000000..a0b2b84 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.c @@ -0,0 +1,433 @@ +/***************************************************************************** +* | File : EPD_2in13_V4.c +* | Author : Waveshare team +* | Function : 2.13inch e-paper V4 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2023-08-12 +* | 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_2in13_V4.h" +#include "Debug.h" + +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2in13_V4_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2in13_V4_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_2in13_V4_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); +} + +static void EPD_2IN13_V4_SendData2(UBYTE *Data, UDOUBLE len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_Write_nByte(Data, len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +void EPD_2in13_V4_ReadBusy(void) +{ + Debug("e-Paper busy\r\n"); + while(1) + { //=1 BUSY + if(DEV_Digital_Read(EPD_BUSY_PIN)==0) + break; + DEV_Delay_ms(10); + } + DEV_Delay_ms(10); + Debug("e-Paper busy release\r\n"); +} + +/****************************************************************************** +function : Setting the display window +parameter: + Xstart : X-axis starting position + Ystart : Y-axis starting position + Xend : End position of X-axis + Yend : End position of Y-axis +******************************************************************************/ +static void EPD_2in13_V4_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + EPD_2in13_V4_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION + EPD_2in13_V4_SendData((Xstart>>3) & 0xFF); + EPD_2in13_V4_SendData((Xend>>3) & 0xFF); + + EPD_2in13_V4_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION + EPD_2in13_V4_SendData(Ystart & 0xFF); + EPD_2in13_V4_SendData((Ystart >> 8) & 0xFF); + EPD_2in13_V4_SendData(Yend & 0xFF); + EPD_2in13_V4_SendData((Yend >> 8) & 0xFF); +} + +/****************************************************************************** +function : Set Cursor +parameter: + Xstart : X-axis starting position + Ystart : Y-axis starting position +******************************************************************************/ +static void EPD_2in13_V4_SetCursor(UWORD Xstart, UWORD Ystart) +{ + EPD_2in13_V4_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER + EPD_2in13_V4_SendData(Xstart & 0xFF); + + EPD_2in13_V4_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER + EPD_2in13_V4_SendData(Ystart & 0xFF); + EPD_2in13_V4_SendData((Ystart >> 8) & 0xFF); +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2in13_V4_TurnOnDisplay(void) +{ + EPD_2in13_V4_SendCommand(0x22); // Display Update Control + EPD_2in13_V4_SendData(0xf7); + EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence + EPD_2in13_V4_ReadBusy(); +} + +static void EPD_2in13_V4_TurnOnDisplay_Fast(void) +{ + EPD_2in13_V4_SendCommand(0x22); // Display Update Control + EPD_2in13_V4_SendData(0xc7); // fast:0x0c, quality:0x0f, 0xcf + EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence + EPD_2in13_V4_ReadBusy(); +} + +static void EPD_2in13_V4_TurnOnDisplay_Partial(void) +{ + EPD_2in13_V4_SendCommand(0x22); // Display Update Control + EPD_2in13_V4_SendData(0xff); // fast:0x0c, quality:0x0f, 0xcf + EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence + // EPD_2in13_V4_ReadBusy(); +} + +static void EPD_2in13_V4_TurnOnDisplay_Partial_Wait(void) +{ + EPD_2in13_V4_SendCommand(0x22); // Display Update Control + EPD_2in13_V4_SendData(0xff); // fast:0x0c, quality:0x0f, 0xcf + EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence + EPD_2in13_V4_ReadBusy(); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2in13_V4_Init(UBYTE Mode) +{ + + + if(Mode == EPD_2IN13_V4_FULL) + { + EPD_2in13_V4_Reset(); + EPD_2in13_V4_ReadBusy(); + EPD_2in13_V4_SendCommand(0x12); //SWRESET + EPD_2in13_V4_ReadBusy(); + + EPD_2in13_V4_SendCommand(0x01); //Driver output control + EPD_2in13_V4_SendData(0xF9); + EPD_2in13_V4_SendData(0x00); + EPD_2in13_V4_SendData(0x00); + + EPD_2in13_V4_SendCommand(0x11); //data entry mode + EPD_2in13_V4_SendData(0x03); + + EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1); + EPD_2in13_V4_SetCursor(0, 0); + + EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V4_SendData(0x05); + + EPD_2in13_V4_SendCommand(0x21); // Display update control + EPD_2in13_V4_SendData(0x00); + EPD_2in13_V4_SendData(0x80); + + EPD_2in13_V4_SendCommand(0x18); //Read built-in temperature sensor + EPD_2in13_V4_SendData(0x80); + EPD_2in13_V4_ReadBusy(); + } + else if(Mode == EPD_2IN13_V4_PART) + { + //Reset + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(1); + DEV_Digital_Write(EPD_RST_PIN, 1); + + EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V4_SendData(0x80); + + EPD_2in13_V4_SendCommand(0x01); //Driver output control + EPD_2in13_V4_SendData(0xF9); + EPD_2in13_V4_SendData(0x00); + EPD_2in13_V4_SendData(0x00); + + EPD_2in13_V4_SendCommand(0x11); //data entry mode + EPD_2in13_V4_SendData(0x03); + + EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1); + EPD_2in13_V4_SetCursor(0, 0); + } + else if(Mode == EPD_2IN13_V4_Fast) + { + EPD_2in13_V4_Reset(); + EPD_2in13_V4_ReadBusy(); + EPD_2in13_V4_SendCommand(0x12); //SWRESET + EPD_2in13_V4_ReadBusy(); + + EPD_2in13_V4_SendCommand(0x18); //Read built-in temperature sensor + EPD_2in13_V4_SendData(0x80); + + EPD_2in13_V4_SendCommand(0x11); //data entry mode + EPD_2in13_V4_SendData(0x03); + + EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1); + EPD_2in13_V4_SetCursor(0, 0); + + EPD_2in13_V4_SendCommand(0x22); // Load temperature value + EPD_2in13_V4_SendData(0xB1); + EPD_2in13_V4_SendCommand(0x20); + EPD_2in13_V4_ReadBusy(); + + EPD_2in13_V4_SendCommand(0x1A); // Write to temperature register + EPD_2in13_V4_SendData(0x64); + EPD_2in13_V4_SendData(0x00); + + EPD_2in13_V4_SendCommand(0x22); // Load temperature value + EPD_2in13_V4_SendData(0x91); + EPD_2in13_V4_SendCommand(0x20); + EPD_2in13_V4_ReadBusy(); + } +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2in13_V4_Clear(void) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V4_SendData(0XFF); + } + } + + EPD_2in13_V4_TurnOnDisplay(); +} + +void EPD_2in13_V4_Clear_Black(void) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V4_SendData(0X00); + } + } + + EPD_2in13_V4_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V4_Display(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V4_SendData(Image[i + j * Width]); + } + } + + EPD_2in13_V4_TurnOnDisplay(); +} + +void EPD_2in13_V4_Display_Fast(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_SendCommand(0x24); + for (UWORD j = 0; j < Height; j++) { + for (UWORD i = 0; i < Width; i++) { + EPD_2in13_V4_SendData(Image[i + j * Width]); + } + } + + EPD_2in13_V4_TurnOnDisplay_Fast(); +} + + +/****************************************************************************** +function : Refresh a base image +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V4_Display_Base(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_SendCommand(0x24); //Write Black and White image to RAM + EPD_2IN13_V4_SendData2(Image, Width*Height); + + EPD_2in13_V4_SendCommand(0x26); //Write Black and White image to RAM + EPD_2IN13_V4_SendData2(Image, Width*Height); + EPD_2in13_V4_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and partial refresh +parameter: + Image : Image data +******************************************************************************/ +void EPD_2in13_V4_Display_Partial(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + printf("1111/r/n"); + + //Reset + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(1); + DEV_Digital_Write(EPD_RST_PIN, 1); + + EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V4_SendData(0x80); + + EPD_2in13_V4_SendCommand(0x01); //Driver output control + EPD_2in13_V4_SendData(0xF9); + EPD_2in13_V4_SendData(0x00); + EPD_2in13_V4_SendData(0x00); + + EPD_2in13_V4_SendCommand(0x11); //data entry mode + EPD_2in13_V4_SendData(0x03); + + EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1); + EPD_2in13_V4_SetCursor(0, 0); + + EPD_2in13_V4_SendCommand(0x24); //Write Black and White image to RAM + EPD_2IN13_V4_SendData2(Image, Width*Height); + EPD_2in13_V4_TurnOnDisplay_Partial(); +} + +void EPD_2in13_V4_Display_Partial_Wait(UBYTE *Image) +{ + UWORD Width, Height; + Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1); + Height = EPD_2in13_V4_HEIGHT; + + EPD_2in13_V4_ReadBusy(); + + //Reset + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(1); + DEV_Digital_Write(EPD_RST_PIN, 1); + + EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom + EPD_2in13_V4_SendData(0x80); + + EPD_2in13_V4_SendCommand(0x01); //Driver output control + EPD_2in13_V4_SendData(0xF9); + EPD_2in13_V4_SendData(0x00); + EPD_2in13_V4_SendData(0x00); + + EPD_2in13_V4_SendCommand(0x11); //data entry mode + EPD_2in13_V4_SendData(0x03); + + EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1); + EPD_2in13_V4_SetCursor(0, 0); + + EPD_2in13_V4_SendCommand(0x24); //Write Black and White image to RAM + EPD_2IN13_V4_SendData2(Image, Width*Height); + EPD_2in13_V4_TurnOnDisplay_Partial_Wait(); +} + +/****************************************************************************** +function : Enter sleep mode +parameter: +******************************************************************************/ +void EPD_2in13_V4_Sleep(void) +{ + EPD_2in13_V4_SendCommand(0x10); //enter deep sleep + EPD_2in13_V4_SendData(0x01); + DEV_Delay_ms(100); +} diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.h b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.h new file mode 100644 index 0000000..22abdd4 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in13_V4.h @@ -0,0 +1,56 @@ +/***************************************************************************** +* | File : EPD_2Iin13_V4.h +* | Author : Waveshare team +* | Function : 2.13inch e-paper V4 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2023-08-12 +* | 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_2in13_V4_H_ +#define __EPD_2in13_V4_H_ + +#include "DEV_Config.h" + + +// Display resolution +#define EPD_2in13_V4_WIDTH 122 +#define EPD_2in13_V4_HEIGHT 250 + +#define EPD_2IN13_V4_FULL 0 +#define EPD_2IN13_V4_PART 1 +#define EPD_2IN13_V4_Fast 2 + +void EPD_2in13_V4_Init(UBYTE Mode); +void EPD_2in13_V4_Clear(void); +void EPD_2in13_V4_Clear_Black(void); +void EPD_2in13_V4_Display(UBYTE *Image); +void EPD_2in13_V4_Display_Fast(UBYTE *Image); +void EPD_2in13_V4_Display_Base(UBYTE *Image); +void EPD_2in13_V4_Display_Partial(UBYTE *Image); +void EPD_2in13_V4_Display_Partial_Wait(UBYTE *Image); +void EPD_2in13_V4_Sleep(void); + + +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.c b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.c new file mode 100644 index 0000000..a3c660c --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.c @@ -0,0 +1,615 @@ +/***************************************************************************** +* | File : EPD_2in9_V2.c +* | Author : Waveshare team +* | Function : 2.9inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-10-20 +* | 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_2in9_V2.h" +#include "Debug.h" + +UBYTE _WF_PARTIAL_2IN9[159] = +{ +0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0A,0x0,0x0,0x0,0x0,0x0,0x0, +0x1,0x0,0x0,0x0,0x0,0x0,0x0, +0x1,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, +0x22,0x17,0x41,0xB0,0x32,0x36, +}; + +UBYTE _WF_PARTIAL_2IN9_Wait[159] = +{ +0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0A,0x0,0x0,0x0,0x0,0x0,0x2, +0x1,0x0,0x0,0x0,0x0,0x0,0x0, +0x1,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, +0x22,0x17,0x41,0xB0,0x32,0x36, +}; + +unsigned char Gray4[159] = +{ + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L0 //2.28s + 0x20, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L1 + 0x28, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L2 + 0x2A, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L3 + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L4 + 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group0 + 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, //TP, SR, RP of Group1 + 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group3 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group4 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group5 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group6 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group7 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group9 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group10 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group11 + 0x24, 0x22, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, //FR, XON + 0x22, 0x17, 0x41, 0xAE, 0x32, 0x28, //EOPT VGH VSH1 VSH2 VSL VCOM +}; + +unsigned char WF_FULL[159] = +{ +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L0 1.00S +0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L1 +0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L2 +0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L3 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L4 +0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group1 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group2 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group3 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group4 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group5 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group6 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group7 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group8 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group9 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group10 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group11 +0x24, 0x42, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, //FR, XON +0x22, 0x17, 0x41, 0xAE, 0x32, 0x38, //EOPT VGH VSH1 VSH2 VSL VCOM +}; + +/****************************************************************************** +function : Software reset +parameter: +******************************************************************************/ +static void EPD_2IN9_V2_Reset(void) +{ + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(2); + DEV_Digital_Write(EPD_RST_PIN, 1); + DEV_Delay_ms(20); +} + +/****************************************************************************** +function : send command +parameter: + Reg : Command register +******************************************************************************/ +static void EPD_2IN9_V2_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_2IN9_V2_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); +} + +static void EPD_2IN9_V2_SendData2(UBYTE *Data, UDOUBLE len) +{ + DEV_Digital_Write(EPD_DC_PIN, 1); + DEV_Digital_Write(EPD_CS_PIN, 0); + DEV_SPI_Write_nByte(Data, len); + DEV_Digital_Write(EPD_CS_PIN, 1); +} + +/****************************************************************************** +function : Wait until the busy_pin goes LOW +parameter: +******************************************************************************/ +void EPD_2IN9_V2_ReadBusy(void) +{ + // Debug("e-Paper busy\r\n"); + while(1) + { //=1 BUSY + if(DEV_Digital_Read(EPD_BUSY_PIN)==0) + break; + DEV_Delay_ms(0.01); + } + // DEV_Delay_ms(10); + // Debug("e-Paper busy release\r\n"); +} + +static void EPD_2IN9_V2_LUT(UBYTE LUT) +{ + EPD_2IN9_V2_SendCommand(0x32); + if(LUT) + EPD_2IN9_V2_SendData2(_WF_PARTIAL_2IN9, 159); + else + EPD_2IN9_V2_SendData2(_WF_PARTIAL_2IN9_Wait, 159); + EPD_2IN9_V2_ReadBusy(); +} + +static void EPD_2IN9_V2_LUT_by_host(UBYTE *lut) +{ + UBYTE count; + EPD_2IN9_V2_SendCommand(0x32); + for(count=0; count<153; count++) + EPD_2IN9_V2_SendData(*lut++); + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SendCommand(0x3f); + EPD_2IN9_V2_SendData(*lut++); + EPD_2IN9_V2_SendCommand(0x03); // gate voltage + EPD_2IN9_V2_SendData(*lut++); + EPD_2IN9_V2_SendCommand(0x04); // source voltage + EPD_2IN9_V2_SendData(*lut++); // VSH + EPD_2IN9_V2_SendData(*lut++); // VSH2 + EPD_2IN9_V2_SendData(*lut++); // VSL + EPD_2IN9_V2_SendCommand(0x2c); // VCOM + EPD_2IN9_V2_SendData(*lut++); + +} + +/****************************************************************************** +function : Turn On Display +parameter: +******************************************************************************/ +static void EPD_2IN9_V2_TurnOnDisplay(void) +{ + EPD_2IN9_V2_SendCommand(0x22); //Display Update Control + EPD_2IN9_V2_SendData(0xF7); + EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence + EPD_2IN9_V2_ReadBusy(); +} + +static void EPD_2IN9_V2_TurnOnDisplay_Partial(void) +{ + EPD_2IN9_V2_SendCommand(0x22); //Display Update Control + EPD_2IN9_V2_SendData(0x0F); + EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence + // EPD_2IN9_V2_ReadBusy(); +} + +static void EPD_2IN9_V2_TurnOnDisplay_Partial_Wait(void) +{ + EPD_2IN9_V2_SendCommand(0x22); //Display Update Control + EPD_2IN9_V2_SendData(0x0F); + EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence + EPD_2IN9_V2_ReadBusy(); +} + +static void EPD_2IN9_V2_TurnOnDisplay_Gray4(void) +{ + EPD_2IN9_V2_SendCommand(0x22); //Display Update Control + EPD_2IN9_V2_SendData(0xC7); + EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence + EPD_2IN9_V2_ReadBusy(); +} + +/****************************************************************************** +function : Setting the display window +parameter: +******************************************************************************/ +static void EPD_2IN9_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + EPD_2IN9_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION + EPD_2IN9_V2_SendData((Xstart>>3) & 0xFF); + EPD_2IN9_V2_SendData((Xend>>3) & 0xFF); + + EPD_2IN9_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION + EPD_2IN9_V2_SendData(Ystart & 0xFF); + EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF); + EPD_2IN9_V2_SendData(Yend & 0xFF); + EPD_2IN9_V2_SendData((Yend >> 8) & 0xFF); +} + +/****************************************************************************** +function : Set Cursor +parameter: +******************************************************************************/ +static void EPD_2IN9_V2_SetCursor(UWORD Xstart, UWORD Ystart) +{ + EPD_2IN9_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER + EPD_2IN9_V2_SendData(Xstart & 0xFF); + + EPD_2IN9_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER + EPD_2IN9_V2_SendData(Ystart & 0xFF); + EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF); +} + +/****************************************************************************** +function : Initialize the e-Paper register +parameter: +******************************************************************************/ +void EPD_2IN9_V2_Init(void) +{ + EPD_2IN9_V2_Reset(); + DEV_Delay_ms(100); + + EPD_2IN9_V2_ReadBusy(); + EPD_2IN9_V2_SendCommand(0x12); // soft reset + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SendCommand(0x01); //Driver output control + EPD_2IN9_V2_SendData(0x27); + EPD_2IN9_V2_SendData(0x01); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x11); //data entry mode + EPD_2IN9_V2_SendData(0x03); + + EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1); + + EPD_2IN9_V2_SendCommand(0x21); // Display update control + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x80); + + EPD_2IN9_V2_SetCursor(0, 0); + EPD_2IN9_V2_ReadBusy(); +} + +void EPD_2IN9_V2_Init_Fast(void) +{ + EPD_2IN9_V2_Reset(); + DEV_Delay_ms(100); + + EPD_2IN9_V2_ReadBusy(); + EPD_2IN9_V2_SendCommand(0x12); // soft reset + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SendCommand(0x01); //Driver output control + EPD_2IN9_V2_SendData(0x27); + EPD_2IN9_V2_SendData(0x01); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x11); //data entry mode + EPD_2IN9_V2_SendData(0x03); + + EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1); + + EPD_2IN9_V2_SendCommand(0x3C); + EPD_2IN9_V2_SendData(0x05); + + EPD_2IN9_V2_SendCommand(0x21); // Display update control + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x80); + + EPD_2IN9_V2_SetCursor(0, 0); + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_LUT_by_host(WF_FULL); +} + +void EPD_2IN9_V2_Gray4_Init(void) +{ + EPD_2IN9_V2_Reset(); + DEV_Delay_ms(100); + + EPD_2IN9_V2_ReadBusy(); + EPD_2IN9_V2_SendCommand(0x12); // soft reset + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SendCommand(0x74); //set analog block control + EPD_2IN9_V2_SendData(0x54); + EPD_2IN9_V2_SendCommand(0x7E); //set digital block control + EPD_2IN9_V2_SendData(0x3B); + + EPD_2IN9_V2_SendCommand(0x01); //Driver output control + EPD_2IN9_V2_SendData(0x27); + EPD_2IN9_V2_SendData(0x01); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x11); //data entry mode + EPD_2IN9_V2_SendData(0x03); + + EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1); + + EPD_2IN9_V2_SendCommand(0x3C); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x21); // Display update control + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x80); + + EPD_2IN9_V2_SetCursor(0, 0); + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_LUT_by_host(Gray4); +} + +/****************************************************************************** +function : Clear screen +parameter: +******************************************************************************/ +void EPD_2IN9_V2_Clear(void) +{ + UWORD i; + EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1) + for(i=0;i<4736;i++) + { + EPD_2IN9_V2_SendData(0xff); + } + EPD_2IN9_V2_TurnOnDisplay(); +} + +/****************************************************************************** +function : Sends the image buffer in RAM to e-Paper and displays +parameter: +******************************************************************************/ +void EPD_2IN9_V2_Display(UBYTE *Image) +{ + UWORD i; + EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1) + for(i=0;i<4736;i++) + { + EPD_2IN9_V2_SendData(Image[i]); + } + // EPD_2IN9_V2_SendData2(Image, 4736); + EPD_2IN9_V2_TurnOnDisplay(); +} + +void EPD_2IN9_V2_Display_Base(UBYTE *Image) +{ + UWORD i; + + EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM + for(i=0;i<4736;i++) + { + EPD_2IN9_V2_SendData(Image[i]); + } + // EPD_2IN9_V2_SendData2(Image, 4736); + EPD_2IN9_V2_SendCommand(0x26); //Write Black and White image to RAM + for(i=0;i<4736;i++) + { + EPD_2IN9_V2_SendData(Image[i]); + } + // EPD_2IN9_V2_SendData2(Image, 4736); + EPD_2IN9_V2_TurnOnDisplay(); +} + +void EPD_2IN9_V2_Display_Partial_Wait(UBYTE *Image) +{ + // UWORD i; + +//Reset + DEV_Digital_Write(EPD_RST_PIN, 0); + DEV_Delay_ms(0.2); + DEV_Digital_Write(EPD_RST_PIN, 1); + // DEV_Delay_ms(1); + + EPD_2IN9_V2_LUT(0); + EPD_2IN9_V2_SendCommand(0x37); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x40); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x3C); //BorderWavefrom + EPD_2IN9_V2_SendData(0x80); + + EPD_2IN9_V2_SendCommand(0x22); + EPD_2IN9_V2_SendData(0xC0); + EPD_2IN9_V2_SendCommand(0x20); + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1); + EPD_2IN9_V2_SetCursor(0, 0); + + EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM + // for(i=0;i<4736;i++) + // { + // EPD_2IN9_V2_SendData(Image[i]); + // } + EPD_2IN9_V2_SendData2(Image, 2500); + EPD_2IN9_V2_SendData2(Image+2500, 2236); + EPD_2IN9_V2_TurnOnDisplay_Partial_Wait(); +} + +void EPD_2IN9_V2_Display_Partial(UBYTE *Image) +{ + // UWORD i; + +//Reset + // DEV_Digital_Write(EPD_RST_PIN, 0); + // DEV_Delay_ms(5); + // DEV_Digital_Write(EPD_RST_PIN, 1); + // DEV_Delay_ms(10); + + EPD_2IN9_V2_LUT(1); + EPD_2IN9_V2_SendCommand(0x37); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x40); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + EPD_2IN9_V2_SendData(0x00); + + EPD_2IN9_V2_SendCommand(0x3C); //BorderWavefrom + EPD_2IN9_V2_SendData(0x80); + + EPD_2IN9_V2_SendCommand(0x22); + EPD_2IN9_V2_SendData(0xC0); + EPD_2IN9_V2_SendCommand(0x20); + EPD_2IN9_V2_ReadBusy(); + + EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1); + EPD_2IN9_V2_SetCursor(0, 0); + + EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM + EPD_2IN9_V2_SendData2(Image, 2500); + EPD_2IN9_V2_SendData2(Image+2500, 2236); + EPD_2IN9_V2_TurnOnDisplay_Partial(); +} + +void EPD_2IN9_V2_4GrayDisplay(UBYTE *Image) +{ + UDOUBLE i,j,k; + UBYTE temp1,temp2,temp3; + + // old data + EPD_2IN9_V2_SendCommand(0x24); + for(i=0; i<4736; 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_2IN9_V2_SendData(temp3); + // printf("%x ",temp3); + } + + EPD_2IN9_V2_SendCommand(0x26); //write RAM for black(0)/white (1) + for(i=0; i<4736; 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_2IN9_V2_SendData(temp3); + // printf("%x ",temp3); + } + + EPD_2IN9_V2_TurnOnDisplay_Gray4(); +} + +/****************************************************************************** +function : Enter sleep mode +parameter: +******************************************************************************/ +void EPD_2IN9_V2_Sleep(void) +{ + EPD_2IN9_V2_SendCommand(0x10); //enter deep sleep + EPD_2IN9_V2_SendData(0x01); + DEV_Delay_ms(100); +} diff --git a/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.h b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.h new file mode 100644 index 0000000..da7b9ce --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/EPD/EPD_2in9_V2.h @@ -0,0 +1,53 @@ +/***************************************************************************** +* | File : EPD_2in9_V2.h +* | Author : Waveshare team +* | Function : 2.9inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-10-20 +* | 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_2IN9_V2_H_ +#define __EPD_2IN9_V2_H_ + +#include "DEV_Config.h" + +// Display resolution +#define EPD_2IN9_V2_WIDTH 128 +#define EPD_2IN9_V2_HEIGHT 296 + +void EPD_2IN9_V2_Init(void); +void EPD_2IN9_V2_Clear(void); +void EPD_2IN9_V2_Display(UBYTE *Image); +void EPD_2IN9_V2_Display_Base(UBYTE *Image); +void EPD_2IN9_V2_Display_Partial(UBYTE *Image); +void EPD_2IN9_V2_Sleep(void); + +void EPD_2IN9_V2_Display_Partial_Wait(UBYTE *Image); + +void EPD_2IN9_V2_Init_Fast(void); +void EPD_2IN9_V2_Gray4_Init(void); +void EPD_2IN9_V2_4GrayDisplay(UBYTE *Image); + +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font12.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font12.c new file mode 100644 index 0000000..485c3f0 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font12.c @@ -0,0 +1,1384 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font12CN.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font12CN.c new file mode 100644 index 0000000..cf29da2 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font12CN.c @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font12CN_Table[] = +{ +/*-- : --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC0,0x1D,0x80,0x3B,0xFF,0x3B,0x07, +0x3F,0x77,0x7E,0x76,0xF8,0x70,0xFB,0xFE,0xFB,0xFE,0x3F,0x77,0x3F,0x77,0x3E,0x73, +0x38,0x70,0x38,0x70,0x3B,0xE0,0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x73,0xFF,0x70,0x0F,0xFE,0x1E, +0x7E,0x3C,0x6E,0x38,0xEE,0x30,0xEF,0xFF,0xFC,0x30,0x7C,0x30,0x38,0x30,0x3E,0x30, +0x7E,0x30,0xE0,0x30,0xC1,0xF0,0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0E,0x30,0x0E,0x3F,0xEE,0x30,0xEE, +0xFC,0xFF,0x76,0xCE,0x77,0xFE,0x7B,0xFE,0xFF,0xFE,0xF3,0xDE,0xF3,0xCE,0x37,0xEE, +0x3E,0x6E,0x3C,0x0E,0x30,0x3E,0x00,0x00,0x00,0x00}}, + +/*-- : ݮ --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{"ݮ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x70,0xFF,0xFF,0x3E,0x70,0x38,0x00, +0x7F,0xFF,0xE0,0x00,0xFF,0xFC,0x3B,0x8C,0x39,0xCC,0xFF,0xFF,0x73,0x9C,0x71,0xDC, +0x7F,0xFF,0x00,0x1C,0x01,0xF8,0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0xFF,0xF0,0x3E,0x00,0x0E,0x1F, +0xCF,0xFB,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0x7F,0xD8,0x7F,0xDC,0x6F,0xCE,0xED,0xFF, +0xFD,0xF7,0xF9,0xC0,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- : a --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3E,0x00,0x67,0x00,0x07,0x80,0x0F,0x80,0x7F,0x80,0xE3,0x80,0xE7,0x80,0xE7,0x80, +0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- : b --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00, +0x7F,0x00,0x7B,0x80,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x7B,0x80, +0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- : c --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3F,0x00,0x73,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xF0,0x00,0x73,0x00, +0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- : A --*/ +/*-- ΢ź12; ¶ӦĵΪx=16x21 --*/ +{{"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00, +0x1F,0x00,0x3B,0x80,0x3B,0x80,0x71,0x80,0x7F,0xC0,0x71,0xC0,0xE0,0xE0,0xE0,0xE0, +0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +}; + +cFONT Font12CN = { + Font12CN_Table, + sizeof(Font12CN_Table)/sizeof(CH_CN), /*size of table*/ + 11, /* ASCII Width */ + 16, /* Width */ + 21, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font16.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font16.c new file mode 100644 index 0000000..58ce59b --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font16.c @@ -0,0 +1,1764 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 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, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font20.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font20.c new file mode 100644 index 0000000..697e3ed --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font20.c @@ -0,0 +1,2142 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 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, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font24.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font24.c new file mode 100644 index 0000000..fea3321 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font24.c @@ -0,0 +1,2520 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +const uint8_t Font24_Table [] = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 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, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 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, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 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, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font24CN.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font24CN.c new file mode 100644 index 0000000..d3c9584 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font24CN.c @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font24CN_Table[] = +{ +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,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,0xC1,0xC0,0x00, +0x01,0xE3,0xE0,0x00,0x03,0xE3,0xC0,0x00,0x03,0xC7,0x80,0x00,0x03,0xC7,0xFF,0xFF, +0x07,0x8F,0xFF,0xFF,0x07,0x8F,0x00,0x0F,0x0F,0x1E,0x00,0x1E,0x0F,0x3C,0x1E,0x1E, +0x1F,0x3C,0x1E,0x3E,0x1F,0x18,0x1E,0x3C,0x3F,0x00,0x1E,0x1C,0x7F,0x00,0x1E,0x00, +0x7F,0x07,0x9E,0x70,0xFF,0x07,0x9E,0xF0,0xEF,0x0F,0x9E,0x78,0x6F,0x0F,0x1E,0x78, +0x0F,0x0F,0x1E,0x3C,0x0F,0x1E,0x1E,0x3C,0x0F,0x1E,0x1E,0x1E,0x0F,0x3C,0x1E,0x1E, +0x0F,0x3C,0x1E,0x1F,0x0F,0x7C,0x1E,0x0F,0x0F,0x78,0x1E,0x0E,0x0F,0x00,0x1E,0x00, +0x0F,0x00,0x1E,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x07,0xFC,0x00,0x0F,0x07,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00, +0x0F,0x07,0xFF,0xFE,0x0F,0x07,0xFF,0xFE,0x0F,0x00,0x00,0x3E,0x1E,0x00,0x00,0xFC, +0xFF,0xF8,0x01,0xF0,0xFF,0xF8,0x03,0xE0,0x1E,0x78,0x07,0xC0,0x1E,0x78,0x0F,0x80, +0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00, +0x3C,0x7F,0xFF,0xFF,0x78,0xFF,0xFF,0xFF,0x78,0xF0,0x0F,0x00,0x78,0xF0,0x0F,0x00, +0x3D,0xE0,0x0F,0x00,0x1F,0xE0,0x0F,0x00,0x0F,0xE0,0x0F,0x00,0x07,0xC0,0x0F,0x00, +0x07,0xE0,0x0F,0x00,0x07,0xF0,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x1E,0x7C,0x0F,0x00, +0x3C,0x38,0x0F,0x00,0x78,0x00,0x0F,0x00,0xF0,0x03,0xFF,0x00,0x60,0x01,0xFE,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : ΢ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"΢"},{ +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,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x03,0xC0,0x78,0x00,0x07,0x80,0x78,0x00,0x07,0x80,0x78,0x00, +0x07,0x80,0xF0,0x00,0x0F,0x00,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x1E,0x03,0xC0,0x1F,0x1E,0x03,0xC0,0x1E,0x1F,0xE7,0x8F,0x3E,0x3D,0xE7,0x8F,0x3C, +0x3D,0xEF,0x0F,0x7C,0x3D,0xE7,0x0F,0x78,0x79,0xE0,0x0F,0x00,0x79,0xE0,0x0E,0x00, +0x7F,0xFE,0x0E,0x00,0x7F,0xFE,0x1F,0x00,0x01,0xE0,0x1F,0x00,0x01,0xE0,0x1F,0x00, +0x01,0xE0,0x1F,0x80,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x3F,0x80,0x01,0xFF,0x3F,0xC0, +0x0F,0xFF,0x7B,0xC0,0xFF,0xF0,0x79,0xE0,0xF9,0xE0,0xF1,0xF0,0x01,0xE1,0xF0,0xF0, +0x01,0xE3,0xE0,0xF8,0x01,0xE7,0xC0,0x7C,0x01,0xFF,0x80,0x3F,0x01,0xFF,0x00,0x1F, +0x01,0xEC,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xFF,0x00, +0x7F,0xFC,0xF7,0x80,0x7F,0xFD,0xE3,0xC0,0x01,0xC1,0xE3,0xC0,0x01,0xC3,0xC1,0x80, +0x3D,0xC7,0xFF,0xFF,0x39,0xC7,0xFF,0xFF,0x39,0xCF,0x83,0x80,0x79,0xDF,0x83,0x80, +0x79,0xFF,0x83,0x80,0x79,0xDF,0x83,0x80,0x71,0xC3,0x83,0x80,0x7F,0xFF,0xFF,0xFE, +0x7F,0xFF,0xFF,0xFE,0x03,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80, +0x0F,0xC3,0x83,0x80,0x0F,0xC3,0x83,0x80,0x1F,0xC3,0xFF,0xFE,0x1D,0xC3,0xFF,0xFE, +0x3D,0xC3,0x83,0x80,0x79,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80, +0x61,0xC3,0x83,0x80,0x01,0xC3,0xFF,0xFF,0x03,0xC3,0xFF,0xFF,0x1F,0xC3,0x80,0x00, +0x1F,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x1E,0x03,0xC0,0x3C,0x1E,0xC3,0xC7,0x3C, +0x1F,0xE3,0xC7,0xBC,0x1E,0xF3,0xCF,0x3C,0x1E,0xFB,0xDF,0x3C,0x1E,0x7B,0xDE,0x3C, +0x1E,0x33,0xDC,0x3C,0x1E,0x03,0xC0,0x3C,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC, +0x1E,0x03,0xC0,0x3C,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x3F,0xFF,0xFF,0xFC, +0x3F,0xFF,0xFF,0xFC,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0x70, +0x3E,0x78,0xF8,0xF8,0x3C,0x7C,0x78,0x7C,0x7C,0x3C,0x3C,0x3E,0xF8,0x3E,0x3C,0x1F, +0xF0,0x1C,0x18,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x0C,0x3C,0x78,0x3C,0x1E,0x3C,0x78,0x3C,0x3F,0x3C,0x78,0x3C,0xF8, +0x3C,0x7F,0xFD,0xF0,0x3C,0x7F,0xFF,0xE0,0x3C,0x78,0x3F,0x80,0x3C,0x78,0x3E,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x0E,0x3C,0x78,0x3C,0x0F, +0x3C,0x78,0x3C,0x0F,0x3C,0x79,0xFC,0x0F,0x3C,0x7F,0xFC,0x0F,0x3F,0xFF,0x3C,0x0F, +0x3F,0xF0,0x3E,0x1E,0xFF,0x00,0x1F,0xFE,0xF0,0x00,0x0F,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}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE, +0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E, +0x7B,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00, +0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,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,0xC0,0x3C,0x00, +0x03,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00, +0x07,0x80,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x1F,0x01,0xFE,0x00, +0x1F,0x01,0xFF,0x00,0x3F,0x01,0xFF,0x00,0x3F,0x03,0xFF,0x00,0x7F,0x03,0xFF,0x80, +0x7F,0x07,0xBF,0x80,0xFF,0x07,0xBF,0xC0,0xEF,0x0F,0x3D,0xC0,0xCF,0x0F,0x3D,0xE0, +0x0F,0x1E,0x3D,0xE0,0x0F,0x1E,0x3C,0xF0,0x0F,0x3C,0x3C,0x78,0x0F,0x7C,0x3C,0x7C, +0x0F,0xF8,0x3C,0x3E,0x0F,0xF7,0xFF,0xDF,0x0F,0xE7,0xFF,0xCF,0x0F,0xC0,0x3C,0x06, +0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00, +0x0F,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0xE0,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xFC,0x00,0x00,0x0F,0xBF,0x00, +0x00,0x0F,0x9F,0x80,0x00,0x0F,0x87,0xE0,0x00,0x0F,0x83,0xF0,0x00,0x0F,0x80,0xF8, +0x00,0x0F,0x80,0x7C,0x00,0x0F,0x80,0x38,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x7F,0xFC,0x00,0x78,0x7F,0xFC,0x00,0x78, +0x00,0x3C,0x00,0x78,0x00,0x3F,0xFF,0xFF,0x30,0x3F,0xFF,0xFF,0x78,0x3C,0x00,0x78, +0x3C,0x38,0x00,0x78,0x3E,0x78,0x00,0x78,0x1E,0x78,0xC0,0x78,0x0F,0x79,0xE0,0x78, +0x0F,0xF0,0xF0,0x78,0x07,0xF0,0xF8,0x78,0x03,0xF0,0x78,0x78,0x01,0xE0,0x3C,0x78, +0x03,0xF0,0x3E,0x78,0x03,0xF0,0x18,0x78,0x07,0xF8,0x00,0x78,0x07,0xFC,0x00,0x78, +0x0F,0x3E,0x00,0x78,0x1F,0x1E,0x00,0x78,0x3E,0x1F,0x00,0x78,0x7C,0x0E,0x00,0xF8, +0xF8,0x00,0x00,0xF0,0xF0,0x00,0x3F,0xF0,0x60,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : Ӧ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"Ӧ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xF0,0x00,0x00,0x00,0xF0,0x00,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, +0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x01,0xE0,0x78,0x1E,0x01,0xE0,0x78, +0x1E,0xE1,0xE0,0x78,0x1F,0xF1,0xF0,0xF8,0x1E,0xF0,0xF0,0xF0,0x1E,0xF0,0xF0,0xF0, +0x1E,0xF8,0xF0,0xF0,0x1E,0x78,0xF1,0xF0,0x1E,0x78,0xF9,0xE0,0x1E,0x78,0x79,0xE0, +0x1E,0x7C,0x7B,0xE0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0, +0x3C,0x3E,0x07,0x80,0x3C,0x1C,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00,0x0F,0x00, +0x78,0x00,0x0F,0x00,0x7B,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00, +0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +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,0x80,0x3C,0x00,0x07,0xC0,0x3E,0x00, +0x07,0x80,0x3C,0x00,0x07,0x80,0x7C,0x00,0x0F,0x00,0x78,0x00,0x7F,0xFE,0x7F,0xFE, +0x7F,0xFE,0xFF,0xFE,0x78,0x1E,0xF0,0x1E,0x78,0x1F,0xE0,0x1E,0x78,0x1F,0xE0,0x1E, +0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xF0,0x1E,0x78,0x1E,0xF8,0x1E, +0x78,0x1E,0x7C,0x1E,0x7F,0xFE,0x3C,0x1E,0x7F,0xFE,0x1E,0x1E,0x78,0x1E,0x1F,0x1E, +0x78,0x1E,0x0F,0x9E,0x78,0x1E,0x07,0x9E,0x78,0x1E,0x07,0x1E,0x78,0x1E,0x00,0x1E, +0x78,0x1E,0x00,0x1E,0x78,0x1E,0x00,0x3E,0x78,0x1E,0x00,0x3C,0x78,0x1E,0x00,0x3C, +0x7F,0xFE,0x00,0x3C,0x7F,0xFE,0x00,0x7C,0x78,0x1E,0x3F,0xF8,0x78,0x1E,0x3F,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,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,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x00,0x00,0x00,0x00, +0x0C,0x38,0x38,0x30,0x1E,0x7C,0x78,0x78,0x3E,0x3C,0x78,0x78,0x3C,0x3C,0x3C,0x3C, +0x7C,0x3E,0x3C,0x3E,0xF8,0x1E,0x3C,0x1E,0xF0,0x1E,0x1E,0x1F,0x70,0x1E,0x1C,0x0E, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00, +0x7F,0xF0,0x78,0x00,0x7F,0xF0,0x78,0x00,0x79,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF, +0x79,0xE1,0xE0,0x00,0x79,0xE1,0xE0,0x00,0x7B,0xC1,0xEF,0x80,0x7B,0xC3,0xCF,0x80, +0x7B,0xC3,0xCF,0x80,0x7F,0x87,0xCF,0x80,0x7F,0x87,0x8F,0x80,0x7F,0x87,0x8F,0x80, +0x7B,0xCF,0x0F,0x80,0x7B,0xCF,0xFF,0xFE,0x79,0xEF,0xFF,0xFE,0x79,0xE0,0x0F,0x80, +0x78,0xE0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80, +0x78,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x7F,0xE0,0x0F,0x80,0x7F,0xC0,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : Ϊ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"Ϊ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00, +0x0E,0x07,0x80,0x00,0x1F,0x07,0x80,0x00,0x0F,0x87,0x80,0x00,0x07,0xC7,0x80,0x00, +0x01,0xE7,0x80,0x00,0x00,0xC7,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xFC, +0x7F,0xFF,0xFF,0xFC,0x00,0x07,0x80,0x3C,0x00,0x0F,0x80,0x3C,0x00,0x0F,0x00,0x3C, +0x00,0x0F,0x00,0x3C,0x00,0x0F,0x60,0x3C,0x00,0x1F,0xF0,0x3C,0x00,0x1E,0x78,0x3C, +0x00,0x3E,0x3C,0x3C,0x00,0x3C,0x3E,0x3C,0x00,0x7C,0x1F,0x3C,0x00,0x78,0x0F,0x3C, +0x00,0xF8,0x06,0x3C,0x01,0xF0,0x00,0x3C,0x03,0xE0,0x00,0x7C,0x07,0xC0,0x00,0x7C, +0x0F,0x80,0x00,0x78,0x1F,0x00,0x00,0xF8,0x3E,0x00,0xFF,0xF0,0x7C,0x00,0xFF,0xE0, +0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x38, +0x0F,0x00,0x00,0x38,0x0F,0x00,0x00,0x38,0x0F,0x3F,0xF8,0x38,0x0F,0x3F,0xF8,0x38, +0x0F,0x00,0x78,0x38,0xFF,0xE0,0x7F,0xFF,0xFF,0xE0,0x7F,0xFF,0x0F,0x00,0x70,0x38, +0x0F,0x18,0xF0,0x38,0x1F,0x3C,0xF0,0x38,0x1F,0x1C,0xFE,0x38,0x1F,0xDE,0xFE,0x38, +0x3F,0xEF,0xEF,0x38,0x3F,0xFF,0xEF,0x38,0x3F,0xF7,0xE7,0xB8,0x7F,0x67,0xC7,0xB8, +0x7F,0x03,0xC3,0xB8,0xFF,0x07,0xE0,0x38,0xEF,0x07,0xE0,0x38,0xEF,0x0F,0xF0,0x38, +0xCF,0x1F,0xF0,0x38,0x0F,0x1E,0x78,0x38,0x0F,0x3C,0x7C,0x38,0x0F,0x78,0x3C,0x38, +0x0F,0xF8,0x38,0x38,0x0F,0x60,0x00,0x78,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x07,0xF0, +0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : ݮ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"ݮ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x1E,0x00, +0x00,0x3C,0x1E,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x1E,0x00, +0x07,0xBC,0x1E,0x00,0x07,0x80,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, +0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF0, +0xF7,0xFF,0xFF,0xF0,0x37,0x83,0x80,0xF0,0x07,0x87,0xC0,0xF0,0x07,0x83,0xF0,0xF0, +0x07,0x00,0xE0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x00,0xE0, +0x0F,0x0F,0x81,0xE0,0x0E,0x03,0xE1,0xE0,0x1E,0x01,0xC1,0xE0,0x1F,0xFF,0xFF,0xFE, +0x1F,0xFF,0xFF,0xFE,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0, +0x00,0x00,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x3E, +0x7C,0x00,0x3F,0xFE,0x3F,0x3F,0xFF,0xF0,0x1F,0xBF,0xE0,0x00,0x07,0xBC,0x00,0x00, +0x03,0x3C,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x0F,0xFE,0x70,0x3D,0xFF,0xF8, +0xF8,0x3D,0xFF,0x00,0x7C,0x3D,0xE7,0x80,0x3F,0x3D,0xE7,0x80,0x1F,0x3D,0xE7,0x8E, +0x0E,0x3D,0xE7,0x9F,0x00,0x3D,0xE7,0xFE,0x00,0x39,0xE7,0xF8,0x00,0x39,0xE3,0xF0, +0x1C,0x39,0xE3,0xC0,0x1E,0x79,0xE3,0xC0,0x1E,0x79,0xE1,0xE0,0x1E,0x79,0xE1,0xE0, +0x3C,0x79,0xE0,0xF0,0x3C,0x79,0xE0,0xF8,0x3C,0xF1,0xE0,0x7C,0x3C,0xF1,0xE3,0x7C, +0x7D,0xF1,0xEF,0x3F,0x79,0xE1,0xFE,0x1F,0x7B,0xE1,0xF8,0x0E,0x7B,0xC3,0xE0,0x00, +0x79,0x81,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : A --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{ +"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00, +0x01,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xEF,0x00,0x00,0x03,0xEF,0x80,0x00, +0x03,0xCF,0x80,0x00,0x07,0xC7,0x80,0x00,0x07,0xC7,0xC0,0x00,0x07,0x87,0xC0,0x00, +0x0F,0x83,0xE0,0x00,0x0F,0x83,0xE0,0x00,0x0F,0x01,0xE0,0x00,0x1F,0xFF,0xF0,0x00, +0x1F,0xFF,0xF0,0x00,0x3F,0xFF,0xF8,0x00,0x3E,0x00,0xF8,0x00,0x3C,0x00,0xF8,0x00, +0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x78,0x00,0x3C,0x00,0xF8,0x00,0x3E,0x00, +0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : a --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00, +0x1F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3E,0x3F,0x00,0x00,0x38,0x1F,0x00,0x00, +0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x03,0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00, +0x3F,0x8F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x78,0x1F,0x00,0x00, +0x7C,0x1F,0x00,0x00,0x7E,0x7F,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00, +0x0F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : b --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0xFE,0x00,0x00, +0x3D,0xFF,0x80,0x00,0x3F,0xFF,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0x07,0xE0,0x00, +0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3C,0x01,0xE0,0x00,0x3C,0x01,0xE0,0x00, +0x3C,0x01,0xE0,0x00,0x3C,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00, +0x3F,0x07,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00, +0x3C,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,0x00,0x00}}, + +/*-- : c --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,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,0xFC,0x00,0x00, +0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0x86,0x00,0x00,0x3E,0x00,0x00,0x00, +0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00, +0x78,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, +0x3E,0x00,0x00,0x00,0x3F,0x86,0x00,0x00,0x1F,0xFE,0x00,0x00,0x0F,0xFE,0x00,0x00, +0x03,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,0x00,0x00}}, + +/*-- : ΢ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"΢"},{ +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,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : ѩ --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{"ѩ"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x78,0x03,0xC0,0x1E,0x78,0x03,0xC0,0x1E, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00, +0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0x0E,0x78,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F, +0x00,0x07,0x80,0x1F,0x00,0x07,0x80,0x1E,0x00,0x03,0xFF,0xFE,0x00,0x01,0xFF,0xFC, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- : --*/ +/*-- ΢ź24; ¶ӦĵΪx=32x41 --*/ +{{""},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0, +0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00, +0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + + +}; + +cFONT Font24CN = { + Font24CN_Table, + sizeof(Font24CN_Table)/sizeof(CH_CN), /*size of table*/ + 24, /* ASCII Width */ + 32, /* Width */ + 41, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/font8.c b/docs/Touch_e-Paper_Code/c/lib/Fonts/font8.c new file mode 100644 index 0000000..88450d9 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/font8.c @@ -0,0 +1,1004 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/Fonts/fonts.h b/docs/Touch_e-Paper_Code/c/lib/Fonts/fonts.h new file mode 100644 index 0000000..c183f04 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/Fonts/fonts.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/*΢ź24 (32x41) */ +#define MAX_HEIGHT_FONT 41 +#define MAX_WIDTH_FONT 32 +#define OFFSET_BITMAP + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +//ASCII +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + + +//GB2312 +typedef struct // ģݽṹ +{ + const char index[2]; // + const char matrix[MAX_HEIGHT_FONT*MAX_WIDTH_FONT/8+2]; // +}CH_CN; + + +typedef struct +{ + const CH_CN *table; + uint16_t size; + uint16_t ASCII_Width; + uint16_t Width; + uint16_t Height; + +}cFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +extern cFONT Font12CN; +extern cFONT Font24CN; +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.c b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.c new file mode 100644 index 0000000..bd4c134 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.c @@ -0,0 +1,286 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.2 +* | Date : 2020-07-08 +* | Info : +* ----------------------------------------------------------------------------- +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +# +# 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 "GUI_BMPfile.h" +#include "GUI_Paint.h" +#include "Debug.h" + +#include +#include +#include +#include //exit() +#include //memset() +#include //memset() +#include + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 8 == 0)? (bmpInfoHeader.biWidth / 8): (bmpInfoHeader.biWidth / 8 + 1); + UWORD Bmp_Width_Byte = (Image_Width_Byte % 4 == 0) ? Image_Width_Byte: ((Image_Width_Byte / 4 + 1) * 4); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 1) { + Debug("the bmp Image is not a monochrome bitmap!\n"); + exit(0); + } + + // Determine black and white based on the palette + UWORD i; + UWORD Bcolor, Wcolor; + UWORD bmprgbquadsize = pow(2, bmpInfoHeader.biBitCount);// 2^1 = 2 + BMPRGBQUAD bmprgbquad[bmprgbquadsize]; //palette + // BMPRGBQUAD bmprgbquad[2]; //palette + + for(i = 0; i < bmprgbquadsize; i++){ + // for(i = 0; i < 2; i++) { + fread(&bmprgbquad[i], sizeof(BMPRGBQUAD), 1, fp); + } + if(bmprgbquad[0].rgbBlue == 0xff && bmprgbquad[0].rgbGreen == 0xff && bmprgbquad[0].rgbRed == 0xff) { + Bcolor = BLACK; + Wcolor = WHITE; + } else { + Bcolor = WHITE; + Wcolor = BLACK; + } + + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, readbyte, fp) != readbyte) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte] = Rdata; + // printf("rdata = %d\r\n", Rdata); + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[(x / 8) + (y * Image_Width_Byte)]; + color = (((temp << (x%8)) & 0x80) == 0x80) ?Bcolor:Wcolor; + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} +/************************************************************************* + +*************************************************************************/ +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 4 == 0)? (bmpInfoHeader.biWidth / 4): (bmpInfoHeader.biWidth / 4 + 1); + UWORD Bmp_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 2 + 1); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight * 2]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight * 2); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 4){ + Debug("Bmp image is not a 4-color bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte*2) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte*2] = Rdata; + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[x/2 + y * bmpInfoHeader.biWidth/2] >> ((x%2)? 0:4);//0xf 0x8 0x7 0x0 + color = temp>>2; //11 10 01 00 + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} + + +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; + UBYTE Image[Image_Byte]; + memset(Image, 0xFF, Image_Byte); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 24){ + Debug("Bmp image is not 24 bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata[3]; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+1, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+2, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + + if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black + }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Green + }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Blue + }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Red + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Yellow + }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Orange + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); + } + } + return 0; +} + + diff --git a/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.h b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.h new file mode 100644 index 0000000..b34efd7 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_BMPfile.h @@ -0,0 +1,89 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.2 +* | Date : 2020-07-08 +* | Info : +* ----------------------------------------------------------------------------- +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +# +# 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 __GUI_BMPFILE_H +#define __GUI_BMPFILE_H + +#include +#include +#include +#include + +#include "DEV_Config.h" + +/*Bitmap file header 14bit*/ +typedef struct BMP_FILE_HEADER { + UWORD bType; //File identifier + UDOUBLE bSize; //The size of the file + UWORD bReserved1; //Reserved value, must be set to 0 + UWORD bReserved2; //Reserved value, must be set to 0 + UDOUBLE bOffset; //The offset from the beginning of the file header to the beginning of the image data bit +} __attribute__ ((packed)) BMPFILEHEADER; // 14bit + +/*Bitmap information header 40bit*/ +typedef struct BMP_INFO { + UDOUBLE biInfoSize; //The size of the header + UDOUBLE biWidth; //The width of the image + UDOUBLE biHeight; //The height of the image + UWORD biPlanes; //The number of planes in the image + UWORD biBitCount; //The number of bits per pixel + UDOUBLE biCompression; //Compression type + UDOUBLE bimpImageSize; //The size of the image, in bytes + UDOUBLE biXPelsPerMeter; //Horizontal resolution + UDOUBLE biYPelsPerMeter; //Vertical resolution + UDOUBLE biClrUsed; //The number of colors used + UDOUBLE biClrImportant; //The number of important colors +} __attribute__ ((packed)) BMPINFOHEADER; + +/*Color table: palette */ +typedef struct RGB_QUAD { + UBYTE rgbBlue; //Blue intensity + UBYTE rgbGreen; //Green strength + UBYTE rgbRed; //Red intensity + UBYTE rgbReversed; //Reserved value +} __attribute__ ((packed)) BMPRGBQUAD; +/**************************************** end ***********************************************/ + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart); +#endif diff --git a/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.c b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.c new file mode 100644 index 0000000..6449309 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.c @@ -0,0 +1,798 @@ +/****************************************************************************** +* | File : GUI_Paint.c +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.2 +* | Date : 2020-07-10 +* | Info : +* ----------------------------------------------------------------------------- +* V3.2(2020-07-10): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 7 for 5.65f e-Parper +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 7 +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 7 +* ----------------------------------------------------------------------------- +* V3.1(2019-10-10): +* 1. Add gray level +* PAINT Add Scale +* 2. Add void Paint_SetScale(UBYTE scale); +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* 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 "GUI_Paint.h" +#include "DEV_Config.h" +#include "Debug.h" +#include +#include +#include //memset() +#include + +PAINT Paint; + +/****************************************************************************** +function: Create Image +parameter: + image : Pointer to the image cache + width : The width of the picture + Height : The height of the picture + Color : Whether the picture is inverted +******************************************************************************/ +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color) +{ + Paint.Image = NULL; + Paint.Image = image; + + Paint.WidthMemory = Width; + Paint.HeightMemory = Height; + Paint.Color = Color; + Paint.Scale = 2; + Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1); + Paint.HeightByte = Height; +// printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte); +// printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8); + + Paint.Rotate = Rotate; + Paint.Mirror = MIRROR_NONE; + + if(Rotate == ROTATE_0 || Rotate == ROTATE_180) { + Paint.Width = Width; + Paint.Height = Height; + } else { + Paint.Width = Height; + Paint.Height = Width; + } +} + +/****************************************************************************** +function: Select Image +parameter: + image : Pointer to the image cache +******************************************************************************/ +void Paint_SelectImage(UBYTE *image) +{ + Paint.Image = image; +} + +/****************************************************************************** +function: Select Image Rotate +parameter: + Rotate : 0,90,180,270 +******************************************************************************/ +void Paint_SetRotate(UWORD Rotate) +{ + if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) { + Debug("Set image Rotate %d\r\n", Rotate); + Paint.Rotate = Rotate; + } else { + Debug("rotate = 0, 90, 180, 270\r\n"); + } +} + +/****************************************************************************** +function: Select Image mirror +parameter: + mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror +******************************************************************************/ +void Paint_SetMirroring(UBYTE mirror) +{ + if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL || + mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) { + Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none"); + Paint.Mirror = mirror; + } else { + Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \ + MIRROR_VERTICAL or MIRROR_ORIGIN\r\n"); + } +} + +void Paint_SetScale(UBYTE scale) +{ + if(scale == 2){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1); + }else if(scale == 4){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1); + }else if(scale == 7){//Only applicable with 5in65 e-Paper + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 2 == 0)? (Paint.WidthMemory / 2 ): (Paint.WidthMemory / 2 + 1);; + }else{ + Debug("Set Scale Input parameter error\r\n"); + Debug("Scale Only support: 2 4 7\r\n"); + } +} +/****************************************************************************** +function: Draw Pixels +parameter: + Xpoint : At point X + Ypoint : At point Y + Color : Painted colors +******************************************************************************/ +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +{ + if(Xpoint > Paint.Width || Ypoint > Paint.Height){ + Debug("Exceeding display boundaries\r\n"); + return; + } + UWORD X, Y; + switch(Paint.Rotate) { + case 0: + X = Xpoint; + Y = Ypoint; + break; + case 90: + X = Paint.WidthMemory - Ypoint - 1; + Y = Xpoint; + break; + case 180: + X = Paint.WidthMemory - Xpoint - 1; + Y = Paint.HeightMemory - Ypoint - 1; + break; + case 270: + X = Ypoint; + Y = Paint.HeightMemory - Xpoint - 1; + break; + default: + return; + } + + switch(Paint.Mirror) { + case MIRROR_NONE: + break; + case MIRROR_HORIZONTAL: + X = Paint.WidthMemory - X - 1; + break; + case MIRROR_VERTICAL: + Y = Paint.HeightMemory - Y - 1; + break; + case MIRROR_ORIGIN: + X = Paint.WidthMemory - X - 1; + Y = Paint.HeightMemory - Y - 1; + break; + default: + return; + } + + if(X > Paint.WidthMemory || Y > Paint.HeightMemory){ + Debug("Exceeding display boundaries\r\n"); + return; + } + + if(Paint.Scale == 2){ + UDOUBLE Addr = X / 8 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + if(Color == BLACK) + Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8)); + else + Paint.Image[Addr] = Rdata | (0x80 >> (X % 8)); + }else if(Paint.Scale == 4){ + UDOUBLE Addr = X / 4 + Y * Paint.WidthByte; + Color = Color % 4;//Guaranteed color scale is 4 --- 0~3 + UBYTE Rdata = Paint.Image[Addr]; + + Rdata = Rdata & (~(0xC0 >> ((X % 4)*2)));//Clear first, then set value + Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2)); + }else if(Paint.Scale == 7){ + UDOUBLE Addr = X / 2 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + Rdata = Rdata & (~(0xF0 >> ((X % 2)*4)));//Clear first, then set value + Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4)); + // printf("Add = %d ,data = %d\r\n",Addr,Rdata); + } +} + +/****************************************************************************** +function: Clear the color of the picture +parameter: + Color : Painted colors +******************************************************************************/ +void Paint_Clear(UWORD Color) +{ + if(Paint.Scale == 2 || Paint.Scale == 4){ + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = Color; + } + } + }else if(Paint.Scale == 7){ + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) { + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = (Color<<4)|Color; + } + } + } + +} + +/****************************************************************************** +function: Clear the color of a window +parameter: + Xstart : x starting point + Ystart : Y starting point + Xend : x end point + Yend : y end point + Color : Painted colors +******************************************************************************/ +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) +{ + UWORD X, Y; + for (Y = Ystart; Y < Yend; Y++) { + for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte + Paint_SetPixel(X, Y, Color); + } + } +} + +/****************************************************************************** +function: Draw Point(Xpoint, Ypoint) Fill the color +parameter: + Xpoint : The Xpoint coordinate of the point + Ypoint : The Ypoint coordinate of the point + Color : Painted color + Dot_Pixel : point size + Dot_Style : point Style +******************************************************************************/ +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, + DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) +{ + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawPoint Input exceeds the normal display range\r\n"); + return; + } + + int16_t XDir_Num , YDir_Num; + if (Dot_Style == DOT_FILL_AROUND) { + for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) { + if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0) + break; + // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel); + Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color); + } + } + } else { + for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) { + Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color); + } + } + } +} + +/****************************************************************************** +function: Draw a line of arbitrary slope +parameter: + Xstart :Starting Xpoint point coordinates + Ystart :Starting Xpoint point coordinates + Xend :End point Xpoint coordinate + Yend :End point Ypoint coordinate + Color :The color of the line segment + Line_width : Line width + Line_Style: Solid and dotted lines +******************************************************************************/ +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Paint_DrawLine Input exceeds the normal display range\r\n"); + return; + } + + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend; + int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend; + + // Increment direction, 1 is positive, -1 is counter; + int XAddway = Xstart < Xend ? 1 : -1; + int YAddway = Ystart < Yend ? 1 : -1; + + //Cumulative error + int Esp = dx + dy; + char Dotted_Len = 0; + + for (;;) { + Dotted_Len++; + //Painted dotted line, 2 point is really virtual + if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) { + //Debug("LINE_DOTTED\r\n"); + Paint_DrawPoint(Xpoint, Ypoint, IMAGE_BACKGROUND, Line_width, DOT_STYLE_DFT); + Dotted_Len = 0; + } else { + Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT); + } + if (2 * Esp >= dy) { + if (Xpoint == Xend) + break; + Esp += dy; + Xpoint += XAddway; + } + if (2 * Esp <= dx) { + if (Ypoint == Yend) + break; + Esp += dx; + Ypoint += YAddway; + } + } +} + +/****************************************************************************** +function: Draw a rectangle +parameter: + Xstart :Rectangular Starting Xpoint point coordinates + Ystart :Rectangular Starting Xpoint point coordinates + Xend :Rectangular End point Xpoint coordinate + Yend :Rectangular End point Ypoint coordinate + Color :The color of the Rectangular segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the rectangle +******************************************************************************/ +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Input exceeds the normal display range\r\n"); + return; + } + + if (Draw_Fill) { + UWORD Ypoint; + for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) { + Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID); + } + } else { + Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + } +} + +/****************************************************************************** +function: Use the 8-point method to draw a circle of the + specified size at the specified position-> +parameter: + X_Center :Center X coordinate + Y_Center :Center Y coordinate + Radius :circle Radius + Color :The color of the :circle segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the Circle +******************************************************************************/ +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (X_Center > Paint.Width || Y_Center >= Paint.Height) { + Debug("Paint_DrawCircle Input exceeds the normal display range\r\n"); + return; + } + + //Draw a circle from(0, R) as a starting point + int16_t XCurrent, YCurrent; + XCurrent = 0; + YCurrent = Radius; + + //Cumulative error,judge the next point of the logo + int16_t Esp = 3 - (Radius << 1 ); + + int16_t sCountY; + if (Draw_Fill == DRAW_FILL_FULL) { + while (XCurrent <= YCurrent ) { //Realistic circles + for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } else { //Draw a hollow circle + while (XCurrent <= YCurrent ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0 + + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } +} + +/****************************************************************************** +function: Show English characters +parameter: + Xpoint :X coordinate + Ypoint :Y coordinate + Acsii_Char :To display the English characters + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Page, Column; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawChar Input exceeds the normal display range\r\n"); + return; + } + + uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0)); + const unsigned char *ptr = &Font->table[Char_Offset]; + + for (Page = 0; Page < Font->Height; Page ++ ) { + for (Column = 0; Column < Font->Width; Column ++ ) { + + //To determine whether the font background color and screen background color is consistent + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (Column % 8))) + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + if (*ptr & (0x80 >> (Column % 8))) { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + //One pixel is 8 bits + if (Column % 8 == 7) + ptr++; + }// Write a line + if (Font->Width % 8 != 0) + ptr++; + }// Write all +} + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the English string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + + if (Xstart > Paint.Width || Ystart > Paint.Height) { + Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n"); + return; + } + + while (* pString != '\0') { + //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character + if ((Xpoint + Font->Width ) > Paint.Width ) { + Xpoint = Xstart; + Ypoint += Font->Height; + } + + // If the Y direction is full, reposition to(Xstart, Ystart) + if ((Ypoint + Font->Height ) > Paint.Height ) { + Xpoint = Xstart; + Ypoint = Ystart; + } + Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground); + + //The next character of the address + pString ++; + + //The next word of the abscissa increases the font of the broadband + Xpoint += Font->Width; + } +} + + +/****************************************************************************** +function: Display the string +parameter: + Xstart :X coordinate + Ystart :Y coordinate + pString :The first address of the Chinese string and English + string to be displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, + UWORD Color_Foreground, UWORD Color_Background) +{ + const char* p_text = pString; + int x = Xstart, y = Ystart; + int i, j,Num; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + if(*p_text <= 0x7F) { //ASCII < 126 + for(Num = 0; Num < font->size; Num++) { + if(*p_text== font->table[Num].index[0]) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 1; + /* Decrement the column position by 16 */ + x += font->ASCII_Width; + } else { //Chinese + for(Num = 0; Num < font->size; Num++) { + if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 2; + /* Decrement the column position by 16 */ + x += font->Width; + } + } +} + +/****************************************************************************** +function: Display nummber +parameter: + Xstart :X coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +#define ARRAY_LEN 255 +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + //Converts a number to a string + while (Nummber) { + Num_Array[Num_Bit] = Nummber % 10 + '0'; + Num_Bit++; + Nummber /= 10; + } + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display time +parameter: + Xstart :X coordinate + Ystart : Y coordinate + pTime : Time-related structures + Font :A structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, + UWORD Color_Foreground, UWORD Color_Background) +{ + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + UWORD Dx = Font->Width; + + //Write data into the cache + Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground); + // Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground); + // Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground); + // Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground); +} +void Paint_DrawDate(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, + UWORD Color_Foreground, UWORD Color_Background) +{ + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + UWORD Dx = Font->Width; + + //Write data into the cache + Paint_DrawChar(Xstart , Ystart, value[pTime->Year / 1000] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Year / 100 % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 2 , Ystart, value[pTime->Year / 10 %100] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 3 , Ystart, value[pTime->Year % 1000 % 100 % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 4 , Ystart, '-' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Month / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Month % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 7 , Ystart, '-' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 8 , Ystart, value[pTime->Day / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 9 , Ystart, value[pTime->Day % 10] , Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display monochrome bitmap +parameter: + image_buffer :A picture data converted to a bitmap +info: + Use a computer to convert the image into a corresponding array, + and then embed the array directly into Imagedata.cpp as a .c file. +******************************************************************************/ +void Paint_DrawBitMap(const unsigned char* image_buffer) +{ + UWORD x, y; + UDOUBLE Addr = 0; + + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte; + Paint.Image[Addr] = (unsigned char)image_buffer[Addr]; + } + } +} diff --git a/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.h b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.h new file mode 100644 index 0000000..66c6045 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/lib/GUI/GUI_Paint.h @@ -0,0 +1,215 @@ +/****************************************************************************** +* | File : GUI_Paint.h +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +*---------------- +* | This version: V3.1 +* | Date : 2019-10-10 +* | Info : +* ----------------------------------------------------------------------------- +* V3.1(2019-10-10): +* 1. Add gray level +* PAINT Add Scale +* 2. Add void Paint_SetScale(UBYTE scale); +* +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* 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 __GUI_PAINT_H +#define __GUI_PAINT_H + +#include "DEV_Config.h" +#include "../Fonts/fonts.h" + +/** + * Image attributes +**/ +typedef struct { + UBYTE *Image; + UWORD Width; + UWORD Height; + UWORD WidthMemory; + UWORD HeightMemory; + UWORD Color; + UWORD Rotate; + UWORD Mirror; + UWORD WidthByte; + UWORD HeightByte; + UWORD Scale; +} PAINT; +extern PAINT Paint; + +/** + * Display rotate +**/ +#define ROTATE_0 0 +#define ROTATE_90 90 +#define ROTATE_180 180 +#define ROTATE_270 270 + +/** + * Display Flip +**/ +typedef enum { + MIRROR_NONE = 0x00, + MIRROR_HORIZONTAL = 0x01, + MIRROR_VERTICAL = 0x02, + MIRROR_ORIGIN = 0x03, +} MIRROR_IMAGE; +#define MIRROR_IMAGE_DFT MIRROR_NONE + +/** + * image color +**/ +#define WHITE 0xFF +#define BLACK 0x00 +#define RED BLACK + +#define IMAGE_BACKGROUND WHITE +#define FONT_FOREGROUND BLACK +#define FONT_BACKGROUND WHITE + +//4 Gray level +#define GRAY1 0x03 //Blackest +#define GRAY2 0x02 +#define GRAY3 0x01 //gray +#define GRAY4 0x00 //white +/** + * The size of the point +**/ +typedef enum { + DOT_PIXEL_1X1 = 1, // 1 x 1 + DOT_PIXEL_2X2 , // 2 X 2 + DOT_PIXEL_3X3 , // 3 X 3 + DOT_PIXEL_4X4 , // 4 X 4 + DOT_PIXEL_5X5 , // 5 X 5 + DOT_PIXEL_6X6 , // 6 X 6 + DOT_PIXEL_7X7 , // 7 X 7 + DOT_PIXEL_8X8 , // 8 X 8 +} DOT_PIXEL; +#define DOT_PIXEL_DFT DOT_PIXEL_1X1 //Default dot pilex + +/** + * Point size fill style +**/ +typedef enum { + DOT_FILL_AROUND = 1, // dot pixel 1 x 1 + DOT_FILL_RIGHTUP , // dot pixel 2 X 2 +} DOT_STYLE; +#define DOT_STYLE_DFT DOT_FILL_AROUND //Default dot pilex + +/** + * Line style, solid or dashed +**/ +typedef enum { + LINE_STYLE_SOLID = 0, + LINE_STYLE_DOTTED, +} LINE_STYLE; + +/** + * Whether the graphic is filled +**/ +typedef enum { + DRAW_FILL_EMPTY = 0, + DRAW_FILL_FULL, +} DRAW_FILL; + +/** + * Custom structure of a time attribute +**/ +typedef struct { + UWORD Year; //0000 + UBYTE Month; //1 - 12 + UBYTE Day; //1 - 30 + UBYTE Hour; //0 - 23 + UBYTE Min; //0 - 59 + UBYTE Sec; //0 - 59 +} PAINT_TIME; +extern PAINT_TIME sPaint_time; + +//init and Clear +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); +void Paint_SelectImage(UBYTE *image); +void Paint_SetRotate(UWORD Rotate); +void Paint_SetMirroring(UBYTE mirror); +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color); +void Paint_SetScale(UBYTE scale); + +void Paint_Clear(UWORD Color); +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color); + +//Drawing +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_FillWay); +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style); +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); + +//Display string +void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawDate(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +//pic +void Paint_DrawBitMap(const unsigned char* image_buffer); + + +#endif + + + + + diff --git a/docs/Touch_e-Paper_Code/c/main b/docs/Touch_e-Paper_Code/c/main new file mode 100644 index 0000000000000000000000000000000000000000..d2b525f21b4bceb921257816c000ccbc9c2bfbfe GIT binary patch literal 173772 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 y>-r_| z!>JNLTyS?k4d+LX)adrx)1Y|V;QKS?9p-P$3w*Zmc%>B054b=RBfK)E=GxA+AiEyB z9#Mf=Y5bA%@D?AB87MJ~;9Nx=6n)k)>Q0r0jd$h;0-+StJ zmR85})Uq>yUNAi9yg3`tAE$hO&cdT&bnuGNL5=h;XYs-@(!U~0|8kbrzu+Pt#h3mS z^Gm;v^;PwbP5pDj)T~AemvnzC#W%tp@Tp*QNN=>*vA$x&s~Gtzo)GV25s&IC^AYo- zo$4Xxae@&~`Y-N(ZW#4QKZYIkNo4b3@x%7pzW?KQ`1cA< z literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_0.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..146e514e8e93d349d668c12b10cb0e15f8303da8 GIT binary patch literal 1038 zcmZ?rC$3@If$G080G-{~wt<${r1Y(GVEoApii- Cq6Z@Y literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_1.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5f8c534b82a93d5f10ae42a0af25ea6c440debe GIT binary patch literal 1038 zcmb8tKWp1S6aet2UfZJtEcyj{84F!JdI)*Yz4XI$D3sz8bnud(Z%}`f2pq@~s<~5R z4AE!>50&Ymm-pvPXgh?QIsNqR&hMU1djDba9JHPC^)2^z+`n)y_;+ZR69DPYctAQg zl4iFLR~(6k3IHi)iS9Ihswr5WKALMvnrB6cw?kUcsMcBpQXta#gJ|*ih?M95^CIW_ z9xdz7SR8gLF85}gsFnOJ zp~~AI>|~tdjm^_K+lySr0PKS79KVsBqa&-gFahRX>gP%z3NV2;D!@zjn7e!jQ|{7c zrMwj$4;LzwZ6h~fvAYp*wU=!H*GU)R-8h#x^n~g_%Sz%w9|J-vyN2U3c}-AW-+t;P zK40%ef40+v{`z;4#BTVkiCyEyuN)V3VH;p$#=KD+qHahD%@ISzf1nYy0HTmxW@|N4 zd$5-ENUiy&6OY5Hlk=aIe>?S^j!zw#1>GL;It1E!HdJv-z|YlSHnbA^o3fSf+x6~; wSPVt22baLBbMP__SUFkG2U)269zIqayAfWCJo-xHw`i8|LgNCQDsvC*9%Si>6aWAK literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_2.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..11f2beacfbf5c75b54ec1f4497a902aa045add30 GIT binary patch literal 1038 zcmZA0PiqrF7zXfno09cVvK3EDYqzC`2qJ9B!428&6g~7LegH462t5fFFQU~q+5XZYv|X} zpQ0Oh{cSrXBJKkya7RJ6;4>KX4-c}ayS5fvXNCVyWkI#Qg6dTV+*yDOA|=SB|dnFA{=RTQw? zOlcZgox}cR=o}acKPUQ*+GN96{a}|D)o*s-o?d5AsA+vs(R$*F`ib%JXDixLJvwU> z*3s?7?9|@#(+;dDM@ zpBL(b)747B-uRU}zD^D=4bxf|&a#;2CZC&6hQkIl|5cx3&gZnnnZj~H9l7{s_T{z>c#(ZlZKQh8zf=!H!F2mgpn zbid+`!&M5P>Yu6}y9;%y^u85zJ}T5+9#nXc2<8}pJ)lT@=uAJFHe!Rm8uQkR#E2Jh zoM!Jkw`97rbuPsl=XOp7#bsb!X6tYAo+WDPghg-E2=}?;csx&h`nFMB)w<0|nZ>{c z-4~bnF7Zv!gid5N_FwBT&}qF^eXKUYdECk!xGKu|M3i^XvCJXG`*ob3gn3&hP#>u${ipwu`A1 z#OD#*M{$qicHyVFmf9Gj?ZyIaTtG{I-G1`*%k!xyV|=|own47;KhpN@QD%FuD0AJ~ zPu=IJKlu5~kb3XN(r^mL@uue!>6?^?6X^jm_eHzjQ&#!frHb-ckM?<=t@7bMJISzr zu+M%sH{33VQSERxh`o)QD33~5DK>y)(hhIYeL zNfxR9Ye|lfrH|T|L)y`wT08sCF!k9vNd~u8LFue1dDCuP=k0S4jxrXwqvftSn80j2 z6Ut84#Q!o0Rh(-u8K-+0i?FguR^4}(P%psLBzk~D<`CL34fcC-14_H2sGp6xNjFR? z+4o`#<)|EK!9MS{;Z~JFo7kxt_Rx89TLb4%_BPy)b{5U>@rKvQr0I*G#y8XVj(lVK z?xXIo`F0H5EBLDl+AfV*8*Q~7{`if0ti@$O`Ao5c&UsvPDNQ*>eSQ!X`eV4DmJz4{ zc7d`1nH2{;2p&uI!%R%e=QCL60s_jKjHr61;fh$Jxt!O2(HuY6vvKq!e0WXwHDJ0z zdL)GEludJx?iYmdJQ>JO6jVJOSyuPS)?<=k-wP)|=SHC#A$g%Js4sXiE$H|38hJ_g h@Par0hwAX85W@Ni2v}X1_gVL>Wt1&AmPPJZe*s>xfq4J` literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_5.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ed57ff51017e96f2f99f45789ceb9ac2262a293 GIT binary patch literal 1038 zcmb7@v2GJV5QcyIPM0ep`y?n536Zm~1QN}ipfF10bx6%Sm^VmG<5e6HzXCMS@&=R+ zGK7+XK8sVNJ&7Vd$zl0t)`lpeVXWQnX6E0!nYr`x7p)j-eeRFA9&^3oYVfzVSqqTW zWIz_pi-pU-yIBR57WfZV?V!K-!rSrOnl1^x+Y0=aD=#P3iq5^3DvhrZbTu~BpCjn! zDAactDnDVWoHlImwMpY=+LrNCordufxef0-NmtDNO`E}r&O&ZT=AoYK46*ydH>y|chx`+auII5to!Pf#e6T=htYE9!VfSsZa|zRXKuelRVM zEQ32XmO^{pCO7$Pfnv-&>r*|D7CO+;q$Q2+c<`%YKi-y>%_^SdAF z3j$`oct_yj`Eo3L;D2o#lO2D3BK36q(k!izMixX(?ve}U%?*l9e9;N7Z~5!E@V5O1 Dr~d`b literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_6.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_1_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ba4f3a8689cab25a1ab3654627eb9c76b624da1 GIT binary patch literal 1038 zcmbW$J8#oa6bJB=rX>n3NyG$dNGz2{MX3m-l|u8lz{1oW!O~Aqm5DwAwh$7CrHBOt zL%snSX{TITqzoW+Llr|YBLj-lNZ65Yefb~T6=EzWI{xJxpTsxU&h3TFFojXaaS}O& zTtg=CI*LyjBF-T+I1!p7di(b%xM>j`!yulw%;Y8@Xe%fxit%(E5&R5!KtP+bPx@$Rw=!1DRk8zQb0R{ID)B`A@l?H+^Rd zR^F?zEg~vUE01?+_JUG;es<1j6xeEh{V_b>QzHSqB9tOHIjS0h;FR~M1asFi4M4fH z)^{vu9tIs)OsXNSjfx6Fg)*OU4O6V?)B(|n;acbel@2vkgXfCPc!yCb4))nWC-}++yP@@43jyEvdh?@p z3DMSBosHcR81_7hOX_pd=bYxWBF-;vF~j|!3Eg$(P;zO-MWUHdK<*^ymItg#{K u6|5(vaT*Fq;d#;73+ILQZsxe()y2g~%^N9XO7~bVd))ugf6e34|HL23p>gT} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a4ca53c7655055e1b6e629bf836aed6254aed93 GIT binary patch literal 4062 zcmeH|PfEi;6o)6e=*}J?TTfxZy?4-Sh&bs9a)exE7GjsVfei?{Y{boIL!Z-vi{FP3 z0>wp{39s-aukX($V>FE35< z4bBV4hlTKmmBO#q3a@M>+}b<%Q@F9?a*cS*|LnD%H?Q^gzLxspqxRd~sy^MFiGO;R znRTE~TaPu~cLOe!ci;gW-MQ%1gFA2lS0hY+#$!I#!+P0|p&x6se_Mksvu>BHhv>0^ z9xb>AWBzyG0nGX4{BwVVLi1H4On=5>KGwr}*^i+gqaM_2qxI+WD(fNpZR+=U3;n*p zk?iGsv$zlrt_07)Gq9eQ!4-H;ra$8`pVq^AEwUez{6;;f*Hpc;zv_EpdIYEQS2>-} grUM6XHNx~~ydM9L;9-R6&v@jC`Kbr>I>veS1H&`gr~m)} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_0.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ff64e4dd383a20fcc6e702b610c2e23ec06de673 GIT binary patch literal 3014 zcmZ?rJ;u!d26jMF1BfGl_!|&20wD|>;bUL`VJ4se2m`@?5P&d8$pTH=)J2wg1M(mv-hXr`9&pWkb{wx!UJt zBeN@Wv>~BGp07zxG|}8w+-)h0V73IeF9>F9=2?!YuYXfKa1!@!A3O1I;3>1rmYIxq zzJ7qu5B3*@mCD9SabxB4U-3=1rdO?3Gn`iMxH7yPelFu=v{- z2X-NH-#p2}5@Yi}@ak)neU9v5i~o`5ct6fxI34UC;LuSz#jXY3xjt}J__rxMri1&y zZAh74!qlVN#bdNNnpuLU);v!!MY!_{6L0OXueE88&UWM%W@zH}1 z+#h&2lTSi5&ViGhoAXm~6xyUcJ4eWD79*~j@A1j2C-3oz)l<`69t)3Rgj1VB&EDQP zq(NmsBLFQLu7z9o8{OV8UgY@^PZj4!Q#f>b?x_tL=X~f2>pAvr5{8DH9k|tSzdiho z2T#vmA}__1{b158+y{G0d^JLLbIF$+(wcIIN3o97u2${A3&T|gH3aauvQ>rsk zVTBjARSwp%ve8-(CT=NEjh}4!ynTI>`Q1;cy}0qfX?~WT#5)fh=Vx8tIakgli5B~f zO`ZgtZrK@{aWg+pzp^2eM6>(|=j3W~yQO$F``SW%L89V{TLUY(Pw7OJd7_V|)FVdg z$(`DS7>zSZvwRnxD9%hGbA!5(?L06LWj935>%uHq=7@4F+kC_aX8G=%lWF;OX8G=j zD1nUS8$ZbB2qB*ipP{h)k4(>Q8wYZZ_)J|EON>-**A_f7vhDUI7IE=`lM4;A*3R0R z8zb7=was?;dvm6?^_|}Oc}30d%wE`ersgZVaG&YpdmckXl58Ilw<$cZa+f3pj1jzOf;pRkEGP@?z;^WT;c87m=dk;A2Pgwu} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_2.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a7917e1b3edba5003d0c76698ecc53ad2b7a082 GIT binary patch literal 3014 zcmb7`zi%5i6vyA?T%UsqqDBvfh;AK~&4XhG?cBYiivV4#tt#O9=(wo2s((Py{398t zs)$DY38A1NOHfk~kWvV9uiwYhIqB9uL-I#YJo5dfzWD0pr@JJqh^7~jj4<}={;A$B(w5Fc0|h8@iDl_%;ATX zqv8SdGY%VYd6?O^JRo($vz2e?P=PC+yTH^FRxl^j_Cyo)HCGmV4DM-G6pbCh?4D`B zrxd_PbsEy-r0_plL^7SxWxsMeO9jVEx~#a^!43`+Ixm}I13NebGDKx?RPhRIsq&r_ z&pc^M$_dZGj!foTM+jkUFQBimI2BC73e4Qlm{bD;OXeh;zy))p5f}#{y+Jq%*X)Hu z4K{2Kgc+<5hykgUaDjwoeufW}dCq(ORpPd1n03oPw`;t_?Ut;p_tf8W0lN{ytS^+8 z7~YbDsZ+4&*dd0zv~F-%PVpu9T6k&2bnxh~T2jltWw^Jz_NS`)E4#g%3BT!hqN+5I z(7c-YiBj>N^)$d=(TB@_vmc9|*CFYt3mu!~NBqim`o_GnW3idnQFxRO-hvyLDRJHI znmQdzD2mMC3=wA1+a1>^IdD|M*9bSxg{h3ncVhD#95u3pIIO_VAba>C)X21CvQH)| z_E-vge1T>my=O@t9)aEwb`y`l3*tslcq;!zz&ZookT27*)b^fXXRrRiM;$f;DX%Qs zW^~V08c7LC;gJT5Q_L3DjZBHD+hZ$mif%y$Rp2$r!GHVNqn@G^O6ELMmexY z&!}{6W?;e@Dqht$III+}!zC;Dr{S0KvC*Oyf9)=rBo=~;O{{~Kr>XyF9a%PYL`P3w zZx|a%AZfi=OWY)<hPBos>hbomcBrFEUdNs};PIzGDcf7s65_Z1t(IWSN6GRWxXsn^RnQ zQj_tMH8^D(kghbG>IXTQ_FUJYS%SWsSoXxk$xU7~=236P%Sf zpprVCm}~C1H^j}pUjyqpzLOy>HHq$6cl>VoVkK)t9~Zw}NP04V`IC4l*S1Q9{lFlZ z{Gyj3A-8TEcYKi<{zA@Lw!-H%W+Qw74m9UE>GAuerx>lF+&GlGNi%`*hQOzEJT8(~b;-DMGNh5Y9Ak_hBIGlHD^B7gAsVb|#s JY2@>N%0K7|VVwW~ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_3.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b46b3b693fbc9f2641a069e75af63dec8854faa GIT binary patch literal 3014 zcmb7`L2D#M6vtnu{me3Jc~W;ukOn zzknY=NG&URjJLgrTabeu#2Ja04m+9h|9@589YH~B=;>d-e(%+**RNjp&RgHz5*_#P z{|b(`ar}uR!>=9Ru8Qzjf`A7`;E4F&|Ce8MQF$yf%&ca+y*YOi#>)_TdB?EtxQMLojbtjP?RjG02(wcTGe(pr-o&lQHiuYpku~T{fN^AlmSE_6 z{wGoo=|*XLjbOX@b*^;Bbn%On|H`Ldw~neCIz?z&c`=i$<$bBzToqFH`f#7**&|@^ z>T|OuTV+zCIyOFZa`+KBW*c~(OsTsS1`x1%~($R|>StDQPH)iGhQ6T-ZnLjP7c z|1^ZlB%d!szFb0%MS}y*;6?cv*plJrU2urpJnT6r??&6-DW9r-_yBl4y@sD=_d?|l z)&IHjCVV#GtCk1(*#?hq~)t8HvFV6W$$WMTwVr8{k^N^U~!GLU~DzD58*U1%Ne;muf&nefKaCOFLX#?rpv zvBmh8V4Eiv=)^q;127g79YOzZTqpU*kY|ZM1Pe-<;}8C2Ga0swwUB?M9M5G1bN-@? zMUCZ!XeF|Wvh4UkiXW2B;80%niA`-^ZTVL1jqBviZsaxA>Kj(&6Y%tVMZ{AqE^B4v zIa_?9VM>V^!`9`TH!5&dJ`G-~CafW2=4qHAJq_*^#j`LgBWLE6TZ;J^ayE<$@Cw^O zSb%1-Dnk^!t7&Rvxe6DvdO@}V+j+(9Yi#yKXsVKB1-8}PJj2}Jb;;&=U`)oMv8Rq| zT;J5pW3;?9%wy}eTXt?@TK4` z_O9yU_uHrlOAE-ys2--1`V-NoPPUtrae!~+(Bc8a0eN|oT`xDjV>d|QaIWLl5%|rM zUgw>&WB{Mz2VMMjveniG;wiiM?LFk#(j5BtQ37g>_)F1`0bL8qI1b4BJs9kueK4@i z_d6Z?(w8^*%(k|6<0Id)Tdz`~z~=~u-hiJ`-p7V*)#}@}%o%49wHccfUg7}feSU2A zO((Z9?RmTQt-c+XT?{fVx)@}GO^d@Uv^BQerkwISDnx$+r~GVymr`u#Me{uMHw(`4 zG!@yVM}a+)sboZr*h`10 zgt?$$EE9cSEXOqHa~+62q9Q;iwKRT9q|k(QnWYyU+d>vU=HffcswuV`^z9*MEtQ>? qMirT2b~WgXi7+Kk$n4$VO>!Ao!>=RLjebeRcbQ;gs6N&I$M_4;F-+wE literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_4.bmp b/docs/Touch_e-Paper_Code/c/pic/2in13/Photo_2_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..749976cfdd73ef87e2d04c62ff3aad191dee8364 GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/2in9_Scale.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/2in9_Scale.bmp new file mode 100644 index 0000000000000000000000000000000000000000..55a9bd91400c2efaff5f02d376025ba07ab11bc1 GIT binary patch literal 19062 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 R$~ouS;yN9;=lnWD{tJy$DW3oU literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Menu.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8a30576792aa7268d54a30997315a41b4d7441de GIT binary patch literal 5182 zcmeH}F>Bl~6vv;rAzSW-3<(_d+VRF3jvRFFcgRNwWVylA4jsCb<_iS!ReVrNr}!h( za6?vyTO2T_{+}efHb}Cjv;^sp{Ve_br1#g8&L2Nro{=n14F04SvgSV3h$L#r{TxSTVY!Cb9nIki;?=h>A@`L8` zx?s!9Jtbv=PWHDvJbH2Ko9`REVfKe{JAdn&2P-#gG*_et7e}Jwmf-B;rccRFHSYc1 z6-RoN6f2Ih{C1M>?7F1Q%dcz6-QVqZcAd9y^@1wOr4R=;%(@UL$rWyHrYIqbR64Wx zL$maTdpp5(-TmFPZhhy#2;4x7f%!VR)F*=>rD+~FkG!}eQKrBOpHk8^`fG_cip#;p zY#O;ncM9R=@UnD*?>v;b)nBDMr?{e4PNukB$Xzb$_*A(Y6-U*IYUR*`nc<14-qBg$u;A(JRJh+D1xyl!J94)n^ zPBu4pq^(YTHz#PN510wA=ngh4ui$FVdv4{mGu literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e12fd594e54b7326e1219b72f1c170d4f5c79837 GIT binary patch literal 5182 zcmeH{F>b>!3`J>V@YXEdz4j1A1a$A2?4SqnRRpy6sJ5;eT|kgZiDYUicGA66U^5b5 zzQk`jFR!OZDC30pr+jq)6UGidWnli}fi7C0drArLx<3%V4E@Sy!%SGtddT|J5lMBEH$1Lha z6NgQ10X{f!sMc_NF28zKs29c^&H;>NBi0+!T&9;gq|VwG)T1HXB1$mtE$~4^B zl3wf+jWfrFv)xPyX}9-n&L2K0F?0Tl<0|AnQ*IzUDm!aIYOX`dIk{!@K&_2*U u*zN)KMST$m^nX&EsH6H)`yn&+MVzRk`cnHLGxbHBsH6H)`ysP`=*thZFaC@G literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_0.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..adb151920299fcb08ad50d2b55b27c97d11ecd0a GIT binary patch literal 614 ycmZ?rO=DsJ13Mt80mKPFtOvx5KnMaFK=~tl5DXT86951IN9K;QM?(N-2mk;WQ3kmH literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_1.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b283c5682fc397ff001982a7b73efb16669cd9b6 GIT binary patch literal 614 zcmZvY&1(};6vb~o$cGJiXrNRxGE)qgl}%f0GGsb06meC_R$Ry|lIS90L4+ z7`l;KLh=u|utpG}kbxF$F_=XlH5F{6sc{j_=zu0rIEFOK@VU2fr$Pm!y;ef>Do8LeCYNia9=XIg*B2kwil@nC z-~dZvvsZ|chUNjjfVa$(JLIVbfU3CNpWPuL#*Q{Na#qmFvV1lJ8!CxgAA!B3FUK$) zT3g@-xFr`R=@;vbz*v&s0X?vGBTgMSIq6qFt$d645>6jZ^0;e18}SM*Cq_v2m^T+j z5;hR?`Ss@Wv=U5sw3(NAu|9h(b1X5Mn7VQ|Ubn&-&|P|5)o;|vk&IIdt%!KTEay&~ zpI$opNUXdv*T||X%y|W=@_x8xt-3;E?u#;iFnHYG1qawUJQn)#1R9KC9WUP|)2@ax z2TCD!{i}NFK_m476i)yR)p4>pbq*8(?TKodw8c9B94Z~pr%6hx0{BpV{$847Wrc;u a(fPMNlEn)wFfM1Ce!@isx6Xd_fBgh$huqEp literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_2.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7323a21923734fed337774682827ff7006a02876 GIT binary patch literal 614 zcmZvZF>Dht6o%hjDx4w8g^dXx5~@0NXof^k;fRF^iIIWfCZ-BqMWsqrb$6%;F=Sw5 zL1ANHW#~k1$j~852L@Dunk%VVA=)&N3T+hQzt2gBBJr%>{_gob``z>XhfiIa*gc-- zSOIIEr?F$S%eM|9~w>#U-u&(oxbE$jQbXK+O^1Zd)G1Ae% zGR=G&V^8}Yb357Y;v+~fr}>kev%2&CnzX;v8^uYqQaa(g+~E&wU^92fx$eM?D)?Uh z0`utAx}pzgmB*lL)*x9zR@vzRFC)C@$6K?1Ka;;7#oiIx#b^(v_>AQ7*S0)(TdH)H z(s+1SzxgMSrt=sWnu51qBkFTcM|#m423*r~?mjJw@jGEuY*}CLrQBm?n3Wp>hF}?+ oRRM@8e^OjCpfYxys$Z6?E;-CUEfc?{qt#Z-ELrCTe!c(N1+5`6T>t<8 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_3.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3cb9b7ad80ef42b18b6d82e059d7e025d0a35990 GIT binary patch literal 614 zcmY+?F>ljA6bJA#t?&S9#Ku&s6J==`kb;oOQ5Gip8Ipyy9UCd(EOqFD6h;P6_zvC4 zQ4mojg!=(1a>No7qP8M|Eua18e{P5Ltatj|`Ms0x$$2BG#ghFfaT>iw=t<|^--lQ+ie3LXz$SOx2w9x{evgQhTE`t2kSlieGmr7%J|jV z^ZIMJFOg*T2D`zD85@bCc{JR6)V&pJX@g(+aIYx!g?=ocF;u3szLqiGg(?**KYZpR zc#lY#^?!6NPi+9K{!JyUN>T+F=M+fz_4XliegY#Jcjzgroj>U|TC8?H)H3Hu%6Vj@ zW|<>T68@EqG9AoNAYVZoXxZ3!7|$X)Ef9G)o(Wp_;bl0!pkvXm{S5NYZ3!*LpU}^Cmg_30d literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_4.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e837d1d24d520e451844c5afdfadced9d687c36a GIT binary patch literal 614 zcmZvZ&q~8U5XL8MXsXmEUbKh)I~3_jdk`#AyQLI7iLbDN=(XTM55=Y@eFRVHBlrNK z0SmqP0)nm=dlAW@;7Zqwvq`ZPoG{C8zI>D2%rlgmShV+v-|UH#_>-7Z>1a+H;DY10#Aw31X+lZsv`Nae2JKG7 z%l!&RrP+m8YwirsBZkI;zvdGM7pBRxXoQ{&qCrnDymNuImf4fPv@Ug{sO5g7pGo3 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_5.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4b014288363e95f4578169d138a5c4d386e00226 GIT binary patch literal 614 zcmZwEu}T9$5C-5m6HF7l7Z9$nNhNlP5Hn!!J6QP)7QsztBlrS=JW5Wm6z&l&V3E#j zNZ|(e_V?etAPVl?9^cL_b2EF_H+M&p#)QuS=PlKM%gXy?Xpqc}{1_Fm@FHQ%Jak1v=?$=WlCzvCOte?Y|m literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_6.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac3fcecabd8655bbacb009036798c960c0b62bcd GIT binary patch literal 614 zcmZ|LF>4e-6bJA<4P588DWa>5q%wk_7V(~>v+x7h1p;=$NeVd#%yrj!g{8qQ{Qx$C zk~!Hx8eu*_AiE*pHp1Mp;N5z2^Y=e{S7_lZZ}{z-x9=^p_x$Cxs9ino+l+n2Jw}I5 zSlc{5y|IcmvEBgu{rZo^G<|=l-)k37pBVqN_eMWUo8rD$AHTKwm6@xd*g{Dx>X)kkD1kfCf?_}WDp zSsCgfE>g&fad4wViDlvZ#NA{c1vUFnd; z;NT#la0>ksil8mcm59w!Bk16eaxGE=qV%*^av`}qzE%ev{62ghKF{-P&*%ntxcSrlR)p>UFv=z1&(*8}`app5pTG_DFKg$_CE7-B4!to(&d> zBzF3nIpbM!lIZ+Oe%;J?b$O~qx1Kjv&H467G})r$($0I6+Q@cfFbCD9w#7CV**OF16n%2!O^1yF7Yn-bPO`?cBfy2o z?WQAGb*R9VOLFrgjB$d_D;E9(0YfSaixd`ebE1$&xFA9l zG)u6s)Xs7b3>>1kr53^-L~a}PcC*6mnwS0hZqGdA~J1sWSN20XR53WU^>0O6U1w^Ey$iL%lP%_hI?Y9Q6>6cJ5cc9bKCD zLj+R~Tc;{dmacdnK4r>2-)PQg@edSs`|8S~S@jVsWs~;GT}mi3@W5xAUy0qek$J_< zlU*uW%4~?yRa97Uh&}X}+=-KT$oqL@BQZ=UbAG8W|NZ&QdnSenWS@22FWrCP!Rwz` zAizL!f7Ezv#+JP2r%w$Eu|cHMH7#BZ39p03Ge_JB2u|x(w<@NA#jH)g*TAMdKymx@ zi0hWkgRx(}<7vvw<^Y_s!`jQts{!(SAnwKHO&{64HO+c^OaDwPyT=Xdyc5Z%?sndq z-#`R4KGoiKxq){&<9gi(P-?(yVVfUB6P@B2J1 mC$dwS*J0&EC!V$RNG`R^tCq50ELnSwOzxEgANmOn4E_QFtwqoP literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_9.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_1_9.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d1440514f9ef78e6c5aec6145f3caa06a293c52 GIT binary patch literal 614 zcmY+h=lr#tRa=ZcT2 zRFBSYtgqaqercU@GHcNZc2I@5Nm@GrTHocm;UdXU$T`qbW`jCTA3?)*E;(_C(ZXTh5vock{3k-b>!3`J>V@YXEdz4j1A40P|A?4SqnRgAXxsHb+-=m3ILN&HkR#YwuC3S@%j z^EdTD=jr)yPiY;(^&#$tXbiClzqCUA{f;-^;H&qZ!oIx%ej5tJRqpg7ag{SAXZM`1 z4M+2c8_STvsJHAcaC4suHZYN!p>w7;c8ObwhRD4@|BNGkzi|6?;ODCT9JRmoTxa`D z&Js5cJ=eQ#lUs>j04}Ii9Qrb$_qc=`E^tdYXX2VMp4Se3imA`%g`O8*cCX+Pmbnpq zWv=}!ID*cMa|(CbyMi03OTr6$%iIKR;rdK{;!M@w$urj*<`zC)@PYHJ$DHd|zHczv z7P>XpS?0tS2i=PEE%YqrFn?MjKac+Wapv5$p4Snv;^t=J0><6Hm7L6<*?n+fLj4O7 zLFOLED2r7V=l(BCxowx!7xg7NpmU&epmVT21L}+VA`a;Pq&QJV^`-PfGWA8AD5LsP U`XQP6B2JW1eJTBr>>v8_4X9V%0{{R3 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_0.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2bd14a276a259844718d153dd77d935fd0f2e1f9 GIT binary patch literal 3822 zcmZ?reaFWD26jMF1Bg`^85rV#G$Rm#zy_fF5hw-=K#BkV|08op*`pya8UmvsFd71* dAut*OqaiRF0;3@?8UmvsFd71*Auwn{008EQ2i5=p literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_1.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d62569134bfbfa1a14bd69d4b4b68bf2ee1a4ab0 GIT binary patch literal 3822 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 ao^tW={9jzg^2Qr@=?@QF^z23dhx`NWN#kVz literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_4.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ca5f74b63b9242d31afef4a5aecfac4db194c0c GIT binary patch literal 3822 zcmb`KU2GKB703Uxv))nvHOfs6fg?d5Ey8_MuM|C{jb@v>wN_@L+WlrKO-!JPv6#l~OY95C)O69+q@8>H=BX`dTfF#h@rZ`hbj&?oSpDLWwSR+>pjD<4R&rJ_*aWmqk&GNSG z>FqJq%tc0SpL6xXOUS#()!d#}f$iS+PbFIP$%A-pPXxHYaLG&CZQ=nsEsb{NQ$649 zVw2(Cb<{3#0+CZ`O*L^*XljWO95Y`&mtq4{>c;{na%!%#C~L@@+^&}^sBhy5@r=j`U{qfkY}NP4ex*gp4ejbc zC=pT)Z;PW*UpcN5q&rTlRpAs%ohPwAdd`th zV9D>kty;N2>tiF4TN531W@{p2^2dLiYvn@CW#M(c4Ko^Wrf&*IRM6GdjSv)!dr$@~{NFD&n=ymg{fxb2KYh6VATsxOiP_2y?YNWAxyW#2wyr~pqiaxUxud#l&jinExc0)#%7SI^t$8o3AwQAQYg z^kx=Qz-5!&CV`C2Vy)sTTN{;dko(dp06Iz@zQRo3UMry;SYv|JGRKNK6fn-mfvw!% ze)MDFJ~DU2&qb=4iK zG8fKe+qu2^{yboZ&%=otG8OT&Ur2AukB$0LlBuzq{mUHrLyB2)Y5sL)IseMGEzeNM zrDHb=9r{iC>+_VlL9_IBwG`{zW}x~2L(Uu7LZYz9&BGW}b+boUOaYRwuqmvnRL5kT z?YG2<;@8_0I!c%896f6zCsO$wQcK)N{dQ0{`;^?%T>f;3ZJMh}EsKX5~u_*&-teO7?uf=awbzoi*aqTSePC+T^SUNXIL? z3c#v|9PR2)O5!L_MMsC{=?gm1H2Z8Jzsy}X7y5Ojw&}!imIs3F?OwiyKaIcebw93~ zvqf&E?X3KlVbdH73oz$rMElXrE6&HehO3idOz6x2yV;cbY2E*&6HwCU@`p|3H%D0Q zAtMsyDbXX=XUX5p(1+3EQlhzQH@JK4sYgLP>fHSG1j2$b;!>u$kNJn11O@gvdg|O0 z`eB{=JMcxmxV$v?VK+C=%rOZAF__-T8Ga&W9Ez6xs9wzRuR83wtey2dAf08<@pA8s z)EfPeSt|8$vG}#S~>g2KKa{CIo`dNm;@cIwhzw~Ys7uv3)Iq{vm?OQr<9J`^MODjp$ELWBt#k zn)NkO`W>bR4#Ro!@mvL&85f4}eDU$zf`ZN7GQRt@$8({Y%34vXec zed8!+)sCNV+JJ52Jgi%C%X7U5BsREn2y!WQOjNfIoL}rnY@DmVWp13fgSf0QuW-wu zQZI>%4fd#{hs0W?F*_HrPaG55=-fWIc2Hj|jOwwP&J9KRVD&(So~l(17r(caDVY%p zZ2Cf7z7&x#i5*B4aL}0xThooWSiq)6Vh8qv+&ntxR9`^nGBM=A6UueRR5+!2QOgq{ zdtJBVfP8>;Jvk$>3OhWXF)^R|bbXY)HhD|+ zcPh<(!@a>T?$MnST3x4e4;zQ*G&|Sp9G^$~h^t||&Ru2!Y(ncL_c#0vesO$fU=^*G z93>k3Ffp%janioZ@lnB*4pxZw=Q2(jU-yMi?Qc2S6^(?uS?2dtc0_rd!!L|8&hyGY zEOejr_8UikoV1yB+Q#8E>w5H0m=7$oPOE4nR+gQ;4@(BTtJz76DhNCPbIm$>KJn=)YW1*Uofq zI&qDdCNBlAS?EoAVWc-J8{#-Xc-q0|oDTfu4fQx3*yuAw+!d{aw=lDptD_UWzn0** zGaKh|h|`JQUrR1DI3!j@nc(I~(~^9P3ip7QT(~VVXh2S9}cE)gn>U9vU3O5>+AAB`1fts3jSj9c*hGIP!AVV bUXpVWN7wrZhSoGcOc^_=Ihge1{fx!`bswT* literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_6.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..162d06e13e7f9f5b4432b0afb7cc1e9db6ab17cd GIT binary patch literal 3822 zcmb`JzmFU>6vsVUlt~d~DTx%$k)WWAlqQHHMl@9X3qV9c3%cft2v2myQbd}6Aj%f} z14wD;ZjMEoCd&N-kusYtwo7KYB3|8`zkHwVnY~|uChu;%_VdTj_Ve?PufKhLT?M(v z^fP{+W=eg>-;94Ef3W`V^aVvq0Guwqm%LeHzop?PwgeVlmzcMOp@K!^{D9+%J@wo+ z#^gFv!a1*5tN2~y{H|99b!VsOc7G-3)#wbTZeZ$wZtc_Nqu#-d<;^Hf&F?l&JEuu~-$&C)C>3CV6zEI6{( zwuxKS8?Mt%N+MlOYio4I*=TRQq&C^>4BeGPnH4R0;jE~-1(U>4uSF+PjA)JJf!m=n zaVxeLMx;`^=qv`#|3YQr=I~Y+kw)FLES0@I|2dV3Td=2I+FKu3S|2#v-EcKddJJxx zQKwP2DN=CL4)*HqhHw=Z4V^ADcbRZTlz40hu5_A;ZX~VSVvkby~rc?1Ww@nvFbr8ukvUt7RWhV7Ycp| zAKOBS7;>@~lSGc^Mla;PuM$^tH};$knOR>B0Ta2BL9%Hdxwt$6zcy(em~b?Eq6(AA zB)1ty2pF-aGC37P`w+rhHJ*vXc=1;E_NuSO2#yFLtZqx&Vg5LJB*tXERew!1EZ`bkkBAc@vv5x449J z8dHv^=REEE`X>O8seO#ae+0}nu z#?A1Q`R9xD)%8UB{r|wr9Wud+n{O(j#{nlNEM)?vc6^xpCy2x+X;8 z{7*esS2>k@i0)?eS_@_Wjb!aKhd1xeo)!e$~$! zN5MEX-f%36bKXf@ag{CEmK@{F^&Df23TmDvuDZgOZzcAqTz9oJ5}C-o$M@9lky|$T zRGtse^73?iz$BT;uTwhtrI8mA-tgXtT$wQOF-46M=fYF%5Jlwd!13`Rvr*r~e!Jk8 zL$9>lea>js1_`eVUhF9jI4KLflujAa?wXDiO>r?KP*WW6A!K+Agu(G{l|qt&*p3EdIke;XH3YUz_Oq@L5>Mo!QW)q!FX9+CVF_PCA) zFg#1#d9F!=4IC%A-*dn#uIdE|9Njq;E~7o*nZ7`!e#vo34X*}AhrM_=XG0LssBrFo zIWi;c|0l;=OU#fn?Z?cVmpBiLb>#T!H0_P^5X(L1633m{@UXZbJ=a;;41k5LKDj_` b>~Z0ud%cxI<$?rzG)C|BT=6bWy=VCsq`y9< literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_7.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1c6ae04a7c2a6054be40195aae20b2a00d3b3a64 GIT binary patch literal 3822 zcmb`~O>Y~=83*uZxhhuz7_9>LAR~&FMG7lNx`G}qK*rF% z%>Fp@?CiYx+^@fxr93rpd>wy3b%@@_*}*@X?%?^|qrW`k=)lb1zx_e3Pxd%t^UjJV zxX&)pGoVzL4)_bECFx=-=I_D0lQEBdP~;v(w*G7 zReIYUsI#{Z;F3W!WG&hJ0gN2qI{$j^Hi^!z-`Kf%n|Z=KxXT;~=F7G`>RT6VrUplL@F`h1{SOyD@Ih!-~B35>Gm!mXf#uFyQ_=2U}W!%sDac^Cnl!=_HtxoNkmMsk}p~{A&@_nkK`QY?*qV@2E zOvLs2>P+Egt((&50dQ+@2fU}Zs8yn$!CkG_Pac)09FC?k1?Np=RL0ldHNkUqoDVn= zcWZO69l0vpk5be>`=OK30;d!hKdJWA7knThqIdVWg{Mdy%~(fn?wAF8$=pEwkuwpA z$nPIJp=L7c$i<0ma+0my&W|~h`>bbu#Ga=h2jr(->dob@mRzNCKj%~om@DHW=lr>S z!j>o5OU0SoH85nS))1;6^GrTvU{05m-<7jkEv1{Ckb+ytwUD!tN6=NgT zrzyrb^5Bc4+y zl|1Ty796k`T_)F{JBF|1^`;#0<^+d`B!;8r_1(SCf`mn~9Kt26PULRFp%~(hG0Uco zW^=l~w=5Ejl7_-i#kAz*Ze$jN5u&vXoVuFROzfSpE^VS-jC+-T4>8nobCMV*cRj;N zD*KJxEp{+bFh_;kOnE#Rn>FS>Yt`j(%y4l-=!e7g++o&1`}H#vaqONn+x~>t8)#6e zpN5571tSq)is5n$j?w;QSak!SB$uURfFO1vKsMW)gx-+ z3ubz;i4KMM_PHy^e7bNGxa>QJe67X8X*jJNZeW;Sgxh2N5$eSti1J0enY+ukoCCC& zp5bM<^KgAOl*gA8t|6bXHY@jg37WaHz<)=v0UW+MDR-B7KXO}$5B0DytCb!Ww6rrT zZ}7GjaOke>mb+nH={wgw^{RDQ#}^wcQdyL@+AduA|L(O{doR!u+Q)d1DO;zT9dgmo z`_XR{9oJjS%R3A)>DVPTm8iYhQSN~G>*yovh@T-oTJE6*H2HgQ2?E92EOzfZaHGg6 z9NN#&n(Z%9%fkyI9dx91PaTZ;B$~6X#`qqlnmaG_p5-oCm8@?!p5n(Nj^Bn3G?TYMkFFT;1k#JuAx;tL`aOkE8?+ zdS*ly|K<(8bBM_~ydw7_qG~aZUxiE3m;Ob|H?K^J_r=6LLMVspVk3krNtDF>{)A(C z>EBeD9@JI-z9;~(2Zz1pBHq63q9kU4o~NnuPbybV-=eqhz%CeYLWf&%?gB6)vFKqn zdl0&x%x}9Vos`3z~QM_ z(S<9dejnOLskF|hhP`>u#r({F;Tq%^47k)b!&s&)rLePti5NjC3`v~92HORBkc(!EaD_Aag6 zAHmf90e>y9%QM_yK&L3dgL3FZk(*f&g`8aoFxrH4E;`qRVz2v~2-Z)V9 zH02APliwmDT;r!M9KUAodT|!wbn(C*$t?$2%*m9!uJC|8>;8%xCrnATu&a{s%*AhnN-j`9=s-!Y`E_4LCcSV=VOn z+~gWzds)>GZs91#7S83^AY?Dt)pgm2Q$yt{eEXK&0O#d7DcS1*qoEh&ZfdYkV7`69 zAe%&WCE6`qP2=9@O-4+yyrT_o{ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_8.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_8.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c55edcb82ab3299271273f6b0431567a8b87304 GIT binary patch literal 3822 zcmb`J&x<5Q7RRGVnNk=gXPHaMmK}=1?9rw#B^Dk20KF*q7sxDq7(6-BmtE|c$fm%& zxR%Ra6dLnin3H%AD~l4#!!QLN_OgqeH3?mpVJCCzFj008&+m)O`eAoFC!@*i`0>ea zy!RsFMZNLv|E>sMcJclTo|hUzypR74{BgO9@$c)$choN;+HC$IbwzzjC?`q-a@vNJ ze`&S7(;fBteauISte=Oufddy1IYlvL_pEexy3HW<+<+{*BY22xNlyBYb2_>11hwyo z7b`9yD=ThHv{IB-^nRjFE;1oC;{D%8Ph*?{ppDdorKEGlvpf2*9e%Ps2Wz-K(wicqzbP$#fl;AM@i!6QVPmk9&WU z`v-OttoB@j?IU0k){Ibo!}Z64IUk7ofND;IOQ_He^M1;Wek!)!thv-zscF1R1vrlKH<%|)I+t>lZGtx>@00k zra0?RdWKUxuV_&loC%TdZUmkS;dyQ;9x3qcpJxh7|+vb zq42*@Fmh?%3m`P{_BGT3x0um=m9jHS?kWiG!Zc(wXc+RSwAT$M2RKu6)MBjS z+|#Jp07PkT8gd~`*Bsll$x+WpD$PE!j@sn5)QZ!rNAV~Gw_`P8u%Wjlc`(9bHE*&q zb}}!`wo`}56zh2+v8s zB8f22us5S0_S_DAjz(jHJ7i99u9G9wrtySm&jrW)Jq%gKPqGUY*T-_wKM%(+lE%lV z+x<;WqeoC#gfY9+JDib*0Z=6*sI}e~3LOF`E{r9{_Tqe3&ngZ+t+_T-Jf~xPLCvA* zYD~>~7W~S-t!BkNRdM5#>}_yBc!k%Tg18lAe$f2^YT=07-@(B|&POXQR721Ga--t( zl-xEZW$tmZ=K3nbrW14;QH*XU3!U`9@fz+gIh^uD6$;MMY3ezn%f)2Y_e*=)QMDcp zSE8&$TBFk);<(s}G2h=nWr|s>-sD^p#?m73$F*o$aYKN+H79#OHCNzwghDhg3HtvB zl-`8t4H6wrD4k~~{<87$D`Vz{E^Mp+bm|?#K7xO7E;EMs|xD{4-4bDDJ_n(hTlst4kL1j`Sl1-ZWW%JfWx+_^!Tb;Vb!`l z_}esri#fOnhH4H+?+iEZ>?Mc*IDenj+!{iS?Njs4+Y%<{lfjd@vVBEjG4t`4Pv#a! zZFv=3?;4xAwC~)!(tOpDEusg}wdlhqa`&&wFEl-P?{PMM5@&A;d8GWAW)A!LTw#AD zbDv4i#rVkvm(G=n+m9r&UXGm{;k)1CLc0^mUJNd4v{?U~S{3KezLLtru|NCOFTV32 z&l}ojQyJy{JnpLV4EHeCw9jQS+UGmL9_ZiauG@Dqd3T37pK~rES?|Sf@4qa++2MP) zG#5eW^W4!%OMZKek63=up5jlL+rF2#LK=<+MPK@Hac literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_9.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/Photo_2_9.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7ba9fe47604eada0a46a5deda31275efa4c8c3d6 GIT binary patch literal 3822 zcmb`KKaSis6vjE3V3opHwOcGq7b#M@Okpe+>2rl3M{v0T7N!<1T<#5=E93wvI7k3r zgNFM+=~xJ2zVDHb(#*&U!^m4pd_(^9{*j{SpML)5(umyP{sXS>cgFmJc85R89~l3; zUeZx-Ip_7y|3!CsvM`h<{(C}PPH&9a=W&;l@p;%nZ_(*8?esZzIoj=j?<A2ISi?>a?BXSkh(|eF8A-?WLMlRTq1^1a4fKKv$q4a8b;84GV!U5HxT;0C593_;NZNylQMCkO1NpE-8T1 z(a<#Z1Y;~N^8!~XRN>O}t8xeS3>XYVL@c{RM)Oh&L&L1?XSgdZOuz%IMi;~uZ?+i2 zJ(=rf4;3P}4@5*3ZZenpBj9!AdKK&`n+%z zL&#My16K8X&NW|nbKRG4D2!jYp#HR7c7$QcU6z#+rCqqVs84cZ3l;8%V{7=;Vj4B| z`L{3R?w;nf%=4W`@~6`LE}Ld@8=P10E4cDWIQG2Q(|mJ!l52GV$Jg>in!VKOoNn$; zAp9gJgnW?j12X@3&N;sOo}i|0+f&fx{HZ3a^&8!A9Zor)^S^l2(6oVieMu>U-uYHK9Gxr!k4H!oO1w@i{x4wW*^hqrRV@A8@Xj@8k5<@GmOC8 zlbgUz8G@`{Z*uu9IW8+X9D&nKZ-w(E3*>OX%VV{-8dsHE{)>H{y>|r@eSz;Nt!!f5{4KS1Vt=wh#KURZ}xsUA=`0Qlnx)NU&d+wnv zm+$t+j+MibnT*ARsHc+|Rt}bC^L)i!=mVua;!Fp)%D1YNR`U>hct^NuwnVwN^ovRP L9JlrCSM>b{TzO9A literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/c/pic/2in9/White_board.bmp b/docs/Touch_e-Paper_Code/c/pic/2in9/White_board.bmp new file mode 100644 index 0000000000000000000000000000000000000000..20e550cb6c3ae2523370749ed79900c861bd82ac GIT binary patch literal 5182 zcmeH{u};G<5QZ=6kc}?vUi%0PRV}geMhK^3VB`^a6e7XSBan?XY#uCM?K2+!BuZGA zxT_ND&R@^XXQ#J!r)!cprTZaY4N;fICVeE*{QFh8N}=4DnbNf#3Ezei@fTb$xb%43 zW1(wg-C>928ApZdn{_T8o%DMg9Dvh);lT>G_v@TzleuVuUG4YH&%)Wb#kHAB-3<04 z^y1@AIJd!td+`z+zpnO+H}umFFz%992qKq%pMxTEPm>Mm$S!dMwfN1RjBta2`Z#%B z9tvkik5MG`m?Hh8D9AF&83%4G**{c=H`8)R$?u_l2W#71OUU1?K zQ|70 Jetson Nano/RPI(BCM) +VCC -> 3.3 +GND -> GND +DIN -> 10(SPI0_MOSI) +CLK -> 11(SPI0_SCK) +CS -> 8(SPI0_CS0) +DC -> 25 +ERST -> 17 +BUSY -> 24 +INT -> 27 +TRST -> 22 +SDA -> SDA1 +SCL -> SCL1 + +3.基本使用: +由于本工程是一个综合工程,对于使用而言,你可能需要阅读以下内容: +你可以在main.c中看到已经进行了注释的函数, +请注意你购买的是哪一款的墨水屏。 +栗子1: + 如果你购买的2.9inch Touch e-Paper HAT,那么你应该把对应的6行代码的注释去掉,即: + // TestCode_2in9(); + 修改成: + TestCode_2in9(); + +然后你需要执行:make,编译程序,会生成可执行文件:main +运行:sudo ./main +如果修改了程序,需要执行:make clear,然后重新make。 + +4.目录结构(选读): +如果你经常使用我们的产品,对我们的程序目录结构会十分熟悉,关于具体的函数的我们有一份 +函数的API手册,你可以在我们的WIKI上下载或像售后客服索取,这里简单介绍一次: +\lib\Config\:此目录为硬件接口层文件,在DEV_Config.c(.h)可以看到很多定义,包括: + 数据类型; + GPIO; + 读写GPIO; + 延时:注意:此延时函数并未使用示波器测量具体数值,因此会不准; + 模块初始化与退出的处理: + void DEV_Module_Init(void); + void DEV_Module_Exit(void); + 注意:1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。 + 2.对于PCB带有Rev2.1的,DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0; + +\lib\GUI\:此目录为一些基本的图像处理函数,在GUI_Paint.c(.h)中: + 常用图像处理:创建图形、翻转图形、镜像图形、设置像素点、清屏等; + 常用画图处理:画点、线、框、圆、中文字符、英文字符、数字等; + 常用时间显示:提供一个常用的显示时间函数; + 常用显示图片:提供一个显示位图的函数; + +\lib\Fonts\:为一些常用的字体: + Ascii: + font8: 5*8 + font12: 7*12 + font16: 11*16 + font20: 14*20 + font24: 17*24 + 中文: + font12CN: 16*21 + font24CN: 32*41 + +\lib\e-paper\:此目录下为墨水屏驱动函数; +Examples\:此目录下为墨水屏的测试程序,你可在其中看到具体的使用方法; \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/c/readme_EN.txt b/docs/Touch_e-Paper_Code/c/readme_EN.txt new file mode 100644 index 0000000..74aa638 --- /dev/null +++ b/docs/Touch_e-Paper_Code/c/readme_EN.txt @@ -0,0 +1,86 @@ +/***************************************************************************** +* | File : Readme_CN.txt +* | Author : Waveshare team +* | Function : Help with use +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2021-06-05 +* | Info : Here is an English version of the documentation for your quick use. +******************************************************************************/ +This file is to help you use this routine. +A brief description of the use of this project is here: + +1. Basic information: +This routine was verified on Raspbe Pi 4B using the XXXinch e-paper HAT module. +You can view the corresponding test routines in the \lib\Examples\ of the project. + +2. Pin connection: +Pin connection You can view it in DEV_Config.h in the \lib\Config\ directory, and repeat it here: +EPD => Jetson Nano/RPI(BCM) +VCC -> 3.3 +GND -> GND +DIN -> 10(SPI0_MOSI) +CLK -> 11(SPI0_SCK) +CS -> 8(SPI0_CS0) +DC -> 25 +ERST -> 17 +BUSY -> 24 +INT -> 27 +TRST -> 22 +SDA -> SDA1 +SCL -> SCL1 + +3. Basic use: +Since this project is a comprehensive project, you may need to read the following for use: +You can see the functions that have been annotated of main.c. +Please note which ink screen you purchased. +Chestnut 1: +     If you purchased 2.9inch Touch e-Paper HAT, then you should remove the comment for the corresponding 6 lines of code, ie: + // TestCode_2in9(); +     changed to: + TestCode_2in9(); + +Then you need to execute: +make +compile the program, will generate the executable file: main +Run: +sudo ./main +If you modify the program, you need to execute: +make clear +then: +make + +4. Directory structure (selection): +If you use our products frequently, we will be very familiar with our program directory structure. We have a copy of the specific function. +The API manual for the function, you can download it on our WIKI or request it as an after-sales customer service. Here is a brief introduction: +Config\: This directory is a hardware interface layer file. You can see many definitions in DEV_Config.c(.h), including: + type of data; + GPIO; + Read and write GPIO; + Delay: Note: This delay function does not use an oscilloscope to measure specific values. + Module Init and exit processing: + void DEV_Module_Init(void); + void DEV_Module_Exit(void); + Note: 1. Here is the processing of some GPIOs before and after using the ink screen. + 2. For the PCB with Rev2.1, the entire module will enter low power consumption after DEV_Module_Exit(). After testing, the power consumption is basically 0; + +\lib\GUI\: This directory is some basic image processing functions, in GUI_Paint.c(.h): + Common image processing: creating graphics, flipping graphics, mirroring graphics, setting pixels, clearing screens, etc. + Common drawing processing: drawing points, lines, boxes, circles, Chinese characters, English characters, numbers, etc.; + Common time display: Provide a common display time function; + Commonly used display pictures: provide a function to display bitmaps; + +\lib\Fonts\: for some commonly used fonts: + Ascii: + Font8: 5*8 + Font12: 7*12 + Font16: 11*16 + Font20: 14*20 + Font24: 17*24 + Chinese: + font12CN: 16*21 + font24CN: 32*41 + +\lib\E-paper\: This screen is the ink screen driver function; +Examples\: This is the test program for the ink screen. You can see the specific usage method in it. \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/python/examples/.lgd-nfy0 b/docs/Touch_e-Paper_Code/python/examples/.lgd-nfy0 new file mode 100644 index 0000000..e69de29 diff --git a/docs/Touch_e-Paper_Code/python/examples/TP2in13_V3_test.py b/docs/Touch_e-Paper_Code/python/examples/TP2in13_V3_test.py new file mode 100644 index 0000000..c57b0bc --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/examples/TP2in13_V3_test.py @@ -0,0 +1,236 @@ +#!/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/2in13') +fontdir = 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) + +from TP_lib import gt1151 +from TP_lib import epd2in13_V3 +import time +import logging +from PIL import Image,ImageDraw,ImageFont +import traceback +import threading + +logging.basicConfig(level=logging.DEBUG) +flag_t = 1 + +def pthread_irq() : + print("pthread running") + while flag_t == 1 : + if(gt.digital_read(gt.INT) == 0) : + GT_Dev.Touch = 1 + else : + GT_Dev.Touch = 0 + print("thread:exit") + +def Show_Photo_Small(image, small): + for t in range(1, 5): + if(small*2+t > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_S[0])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_S[small*2+t])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + +def Show_Photo_Large(image, large): + if(large > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_L[0])) + image.paste(newimage, (2, 2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_L[large])) + image.paste(newimage, (2, 2)) + +def Read_BMP(File, x, y): + newimage = Image.open(os.path.join(picdir, File)) + image.paste(newimage, (x, y)) + +try: + logging.info("epd2in13_V3 Touch Demo") + + epd = epd2in13_V3.EPD() + gt = gt1151.GT1151() + GT_Dev = gt1151.GT_Development() + GT_Old = gt1151.GT_Development() + + logging.info("init and Clear") + + epd.init(epd.FULL_UPDATE) + gt.GT_Init() + epd.Clear(0xFF) + + t = threading.Thread(target = pthread_irq) + t.daemon = True + t.start() + + # Drawing on the image + font15 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 15) + font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24) + + image = Image.open(os.path.join(picdir, 'Menu.bmp')) + epd.displayPartBaseImage(epd.getbuffer(image)) + DrawImage = ImageDraw.Draw(image) + epd.init(epd.PART_UPDATE) + + i = j = k = ReFlag = SelfFlag = Page = Photo_L = Photo_S = 0 + PhotoPath_S = [ "Photo_1_0.bmp", + "Photo_1_1.bmp", "Photo_1_2.bmp", "Photo_1_3.bmp", "Photo_1_4.bmp", + "Photo_1_5.bmp", "Photo_1_6.bmp", + ] + PhotoPath_L = [ "Photo_2_0.bmp", + "Photo_2_1.bmp", "Photo_2_2.bmp", "Photo_2_3.bmp", "Photo_2_4.bmp", + "Photo_2_5.bmp", "Photo_2_6.bmp", + ] + PagePath = ["Menu.bmp", "White_board.bmp", "Photo_1.bmp", "Photo_2.bmp"] + + while(1): + if(i > 12 or ReFlag == 1): + if(Page == 1 and SelfFlag == 0): + epd.displayPartial(epd.getbuffer(image)) + else: + epd.displayPartial_Wait(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + ReFlag = 0 + print("*** Draw Refresh ***\r\n") + elif(k>50000 and i>0 and Page == 1): + epd.displayPartial(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + print("*** Overtime Refresh ***\r\n") + elif(j > 50 or SelfFlag): + SelfFlag = 0 + j = 0 + epd.init(epd.FULL_UPDATE) + epd.displayPartBaseImage(epd.getbuffer(image)) + epd.init(epd.PART_UPDATE) + print("--- Self Refresh ---\r\n") + else: + k += 1 + # Read the touch input + gt.GT_Scan(GT_Dev, GT_Old) + if(GT_Old.X[0] == GT_Dev.X[0] and GT_Old.Y[0] == GT_Dev.Y[0] and GT_Old.S[0] == GT_Dev.S[0]): + continue + + if(GT_Dev.TouchpointFlag): + i += 1 + GT_Dev.TouchpointFlag = 0 + + if(Page == 0 and ReFlag == 0): #main menu + if(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 56 and GT_Dev.Y[0] < 95): + print("Photo ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 153 and GT_Dev.Y[0] < 193): + print("Draw ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + + + if(Page == 1 and ReFlag == 0): #white board + DrawImage.rectangle([(GT_Dev.X[0], GT_Dev.Y[0]), (GT_Dev.X[0] + GT_Dev.S[0]/8 + 1, GT_Dev.Y[0] + GT_Dev.S[0]/8 + 1)], fill=0) + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 6 and GT_Dev.Y[0] < 30): + print("Home ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Clear ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + + + if(Page == 2 and ReFlag == 0): #photo menu + if(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next page ...\r\n") + Photo_S += 1 + if(Photo_S > 2): # 6 photos is a maximum of three pages + Photo_S=0 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_S == 0): + print("Top page ...\r\n") + else: + Photo_S -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + elif(GT_Dev.X[0] > 2 and GT_Dev.X[0] < 90 and GT_Dev.Y[0] > 2 and GT_Dev.Y[0] < 248 and ReFlag == 0): + print("Select photo ...\r\n") + Page = 3 + Read_BMP(PagePath[Page], 0, 0) + Photo_L = int(GT_Dev.X[0]/46*2 + 2-GT_Dev.Y[0]/124 + Photo_S*2) + Show_Photo_Large(image, Photo_L) + ReFlag = 1 + if(ReFlag == 2): # Refresh small photo + ReFlag = 1 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) # show small photo + + + if(Page == 3 and ReFlag == 0): #view the photo + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 4 and GT_Dev.Y[0] < 25): + print("Photo menu ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next photo ...\r\n") + Photo_L += 1 + if(Photo_L > 6): + Photo_L = 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_L == 1): + print("Top photo ...\r\n") + else: + Photo_L -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh photo ...\r\n") + SelfFlag = 1 + ReFlag = 1 + if(ReFlag == 2): # Refresh large photo + ReFlag = 1 + Show_Photo_Large(image, Photo_L) + +except IOError as e: + logging.info(e) + +except KeyboardInterrupt: + logging.info("ctrl + c:") + flag_t = 0 + epd.sleep() + time.sleep(2) + t.join() + epd.Dev_exit() + exit() diff --git a/docs/Touch_e-Paper_Code/python/examples/TP2in13_V4_test.py b/docs/Touch_e-Paper_Code/python/examples/TP2in13_V4_test.py new file mode 100644 index 0000000..f030212 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/examples/TP2in13_V4_test.py @@ -0,0 +1,236 @@ +#!/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/2in13') +fontdir = 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) + +from TP_lib import gt1151 +from TP_lib import epd2in13_V4 +import time +import logging +from PIL import Image,ImageDraw,ImageFont +import traceback +import threading + +logging.basicConfig(level=logging.DEBUG) +flag_t = 1 + +def pthread_irq() : + print("pthread running") + while flag_t == 1 : + if(gt.digital_read(gt.INT) == 0) : + GT_Dev.Touch = 1 + else : + GT_Dev.Touch = 0 + print("thread:exit") + +def Show_Photo_Small(image, small): + for t in range(1, 5): + if(small*2+t > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_S[0])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_S[small*2+t])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + +def Show_Photo_Large(image, large): + if(large > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_L[0])) + image.paste(newimage, (2, 2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_L[large])) + image.paste(newimage, (2, 2)) + +def Read_BMP(File, x, y): + newimage = Image.open(os.path.join(picdir, File)) + image.paste(newimage, (x, y)) + +try: + logging.info("epd2in13_V4 Touch Demo") + + epd = epd2in13_V4.EPD() + gt = gt1151.GT1151() + GT_Dev = gt1151.GT_Development() + GT_Old = gt1151.GT_Development() + + logging.info("init and Clear") + + epd.init(epd.FULL_UPDATE) + gt.GT_Init() + epd.Clear(0xFF) + + t = threading.Thread(target = pthread_irq) + t.setDaemon(True) + t.start() + + # Drawing on the image + font15 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 15) + font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24) + + image = Image.open(os.path.join(picdir, 'Menu.bmp')) + epd.displayPartBaseImage(epd.getbuffer(image)) + DrawImage = ImageDraw.Draw(image) + epd.init(epd.PART_UPDATE) + + i = j = k = ReFlag = SelfFlag = Page = Photo_L = Photo_S = 0 + PhotoPath_S = [ "Photo_1_0.bmp", + "Photo_1_1.bmp", "Photo_1_2.bmp", "Photo_1_3.bmp", "Photo_1_4.bmp", + "Photo_1_5.bmp", "Photo_1_6.bmp", + ] + PhotoPath_L = [ "Photo_2_0.bmp", + "Photo_2_1.bmp", "Photo_2_2.bmp", "Photo_2_3.bmp", "Photo_2_4.bmp", + "Photo_2_5.bmp", "Photo_2_6.bmp", + ] + PagePath = ["Menu.bmp", "White_board.bmp", "Photo_1.bmp", "Photo_2.bmp"] + + while(1): + if(i > 12 or ReFlag == 1): + if(Page == 1 and SelfFlag == 0): + epd.displayPartial(epd.getbuffer(image)) + else: + epd.displayPartial_Wait(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + ReFlag = 0 + print("*** Draw Refresh ***\r\n") + elif(k>50000 and i>0 and Page == 1): + epd.displayPartial(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + print("*** Overtime Refresh ***\r\n") + elif(j > 50 or SelfFlag): + SelfFlag = 0 + j = 0 + epd.init(epd.FULL_UPDATE) + epd.displayPartBaseImage(epd.getbuffer(image)) + epd.init(epd.PART_UPDATE) + print("--- Self Refresh ---\r\n") + else: + k += 1 + # Read the touch input + gt.GT_Scan(GT_Dev, GT_Old) + if(GT_Old.X[0] == GT_Dev.X[0] and GT_Old.Y[0] == GT_Dev.Y[0] and GT_Old.S[0] == GT_Dev.S[0]): + continue + + if(GT_Dev.TouchpointFlag): + i += 1 + GT_Dev.TouchpointFlag = 0 + + if(Page == 0 and ReFlag == 0): #main menu + if(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 56 and GT_Dev.Y[0] < 95): + print("Photo ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 153 and GT_Dev.Y[0] < 193): + print("Draw ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + + + if(Page == 1 and ReFlag == 0): #white board + DrawImage.rectangle([(GT_Dev.X[0], GT_Dev.Y[0]), (GT_Dev.X[0] + GT_Dev.S[0]/8 + 1, GT_Dev.Y[0] + GT_Dev.S[0]/8 + 1)], fill=0) + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 6 and GT_Dev.Y[0] < 30): + print("Home ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Clear ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + + + if(Page == 2 and ReFlag == 0): #photo menu + if(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next page ...\r\n") + Photo_S += 1 + if(Photo_S > 2): # 6 photos is a maximum of three pages + Photo_S=0 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_S == 0): + print("Top page ...\r\n") + else: + Photo_S -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + elif(GT_Dev.X[0] > 2 and GT_Dev.X[0] < 90 and GT_Dev.Y[0] > 2 and GT_Dev.Y[0] < 248 and ReFlag == 0): + print("Select photo ...\r\n") + Page = 3 + Read_BMP(PagePath[Page], 0, 0) + Photo_L = int(GT_Dev.X[0]/46*2 + 2-GT_Dev.Y[0]/124 + Photo_S*2) + Show_Photo_Large(image, Photo_L) + ReFlag = 1 + if(ReFlag == 2): # Refresh small photo + ReFlag = 1 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) # show small photo + + + if(Page == 3 and ReFlag == 0): #view the photo + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 4 and GT_Dev.Y[0] < 25): + print("Photo menu ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next photo ...\r\n") + Photo_L += 1 + if(Photo_L > 6): + Photo_L = 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_L == 1): + print("Top photo ...\r\n") + else: + Photo_L -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh photo ...\r\n") + SelfFlag = 1 + ReFlag = 1 + if(ReFlag == 2): # Refresh large photo + ReFlag = 1 + Show_Photo_Large(image, Photo_L) + +except IOError as e: + logging.info(e) + +except KeyboardInterrupt: + logging.info("ctrl + c:") + flag_t = 0 + epd.sleep() + time.sleep(2) + t.join() + epd.Dev_exit() + exit() diff --git a/docs/Touch_e-Paper_Code/python/examples/TP2in13_test.py b/docs/Touch_e-Paper_Code/python/examples/TP2in13_test.py new file mode 100644 index 0000000..cfad712 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/examples/TP2in13_test.py @@ -0,0 +1,235 @@ +#!/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/2in13') +fontdir = 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) + +from TP_lib import gt1151 +from TP_lib import epd2in13_V2 +import time +import logging +from PIL import Image,ImageDraw,ImageFont +import traceback +import threading + +logging.basicConfig(level=logging.DEBUG) +flag_t = 1 + +def pthread_irq() : + print("pthread running") + while flag_t == 1 : + if(gt.digital_read(gt.INT) == 0) : + GT_Dev.Touch = 1 + else : + GT_Dev.Touch = 0 + print("thread:exit") + +def Show_Photo_Small(image, small): + for t in range(1, 5): + if(small*2+t > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_S[0])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_S[small*2+t])) + image.paste(newimage, ((t-1)//2*45+2, (t%2)*124+2)) + +def Show_Photo_Large(image, large): + if(large > 6): + newimage = Image.open(os.path.join(picdir, PhotoPath_L[0])) + image.paste(newimage, (2, 2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_L[large])) + image.paste(newimage, (2, 2)) + +def Read_BMP(File, x, y): + newimage = Image.open(os.path.join(picdir, File)) + image.paste(newimage, (x, y)) + +try: + logging.info("epd2in13_V2 Touch Demo") + + epd = epd2in13_V2.EPD_2IN13_V2() + gt = gt1151.GT1151() + GT_Dev = gt1151.GT_Development() + GT_Old = gt1151.GT_Development() + + logging.info("init and Clear") + epd.init(epd.FULL_UPDATE) + gt.GT_Init() + epd.Clear(0xFF) + + t = threading.Thread(target = pthread_irq) + t.setDaemon(True) + t.start() + + # Drawing on the image + font15 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 15) + font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24) + + image = Image.open(os.path.join(picdir, 'Menu.bmp')) + epd.displayPartBaseImage(epd.getbuffer(image)) + DrawImage = ImageDraw.Draw(image) + epd.init(epd.PART_UPDATE) + + i = j = k = ReFlag = SelfFlag = Page = Photo_L = Photo_S = 0 + PhotoPath_S = [ "Photo_1_0.bmp", + "Photo_1_1.bmp", "Photo_1_2.bmp", "Photo_1_3.bmp", "Photo_1_4.bmp", + "Photo_1_5.bmp", "Photo_1_6.bmp", + ] + PhotoPath_L = [ "Photo_2_0.bmp", + "Photo_2_1.bmp", "Photo_2_2.bmp", "Photo_2_3.bmp", "Photo_2_4.bmp", + "Photo_2_5.bmp", "Photo_2_6.bmp", + ] + PagePath = ["Menu.bmp", "White_board.bmp", "Photo_1.bmp", "Photo_2.bmp"] + + while(1): + if(i > 12 or ReFlag == 1): + if(Page == 1 and SelfFlag == 0): + epd.displayPartial(epd.getbuffer(image)) + else: + epd.displayPartial_Wait(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + ReFlag = 0 + print("*** Draw Refresh ***\r\n") + elif(k>50000 and i>0 and Page == 1): + epd.displayPartial(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + print("*** Overtime Refresh ***\r\n") + elif(j > 50 or SelfFlag): + SelfFlag = 0 + j = 0 + epd.init(epd.FULL_UPDATE) + epd.displayPartBaseImage(epd.getbuffer(image)) + epd.init(epd.PART_UPDATE) + print("--- Self Refresh ---\r\n") + else: + k += 1 + # Read the touch input + gt.GT_Scan(GT_Dev, GT_Old) + if(GT_Old.X[0] == GT_Dev.X[0] and GT_Old.Y[0] == GT_Dev.Y[0] and GT_Old.S[0] == GT_Dev.S[0]): + continue + + if(GT_Dev.TouchpointFlag): + i += 1 + GT_Dev.TouchpointFlag = 0 + + if(Page == 0 and ReFlag == 0): #main menu + if(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 56 and GT_Dev.Y[0] < 95): + print("Photo ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 29 and GT_Dev.X[0] < 92 and GT_Dev.Y[0] > 153 and GT_Dev.Y[0] < 193): + print("Draw ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + + + if(Page == 1 and ReFlag == 0): #white board + DrawImage.rectangle([(GT_Dev.X[0], GT_Dev.Y[0]), (GT_Dev.X[0] + GT_Dev.S[0]/8 + 1, GT_Dev.Y[0] + GT_Dev.S[0]/8 + 1)], fill=0) + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 6 and GT_Dev.Y[0] < 30): + print("Home ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Clear ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 118 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + + + if(Page == 2 and ReFlag == 0): #photo menu + if(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next page ...\r\n") + Photo_S += 1 + if(Photo_S > 2): # 6 photos is a maximum of three pages + Photo_S=0 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_S == 0): + print("Top page ...\r\n") + else: + Photo_S -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 97 and GT_Dev.X[0] < 119 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + elif(GT_Dev.X[0] > 2 and GT_Dev.X[0] < 90 and GT_Dev.Y[0] > 2 and GT_Dev.Y[0] < 248 and ReFlag == 0): + print("Select photo ...\r\n") + Page = 3 + Read_BMP(PagePath[Page], 0, 0) + Photo_L = int(GT_Dev.X[0]/46*2 + 2-GT_Dev.Y[0]/124 + Photo_S*2) + Show_Photo_Large(image, Photo_L) + ReFlag = 1 + if(ReFlag == 2): # Refresh small photo + ReFlag = 1 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) # show small photo + + + if(Page == 3 and ReFlag == 0): #view the photo + if(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 4 and GT_Dev.Y[0] < 25): + print("Photo menu ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 57 and GT_Dev.Y[0] < 78): + print("Next photo ...\r\n") + Photo_L += 1 + if(Photo_L > 6): + Photo_L = 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 113 and GT_Dev.Y[0] < 136): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 169 and GT_Dev.Y[0] < 190): + print("Last page ...\r\n") + if(Photo_L == 1): + print("Top photo ...\r\n") + else: + Photo_L -= 1 + ReFlag = 2 + elif(GT_Dev.X[0] > 96 and GT_Dev.X[0] < 117 and GT_Dev.Y[0] > 220 and GT_Dev.Y[0] < 242): + print("Refresh photo ...\r\n") + SelfFlag = 1 + ReFlag = 1 + if(ReFlag == 2): # Refresh large photo + ReFlag = 1 + Show_Photo_Large(image, Photo_L) + +except IOError as e: + logging.info(e) + +except KeyboardInterrupt: + logging.info("ctrl + c:") + flag_t = 0 + epd.sleep() + time.sleep(2) + t.join() + epd.Dev_exit() + exit() diff --git a/docs/Touch_e-Paper_Code/python/examples/TP2in9_test.py b/docs/Touch_e-Paper_Code/python/examples/TP2in9_test.py new file mode 100644 index 0000000..a893dc5 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/examples/TP2in9_test.py @@ -0,0 +1,268 @@ +#!/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/2in9') +fontdir = 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) + +from TP_lib import icnt86 +from TP_lib import epd2in9_V2 +from TP_lib import weather_2in9_V2 + +import time +import logging +from PIL import Image, ImageDraw, ImageFont +import traceback +import threading + +logging.basicConfig(level=logging.DEBUG) +flag_t = 1 + +def pthread_irq() : + print("pthread irq running") + while flag_t == 1 : + if(tp.digital_read(tp.INT) == 0) : + ICNT_Dev.Touch = 1 + else : + ICNT_Dev.Touch = 0 + time.sleep(0.01) + print("thread irq: exit") + +def Show_Photo_Small(image, small): + for t in range(1, 7): + if(small*3+t > 9): + newimage = Image.open(os.path.join(picdir, PhotoPath_S[0])) + image.paste(newimage, ((t-1)%3*98+2, (t-1)//3*48+2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_S[small*3+t])) + image.paste(newimage, ((t-1)%3*98+2, (t-1)//3*48+2)) + +def Show_Photo_Large(image, large): + if(large > 9): + newimage = Image.open(os.path.join(picdir, PhotoPath_L[0])) + image.paste(newimage, (2, 2)) + else: + newimage = Image.open(os.path.join(picdir, PhotoPath_L[large])) + image.paste(newimage, (2, 2)) + +def Read_BMP(File, x, y): + newimage = Image.open(os.path.join(picdir, File)) + image.paste(newimage, (x, y)) + +def Draw_Time(image, x, y, font1, font2): + Time = time.strftime("%H : %M", time.localtime()) + Date = time.strftime("%Y - %m - %d", time.localtime()) + imagefill=255 + if image.mode!="1": + imagefill = (255, 255, 255, 255) + image.text((x, y), Time, font = font1, fill = imagefill) + image.text((x-9, y+35), Date, font = font2, fill = imagefill) + + +try: + logging.info("epd2in9_V2 Touch Demo") + + epd = epd2in9_V2.EPD_2IN9_V2() + + + + tp = icnt86.INCT86() + + ICNT_Dev = icnt86.ICNT_Development() + ICNT_Old = icnt86.ICNT_Development() + + ''' + Because the touch display requires a relatively fast refresh speed, the default + needs to use partial refresh, and four gray levels cannot be used in this mode. + Here, only four gray level picture refresh demonstration is used + ''' + # epd.Init_4Gray() + # Himage = Image.open(os.path.join(picdir, '2in9_Scale.bmp')) + # epd.display_4Gray(epd.getbuffer_4Gray(Himage)) + # time.sleep(2) + + logging.info("init and Clear") + epd.init() + tp.ICNT_Init() + epd.Clear(0xFF) + + t1 = threading.Thread(target = pthread_irq) + t1.setDaemon(True) + t1.start() + + # Drawing on the image + font15 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 15) + font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24) + + image = Image.open(os.path.join(picdir, 'Menu.bmp')) + DrawImage = ImageDraw.Draw(image) + + Draw_Time(DrawImage, 209, 40, font24, font15) + + epd.display_Base(epd.getbuffer(image)) + + i = j = k = ReFlag = SelfFlag = Page = Photo_L = Photo_S = 0 + PhotoPath_S = [ "Photo_1_0.bmp", + "Photo_1_1.bmp", "Photo_1_2.bmp", "Photo_1_3.bmp", "Photo_1_4.bmp", + "Photo_1_5.bmp", "Photo_1_6.bmp", "Photo_1_7.bmp", "Photo_1_8.bmp", + "Photo_1_9.bmp", + ] + PhotoPath_L = [ "Photo_2_0.bmp", + "Photo_2_1.bmp", "Photo_2_2.bmp", "Photo_2_3.bmp", "Photo_2_4.bmp", + "Photo_2_5.bmp", "Photo_2_6.bmp", "Photo_2_7.bmp", "Photo_2_8.bmp", + "Photo_2_9.bmp", + ] + PagePath = ["Menu.bmp", "screen_output.png", "Photo_1.bmp", "Photo_2.bmp"] + + while(1): + if(i > 20 or ReFlag == 1): + if(Page == 0): + DrawImage.rectangle((209, 40, 290, 120), fill = 0) + Draw_Time(DrawImage, 209, 40, font24, font15) + # print("*** Time Refresh ***\r\n") + + if(Page == 1): + weather_2in9_V2.get_weather_png() + Read_BMP(PagePath[Page], 0, 0) + + epd.display_Partial_Wait(epd.getbuffer(image)) + print("*** Touch Refresh ***\r\n") + i = 0 + k = 0 + j += 1 + ReFlag = 0 + elif(k>50000 and i>0 and Page == 1): + epd.display_Partial_Wait(epd.getbuffer(image)) + i = 0 + k = 0 + j += 1 + print("*** Overtime Refresh ***\r\n") + elif(j > 50 or SelfFlag): + SelfFlag = 0 + j = 0 + epd.init() + epd.display_Base(epd.getbuffer(image)) + print("--- Self Refresh ---\r\n") + else: + k += 1 + + if(Page==0 and k>5000000): + ReFlag = 1 + + tp.ICNT_Scan(ICNT_Dev, ICNT_Old) + if(ICNT_Old.X[0] == ICNT_Dev.X[0] and ICNT_Old.Y[0] == ICNT_Dev.Y[0]): + continue + + if(ICNT_Dev.TouchCount): + ICNT_Dev.TouchCount = 0 + i += 1 + if(Page == 0 and ReFlag == 0): #main menu + if(ICNT_Dev.X[0] > 119 and ICNT_Dev.X[0] < 152 and ICNT_Dev.Y[0] > 31 and ICNT_Dev.Y[0] < 96): + print("Photo ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(ICNT_Dev.X[0] > 39 and ICNT_Dev.X[0] < 80 and ICNT_Dev.Y[0] > 31 and ICNT_Dev.Y[0] < 96): + print("Weather ...\r\n") + Page = 1 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + + + if(Page == 1 and ReFlag == 0): #weather + if(ICNT_Dev.X[0] > 136 and ICNT_Dev.X[0] < 159 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + + + if(Page == 2 and ReFlag == 0): #photo menu + if(ICNT_Dev.X[0] > 135 and ICNT_Dev.X[0] < 160 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(ICNT_Dev.X[0] > 203 and ICNT_Dev.X[0] < 224 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Next page ...\r\n") + Photo_S += 1 + if(Photo_S > 2): # 9 photos is a maximum of three pages + Photo_S=0 + ReFlag = 2 + elif(ICNT_Dev.X[0] > 71 and ICNT_Dev.X[0] < 92 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Last page ...\r\n") + if(Photo_S == 0): + print("Top page ...\r\n") + else: + Photo_S -= 1 + ReFlag = 2 + elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Refresh ...\r\n") + SelfFlag = 1 + ReFlag = 1 + elif(ICNT_Dev.X[0] > 2 and ICNT_Dev.X[0] < 293 and ICNT_Dev.Y[0] > 2 and ICNT_Dev.Y[0] < 96 and ReFlag == 0): + print("Select photo ...\r\n") + Page = 3 + Read_BMP(PagePath[Page], 0, 0) + Photo_L = ICNT_Dev.X[0]//96 + ICNT_Dev.Y[0]//48*3 + Photo_S*3 + 1 + Show_Photo_Large(image, Photo_L) + ReFlag = 1 + if(ReFlag == 2): # Refresh small photo + ReFlag = 1 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) # show small photo + + + if(Page == 3 and ReFlag == 0): #view the photo + if(ICNT_Dev.X[0] > 268 and ICNT_Dev.X[0] < 289 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Photo menu ...\r\n") + Page = 2 + Read_BMP(PagePath[Page], 0, 0) + Show_Photo_Small(image, Photo_S) + ReFlag = 1 + elif(ICNT_Dev.X[0] > 203 and ICNT_Dev.X[0] < 224 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Next photo ...\r\n") + Photo_L += 1 + if(Photo_L > 9): + Photo_L = 1 + ReFlag = 2 + elif(ICNT_Dev.X[0] > 135 and ICNT_Dev.X[0] < 160 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Home ...\r\n") + Page = 0 + Read_BMP(PagePath[Page], 0, 0) + ReFlag = 1 + elif(ICNT_Dev.X[0] > 71 and ICNT_Dev.X[0] < 92 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Last page ...\r\n") + if(Photo_L == 1): + print("Top photo ...\r\n") + else: + Photo_L -= 1 + ReFlag = 2 + elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124): + print("Refresh photo ...\r\n") + SelfFlag = 1 + ReFlag = 1 + if(ReFlag == 2): # Refresh large photo + ReFlag = 1 + Show_Photo_Large(image, Photo_L) + + +except IOError as e: + logging.info(e) + +except KeyboardInterrupt: + logging.info("ctrl + c:") + flag_t = 0 + epd.sleep() + time.sleep(2) + t1.join() + epd.Dev_exit() + exit() diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/__init__.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V2.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V2.py new file mode 100644 index 0000000..1a9c828 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V2.py @@ -0,0 +1,339 @@ +# ***************************************************************************** +# * | File : epd2in13_V2.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V4.0 +# * | Date : 2019-06-20 +# # | 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 +import numpy as np + +# Display resolution +EPD_WIDTH = 122 +EPD_HEIGHT = 250 + +class EPD_2IN13_V2: + def __init__(self): + self.reset_pin = epdconfig.EPD_RST_PIN + self.dc_pin = epdconfig.EPD_DC_PIN + self.busy_pin = epdconfig.EPD_BUSY_PIN + self.cs_pin = epdconfig.EPD_CS_PIN + self.width = EPD_WIDTH + self.height = EPD_HEIGHT + epdconfig.address = 0x14 + + FULL_UPDATE = 0 + PART_UPDATE = 1 + lut_full_update= [ + 0x80,0x60,0x40,0x00,0x00,0x00,0x00, #LUT0: BB: VS 0 ~7 + 0x10,0x60,0x20,0x00,0x00,0x00,0x00, #LUT1: BW: VS 0 ~7 + 0x80,0x60,0x40,0x00,0x00,0x00,0x00, #LUT2: WB: VS 0 ~7 + 0x10,0x60,0x20,0x00,0x00,0x00,0x00, #LUT3: WW: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, #LUT4: VCOM: VS 0 ~7 + + 0x03,0x03,0x00,0x00,0x02, # TP0 A~D RP0 + 0x09,0x09,0x00,0x00,0x02, # TP1 A~D RP1 + 0x03,0x03,0x00,0x00,0x02, # TP2 A~D RP2 + 0x00,0x00,0x00,0x00,0x00, # TP3 A~D RP3 + 0x00,0x00,0x00,0x00,0x00, # TP4 A~D RP4 + 0x00,0x00,0x00,0x00,0x00, # TP5 A~D RP5 + 0x00,0x00,0x00,0x00,0x00, # TP6 A~D RP6 + + 0x15,0x41,0xA8,0x32,0x30,0x0A, + ] + + lut_partial_update = [ #20 bytes + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, #LUT0: BB: VS 0 ~7 + 0x80,0x00,0x00,0x00,0x00,0x00,0x00, #LUT1: BW: VS 0 ~7 + 0x40,0x00,0x00,0x00,0x00,0x00,0x00, #LUT2: WB: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, #LUT3: WW: VS 0 ~7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, #LUT4: VCOM: VS 0 ~7 + + 0x0A,0x00,0x00,0x00,0x00, # TP0 A~D RP0 + 0x00,0x00,0x00,0x00,0x00, # TP1 A~D RP1 + 0x00,0x00,0x00,0x00,0x00, # TP2 A~D RP2 + 0x00,0x00,0x00,0x00,0x00, # TP3 A~D RP3 + 0x00,0x00,0x00,0x00,0x00, # TP4 A~D RP4 + 0x00,0x00,0x00,0x00,0x00, # TP5 A~D RP5 + 0x00,0x00,0x00,0x00,0x00, # TP6 A~D RP6 + + 0x15,0x41,0xA8,0x32,0x30,0x0A, + ] + + # Hardware reset + def reset(self): + epdconfig.digital_write(self.reset_pin, 1) + epdconfig.delay_ms(200) + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(5) + epdconfig.digital_write(self.reset_pin, 1) + epdconfig.delay_ms(200) + + 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_writebyte(data) + epdconfig.digital_write(self.cs_pin, 1) + + def ReadBusy(self): + while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy + epdconfig.delay_ms(10) + + def TurnOnDisplay(self): + self.send_command(0x22) + self.send_data(0xC7) + self.send_command(0x20) + self.ReadBusy() + + def TurnOnDisplayPart(self): + self.send_command(0x22) + self.send_data(0x0c) + self.send_command(0x20) + # self.ReadBusy() + + def TurnOnDisplayPart_Wait(self): + self.send_command(0x22) + self.send_data(0x0c) + self.send_command(0x20) + self.ReadBusy() + + def init(self, update): + if (epdconfig.module_init() != 0): + return -1 + # EPD hardware init start + self.reset() + if(update == self.FULL_UPDATE): + self.ReadBusy() + self.send_command(0x12) # soft reset + self.ReadBusy() + + self.send_command(0x74) #set analog block control + self.send_data(0x54) + self.send_command(0x7E) #set digital block control + self.send_data(0x3B) + + self.send_command(0x01) #Driver output control + self.send_data(0xF9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x01) + + self.send_command(0x44) #set Ram-X address start/end position + self.send_data(0x00) + self.send_data(0x0F) #0x0C-->(15+1)*8=128 + + self.send_command(0x45) #set Ram-Y address start/end position + self.send_data(0xF9) #0xF9-->(249+1)=250 + self.send_data(0x00) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x3C) #BorderWavefrom + self.send_data(0x03) + + self.send_command(0x2C) #VCOM Voltage + self.send_data(0x55) # + + self.send_command(0x03) + self.send_data(self.lut_full_update[70]) + + self.send_command(0x04) # + self.send_data(self.lut_full_update[71]) + self.send_data(self.lut_full_update[72]) + self.send_data(self.lut_full_update[73]) + + self.send_command(0x3A) #Dummy Line + self.send_data(self.lut_full_update[74]) + self.send_command(0x3B) #Gate time + self.send_data(self.lut_full_update[75]) + + self.send_command(0x32) + for count in range(70): + self.send_data(self.lut_full_update[count]) + + self.send_command(0x4E) # set RAM x address count to 0 + self.send_data(0x00) + self.send_command(0x4F) # set RAM y address count to 0X127 + self.send_data(0xF9) + self.send_data(0x00) + self.ReadBusy() + else: + self.send_command(0x2C) #VCOM Voltage + self.send_data(0x26) + + self.ReadBusy() + + self.send_command(0x32) + for count in range(70): + self.send_data(self.lut_partial_update[count]) + + self.send_command(0x37) + 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_command(0x22) + self.send_data(0xC0) + self.send_command(0x20) + self.ReadBusy() + + self.send_command(0x3C) #BorderWavefrom + self.send_data(0x01) + return 0 + + def getbuffer(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + buf = [0xFF] * (linewidth * self.height) + image_monocolor = image.convert('1') + imwidth, imheight = image_monocolor.size + pixels = image_monocolor.load() + + if(imwidth == self.width and imheight == self.height): + # logging.debug("Vertical") + for y in range(imheight): + for x in range(imwidth): + if pixels[x, y] == 0: + x = imwidth - x + buf[int(x / 8) + y * linewidth] &= ~(0x80 >> (x % 8)) + elif(imwidth == self.height and imheight == self.width): + # logging.debug("Horizontal") + for y in range(imheight): + for x in range(imwidth): + newx = y + newy = self.height - x - 1 + if pixels[x, y] == 0: + newy = imwidth - newy - 1 + buf[int(newx / 8) + newy*linewidth] &= ~(0x80 >> (y % 8)) + return buf + + + def display(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + self.send_data2(image) + self.TurnOnDisplay() + + def displayPartial(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + self.send_data2(image) + self.TurnOnDisplayPart() + + def displayPartial_Wait(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + + self.TurnOnDisplayPart_Wait() + + def displayPartBaseImage(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + + + self.send_command(0x26) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + self.TurnOnDisplay() + + def Clear(self, color): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(color) + + self.TurnOnDisplay() + + def sleep(self): + # self.send_command(0x22) #POWER OFF + # self.send_data(0xC3) + # self.send_command(0x20) + + self.send_command(0x10) #enter deep sleep + self.send_data(0x03) + epdconfig.delay_ms(100) + + def Dev_exit(self): + epdconfig.module_exit() + +### END OF FILE ### + diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V3.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V3.py new file mode 100644 index 0000000..d4fc0f3 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V3.py @@ -0,0 +1,436 @@ +# ***************************************************************************** +# * | File : epd2in13_V3.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V1.1 +# * | Date : 2021-10-30 +# # | 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 +import numpy as np + +# Display resolution +EPD_WIDTH = 122 +EPD_HEIGHT = 250 + +logger = logging.getLogger(__name__) + +class EPD: + def __init__(self): + self.reset_pin = epdconfig.EPD_RST_PIN + self.dc_pin = epdconfig.EPD_DC_PIN + self.busy_pin = epdconfig.EPD_BUSY_PIN + self.cs_pin = epdconfig.EPD_CS_PIN + self.width = EPD_WIDTH + self.height = EPD_HEIGHT + epdconfig.address = 0x14 + + FULL_UPDATE = 0 + PART_UPDATE = 1 + + lut_partial_update= [ + 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x10,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, + 0x22,0x17,0x41,0x00,0x32,0x36, + ] + + lut_full_update = [ + 0x80,0x4A,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x4A,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x80,0x4A,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x4A,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0xF,0x0,0x0,0x0,0x0,0x0,0x0, + 0xF,0x0,0x0,0xF,0x0,0x0,0x2, + 0xF,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, + 0x22,0x17,0x41,0x0,0x32,0x36, + ] + + ''' + function :Hardware reset + parameter: + ''' + 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) + + ''' + function :send command + parameter: + command : Command register + ''' + 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) + + ''' + function :send data + parameter: + data : Write data + ''' + 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_writebyte(data) + epdconfig.digital_write(self.cs_pin, 1) + + ''' + function :Wait until the busy_pin goes LOW + parameter: + ''' + def ReadBusy(self): + logger.debug("e-Paper busy") + while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy + epdconfig.delay_ms(10) + logger.debug("e-Paper busy release") + + ''' + function : Turn On Display + parameter: + ''' + def TurnOnDisplay(self): + self.send_command(0x22) # Display Update Control + self.send_data(0xC7) + self.send_command(0x20) # Activate Display Update Sequence + self.ReadBusy() + + ''' + function : Turn On Display Part + parameter: + ''' + def TurnOnDisplayPart(self): + self.send_command(0x22) # Display Update Control + self.send_data(0x0c) # fast:0x0c, quality:0x0f, 0xcf + self.send_command(0x20) # Activate Display Update Sequence + # self.ReadBusy() + + def TurnOnDisplayPart_Wait(self): + self.send_command(0x22) # Display Update Control + self.send_data(0x0c) # fast:0x0c, quality:0x0f, 0xcf + self.send_command(0x20) # Activate Display Update Sequence + self.ReadBusy() + + ''' + function : Set lut + parameter: + lut : lut data + ''' + def Lut(self, lut): + self.send_command(0x32) + for i in range(0, 153): + self.send_data(lut[i]) + self.ReadBusy() + + ''' + function : Send lut data and configuration + parameter: + lut : lut data + ''' + def SetLut(self, lut): + self.Lut(lut) + self.send_command(0x3f) + self.send_data(lut[153]) + self.send_command(0x03) # gate voltage + self.send_data(lut[154]) + self.send_command(0x04) # source voltage + self.send_data(lut[155]) # VSH + self.send_data(lut[156]) # VSH2 + self.send_data(lut[157]) # VSL + self.send_command(0x2c) # VCOM + self.send_data(lut[158]) + + ''' + function : Setting the display window + parameter: + xstart : X-axis starting position + ystart : Y-axis starting position + xend : End position of X-axis + yend : End position of Y-axis + ''' + def SetWindow(self, x_start, y_start, x_end, y_end): + self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data((x_start>>3) & 0xFF) + self.send_data((x_end>>3) & 0xFF) + + self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION + self.send_data(y_start & 0xFF) + self.send_data((y_start >> 8) & 0xFF) + self.send_data(y_end & 0xFF) + self.send_data((y_end >> 8) & 0xFF) + + ''' + function : Set Cursor + parameter: + x : X-axis starting position + y : Y-axis starting position + ''' + def SetCursor(self, x, y): + self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data(x & 0xFF) + + self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER + self.send_data(y & 0xFF) + self.send_data((y >> 8) & 0xFF) + + ''' + function : Initialize the e-Paper register + parameter: + ''' + def init(self, update): + if (epdconfig.module_init() != 0): + return -1 + + if update == self.FULL_UPDATE: + # EPD hardware init start + self.reset() + + self.ReadBusy() + self.send_command(0x12) #SWRESET + self.ReadBusy() + + self.send_command(0x01) #Driver output control + self.send_data(0xf9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width-1, self.height-1) + self.SetCursor(0, 0) + + self.send_command(0x3c) + self.send_data(0x05) + + self.send_command(0x21) # Display update control + self.send_data(0x00) + self.send_data(0x80) + + self.send_command(0x18) + self.send_data(0x80) + + self.ReadBusy() + + self.SetLut(self.lut_full_update) + + else: + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(1) + epdconfig.digital_write(self.reset_pin, 1) + + self.SetLut(self.lut_partial_update) + 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) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x22) + self.send_data(0xC0) + self.send_command(0x20) + self.ReadBusy() + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + return 0 + + ''' + function : Display images + parameter: + image : Image data + ''' + def getbuffer(self, image): + img = image + imwidth, imheight = img.size + if(imwidth == self.width and imheight == self.height): + img = img.rotate(180, expand=True).convert('1') + elif(imwidth == self.height and imheight == self.width): + # image has correct dimensions, but needs to be rotated + img = img.rotate(270, expand=True).convert('1') + else: + logger.warning("Wrong image dimensions: must be " + str(self.width) + "x" + str(self.height)) + # return a blank buffer + return [0x00] * (int(self.width/8) * self.height) + + buf = bytearray(img.tobytes('raw')) + return buf + + ''' + function : Sends the image buffer in RAM to e-Paper and displays + parameter: + image : Image data + ''' + def display(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + + self.send_data2(image) + self.TurnOnDisplay() + + ''' + function : Sends the image buffer in RAM to e-Paper and partial refresh + parameter: + image : Image data + ''' + def displayPartial(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + self.send_data2(image) + self.TurnOnDisplayPart() + + def displayPartial_Wait(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + + self.send_data2(image) + self.TurnOnDisplayPart_Wait() + + ''' + function : Refresh a base image + parameter: + image : Image data + ''' + def displayPartBaseImage(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + + self.send_command(0x26) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + self.TurnOnDisplay() + + ''' + function : Clear screen + parameter: + ''' + def Clear(self, color): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + # logger.debug(linewidth) + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(color) + + self.TurnOnDisplay() + + ''' + function : Enter sleep mode + parameter: + ''' + def sleep(self): + self.send_command(0x10) #enter deep sleep + self.send_data(0x01) + + epdconfig.delay_ms(2000) + + def Dev_exit(self): + epdconfig.module_exit() + +### END OF FILE ### + diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V4.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V4.py new file mode 100644 index 0000000..f8401f1 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in13_V4.py @@ -0,0 +1,370 @@ +# ***************************************************************************** +# * | File : epd2in13_V4.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V1.0 +# * | Date : 2023-08-14 +# # | 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 +import numpy as np + +# Display resolution +EPD_WIDTH = 122 +EPD_HEIGHT = 250 + +logger = logging.getLogger(__name__) + +class EPD: + def __init__(self): + self.reset_pin = epdconfig.EPD_RST_PIN + self.dc_pin = epdconfig.EPD_DC_PIN + self.busy_pin = epdconfig.EPD_BUSY_PIN + self.cs_pin = epdconfig.EPD_CS_PIN + self.width = EPD_WIDTH + self.height = EPD_HEIGHT + epdconfig.address = 0x14 + + FULL_UPDATE = 0 + PART_UPDATE = 1 + + ''' + function :Hardware reset + parameter: + ''' + 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) + + ''' + function :send command + parameter: + command : Command register + ''' + 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) + + ''' + function :send data + parameter: + data : Write data + ''' + 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_writebyte(data) + epdconfig.digital_write(self.cs_pin, 1) + + ''' + function :Wait until the busy_pin goes LOW + parameter: + ''' + def ReadBusy(self): + logger.debug("e-Paper busy") + while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy + epdconfig.delay_ms(10) + logger.debug("e-Paper busy release") + + ''' + function : Turn On Display + parameter: + ''' + def TurnOnDisplay(self): + self.send_command(0x22) # Display Update Control + self.send_data(0xF7) + self.send_command(0x20) # Activate Display Update Sequence + self.ReadBusy() + + ''' + function : Turn On Display Part + parameter: + ''' + def TurnOnDisplayPart(self): + self.send_command(0x22) # Display Update Control + self.send_data(0xFF) # fast:0x0c, quality:0x0f, 0xcf + self.send_command(0x20) # Activate Display Update Sequence + # self.ReadBusy() + + def TurnOnDisplayPart_Wait(self): + self.send_command(0x22) # Display Update Control + self.send_data(0xFF) # fast:0x0c, quality:0x0f, 0xcf + self.send_command(0x20) # Activate Display Update Sequence + self.ReadBusy() + + ''' + function : Setting the display window + parameter: + xstart : X-axis starting position + ystart : Y-axis starting position + xend : End position of X-axis + yend : End position of Y-axis + ''' + def SetWindow(self, x_start, y_start, x_end, y_end): + self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data((x_start>>3) & 0xFF) + self.send_data((x_end>>3) & 0xFF) + + self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION + self.send_data(y_start & 0xFF) + self.send_data((y_start >> 8) & 0xFF) + self.send_data(y_end & 0xFF) + self.send_data((y_end >> 8) & 0xFF) + + ''' + function : Set Cursor + parameter: + x : X-axis starting position + y : Y-axis starting position + ''' + def SetCursor(self, x, y): + self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data(x & 0xFF) + + self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER + self.send_data(y & 0xFF) + self.send_data((y >> 8) & 0xFF) + + ''' + function : Initialize the e-Paper register + parameter: + ''' + def init(self, update): + if (epdconfig.module_init() != 0): + return -1 + + if update == self.FULL_UPDATE: + # EPD hardware init start + self.reset() + + self.ReadBusy() + self.send_command(0x12) #SWRESET + self.ReadBusy() + + self.send_command(0x01) #Driver output control + self.send_data(0xf9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width-1, self.height-1) + self.SetCursor(0, 0) + + self.send_command(0x3c) + self.send_data(0x05) + + self.send_command(0x21) # Display update control + self.send_data(0x00) + self.send_data(0x80) + + self.send_command(0x18) + self.send_data(0x80) + + self.ReadBusy() + + else: + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(1) + epdconfig.digital_write(self.reset_pin, 1) + + self.send_command(0x01) #Driver output control + self.send_data(0xf9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x3C) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + return 0 + + ''' + function : Display images + parameter: + image : Image data + ''' + def getbuffer(self, image): + img = image + imwidth, imheight = img.size + if(imwidth == self.width and imheight == self.height): + img = img.rotate(180, expand=True).convert('1') + elif(imwidth == self.height and imheight == self.width): + # image has correct dimensions, but needs to be rotated + img = img.rotate(270, expand=True).convert('1') + else: + logger.warning("Wrong image dimensions: must be " + str(self.width) + "x" + str(self.height)) + # return a blank buffer + return [0x00] * (int(self.width/8) * self.height) + + buf = bytearray(img.tobytes('raw')) + return buf + + ''' + function : Sends the image buffer in RAM to e-Paper and displays + parameter: + image : Image data + ''' + def display(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + # for j in range(0, self.height): + # for i in range(0, linewidth): + # self.send_data(image[i + j * linewidth]) + + self.send_data2(image) + self.TurnOnDisplay() + + ''' + function : Sends the image buffer in RAM to e-Paper and partial refresh + parameter: + image : Image data + ''' + def displayPartial(self, image): + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(1) + epdconfig.digital_write(self.reset_pin, 1) + + self.send_command(0x01) #Driver output control + self.send_data(0xf9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x3C) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + self.send_command(0x24) # WRITE_RAM + self.send_data2(image) + self.TurnOnDisplayPart() + + def displayPartial_Wait(self, image): + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(1) + epdconfig.digital_write(self.reset_pin, 1) + + self.send_command(0x01) #Driver output control + self.send_data(0xf9) + self.send_data(0x00) + self.send_data(0x00) + + self.send_command(0x3C) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + self.send_command(0x24) # WRITE_RAM + self.send_data2(image) + self.TurnOnDisplayPart_Wait() + + ''' + function : Refresh a base image + parameter: + image : Image data + ''' + def displayPartBaseImage(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + + self.send_command(0x26) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + self.TurnOnDisplay() + + ''' + function : Clear screen + parameter: + ''' + def Clear(self, color): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + # logger.debug(linewidth) + + self.send_command(0x24) + for j in range(0, self.height): + for i in range(0, linewidth): + self.send_data(color) + + self.TurnOnDisplay() + + ''' + function : Enter sleep mode + parameter: + ''' + def sleep(self): + self.send_command(0x10) #enter deep sleep + self.send_data(0x01) + + epdconfig.delay_ms(2000) + + def Dev_exit(self): + epdconfig.module_exit() + +### END OF FILE ### + diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in9_V2.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in9_V2.py new file mode 100644 index 0000000..f634c05 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epd2in9_V2.py @@ -0,0 +1,586 @@ +# ***************************************************************************** +# * | File : epd2in9_V2.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V1.0 +# * | Date : 2020-10-20 +# # | 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 +import numpy as np + +# Display resolution +EPD_WIDTH = 128 +EPD_HEIGHT = 296 + +class EPD_2IN9_V2: + def __init__(self): + self.reset_pin = epdconfig.EPD_RST_PIN + self.dc_pin = epdconfig.EPD_DC_PIN + self.busy_pin = epdconfig.EPD_BUSY_PIN + self.cs_pin = epdconfig.EPD_CS_PIN + self.width = EPD_WIDTH + self.height = EPD_HEIGHT + epdconfig.address = 0x48 + + WF_PARTIAL_2IN9 = [ + 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0A,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, + 0x22,0x17,0x41,0xB0,0x32,0x36, + ] + + WF_PARTIAL_2IN9_Wait = [ + 0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0A,0x0,0x0,0x0,0x0,0x0,0x2, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, + 0x22,0x17,0x41,0xB0,0x32,0x36, + ] + + Gray4 = [ + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2A, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, + 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x05, 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, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x22, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, + 0x22, 0x17, 0x41, 0xAE, 0x32, 0x28, + ] + + WF_FULL = [ + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x42, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, + 0x22, 0x17, 0x41, 0xAE, 0x32, 0x38] + + # 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_writebyte2(data) + epdconfig.digital_write(self.cs_pin, 1) + + def ReadBusy(self): + # logging.debug("e-Paper busy") + while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy + epdconfig.delay_ms(0.1) + # logging.debug("e-Paper busy release") + + def TurnOnDisplay(self): + self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 + self.send_data(0xF7) + self.send_command(0x20) # MASTER_ACTIVATION + self.ReadBusy() + + def TurnOnDisplay_Partial(self): + self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 + self.send_data(0x0F) + self.send_command(0x20) # MASTER_ACTIVATION + # self.ReadBusy() + + def TurnOnDisplay_Partial_Wait(self): + self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 + self.send_data(0x0F) + self.send_command(0x20) # MASTER_ACTIVATION + self.ReadBusy() + + def TurnOnDisplay_4Gray(self): + self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 + self.send_data(0xC7) + self.send_command(0x20) # MASTER_ACTIVATION + self.ReadBusy() + + def SendLut(self, lut): + self.send_command(0x32) + # for i in range(0, 153): + # self.send_data(self.WF_PARTIAL_2IN9[i]) + if(lut): + self.send_data2(self.WF_PARTIAL_2IN9) + else: + self.send_data2(self.WF_PARTIAL_2IN9_Wait) + self.ReadBusy() + + def lut(self, lut): + self.send_command(0x32) + for i in range(0, 153): + self.send_data(lut[i]) + self.ReadBusy() + + def SetLut(self, lut): + self.lut(lut) + self.send_command(0x3f) + self.send_data(lut[153]) + self.send_command(0x03); # gate voltage + self.send_data(lut[154]) + self.send_command(0x04); # source voltage + self.send_data(lut[155]) # VSH + self.send_data(lut[156]) # VSH2 + self.send_data(lut[157]) # VSL + self.send_command(0x2c); # VCOM + self.send_data(lut[158]) + + def SetWindow(self, x_start, y_start, x_end, y_end): + self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data((x_start>>3) & 0xFF) + self.send_data((x_end>>3) & 0xFF) + self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION + self.send_data(y_start & 0xFF) + self.send_data((y_start >> 8) & 0xFF) + self.send_data(y_end & 0xFF) + self.send_data((y_end >> 8) & 0xFF) + + def SetCursor(self, x, y): + self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data(x & 0xFF) + + self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER + self.send_data(y & 0xFF) + self.send_data((y >> 8) & 0xFF) + self.ReadBusy() + + def init(self): + if (epdconfig.module_init() != 0): + return -1 + # EPD hardware init start + self.reset() + + self.ReadBusy() + self.send_command(0x12) #SWRESET + self.ReadBusy() + + self.send_command(0x01) #Driver output control + self.send_data(0x27) + self.send_data(0x01) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width-1, self.height-1) + + self.send_command(0x21) # Display update control + self.send_data(0x00) + self.send_data(0x80) + + self.SetCursor(0, 0) + self.ReadBusy() + # EPD hardware init end + return 0 + + def init_Fast(self): + if (epdconfig.module_init() != 0): + return -1 + # EPD hardware init start + self.reset() + + self.ReadBusy() + self.send_command(0x12) #SWRESET + self.ReadBusy() + + self.send_command(0x01) #Driver output control + self.send_data(0x27) + self.send_data(0x01) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(0, 0, self.width-1, self.height-1) + + self.send_command(0x3C) + self.send_data(0x05) + + self.send_command(0x21) # Display update control + self.send_data(0x00) + self.send_data(0x80) + + self.SetCursor(0, 0) + self.ReadBusy() + + self.SetLut(self.WF_FULL) + # EPD hardware init end + return 0 + + def Init_4Gray(self): + if (epdconfig.module_init() != 0): + return -1 + self.reset() + epdconfig.delay_ms(100) + + self.ReadBusy() + self.send_command(0x12) #SWRESET + self.ReadBusy() + + self.send_command(0x01) #Driver output control + self.send_data(0x27) + self.send_data(0x01) + self.send_data(0x00) + + self.send_command(0x11) #data entry mode + self.send_data(0x03) + + self.SetWindow(8, 0, self.width, self.height-1) + + self.send_command(0x3C) + self.send_data(0x04) + + self.SetCursor(1, 0) + self.ReadBusy() + + self.SetLut(self.Gray4) + # EPD hardware init end + return 0 + + def getbuffer(self, image): + # logging.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() + # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) + if(imwidth == self.width and imheight == self.height): + # logging.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] == 0: + buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) + elif(imwidth == self.height and imheight == self.width): + # logging.debug("Horizontal") + 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 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 display(self, image): + if (image == None): + return + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, int(self.width / 8)): + # self.send_data(image[i + j * int(self.width / 8)]) + self.send_data2(image) + self.TurnOnDisplay() + + def display_Base(self, image): + if (image == None): + return + + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, int(self.width / 8)): + # self.send_data(image[i + j * int(self.width / 8)]) + self.send_data2(image) + + self.send_command(0x26) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, int(self.width / 8)): + # self.send_data(image[i + j * int(self.width / 8)]) + self.send_data2(image) + + self.TurnOnDisplay() + + def display_Partial(self, image): + if (image == None): + return + + # epdconfig.digital_write(self.reset_pin, 0) + # epdconfig.delay_ms(2) + # epdconfig.digital_write(self.reset_pin, 1) + # epdconfig.delay_ms(2) + + self.SendLut(1) + 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) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x22) + self.send_data(0xC0) + self.send_command(0x20) + self.ReadBusy() + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, int(self.width / 8)): + # self.send_data(image[i + j * int(self.width / 8)]) + self.send_data2(image) + + self.TurnOnDisplay_Partial() + + def display_Partial_Wait(self, image): + if (image == None): + return + + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(1) + epdconfig.digital_write(self.reset_pin, 1) + # epdconfig.delay_ms(2) + + self.SendLut(0) + 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) #BorderWavefrom + self.send_data(0x80) + + self.send_command(0x22) + self.send_data(0xC0) + self.send_command(0x20) + self.ReadBusy() + + self.SetWindow(0, 0, self.width - 1, self.height - 1) + self.SetCursor(0, 0) + + self.send_command(0x24) # WRITE_RAM + # for j in range(0, self.height): + # for i in range(0, int(self.width / 8)): + # self.send_data(image[i + j * int(self.width / 8)]) + self.send_data2(image) + + self.TurnOnDisplay_Partial_Wait() + + def Clear(self, color): + self.send_command(0x24) # WRITE_RAM + for j in range(0, self.height): + for i in range(0, int(self.width / 8)): + self.send_data(color) + self.TurnOnDisplay() + + def display_4Gray(self, image): + self.send_command(0x24) + for i in range(0, 4736): + 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, 4736): + 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_MODE + self.send_data(0x01) + + def Dev_exit(self): + epdconfig.module_exit() +### END OF FILE ### + diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/epdconfig.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epdconfig.py new file mode 100644 index 0000000..caaeb83 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/epdconfig.py @@ -0,0 +1,140 @@ +# /***************************************************************************** +# * | File : epdconfig.py +# * | Author : Waveshare team +# * | Function : Hardware underlying interface +# * | Info : +# *---------------- +# * | This version: V1.0 +# * | Date : 2020-12-21 +# * | 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. +# + +import gpiozero +import time +from smbus import SMBus +import spidev +import ctypes +import logging + +# e-Paper +EPD_RST_PIN = 17 +EPD_DC_PIN = 25 +EPD_CS_PIN = 8 +EPD_BUSY_PIN = 24 + +# TP +TRST = 22 +INT = 27 + +spi = spidev.SpiDev(0, 0) +address = 0x0 +# address = 0x14 +# address = 0x48 +bus = SMBus(1) + + +GPIO_RST_PIN = gpiozero.LED(EPD_RST_PIN) +GPIO_DC_PIN = gpiozero.LED(EPD_DC_PIN) +# GPIO_CS_PIN = gpiozero.LED(EPD_CS_PIN) +GPIO_TRST = gpiozero.LED(TRST) + +GPIO_BUSY_PIN = gpiozero.Button(EPD_BUSY_PIN, pull_up = False) +GPIO_INT = gpiozero.Button(INT, pull_up = False) + + +def digital_write(pin, value): + if pin == EPD_RST_PIN: + if value: + GPIO_RST_PIN.on() + else: + GPIO_RST_PIN.off() + elif pin == EPD_DC_PIN: + if value: + GPIO_DC_PIN.on() + else: + GPIO_DC_PIN.off() + # elif pin == EPD_CS_PIN: + # if value: + # GPIO_CS_PIN.on() + # else: + # GPIO_CS_PIN.off() + elif pin == TRST: + if value: + GPIO_TRST.on() + else: + GPIO_TRST.off() + +def digital_read(pin): + if pin == EPD_BUSY_PIN: + return GPIO_BUSY_PIN.value + elif pin == INT: + return GPIO_INT.value + +def delay_ms(delaytime): + time.sleep(delaytime / 1000.0) + +def spi_writebyte(data): + spi.writebytes(data) + +def spi_writebyte2(data): + spi.writebytes2(data) + +def i2c_writebyte(reg, value): + bus.write_word_data(address, (reg>>8) & 0xff, (reg & 0xff) | ((value & 0xff) << 8)) + +def i2c_write(reg): + bus.write_byte_data(address, (reg>>8) & 0xff, reg & 0xff) + +def i2c_readbyte(reg, len): + i2c_write(reg) + rbuf = [] + for i in range(len): + rbuf.append(int(bus.read_byte(address))) + return rbuf + +def module_init(): + + spi.max_speed_hz = 10000000 + spi.mode = 0b00 + + return 0 + +def module_exit(): + logging.debug("spi end") + spi.close() + bus.close() + + logging.debug("close 5V, Module enters 0 power consumption ...") + GPIO_RST_PIN.off() + GPIO_DC_PIN.off() + # GPIO_CS_PIN.off() + GPIO_TRST.off() + + GPIO_RST_PIN.close() + GPIO_DC_PIN.close() + # GPIO_CS_PIN.close() + GPIO_TRST.close() + + GPIO_BUSY_PIN.close() + GPIO_INT.close() + + +### END OF FILE ### diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/gt1151.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/gt1151.py new file mode 100644 index 0000000..cd86606 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/gt1151.py @@ -0,0 +1,84 @@ +import logging +from . import epdconfig as config + +class GT_Development: + def __init__(self): + self.Touch = 0 + self.TouchpointFlag = 0 + self.TouchCount = 0 + self.Touchkeytrackid = [0, 1, 2, 3, 4] + self.X = [0, 1, 2, 3, 4] + self.Y = [0, 1, 2, 3, 4] + self.S = [0, 1, 2, 3, 4] + +class GT1151: + def __init__(self): + # e-Paper + self.ERST = config.EPD_RST_PIN + self.DC = config.EPD_DC_PIN + self.CS = config.EPD_CS_PIN + self.BUSY = config.EPD_BUSY_PIN + # TP + self.TRST = config.TRST + self.INT = config.INT + + def digital_read(self, pin): + return config.digital_read(pin) + + def GT_Reset(self): + config.digital_write(self.TRST, 1) + config.delay_ms(100) + config.digital_write(self.TRST, 0) + config.delay_ms(100) + config.digital_write(self.TRST, 1) + config.delay_ms(100) + + def GT_Write(self, Reg, Data): + config.i2c_writebyte(Reg, Data) + + def GT_Read(self, Reg, len): + return config.i2c_readbyte(Reg, len) + + def GT_ReadVersion(self): + buf = self.GT_Read(0x8140, 4) + print(buf) + + def GT_Init(self): + self.GT_Reset() + self.GT_ReadVersion() + + def GT_Scan(self, GT_Dev, GT_Old): + buf = [] + mask = 0x00 + + if(GT_Dev.Touch == 1): + GT_Dev.Touch = 0 + buf = self.GT_Read(0x814E, 1) + + if(buf[0]&0x80 == 0x00): + self.GT_Write(0x814E, mask) + config.delay_ms(10) + + else: + GT_Dev.TouchpointFlag = buf[0]&0x80 + GT_Dev.TouchCount = buf[0]&0x0f + + if(GT_Dev.TouchCount > 5 or GT_Dev.TouchCount < 1): + self.GT_Write(0x814E, mask) + return + + buf = self.GT_Read(0x814F, GT_Dev.TouchCount*8) + self.GT_Write(0x814E, mask) + + GT_Old.X[0] = GT_Dev.X[0]; + GT_Old.Y[0] = GT_Dev.Y[0]; + GT_Old.S[0] = GT_Dev.S[0]; + + for i in range(0, GT_Dev.TouchCount, 1): + GT_Dev.Touchkeytrackid[i] = buf[0 + 8*i] + GT_Dev.X[i] = (buf[2 + 8*i] << 8) + buf[1 + 8*i] + GT_Dev.Y[i] = (buf[4 + 8*i] << 8) + buf[3 + 8*i] + GT_Dev.S[i] = (buf[6 + 8*i] << 8) + buf[5 + 8*i] + + print(GT_Dev.X[0], GT_Dev.Y[0], GT_Dev.S[0]) + \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/icnt86.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/icnt86.py new file mode 100644 index 0000000..349eb05 --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/icnt86.py @@ -0,0 +1,89 @@ +import logging +from . import epdconfig as config + +class ICNT_Development: + def __init__(self): + self.Touch = 0 + self.TouchGestureid = 0 + self.TouchCount = 0 + + self.TouchEvenid = [0, 1, 2, 3, 4] + self.X = [0, 1, 2, 3, 4] + self.Y = [0, 1, 2, 3, 4] + self.P = [0, 1, 2, 3, 4] + +class INCT86: + def __init__(self): + # e-Paper + self.ERST = config.EPD_RST_PIN + self.DC = config.EPD_DC_PIN + self.CS = config.EPD_CS_PIN + self.BUSY = config.EPD_BUSY_PIN + # TP + self.TRST = config.TRST + self.INT = config.INT + + def digital_read(self, pin): + return config.digital_read(pin) + + def ICNT_Reset(self): + config.digital_write(self.TRST, 1) + config.delay_ms(100) + config.digital_write(self.TRST, 0) + config.delay_ms(100) + config.digital_write(self.TRST, 1) + config.delay_ms(100) + + def ICNT_Write(self, Reg, Data): + config.i2c_writebyte(Reg, Data) + + def ICNT_Read(self, Reg, len): + return config.i2c_readbyte(Reg, len) + + def ICNT_ReadVersion(self): + buf = self.ICNT_Read(0x000a, 4) + print(buf) + + def ICNT_Init(self): + self.ICNT_Reset() + self.ICNT_ReadVersion() + + def ICNT_Scan(self, ICNT_Dev, ICNT_Old): + buf = [] + mask = 0x00 + + if(ICNT_Dev.Touch == 1): + # ICNT_Dev.Touch = 0 + buf = self.ICNT_Read(0x1001, 1) + + if(buf[0] == 0x00): + self.ICNT_Write(0x1001, mask) + config.delay_ms(1) + # print("buffers status is 0") + return + else: + ICNT_Dev.TouchCount = buf[0] + + if(ICNT_Dev.TouchCount > 5 or ICNT_Dev.TouchCount < 1): + self.ICNT_Write(0x1001, mask) + ICNT_Dev.TouchCount = 0 + # print("TouchCount number is wrong") + return + + buf = self.ICNT_Read(0x1002, ICNT_Dev.TouchCount*7) + self.ICNT_Write(0x1001, mask) + + ICNT_Old.X[0] = ICNT_Dev.X[0]; + ICNT_Old.Y[0] = ICNT_Dev.Y[0]; + ICNT_Old.P[0] = ICNT_Dev.P[0]; + + for i in range(0, ICNT_Dev.TouchCount, 1): + ICNT_Dev.TouchEvenid[i] = buf[6 + 7*i] + ICNT_Dev.X[i] = 295 - ((buf[2 + 7*i] << 8) + buf[1 + 7*i]) + ICNT_Dev.Y[i] = 127 - ((buf[4 + 7*i] << 8) + buf[3 + 7*i]) + ICNT_Dev.P[i] = buf[5 + 7*i] + + print(ICNT_Dev.X[0], ICNT_Dev.Y[0], ICNT_Dev.P[0]) + return + return + \ No newline at end of file diff --git a/docs/Touch_e-Paper_Code/python/lib/TP_lib/weather_2in9_V2.py b/docs/Touch_e-Paper_Code/python/lib/TP_lib/weather_2in9_V2.py new file mode 100644 index 0000000..56ce90b --- /dev/null +++ b/docs/Touch_e-Paper_Code/python/lib/TP_lib/weather_2in9_V2.py @@ -0,0 +1,261 @@ +# This little program is for the Waveshare 2.9 +# inch Version 2 black and white only epaper display +# It uses OpenWeatherMap API to display weather info +import sys +import os +picdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../pic/2in9') +icondir = os.path.join(picdir, 'icon') +fontdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../pic') + +# Search lib folder for display driver modules +sys.path.append('lib') +from . import epd2in9_V2 +epd = epd2in9_V2.EPD_2IN9_V2() + +from datetime import datetime +import time +from PIL import Image,ImageDraw,ImageFont +import traceback + +import requests, json +from io import BytesIO +import csv + +# define funciton for writing image and sleeping for 5 min. +def write_to_screen(image, sleep_seconds): + print('Writing to screen.') + # Write to screen + h_image = Image.new('1', (epd.height, epd.width), 255) + # Open the template + screen_output_file = Image.open(os.path.join(picdir, image)) + # Initialize the drawing context with template as background + h_image.paste(screen_output_file, (0, 0)) + epd.display(epd.getbuffer(h_image)) + # Sleep + print('Sleeping for ' + str(sleep_seconds) +'.') + time.sleep(sleep_seconds) + +# define function for displaying error +def display_error(error_source): + # Display an error + print('Error in the', error_source, 'request.') + # Initialize drawing + error_image = Image.new('1', (epd.height, epd.width), 255) + # Initialize the drawing + draw = ImageDraw.Draw(error_image) + draw.text((5, 5), error_source +' ERROR', font=font20, fill=black) + draw.text((5, 30), 'Retrying in 30 seconds', font=font20, fill=black) + current_time = datetime.now().strftime('%H:%M') + draw.text((5, 55), 'Last Refresh: ' + str(current_time), font = font20, fill=black) + # Save the error image + error_image_file = 'error.png' + error_image.save(os.path.join(picdir, error_image_file)) + # Close error image + error_image.close() + # Write error to screen + write_to_screen(error_image_file, 30) + +# Set the fonts +font12 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 12) +font16 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 16) +font20 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 20) +font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24) +font30 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 30) +font35 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 35) +font50 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 50) +font60 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 60) +font100 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 100) +font160 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 160) + +# Set the special fonts +font18_Roboto_Bold = ImageFont.truetype(os.path.join(fontdir, 'Roboto-Bold.ttf'), 18) +font20_Roboto_Bold = ImageFont.truetype(os.path.join(fontdir, 'Roboto-Bold.ttf'), 20) +font20_Roboto_Regular = ImageFont.truetype(os.path.join(fontdir, 'Roboto-Regular.ttf'), 20) +font34_Roboto_Black = ImageFont.truetype(os.path.join(fontdir, 'Roboto-Black.ttf'), 34) + +# Set the colors +black = 'rgb(0,0,0)' +white = 'rgb(255,255,255)' +grey = 'rgb(235,235,235)' + +# Initialize and clear screen +# print('Initializing and clearing screen.') +# epd.init() +# epd.Clear() + +# I provide my API_KEY for you to test: 82ec63bb0530e31e0ef9042786d195cc, Please try to use your own API_KEY +API_KEY = '******API KEY*******' +LOCATION = 'Shenzhen' +LATITUDE = '22.543097' +LONGITUDE = '114.057861' +UNITS = 'imperial' +CSV_OPTION = False # if csv_option == True, a weather data will be appended to 'record.csv' + +BASE_URL = 'http://api.openweathermap.org/data/2.5/onecall?' +URL = BASE_URL + 'lat=' + LATITUDE + '&lon=' + LONGITUDE + '&units=' + UNITS +'&appid=' + API_KEY + +def get_weather_png(): + # Ensure there are no errors with connection + error_connect = True + while error_connect == True: + try: + # HTTP request + print('Attempting to connect to OWM.') + response = requests.get(URL) + print('Connection to OWM successful.') + error_connect = None + except: + # Call function to display connection error + print('Connection error.') + display_error('CONNECTION') + + error = None + while error == None: + # Check status of code request + if response.status_code == 200: + print('Connection to Open Weather successful.') + # get data in jason format + data = response.json() + + # get current dict block + current = data['current'] + # get current + temp_current = current['temp'] + # get feels like + feels_like = current['feels_like'] + # get humidity + humidity = current['humidity'] + # get pressure + wind = current['wind_speed'] + # get description + weather = current['weather'] + report = weather[0]['description'] + # get icon url + icon_code = weather[0]['icon'] + #icon_URL = 'http://openweathermap.org/img/wn/'+ icon_code +'@4x.png' + + # get daily dict block + daily = data['daily'] + # get daily precip + daily_precip_float = daily[0]['pop'] + #format daily precip + daily_precip_percent = daily_precip_float * 100 + # get min and max temp + daily_temp = daily[0]['temp'] + temp_max = daily_temp['max'] + temp_min = daily_temp['min'] + + # Append weather data to CSV if csv_option == True + if CSV_OPTION == True: + # Get current year, month, date, and time + current_year = datetime.now().strftime('%Y') + current_month = datetime.now().strftime('%m') + current_date = datetime.now().strftime('%d') + current_time = datetime.now().strftime('%H:%M') + #open the CSV and append weather data + with open('records.csv', 'a', newline='') as csv_file: + writer = csv.writer(csv_file, delimiter=',') + writer.writerow([current_year, current_month, current_date, current_time, + LOCATION,temp_current, feels_like, temp_max, temp_min, + humidity, daily_precip_float, wind]) + print('Weather data appended to CSV.') + + # Set strings to be printed to screen + string_location = 'City: ' + LOCATION + string_temp_current = format(temp_current, '.0f') + u'\N{DEGREE SIGN}F' + string_temp_current_C = format((temp_current-32)/1.8, '.0f') + u'\N{DEGREE SIGN}C' + string_temp = string_temp_current + ' / ' + string_temp_current_C + string_feels_like = 'Feels like: ' + format(feels_like, '.0f') + u'\N{DEGREE SIGN}F' + string_humidity = 'Humidity: ' + str(humidity) + '%' + string_wind = 'Wind: ' + format(wind, '.1f') + ' MPH' + # string_report = 'Now: ' + report.title() + string_report = report.title() + string_temp_max = 'High: ' + format(temp_max, '>.0f') + u'\N{DEGREE SIGN}F' + string_temp_min = 'Low: ' + format(temp_min, '>.0f') + u'\N{DEGREE SIGN}F' + string_precip_percent = 'Precip: ' + str(format(daily_precip_percent, '.0f')) + '%' + + # Set error code to false + error = False + + ''' + print('Location:', LOCATION) + print('Temperature:', format(temp_current, '.0f'), u'\N{DEGREE SIGN}F') + print('Feels Like:', format(feels_like, '.0f'), 'F') + print('Humidity:', humidity) + print('Wind Speed:', format(wind_speed, '.1f'), 'MPH') + print('Report:', report.title()) + + print('High:', format(temp_max, '.0f'), 'F') + print('Low:', format(temp_min, '.0f'), 'F') + print('Probabilty of Precipitation: ' + str(format(daily_precip_percent, '.0f')) + '%') + ''' + else: + # Call function to display HTTP error + display_error('HTTP') + + # Open template file + template = Image.open(os.path.join(picdir, 'template.bmp')) + # Initialize the drawing context with template as background + draw = ImageDraw.Draw(template) + + draw.rectangle((0, 0, 295, 67), fill=white) + + # Draw top left box + ## Open icon file + icon_file = icon_code + '.png' + icon_image = Image.open(os.path.join(icondir, icon_file)) + icon_image_resize = icon_image.resize((68, 68)) + + ### Paste the image + template.paste(icon_image_resize, (0, 0)) + ## Place a black rectangle outline + # draw.rectangle((15, 5, 80, 60), outline=black) + ## Draw text + font_report = font20_Roboto_Bold + font_report_size = 20 + while(font_report.getsize(string_report)[0] > 120): + font_report_size -= 2 + font_report = ImageFont.truetype(os.path.join(fontdir, 'Roboto-Bold.ttf'), font_report_size) + draw.text((70, 12), string_report, font=font_report, fill=black) + draw.text((70, 34), string_precip_percent, font=font20_Roboto_Bold, fill=black) + + # Draw top right box + draw.text((12, 72), string_temp, font=font18_Roboto_Bold, fill=white) + # draw.text((60, 30), string_feels_like, font=font20, fill=white) + + # Draw bottom left box + # draw.text((15, 85), string_temp_max, font=font20, fill=black) + # draw.rectangle((15, 108, 265, 110), fill=black) + # draw.text((15, 105), string_temp_min, font=font20, fill=black) + + # Draw bottom middle box + # draw.text((120, 85), string_humidity, font=font20, fill=black) + # draw.text((120, 105), string_wind, font=font20, fill=black) + + # Draw bottom right box + draw.text((295-11-font20_Roboto_Regular.getsize('UPDATED')[0], 7), 'UPDATED', font=font20_Roboto_Regular, fill=black, align='right') + current_time = datetime.now().strftime('%H:%M') + draw.text((295-11-font34_Roboto_Black.getsize(current_time)[0], 25), current_time, font = font34_Roboto_Black, fill=black, align='right') + # draw.rectangle((193, 35, 288, 85), outline=black) + + draw.text((295-11-font18_Roboto_Bold.getsize(string_location)[0], 72), string_location, font = font18_Roboto_Bold, fill=white, align='right') + + ## Add a reminder to take out trash on Mon and Thurs + # weekday = datetime.today().weekday() + # if weekday == 0 or weekday == 3: + # draw.rectangle((345, 13, 705, 55), fill =black) + # draw.text((355, 15), 'TAKE OUT TRASH TODAY!', font=font18, fill=white) + + # Save the image for display as PNG + screen_output_file = os.path.join(picdir, 'screen_output.png') + template.save(screen_output_file) + # Close the template file + template.close() + + # Refresh clear screen to avoid burn-in at 3:00 AM + # if datetime.now().strftime('%H') == '03': + # print('Clearning screen to avoid burn-in.') + # epd.Clear() + + # Write to screen + # write_to_screen(screen_output_file, 600) diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Menu.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f0de0bb9dd3f0dac7593c9b2bd3a56b7bbfb6b90 GIT binary patch literal 4062 zcmeH|J#O4E5QXW;fKmk34a_!ekY+0raGwjgFxB~5Dh%WnhT^?|(gZ?4ka;ttI3(>| z!>JNLTyS?k4d+LX)adrx)1Y|V;QKS?9p-P$3w*Zmc%>B054b=RBfK)E=GxA+AiEyB z9#Mf=Y5bA%@D?AB87MJ~;9Nx=6n)k)>Q0r0jd$h;0-+StJ zmR85})Uq>yUNAi9yg3`tAE$hO&cdT&bnuGNL5=h;XYs-@(!U~0|8kbrzu+Pt#h3mS z^Gm;v^;PwbP5pDj)T~AemvnzC#W%tp@Tp*QNN=>*vA$x&s~Gtzo)GV25s&IC^AYo- zo$4Xxae@&~`Y-N(ZW#4QKZYIkNo4b3@x%7pzW?KQ`1cA< z literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_0.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..146e514e8e93d349d668c12b10cb0e15f8303da8 GIT binary patch literal 1038 zcmZ?rC$3@If$G080G-{~wt<${r1Y(GVEoApii- Cq6Z@Y literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_1.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5f8c534b82a93d5f10ae42a0af25ea6c440debe GIT binary patch literal 1038 zcmb8tKWp1S6aet2UfZJtEcyj{84F!JdI)*Yz4XI$D3sz8bnud(Z%}`f2pq@~s<~5R z4AE!>50&Ymm-pvPXgh?QIsNqR&hMU1djDba9JHPC^)2^z+`n)y_;+ZR69DPYctAQg zl4iFLR~(6k3IHi)iS9Ihswr5WKALMvnrB6cw?kUcsMcBpQXta#gJ|*ih?M95^CIW_ z9xdz7SR8gLF85}gsFnOJ zp~~AI>|~tdjm^_K+lySr0PKS79KVsBqa&-gFahRX>gP%z3NV2;D!@zjn7e!jQ|{7c zrMwj$4;LzwZ6h~fvAYp*wU=!H*GU)R-8h#x^n~g_%Sz%w9|J-vyN2U3c}-AW-+t;P zK40%ef40+v{`z;4#BTVkiCyEyuN)V3VH;p$#=KD+qHahD%@ISzf1nYy0HTmxW@|N4 zd$5-ENUiy&6OY5Hlk=aIe>?S^j!zw#1>GL;It1E!HdJv-z|YlSHnbA^o3fSf+x6~; wSPVt22baLBbMP__SUFkG2U)269zIqayAfWCJo-xHw`i8|LgNCQDsvC*9%Si>6aWAK literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_2.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..11f2beacfbf5c75b54ec1f4497a902aa045add30 GIT binary patch literal 1038 zcmZA0PiqrF7zXfno09cVvK3EDYqzC`2qJ9B!428&6g~7LegH462t5fFFQU~q+5XZYv|X} zpQ0Oh{cSrXBJKkya7RJ6;4>KX4-c}ayS5fvXNCVyWkI#Qg6dTV+*yDOA|=SB|dnFA{=RTQw? zOlcZgox}cR=o}acKPUQ*+GN96{a}|D)o*s-o?d5AsA+vs(R$*F`ib%JXDixLJvwU> z*3s?7?9|@#(+;dDM@ zpBL(b)747B-uRU}zD^D=4bxf|&a#;2CZC&6hQkIl|5cx3&gZnnnZj~H9l7{s_T{z>c#(ZlZKQh8zf=!H!F2mgpn zbid+`!&M5P>Yu6}y9;%y^u85zJ}T5+9#nXc2<8}pJ)lT@=uAJFHe!Rm8uQkR#E2Jh zoM!Jkw`97rbuPsl=XOp7#bsb!X6tYAo+WDPghg-E2=}?;csx&h`nFMB)w<0|nZ>{c z-4~bnF7Zv!gid5N_FwBT&}qF^eXKUYdECk!xGKu|M3i^XvCJXG`*ob3gn3&hP#>u${ipwu`A1 z#OD#*M{$qicHyVFmf9Gj?ZyIaTtG{I-G1`*%k!xyV|=|own47;KhpN@QD%FuD0AJ~ zPu=IJKlu5~kb3XN(r^mL@uue!>6?^?6X^jm_eHzjQ&#!frHb-ckM?<=t@7bMJISzr zu+M%sH{33VQSERxh`o)QD33~5DK>y)(hhIYeL zNfxR9Ye|lfrH|T|L)y`wT08sCF!k9vNd~u8LFue1dDCuP=k0S4jxrXwqvftSn80j2 z6Ut84#Q!o0Rh(-u8K-+0i?FguR^4}(P%psLBzk~D<`CL34fcC-14_H2sGp6xNjFR? z+4o`#<)|EK!9MS{;Z~JFo7kxt_Rx89TLb4%_BPy)b{5U>@rKvQr0I*G#y8XVj(lVK z?xXIo`F0H5EBLDl+AfV*8*Q~7{`if0ti@$O`Ao5c&UsvPDNQ*>eSQ!X`eV4DmJz4{ zc7d`1nH2{;2p&uI!%R%e=QCL60s_jKjHr61;fh$Jxt!O2(HuY6vvKq!e0WXwHDJ0z zdL)GEludJx?iYmdJQ>JO6jVJOSyuPS)?<=k-wP)|=SHC#A$g%Js4sXiE$H|38hJ_g h@Par0hwAX85W@Ni2v}X1_gVL>Wt1&AmPPJZe*s>xfq4J` literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_5.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ed57ff51017e96f2f99f45789ceb9ac2262a293 GIT binary patch literal 1038 zcmb7@v2GJV5QcyIPM0ep`y?n536Zm~1QN}ipfF10bx6%Sm^VmG<5e6HzXCMS@&=R+ zGK7+XK8sVNJ&7Vd$zl0t)`lpeVXWQnX6E0!nYr`x7p)j-eeRFA9&^3oYVfzVSqqTW zWIz_pi-pU-yIBR57WfZV?V!K-!rSrOnl1^x+Y0=aD=#P3iq5^3DvhrZbTu~BpCjn! zDAactDnDVWoHlImwMpY=+LrNCordufxef0-NmtDNO`E}r&O&ZT=AoYK46*ydH>y|chx`+auII5to!Pf#e6T=htYE9!VfSsZa|zRXKuelRVM zEQ32XmO^{pCO7$Pfnv-&>r*|D7CO+;q$Q2+c<`%YKi-y>%_^SdAF z3j$`oct_yj`Eo3L;D2o#lO2D3BK36q(k!izMixX(?ve}U%?*l9e9;N7Z~5!E@V5O1 Dr~d`b literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_6.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_1_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ba4f3a8689cab25a1ab3654627eb9c76b624da1 GIT binary patch literal 1038 zcmbW$J8#oa6bJB=rX>n3NyG$dNGz2{MX3m-l|u8lz{1oW!O~Aqm5DwAwh$7CrHBOt zL%snSX{TITqzoW+Llr|YBLj-lNZ65Yefb~T6=EzWI{xJxpTsxU&h3TFFojXaaS}O& zTtg=CI*LyjBF-T+I1!p7di(b%xM>j`!yulw%;Y8@Xe%fxit%(E5&R5!KtP+bPx@$Rw=!1DRk8zQb0R{ID)B`A@l?H+^Rd zR^F?zEg~vUE01?+_JUG;es<1j6xeEh{V_b>QzHSqB9tOHIjS0h;FR~M1asFi4M4fH z)^{vu9tIs)OsXNSjfx6Fg)*OU4O6V?)B(|n;acbel@2vkgXfCPc!yCb4))nWC-}++yP@@43jyEvdh?@p z3DMSBosHcR81_7hOX_pd=bYxWBF-;vF~j|!3Eg$(P;zO-MWUHdK<*^ymItg#{K u6|5(vaT*Fq;d#;73+ILQZsxe()y2g~%^N9XO7~bVd))ugf6e34|HL23p>gT} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a4ca53c7655055e1b6e629bf836aed6254aed93 GIT binary patch literal 4062 zcmeH|PfEi;6o)6e=*}J?TTfxZy?4-Sh&bs9a)exE7GjsVfei?{Y{boIL!Z-vi{FP3 z0>wp{39s-aukX($V>FE35< z4bBV4hlTKmmBO#q3a@M>+}b<%Q@F9?a*cS*|LnD%H?Q^gzLxspqxRd~sy^MFiGO;R znRTE~TaPu~cLOe!ci;gW-MQ%1gFA2lS0hY+#$!I#!+P0|p&x6se_Mksvu>BHhv>0^ z9xb>AWBzyG0nGX4{BwVVLi1H4On=5>KGwr}*^i+gqaM_2qxI+WD(fNpZR+=U3;n*p zk?iGsv$zlrt_07)Gq9eQ!4-H;ra$8`pVq^AEwUez{6;;f*Hpc;zv_EpdIYEQS2>-} grUM6XHNx~~ydM9L;9-R6&v@jC`Kbr>I>veS1H&`gr~m)} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_0.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ff64e4dd383a20fcc6e702b610c2e23ec06de673 GIT binary patch literal 3014 zcmZ?rJ;u!d26jMF1BfGl_!|&20wD|>;bUL`VJ4se2m`@?5P&d8$pTH=)J2wg1M(mv-hXr`9&pWkb{wx!UJt zBeN@Wv>~BGp07zxG|}8w+-)h0V73IeF9>F9=2?!YuYXfKa1!@!A3O1I;3>1rmYIxq zzJ7qu5B3*@mCD9SabxB4U-3=1rdO?3Gn`iMxH7yPelFu=v{- z2X-NH-#p2}5@Yi}@ak)neU9v5i~o`5ct6fxI34UC;LuSz#jXY3xjt}J__rxMri1&y zZAh74!qlVN#bdNNnpuLU);v!!MY!_{6L0OXueE88&UWM%W@zH}1 z+#h&2lTSi5&ViGhoAXm~6xyUcJ4eWD79*~j@A1j2C-3oz)l<`69t)3Rgj1VB&EDQP zq(NmsBLFQLu7z9o8{OV8UgY@^PZj4!Q#f>b?x_tL=X~f2>pAvr5{8DH9k|tSzdiho z2T#vmA}__1{b158+y{G0d^JLLbIF$+(wcIIN3o97u2${A3&T|gH3aauvQ>rsk zVTBjARSwp%ve8-(CT=NEjh}4!ynTI>`Q1;cy}0qfX?~WT#5)fh=Vx8tIakgli5B~f zO`ZgtZrK@{aWg+pzp^2eM6>(|=j3W~yQO$F``SW%L89V{TLUY(Pw7OJd7_V|)FVdg z$(`DS7>zSZvwRnxD9%hGbA!5(?L06LWj935>%uHq=7@4F+kC_aX8G=%lWF;OX8G=j zD1nUS8$ZbB2qB*ipP{h)k4(>Q8wYZZ_)J|EON>-**A_f7vhDUI7IE=`lM4;A*3R0R z8zb7=was?;dvm6?^_|}Oc}30d%wE`ersgZVaG&YpdmckXl58Ilw<$cZa+f3pj1jzOf;pRkEGP@?z;^WT;c87m=dk;A2Pgwu} literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_2.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a7917e1b3edba5003d0c76698ecc53ad2b7a082 GIT binary patch literal 3014 zcmb7`zi%5i6vyA?T%UsqqDBvfh;AK~&4XhG?cBYiivV4#tt#O9=(wo2s((Py{398t zs)$DY38A1NOHfk~kWvV9uiwYhIqB9uL-I#YJo5dfzWD0pr@JJqh^7~jj4<}={;A$B(w5Fc0|h8@iDl_%;ATX zqv8SdGY%VYd6?O^JRo($vz2e?P=PC+yTH^FRxl^j_Cyo)HCGmV4DM-G6pbCh?4D`B zrxd_PbsEy-r0_plL^7SxWxsMeO9jVEx~#a^!43`+Ixm}I13NebGDKx?RPhRIsq&r_ z&pc^M$_dZGj!foTM+jkUFQBimI2BC73e4Qlm{bD;OXeh;zy))p5f}#{y+Jq%*X)Hu z4K{2Kgc+<5hykgUaDjwoeufW}dCq(ORpPd1n03oPw`;t_?Ut;p_tf8W0lN{ytS^+8 z7~YbDsZ+4&*dd0zv~F-%PVpu9T6k&2bnxh~T2jltWw^Jz_NS`)E4#g%3BT!hqN+5I z(7c-YiBj>N^)$d=(TB@_vmc9|*CFYt3mu!~NBqim`o_GnW3idnQFxRO-hvyLDRJHI znmQdzD2mMC3=wA1+a1>^IdD|M*9bSxg{h3ncVhD#95u3pIIO_VAba>C)X21CvQH)| z_E-vge1T>my=O@t9)aEwb`y`l3*tslcq;!zz&ZookT27*)b^fXXRrRiM;$f;DX%Qs zW^~V08c7LC;gJT5Q_L3DjZBHD+hZ$mif%y$Rp2$r!GHVNqn@G^O6ELMmexY z&!}{6W?;e@Dqht$III+}!zC;Dr{S0KvC*Oyf9)=rBo=~;O{{~Kr>XyF9a%PYL`P3w zZx|a%AZfi=OWY)<hPBos>hbomcBrFEUdNs};PIzGDcf7s65_Z1t(IWSN6GRWxXsn^RnQ zQj_tMH8^D(kghbG>IXTQ_FUJYS%SWsSoXxk$xU7~=236P%Sf zpprVCm}~C1H^j}pUjyqpzLOy>HHq$6cl>VoVkK)t9~Zw}NP04V`IC4l*S1Q9{lFlZ z{Gyj3A-8TEcYKi<{zA@Lw!-H%W+Qw74m9UE>GAuerx>lF+&GlGNi%`*hQOzEJT8(~b;-DMGNh5Y9Ak_hBIGlHD^B7gAsVb|#s JY2@>N%0K7|VVwW~ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_3.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b46b3b693fbc9f2641a069e75af63dec8854faa GIT binary patch literal 3014 zcmb7`L2D#M6vtnu{me3Jc~W;ukOn zzknY=NG&URjJLgrTabeu#2Ja04m+9h|9@589YH~B=;>d-e(%+**RNjp&RgHz5*_#P z{|b(`ar}uR!>=9Ru8Qzjf`A7`;E4F&|Ce8MQF$yf%&ca+y*YOi#>)_TdB?EtxQMLojbtjP?RjG02(wcTGe(pr-o&lQHiuYpku~T{fN^AlmSE_6 z{wGoo=|*XLjbOX@b*^;Bbn%On|H`Ldw~neCIz?z&c`=i$<$bBzToqFH`f#7**&|@^ z>T|OuTV+zCIyOFZa`+KBW*c~(OsTsS1`x1%~($R|>StDQPH)iGhQ6T-ZnLjP7c z|1^ZlB%d!szFb0%MS}y*;6?cv*plJrU2urpJnT6r??&6-DW9r-_yBl4y@sD=_d?|l z)&IHjCVV#GtCk1(*#?hq~)t8HvFV6W$$WMTwVr8{k^N^U~!GLU~DzD58*U1%Ne;muf&nefKaCOFLX#?rpv zvBmh8V4Eiv=)^q;127g79YOzZTqpU*kY|ZM1Pe-<;}8C2Ga0swwUB?M9M5G1bN-@? zMUCZ!XeF|Wvh4UkiXW2B;80%niA`-^ZTVL1jqBviZsaxA>Kj(&6Y%tVMZ{AqE^B4v zIa_?9VM>V^!`9`TH!5&dJ`G-~CafW2=4qHAJq_*^#j`LgBWLE6TZ;J^ayE<$@Cw^O zSb%1-Dnk^!t7&Rvxe6DvdO@}V+j+(9Yi#yKXsVKB1-8}PJj2}Jb;;&=U`)oMv8Rq| zT;J5pW3;?9%wy}eTXt?@TK4` z_O9yU_uHrlOAE-ys2--1`V-NoPPUtrae!~+(Bc8a0eN|oT`xDjV>d|QaIWLl5%|rM zUgw>&WB{Mz2VMMjveniG;wiiM?LFk#(j5BtQ37g>_)F1`0bL8qI1b4BJs9kueK4@i z_d6Z?(w8^*%(k|6<0Id)Tdz`~z~=~u-hiJ`-p7V*)#}@}%o%49wHccfUg7}feSU2A zO((Z9?RmTQt-c+XT?{fVx)@}GO^d@Uv^BQerkwISDnx$+r~GVymr`u#Me{uMHw(`4 zG!@yVM}a+)sboZr*h`10 zgt?$$EE9cSEXOqHa~+62q9Q;iwKRT9q|k(QnWYyU+d>vU=HffcswuV`^z9*MEtQ>? qMirT2b~WgXi7+Kk$n4$VO>!Ao!>=RLjebeRcbQ;gs6N&I$M_4;F-+wE literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_4.bmp b/docs/Touch_e-Paper_Code/python/pic/2in13/Photo_2_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..749976cfdd73ef87e2d04c62ff3aad191dee8364 GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/2in9_Scale.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/2in9_Scale.bmp new file mode 100644 index 0000000000000000000000000000000000000000..55a9bd91400c2efaff5f02d376025ba07ab11bc1 GIT binary patch literal 19062 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 R$~ouS;yN9;=lnWD{tJy$DW3oU literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Menu.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7f9b70ad718633b6966c51ada34e65473127b4a0 GIT binary patch literal 5182 zcmeI0J!`^17{@O-*hw8aD2Q1*+D)k#=-%&AaH$|opo2?MieroYDio?8wUCyIssTNv-^J40% z*TM2--kbJ=3&GWsK+A;*a<1Syy^*8Sqs>M?NaJ>T&l>J^LOUr(2Z^4WO+p9b_AxH4 zBd3eIcnDY?=j{HTR{A^^?dZDNDi`jMyDxga&X=GaZ(418_{j9eD_`gHs12~~qZi24 z0TMn^?6)0`W^vOSRCwnqbig}o6ncD0aIiVV$$8o9^yIwk4JV!W+W$*m*7yU;=6OUo za@k0k2b(Q&&cl)YZH}T!f$QObl(l+C!@01{l`lGxm&4Nv3n7&Z|9m7QSIxNg+d1B%6uyX*!xST=fFnzQn3IsI2+c2t74ajtK+iH;D!(jy+%2U z^Qq))CzFfZNa)#^YDV0xUz&SbfPI7Xe`}{!MU+3`g0;@lB{^dP) f*$wR#<@vnFu&;(wm|}b}|Cgl8!t9T~y+1wxK5I`1 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e12fd594e54b7326e1219b72f1c170d4f5c79837 GIT binary patch literal 5182 zcmeH{F>b>!3`J>V@YXEdz4j1A1a$A2?4SqnRRpy6sJ5;eT|kgZiDYUicGA66U^5b5 zzQk`jFR!OZDC30pr+jq)6UGidWnli}fi7C0drArLx<3%V4E@Sy!%SGtddT|J5lMBEH$1Lha z6NgQ10X{f!sMc_NF28zKs29c^&H;>NBi0+!T&9;gq|VwG)T1HXB1$mtE$~4^B zl3wf+jWfrFv)xPyX}9-n&L2K0F?0Tl<0|AnQ*IzUDm!aIYOX`dIk{!@K&_2*U u*zN)KMST$m^nX&EsH6H)`yn&+MVzRk`cnHLGxbHBsH6H)`ysP`=*thZFaC@G literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_0.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..adb151920299fcb08ad50d2b55b27c97d11ecd0a GIT binary patch literal 614 ycmZ?rO=DsJ13Mt80mKPFtOvx5KnMaFK=~tl5DXT86951IN9K;QM?(N-2mk;WQ3kmH literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_1.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b283c5682fc397ff001982a7b73efb16669cd9b6 GIT binary patch literal 614 zcmZvY&1(};6vb~o$cGJiXrNRxGE)qgl}%f0GGsb06meC_R$Ry|lIS90L4+ z7`l;KLh=u|utpG}kbxF$F_=XlH5F{6sc{j_=zu0rIEFOK@VU2fr$Pm!y;ef>Do8LeCYNia9=XIg*B2kwil@nC z-~dZvvsZ|chUNjjfVa$(JLIVbfU3CNpWPuL#*Q{Na#qmFvV1lJ8!CxgAA!B3FUK$) zT3g@-xFr`R=@;vbz*v&s0X?vGBTgMSIq6qFt$d645>6jZ^0;e18}SM*Cq_v2m^T+j z5;hR?`Ss@Wv=U5sw3(NAu|9h(b1X5Mn7VQ|Ubn&-&|P|5)o;|vk&IIdt%!KTEay&~ zpI$opNUXdv*T||X%y|W=@_x8xt-3;E?u#;iFnHYG1qawUJQn)#1R9KC9WUP|)2@ax z2TCD!{i}NFK_m476i)yR)p4>pbq*8(?TKodw8c9B94Z~pr%6hx0{BpV{$847Wrc;u a(fPMNlEn)wFfM1Ce!@isx6Xd_fBgh$huqEp literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_2.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7323a21923734fed337774682827ff7006a02876 GIT binary patch literal 614 zcmZvZF>Dht6o%hjDx4w8g^dXx5~@0NXof^k;fRF^iIIWfCZ-BqMWsqrb$6%;F=Sw5 zL1ANHW#~k1$j~852L@Dunk%VVA=)&N3T+hQzt2gBBJr%>{_gob``z>XhfiIa*gc-- zSOIIEr?F$S%eM|9~w>#U-u&(oxbE$jQbXK+O^1Zd)G1Ae% zGR=G&V^8}Yb357Y;v+~fr}>kev%2&CnzX;v8^uYqQaa(g+~E&wU^92fx$eM?D)?Uh z0`utAx}pzgmB*lL)*x9zR@vzRFC)C@$6K?1Ka;;7#oiIx#b^(v_>AQ7*S0)(TdH)H z(s+1SzxgMSrt=sWnu51qBkFTcM|#m423*r~?mjJw@jGEuY*}CLrQBm?n3Wp>hF}?+ oRRM@8e^OjCpfYxys$Z6?E;-CUEfc?{qt#Z-ELrCTe!c(N1+5`6T>t<8 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_3.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3cb9b7ad80ef42b18b6d82e059d7e025d0a35990 GIT binary patch literal 614 zcmY+?F>ljA6bJA#t?&S9#Ku&s6J==`kb;oOQ5Gip8Ipyy9UCd(EOqFD6h;P6_zvC4 zQ4mojg!=(1a>No7qP8M|Eua18e{P5Ltatj|`Ms0x$$2BG#ghFfaT>iw=t<|^--lQ+ie3LXz$SOx2w9x{evgQhTE`t2kSlieGmr7%J|jV z^ZIMJFOg*T2D`zD85@bCc{JR6)V&pJX@g(+aIYx!g?=ocF;u3szLqiGg(?**KYZpR zc#lY#^?!6NPi+9K{!JyUN>T+F=M+fz_4XliegY#Jcjzgroj>U|TC8?H)H3Hu%6Vj@ zW|<>T68@EqG9AoNAYVZoXxZ3!7|$X)Ef9G)o(Wp_;bl0!pkvXm{S5NYZ3!*LpU}^Cmg_30d literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_4.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e837d1d24d520e451844c5afdfadced9d687c36a GIT binary patch literal 614 zcmZvZ&q~8U5XL8MXsXmEUbKh)I~3_jdk`#AyQLI7iLbDN=(XTM55=Y@eFRVHBlrNK z0SmqP0)nm=dlAW@;7Zqwvq`ZPoG{C8zI>D2%rlgmShV+v-|UH#_>-7Z>1a+H;DY10#Aw31X+lZsv`Nae2JKG7 z%l!&RrP+m8YwirsBZkI;zvdGM7pBRxXoQ{&qCrnDymNuImf4fPv@Ug{sO5g7pGo3 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_5.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4b014288363e95f4578169d138a5c4d386e00226 GIT binary patch literal 614 zcmZwEu}T9$5C-5m6HF7l7Z9$nNhNlP5Hn!!J6QP)7QsztBlrS=JW5Wm6z&l&V3E#j zNZ|(e_V?etAPVl?9^cL_b2EF_H+M&p#)QuS=PlKM%gXy?Xpqc}{1_Fm@FHQ%Jak1v=?$=WlCzvCOte?Y|m literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_6.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac3fcecabd8655bbacb009036798c960c0b62bcd GIT binary patch literal 614 zcmZ|LF>4e-6bJA<4P588DWa>5q%wk_7V(~>v+x7h1p;=$NeVd#%yrj!g{8qQ{Qx$C zk~!Hx8eu*_AiE*pHp1Mp;N5z2^Y=e{S7_lZZ}{z-x9=^p_x$Cxs9ino+l+n2Jw}I5 zSlc{5y|IcmvEBgu{rZo^G<|=l-)k37pBVqN_eMWUo8rD$AHTKwm6@xd*g{Dx>X)kkD1kfCf?_}WDp zSsCgfE>g&fad4wViDlvZ#NA{c1vUFnd; z;NT#la0>ksil8mcm59w!Bk16eaxGE=qV%*^av`}qzE%ev{62ghKF{-P&*%ntxcSrlR)p>UFv=z1&(*8}`app5pTG_DFKg$_CE7-B4!to(&d> zBzF3nIpbM!lIZ+Oe%;J?b$O~qx1Kjv&H467G})r$($0I6+Q@cfFbCD9w#7CV**OF16n%2!O^1yF7Yn-bPO`?cBfy2o z?WQAGb*R9VOLFrgjB$d_D;E9(0YfSaixd`ebE1$&xFA9l zG)u6s)Xs7b3>>1kr53^-L~a}PcC*6mnwS0hZqGdA~J1sWSN20XR53WU^>0O6U1w^Ey$iL%lP%_hI?Y9Q6>6cJ5cc9bKCD zLj+R~Tc;{dmacdnK4r>2-)PQg@edSs`|8S~S@jVsWs~;GT}mi3@W5xAUy0qek$J_< zlU*uW%4~?yRa97Uh&}X}+=-KT$oqL@BQZ=UbAG8W|NZ&QdnSenWS@22FWrCP!Rwz` zAizL!f7Ezv#+JP2r%w$Eu|cHMH7#BZ39p03Ge_JB2u|x(w<@NA#jH)g*TAMdKymx@ zi0hWkgRx(}<7vvw<^Y_s!`jQts{!(SAnwKHO&{64HO+c^OaDwPyT=Xdyc5Z%?sndq z-#`R4KGoiKxq){&<9gi(P-?(yVVfUB6P@B2J1 mC$dwS*J0&EC!V$RNG`R^tCq50ELnSwOzxEgANmOn4E_QFtwqoP literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_9.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_1_9.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d1440514f9ef78e6c5aec6145f3caa06a293c52 GIT binary patch literal 614 zcmY+h=lr#tRa=ZcT2 zRFBSYtgqaqercU@GHcNZc2I@5Nm@GrTHocm;UdXU$T`qbW`jCTA3?)*E;(_C(ZXTh5vock{3k-b>!3`J>V@YXEdz4j1A40P|A?4SqnRgAXxsHb+-=m3ILN&HkR#YwuC3S@%j z^EdTD=jr)yPiY;(^&#$tXbiClzqCUA{f;-^;H&qZ!oIx%ej5tJRqpg7ag{SAXZM`1 z4M+2c8_STvsJHAcaC4suHZYN!p>w7;c8ObwhRD4@|BNGkzi|6?;ODCT9JRmoTxa`D z&Js5cJ=eQ#lUs>j04}Ii9Qrb$_qc=`E^tdYXX2VMp4Se3imA`%g`O8*cCX+Pmbnpq zWv=}!ID*cMa|(CbyMi03OTr6$%iIKR;rdK{;!M@w$urj*<`zC)@PYHJ$DHd|zHczv z7P>XpS?0tS2i=PEE%YqrFn?MjKac+Wapv5$p4Snv;^t=J0><6Hm7L6<*?n+fLj4O7 zLFOLED2r7V=l(BCxowx!7xg7NpmU&epmVT21L}+VA`a;Pq&QJV^`-PfGWA8AD5LsP U`XQP6B2JW1eJTBr>>v8_4X9V%0{{R3 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_0.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2bd14a276a259844718d153dd77d935fd0f2e1f9 GIT binary patch literal 3822 zcmZ?reaFWD26jMF1Bg`^85rV#G$Rm#zy_fF5hw-=K#BkV|08op*`pya8UmvsFd71* dAut*OqaiRF0;3@?8UmvsFd71*Auwn{008EQ2i5=p literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_1.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d62569134bfbfa1a14bd69d4b4b68bf2ee1a4ab0 GIT binary patch literal 3822 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 ao^tW={9jzg^2Qr@=?@QF^z23dhx`NWN#kVz literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_4.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ca5f74b63b9242d31afef4a5aecfac4db194c0c GIT binary patch literal 3822 zcmb`KU2GKB703Uxv))nvHOfs6fg?d5Ey8_MuM|C{jb@v>wN_@L+WlrKO-!JPv6#l~OY95C)O69+q@8>H=BX`dTfF#h@rZ`hbj&?oSpDLWwSR+>pjD<4R&rJ_*aWmqk&GNSG z>FqJq%tc0SpL6xXOUS#()!d#}f$iS+PbFIP$%A-pPXxHYaLG&CZQ=nsEsb{NQ$649 zVw2(Cb<{3#0+CZ`O*L^*XljWO95Y`&mtq4{>c;{na%!%#C~L@@+^&}^sBhy5@r=j`U{qfkY}NP4ex*gp4ejbc zC=pT)Z;PW*UpcN5q&rTlRpAs%ohPwAdd`th zV9D>kty;N2>tiF4TN531W@{p2^2dLiYvn@CW#M(c4Ko^Wrf&*IRM6GdjSv)!dr$@~{NFD&n=ymg{fxb2KYh6VATsxOiP_2y?YNWAxyW#2wyr~pqiaxUxud#l&jinExc0)#%7SI^t$8o3AwQAQYg z^kx=Qz-5!&CV`C2Vy)sTTN{;dko(dp06Iz@zQRo3UMry;SYv|JGRKNK6fn-mfvw!% ze)MDFJ~DU2&qb=4iK zG8fKe+qu2^{yboZ&%=otG8OT&Ur2AukB$0LlBuzq{mUHrLyB2)Y5sL)IseMGEzeNM zrDHb=9r{iC>+_VlL9_IBwG`{zW}x~2L(Uu7LZYz9&BGW}b+boUOaYRwuqmvnRL5kT z?YG2<;@8_0I!c%896f6zCsO$wQcK)N{dQ0{`;^?%T>f;3ZJMh}EsKX5~u_*&-teO7?uf=awbzoi*aqTSePC+T^SUNXIL? z3c#v|9PR2)O5!L_MMsC{=?gm1H2Z8Jzsy}X7y5Ojw&}!imIs3F?OwiyKaIcebw93~ zvqf&E?X3KlVbdH73oz$rMElXrE6&HehO3idOz6x2yV;cbY2E*&6HwCU@`p|3H%D0Q zAtMsyDbXX=XUX5p(1+3EQlhzQH@JK4sYgLP>fHSG1j2$b;!>u$kNJn11O@gvdg|O0 z`eB{=JMcxmxV$v?VK+C=%rOZAF__-T8Ga&W9Ez6xs9wzRuR83wtey2dAf08<@pA8s z)EfPeSt|8$vG}#S~>g2KKa{CIo`dNm;@cIwhzw~Ys7uv3)Iq{vm?OQr<9J`^MODjp$ELWBt#k zn)NkO`W>bR4#Ro!@mvL&85f4}eDU$zf`ZN7GQRt@$8({Y%34vXec zed8!+)sCNV+JJ52Jgi%C%X7U5BsREn2y!WQOjNfIoL}rnY@DmVWp13fgSf0QuW-wu zQZI>%4fd#{hs0W?F*_HrPaG55=-fWIc2Hj|jOwwP&J9KRVD&(So~l(17r(caDVY%p zZ2Cf7z7&x#i5*B4aL}0xThooWSiq)6Vh8qv+&ntxR9`^nGBM=A6UueRR5+!2QOgq{ zdtJBVfP8>;Jvk$>3OhWXF)^R|bbXY)HhD|+ zcPh<(!@a>T?$MnST3x4e4;zQ*G&|Sp9G^$~h^t||&Ru2!Y(ncL_c#0vesO$fU=^*G z93>k3Ffp%janioZ@lnB*4pxZw=Q2(jU-yMi?Qc2S6^(?uS?2dtc0_rd!!L|8&hyGY zEOejr_8UikoV1yB+Q#8E>w5H0m=7$oPOE4nR+gQ;4@(BTtJz76DhNCPbIm$>KJn=)YW1*Uofq zI&qDdCNBlAS?EoAVWc-J8{#-Xc-q0|oDTfu4fQx3*yuAw+!d{aw=lDptD_UWzn0** zGaKh|h|`JQUrR1DI3!j@nc(I~(~^9P3ip7QT(~VVXh2S9}cE)gn>U9vU3O5>+AAB`1fts3jSj9c*hGIP!AVV bUXpVWN7wrZhSoGcOc^_=Ihge1{fx!`bswT* literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_6.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..162d06e13e7f9f5b4432b0afb7cc1e9db6ab17cd GIT binary patch literal 3822 zcmb`JzmFU>6vsVUlt~d~DTx%$k)WWAlqQHHMl@9X3qV9c3%cft2v2myQbd}6Aj%f} z14wD;ZjMEoCd&N-kusYtwo7KYB3|8`zkHwVnY~|uChu;%_VdTj_Ve?PufKhLT?M(v z^fP{+W=eg>-;94Ef3W`V^aVvq0Guwqm%LeHzop?PwgeVlmzcMOp@K!^{D9+%J@wo+ z#^gFv!a1*5tN2~y{H|99b!VsOc7G-3)#wbTZeZ$wZtc_Nqu#-d<;^Hf&F?l&JEuu~-$&C)C>3CV6zEI6{( zwuxKS8?Mt%N+MlOYio4I*=TRQq&C^>4BeGPnH4R0;jE~-1(U>4uSF+PjA)JJf!m=n zaVxeLMx;`^=qv`#|3YQr=I~Y+kw)FLES0@I|2dV3Td=2I+FKu3S|2#v-EcKddJJxx zQKwP2DN=CL4)*HqhHw=Z4V^ADcbRZTlz40hu5_A;ZX~VSVvkby~rc?1Ww@nvFbr8ukvUt7RWhV7Ycp| zAKOBS7;>@~lSGc^Mla;PuM$^tH};$knOR>B0Ta2BL9%Hdxwt$6zcy(em~b?Eq6(AA zB)1ty2pF-aGC37P`w+rhHJ*vXc=1;E_NuSO2#yFLtZqx&Vg5LJB*tXERew!1EZ`bkkBAc@vv5x449J z8dHv^=REEE`X>O8seO#ae+0}nu z#?A1Q`R9xD)%8UB{r|wr9Wud+n{O(j#{nlNEM)?vc6^xpCy2x+X;8 z{7*esS2>k@i0)?eS_@_Wjb!aKhd1xeo)!e$~$! zN5MEX-f%36bKXf@ag{CEmK@{F^&Df23TmDvuDZgOZzcAqTz9oJ5}C-o$M@9lky|$T zRGtse^73?iz$BT;uTwhtrI8mA-tgXtT$wQOF-46M=fYF%5Jlwd!13`Rvr*r~e!Jk8 zL$9>lea>js1_`eVUhF9jI4KLflujAa?wXDiO>r?KP*WW6A!K+Agu(G{l|qt&*p3EdIke;XH3YUz_Oq@L5>Mo!QW)q!FX9+CVF_PCA) zFg#1#d9F!=4IC%A-*dn#uIdE|9Njq;E~7o*nZ7`!e#vo34X*}AhrM_=XG0LssBrFo zIWi;c|0l;=OU#fn?Z?cVmpBiLb>#T!H0_P^5X(L1633m{@UXZbJ=a;;41k5LKDj_` b>~Z0ud%cxI<$?rzG)C|BT=6bWy=VCsq`y9< literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_7.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1c6ae04a7c2a6054be40195aae20b2a00d3b3a64 GIT binary patch literal 3822 zcmb`~O>Y~=83*uZxhhuz7_9>LAR~&FMG7lNx`G}qK*rF% z%>Fp@?CiYx+^@fxr93rpd>wy3b%@@_*}*@X?%?^|qrW`k=)lb1zx_e3Pxd%t^UjJV zxX&)pGoVzL4)_bECFx=-=I_D0lQEBdP~;v(w*G7 zReIYUsI#{Z;F3W!WG&hJ0gN2qI{$j^Hi^!z-`Kf%n|Z=KxXT;~=F7G`>RT6VrUplL@F`h1{SOyD@Ih!-~B35>Gm!mXf#uFyQ_=2U}W!%sDac^Cnl!=_HtxoNkmMsk}p~{A&@_nkK`QY?*qV@2E zOvLs2>P+Egt((&50dQ+@2fU}Zs8yn$!CkG_Pac)09FC?k1?Np=RL0ldHNkUqoDVn= zcWZO69l0vpk5be>`=OK30;d!hKdJWA7knThqIdVWg{Mdy%~(fn?wAF8$=pEwkuwpA z$nPIJp=L7c$i<0ma+0my&W|~h`>bbu#Ga=h2jr(->dob@mRzNCKj%~om@DHW=lr>S z!j>o5OU0SoH85nS))1;6^GrTvU{05m-<7jkEv1{Ckb+ytwUD!tN6=NgT zrzyrb^5Bc4+y zl|1Ty796k`T_)F{JBF|1^`;#0<^+d`B!;8r_1(SCf`mn~9Kt26PULRFp%~(hG0Uco zW^=l~w=5Ejl7_-i#kAz*Ze$jN5u&vXoVuFROzfSpE^VS-jC+-T4>8nobCMV*cRj;N zD*KJxEp{+bFh_;kOnE#Rn>FS>Yt`j(%y4l-=!e7g++o&1`}H#vaqONn+x~>t8)#6e zpN5571tSq)is5n$j?w;QSak!SB$uURfFO1vKsMW)gx-+ z3ubz;i4KMM_PHy^e7bNGxa>QJe67X8X*jJNZeW;Sgxh2N5$eSti1J0enY+ukoCCC& zp5bM<^KgAOl*gA8t|6bXHY@jg37WaHz<)=v0UW+MDR-B7KXO}$5B0DytCb!Ww6rrT zZ}7GjaOke>mb+nH={wgw^{RDQ#}^wcQdyL@+AduA|L(O{doR!u+Q)d1DO;zT9dgmo z`_XR{9oJjS%R3A)>DVPTm8iYhQSN~G>*yovh@T-oTJE6*H2HgQ2?E92EOzfZaHGg6 z9NN#&n(Z%9%fkyI9dx91PaTZ;B$~6X#`qqlnmaG_p5-oCm8@?!p5n(Nj^Bn3G?TYMkFFT;1k#JuAx;tL`aOkE8?+ zdS*ly|K<(8bBM_~ydw7_qG~aZUxiE3m;Ob|H?K^J_r=6LLMVspVk3krNtDF>{)A(C z>EBeD9@JI-z9;~(2Zz1pBHq63q9kU4o~NnuPbybV-=eqhz%CeYLWf&%?gB6)vFKqn zdl0&x%x}9Vos`3z~QM_ z(S<9dejnOLskF|hhP`>u#r({F;Tq%^47k)b!&s&)rLePti5NjC3`v~92HORBkc(!EaD_Aag6 zAHmf90e>y9%QM_yK&L3dgL3FZk(*f&g`8aoFxrH4E;`qRVz2v~2-Z)V9 zH02APliwmDT;r!M9KUAodT|!wbn(C*$t?$2%*m9!uJC|8>;8%xCrnATu&a{s%*AhnN-j`9=s-!Y`E_4LCcSV=VOn z+~gWzds)>GZs91#7S83^AY?Dt)pgm2Q$yt{eEXK&0O#d7DcS1*qoEh&ZfdYkV7`69 zAe%&WCE6`qP2=9@O-4+yyrT_o{ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_8.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_8.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c55edcb82ab3299271273f6b0431567a8b87304 GIT binary patch literal 3822 zcmb`J&x<5Q7RRGVnNk=gXPHaMmK}=1?9rw#B^Dk20KF*q7sxDq7(6-BmtE|c$fm%& zxR%Ra6dLnin3H%AD~l4#!!QLN_OgqeH3?mpVJCCzFj008&+m)O`eAoFC!@*i`0>ea zy!RsFMZNLv|E>sMcJclTo|hUzypR74{BgO9@$c)$choN;+HC$IbwzzjC?`q-a@vNJ ze`&S7(;fBteauISte=Oufddy1IYlvL_pEexy3HW<+<+{*BY22xNlyBYb2_>11hwyo z7b`9yD=ThHv{IB-^nRjFE;1oC;{D%8Ph*?{ppDdorKEGlvpf2*9e%Ps2Wz-K(wicqzbP$#fl;AM@i!6QVPmk9&WU z`v-OttoB@j?IU0k){Ibo!}Z64IUk7ofND;IOQ_He^M1;Wek!)!thv-zscF1R1vrlKH<%|)I+t>lZGtx>@00k zra0?RdWKUxuV_&loC%TdZUmkS;dyQ;9x3qcpJxh7|+vb zq42*@Fmh?%3m`P{_BGT3x0um=m9jHS?kWiG!Zc(wXc+RSwAT$M2RKu6)MBjS z+|#Jp07PkT8gd~`*Bsll$x+WpD$PE!j@sn5)QZ!rNAV~Gw_`P8u%Wjlc`(9bHE*&q zb}}!`wo`}56zh2+v8s zB8f22us5S0_S_DAjz(jHJ7i99u9G9wrtySm&jrW)Jq%gKPqGUY*T-_wKM%(+lE%lV z+x<;WqeoC#gfY9+JDib*0Z=6*sI}e~3LOF`E{r9{_Tqe3&ngZ+t+_T-Jf~xPLCvA* zYD~>~7W~S-t!BkNRdM5#>}_yBc!k%Tg18lAe$f2^YT=07-@(B|&POXQR721Ga--t( zl-xEZW$tmZ=K3nbrW14;QH*XU3!U`9@fz+gIh^uD6$;MMY3ezn%f)2Y_e*=)QMDcp zSE8&$TBFk);<(s}G2h=nWr|s>-sD^p#?m73$F*o$aYKN+H79#OHCNzwghDhg3HtvB zl-`8t4H6wrD4k~~{<87$D`Vz{E^Mp+bm|?#K7xO7E;EMs|xD{4-4bDDJ_n(hTlst4kL1j`Sl1-ZWW%JfWx+_^!Tb;Vb!`l z_}esri#fOnhH4H+?+iEZ>?Mc*IDenj+!{iS?Njs4+Y%<{lfjd@vVBEjG4t`4Pv#a! zZFv=3?;4xAwC~)!(tOpDEusg}wdlhqa`&&wFEl-P?{PMM5@&A;d8GWAW)A!LTw#AD zbDv4i#rVkvm(G=n+m9r&UXGm{;k)1CLc0^mUJNd4v{?U~S{3KezLLtru|NCOFTV32 z&l}ojQyJy{JnpLV4EHeCw9jQS+UGmL9_ZiauG@Dqd3T37pK~rES?|Sf@4qa++2MP) zG#5eW^W4!%OMZKek63=up5jlL+rF2#LK=<+MPK@Hac literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_9.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/Photo_2_9.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7ba9fe47604eada0a46a5deda31275efa4c8c3d6 GIT binary patch literal 3822 zcmb`KKaSis6vjE3V3opHwOcGq7b#M@Okpe+>2rl3M{v0T7N!<1T<#5=E93wvI7k3r zgNFM+=~xJ2zVDHb(#*&U!^m4pd_(^9{*j{SpML)5(umyP{sXS>cgFmJc85R89~l3; zUeZx-Ip_7y|3!CsvM`h<{(C}PPH&9a=W&;l@p;%nZ_(*8?esZzIoj=j?<A2ISi?>a?BXSkh(|eF8A-?WLMlRTq1^1a4fKKv$q4a8b;84GV!U5HxT;0C593_;NZNylQMCkO1NpE-8T1 z(a<#Z1Y;~N^8!~XRN>O}t8xeS3>XYVL@c{RM)Oh&L&L1?XSgdZOuz%IMi;~uZ?+i2 zJ(=rf4;3P}4@5*3ZZenpBj9!AdKK&`n+%z zL&#My16K8X&NW|nbKRG4D2!jYp#HR7c7$QcU6z#+rCqqVs84cZ3l;8%V{7=;Vj4B| z`L{3R?w;nf%=4W`@~6`LE}Ld@8=P10E4cDWIQG2Q(|mJ!l52GV$Jg>in!VKOoNn$; zAp9gJgnW?j12X@3&N;sOo}i|0+f&fx{HZ3a^&8!A9Zor)^S^l2(6oVieMu>U-uYHK9Gxr!k4H!oO1w@i{x4wW*^hqrRV@A8@Xj@8k5<@GmOC8 zlbgUz8G@`{Z*uu9IW8+X9D&nKZ-w(E3*>OX%VV{-8dsHE{)>H{y>|r@eSz;Nt!!f5{4KS1Vt=wh#KURZ}xsUA=`0Qlnx)NU&d+wnv zm+$t+j+MibnT*ARsHc+|Rt}bC^L)i!=mVua;!Fp)%D1YNR`U>hct^NuwnVwN^ovRP L9JlrCSM>b{TzO9A literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/White_board.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/White_board.bmp new file mode 100644 index 0000000000000000000000000000000000000000..20e550cb6c3ae2523370749ed79900c861bd82ac GIT binary patch literal 5182 zcmeH{u};G<5QZ=6kc}?vUi%0PRV}geMhK^3VB`^a6e7XSBan?XY#uCM?K2+!BuZGA zxT_ND&R@^XXQ#J!r)!cprTZaY4N;fICVeE*{QFh8N}=4DnbNf#3Ezei@fTb$xb%43 zW1(wg-C>928ApZdn{_T8o%DMg9Dvh);lT>G_v@TzleuVuUG4YH&%)Wb#kHAB-3<04 z^y1@AIJd!td+`z+zpnO+H}umFFz%992qKq%pMxTEPm>Mm$S!dMwfN1RjBta2`Z#%B z9tvkik5MG`m?Hh8D9AF&83%4G**{c=H`8)R$?u_l2W#71OUU1?K zQ|708<84|T^l!8f((2I9Dhf8ZNf7?kY_k-i!d-?EwzxQ(QPH{Lwh@&819aq_Q zK@ksFyr>C61--peVPr-#WpXKg!5$9gyJZX-usJaOSy||&lwNf;w5viML3Nu;1suxy z_@2Z`c2X8l)dw?)Pf$&D%lKUqNL_+{qnjG(QI~qyN(6#6`L^3!08udmiCzlS^PMst zsInebmbQtuSBifg|F^0Fw&#beN7DD{Ym4 zLZvS`_dyDKOUIcclr|^yv9fHeM8LNvIjFw7iJb@R__N~g?9N^$?o}}(Ft7DZJx45% zh1{+F_r}mene(Vs19e}902MnA4#i4TE9&0;x>jiD&LirZA#{)095smOh%-Q71tmKJ zfRgnnfIpxdtZAd^?y7Ko+e`J4NYmX_!32b4y{lwUjA*z>)bLhMSx2B)u;hAAQYKpZ7~{NAfm4|DEHLX1XY4`40nxIXV9Q}g{xM<`O#CU5IomK zos@S@1kgJv8^BR z=FV!NFBNB!YI8mi@bu*y$=>n}>rQ+J(6mT9wHuRgD#h39xgiO^Bu=xd*R_>L*#|8Q z1Iy5^u5ox(me^xDKuOY{YomtY_F$fXnFaTI+nUk28_C|xPQt5 z0#R31lnhlUwW`;TYZ6n#=}Q7Dr{^)7pKd{5+kAw0p%DzN0kaVuwfU2KQl5KX`N~(m f@|CZAbv*SKtxgo`Zo85$00000NkvXXu0mjfU{+tN literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/01d.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/01d.png new file mode 100644 index 0000000000000000000000000000000000000000..df542d3dc4f98122e6aafd7a6e0bca7ebd483bcf GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^>p_@<8A$H&sdEQXk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X*aCb)T!Hle|NocXoPU>rfho+>#WAGf)|)#Aiw-OBuw1zM z|9=VpT(h~ENe*kSX+(aHXy0?Zy`p425*?0(be}?m!;_LPzLXC@$nionM#dVzbuA2Th?Be<2IDucPQ{oKXD{<-1 zh!Ls3|Lx$*WuM|M>g)y%o{7^`+xom2olm4TEPP^g zY6a7~#kqD8Iqx3)Z?E)TtJW?fshG4x-I-r3j#!^x(3pAe)2fvFyHgU*ZYkJv zG*tR%_r80dHvQPVH&lN?RpEl~TH&5C_X@oqH>yv+^=y%8MtW9CypGI^dq<6))b81F zu{$m9`+c>0li#N|C(SjB(>WWMVDjhhU+X%Xy5%*?H(vj_>-E`taUDD4P4{2U`?u!y zpOmbB=6PSrX2<7$|C98C;l-Bc&i-Kd?A{JE!(! z%ZzVkC&T}W>*)12UHI*^aoZoC?Q!oODfxe8`B-%%aQPqE>v5**zM4hPzm@YhfAiO? zXRoa{zb$_u=fCUbzq)679NsTo=KeJ<&o2C(?^EZV#^p)>pM4TZ`1;qe=H9cv<`sq7 z_y3C-uU#MW;?>`jgHP{;=NDayMntFWRq4L<8vDM5{o9xBBA$P^>@Z4FfTxW4GVx42 Z47veXkB+p_@<8A$H&sdEQXk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X*aCb)T!Hle|NocXoPU>rf$@u{i(^Q|tv9zFCmk~2ak+Ty zufFZVAhTM(xABtT!I5eR)rMd&`BUfR5Q*1^25TFF1Rz`gijgwMDP@mfr|_|MqP-)0&71 zV{IqPJeECYR{P%D&QVuz?KOM(o@up#H-5i+lUHyn`q}eT*Xf792EWXCUm6xsy!Tqo zf=_qEA9dcdIvc&bQoeh6m3-&(Dp}U`Tkrk5o4j@V?xi;#y#0Ir&BtqRe$Uqb{rTa? z(nj+)<$WKnl~-*&ygL62-)Z|FJh?FYmS?rzF!z=`-V|=Yq|ab=%jjC=VP<^M1C6=wCGYzgm>Krg<@ujH TwrT<}B`|op`njxgN@xNAYLGpV literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/02d.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/02d.png new file mode 100644 index 0000000000000000000000000000000000000000..f00acc6ed9bf11bfe8b7befcab1b6ef712ed34b7 GIT binary patch literal 2470 zcmbVO2~-p37LI~gNPWE8r&2%}!z);5GLscD7#1NcN)!=+y3mHn1V)lf%wmF|cwA0u zf!d>msD}oqbpr~0?-Y1o6j4NcP!LYRg-1||Qb7!h2*o0A!gjFjTiTp6`S1MycbD(} z_uex{BQ}OCv2(N|kw{CzLW3fSwZ!tgVMY8K!}o^}i%mp$6rWfpCnwL|%k3Z}TY2aQ zN)n0uw&htsI-TP{A}w;nqGDCCf^ZnYr8J=kk4I@*shmKQNNfGHav_q0s(^Sj0h944 z=1Wx+02A>jF>C=OkO!iPSm<5_x@GUiC}eLE!WB{ce1WxEm@ptkRYE{3mB^H^mPeVg z3lp+s8>9eJ5LFV75@2x%#0nySKwN2~p{6 zm<_>9Z(!y}A-pL>VmLA=c*Ym;#-k*vRB{*uH5v^~!=&Mg1dz_K~*Np zR6;FPrgWXP5QHib1twQvxD2pZ6vpFf6^}whI!!?;pED~{&ZLP*7^oG>K{^exP?`dY zkU5-Ot&mJP7a<@jL8Yinr6jQQIjlSpSK-P;{6CnUJATapky?RZ&c|=YB9+d$P^$QQ z2pTg9`AxJkDp`(#k*E?^D-e{whX~Wv!bT1UDo~*cS482sWcH#WWoJa zCH$XY5dw>Gg;YpT#-zdo6qL&nD8O7I;Xqu1D+tGy=;rT-1qMbaa4{w!4wR80>wqwR zAcxN7aHtF#eJWgm01lHWRYDnph6V8`M0#i#CL&m&@hmi+O@$!3n9B0@W>L9J4oc;C zvr#XI?u|f*XjVT6N7R-gnAI2kPW?>^jA%lkm`3XKp3H{{EF4?!}$;(^##^GVXX6jJZ|6bx1K!9O0PK zHW077dq=_j_DxJD7UmyASoI>?+S>*M&KQk35nq*2fhe*B5qML`7?#y8W8n z?%R2;S4yAx0s`}!ki%#8tJP!8x9jr0D7P~Q<=a|yXhKsC9dKvf_+(!=efS4hynvG7 z*4jSK^fAAe*vMJzcKt=e*rzQwtDQIztY$QGMZT-kuGTDjzV^JHQfc~``rU_B;_RIM z{-i(0>iS&3btkm4j4Q9U*Bf$~&JRo#eO1>WV61Q=Z70|>xaVe3dcB9s@)C6LPa${P zFzSghQJ)FSC_4aQUmW3O>HlE2owp_RTj+;qXAM^P&o6fY> zI~mEU$Iq|cA9HkD>i2}Yv%n^Ls9<*jbu+oBz{U7&d$f_s6Qq_F!{@e+Bzy8FoDR1; z$80+?T%AkSP2N4RFtg-ozU1s*5^fbEA;Y7))UeI5_g$KzJ7{(7Euk?N$2~lu+V(tE zNkEfNZo$JNLn~?{zQ=T1*zaTva8^EEw2;*`e)&Ww!L5 ztzE~J>-6>x{~Rm|_;I|p_ldgY+qf9rigUd=tX0~mLH_P)Qu@+Hzf~;*UCpKEztN`X z4lzyN==1@RH8Jc4GmeT@kH{~rT=RCd)p>=my_2|)t5EYuiVFL)0k4k z&$gAsr{24fdHofBvS~Oe+I}`H%&QC_ z9~>>x@7U*krBjiV#@Vjdu20>(Pix*LuY7veDI|7BZbo;tbx5D#mBjh2#!<4lxp6~E zjV5d0uOz|8PKL#GZ2=E@x~*(dAB;R*c>6;6NKxqG?IT_FR?oJ-ic4{}sjTu1bM(*g z4eo2TjxRs7IVHX6=!22o0~3#2`D>*lgMD=;zqfFGyLEUp*mOz1%qQUGTQRL!!G3pM zl-b3mIv<+~}2zcHwI-A4!i4Ht>ym;e9( literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/02n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/02n.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1bcb4b8f5edbb15e56e4b0172eb1b67b997624 GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^>p_@<8A$H&sdEQXk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X*aCb)T!Hle|NocXoPU>rfyu$s#WAGf)|=bjMTZpxST4N# z9dFgG6Esy~@lWSFkC*DcZk%|8M`Dk*!uma*PHAHyemlkq+%Iev-~Tv4U#xJM_-l&` z+%Zp&hQ_57KHZw_|M`*LdvAq`{_pRlo$t-BWSn+qI)>}|A$d9Z@>Amue=;z3e4k7DjGF*TS>Ml z_hN-}IqhEUzRv8{YQB2n)VTD-JHKAc`xbT3=FVxQ_4RX8svktgMZFUAym!FpidL=B zch)`6Pp^&)t#CGdmj0k!_|=kw;-{ALp7*UdKV{Z``~7AYj;5~J_UVpvymIE(w8EK( z?p9rV$NN-VGwAu>8xM6ivFW8uo_;g&|JMnj5+?Qn~b@40f=}+^oKRurNU`^GP)UT6nzY1jj>UnI>*M!fUZm+NQecD_4H)+P}NO`Xx z{4964E$@BZ{wJYtx_jZ>*T{{Q;JbAA8+L>K8B@kWQgzP~Sdan?6?*#%qQ*-Ib0 uv^C!H<p_@<8A$H&sdEQXk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X*aCb)T!Hle|NocXoPU>rf$@x|i(^Q|tv9z$_Z?B-ak=>E z|Nk#<+>C?l8N`oiT)!z)BeM0<#*L5G3B>KG`1t5(x41rbhTWyr_80H24!?MH_4kVx zR-eCkX7&4vCsr@acziYE%LlKc38I;?51iKXRmV^IvirTy&LcJv(mu zP3v_Znzqii-d)jM9(3XK?!>(}t>^FS-@YR#i1+(_-|dy5uVc^LIk>yxer{Z7Rq6Wj zpXYAxd0muhRCQ{3?!7O^w=diftTc0@-PUT|uj>|8gegtl{;#|$^ug5g*{|!L9DH?H zc6Er?Jtw;jTKAHVtu@`9UXfh(+cW=1GT)lZcW&PEj$D3ta_S-JK&EpQr3bVpn=d-d z9LD{wVpU+ii|miadmT<6R)x3kshVTH=rlhQC2vz`&i!1r-uJol<>V``1?BR;JY06J zpT8jZ`DgYWD}S~#-?>ubx!25me{sX?+5M}I9Xs^rrf1HYbK0}lExl6Ciap4YW23zO c4~GFm&b{oKxA|9Q0%MrL)78&qol`;+0O#2$GXMYp literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/03n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/03n.png new file mode 100644 index 0000000000000000000000000000000000000000..91776b436109dcb48006617887bd1b3793054a3a GIT binary patch literal 748 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 Q^!?_j5;V%HMHz+v1d-RZNdN!< literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/09n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/09n.png new file mode 100644 index 0000000000000000000000000000000000000000..142e8e543a114839706344fff9a3425c32708189 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^>p_@<8A$H&sdEQXk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X*aCb)T!Hle|NocXoPU>rf$55;i(^Q|tv7cL<{eSsVY%?} z|Nj#GwX3{T4ZcY@S<8g0RGt=U;*~xU%lhqB_WHfpi2oAfDs{uPX!<=6i#JaX35;9Q}3HRD|Izi|tA?!BxvF>PA-=#!~g)%CQN zGaYSn@0Hlf^;m8HbTq>tYUkxsB{Le+-t`<|a|_MiYA1bi;auyNOH$rMe%9i9cqldJ z!Ld)l$%!p@9*Q^C~| zZ@NC2wdPKK`L;&MK4Jx^D9r?)=Ax1DABv)7CF z{1noEs(VztwQTOTkml{1Hn<=E)$~L6eyTYC!g{+cMK3Qd7dbC}j5*Xw^{uFX+2w>U zX8PP=mC?-^7ymAsIj4K|;%0C8)e`mBg?|Z7R z+WdQO*3W%+S|&!@IW9Key={e!eM_(DC#TYP9&7p6-e3IKHsPUrIp zPSkm?>+_uZ-ud+4klW@H{w?<6=zgYu?At%l{6CWUH*RzGZLfN4mj9(l`rh&jr`}fl zcV4{hWvyuLt$p9K6{I#i{N8yJM?wT9&irLH90m*l&(qQm9=ntVOz8}su6{1-oD!M< D6icsZ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/10d.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/10d.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6963a4193ccdd834cea98ce99b3423ba9ca2c6 GIT binary patch literal 1022 zcmVU9-1mNNQUs^qS;ZF-mW|G31dgZZhzs61%kj{nTzg3~KeKp3OSC9>h8q@h9n)9q3%@oBhAx6mZcGg6 zr|shwc^3wFj(jfy$N2iG_Xe!<|IhW3TJKYML+%{l2wF|_# z=KfAu3P6w>JckAnhN>b#;#O`g|P(8vWt%ym5aHD2NANnUqb`K&k4wEG{Y>8QIh zURiB9r3#ERZjDzs^Pn~&FLkMNy@gz6*!=?DF)G3B-O`JWZ^i@nFXC&x3I<&9MNWKOrORVDYXe6}CFAJsqm}4!QTHBbsKd z{NRD{P6q*tJk0d2G_aZ*rsP|6B zkIq3@iC6n&QFUHCdP7I{CHq)$ literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/10n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/10n.png new file mode 100644 index 0000000000000000000000000000000000000000..512ede4fd0cf2a2baf55557e15a59683700e5fa9 GIT binary patch literal 2517 zcmbVO3s@6Z77p?fql=WU#r3fap}W>fGLwXaWFSyTSfM3|5EqI(93~UUl4Q~(nDA88 z4@+y;U6HZ~EyZ101T+>zEl=r!=mN^JTOZ-2$V0IZEh4W&8BCQJy5QGxF-h8jNB%XCa89Rv1CL~DYPxK~}spL*kFEO%H z2E3~#k;snb+k$kma07{Cy-_NP&_oD>U=)|r5HTKy(R6YpfhLi>d~`|#O~f=n92PHC z@F>RGMhYMm^C;mgAtY4tu>@&AiV6!$2^OI#i6~c0@$m+{bTA=6j%g4;CzmPIu#QJr zkP8!I^E5~S79g5L9>v$J5Qq?l0DN490c;vXMInd*cyMWSwmXx>a03_+0|FsB$b_hL z7R-WRCI?u$D1eiEM24^SFVUvsF&PCI1JPwN{~*2%#;>@ zVsr(kOj5}fl#5XilVNg9p-~f9`U+N=fNOAd0{$OFuPpyS0pVJqa7D*UZIR1YRH!xn z`v@9K4tXhBElO5mU?`@>lT;|?zmG7})yzf-^Hmt4!Brw0mn|Pu$g;@*gJ1%@Aw*EA z!c1b@3tKP&qQQ6+^SMzWE|md^7!25*14Hgqhy_E?B2jyyYMa#L*4%7w=Zs~e$6{ll={Q1M_Rpa(yQGVQKlc$80dS}HN{rm5<&sfFm zcqEy|?JxeWVg0MuQ;REmAM=u96ROu0SG46g;hytdZ%>`-b_%oa%XGaETIQjcp-*M* zEO-*aIs8pS^XuB|ilbBgvZzfs^Ilo-<*(a%9*-z>J5x+a(GrCEis|dE`k}EJ1-1I7 zq4C*G+l~=>jWl)3^PXcp1GjAkJD>RZuI+r^cHfi!`M}uuQ96Hj-4~^MHy@=t*?VqU z2RbxwZY)e)ZB_9&mN5*wH=dVRa>`AAb)BBI!u!9f|Ff%=<%c}OKx|9X2p^7aPbnEI zztl=@UF-Z=YUMPTRyL8<895;euA9gdA9aoBJ9h7TMr-2GpWb%JW_;HeIk7K#!fUL4 zcux=CS~vUdoP~3Kj@B@GdlkdxFKv2R-2Tbwa<@NvTycyvHMd?NJzOL)cu6aXf&36>T5xrZ;476CkPn_xsOP{=D+O zoqqUQw9DB?)}uqE8+7dj;+RV9)dq6?p-TsR0v?_?lvU@F?NIyiIpe`e)j6vpBwe`b z$nI~+-C~EB2ou?;EwdJXq&pp5nuWa)Syj-~scYHAa`|bl*DCh0K@Ve$(94~k{h+YM*l1+YhX|^=e4B14^c<(CtopdmJHIKiC|Eu1ZP_`prz@>0*W|Fu_7$VOA)S1D z)0P%b=Mr~)Vn%Cub1!O@(71lPbtu#7A5+pdJ$LQOv+q5&JAcDyo@2xQs1Hq#BEE0G zJ392+ZD$$=4%qzc&UVA`-&}Ud^adVK#YS>Se8JP{5*5^=qS3F3|<|B5ASItJe!^>kB3QpuY9) z(s5BEa5$VbJCMo6=3?_$xeR+(?MVv2rWL_^cr0u-nM_xE@_xWpFDn8M zsBk!|SIol#mz8ac!!5Uy@b;_sbN0XjROZeXqLGNZMy9~fIGm54M!^@vAZj2I5liHB zyrHrd4@iV`e251J;wTtMlq68AMD}Tecmi#VfF{KI`2s!~7$cA&YCfQmN#!b7L&wkY z!r0m@2JyfgL>)uN`Pu3_(yO z$klueL9W`e$iPHY0;NQumY{OL%*c;KW7Tv#X6d{OGQ|?DT(uA;EMTC9uKM6On0SmF{^5rwKzRTTOksF${XrT_~qhqI*Pg|^6KODa@q zRvhNWLO@=KR`C)P2*^cLXsl9zu;MT?x0tvKmCCSQ%v@#cFYKr{jg;*m%&#S^A@5Fig2g65$dR45T8{5zBkLnN3;`56>T z8X;fJ|F2-702ZN286R_5BIAn@P$3uNfu%sg3{;9LF~w%iS!Ah{Fg%;j)kwp^v=%LNFVNylU1ahFJhFrPw%NL~UF0U=Xp1d5jzLhyp9 zLIQ>8A;cse6ai)FJQEefnv-Dhyzu`#zgH>2ijXh;)ja0XG-nSSC{bbeny^qj`;bEm zE2#vSOBk3hFc$(HFED2SBE&C&IXaUm<0sa2a+0N&1Mv9qoxgooNK9aDJs#Ecea-nKy7d5Wyz7&MnD44Si|%{N z11-ubd-LnJ3-m>AyilAI)BjYq_mMcgySq63mc^-rAGcYbKG3|w8%K}6YI2+1U8&4D zLf9%FAQ`hZJlqr7VAUR6$EsRuwJh{OEw}Z9ronZ6tlr)L?PJL-txPI!wWC3U|IcTVc9j^29(pWFT3 zQ&Fv9Jk0XRGZ81q+b6O78tsB-u47?q8}uOm#JKI0rz&#)Ap!E18m}(E55}U?P+&3Isf1h2Rl%lJd{fJP8zc&7*Hn5r(VPi3K zME9&plRM_S(*}&Y=#nx@f%UEfbNA_JO_#4M2 zMusvITc@2&4c%#HpFAF%7P`v{19XmKk}{d@!1YUm2X=pO*8A&0>q_}p>tLzDw$J%1 zjmi6c@^RwlZ}o^RnTI@NT?v9jYf+wd^oW)>k$R3;;y^5kYn<^MzjY(4e=2MRqnF$H zDNWQrtlsF#Zq>O|o$o0}UA67|4E8aJZ@@zB9wzf@2m2h|IlYoc_VYt*S z>~_+hEo-CdMuOxz*@LO6j3Km=QGUq(@Ra92nl=^J8k8D``WT<}=a%bv-S&{5`uvwe ztJdh>wmH`yIm{*R_+y6aw!Af$C!`_0S%bBmz9$YwJaDUJ`ly6%^6(uOiQ4t=oK0Fc zoOq^st)T%Y1KrxQLbu)?ZkaeaT*=+6n*}Bly$46pIJ>g( ze*aYB=&030hr`up94Q~-{fDet?}{koA)ljl6YV({Z70X7mpN-^M5!H>)vqWKb&bo- z6?d8oG71wm-H@9;)~8L4O_c9U6!m)7*SsE*ZCfnr(>1bPO(_P!zUezv5w~Us*c~T9 zT<)3vti93#{ke;NE~O5y+3)h3HFaME72EF}4Aot6;YKuh9vypiBsE}Fuip>JKYrU) zu~GMWZLQ1N7GtM;b$RmW_xe9HkC%>Au1=dQucrOonEz7Qx=luHNsAPjGBo#E)*Bx+ zmY9r%;>r3MgYI0@hY$an<5YC}^VE>TH^afO!htyb&~G|mE90}jOveXZxPO;9^JJpo g+h6PrHTH&x?fLg|`cpn3n*YYwtRUviT?bSC32%WJ1^@s6 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/11n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/11n.png new file mode 100644 index 0000000000000000000000000000000000000000..f721b6e9ab4a3f95f8c6e23fd1c51690f1a9f3dc GIT binary patch literal 2553 zcmbVO3se)?8IDpAL_t&(mjh(u;tP_QBnV~@EF=^t1adIDJd|W7$%LekOw1%CK|t3n zA_&^zsy#{-wBQ3#Y!5E1K#)bWiweGAJqQ#LT;xCih42vQgx7If+kMQrGxzn~|MA`b z|IcJ_!UC5s{b(tHKv*6e#EQWCYo^!I4F6VyrUv4j1t*jnfcMkW(*@7Yw&EizMNl+G zAXu+5y^9E^avcZ+^N*z5C{+|Y6cVB`3M@he2t_MX;AjG2`wp!F7RDngq5z4L%6&+N zn|cyaD)J#kZe@dP1rw1-gOZfU&ZID|FezTh5RrEH61Qt1T!0Kw!9=YrL5@LMAJU9m z2p^l40TOWrqKfw+`I!_Fqu3lG6ICKaPYOsDf*_6P#h_3lBiRmK5S27>{BG=N4U;|MaQ zldE7YS&prrm%u_Wp;D?)Nl`h`BoP*%YLyQOw{+G8nPNe#9GjyFCk)WS3V=!hO)kv< zMZyJ~Laj`gQ7#e!NCF~5F2AKwOX*9^g3!+oW;8q9(XQ6CVBo*ua8%l>j8s2^c#e+r! ztKgpmi-eFERmx!8WvL8~LjZ+5jznA_5@MnWs1jFfvhMx$U?!8JM8(nsd;^OJ^d|-f zFg>XZPfs$9LY*;}&4z;Imwp+dDO2IN?{zF{P#{dY~XFhTp4hE_rq$d*((7 zQsPX&K(Nr12tFjCDFP4?X>M8is~MOTtC1kM(Ek$`voH)5t2D3@@r%RR`WcZ2;N}CS zq@DEy_)jNi_TEeIc{pA*Ov8n8g-;d=9wNu9oDwf*4_c1(5D34)f?0lCZEjy~%c&OP zvOnhcP3UQrcjaDI{-+);+Iuq;7{8rZ>k{qo@xVx1)$!EW<-dJB(Dc)-VQRyj`i+0D zdg9f5{-EklpMU?ITa7QsS>@fS$vzy zCfU_}MXL&5>o#6)v^;*-dwgw-%UQ0W?AG90%_HryZu7$(F6lvohAk^FW`6038f(qz ztX=CKGz^6Ke(muUW^F!sdQ6hG+7WPgo_oZp!%0_GQa~__L`lex+9kX53-Zq#f7y?& zlt(rc-tBE)C!w);2fo;*yMCp*D$`B0i%v|(TL1+s$OnyOBz)|b0k<(0~M7lm&>zx-0O zU#%!5Jv{2u;jRnE_lQ&NVz%vy{^Wjj#i#V#!GNrL-HoH!ofJFYJG6^d_w=`S8V9F@ z2gaBw1#n(Ap<&50P8W1l&@y6hMRE)J%clKqsy7(UH5x3Jymfo6ZrbEf|5nL|hGb=TFh&eW-=YHj>*t9DiM ztBK^c?X3DuK<-x>#(TZ9Ts~_ScphrEt@{$>=RoBMCd6l*eS1w*yceAeOjbOrR(w6I6 z?$OlV{g0GCEdD-wlP^CuWPQ^+K}|>xW6Cv%o+_Mp?0^MNNa@DFx;~s%BhP(v@?VSJ zJ>D06RB+(I+NzR}l5yrW_OlGfLro!TYGXnqqY)hkn>CrqyGwUm4z5k2xJ8##p*;um z(~U8Elk~^9S&{YTr330dqonxHZ#o?ly8c;Yc-!>*xFK6=#g= zcCxL%^_+2d>ApLf7XC`D-qEdUW4(c&cZEmvGMJ|nm%7;LhdeK^ORX;K%l}4{mRzyc z9L0us>AnA|ym9D+G3Wl7zmdw@BAwmJ0jjR3u`F@A^2No}>e0kYHfZq&+tlLoPWo?h TY<9df{fY$#gt4yre}3TK*MS{8 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/13d.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/13d.png new file mode 100644 index 0000000000000000000000000000000000000000..4a63099365e8574f65351471bec72bbce8ba1e6b GIT binary patch literal 2338 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/50d.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/50d.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1b772d90f704c8b90fc26941b86d5d9c3e3ac4 GIT binary patch literal 2140 zcmbVN2~ZPP7>+n{Yp2B-1?zO(IvtB9yV-<5Rst15g^>V-D0qftvk41HHr-uFz;IZ# zjAHR8i`4?gf{GM@zJ-u#YqfP}_Pw|7eeeJO z@4t3KQo_Q?zCpesk!W&UtU4LYHNxvX5sb&;3m1aPGbvsh1Ll#DkuR_9Y6UAFYwS`^ zB=QRo-U*_Ls_7!pq##Y+rK^bX_3U(fC zgdtk5f>T2@sKy#iWzwxv_-qxtKu`#!X_BC5hNU2d1QnAgib0`DiBut%g<$g_48>3cl_D}!EDga!P+S%U zxgHp3WAz3+S^cg{7x+@anLKaB5yWP*No+C+!x|B(QmI5x48brlK!~|K3s2a^7Vgb) z32KTXS=!3ej0F-T5*bVmuY!T4V-(C*w^$43auaYEVkfMKRDueWMuB?LjkD&krcvd3 z5}{0#nX>R4z)Ia%YbL`pTqg4`qTR<&DFCk3XxuuUX^YwHR>AQxxqybtA>=fsGZ9W+{SaSS`bt#sif!ZZd=cCeR!WLDCk1#M@6?q0|IVsbC>) zVpJ){P%Vbxas`N+7!AQubPTFt^t2)GpHLZ&N^wl~6ci+lp5TcWg7qYBU|2H&DAQ)b zNFi2>5r*83#G@G#!ve*Ebx-ccMMo#GjDa?R11@=C6ciT|t&l1e3Na>;j+(2{;Bgj? zCoCitr&hthJrbJM80fer72_&9!ql|u6eHFNul0%txPmDnlLy)3WcD8Ng)F$J?z@1 zU)lp>Vr`ie5c-_F7=v+)fwvJXwZI6x^&c`10p=q@(T*`e{!ViA?1=&&hl8#mEZyx2 ze7GAPWdU7|1?{XhTjDJed0dWDFVNbndMcZ8TTp-XnY|+;O~1WGKiD1XU%cn~&LeHV z%*O1py|cH}EpLg~sAK$!&z6@ujy!*GR5+cNvR1b=7G=#heqPtPz17)x&X&;Ib9mT) zOY(^B$fo?}x|SWLs_XOXTI;ko4?9=b7Rk&0s4&%sckHfNY-_^GS`pF8+gFY7z-OL; zK3=^&U3Jcq0iWq>9L`gr_e5TW?fW$~7k&zx*ZuJLSK-@hAE$b^4R?3{Zo0VbpkHKI zbLjrNJ)7Sf+*DZ58??`N(2=+{VV~Zx_Ezs19w|BPF{Rln#h&N0+OgRuP*Ya2-ebzG z>?xAD9if-|wieH9DCsD^w9R8xIkTov^>zO{CknX137^!QZCalt+of&S{L>e2 zDcmLt$c?=gQDkd7Jt?@dAi%VX{N701*ZA19r;a7+E9SRmJ-V~w+s*X3{?<_w-Rdk~(&G#mB@}XmcZe3hg^ODx9-6wB3$_tt^t1e!+QqT6MOLU!muPo`I6QnH{aAGS#_ILG zoyksz-->2m&+zm0Gi_7L!wp?t)yQF2pqn~}il;4mz1!1zzW<{#{~3o)IPNvJC)aiy zPl9xF_WCxQ4Yc(R6|bs}YVbC;r+R$odHg|FY0aydQOk7Jt;nkKi+cds=?Dz1+}2IIpDc;tHgHnef7_8#i^| c!0?1aJGZW%dE>jO!rwkFCP95LD*b~$0bgA`p#T5? literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/icon/50n.png b/docs/Touch_e-Paper_Code/python/pic/2in9/icon/50n.png new file mode 100644 index 0000000000000000000000000000000000000000..0e389bcc9d03a7f08f9bdc8e954b1fd4a365b32b GIT binary patch literal 2226 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 literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/2in9/template.bmp b/docs/Touch_e-Paper_Code/python/pic/2in9/template.bmp new file mode 100644 index 0000000000000000000000000000000000000000..417192f1a9d41280634ebe313a678a51b2a4f2bb GIT binary patch literal 5182 zcmeH~v2KGf5QYzBU`v+nUi%PLEOqZQk*E*SN2#UeJ<8UVkpbDggILk;8gWa8RCmZW zclTlAp96{4x8oDdcI5t9T0?Z=vEgGj&R_ORTLMd;QX+2K#`reG#67sl;nKs)0Rz`{ z`yGbYxX|dh_g=>x#ty)hb)%cSit|y$@oWy~qpB`br{+GD^8uDlR0zsxt^-~dEl}}* zR=A#8yfAaUgZQwrUq2u>68bU;-(U2jtyew;(W zo$)g9gbU3FCce-WPq?A|#>5Z0;t3bs-*_1jPGkRw3%r*t+c6NfAkG_C7s+%nT|@z^ z1FHk8gL(~^E~ZOXz`m1N2^>uq)FXSQOI89$(*^a&p6Qa6!0{1u(fppz|N9z{xBm;H CLG}Xx literal 0 HcmV?d00001 diff --git a/docs/Touch_e-Paper_Code/python/pic/Font.ttc b/docs/Touch_e-Paper_Code/python/pic/Font.ttc new file mode 100644 index 0000000000000000000000000000000000000000..4cbb7c54cc4cdb418c41c0306e70bd709aaf470c GIT binary patch literal 5177387 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