From 1f392ba003f465ee65b17b39aa2bbac71dfa7f6d Mon Sep 17 00:00:00 2001 From: Gregory Letellier Date: Thu, 26 Nov 2020 14:19:38 +0100 Subject: [PATCH] update readme, add missing library --- .../Libraries/MCUFRIEND_kbv/.gitattributes | 17 + Arduino/Libraries/MCUFRIEND_kbv/.gitignore | 47 + .../MCUFRIEND_kbv/FreeDefaultFonts.h | 725 ++++ .../FreeSevenSegNumFontPlusPlus.h | 131 + .../Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.cpp | 2937 +++++++++++++++++ .../Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.h | 77 + .../Libraries/MCUFRIEND_kbv/OPENSMART_kbv.cpp | 20 + .../Libraries/MCUFRIEND_kbv/OPENSMART_kbv.h | 78 + Arduino/Libraries/MCUFRIEND_kbv/README.md | 30 + .../Libraries/MCUFRIEND_kbv/TFT_HX8357GLUE.h | 172 + .../Libraries/MCUFRIEND_kbv/TFT_PRINTGLUE.h | 233 ++ Arduino/Libraries/MCUFRIEND_kbv/UTFTGLUE.h | 198 ++ .../examples/Font_simple/Font_simple.ino | 68 + .../GLUE_Demo_220x176/GLUE_Demo_220x176.ino | 342 ++ .../GLUE_Demo_320x240/GLUE_Demo_320x240.ino | 341 ++ .../GLUE_Demo_400x240/GLUE_Demo_400x240.ino | 343 ++ .../GLUE_Demo_480x320/GLUE_Demo_480x320.ino | 341 ++ .../GLUE_Demo_800x480/GLUE_Demo_800x480.ino | 296 ++ .../LCD_ID_readnew/LCD_ID_readnew.ino | 734 ++++ .../LCD_ID_readreg/LCD_ID_readreg.ino | 266 ++ .../TouchScreen_Calibr_native.ino | 453 +++ .../TouchScreen_kbv.cpp | 181 + .../TouchScreen_kbv.h | 39 + .../Touch_shield_new/Touch_shield_new.ino | 202 ++ .../examples/aspect_kbv/aspect_kbv.ino | 40 + .../examples/button_simple/button_list.ino | 116 + .../examples/button_simple/button_simple.ino | 84 + .../diagnose_TFT_support.ino | 126 + .../diagnose_Touchpins/diagnose_Touchpins.ino | 49 + .../examples/drawBitmap_kbv/bitmap_RGB.h | 668 ++++ .../examples/drawBitmap_kbv/bitmap_mono.h | 343 ++ .../drawBitmap_kbv/drawBitmap_kbv.ino | 160 + .../graphictest_kbv/graphictest_kbv.ino | 586 ++++ .../examples/graphictest_kbv/icons.c | 542 +++ .../graphictest_opensmart.ino | 586 ++++ .../examples/graphictest_opensmart/icons.c | 542 +++ .../graphictest_slim/graphictest_slim.ino | 21 + .../graphictest_slim/graphictest_v25.cpp | 552 ++++ .../examples/graphictest_slim/icons.c | 408 +++ .../examples/readpixel_kbv/readpixel_kbv.ino | 135 + .../examples/scroll_kbv/scroll_kbv.ino | 49 + .../showBMP_kbv_Uno/showBMP_kbv_Uno.ino | 258 ++ .../showBMP_not_Uno/showBMP_not_Uno.ino | 261 ++ .../examples/testcard_kbv/testcard_kbv.ino | 193 ++ .../MCUFRIEND_kbv/extras/bitmaps/betty_1.bmp | Bin 0 -> 9022 bytes .../MCUFRIEND_kbv/extras/bitmaps/betty_4.bmp | Bin 0 -> 26326 bytes .../extras/bitmaps/marilyn_240x240x8.bmp | Bin 0 -> 58678 bytes .../MCUFRIEND_kbv/extras/bitmaps/miniwoof.bmp | Bin 0 -> 57654 bytes .../MCUFRIEND_kbv/extras/bitmaps/test.bmp | Bin 0 -> 230456 bytes .../MCUFRIEND_kbv/extras/bitmaps/tiger.bmp | Bin 0 -> 230456 bytes .../MCUFRIEND_kbv/extras/bitmaps/tiger16T.bmp | Bin 0 -> 153666 bytes .../extras/bitmaps/tiger_178x160x4.bmp | Bin 0 -> 14838 bytes .../extras/bitmaps/tiger_240x317x4.bmp | Bin 0 -> 38158 bytes .../extras/bitmaps/tiger_320x200x24.bmp | Bin 0 -> 192054 bytes .../MCUFRIEND_kbv/extras/bitmaps/woof.bmp | Bin 0 -> 230456 bytes .../extras/mcufriend_history.txt | 115 + .../MCUFRIEND_kbv/extras/mcufriend_how_to.txt | 154 + .../extras/unused/ILI9341_regValues.txt | 307 ++ .../extras/unused/appnote_ilitek.sed | 54 + .../extras/unused/appnote_novatek.sed | 55 + .../extras/unused/appnote_renesas.sed | 47 + .../extras/unused/ili9341_init.h | 138 + .../extras/unused/ili9481_init.h | 114 + .../extras/unused/ili9486_init.h | 158 + .../extras/unused/mcufriend_special_2.h | 1729 ++++++++++ .../extras/unused/mcufriend_special_3.h | 490 +++ .../extras/unused/mcufriend_special_4.h | 188 ++ .../MCUFRIEND_kbv/extras/unused/pagebreak.sed | 3 + .../MCUFRIEND_kbv/extras/unused/r61526_init.h | 279 ++ Arduino/Libraries/MCUFRIEND_kbv/keywords.txt | 67 + .../MCUFRIEND_kbv/library.properties | 9 + Arduino/Libraries/MCUFRIEND_kbv/license.txt | 85 + .../MCUFRIEND_kbv/utility/mcufriend_keil.h | 118 + .../MCUFRIEND_kbv/utility/mcufriend_mbed.h | 100 + .../MCUFRIEND_kbv/utility/mcufriend_serial.h | 243 ++ .../MCUFRIEND_kbv/utility/mcufriend_shield.h | 1113 +++++++ .../MCUFRIEND_kbv/utility/mcufriend_special.h | 1020 ++++++ .../MCUFRIEND_kbv/utility/pin_shield_1.h | 1008 ++++++ .../MCUFRIEND_kbv/utility/pin_shield_8.h | 474 +++ Readme.md | 2 + 80 files changed, 22060 insertions(+) create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/.gitattributes create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/.gitignore create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/FreeDefaultFonts.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/FreeSevenSegNumFontPlusPlus.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.cpp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.cpp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/README.md create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/TFT_HX8357GLUE.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/TFT_PRINTGLUE.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/UTFTGLUE.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/Font_simple/Font_simple.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_800x480/GLUE_Demo_800x480.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readnew/LCD_ID_readnew.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readreg/LCD_ID_readreg.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_Calibr_native.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.cpp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/Touch_shield_new/Touch_shield_new.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/aspect_kbv/aspect_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_list.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_simple.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_TFT_support/diagnose_TFT_support.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_Touchpins/diagnose_Touchpins.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_RGB.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_mono.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/drawBitmap_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/graphictest_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/icons.c create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/graphictest_opensmart.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/icons.c create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_slim.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_v25.cpp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/icons.c create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/readpixel_kbv/readpixel_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/scroll_kbv/scroll_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_kbv_Uno/showBMP_kbv_Uno.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_not_Uno/showBMP_not_Uno.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/examples/testcard_kbv/testcard_kbv.ino create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_1.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_4.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/marilyn_240x240x8.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/miniwoof.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/test.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger16T.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_178x160x4.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_240x317x4.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_320x200x24.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/woof.bmp create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/mcufriend_history.txt create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/mcufriend_how_to.txt create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ILI9341_regValues.txt create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_ilitek.sed create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_novatek.sed create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_renesas.sed create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9341_init.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9481_init.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9486_init.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_2.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_3.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_4.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/pagebreak.sed create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/extras/unused/r61526_init.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/keywords.txt create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/library.properties create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/license.txt create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_keil.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_mbed.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_serial.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_shield.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_special.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_1.h create mode 100644 Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_8.h diff --git a/Arduino/Libraries/MCUFRIEND_kbv/.gitattributes b/Arduino/Libraries/MCUFRIEND_kbv/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/Arduino/Libraries/MCUFRIEND_kbv/.gitignore b/Arduino/Libraries/MCUFRIEND_kbv/.gitignore new file mode 100644 index 0000000..cd2946a --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/.gitignore @@ -0,0 +1,47 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/Arduino/Libraries/MCUFRIEND_kbv/FreeDefaultFonts.h b/Arduino/Libraries/MCUFRIEND_kbv/FreeDefaultFonts.h new file mode 100644 index 0000000..50ff131 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/FreeDefaultFonts.h @@ -0,0 +1,725 @@ +// generate FreeFont from UTFT font +const uint8_t FreeSmallFontBitmaps[] PROGMEM = { +// 0x0 [0x20 '.'] + +// 1x8 [0x21 '!'] +0xFD, +// 4x3 [0x22 '"'] +0x5A,0xA0, +// 6x8 [0x23 '#'] +0x28,0xAF,0xCA,0x53,0xF5,0x14, +// 5x10 [0x24 '$'] +0x23,0xEB,0x46,0x18,0xB5,0xF1,0x00, +// 6x8 [0x25 '%'] +0x4A,0xAB,0x14,0x28,0xD5,0x52, +// 6x8 [0x26 '&'] +0x21,0x45,0x1E,0xAA,0xA9,0x1B, +// 2x3 [0x27 '''] +0x58, +// 3x10 [0x28 '('] +0x2A,0x49,0x24,0x44, +// 3x10 [0x29 ')'] +0x88,0x92,0x49,0x50, +// 5x6 [0x2A '*'] +0x25,0x5C,0xEA,0x90, +// 5x7 [0x2B '+'] +0x21,0x09,0xF2,0x10,0x80, +// 2x3 [0x2C ','] +0x58, +// 5x1 [0x2D '-'] +0xF8, +// 1x1 [0x2E '.'] +0x80, +// 5x10 [0x2F '/'] +0x08,0x84,0x22,0x11,0x08,0x44,0x00, +// 5x8 [0x30 '0'] +0x74,0x63,0x18,0xC6,0x2E, +// 3x8 [0x31 '1'] +0x59,0x24,0x97, +// 5x8 [0x32 '2'] +0x74,0x62,0x22,0x22,0x1F, +// 5x8 [0x33 '3'] +0x74,0x42,0x60,0x86,0x2E, +// 5x8 [0x34 '4'] +0x11,0x94,0xA9,0x3C,0x43, +// 5x8 [0x35 '5'] +0xFC,0x21,0xE0,0x86,0x2E, +// 5x8 [0x36 '6'] +0x74,0xA1,0xE8,0xC6,0x2E, +// 5x8 [0x37 '7'] +0xFC,0x84,0x42,0x10,0x84, +// 5x8 [0x38 '8'] +0x74,0x62,0xE8,0xC6,0x2E, +// 5x8 [0x39 '9'] +0x74,0x63,0x17,0x85,0x2E, +// 1x6 [0x3A ':'] +0x84, +// 1x6 [0x3B ';'] +0x8C, +// 5x9 [0x3C '<'] +0x08,0x88,0x88,0x20,0x82,0x08, +// 5x4 [0x3D '='] +0xF8,0x01,0xF0, +// 5x9 [0x3E '>'] +0x82,0x08,0x20,0x88,0x88,0x80, +// 5x8 [0x3F '?'] +0x74,0x62,0x22,0x10,0x04, +// 5x8 [0x40 '@'] +0x74,0x67,0x5A,0xDE,0x0F, +// 6x8 [0x41 'A'] +0x20,0x83,0x14,0x51,0xE4,0xB3, +// 5x8 [0x42 'B'] +0xF2,0x52,0xE4,0xA5,0x3E, +// 5x8 [0x43 'C'] +0x7C,0x61,0x08,0x42,0x2E, +// 5x8 [0x44 'D'] +0xF2,0x52,0x94,0xA5,0x3E, +// 5x8 [0x45 'E'] +0xFA,0x54,0xE5,0x21,0x3F, +// 5x8 [0x46 'F'] +0xFA,0x54,0xE5,0x21,0x1C, +// 6x8 [0x47 'G'] +0x39,0x28,0x20,0x9E,0x24,0x8C, +// 6x8 [0x48 'H'] +0xCD,0x24,0x9E,0x49,0x24,0xB3, +// 5x8 [0x49 'I'] +0xF9,0x08,0x42,0x10,0x9F, +// 6x9 [0x4A 'J'] +0x7C,0x41,0x04,0x10,0x41,0x24,0xE0, +// 6x8 [0x4B 'K'] +0xED,0x25,0x18,0x51,0x44,0xBB, +// 6x8 [0x4C 'L'] +0xE1,0x04,0x10,0x41,0x04,0x7F, +// 5x8 [0x4D 'M'] +0xDE,0xF7,0xBA,0xD6,0xB5, +// 6x8 [0x4E 'N'] +0xDD,0x26,0x9A,0x59,0x64,0xBA, +// 5x8 [0x4F 'O'] +0x74,0x63,0x18,0xC6,0x2E, +// 5x8 [0x50 'P'] +0xF2,0x52,0xE4,0x21,0x1C, +// 5x9 [0x51 'Q'] +0x74,0x63,0x18,0xF6,0x6E,0x18, +// 6x8 [0x52 'R'] +0xF1,0x24,0x9C,0x51,0x24,0xBB, +// 5x8 [0x53 'S'] +0x7C,0x60,0xC1,0x06,0x3E, +// 5x8 [0x54 'T'] +0xFD,0x48,0x42,0x10,0x8E, +// 6x8 [0x55 'U'] +0xCD,0x24,0x92,0x49,0x24,0x8C, +// 6x8 [0x56 'V'] +0xCD,0x24,0x94,0x50,0xC2,0x08, +// 5x8 [0x57 'W'] +0xAD,0x6A,0xE5,0x29,0x4A, +// 5x8 [0x58 'X'] +0xDA,0x94,0x42,0x29,0x5B, +// 5x8 [0x59 'Y'] +0xDA,0x94,0x42,0x10,0x8E, +// 5x8 [0x5A 'Z'] +0xFC,0x84,0x42,0x21,0x3F, +// 3x10 [0x5B '['] +0xF2,0x49,0x24,0x9C, +// 4x9 [0x5C '\'] +0x88,0x84,0x42,0x22,0x10, +// 3x10 [0x5D ']'] +0xE4,0x92,0x49,0x3C, +// 3x2 [0x5E '^'] +0x54, +// 6x1 [0x5F '_'] +0xFC, +// 1x1 [0x60 '`'] +0x80, +// 5x5 [0x61 'a'] +0x64,0x9D,0x27,0x80, +// 5x8 [0x62 'b'] +0xC2,0x10,0xE4,0xA5,0x2E, +// 4x5 [0x63 'c'] +0x79,0x88,0x70, +// 5x8 [0x64 'd'] +0x30,0x84,0xE9,0x4A,0x4F, +// 4x5 [0x65 'e'] +0x69,0xF8,0x70, +// 5x8 [0x66 'f'] +0x3A,0x11,0xE4,0x21,0x1E, +// 5x7 [0x67 'g'] +0x7C,0x99,0x0F,0x45,0xC0, +// 6x8 [0x68 'h'] +0xC1,0x04,0x1C,0x49,0x24,0xBB, +// 3x8 [0x69 'i'] +0x40,0x64,0x97, +// 4x10 [0x6A 'j'] +0x10,0x03,0x11,0x11,0x1E, +// 6x8 [0x6B 'k'] +0xC1,0x04,0x17,0x51,0xC4,0xBB, +// 5x8 [0x6C 'l'] +0xE1,0x08,0x42,0x10,0x9F, +// 5x5 [0x6D 'm'] +0xF5,0x6B,0x5A,0x80, +// 6x5 [0x6E 'n'] +0xF1,0x24,0x92,0xEC, +// 4x5 [0x6F 'o'] +0x69,0x99,0x60, +// 5x7 [0x70 'p'] +0xF2,0x52,0x97,0x23,0x80, +// 5x7 [0x71 'q'] +0x74,0xA5,0x27,0x08,0xE0, +// 5x5 [0x72 'r'] +0xDB,0x10,0x8E,0x00, +// 4x5 [0x73 's'] +0xF8,0x61,0xF0, +// 4x7 [0x74 't'] +0x44,0xE4,0x44,0x30, +// 6x5 [0x75 'u'] +0xD9,0x24,0x92,0x3C, +// 6x5 [0x76 'v'] +0xED,0x25,0x0C,0x20, +// 5x5 [0x77 'w'] +0xAD,0x5C,0xA5,0x00, +// 5x5 [0x78 'x'] +0xDA,0x88,0xAD,0x80, +// 6x7 [0x79 'y'] +0xED,0x25,0x0C,0x20,0x8C,0x00, +// 4x5 [0x7A 'z'] +0xF2,0x44,0xF0, +// 3x10 [0x7B '{'] +0x69,0x28,0x92,0x4C, +// 1x12 [0x7C '|'] +0xFF,0xF0, +// 3x10 [0x7D '}'] +0xC9,0x22,0x92,0x58, +// 6x3 [0x7E '~'] +0x42,0x91,0x80, +}; +const GFXglyph FreeSmallFontGlyphs[] PROGMEM = { + { 0, 0, 0, 8, 8, -12 }, // 0x20 ' ' + { 0, 1, 8, 8, 2, -10 }, // 0x21 '!' + { 1, 4, 3, 8, 1, -11 }, // 0x22 '"' + { 3, 6, 8, 8, 0, -10 }, // 0x23 '#' + { 9, 5, 10, 8, 0, -11 }, // 0x24 '$' + { 16, 6, 8, 8, 0, -10 }, // 0x25 '%' + { 22, 6, 8, 8, 0, -10 }, // 0x26 '&' + { 28, 2, 3, 8, 0, -11 }, // 0x27 ''' + { 29, 3, 10, 8, 3, -11 }, // 0x28 '(' + { 33, 3, 10, 8, 1, -11 }, // 0x29 ')' + { 37, 5, 6, 8, 0, -9 }, // 0x2A '*' + { 41, 5, 7, 8, 0, -10 }, // 0x2B '+' + { 46, 2, 3, 8, 0, -3 }, // 0x2C ',' + { 47, 5, 1, 8, 0, -7 }, // 0x2D '-' + { 48, 1, 1, 8, 1, -3 }, // 0x2E '.' + { 49, 5, 10, 8, 0, -11 }, // 0x2F '/' + { 56, 5, 8, 8, 0, -10 }, // 0x30 '0' + { 61, 3, 8, 8, 1, -10 }, // 0x31 '1' + { 64, 5, 8, 8, 0, -10 }, // 0x32 '2' + { 69, 5, 8, 8, 0, -10 }, // 0x33 '3' + { 74, 5, 8, 8, 0, -10 }, // 0x34 '4' + { 79, 5, 8, 8, 0, -10 }, // 0x35 '5' + { 84, 5, 8, 8, 0, -10 }, // 0x36 '6' + { 89, 5, 8, 8, 0, -10 }, // 0x37 '7' + { 94, 5, 8, 8, 0, -10 }, // 0x38 '8' + { 99, 5, 8, 8, 0, -10 }, // 0x39 '9' + { 104, 1, 6, 8, 2, -8 }, // 0x3A ':' + { 105, 1, 6, 8, 2, -7 }, // 0x3B ';' + { 106, 5, 9, 8, 1, -11 }, // 0x3C '<' + { 112, 5, 4, 8, 0, -8 }, // 0x3D '=' + { 115, 5, 9, 8, 1, -11 }, // 0x3E '>' + { 121, 5, 8, 8, 0, -10 }, // 0x3F '?' + { 126, 5, 8, 8, 0, -10 }, // 0x40 '@' + { 131, 6, 8, 8, 0, -10 }, // 0x41 'A' + { 137, 5, 8, 8, 0, -10 }, // 0x42 'B' + { 142, 5, 8, 8, 0, -10 }, // 0x43 'C' + { 147, 5, 8, 8, 0, -10 }, // 0x44 'D' + { 152, 5, 8, 8, 0, -10 }, // 0x45 'E' + { 157, 5, 8, 8, 0, -10 }, // 0x46 'F' + { 162, 6, 8, 8, 0, -10 }, // 0x47 'G' + { 168, 6, 8, 8, 0, -10 }, // 0x48 'H' + { 174, 5, 8, 8, 0, -10 }, // 0x49 'I' + { 179, 6, 9, 8, 0, -10 }, // 0x4A 'J' + { 186, 6, 8, 8, 0, -10 }, // 0x4B 'K' + { 192, 6, 8, 8, 0, -10 }, // 0x4C 'L' + { 198, 5, 8, 8, 0, -10 }, // 0x4D 'M' + { 203, 6, 8, 8, 0, -10 }, // 0x4E 'N' + { 209, 5, 8, 8, 0, -10 }, // 0x4F 'O' + { 214, 5, 8, 8, 0, -10 }, // 0x50 'P' + { 219, 5, 9, 8, 0, -10 }, // 0x51 'Q' + { 225, 6, 8, 8, 0, -10 }, // 0x52 'R' + { 231, 5, 8, 8, 0, -10 }, // 0x53 'S' + { 236, 5, 8, 8, 0, -10 }, // 0x54 'T' + { 241, 6, 8, 8, 0, -10 }, // 0x55 'U' + { 247, 6, 8, 8, 0, -10 }, // 0x56 'V' + { 253, 5, 8, 8, 0, -10 }, // 0x57 'W' + { 258, 5, 8, 8, 0, -10 }, // 0x58 'X' + { 263, 5, 8, 8, 0, -10 }, // 0x59 'Y' + { 268, 5, 8, 8, 0, -10 }, // 0x5A 'Z' + { 273, 3, 10, 8, 2, -11 }, // 0x5B '[' + { 277, 4, 9, 8, 1, -11 }, // 0x5C '\' + { 282, 3, 10, 8, 1, -11 }, // 0x5D ']' + { 286, 3, 2, 8, 1, -11 }, // 0x5E '^' + { 287, 6, 1, 8, 0, -1 }, // 0x5F '_' + { 288, 1, 1, 8, 2, -11 }, // 0x60 '`' + { 289, 5, 5, 8, 1, -7 }, // 0x61 'a' + { 293, 5, 8, 8, 0, -10 }, // 0x62 'b' + { 298, 4, 5, 8, 1, -7 }, // 0x63 'c' + { 301, 5, 8, 8, 1, -10 }, // 0x64 'd' + { 306, 4, 5, 8, 1, -7 }, // 0x65 'e' + { 309, 5, 8, 8, 1, -10 }, // 0x66 'f' + { 314, 5, 7, 8, 1, -7 }, // 0x67 'g' + { 319, 6, 8, 8, 0, -10 }, // 0x68 'h' + { 325, 3, 8, 8, 1, -10 }, // 0x69 'i' + { 328, 4, 10, 8, 0, -10 }, // 0x6A 'j' + { 333, 6, 8, 8, 0, -10 }, // 0x6B 'k' + { 339, 5, 8, 8, 0, -10 }, // 0x6C 'l' + { 344, 5, 5, 8, 0, -7 }, // 0x6D 'm' + { 348, 6, 5, 8, 0, -7 }, // 0x6E 'n' + { 352, 4, 5, 8, 1, -7 }, // 0x6F 'o' + { 355, 5, 7, 8, 0, -7 }, // 0x70 'p' + { 360, 5, 7, 8, 1, -7 }, // 0x71 'q' + { 365, 5, 5, 8, 0, -7 }, // 0x72 'r' + { 369, 4, 5, 8, 1, -7 }, // 0x73 's' + { 372, 4, 7, 8, 1, -9 }, // 0x74 't' + { 376, 6, 5, 8, 0, -7 }, // 0x75 'u' + { 380, 6, 5, 8, 0, -7 }, // 0x76 'v' + { 384, 5, 5, 8, 0, -7 }, // 0x77 'w' + { 388, 5, 5, 8, 0, -7 }, // 0x78 'x' + { 392, 6, 7, 8, 0, -7 }, // 0x79 'y' + { 398, 4, 5, 8, 1, -7 }, // 0x7A 'z' + { 401, 3, 10, 8, 2, -11 }, // 0x7B '{' + { 405, 1, 12, 8, 3, -12 }, // 0x7C '|' + { 407, 3, 10, 8, 1, -11 }, // 0x7D '}' + { 411, 6, 3, 8, 0, -12 }, // 0x7E '~' +}; +const GFXfont FreeSmallFont PROGMEM = { + (uint8_t *)FreeSmallFontBitmaps, + (GFXglyph *)FreeSmallFontGlyphs, + 32, 126, 12 +}; +// FreeSmallFont bitmap size = 414 [1079] [1239] +const uint8_t FreeBigFontBitmaps[] PROGMEM = { +// 0x0 [0x20 '.'] + +// 5x13 [0x21 '!'] +0x77,0xFF,0xFF,0xFD,0xCE,0x00,0x1C,0xE7,0x00, +// 9x5 [0x22 '"'] +0xE3,0xF1,0xF8,0xFC,0x76,0x30, +// 14x14 [0x23 '#'] +0x18,0x60,0x61,0x81,0x86,0x3F,0xFF,0xFF,0xFC,0x61,0x81,0x86,0x06,0x18,0x18,0x63, +0xFF,0xFF,0xFF,0xC6,0x18,0x18,0x60,0x61,0x80, +// 10x14 [0x24 '$'] +0x12,0x04,0x87,0xFF,0xFF,0xD2,0x34,0x8F,0xF9,0xFF,0x12,0xC4,0xBF,0xFF,0xFE,0x12, +0x04,0x80, +// 8x10 [0x25 '%'] +0xE1,0xE3,0xE7,0x0E,0x1C,0x38,0x70,0xE7,0xC7,0x87, +// 10x12 [0x26 '&'] +0x78,0x33,0x0C,0xC3,0x30,0x78,0x1E,0x17,0xCF,0x3F,0xC7,0xB1,0xCC,0xF9,0xF3, +// 4x4 [0x27 '''] +0x77,0x7E, +// 8x12 [0x28 '('] +0x0F,0x1C,0x38,0x70,0xE0,0xE0,0xE0,0xE0,0x70,0x38,0x1C,0x0F, +// 8x12 [0x29 ')'] +0xF0,0x38,0x1C,0x0E,0x07,0x07,0x07,0x07,0x0E,0x1C,0x38,0xF0, +// 12x12 [0x2A '*'] +0x06,0x04,0x62,0x26,0x41,0xF8,0x1F,0x8F,0xFF,0xFF,0xF1,0xF8,0x1F,0x82,0x64,0x46, +0x20,0x60, +// 8x8 [0x2B '+'] +0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18, +// 4x4 [0x2C ','] +0x77,0x7E, +// 10x2 [0x2D '-'] +0xFF,0xFF,0xF0, +// 3x3 [0x2E '.'] +0xFF,0x80, +// 12x12 [0x2F '/'] +0x00,0x10,0x03,0x00,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x1C,0x03,0x80,0x70, +0x0E,0x00, +// 10x12 [0x30 '0'] +0x7F,0xB8,0x7E,0x3F,0x9F,0xE7,0xFB,0x7E,0xDF,0xE7,0xF9,0xFC,0x7E,0x1D,0xFE, +// 9x12 [0x31 '1'] +0x0C,0x06,0x07,0x1F,0x8F,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x1F,0xF0, +// 10x12 [0x32 '2'] +0x7F,0x38,0xEE,0x1C,0x07,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1C,0x7E,0x1F,0xFF, +// 10x12 [0x33 '3'] +0x7F,0x38,0xEE,0x1C,0x07,0x03,0x87,0x81,0xE0,0x0E,0x01,0xF8,0x7E,0x39,0xFC, +// 10x12 [0x34 '4'] +0x07,0x03,0xC1,0xF0,0xDC,0x67,0x31,0xCF,0xFF,0xFF,0x07,0x01,0xC0,0x70,0x7F, +// 10x12 [0x35 '5'] +0xFF,0xF8,0x0E,0x03,0x80,0xE0,0x3F,0xCF,0xF8,0x0F,0x01,0xF8,0x7E,0x39,0xFC, +// 10x12 [0x36 '6'] +0x1F,0x0E,0x07,0x03,0x80,0xE0,0x3F,0xEF,0xFF,0x87,0xE1,0xF8,0x7E,0x1D,0xFE, +// 11x12 [0x37 '7'] +0xFF,0xFC,0x1F,0x83,0xF0,0x70,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0x70,0x0E, +0x00, +// 10x12 [0x38 '8'] +0x7F,0xB8,0x7E,0x1F,0x87,0xF9,0xCF,0xC3,0xF3,0x9F,0xE1,0xF8,0x7E,0x1D,0xFE, +// 10x12 [0x39 '9'] +0x7F,0xB8,0x7E,0x1F,0x87,0xE1,0xFF,0xF7,0xFC,0x07,0x01,0xC0,0xE0,0x70,0xF8, +// 3x8 [0x3A ':'] +0xFF,0x81,0xFF, +// 4x9 [0x3B ';'] +0x77,0x70,0x07,0x77,0xE0, +// 9x14 [0x3C '<'] +0x03,0x83,0x83,0x83,0x83,0x83,0x83,0x81,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C, +// 12x6 [0x3D '='] +0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF, +// 9x14 [0x3E '>'] +0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00, +// 10x14 [0x3F '?'] +0x1E,0x1F,0xEF,0x3F,0x07,0x01,0xC0,0xE0,0x70,0x38,0x0E,0x00,0x00,0x00,0x38,0x0E, +0x03,0x80, +// 11x14 [0x40 '@'] +0x7F,0xDC,0x1F,0x83,0xF0,0x7E,0x0F,0xCF,0xF9,0xFF,0x3F,0xE7,0xFC,0x03,0x80,0x70, +0x0F,0xF8,0x7F,0x80, +// 10x12 [0x41 'A'] +0x1E,0x0F,0xC7,0x3B,0x87,0xE1,0xF8,0x7E,0x1F,0xFF,0xE1,0xF8,0x7E,0x1F,0x87, +// 10x12 [0x42 'B'] +0xFF,0x9C,0x77,0x1D,0xC7,0x71,0xDF,0xE7,0xF9,0xC7,0x71,0xDC,0x77,0x1F,0xFE, +// 10x12 [0x43 'C'] +0x3F,0x9C,0x7E,0x1F,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x77,0x1C,0xFE, +// 10x12 [0x44 'D'] +0xFF,0x1C,0xE7,0x1D,0xC7,0x71,0xDC,0x77,0x1D,0xC7,0x71,0xDC,0x77,0x3B,0xFC, +// 10x12 [0x45 'E'] +0xFF,0xDC,0x37,0x05,0xC0,0x71,0x9F,0xE7,0xF9,0xC6,0x70,0x1C,0x17,0x0F,0xFF, +// 10x12 [0x46 'F'] +0xFF,0xDC,0x37,0x05,0xC0,0x71,0x9F,0xE7,0xF9,0xC6,0x70,0x1C,0x07,0x03,0xE0, +// 10x12 [0x47 'G'] +0x3F,0x9C,0x7E,0x1F,0x87,0xE0,0x38,0x0E,0x03,0x9F,0xE1,0xF8,0x77,0x1C,0xFF, +// 9x12 [0x48 'H'] +0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0xFF,0xFF,0xC7,0xE3,0xF1,0xF8,0xFC,0x70, +// 7x12 [0x49 'I'] +0xFE,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE7,0xF0, +// 12x12 [0x4A 'J'] +0x07,0xF0,0x1C,0x01,0xC0,0x1C,0x01,0xC0,0x1C,0x01,0xCE,0x1C,0xE1,0xCE,0x1C,0xE1, +0xC3,0xF8, +// 10x12 [0x4B 'K'] +0xF1,0xDC,0x77,0x39,0xDC,0x7E,0x1F,0x07,0xC1,0xF8,0x77,0x1C,0xE7,0x1F,0xC7, +// 10x12 [0x4C 'L'] +0xF8,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x5C,0x37,0x1F,0xFF, +// 11x12 [0x4D 'M'] +0xE0,0xFE,0x3F,0xEF,0xFF,0xFF,0xFF,0xDD,0xF9,0x3F,0x07,0xE0,0xFC,0x1F,0x83,0xF0, +0x70, +// 11x12 [0x4E 'N'] +0xE0,0xFC,0x1F,0xC3,0xFC,0x7F,0xCF,0xDD,0xF9,0xFF,0x1F,0xE1,0xFC,0x1F,0x83,0xF0, +0x70, +// 11x12 [0x4F 'O'] +0x1F,0x07,0xF1,0xC7,0x70,0x7E,0x0F,0xC1,0xF8,0x3F,0x07,0xE0,0xEE,0x38,0xFE,0x0F, +0x80, +// 10x12 [0x50 'P'] +0xFF,0x9C,0x77,0x1D,0xC7,0x71,0xDF,0xE7,0xF9,0xC0,0x70,0x1C,0x07,0x03,0xE0, +// 11x13 [0x51 'Q'] +0x1F,0x0F,0x79,0xC7,0x70,0x7E,0x0F,0xC1,0xF8,0x3F,0x1F,0xE7,0xEF,0xF9,0xFF,0x00, +0xE0,0x7E, +// 10x12 [0x52 'R'] +0xFF,0x9C,0x77,0x1D,0xC7,0x71,0xDF,0xE7,0xF9,0xCE,0x71,0xDC,0x77,0x1F,0xC7, +// 10x12 [0x53 'S'] +0x7F,0xB8,0x7E,0x1F,0x87,0xE0,0x1F,0xC3,0xF8,0x07,0xE1,0xF8,0x7E,0x1D,0xFE, +// 11x12 [0x54 'T'] +0xFF,0xF9,0xCE,0x38,0x87,0x00,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x1F, +0xC0, +// 9x12 [0x55 'U'] +0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xEF,0xE0, +// 9x12 [0x56 'V'] +0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7,0xE3,0xBB,0x8F,0x83,0x80, +// 11x12 [0x57 'W'] +0xE0,0xFC,0x1F,0x83,0xF0,0x7E,0x0F,0xC9,0xF9,0x3F,0x27,0x7F,0xCF,0xF8,0xEE,0x1D, +0xC0, +// 9x12 [0x58 'X'] +0xE3,0xF1,0xF8,0xEE,0xE3,0xE0,0xE0,0x70,0x7C,0x77,0x71,0xF8,0xFC,0x70, +// 9x12 [0x59 'Y'] +0xE3,0xF1,0xF8,0xFC,0x7E,0x3B,0xB8,0xF8,0x38,0x1C,0x0E,0x07,0x0F,0xE0, +// 10x12 [0x5A 'Z'] +0xFF,0xF8,0x7C,0x1E,0x0E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x78,0x3E,0x1F,0xFF, +// 7x12 [0x5B '['] +0xFF,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0xF0, +// 13x12 [0x5C '\'] +0x80,0x06,0x00,0x38,0x00,0xE0,0x03,0x80,0x0E,0x00,0x38,0x00,0xE0,0x03,0x80,0x0E, +0x00,0x38,0x00,0x70, +// 7x12 [0x5D ']'] +0xFE,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x3F,0xF0, +// 10x5 [0x5E '^'] +0x0C,0x07,0x83,0xF1,0xCE,0xE1,0xC0, +// 15x2 [0x5F '_'] +0xFF,0xFF,0xFF,0xFC, +// 5x4 [0x60 '`'] +0xE7,0x0E,0x70, +// 10x8 [0x61 'a'] +0x7F,0x00,0xE0,0x39,0xFE,0xE3,0xB8,0xEE,0x39,0xFB, +// 10x12 [0x62 'b'] +0xF0,0x1C,0x07,0x01,0xC0,0x7F,0x9C,0x77,0x1D,0xC7,0x71,0xDC,0x77,0x1F,0x7E, +// 9x8 [0x63 'c'] +0x7F,0x71,0xF8,0xFC,0x0E,0x07,0x1F,0x8E,0xFE, +// 10x12 [0x64 'd'] +0x07,0xC0,0xE0,0x38,0x0E,0x7F,0xB8,0xEE,0x3B,0x8E,0xE3,0xB8,0xEE,0x39,0xFB, +// 9x8 [0x65 'e'] +0x7F,0x71,0xF8,0xFF,0xFE,0x07,0x1F,0x8E,0xFE, +// 9x12 [0x66 'f'] +0x1F,0x1D,0xCE,0xE7,0x03,0x87,0xFB,0xFC,0x70,0x38,0x1C,0x0E,0x1F,0xC0, +// 10x10 [0x67 'g'] +0x7E,0xF8,0xEE,0x3B,0x8E,0xE3,0x9F,0xE3,0xF8,0x0E,0xE3,0x9F,0xC0, +// 10x12 [0x68 'h'] +0xF0,0x1C,0x07,0x01,0xC0,0x77,0x9E,0x77,0x9D,0xC7,0x71,0xDC,0x77,0x1F,0xC7, +// 9x12 [0x69 'i'] +0x1C,0x0E,0x07,0x00,0x0F,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x1F,0xF0, +// 9x14 [0x6A 'j'] +0x03,0x81,0xC0,0xE0,0x01,0xF8,0x1C,0x0E,0x07,0x03,0x81,0xC0,0xFC,0x76,0x79,0xF8, +// 10x12 [0x6B 'k'] +0xF0,0x1C,0x07,0x01,0xC0,0x71,0xDC,0xE7,0x71,0xF8,0x77,0x1C,0xE7,0x1F,0xC7, +// 9x12 [0x6C 'l'] +0xFC,0x0E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x1F,0xF0, +// 11x8 [0x6D 'm'] +0xFF,0xDC,0x9F,0x93,0xF2,0x7E,0x4F,0xC9,0xF9,0x3F,0x27, +// 9x8 [0x6E 'n'] +0xFF,0x71,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7, +// 9x8 [0x6F 'o'] +0x7F,0x71,0xF8,0xFC,0x7E,0x3F,0x1F,0x8E,0xFE, +// 10x10 [0x70 'p'] +0xDF,0x9C,0x77,0x1D,0xC7,0x71,0xDC,0x77,0xF9,0xC0,0x70,0x3E,0x00, +// 10x10 [0x71 'q'] +0x7E,0xF8,0xEE,0x3B,0x8E,0xE3,0xB8,0xE7,0xF8,0x0E,0x03,0x81,0xF0, +// 10x8 [0x72 'r'] +0xF7,0x9F,0xF7,0x9D,0xC0,0x70,0x1C,0x07,0x03,0xE0, +// 9x8 [0x73 's'] +0x7F,0x70,0xF8,0x6F,0x81,0xF6,0x1F,0x0E,0xFE, +// 9x11 [0x74 't'] +0x08,0x0C,0x0E,0x1F,0xF3,0x81,0xC0,0xE0,0x70,0x3B,0x9D,0xC7,0xC0, +// 10x8 [0x75 'u'] +0xE3,0xB8,0xEE,0x3B,0x8E,0xE3,0xB8,0xEE,0x39,0xFB, +// 9x8 [0x76 'v'] +0xE3,0xF1,0xF8,0xFC,0x7E,0x3B,0xB8,0xF8,0x38, +// 11x8 [0x77 'w'] +0xE0,0xFC,0x1F,0x83,0xF2,0x7E,0x4E,0xFF,0x8E,0xE1,0xDC, +// 8x8 [0x78 'x'] +0xE7,0xE7,0x7E,0x3C,0x3C,0x7E,0xE7,0xE7, +// 10x10 [0x79 'y'] +0x71,0xDC,0x77,0x1D,0xC7,0x71,0xCF,0xE1,0xF0,0x1C,0x0E,0x3F,0x00, +// 8x8 [0x7A 'z'] +0xFF,0xC7,0x8E,0x1C,0x38,0x71,0xE3,0xFF, +// 10x12 [0x7B '{'] +0x0F,0xC7,0x01,0xC0,0x70,0x38,0x38,0x0E,0x00,0xE0,0x1C,0x07,0x01,0xC0,0x3F, +// 3x14 [0x7C '|'] +0xFF,0xFF,0xFF,0xFF,0xFF,0xC0, +// 10x12 [0x7D '}'] +0xFC,0x03,0x80,0xE0,0x38,0x07,0x00,0x70,0x1C,0x1C,0x0E,0x03,0x80,0xE3,0xF0, +// 12x4 [0x7E '~'] +0x7C,0x7E,0xE7,0xE7,0x7E,0x3E, +}; +const GFXglyph FreeBigFontGlyphs[] PROGMEM = { + { 0, 0, 0, 16, 16, -16 }, // 0x20 ' ' + { 0, 5, 13, 16, 4, -14 }, // 0x21 '!' + { 9, 9, 5, 16, 4, -15 }, // 0x22 '"' + { 15, 14, 14, 16, 1, -15 }, // 0x23 '#' + { 40, 10, 14, 16, 3, -15 }, // 0x24 '$' + { 58, 8, 10, 16, 4, -13 }, // 0x25 '%' + { 68, 10, 12, 16, 3, -14 }, // 0x26 '&' + { 83, 4, 4, 16, 4, -14 }, // 0x27 ''' + { 85, 8, 12, 16, 4, -14 }, // 0x28 '(' + { 97, 8, 12, 16, 4, -14 }, // 0x29 ')' + { 109, 12, 12, 16, 2, -14 }, // 0x2A '*' + { 127, 8, 8, 16, 4, -12 }, // 0x2B '+' + { 135, 4, 4, 16, 4, -5 }, // 0x2C ',' + { 137, 10, 2, 16, 3, -9 }, // 0x2D '-' + { 140, 3, 3, 16, 5, -5 }, // 0x2E '.' + { 142, 12, 12, 16, 3, -14 }, // 0x2F '/' + { 160, 10, 12, 16, 3, -14 }, // 0x30 '0' + { 175, 9, 12, 16, 3, -14 }, // 0x31 '1' + { 189, 10, 12, 16, 3, -14 }, // 0x32 '2' + { 204, 10, 12, 16, 3, -14 }, // 0x33 '3' + { 219, 10, 12, 16, 3, -14 }, // 0x34 '4' + { 234, 10, 12, 16, 3, -14 }, // 0x35 '5' + { 249, 10, 12, 16, 3, -14 }, // 0x36 '6' + { 264, 11, 12, 16, 3, -14 }, // 0x37 '7' + { 281, 10, 12, 16, 3, -14 }, // 0x38 '8' + { 296, 10, 12, 16, 3, -14 }, // 0x39 '9' + { 311, 3, 8, 16, 6, -12 }, // 0x3A ':' + { 314, 4, 9, 16, 5, -12 }, // 0x3B ';' + { 319, 9, 14, 16, 3, -15 }, // 0x3C '<' + { 335, 12, 6, 16, 2, -11 }, // 0x3D '=' + { 344, 9, 14, 16, 3, -15 }, // 0x3E '>' + { 360, 10, 14, 16, 3, -15 }, // 0x3F '?' + { 378, 11, 14, 16, 3, -15 }, // 0x40 '@' + { 398, 10, 12, 16, 3, -14 }, // 0x41 'A' + { 413, 10, 12, 16, 3, -14 }, // 0x42 'B' + { 428, 10, 12, 16, 3, -14 }, // 0x43 'C' + { 443, 10, 12, 16, 3, -14 }, // 0x44 'D' + { 458, 10, 12, 16, 3, -14 }, // 0x45 'E' + { 473, 10, 12, 16, 3, -14 }, // 0x46 'F' + { 488, 10, 12, 16, 3, -14 }, // 0x47 'G' + { 503, 9, 12, 16, 3, -14 }, // 0x48 'H' + { 517, 7, 12, 16, 4, -14 }, // 0x49 'I' + { 528, 12, 12, 16, 2, -14 }, // 0x4A 'J' + { 546, 10, 12, 16, 3, -14 }, // 0x4B 'K' + { 561, 10, 12, 16, 3, -14 }, // 0x4C 'L' + { 576, 11, 12, 16, 3, -14 }, // 0x4D 'M' + { 593, 11, 12, 16, 3, -14 }, // 0x4E 'N' + { 610, 11, 12, 16, 3, -14 }, // 0x4F 'O' + { 627, 10, 12, 16, 3, -14 }, // 0x50 'P' + { 642, 11, 13, 16, 3, -14 }, // 0x51 'Q' + { 660, 10, 12, 16, 3, -14 }, // 0x52 'R' + { 675, 10, 12, 16, 3, -14 }, // 0x53 'S' + { 690, 11, 12, 16, 3, -14 }, // 0x54 'T' + { 707, 9, 12, 16, 3, -14 }, // 0x55 'U' + { 721, 9, 12, 16, 3, -14 }, // 0x56 'V' + { 735, 11, 12, 16, 3, -14 }, // 0x57 'W' + { 752, 9, 12, 16, 3, -14 }, // 0x58 'X' + { 766, 9, 12, 16, 3, -14 }, // 0x59 'Y' + { 780, 10, 12, 16, 3, -14 }, // 0x5A 'Z' + { 795, 7, 12, 16, 5, -14 }, // 0x5B '[' + { 806, 13, 12, 16, 3, -14 }, // 0x5C '\' + { 826, 7, 12, 16, 5, -14 }, // 0x5D ']' + { 837, 10, 5, 16, 3, -15 }, // 0x5E '^' + { 844, 15, 2, 16, 1, -2 }, // 0x5F '_' + { 848, 5, 4, 16, 3, -14 }, // 0x60 '`' + { 851, 10, 8, 16, 3, -10 }, // 0x61 'a' + { 861, 10, 12, 16, 3, -14 }, // 0x62 'b' + { 876, 9, 8, 16, 3, -10 }, // 0x63 'c' + { 885, 10, 12, 16, 3, -14 }, // 0x64 'd' + { 900, 9, 8, 16, 3, -10 }, // 0x65 'e' + { 909, 9, 12, 16, 3, -14 }, // 0x66 'f' + { 923, 10, 10, 16, 3, -10 }, // 0x67 'g' + { 936, 10, 12, 16, 3, -14 }, // 0x68 'h' + { 951, 9, 12, 16, 4, -14 }, // 0x69 'i' + { 965, 9, 14, 16, 3, -14 }, // 0x6A 'j' + { 981, 10, 12, 16, 3, -14 }, // 0x6B 'k' + { 996, 9, 12, 16, 4, -14 }, // 0x6C 'l' + {1010, 11, 8, 16, 3, -10 }, // 0x6D 'm' + {1021, 9, 8, 16, 3, -10 }, // 0x6E 'n' + {1030, 9, 8, 16, 3, -10 }, // 0x6F 'o' + {1039, 10, 10, 16, 3, -10 }, // 0x70 'p' + {1052, 10, 10, 16, 2, -10 }, // 0x71 'q' + {1065, 10, 8, 16, 3, -10 }, // 0x72 'r' + {1075, 9, 8, 16, 3, -10 }, // 0x73 's' + {1084, 9, 11, 16, 3, -13 }, // 0x74 't' + {1097, 10, 8, 16, 3, -10 }, // 0x75 'u' + {1107, 9, 8, 16, 3, -10 }, // 0x76 'v' + {1116, 11, 8, 16, 3, -10 }, // 0x77 'w' + {1127, 8, 8, 16, 3, -10 }, // 0x78 'x' + {1135, 10, 10, 16, 3, -10 }, // 0x79 'y' + {1148, 8, 8, 16, 3, -10 }, // 0x7A 'z' + {1156, 10, 12, 16, 3, -14 }, // 0x7B '{' + {1171, 3, 14, 16, 7, -15 }, // 0x7C '|' + {1177, 10, 12, 16, 3, -14 }, // 0x7D '}' + {1192, 12, 4, 16, 2, -14 }, // 0x7E '~' +}; +const GFXfont FreeBigFont PROGMEM = { + (uint8_t *)FreeBigFontBitmaps, + (GFXglyph *)FreeBigFontGlyphs, + 32, 126, 16 +}; +// FreeBigFont bitmap size = 1198 [1863] [3139] +const uint8_t FreeSevenSegNumFontBitmaps[] PROGMEM = { +// 27x46 [0x30 '0'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0xC3,0x3F,0xFF, +0xBC,0xF0,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80, +0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F,0xFF, +0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80,0x00,0xFF,0xF0,0x00,0x1F, +0xFC,0x00,0x00,0xFE,0x00,0x00,0x07,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00, +0x00,0xE0,0x00,0x00,0x7F,0x00,0x00,0x3F,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0, +0x00,0x7F,0xF8,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF, +0x80,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F, +0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0x78,0x00,0x03,0xC6,0x7F,0xFF,0x30,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +// 6x39 [0x31 '1'] +0x31,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3C,0x30,0x40,0x00, +0x33,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xE3,0x00, +// 27x46 [0x32 '2'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0xC0,0x3F,0xFF, +0xBC,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00, +0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0, +0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F, +0x80,0x00,0x00,0xF0,0x7F,0xFF,0x86,0x1F,0xFF,0xFC,0x4F,0xFF,0xFF,0xE4,0xFF,0xFF, +0xF8,0xE7,0xFF,0xFC,0x1F,0x00,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0, +0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F, +0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00, +0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0x78,0x00,0x00,0x06,0x7F,0xFF,0x00,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +// 25x46 [0x33 '3'] +0x0F,0xFF,0xE0,0x0F,0xFF,0xF8,0x0F,0xFF,0xFE,0x03,0xFF,0xFE,0xC0,0xFF,0xFE,0xF0, +0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80,0x00,0x0F,0xC0, +0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00, +0x00,0x3F,0x00,0x00,0x1F,0x80,0x00,0x0F,0xC0,0x00,0x07,0xE0,0x00,0x00,0xF1,0xFF, +0xFE,0x19,0xFF,0xFF,0xC7,0xFF,0xFF,0xF8,0xFF,0xFF,0xF8,0x1F,0xFF,0xF1,0x80,0x00, +0x03,0xC0,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00,0x00,0xFC,0x00,0x00, +0x7E,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80,0x00,0x0F,0xC0,0x00,0x07,0xE0,0x00,0x03, +0xF0,0x00,0x01,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x3F,0x00,0x00,0x0F, +0x07,0xFF,0xF3,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x7F,0xFF,0x00, +// 27x39 [0x34 '4'] +0x00,0x00,0x01,0x86,0x00,0x00,0x79,0xE0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00, +0x7F,0xF8,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80, +0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F,0xFF, +0x00,0x01,0xFF,0xE0,0x00,0x3F,0xF8,0x00,0x01,0xFC,0xFF,0xFF,0x0E,0x3F,0xFF,0xF8, +0x9F,0xFF,0xFF,0xC1,0xFF,0xFF,0xF0,0x0F,0xFF,0xF8,0xC0,0x00,0x00,0x78,0x00,0x00, +0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00, +0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0, +0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x07, +0x80,0x00,0x00,0x60, +// 27x46 [0x35 '5'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0x03,0x3F,0xFF, +0x80,0xF0,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80, +0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F, +0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00, +0x7C,0x00,0x00,0x0E,0x7F,0xFF,0x81,0x1F,0xFF,0xFC,0x0F,0xFF,0xFF,0xE0,0xFF,0xFF, +0xF8,0x07,0xFF,0xFC,0x60,0x00,0x00,0x3C,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00, +0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0, +0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F, +0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x03,0xC0,0x7F,0xFF,0x30,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +// 27x46 [0x36 '6'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0x03,0x3F,0xFF, +0x80,0xF0,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80, +0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F, +0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00, +0x7C,0x00,0x00,0x0E,0x7F,0xFF,0x81,0x1F,0xFF,0xFC,0x0F,0xFF,0xFF,0xE4,0xFF,0xFF, +0xF8,0xE7,0xFF,0xFC,0x7F,0x00,0x00,0x3F,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0, +0x00,0x7F,0xF8,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF, +0x80,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F, +0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0x78,0x00,0x03,0xC6,0x7F,0xFF,0x30,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +// 23x42 [0x37 '7'] +0x3F,0xFF,0x80,0xFF,0xFF,0x83,0xFF,0xFF,0x83,0xFF,0xFE,0xC3,0xFF,0xFB,0xC0,0x00, +0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8, +0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00, +0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x00,0xF0,0x00,0x00,0x60,0x00,0x00,0x40, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x3C,0x00,0x01,0xF8,0x00,0x03, +0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00, +0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F, +0x80,0x00,0x3F,0x00,0x00,0x3C,0x00,0x00,0x30, +// 27x46 [0x38 '8'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0xC3,0x3F,0xFF, +0xBC,0xF0,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80, +0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F,0xFF, +0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80,0x00,0xFF,0xF0,0x00,0x1F, +0xFC,0x00,0x00,0xFE,0x7F,0xFF,0x87,0x1F,0xFF,0xFC,0x4F,0xFF,0xFF,0xE4,0xFF,0xFF, +0xF8,0xE7,0xFF,0xFC,0x7F,0x00,0x00,0x3F,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0, +0x00,0x7F,0xF8,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF, +0x80,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F, +0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0x78,0x00,0x03,0xC6,0x7F,0xFF,0x30,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +// 27x46 [0x39 '9'] +0x03,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x3F,0xFF,0xF8,0x03,0xFF,0xFE,0xC3,0x3F,0xFF, +0xBC,0xF0,0x00,0x0F,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80, +0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x0F,0xFF, +0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80,0x00,0xFF,0xF0,0x00,0x1F, +0xFC,0x00,0x00,0xFE,0x7F,0xFF,0x87,0x1F,0xFF,0xFC,0x4F,0xFF,0xFF,0xE0,0xFF,0xFF, +0xF8,0x07,0xFF,0xFC,0x60,0x00,0x00,0x3C,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00, +0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0, +0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F, +0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x03,0xC0,0x7F,0xFF,0x30,0x1F,0xFF, +0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF0,0x00, +}; +const GFXglyph FreeSevenSegNumFontGlyphs[] PROGMEM = { + { 0, 27, 46, 32, 2, -48 }, // 0x30 '0' + { 156, 6, 39, 32, 23, -45 }, // 0x31 '1' + { 186, 27, 46, 32, 2, -48 }, // 0x32 '2' + { 342, 25, 46, 32, 4, -48 }, // 0x33 '3' + { 486, 27, 39, 32, 2, -45 }, // 0x34 '4' + { 618, 27, 46, 32, 2, -48 }, // 0x35 '5' + { 774, 27, 46, 32, 2, -48 }, // 0x36 '6' + { 930, 23, 42, 32, 6, -48 }, // 0x37 '7' + {1051, 27, 46, 32, 2, -48 }, // 0x38 '8' + {1207, 27, 46, 32, 2, -48 }, // 0x39 '9' +}; +const GFXfont FreeSevenSegNumFont PROGMEM = { + (uint8_t *)FreeSevenSegNumFontBitmaps, + (GFXglyph *)FreeSevenSegNumFontGlyphs, + 48, 57, 50 +}; +// FreeSevenSegNumFont bitmap size = 1363 [1433] [2014] + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/FreeSevenSegNumFontPlusPlus.h b/Arduino/Libraries/MCUFRIEND_kbv/FreeSevenSegNumFontPlusPlus.h new file mode 100644 index 0000000..93afe8a --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/FreeSevenSegNumFontPlusPlus.h @@ -0,0 +1,131 @@ +// generate FreeFont from UTFT font +const uint8_t FreeSevenSegNumFontPlusPlusBitmaps[] PROGMEM = { + // 7x7 [0x2E '.'] + 0x38, 0xFB, 0xFF, 0xFF, 0xEF, 0x8E, 0x00, + // 0x0 [0x2F '/'] + + // 27x46 [0x30 '0'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0xC3, 0x3F, 0xFF, + 0xBC, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, + 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, + 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, + 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, + 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0x78, 0x00, 0x03, 0xC6, 0x7F, 0xFF, 0x30, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 6x39 [0x31 '1'] + 0x31, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x30, 0x40, 0x00, + 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE3, 0x00, + // 27x46 [0x32 '2'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0xC0, 0x3F, 0xFF, + 0xBC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, + 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x00, 0xF0, 0x7F, 0xFF, 0x86, 0x1F, 0xFF, 0xFC, 0x4F, 0xFF, 0xFF, 0xE4, 0xFF, 0xFF, + 0xF8, 0xE7, 0xFF, 0xFC, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, + 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x06, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 25x46 [0x33 '3'] + 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0xC0, 0xFF, 0xFE, 0xF0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, + 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xF1, 0xFF, + 0xFE, 0x19, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xF1, 0x80, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, + 0x07, 0xFF, 0xF3, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, + // 27x39 [0x34 '4'] + 0x00, 0x00, 0x01, 0x86, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, + 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, + 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0xFC, 0xFF, 0xFF, 0x0E, 0x3F, 0xFF, 0xF8, + 0x9F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xF8, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x60, + // 27x46 [0x35 '5'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x03, 0x3F, 0xFF, + 0x80, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x0E, 0x7F, 0xFF, 0x81, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xF8, 0x07, 0xFF, 0xFC, 0x60, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xC0, 0x7F, 0xFF, 0x30, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 27x46 [0x36 '6'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x03, 0x3F, 0xFF, + 0x80, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x0E, 0x7F, 0xFF, 0x81, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE4, 0xFF, 0xFF, + 0xF8, 0xE7, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, + 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, + 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0x78, 0x00, 0x03, 0xC6, 0x7F, 0xFF, 0x30, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 23x42 [0x37 '7'] + 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x83, 0xFF, 0xFE, 0xC3, 0xFF, 0xFB, 0xC0, 0x00, + 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, + 0x00, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, + 0x80, 0x00, 0x3F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x30, + // 27x46 [0x38 '8'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0xC3, 0x3F, 0xFF, + 0xBC, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, + 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, + 0xFC, 0x00, 0x00, 0xFE, 0x7F, 0xFF, 0x87, 0x1F, 0xFF, 0xFC, 0x4F, 0xFF, 0xFF, 0xE4, 0xFF, 0xFF, + 0xF8, 0xE7, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, + 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, + 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0x78, 0x00, 0x03, 0xC6, 0x7F, 0xFF, 0x30, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 27x46 [0x39 '9'] + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0xC3, 0x3F, 0xFF, + 0xBC, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, + 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, + 0xFC, 0x00, 0x00, 0xFE, 0x7F, 0xFF, 0x87, 0x1F, 0xFF, 0xFC, 0x4F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xF8, 0x07, 0xFF, 0xFC, 0x60, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xC0, 0x7F, 0xFF, 0x30, 0x1F, 0xFF, + 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xF0, 0x00, + // 7x28 [0x3A ':'] + 0x38, 0xFB, 0xFF, 0xFF, 0xEF, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x1F, 0x7F, 0xFF, 0xFD, 0xF1, 0xC0, +}; +// strip blank pixels: top = 0, bot = 2, left = 2, rt = 0, adv = 32, desc = 0 +const GFXglyph FreeSevenSegNumFontPlusPlusGlyphs[] PROGMEM = { + { 0, 7, 7, 32, 14, -12 }, // 0x2E '.' + { 7, 0, 0, 32, 32, -50 }, // 0x2F '/' + { 7, 27, 46, 32, 2, -48 }, // 0x30 '0' + { 163, 6, 39, 32, 23, -45 }, // 0x31 '1' + { 193, 27, 46, 32, 2, -48 }, // 0x32 '2' + { 349, 25, 46, 32, 4, -48 }, // 0x33 '3' + { 493, 27, 39, 32, 2, -45 }, // 0x34 '4' + { 625, 27, 46, 32, 2, -48 }, // 0x35 '5' + { 781, 27, 46, 32, 2, -48 }, // 0x36 '6' + { 937, 23, 42, 32, 6, -48 }, // 0x37 '7' + {1058, 27, 46, 32, 2, -48 }, // 0x38 '8' + {1214, 27, 46, 32, 2, -48 }, // 0x39 '9' + {1370, 7, 28, 32, 14, -38 }, // 0x3A ':' +}; +const GFXfont FreeSevenSegNumFontPlusPlus PROGMEM = { + (uint8_t *)FreeSevenSegNumFontPlusPlusBitmaps, + (GFXglyph *)FreeSevenSegNumFontPlusPlusGlyphs, + 46, 59, 50 +}; +// FreeSevenSegNumFontPlusPlus bitmap size = 1395 [1525] [2617] + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.cpp b/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.cpp new file mode 100644 index 0000000..66ad08e --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.cpp @@ -0,0 +1,2937 @@ +//#define SUPPORT_0139 //S6D0139 +280 bytes +#define SUPPORT_0154 //S6D0154 +320 bytes +//#define SUPPORT_1289 //SSD1289,SSD1297 (ID=0x9797) +626 bytes, 0.03s +//#define SUPPORT_1580 //R61580 Untested +#define SUPPORT_1963 //only works with 16BIT bus anyway +//#define SUPPORT_4532 //LGDP4532 +120 bytes. thanks Leodino +#define SUPPORT_4535 //LGDP4535 +180 bytes +#define SUPPORT_68140 //RM68140 +52 bytes defaults to PIXFMT=0x55 +//#define SUPPORT_7735 +#define SUPPORT_7781 //ST7781 +172 bytes +//#define SUPPORT_8230 //UC8230 +118 bytes +//#define SUPPORT_8347D //HX8347-D, HX8347-G, HX8347-I, HX8367-A +520 bytes, 0.27s +//#define SUPPORT_8347A //HX8347-A +500 bytes, 0.27s +//#define SUPPORT_8352A //HX8352A +486 bytes, 0.27s +//#define SUPPORT_8352B //HX8352B +//#define SUPPORT_8357D_GAMMA //monster 34 byte +//#define SUPPORT_9163 // +//#define SUPPORT_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226, ID=0x6813 +380 bytes +//#define SUPPORT_9326_5420 //ILI9326, SPFD5420 +246 bytes +//#define SUPPORT_9342 //costs +114 bytes +//#define SUPPORT_9806 //UNTESTED +#define SUPPORT_9488_555 //costs +230 bytes, 0.03s / 0.19s +#define SUPPORT_B509_7793 //R61509, ST7793 +244 bytes +#define OFFSET_9327 32 //costs about 103 bytes, 0.08s + +#include "MCUFRIEND_kbv.h" +#if defined(USE_SERIAL) +#include "utility/mcufriend_serial.h" + //uint8_t running; +#elif defined(__MBED__) +#include "utility/mcufriend_mbed.h" +#elif defined(__CC_ARM) || defined(__CROSSWORKS_ARM) +#include "utility/mcufriend_keil.h" +#else +#include "utility/mcufriend_shield.h" +#endif + +#define MIPI_DCS_REV1 (1<<0) +#define AUTO_READINC (1<<1) +#define READ_BGR (1<<2) +#define READ_LOWHIGH (1<<3) +#define READ_24BITS (1<<4) +#define XSA_XEA_16BIT (1<<5) +#define READ_NODUMMY (1<<6) +#define INVERT_GS (1<<8) +#define INVERT_SS (1<<9) +#define MV_AXIS (1<<10) +#define INVERT_RGB (1<<11) +#define REV_SCREEN (1<<12) +#define FLIP_VERT (1<<13) +#define FLIP_HORIZ (1<<14) + +#if (defined(USES_16BIT_BUS)) //only comes from SPECIALs +#define USING_16BIT_BUS 1 +#else +#define USING_16BIT_BUS 0 +#endif + +MCUFRIEND_kbv::MCUFRIEND_kbv(int CS, int RS, int WR, int RD, int _RST):Adafruit_GFX(240, 320) +{ + // we can not access GPIO pins until AHB has been enabled. +} + +static uint8_t done_reset, is8347, is555, is9797; +static uint16_t color565_to_555(uint16_t color) { + return (color & 0xFFC0) | ((color & 0x1F) << 1) | ((color & 0x01)); //lose Green LSB, extend Blue LSB +} +static uint16_t color555_to_565(uint16_t color) { + return (color & 0xFFC0) | ((color & 0x0400) >> 5) | ((color & 0x3F) >> 1); //extend Green LSB +} +static uint8_t color565_to_r(uint16_t color) { + return ((color & 0xF800) >> 8); // transform to rrrrrxxx +} +static uint8_t color565_to_g(uint16_t color) { + return ((color & 0x07E0) >> 3); // transform to ggggggxx +} +static uint8_t color565_to_b(uint16_t color) { + return ((color & 0x001F) << 3); // transform to bbbbbxxx +} +static void write24(uint16_t color) { + uint8_t r = color565_to_r(color); + uint8_t g = color565_to_g(color); + uint8_t b = color565_to_b(color); + write8(r); + write8(g); + write8(b); +} + +void MCUFRIEND_kbv::reset(void) +{ + done_reset = 1; + setWriteDir(); + CTL_INIT(); + CS_IDLE; + RD_IDLE; + WR_IDLE; + RESET_IDLE; + delay(50); + RESET_ACTIVE; + delay(100); + RESET_IDLE; + delay(100); + WriteCmdData(0xB0, 0x0000); //R61520 needs this to read ID +} + +static void writecmddata(uint16_t cmd, uint16_t dat) +{ + CS_ACTIVE; + WriteCmd(cmd); + WriteData(dat); + CS_IDLE; +} + +void MCUFRIEND_kbv::WriteCmdData(uint16_t cmd, uint16_t dat) { writecmddata(cmd, dat); } + +static void WriteCmdParamN(uint16_t cmd, int8_t N, uint8_t * block) +{ + CS_ACTIVE; + WriteCmd(cmd); + while (N-- > 0) { + uint8_t u8 = *block++; + write8(u8); + if (N && is8347) { + cmd++; + WriteCmd(cmd); + } + } + CS_IDLE; +} + +static inline void WriteCmdParam4(uint8_t cmd, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4) +{ + uint8_t d[4]; + d[0] = d1, d[1] = d2, d[2] = d3, d[3] = d4; + WriteCmdParamN(cmd, 4, d); +} + +//#define WriteCmdParam4(cmd, d1, d2, d3, d4) {uint8_t d[4];d[0] = d1, d[1] = d2, d[2] = d3, d[3] = d4;WriteCmdParamN(cmd, 4, d);} +void MCUFRIEND_kbv::pushCommand(uint16_t cmd, uint8_t * block, int8_t N) { WriteCmdParamN(cmd, N, block); } + +static uint16_t read16bits(void) +{ + uint16_t ret; + uint8_t lo; +#if USING_16BIT_BUS + READ_16(ret); //single strobe to read whole bus + if (ret > 255) //ID might say 0x00D3 + return ret; +#else + delay(1); //1us should be adequate + READ_8(ret); +#endif + //all MIPI_DCS_REV1 style params are 8-bit + delay(1); //1us should be adequate + READ_8(lo); + return (ret << 8) | lo; +} + +uint16_t MCUFRIEND_kbv::readReg(uint16_t reg, int8_t index) +{ + uint16_t ret; + uint8_t lo; + if (!done_reset) + reset(); + CS_ACTIVE; + WriteCmd(reg); + setReadDir(); + delay(1); //1us should be adequate + // READ_16(ret); + do { ret = read16bits(); }while (--index >= 0); //need to test with SSD1963 + RD_IDLE; + CS_IDLE; + setWriteDir(); + return ret; +} + +uint32_t MCUFRIEND_kbv::readReg32(uint16_t reg) +{ + uint16_t h = readReg(reg, 0); + uint16_t l = readReg(reg, 1); + return ((uint32_t) h << 16) | (l); +} + +uint32_t MCUFRIEND_kbv::readReg40(uint16_t reg) +{ + uint16_t h = readReg(reg, 0); + uint16_t m = readReg(reg, 1); + uint16_t l = readReg(reg, 2); + return ((uint32_t) h << 24) | (m << 8) | (l >> 8); +} + +uint16_t MCUFRIEND_kbv::readID(void) +{ + uint16_t ret, ret2; + uint8_t msb; + ret = readReg(0); //forces a reset() if called before begin() + if (ret == 0x5408) //the SPFD5408 fails the 0xD3D3 test. + return 0x5408; + if (ret == 0x5420) //the SPFD5420 fails the 0xD3D3 test. + return 0x5420; + if (ret == 0x8989) //SSD1289 is always 8989 + return 0x1289; + ret = readReg(0x67); //HX8347-A + if (ret == 0x4747) + return 0x8347; + ret = readReg40(0xEF); //ILI9327: [xx 02 04 93 27 FF] + if (ret == 0x9327) + return 0x9327; +//#if defined(SUPPORT_1963) && USING_16BIT_BUS + ret = readReg32(0xA1); //SSD1963: [01 57 61 01] + if (ret == 0x6101) + return 0x1963; + if (ret == 0xFFFF) //R61526: [xx FF FF FF] + return 0x1526; //subsequent begin() enables Command Access + if (ret == 0xFF00) //R61520: [xx FF FF 00] + return 0x1520; //subsequent begin() enables Command Access +//#endif + ret = readReg40(0xBF); + if (ret == 0x8357) //HX8357B: [xx 01 62 83 57 FF] + return 0x8357; + if (ret == 0x9481) //ILI9481: [xx 02 04 94 81 FF] + return 0x9481; + if (ret == 0x1511) //?R61511: [xx 02 04 15 11] not tested yet + return 0x1511; + if (ret == 0x1520) //?R61520: [xx 01 22 15 20] + return 0x1520; + if (ret == 0x1526) //?R61526: [xx 01 22 15 26] + return 0x1526; + if (ret == 0x1581) //R61581: [xx 01 22 15 81] + return 0x1581; + if (ret == 0x1400) //?RM68140:[xx FF 68 14 00] not tested yet + return 0x6814; + ret = readReg32(0xD4); + if (ret == 0x5310) //NT35310: [xx 01 53 10] + return 0x5310; + ret = readReg32(0xD7); + if (ret == 0x8031) //weird unknown from BangGood [xx 20 80 31] PrinceCharles + return 0x8031; + ret = readReg32(0xFE) >> 8; //weird unknown from BangGood [04 20 53] + if (ret == 0x2053) + return 0x2053; + uint32_t ret32 = readReg32(0x04); + msb = ret32 >> 16; + ret = ret32; +// if (msb = 0x38 && ret == 0x8000) //unknown [xx 38 80 00] with D3 = 0x1602 + if (msb == 0x00 && ret == 0x8000) { //HX8357-D [xx 00 80 00] +#if 1 + uint8_t cmds[] = {0xFF, 0x83, 0x57}; + pushCommand(0xB9, cmds, 3); + msb = readReg(0xD0); + if (msb == 0x99) return 0x0099; //HX8357-D from datasheet + if (msb == 0x90) //HX8357-C undocumented +#endif + return 0x9090; //BIG CHANGE: HX8357-D was 0x8357 + } +// if (msb == 0xFF && ret == 0xFFFF) //R61526 [xx FF FF FF] +// return 0x1526; //subsequent begin() enables Command Access + if (ret == 0x1526) //R61526 [xx 06 15 26] if I have written NVM + return 0x1526; //subsequent begin() enables Command Access + if (ret == 0x89F0) //ST7735S: [xx 7C 89 F0] + return 0x7735; + if (ret == 0x8552) //ST7789V: [xx 85 85 52] + return 0x7789; + if (ret == 0xAC11) //?unknown [xx 61 AC 11] + return 0xAC11; + ret32 = readReg32(0xD3); //[xx 91 63 00] + ret = ret32 >> 8; + if (ret == 0x9163) return ret; + ret = readReg32(0xD3); //for ILI9488, 9486, 9340, 9341 + msb = ret >> 8; + if (msb == 0x93 || msb == 0x94 || msb == 0x98 || msb == 0x77 || msb == 0x16) + return ret; //0x9488, 9486, 9340, 9341, 7796 + if (ret == 0x00D3 || ret == 0xD3D3) + return ret; //16-bit write-only bus +/* + msb = 0x12; //read 3rd,4th byte. does not work in parallel + pushCommand(0xD9, &msb, 1); + ret2 = readReg(0xD3); + msb = 0x13; + pushCommand(0xD9, &msb, 1); + ret = (ret2 << 8) | readReg(0xD3); +// if (ret2 == 0x93) + return ret2; +*/ + return readReg(0); //0154, 7783, 9320, 9325, 9335, B505, B509 +} + + // independent cursor and window registers. S6D0154, ST7781 increments. ILI92320/5 do not. +int16_t MCUFRIEND_kbv::readGRAM(int16_t x, int16_t y, uint16_t * block, int16_t w, int16_t h) +{ + uint16_t ret, dummy, _MR = _MW; + int16_t n = w * h, row = 0, col = 0; + uint8_t r, g, b, tmp; + if (!is8347 && _lcd_capable & MIPI_DCS_REV1) // HX8347 uses same register + _MR = 0x2E; + if (_lcd_ID == 0x1602) _MR = 0x2E; + setAddrWindow(x, y, x + w - 1, y + h - 1); + while (n > 0) { + if (!(_lcd_capable & MIPI_DCS_REV1)) { + WriteCmdData(_MC, x + col); + WriteCmdData(_MP, y + row); + } + CS_ACTIVE; + WriteCmd(_MR); + setReadDir(); + if (_lcd_capable & READ_NODUMMY) { + ; + } else if ((_lcd_capable & MIPI_DCS_REV1) || _lcd_ID == 0x1289) { + READ_8(r); + } else { + READ_16(dummy); + } + if (_lcd_ID == 0x1511) READ_8(r); //extra dummy for R61511 + while (n) { + if (_lcd_capable & READ_24BITS) { + READ_8(r); + READ_8(g); + READ_8(b); + if (_lcd_capable & READ_BGR) + ret = color565(b, g, r); + else + ret = color565(r, g, b); + } else { + READ_16(ret); + if (_lcd_capable & READ_LOWHIGH) + ret = (ret >> 8) | (ret << 8); + if (_lcd_capable & READ_BGR) + ret = (ret & 0x07E0) | (ret >> 11) | (ret << 11); + } +#if defined(SUPPORT_9488_555) + if (is555) ret = color555_to_565(ret); +#endif + *block++ = ret; + n--; + if (!(_lcd_capable & AUTO_READINC)) + break; + } + if (++col >= w) { + col = 0; + if (++row >= h) + row = 0; + } + RD_IDLE; + CS_IDLE; + setWriteDir(); + } + if (!(_lcd_capable & MIPI_DCS_REV1)) + setAddrWindow(0, 0, width() - 1, height() - 1); + return 0; +} + +void MCUFRIEND_kbv::setRotation(uint8_t r) +{ + uint16_t GS, SS_v, ORG, REV = _lcd_rev; + uint8_t val, d[3]; + rotation = r & 3; // just perform the operation ourselves on the protected variables + _width = (rotation & 1) ? HEIGHT : WIDTH; + _height = (rotation & 1) ? WIDTH : HEIGHT; + switch (rotation) { + case 0: //PORTRAIT: + val = 0x48; //MY=0, MX=1, MV=0, ML=0, BGR=1 + break; + case 1: //LANDSCAPE: 90 degrees + val = 0x28; //MY=0, MX=0, MV=1, ML=0, BGR=1 + break; + case 2: //PORTRAIT_REV: 180 degrees + val = 0x98; //MY=1, MX=0, MV=0, ML=1, BGR=1 + break; + case 3: //LANDSCAPE_REV: 270 degrees + val = 0xF8; //MY=1, MX=1, MV=1, ML=1, BGR=1 + break; + } + if (_lcd_capable & INVERT_GS) + val ^= 0x80; + if (_lcd_capable & INVERT_SS) + val ^= 0x40; + if (_lcd_capable & INVERT_RGB) + val ^= 0x08; + if (_lcd_capable & MIPI_DCS_REV1) { + if (_lcd_ID == 0x6814) { //.kbv my weird 0x9486 might be 68140 + GS = (val & 0x80) ? (1 << 6) : 0; //MY + SS_v = (val & 0x40) ? (1 << 5) : 0; //MX + val &= 0x28; //keep MV, BGR, MY=0, MX=0, ML=0 + d[0] = 0; + d[1] = GS | SS_v | 0x02; //MY, MX + d[2] = 0x3B; + WriteCmdParamN(0xB6, 3, d); + goto common_MC; + } else if (_lcd_ID == 0x1963 || _lcd_ID == 0x9481 || _lcd_ID == 0x1511) { + if (val & 0x80) + val |= 0x01; //GS + if ((val & 0x40)) + val |= 0x02; //SS + if (_lcd_ID == 0x1963) val &= ~0xC0; + if (_lcd_ID == 0x9481) val &= ~0xD0; + if (_lcd_ID == 0x1511) { + val &= ~0x10; //remove ML + val |= 0xC0; //force penguin 180 rotation + } +// val &= (_lcd_ID == 0x1963) ? ~0xC0 : ~0xD0; //MY=0, MX=0 with ML=0 for ILI9481 + goto common_MC; + } else if (is8347) { + _MC = 0x02, _MP = 0x06, _MW = 0x22, _SC = 0x02, _EC = 0x04, _SP = 0x06, _EP = 0x08; + if (_lcd_ID == 0x0065) { //HX8352-B + val |= 0x01; //GS=1 + if ((val & 0x10)) val ^= 0xD3; //(ML) flip MY, MX, ML, SS, GS + if (r & 1) _MC = 0x82, _MP = 0x80; + else _MC = 0x80, _MP = 0x82; + } + if (_lcd_ID == 0x5252) { //HX8352-A + val |= 0x02; //VERT_SCROLLON + if ((val & 0x10)) val ^= 0xD4; //(ML) flip MY, MX, SS. GS=1 + } + goto common_BGR; + } + common_MC: + _MC = 0x2A, _MP = 0x2B, _MW = 0x2C, _SC = 0x2A, _EC = 0x2A, _SP = 0x2B, _EP = 0x2B; + common_BGR: + WriteCmdParamN(is8347 ? 0x16 : 0x36, 1, &val); + _lcd_madctl = val; +// if (_lcd_ID == 0x1963) WriteCmdParamN(0x13, 0, NULL); //NORMAL mode + } + // cope with 9320 variants + else { + switch (_lcd_ID) { +#if defined(SUPPORT_9225) + case 0x9225: + _SC = 0x37, _EC = 0x36, _SP = 0x39, _EP = 0x38; + _MC = 0x20, _MP = 0x21, _MW = 0x22; + GS = (val & 0x80) ? (1 << 9) : 0; + SS_v = (val & 0x40) ? (1 << 8) : 0; + WriteCmdData(0x01, GS | SS_v | 0x001C); // set Driver Output Control + goto common_ORG; +#endif +#if defined(SUPPORT_0139) || defined(SUPPORT_0154) +#ifdef SUPPORT_0139 + case 0x0139: + _SC = 0x46, _EC = 0x46, _SP = 0x48, _EP = 0x47; + goto common_S6D; +#endif +#ifdef SUPPORT_0154 + case 0x0154: + _SC = 0x37, _EC = 0x36, _SP = 0x39, _EP = 0x38; + goto common_S6D; +#endif + common_S6D: + _MC = 0x20, _MP = 0x21, _MW = 0x22; + GS = (val & 0x80) ? (1 << 9) : 0; + SS_v = (val & 0x40) ? (1 << 8) : 0; + // S6D0139 requires NL = 0x27, S6D0154 NL = 0x28 + WriteCmdData(0x01, GS | SS_v | ((_lcd_ID == 0x0139) ? 0x27 : 0x28)); + goto common_ORG; +#endif + case 0x5420: + case 0x7793: + case 0x9326: + case 0xB509: + _MC = 0x200, _MP = 0x201, _MW = 0x202, _SC = 0x210, _EC = 0x211, _SP = 0x212, _EP = 0x213; + GS = (val & 0x80) ? (1 << 15) : 0; + uint16_t NL; + NL = ((432 / 8) - 1) << 9; + if (_lcd_ID == 0x9326 || _lcd_ID == 0x5420) NL >>= 1; + WriteCmdData(0x400, GS | NL); + goto common_SS; + default: + _MC = 0x20, _MP = 0x21, _MW = 0x22, _SC = 0x50, _EC = 0x51, _SP = 0x52, _EP = 0x53; + GS = (val & 0x80) ? (1 << 15) : 0; + WriteCmdData(0x60, GS | 0x2700); // Gate Scan Line (0xA700) + common_SS: + SS_v = (val & 0x40) ? (1 << 8) : 0; + WriteCmdData(0x01, SS_v); // set Driver Output Control + common_ORG: + ORG = (val & 0x20) ? (1 << 3) : 0; +#ifdef SUPPORT_8230 + if (_lcd_ID == 0x8230) { // UC8230 has strange BGR and READ_BGR behaviour + if (rotation == 1 || rotation == 2) { + val ^= 0x08; // change BGR bit for LANDSCAPE and PORTRAIT_REV + } + } +#endif + if (val & 0x08) + ORG |= 0x1000; //BGR + _lcd_madctl = ORG | 0x0030; + WriteCmdData(0x03, _lcd_madctl); // set GRAM write direction and BGR=1. + break; +#ifdef SUPPORT_1289 + case 0x1289: + _MC = 0x4E, _MP = 0x4F, _MW = 0x22, _SC = 0x44, _EC = 0x44, _SP = 0x45, _EP = 0x46; + if (rotation & 1) + val ^= 0xD0; // exchange Landscape modes + GS = (val & 0x80) ? (1 << 14) : 0; //called TB (top-bottom), CAD=0 + SS_v = (val & 0x40) ? (1 << 9) : 0; //called RL (right-left) + ORG = (val & 0x20) ? (1 << 3) : 0; //called AM + _lcd_drivOut = GS | SS_v | (REV << 13) | 0x013F; //REV=0, BGR=0, MUX=319 + if (val & 0x08) + _lcd_drivOut |= 0x0800; //BGR + WriteCmdData(0x01, _lcd_drivOut); // set Driver Output Control + if (is9797) WriteCmdData(0x11, ORG | 0x4C30); else // DFM=2, DEN=1, WM=1, TY=0 + WriteCmdData(0x11, ORG | 0x6070); // DFM=3, EN=0, TY=1 + break; +#endif + } + } + if ((rotation & 1) && ((_lcd_capable & MV_AXIS) == 0)) { + uint16_t x; + x = _MC, _MC = _MP, _MP = x; + x = _SC, _SC = _SP, _SP = x; //.kbv check 0139 + x = _EC, _EC = _EP, _EP = x; //.kbv check 0139 + } + setAddrWindow(0, 0, width() - 1, height() - 1); + vertScroll(0, HEIGHT, 0); //reset scrolling after a rotation +} + +void MCUFRIEND_kbv::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + // MCUFRIEND just plots at edge if you try to write outside of the box: + if (x < 0 || y < 0 || x >= width() || y >= height()) + return; +#if defined(SUPPORT_9488_555) + if (is555) color = color565_to_555(color); +#endif + setAddrWindow(x, y, x, y); +// CS_ACTIVE; WriteCmd(_MW); write16(color); CS_IDLE; //-0.01s +98B + if (is9797) { CS_ACTIVE; WriteCmd(_MW); write24(color); CS_IDLE;} else + WriteCmdData(_MW, color); +} + +void MCUFRIEND_kbv::setAddrWindow(int16_t x, int16_t y, int16_t x1, int16_t y1) +{ +#if defined(OFFSET_9327) + if (_lcd_ID == 0x9327) { + if (rotation == 2) y += OFFSET_9327, y1 += OFFSET_9327; + if (rotation == 3) x += OFFSET_9327, x1 += OFFSET_9327; + } +#endif +#if 1 + if (_lcd_ID == 0x1526 && (rotation & 1)) { + int16_t dx = x1 - x, dy = y1 - y; + if (dy == 0) { y1++; } + else if (dx == 0) { x1 += dy; y1 -= dy; } + } +#endif + if (_lcd_capable & MIPI_DCS_REV1) { + WriteCmdParam4(_SC, x >> 8, x, x1 >> 8, x1); //Start column instead of _MC + WriteCmdParam4(_SP, y >> 8, y, y1 >> 8, y1); // + if (is8347 && _lcd_ID == 0x0065) { //HX8352-B has separate _MC, _SC + uint8_t d[2]; + d[0] = x >> 8; d[1] = x; + WriteCmdParamN(_MC, 2, d); //allows !MV_AXIS to work + d[0] = y >> 8; d[1] = y; + WriteCmdParamN(_MP, 2, d); + } + } else { + WriteCmdData(_MC, x); + WriteCmdData(_MP, y); + if (!(x == x1 && y == y1)) { //only need MC,MP for drawPixel + if (_lcd_capable & XSA_XEA_16BIT) { + if (rotation & 1) + y1 = y = (y1 << 8) | y; + else + x1 = x = (x1 << 8) | x; + } + WriteCmdData(_SC, x); + WriteCmdData(_SP, y); + WriteCmdData(_EC, x1); + WriteCmdData(_EP, y1); + } + } +} + +void MCUFRIEND_kbv::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) +{ + int16_t end; +#if defined(SUPPORT_9488_555) + if (is555) color = color565_to_555(color); +#endif + if (w < 0) { + w = -w; + x -= w; + } //+ve w + end = x + w; + if (x < 0) + x = 0; + if (end > width()) + end = width(); + w = end - x; + if (h < 0) { + h = -h; + y -= h; + } //+ve h + end = y + h; + if (y < 0) + y = 0; + if (end > height()) + end = height(); + h = end - y; + setAddrWindow(x, y, x + w - 1, y + h - 1); + CS_ACTIVE; + WriteCmd(_MW); + if (h > w) { + end = h; + h = w; + w = end; + } + uint8_t hi = color >> 8, lo = color & 0xFF; + while (h-- > 0) { + end = w; +#if USING_16BIT_BUS +#if defined(__MK66FX1M0__) //180MHz M4 +#define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE;WR_IDLE4;WR_IDLE;} //56ns +#elif defined(__SAM3X8E__) //84MHz M3 +#define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE2;WR_IDLE4;WR_IDLE2;} //286ns ?ILI9486 +//#define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE;WR_IDLE4;WR_IDLE;} //238ns SSD1289 +//#define STROBE_16BIT {WR_ACTIVE2;WR_ACTIVE;WR_IDLE2;} //119ns RM68140 +#else //16MHz AVR +#define STROBE_16BIT {WR_ACTIVE;WR_ACTIVE;WR_IDLE; } //375ns ?ILI9486 +#endif + write_16(color); //we could just do the strobe + lo = end & 7; + hi = end >> 3; + if (hi) + do { + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + STROBE_16BIT; + } while (--hi > 0); + while (lo-- > 0) { + STROBE_16BIT; + } +#else +#if defined(SUPPORT_1289) + if (is9797) { + uint8_t r = color565_to_r(color); + uint8_t g = color565_to_g(color); + uint8_t b = color565_to_b(color); + do { + write8(r); + write8(g); + write8(b); + } while (--end != 0); + } else +#endif + do { + write8(hi); + write8(lo); + } while (--end != 0); +#endif + } + CS_IDLE; + if (!(_lcd_capable & MIPI_DCS_REV1) || ((_lcd_ID == 0x1526) && (rotation & 1))) + setAddrWindow(0, 0, width() - 1, height() - 1); +} + +static void pushColors_any(uint16_t cmd, uint8_t * block, int16_t n, bool first, uint8_t flags) +{ + uint16_t color; + uint8_t h, l; + bool isconst = flags & 1; + bool isbigend = (flags & 2) != 0; + CS_ACTIVE; + if (first) { + WriteCmd(cmd); + } + + if (!isconst && !isbigend) { + uint16_t *block16 = (uint16_t*)block; + while (n-- > 0) { + color = *block16++; + write16(color); + } + } else + + while (n-- > 0) { + if (isconst) { + h = pgm_read_byte(block++); + l = pgm_read_byte(block++); + } else { + h = (*block++); + l = (*block++); + } + color = (isbigend) ? (h << 8 | l) : (l << 8 | h); +#if defined(SUPPORT_9488_555) + if (is555) color = color565_to_555(color); +#endif + if (is9797) write24(color); else + write16(color); + } + CS_IDLE; +} + +void MCUFRIEND_kbv::pushColors(uint16_t * block, int16_t n, bool first) +{ + pushColors_any(_MW, (uint8_t *)block, n, first, 0); +} +void MCUFRIEND_kbv::pushColors(uint8_t * block, int16_t n, bool first) +{ + pushColors_any(_MW, (uint8_t *)block, n, first, 2); //regular bigend +} +void MCUFRIEND_kbv::pushColors(const uint8_t * block, int16_t n, bool first, bool bigend) +{ + pushColors_any(_MW, (uint8_t *)block, n, first, bigend ? 3 : 1); +} + +void MCUFRIEND_kbv::vertScroll(int16_t top, int16_t scrollines, int16_t offset) +{ +#if defined(OFFSET_9327) + if (_lcd_ID == 0x9327) { + if (rotation == 2 || rotation == 3) top += OFFSET_9327; + } +#endif + int16_t bfa = HEIGHT - top - scrollines; // bottom fixed area + int16_t vsp; + int16_t sea = top; + if (_lcd_ID == 0x9327) bfa += 32; + if (offset <= -scrollines || offset >= scrollines) offset = 0; //valid scroll + vsp = top + offset; // vertical start position + if (offset < 0) + vsp += scrollines; //keep in unsigned range + sea = top + scrollines - 1; + if (_lcd_capable & MIPI_DCS_REV1) { + uint8_t d[6]; // for multi-byte parameters +/* + if (_lcd_ID == 0x9327) { //panel is wired for 240x432 + if (rotation == 2 || rotation == 3) { //180 or 270 degrees + if (scrollines == HEIGHT) { + scrollines = 432; // we get a glitch but hey-ho + vsp -= 432 - HEIGHT; + } + if (vsp < 0) + vsp += 432; + } + bfa = 432 - top - scrollines; + } +*/ + d[0] = top >> 8; //TFA + d[1] = top; + d[2] = scrollines >> 8; //VSA + d[3] = scrollines; + d[4] = bfa >> 8; //BFA + d[5] = bfa; + WriteCmdParamN(is8347 ? 0x0E : 0x33, 6, d); +// if (offset == 0 && rotation > 1) vsp = top + scrollines; //make non-valid + d[0] = vsp >> 8; //VSP + d[1] = vsp; + WriteCmdParamN(is8347 ? 0x14 : 0x37, 2, d); + if (is8347) { + d[0] = (offset != 0) ? (_lcd_ID == 0x8347 ? 0x02 : 0x08) : 0; + WriteCmdParamN(_lcd_ID == 0x8347 ? 0x18 : 0x01, 1, d); //HX8347-D + } else if (offset == 0 && (_lcd_capable & MIPI_DCS_REV1)) { + WriteCmdParamN(0x13, 0, NULL); //NORMAL i.e. disable scroll + } + return; + } + // cope with 9320 style variants: + switch (_lcd_ID) { + case 0x7783: + WriteCmdData(0x61, _lcd_rev); //!NDL, !VLE, REV + WriteCmdData(0x6A, vsp); //VL# + break; +#ifdef SUPPORT_0139 + case 0x0139: + WriteCmdData(0x07, 0x0213 | (_lcd_rev << 2)); //VLE1=1, GON=1, REV=x, D=3 + WriteCmdData(0x41, vsp); //VL# check vsp + break; +#endif +#if defined(SUPPORT_0154) || defined(SUPPORT_9225) //thanks tongbajiel + case 0x9225: + case 0x0154: + WriteCmdData(0x31, sea); //SEA + WriteCmdData(0x32, top); //SSA + WriteCmdData(0x33, vsp - top); //SST + break; +#endif +#ifdef SUPPORT_1289 + case 0x1289: + WriteCmdData(0x41, vsp); //VL# + break; +#endif + case 0x5420: + case 0x7793: + case 0x9326: + case 0xB509: + WriteCmdData(0x401, (1 << 1) | _lcd_rev); //VLE, REV + WriteCmdData(0x404, vsp); //VL# + break; + default: + // 0x6809, 0x9320, 0x9325, 0x9335, 0xB505 can only scroll whole screen + WriteCmdData(0x61, (1 << 1) | _lcd_rev); //!NDL, VLE, REV + WriteCmdData(0x6A, vsp); //VL# + break; + } +} + +void MCUFRIEND_kbv::invertDisplay(boolean i) +{ + uint8_t val; + _lcd_rev = ((_lcd_capable & REV_SCREEN) != 0) ^ i; + if (_lcd_capable & MIPI_DCS_REV1) { + if (is8347) { + // HX8347D: 0x36 Panel Characteristic. REV_Panel + // HX8347A: 0x36 is Display Control 10 + if (_lcd_ID == 0x8347 || _lcd_ID == 0x5252) // HX8347-A, HX5352-A + val = _lcd_rev ? 6 : 2; //INVON id bit#2, NORON=bit#1 + else val = _lcd_rev ? 8 : 10; //HX8347-D, G, I: SCROLLON=bit3, INVON=bit1 + // HX8347: 0x01 Display Mode has diff bit mapping for A, D + WriteCmdParamN(0x01, 1, &val); + } else + WriteCmdParamN(_lcd_rev ? 0x21 : 0x20, 0, NULL); + return; + } + // cope with 9320 style variants: + switch (_lcd_ID) { +#ifdef SUPPORT_0139 + case 0x0139: +#endif + case 0x9225: //REV is in reg(0x07) like Samsung + case 0x0154: + WriteCmdData(0x07, 0x13 | (_lcd_rev << 2)); //.kbv kludge + break; +#ifdef SUPPORT_1289 + case 0x1289: + _lcd_drivOut &= ~(1 << 13); + if (_lcd_rev) + _lcd_drivOut |= (1 << 13); + WriteCmdData(0x01, _lcd_drivOut); + break; +#endif + case 0x5420: + case 0x7793: + case 0x9326: + case 0xB509: + WriteCmdData(0x401, (1 << 1) | _lcd_rev); //.kbv kludge VLE + break; + default: + WriteCmdData(0x61, _lcd_rev); + break; + } +} + +#define TFTLCD_DELAY 0xFFFF +#define TFTLCD_DELAY8 0x7F +static void init_table(const void *table, int16_t size) +{ +#ifdef SUPPORT_8357D_GAMMA + uint8_t *p = (uint8_t *) table, dat[36]; //HX8357_99 has GAMMA[34] +#else + uint8_t *p = (uint8_t *) table, dat[24]; //R61526 has GAMMA[22] +#endif + while (size > 0) { + uint8_t cmd = pgm_read_byte(p++); + uint8_t len = pgm_read_byte(p++); + if (cmd == TFTLCD_DELAY8) { + delay(len); + len = 0; + } else { + for (uint8_t i = 0; i < len; i++) + dat[i] = pgm_read_byte(p++); + WriteCmdParamN(cmd, len, dat); + } + size -= len + 2; + } +} + +static void init_table16(const void *table, int16_t size) +{ + uint16_t *p = (uint16_t *) table; + while (size > 0) { + uint16_t cmd = pgm_read_word(p++); + uint16_t d = pgm_read_word(p++); + if (cmd == TFTLCD_DELAY) + delay(d); + else { + writecmddata(cmd, d); //static function + } + size -= 2 * sizeof(int16_t); + } +} + +void MCUFRIEND_kbv::begin(uint16_t ID) +{ + int16_t *p16; //so we can "write" to a const protected variable. + const uint8_t *table8_ads = NULL; + int16_t table_size; + reset(); + _lcd_xor = 0; + switch (_lcd_ID = ID) { +/* + static const uint16_t _regValues[] PROGMEM = { + 0x0000, 0x0001, // start oscillation + 0x0007, 0x0000, // source output control 0 D0 + 0x0013, 0x0000, // power control 3 off + 0x0011, 0x2604, // + 0x0014, 0x0015, // + 0x0010, 0x3C00, // + // 0x0013, 0x0040, // + // 0x0013, 0x0060, // + // 0x0013, 0x0070, // + 0x0013, 0x0070, // power control 3 PON PON1 AON + + 0x0001, 0x0127, // driver output control + // 0x0002, 0x0700, // field 0 b/c waveform xor waveform + 0x0003, 0x1030, // + 0x0007, 0x0000, // + 0x0008, 0x0404, // + 0x000B, 0x0200, // + 0x000C, 0x0000, // + 0x00015,0x0000, // + + //gamma setting + 0x0030, 0x0000, + 0x0031, 0x0606, + 0x0032, 0x0006, + 0x0033, 0x0403, + 0x0034, 0x0107, + 0x0035, 0x0101, + 0x0036, 0x0707, + 0x0037, 0x0304, + 0x0038, 0x0A00, + 0x0039, 0x0706, + + 0x0040, 0x0000, + 0x0041, 0x0000, + 0x0042, 0x013F, + 0x0043, 0x0000, + 0x0044, 0x0000, + 0x0045, 0x0000, + 0x0046, 0xEF00, + 0x0047, 0x013F, + 0x0048, 0x0000, + 0x0007, 0x0011, + 0x0007, 0x0017, +}; +*/ +#ifdef SUPPORT_0139 + case 0x0139: + _lcd_capable = REV_SCREEN | XSA_XEA_16BIT; //remove AUTO_READINC + static const uint16_t S6D0139_regValues[] PROGMEM = { + 0x0000, 0x0001, //Start oscillator + 0x0011, 0x1a00, //Power Control 2 + 0x0014, 0x2020, //Power Control 4 + 0x0010, 0x0900, //Power Control 1 + 0x0013, 0x0040, //Power Control 3 + 0x0013, 0x0060, //Power Control 3 + 0x0013, 0x0070, //Power Control 3 + 0x0011, 0x1a04, //Power Control 2 + 0x0010, 0x2f00, //Power Control 1 + 0x0001, 0x0127, //Driver Control: SM=0, GS=0, SS=1, 240x320 + 0x0002, 0x0100, //LCD Control: (.kbv was 0700) FLD=0, BC= 0, EOR=1 + 0x0003, 0x1030, //Entry Mode: TR1=0, DFM=0, BGR=1, I_D=3 + 0x0007, 0x0000, //Display Control: everything off + 0x0008, 0x0303, //Blank Period: FP=3, BP=3 + 0x0009, 0x0000, //f.k. + 0x000b, 0x0000, //Frame Control: + 0x000c, 0x0000, //Interface Control: system i/f + 0x0040, 0x0000, //Scan Line + 0x0041, 0x0000, //Vertical Scroll Control + 0x0007, 0x0014, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=0 (halt) + 0x0007, 0x0016, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=2 (blank) + 0x0007, 0x0017, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=3 (normal) +// 0x0007, 0x0217, //Display Control: VLE1=1, SPT=0, GON=1, REV=1, D=3 + }; + init_table16(S6D0139_regValues, sizeof(S6D0139_regValues)); + break; +#endif + +#ifdef SUPPORT_0154 + case 0x0154: + _lcd_capable = AUTO_READINC | REV_SCREEN; + static const uint16_t S6D0154_regValues[] PROGMEM = { + 0x0011, 0x001A, + 0x0012, 0x3121, //BT=3, DC1=1, DC2=2, DC3=1 + 0x0013, 0x006C, //GVD=108 + 0x0014, 0x4249, //VCM=66, VML=73 + + 0x0010, 0x0800, //SAP=8 + TFTLCD_DELAY, 10, + 0x0011, 0x011A, //APON=0, PON=1, AON=0, VCI1_EN=1, VC=10 + TFTLCD_DELAY, 10, + 0x0011, 0x031A, //APON=0, PON=3, AON=0, VCI1_EN=1, VC=10 + TFTLCD_DELAY, 10, + 0x0011, 0x071A, //APON=0, PON=7, AON=0, VCI1_EN=1, VC=10 + TFTLCD_DELAY, 10, + 0x0011, 0x0F1A, //APON=0, PON=15, AON=0, VCI1_EN=1, VC=10 + TFTLCD_DELAY, 10, + 0x0011, 0x0F3A, //APON=0, PON=15, AON=1, VCI1_EN=1, VC=10 + TFTLCD_DELAY, 30, + + 0x0001, 0x0128, + 0x0002, 0x0100, + 0x0003, 0x1030, + 0x0007, 0x1012, + 0x0008, 0x0303, + 0x000B, 0x1100, + 0x000C, 0x0000, + 0x000F, 0x1801, + 0x0015, 0x0020, + + 0x0050,0x0101, + 0x0051,0x0603, + 0x0052,0x0408, + 0x0053,0x0000, + 0x0054,0x0605, + 0x0055,0x0406, + 0x0056,0x0303, + 0x0057,0x0303, + 0x0058,0x0010, + 0x0059,0x1000, + + 0x0007, 0x0012, //GON=1, REV=0, D=2 + TFTLCD_DELAY, 40, + 0x0007, 0x0013, //GON=1, REV=0, D=3 + 0x0007, 0x0017, //GON=1, REV=1, D=3 DISPLAY ON + }; + init_table16(S6D0154_regValues, sizeof(S6D0154_regValues)); + + break; +#endif + +#ifdef SUPPORT_1289 + case 0x9797: + is9797 = 1; +// _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC | READ_24BITS; +// deliberately set READ_BGR to disable Software Scroll in graphictest_kbv example + _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC | READ_24BITS | READ_BGR; + _lcd_ID = 0x1289; + goto common_1289; + case 0x1289: + _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC; + common_1289: + // came from MikroElektronika library http://www.hmsprojects.com/tft_lcd.html + static const uint16_t SSD1289_regValues[] PROGMEM = { + 0x0000, 0x0001, + 0x0003, 0xA8A4, + 0x000C, 0x0000, + 0x000D, 0x000A, // VRH=10 + 0x000E, 0x2B00, + 0x001E, 0x00B7, + 0x0001, 0x2B3F, // setRotation() alters + 0x0002, 0x0600, // B_C=1, EOR=1 + 0x0010, 0x0000, + 0x0011, 0x6070, // setRotation() alters + 0x0005, 0x0000, + 0x0006, 0x0000, + 0x0016, 0xEF1C, + 0x0017, 0x0003, + 0x0007, 0x0233, + 0x000B, 0x0000, + 0x000F, 0x0000, + 0x0030, 0x0707, + 0x0031, 0x0204, + 0x0032, 0x0204, + 0x0033, 0x0502, + 0x0034, 0x0507, + 0x0035, 0x0204, + 0x0036, 0x0204, + 0x0037, 0x0502, + 0x003A, 0x0302, + 0x003B, 0x0302, + 0x0023, 0x0000, + 0x0024, 0x0000, + 0x0025, 0x8000, + }; + init_table16(SSD1289_regValues, sizeof(SSD1289_regValues)); + break; +#endif + + case 0x1511: // Unknown from Levy + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1; //extra read_8(dummy) + static const uint8_t R61511_regValues[] PROGMEM = { + 0xB0, 1, 0x00, //Command Access Protect + }; + table8_ads = R61511_regValues, table_size = sizeof(R61511_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + + case 0x1520: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + static const uint8_t R61520_regValues[] PROGMEM = { + 0xB0, 1, 0x00, //Command Access Protect + 0xC0, 1, 0x0A, //DM=1, BGR=1 + }; + table8_ads = R61520_regValues, table_size = sizeof(R61520_regValues); + break; + + case 0x1526: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + static const uint8_t R61526_regValues[] PROGMEM = { + 0xB0, 1, 0x03, //Command Access + 0xE2, 1, 0x3F, //Command Write Access + 0xC0, 1, 0x22, //REV=0, BGR=1, SS=0 + 0xE2, 1, 0x00, //Command Write Protect + }; + table8_ads = R61526_regValues, table_size = sizeof(R61526_regValues); + break; + +#ifdef SUPPORT_1580 + case 0x1580: + _lcd_capable = 0 | REV_SCREEN | READ_BGR | INVERT_GS | READ_NODUMMY; //thanks vanhan123 + static const uint16_t R61580_regValues[] PROGMEM = { //from MCHIP Graphics Lib drvTFT001.c + // Synchronization after reset + TFTLCD_DELAY, 2, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + + // Setup display + 0x00A4, 0x0001, // CALB=1 + TFTLCD_DELAY, 2, + 0x0060, 0xA700, // Driver Output Control + 0x0008, 0x0808, // Display Control BP=8, FP=8 + 0x0030, 0x0111, // y control + 0x0031, 0x2410, // y control + 0x0032, 0x0501, // y control + 0x0033, 0x050C, // y control + 0x0034, 0x2211, // y control + 0x0035, 0x0C05, // y control + 0x0036, 0x2105, // y control + 0x0037, 0x1004, // y control + 0x0038, 0x1101, // y control + 0x0039, 0x1122, // y control + 0x0090, 0x0019, // 80Hz + 0x0010, 0x0530, // Power Control + 0x0011, 0x0237, //DC1=2, DC0=3, VC=7 +// 0x0011, 0x17B0, //DC1=7, DC0=3, VC=0 ?b12 ?b7 vanhan123 + 0x0012, 0x01BF, //VCMR=1, PSON=1, PON=1, VRH=15 +// 0x0012, 0x013A, //VCMR=1, PSON=1, PON=1, VRH=10 vanhan123 + 0x0013, 0x1300, //VDV=19 + TFTLCD_DELAY, 100, + + 0x0001, 0x0100, + 0x0002, 0x0200, + 0x0003, 0x1030, + 0x0009, 0x0001, + 0x000A, 0x0008, + 0x000C, 0x0001, + 0x000D, 0xD000, + 0x000E, 0x0030, + 0x000F, 0x0000, + 0x0020, 0x0000, + 0x0021, 0x0000, + 0x0029, 0x0077, + 0x0050, 0x0000, + 0x0051, 0xD0EF, + 0x0052, 0x0000, + 0x0053, 0x013F, + 0x0061, 0x0001, + 0x006A, 0x0000, + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x005F, + 0x0093, 0x0701, + 0x0007, 0x0100, + }; + static const uint16_t R61580_DEM240320C[] PROGMEM = { //from DEM 240320C TMH-PW-N + 0x00, 0x0000, + 0x00, 0x0000, + TFTLCD_DELAY, 100, + 0x00, 0x0000, + 0x00, 0x0000, + 0x00, 0x0000, + 0x00, 0x0000, + 0xA4, 0x0001, + TFTLCD_DELAY, 100, + 0x60, 0xA700, + 0x08, 0x0808, + /******************************************/ + //Gamma Setting: + 0x30, 0x0203, + 0x31, 0x080F, + 0x32, 0x0401, + 0x33, 0x050B, + 0x34, 0x3330, + 0x35, 0x0B05, + 0x36, 0x0005, + 0x37, 0x0F08, + 0x38, 0x0302, + 0x39, 0x3033, + /******************************************/ + //Power Setting: + 0x90, 0x0018, //80Hz + 0x10, 0x0530, //BT,AP + 0x11, 0x0237, //DC1,DC0,VC + 0x12, 0x01BF, + 0x13, 0x1000, //VCOM + TFTLCD_DELAY, 200, + /******************************************/ + 0x01, 0x0100, + 0x02, 0x0200, + 0x03, 0x1030, + 0x09, 0x0001, + 0x0A, 0x0008, + 0x0C, 0x0000, + 0x0D, 0xD000, + + 0x0E, 0x0030, + 0x0F, 0x0000, + 0x20, 0x0000, //H Start + 0x21, 0x0000, //V Start + 0x29, 0x002E, + 0x50, 0x0000, + 0x51, 0x00EF, + 0x52, 0x0000, + 0x53, 0x013F, + 0x61, 0x0001, + 0x6A, 0x0000, + 0x80, 0x0000, + 0x81, 0x0000, + 0x82, 0x005F, + 0x93, 0x0701, + /******************************************/ + 0x07, 0x0100, + TFTLCD_DELAY, 100, + }; + init_table16(R61580_DEM240320C, sizeof(R61580_DEM240320C)); +// init_table16(R61580_regValues, sizeof(R61580_regValues)); + break; +#endif + +#if defined(SUPPORT_1963) && USING_16BIT_BUS + case 0x1963: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | READ_NODUMMY | INVERT_SS | INVERT_RGB; + // from NHD 5.0" 8-bit + static const uint8_t SSD1963_NHD_50_regValues[] PROGMEM = { + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // Lock PLL + (0xB0), 7, 0x08, 0x80, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xF0), 1, 0x03, //was 00 pixel data interface + // (0x3A), 1, 0x60, // SET R G B format = 6 6 6 + (0xE2), 3, 0x1D, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M + (0xE6), 3, 0x02, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB4), 8, 0x04, 0x20, 0x00, 0x58, 0x80, 0x00, 0x00, 0x00, //HSYNC + (0xB6), 7, 0x02, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x00, //VSYNC + (0x13), 0, //Enter Normal mode + (0x38), 0, //Exit Idle mode + }; + // from NHD 7.0" 8-bit + static const uint8_t SSD1963_NHD_70_regValues[] PROGMEM = { + (0xE2), 3, 0x1D, 0x02, 0x04, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // Lock PLL + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 120, + (0xB0), 7, 0x08, 0x80, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xF0), 1, 0x03, //was 00 pixel data interface + // (0x3A), 1, 0x60, // SET R G B format = 6 6 6 + (0xE6), 3, 0x0F, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB4), 8, 0x04, 0x20, 0x00, 0x58, 0x80, 0x00, 0x00, 0x00, //HSYNC + (0xB6), 7, 0x02, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x00, //VSYNC + (0x13), 0, //Enter Normal mode + (0x38), 0, //Exit Idle mode + }; + // from UTFTv2.81 initlcd.h + static const uint8_t SSD1963_800_regValues[] PROGMEM = { + (0xE2), 3, 0x1E, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x03, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + // (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x2D, //LCD SPECIFICATION + (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC + (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_800NEW_regValues[] PROGMEM = { + (0xE2), 3, 0x1E, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x03, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15 + (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8 + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_800ALT_regValues[] PROGMEM = { + (0xE2), 3, 0x23, 0x02, 0x04, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x04, 0x93, 0xE0, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x00, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15 + (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8 + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_480_regValues[] PROGMEM = { + (0xE2), 3, 0x23, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x01, 0x1F, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x20, 0x00, 0x01, 0xDF, 0x01, 0x0F, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x02, 0x13, 0x00, 0x08, 0x2B, 0x00, 0x02, 0x00, //HSYNC + (0xB6), 7, 0x01, 0x20, 0x00, 0x04, 0x0C, 0x00, 0x02, //VSYNC + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; +// table8_ads = SSD1963_480_regValues, table_size = sizeof(SSD1963_480_regValues); + table8_ads = SSD1963_800_regValues, table_size = sizeof(SSD1963_800_regValues); +// table8_ads = SSD1963_NHD_50_regValues, table_size = sizeof(SSD1963_NHD_50_regValues); +// table8_ads = SSD1963_NHD_70_regValues, table_size = sizeof(SSD1963_NHD_70_regValues); +// table8_ads = SSD1963_800NEW_regValues, table_size = sizeof(SSD1963_800NEW_regValues); +// table8_ads = SSD1963_800ALT_regValues, table_size = sizeof(SSD1963_800ALT_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 800; + break; +#endif + +#ifdef SUPPORT_4532 +//Support for LG Electronics LGDP4532 (also 4531 i guess) by Leodino v1.0 2-Nov-2016 +//based on data by waveshare and the datasheet of LG Electronics +//My approach to get it working: the parameters by waveshare did no make it function allright +//I started with remming lines to see if this helped. Basically the stuff in range 41-93 +//gives problems. +//The other lines that are REMmed give no problems, but it seems default values are OK as well. +case 0x4532: // thanks Leodino + _lcd_capable = 0 | REV_SCREEN; // | INVERT_GS; + static const uint16_t LGDP4532_regValues[] PROGMEM = { + 0x0000,0x0001, //Device code read + 0x0010,0x0628, //Power control 1 SAP[2:0] BT[3:0] AP[2:0] DK DSTB SLP + 0x0012,0x0006, //Power control 3 PON VRH[3:0] + //0x0013,0x0A32, //Power control 4 VCOMG VDV[4:0] VCM[6:0] + 0x0011,0x0040, //Power control 2; DC1[2:0] DC0[2:0] VC[2:0] + //0x0015,0x0050, //Regulator control RSET RI[2:0] RV[2:0] RCONT[2:0] + 0x0012,0x0016, //Power control 3 PON VRH[3:0] + TFTLCD_DELAY,50, + 0x0010,0x5660, //Power control 1 SAP[2:0] BT[3:0] AP[2:0] DK DSTB SLP + TFTLCD_DELAY,50, + //0x0013,0x2A4E, //Power control 4 VCOMG VDV[4:0] VCM[6:0] + //0x0001,0x0100, //Driver output control SM SS + //0x0002,0x0300, //LCD Driving Wave Control + //0x0003,0x1030, //Entry mode TRI DFM BGR ORG I/D[1:0] AM + //0x0007,0x0202, //Display Control 1 PTDE[1:0] BASEE GON DTE COL D[1:0] + TFTLCD_DELAY,50, + //0x0008,0x0202, //Display Control 2 FP[3:0] BP[3:0] front and back porch (blank period at begin and end..) + //0x000A,0x0000, //Test Register 1 (RA0h) + //Gamma adjustment + 0x0030,0x0000, + 0x0031,0x0402, + 0x0032,0x0106, + 0x0033,0x0700, + 0x0034,0x0104, + 0x0035,0x0301, + 0x0036,0x0707, + 0x0037,0x0305, + 0x0038,0x0208, + 0x0039,0x0F0B, + TFTLCD_DELAY,50, + //some of this stuff in range 41-93 really throws things off.... + //0x0041,0x0002, + //0x0060,0x2700, //Driver Output Control (R60h) + //0x0061,0x0001, //Base Image Display Control (R61h) + //0x0090,0x0119, //Panel Interface Control 1 (R90h) DIVI[1:0] RTNI[4:0] + //0x0092,0x010A, //Panel Interface Control 2 (R92h) NOWI[2:0] EQI2[1:0] EQI1[1:0] + //0x0093,0x0004, //Panel Interface Control 3 (R93h) MCPI[2:0] + //0x00A0,0x0100, //Test Register 1 (RA0h) + TFTLCD_DELAY,50, + 0x0007,0x0133, //Display Control 1 PTDE[1:0] BASEE GON DTE COL D[1:0] + TFTLCD_DELAY,50, + //0x00A0,0x0000, //Test Register 1 (RA0h) + }; + init_table16(LGDP4532_regValues, sizeof(LGDP4532_regValues)); + break; +#endif + +#ifdef SUPPORT_4535 + case 0x4535: + _lcd_capable = 0 | REV_SCREEN; // | INVERT_GS; + static const uint16_t LGDP4535_regValues[] PROGMEM = { + 0x0015, 0x0030, // Set the internal vcore voltage + 0x009A, 0x0010, // Start internal OSC + 0x0011, 0x0020, // set SS and SM bit + 0x0010, 0x3428, // set 1 line inversion + 0x0012, 0x0002, // set GRAM write direction and BGR=1 + 0x0013, 0x1038, // Resize register + TFTLCD_DELAY, 40, + 0x0012, 0x0012, // set the back porch and front porch + TFTLCD_DELAY, 40, + 0x0010, 0x3420, // set non-display area refresh cycle ISC[3:0] + 0x0013, 0x3045, // FMARK function + TFTLCD_DELAY, 70, + 0x0030, 0x0000, // RGB interface setting + 0x0031, 0x0402, // Frame marker Position + 0x0032, 0x0307, // RGB interface polarity + 0x0033, 0x0304, // SAP, BT[3:0], AP, DSTB, SLP, STB + 0x0034, 0x0004, // DC1[2:0], DC0[2:0], VC[2:0] + 0x0035, 0x0401, // VREG1OUT voltage + 0x0036, 0x0707, // VDV[4:0] for VCOM amplitude + 0x0037, 0x0305, // SAP, BT[3:0], AP, DSTB, SLP, STB + 0x0038, 0x0610, // DC1[2:0], DC0[2:0], VC[2:0] + 0x0039, 0x0610, // VREG1OUT voltage + 0x0001, 0x0100, // VDV[4:0] for VCOM amplitude + 0x0002, 0x0300, // VCM[4:0] for VCOMH + 0x0003, 0x1030, // GRAM horizontal Address + 0x0008, 0x0808, // GRAM Vertical Address + 0x000A, 0x0008, + 0x0060, 0x2700, // Gate Scan Line + 0x0061, 0x0001, // NDL,VLE, REV + 0x0090, 0x013E, + 0x0092, 0x0100, + 0x0093, 0x0100, + 0x00A0, 0x3000, + 0x00A3, 0x0010, + 0x0007, 0x0001, + 0x0007, 0x0021, + 0x0007, 0x0023, + 0x0007, 0x0033, + 0x0007, 0x0133, + }; + init_table16(LGDP4535_regValues, sizeof(LGDP4535_regValues)); + break; +#endif + + case 0x5310: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | INVERT_RGB | READ_24BITS; + static const uint8_t NT35310_regValues[] PROGMEM = { // + TFTLCD_DELAY8, 10, //just some dummy + }; + table8_ads = NT35310_regValues, table_size = sizeof(NT35310_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + +#ifdef SUPPORT_68140 + case 0x6814: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; + static const uint8_t RM68140_regValues_max[] PROGMEM = { // + 0x3A, 1, 0x55, //Pixel format .kbv my Mega Shield + }; + table8_ads = RM68140_regValues_max, table_size = sizeof(RM68140_regValues_max); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; +#endif + +#ifdef SUPPORT_7735 + case 0x7735: // + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS; + static const uint8_t PROGMEM table7735S[] = { + // (COMMAND_BYTE), n, data_bytes.... + 0xB1, 3, 0x01, 0x2C, 0x2D, // [05 3C 3C] FRMCTR1 if GM==11 + 0xB2, 3, 0x01, 0x2C, 0x2D, // [05 3C 3C] + 0xB3, 6, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, // [05 3C 3C 05 3C 3C] + 0xB4, 1, 0x07, // [07] INVCTR Column inversion + //ST7735XR Power Sequence + 0xC0, 3, 0xA2, 0x02, 0x84, // [A8 08 84] PWCTR1 + 0xC1, 1, 0xC5, // [C0] + 0xC2, 2, 0x0A, 0x00, // [0A 00] + 0xC3, 2, 0x8A, 0x2A, // [8A 26] + 0xC4, 2, 0x8A, 0xEE, // [8A EE] + 0xC5, 1, 0x0E, // [05] VMCTR1 VCOM + }; + table8_ads = table7735S, table_size = sizeof(table7735S); // + p16 = (int16_t *) & HEIGHT; + *p16 = 160; + p16 = (int16_t *) & WIDTH; + *p16 = 128; + break; +#endif + +#ifdef SUPPORT_7781 + case 0x7783: + _lcd_capable = AUTO_READINC | REV_SCREEN | INVERT_GS; + static const uint16_t ST7781_regValues[] PROGMEM = { + 0x00FF, 0x0001, //can we do 0xFF + 0x00F3, 0x0008, + // LCD_Write_COM(0x00F3, + + 0x00, 0x0001, + 0x0001, 0x0100, // Driver Output Control Register (R01h) + 0x0002, 0x0700, // LCD Driving Waveform Control (R02h) + 0x0003, 0x1030, // Entry Mode (R03h) + 0x0008, 0x0302, + 0x0009, 0x0000, + 0x0010, 0x0000, // Power Control 1 (R10h) + 0x0011, 0x0007, // Power Control 2 (R11h) + 0x0012, 0x0000, // Power Control 3 (R12h) + 0x0013, 0x0000, // Power Control 4 (R13h) + TFTLCD_DELAY, 50, + 0x0010, 0x14B0, // Power Control 1 SAP=1, BT=4, APE=1, AP=3 + TFTLCD_DELAY, 10, + 0x0011, 0x0007, // Power Control 2 VC=7 + TFTLCD_DELAY, 10, + 0x0012, 0x008E, // Power Control 3 VCIRE=1, VRH=14 + 0x0013, 0x0C00, // Power Control 4 VDV=12 + 0x0029, 0x0015, // NVM read data 2 VCM=21 + TFTLCD_DELAY, 10, + 0x0030, 0x0000, // Gamma Control 1 + 0x0031, 0x0107, // Gamma Control 2 + 0x0032, 0x0000, // Gamma Control 3 + 0x0035, 0x0203, // Gamma Control 6 + 0x0036, 0x0402, // Gamma Control 7 + 0x0037, 0x0000, // Gamma Control 8 + 0x0038, 0x0207, // Gamma Control 9 + 0x0039, 0x0000, // Gamma Control 10 + 0x003C, 0x0203, // Gamma Control 13 + 0x003D, 0x0403, // Gamma Control 14 + 0x0060, 0xA700, // Driver Output Control (R60h) .kbv was 0xa700 + 0x0061, 0x0001, // Driver Output Control (R61h) + 0x0090, 0X0029, // Panel Interface Control 1 (R90h) + + // Display On + 0x0007, 0x0133, // Display Control (R07h) + TFTLCD_DELAY, 50, + }; + init_table16(ST7781_regValues, sizeof(ST7781_regValues)); + break; +#endif + + case 0x7789: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + static const uint8_t ST7789_regValues[] PROGMEM = { + (0xB2), 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, //PORCTRK: Porch setting [08 08 00 22 22] PSEN=0 anyway + (0xB7), 1, 0x35, //GCTRL: Gate Control [35] + (0xBB), 1, 0x2B, //VCOMS: VCOM setting VCOM=1.175 [20] VCOM=0.9 + (0xC0), 1, 0x04, //LCMCTRL: LCM Control [2C] + (0xC2), 2, 0x01, 0xFF, //VDVVRHEN: VDV and VRH Command Enable [01 FF] + (0xC3), 1, 0x11, //VRHS: VRH Set VAP=4.4, VAN=-4.4 [0B] + (0xC4), 1, 0x20, //VDVS: VDV Set [20] + (0xC6), 1, 0x0F, //FRCTRL2: Frame Rate control in normal mode [0F] + (0xD0), 2, 0xA4, 0xA1, //PWCTRL1: Power Control 1 [A4 A1] + (0xE0), 14, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19, //PVGAMCTRL: Positive Voltage Gamma control + (0xE1), 14, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19, //NVGAMCTRL: Negative Voltage Gamma control + }; + static const uint8_t ST7789_regValues_arcain6[] PROGMEM = { + (0xB2), 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, //PORCTRK: Porch setting [08 08 00 22 22] PSEN=0 anyway + (0xB7), 1, 0x35, //GCTRL: Gate Control [35] + (0xBB), 1, 0x35, //VCOMS: VCOM setting VCOM=??? [20] VCOM=0.9 + (0xC0), 1, 0x2C, //LCMCTRL: LCM Control [2C] + (0xC2), 2, 0x01, 0xFF, //VDVVRHEN: VDV and VRH Command Enable [01 FF] + (0xC3), 1, 0x13, //VRHS: VRH Set VAP=???, VAN=-??? [0B] + (0xC4), 1, 0x20, //VDVS: VDV Set [20] + (0xC6), 1, 0x0F, //FRCTRL2: Frame Rate control in normal mode [0F] + (0xCA), 1, 0x0F, //REGSEL2 [0F] + (0xC8), 1, 0x08, //REGSEL1 [08] + (0x55), 1, 0x90, //WRCACE [00] + (0xD0), 2, 0xA4, 0xA1, //PWCTRL1: Power Control 1 [A4 A1] + (0xE0), 14, 0xD0, 0x00, 0x06, 0x09, 0x0B, 0x2A, 0x3C, 0x55, 0x4B, 0x08, 0x16, 0x14, 0x19, 0x20, //PVGAMCTRL: Positive Voltage Gamma control + (0xE1), 14, 0xD0, 0x00, 0x06, 0x09, 0x0B, 0x29, 0x36, 0x54, 0x4B, 0x0D, 0x16, 0x14, 0x21, 0x20, //NVGAMCTRL: Negative Voltage Gamma control + }; + table8_ads = ST7789_regValues, table_size = sizeof(ST7789_regValues); // + break; + + case 0x8031: //Unknown BangGood thanks PrinceCharles + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; + static const uint8_t FK8031_regValues[] PROGMEM = { + // 0xF2:8.2 = SM, 0xF2:8.0 = REV. invertDisplay(), vertScroll() do not work + 0xF2,11, 0x16, 0x16, 0x03, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0x16, 0x16, // f.k. 0xF2:8.2 SM=1 + 0xFD, 3, 0x11, 0x02, 0x35, //f.k 0xFD:1.1 creates contiguous scan lins + }; + table8_ads = FK8031_regValues, table_size = sizeof(FK8031_regValues); + break; + +#ifdef SUPPORT_8347D + case 0x4747: //HX8347-D + _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | AUTO_READINC | READ_24BITS; + goto common_8347DGI; + case 0x6767: //HX8367-A + case 0x7575: //HX8347-G + case 0x9595: //HX8347-I + _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS; + common_8347DGI: + is8347 = 1; + static const uint8_t HX8347G_2_regValues[] PROGMEM = { + 0xEA, 2, 0x00, 0x20, //PTBA[15:0] + 0xEC, 2, 0x0C, 0xC4, //STBA[15:0] + 0xE8, 1, 0x38, //OPON[7:0] + 0xE9, 1, 0x10, //OPON1[7:0] + 0xF1, 1, 0x01, //OTPS1B + 0xF2, 1, 0x10, //GEN + //Gamma 2.2 Setting + 0x40, 13, 0x01, 0x00, 0x00, 0x10, 0x0E, 0x24, 0x04, 0x50, 0x02, 0x13, 0x19, 0x19, 0x16, + 0x50, 14, 0x1B, 0x31, 0x2F, 0x3F, 0x3F, 0x3E, 0x2F, 0x7B, 0x09, 0x06, 0x06, 0x0C, 0x1D, 0xCC, + //Power Voltage Setting + 0x1B, 1, 0x1B, //VRH=4.65V + 0x1A, 1, 0x01, //BT (VGH~15V,VGL~-10V,DDVDH~5V) + 0x24, 1, 0x2F, //VMH(VCOM High voltage ~3.2V) + 0x25, 1, 0x57, //VML(VCOM Low voltage -1.2V) + //****VCOM offset**/// + 0x23, 1, 0x88, //for Flicker adjust //can reload from OTP + //Power on Setting + 0x18, 1, 0x34, //I/P_RADJ,N/P_RADJ, Normal mode 60Hz + 0x19, 1, 0x01, //OSC_EN='1', start Osc + 0x01, 1, 0x00, //DP_STB='0', out deep sleep + 0x1F, 1, 0x88, // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 + TFTLCD_DELAY8, 5, + 0x1F, 1, 0x80, // GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 + TFTLCD_DELAY8, 3, + 0x1F, 1, 0x90, // GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 + TFTLCD_DELAY8, 5, + 0x1F, 1, 0xD0, // GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 + TFTLCD_DELAY8, 5, + //262k/65k color selection + 0x17, 1, 0x05, //default 0x06 262k color // 0x05 65k color + //SET PANEL + 0x36, 1, 0x00, //SS_P, GS_P,REV_P,BGR_P + //Display ON Setting + 0x28, 1, 0x38, //GON=1, DTE=1, D=1000 + TFTLCD_DELAY8, 40, + 0x28, 1, 0x3F, //GON=1, DTE=1, D=1100 + + 0x16, 1, 0x18, + }; + init_table(HX8347G_2_regValues, sizeof(HX8347G_2_regValues)); + break; +#endif + +#ifdef SUPPORT_8352A + case 0x5252: //HX8352-A + _lcd_capable = MIPI_DCS_REV1 | MV_AXIS; + is8347 = 1; + static const uint8_t HX8352A_regValues[] PROGMEM = { + 0x83, 1, 0x02, //Test Mode: TESTM=1 + 0x85, 1, 0x03, //VDD ctl : VDC_SEL=3 [05] + 0x8B, 1, 0x01, //VGS_RES 1: RES_VGS1=1 + 0x8C, 1, 0x93, //VGS_RES 2: RES_VGS2=1, anon=0x13 [93] + 0x91, 1, 0x01, //PWM control: SYNC=1 + 0x83, 1, 0x00, //Test Mode: TESTM=0 + //Gamma Setting + 0x3E, 12, 0xB0, 0x03, 0x10, 0x56, 0x13, 0x46, 0x23, 0x76, 0x00, 0x5E, 0x4F, 0x40, + //Power Voltage Setting + 0x17, 1, 0x91, //OSC 1: RADJ=9, OSC_EN=1 [F0] + 0x2B, 1, 0xF9, //Cycle 1: N_DC=F9 [BE] + TFTLCD_DELAY8, 10, + 0x1B, 1, 0x14, //Power 3: BT=1, ??=1, AP=0 [42] + 0x1A, 1, 0x11, //Power 2: VC3=1, VC1=1 [05] + 0x1C, 1, 0x06, //Power 4: VRH=6 [0D] + 0x1F, 1, 0x42, //VCOM : VCM=42 [55] + TFTLCD_DELAY8, 20, + 0x19, 1, 0x0A, //Power 1: DK=1, VL_TR1=1 [09] + 0x19, 1, 0x1A, //Power 1: PON=1, DK=1, VL_TR1=1 [09] + TFTLCD_DELAY8, 40, + 0x19, 1, 0x12, //Power 1: PON=1, DK=1, STB=1 [09] + TFTLCD_DELAY8, 40, + 0x1E, 1, 0x27, //Power 6: VCOMG=1, VDV=7 [10] + TFTLCD_DELAY8, 100, + //Display ON Setting + 0x24, 1, 0x60, //Display 2: PT=1, GON=1 [A0] + 0x3D, 1, 0x40, //Source 1: N_SAP=40 [C0] + 0x34, 1, 0x38, //Cycle 10: EQS=0x38 [38] + 0x35, 1, 0x38, //Cycle 11: EQP=0x38 [38] + 0x24, 1, 0x38, //Display 2: GON=1 D=2 [A0] + TFTLCD_DELAY8, 40, + 0x24, 1, 0x3C, //Display 2: GON=1 D=3 [A0] + 0x16, 1, 0x1C, //Memaccess: GS=1, BGR=1, SS=1 + 0x01, 1, 0x06, //Disp Mode: INVON=1, NORON=1 [02] + 0x55, 1, 0x06, //SM_PANEL=0, SS_PANEL=0, GS_PANEL=1, REV_PANEL=1, BGR_PANEL=0 + }; + init_table(HX8352A_regValues, sizeof(HX8352A_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 400; + break; +#endif + +#ifdef SUPPORT_8352B + case 0x0065: //HX8352-B + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; + is8347 = 1; + static const uint8_t HX8352B_regValues[] PROGMEM = { + // Register setting for EQ setting + 0xe5, 1, 0x10, // + 0xe7, 1, 0x10, // + 0xe8, 1, 0x48, // + 0xec, 1, 0x09, // + 0xed, 1, 0x6c, // + // Power on Setting + 0x23, 1, 0x6F, //VMF + 0x24, 1, 0x57, //VMH + 0x25, 1, 0x71, //VML + 0xE2, 1, 0x18, // + 0x1B, 1, 0x15, //VRH + 0x01, 1, 0x00, // + 0x1C, 1, 0x03, //AP=3 + // Power on sequence + 0x19, 1, 0x01, //OSCEN=1 + TFTLCD_DELAY8, 5, + 0x1F, 1, 0x8C, //GASEN=1, DK=1, XDK=1 + 0x1F, 1, 0x84, //GASEN=1, XDK=1 + TFTLCD_DELAY8, 10, + 0x1F, 1, 0x94, //GASEN=1, PON=1, XDK=1 + TFTLCD_DELAY8, 10, + 0x1F, 1, 0xD4, //GASEN=1, VCOMG=1, PON=1, XDK=1 + TFTLCD_DELAY8, 5, + // Gamma Setting + 0x40, 13, 0x00, 0x2B, 0x29, 0x3E, 0x3D, 0x3F, 0x24, 0x74, 0x08, 0x06, 0x07, 0x0D, 0x17, + 0x50, 13, 0x00, 0x02, 0x01, 0x16, 0x14, 0x3F, 0x0B, 0x5B, 0x08, 0x12, 0x18, 0x19, 0x17, + 0x5D, 1, 0xFF, // + + 0x16, 1, 0x08, //MemoryAccess BGR=1 + 0x28, 1, 0x20, //GON=1 + TFTLCD_DELAY8, 40, + 0x28, 1, 0x38, //GON=1, DTE=1, D=2 + TFTLCD_DELAY8, 40, + 0x28, 1, 0x3C, //GON=1, DTE=1, D=3 + + 0x02, 2, 0x00, 0x00, //SC + 0x04, 2, 0x00, 0xEF, //EC + 0x06, 2, 0x00, 0x00, //SP + 0x08, 2, 0x01, 0x8F, //EP + + 0x80, 2, 0x00, 0x00, //CAC + 0x82, 2, 0x00, 0x00, //RAC + 0x17, 1, 0x05, //COLMOD = 565 + + }; + init_table(HX8352B_regValues, sizeof(HX8352B_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 400; + break; +#endif + +#ifdef SUPPORT_8347A + case 0x8347: + _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS; + // AN.01 The reference setting of CMO 3.2†Panel + static const uint8_t HX8347A_CMO32_regValues[] PROGMEM = { + // VENDOR Gamma for 3.2" + (0x46), 12, 0xA4, 0x53, 0x00, 0x44, 0x04, 0x67, 0x33, 0x77, 0x12, 0x4C, 0x46, 0x44, + // Display Setting + (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0 + (0x16), 1, 0x48, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0 + (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111 + + (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2 + (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2 + + (0x3a), 4, 0x01, 0x01, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, P_NW=1, I_RTN=15, I_NW=0, DIV=0 + TFTLCD_DELAY8, 5, + (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h + (0x3E), 1, 0x38, // SON=38h + (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF + // Power Supply Setting + (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz + (0x93), 1, 0x0F, // RADJ=1111, 100% + TFTLCD_DELAY8, 5, + (0x20), 1, 0x40, // BT=0100 + (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=?? + //VCOM SETTING for 3.2" + (0x44), 2, 0x4D, 0x11, // VCM=100 1101, VDV=1 0001 + TFTLCD_DELAY8, 10, + (0x1C), 1, 0x04, // AP=100 + TFTLCD_DELAY8, 20, + (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 40, + (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 40, + (0x43), 1, 0x80, //set VCOMG=1 + TFTLCD_DELAY8, 100, + // Display ON Setting + (0x90), 1, 0x7F, // SAP=0111 1111 + (0x26), 1, 0x04, //GON=0, DTE=0, D=01 + TFTLCD_DELAY8, 40, + (0x26), 1, 0x24, //GON=1, DTE=0, D=01 + (0x26), 1, 0x2C, //GON=1, DTE=0, D=11 + TFTLCD_DELAY8, 40, + (0x26), 1, 0x3C, //GON=1, DTE=1, D=11 + // INTERNAL REGISTER SETTING + (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode + (0x55), 1, 0x00, // VDC_SEL=000, VDDD=1.95V + (0xFE), 1, 0x5A, // For ESD protection + (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode + }; + // AN.01 The reference setting of CMO 2.4†Panel + static const uint8_t HX8347A_CMO24_regValues[] PROGMEM = { + // VENDOR Gamma for 2.4" + (0x46), 12, 0x94, 0x41, 0x00, 0x33, 0x23, 0x45, 0x44, 0x77, 0x12, 0xCC, 0x46, 0x82, + // Display Setting + (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0 + (0x16), 1, 0x48, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0 + (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111 + + (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2 + (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2 + + (0x3a), 4, 0x01, 0x01, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, P_NW=1, I_RTN=15, I_NW=0, DIV=0 + TFTLCD_DELAY8, 5, + (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h + (0x3E), 1, 0x38, // SON=38h + (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF + // Power Supply Setting + (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz + (0x93), 1, 0x0F, // RADJ=1111, 100% + TFTLCD_DELAY8, 5, + (0x20), 1, 0x40, // BT=0100 + (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=?? + //VCOM SETTING for 2.4" + (0x44), 2, 0x40, 0x12, // VCM=100 0000, VDV=1 0001 + TFTLCD_DELAY8, 10, + (0x1C), 1, 0x04, // AP=100 + TFTLCD_DELAY8, 20, + (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 40, + (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 40, + (0x43), 1, 0x80, //set VCOMG=1 + TFTLCD_DELAY8, 100, + // Display ON Setting + (0x90), 1, 0x7F, // SAP=0111 1111 + (0x26), 1, 0x04, //GON=0, DTE=0, D=01 + TFTLCD_DELAY8, 40, + (0x26), 1, 0x24, //GON=1, DTE=0, D=01 + (0x26), 1, 0x2C, //GON=1, DTE=0, D=11 + TFTLCD_DELAY8, 40, + (0x26), 1, 0x3C, //GON=1, DTE=1, D=11 + // INTERNAL REGISTER SETTING + (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode + (0x55), 1, 0x00, // VDC_SEL=000, VDDD=1.95V + (0xFE), 1, 0x5A, // For ESD protection + (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode + }; + static const uint8_t HX8347A_ITDB02_regValues[] PROGMEM = { + // VENDOR Gamma ITDB02 same as CMO32. Delays are shorter than AN01 + (0x46), 12, 0xA4, 0x53, 0x00, 0x44, 0x04, 0x67, 0x33, 0x77, 0x12, 0x4C, 0x46, 0x44, + // Display Setting + (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0 + (0x16), 1, 0xC8, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0 .itead + (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111 + + (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2 + (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2 + + (0x3a), 4, 0x01, 0x00, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, ?? P_NW=1, I_RTN=15, I_NW=0, DIV=0 .itead + TFTLCD_DELAY8, 5, + (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h + (0x3E), 1, 0x38, // SON=38h + (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF + // Power Supply Setting + (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz + (0x93), 1, 0x0F, // RADJ=1111, 100% + TFTLCD_DELAY8, 5, + (0x20), 1, 0x40, // BT=0100 + (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=?? + //VCOM SETTING for ITDB02 + (0x44), 2, 0x4D, 0x0E, // VCM=101 0000 4D, VDV=1 0001 .itead + TFTLCD_DELAY8, 5, + (0x1C), 1, 0x04, // AP=100 + TFTLCD_DELAY8, 5, + (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 5, + (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0 + TFTLCD_DELAY8, 5, + (0x43), 1, 0x80, //set VCOMG=1 + TFTLCD_DELAY8, 5, + // Display ON Setting + (0x90), 1, 0x7F, // SAP=0111 1111 + (0x26), 1, 0x04, //GON=0, DTE=0, D=01 + TFTLCD_DELAY8, 5, + (0x26), 1, 0x24, //GON=1, DTE=0, D=01 + (0x26), 1, 0x2C, //GON=1, DTE=0, D=11 + TFTLCD_DELAY8, 5, + (0x26), 1, 0x3C, //GON=1, DTE=1, D=11 + // INTERNAL REGISTER SETTING for ITDB02 + (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode + (0x95), 1, 0x01, // SET DISPLAY CLOCK AND PUMPING CLOCK TO SYNCHRONIZE .itead + (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode + }; + static const uint8_t HX8347A_NHD_regValues[] PROGMEM = { + //Gamma Setting NHD + (0x46), 12, 0x94, 0x41, 0x00, 0x33, 0x23, 0x45, 0x44, 0x77, 0x12, 0xCC, 0x46, 0x82, + (0x01), 1, 0x06, //Display Mode [06] + (0x16), 1, 0xC8, //MADCTL [00] MY=1, MX=1, BGR=1 +// (0x70), 1, 0x05, //Panel [06] 16-bit + (0x23), 3, 0x95, 0x95, 0xFF, //Cycle Control 1-3 [95 95 FF] + (0x27), 4, 0x02, 0x02, 0x02, 0x02, //Display Control 2-5 [02 02 02 02] + (0x2C), 2, 0x02, 0x02, //Display Control 6-7 [02 02] + (0x3A), 4, 0x01, 0x01, 0xF0, 0x00, //Cycle Control 1-4 [01 01 F0 00] + TFTLCD_DELAY8, 80, + (0x35), 2, 0x38, 0x78, //Display Control 9-10 [09 09] EQS=56, EQP=120 + (0x3E), 1, 0x38, //Cycle Control 5 [38] + (0x40), 1, 0x0F, //Cycle Control 6 [03] GDON=15 + (0x41), 1, 0xF0, //Cycle Control 14 [F8] GDOF=248 + + (0x19), 1, 0x2D, //OSC Control 1 [86] CADJ=2, CUADJ=6, OSCEN=1 + (0x93), 1, 0x06, //SAP Idle mode [00] ??? .nhd + TFTLCD_DELAY8, 80, + (0x20), 1, 0x40, //Power Control 6 [40] + (0x1D), 3, 0x07, 0x00, 0x04, //Power Control 3-5 [04 00 06] VC=7 + (0x44), 2, 0x3C, 0x12, //VCOM Control 2-3 [5A 11] VCM=60, VDV=18 + TFTLCD_DELAY8, 80, + (0x1C), 1, 0x04, //Power Control 2 [04] + TFTLCD_DELAY8, 80, + (0x43), 1, 0x80, //VCOM Control 1 [80] + TFTLCD_DELAY8, 80, + (0x1B), 1, 0x08, //Power Control 1 [00] DK=1 + TFTLCD_DELAY8, 80, + (0x1B), 1, 0x10, //Power Control 1 [00] PON=1 + TFTLCD_DELAY8, 80, + (0x90), 1, 0x7F, //Display Control 8 [0A] + (0x26), 1, 0x04, //Display Control 1 [A0] D=1 + TFTLCD_DELAY8, 80, + (0x26), 1, 0x24, //Display Control 1 [A0] GON=1, D=1 + (0x26), 1, 0x2C, //Display Control 1 [A0] GON=1, D=3 + TFTLCD_DELAY8, 80, + (0x26), 1, 0x3C, //Display Control 1 [A0] GON=1, DTE=1, D=3 + (0x57), 1, 0x02, //? + (0x55), 1, 0x00, //? + (0x57), 1, 0x00, //? + }; + // Atmel ASF code uses VCOM2-3: 0x38, 0x12. 50ms delays and no TEST mode changes. + init_table(HX8347A_NHD_regValues, sizeof(HX8347A_NHD_regValues)); + // init_table(HX8347A_CMO32_regValues, sizeof(HX8347A_CMO32_regValues)); + // init_table(HX8347A_CMO24_regValues, sizeof(HX8347A_CMO24_regValues)); + // init_table(HX8347A_ITDB02_regValues, sizeof(HX8347A_ITDB02_regValues)); + // init_table(HX8347G_2_regValues, sizeof(HX8347G_2_regValues)); + break; +#endif + + case 0x8357: //BIG CHANGE: HX8357-B is now 0x8357 + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN; + goto common_8357; + case 0x9090: //BIG CHANGE: HX8357-D was 0x8357 + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS; + common_8357: + static const uint8_t HX8357C_regValues[] PROGMEM = { + TFTLCD_DELAY8, 1, //dummy table + }; + table8_ads = HX8357C_regValues, table_size = sizeof(HX8357C_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + + case 0x0099: //HX8357-D matches datasheet + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS; + static const uint8_t HX8357_99_regValues[] PROGMEM = { + (0xB9), 3, 0xFF, 0x83, 0x57, // SETEXTC + TFTLCD_DELAY8, 150, + TFTLCD_DELAY8, 150, + (0xB6), 1, 0x25, // SETCOM [4B 00] -2.5V+37*0.02V=-1.76V [-1.00V] + (0xC0), 6, 0x50, 0x50, 0x01, 0x3C, 0x1E, 0x08, // SETSTBA [73 50 00 3C C4 08] + (0xB4), 7, 0x02, 0x40, 0x00, 0x2A, 0x2A, 0x0D, 0x78, // SETCYC [02 40 00 2A 2A 0D 96] +#ifdef SUPPORT_8357D_GAMMA + // HX8357D_SETGAMMA [0B 0C 11 1D 25 37 43 4B 4E 47 41 39 35 31 2E 21 1C 1D 1D 26 31 44 4E 56 44 3F 39 33 31 2E 28 1D E0 01] + (0xE0),34, 0x02, 0x0A, 0x11, 0x1D, 0x23, 0x35, 0x41, 0x4B, 0x4B, 0x42, 0x3A, 0x27, 0x1B, 0x08, 0x09, 0x03, 0x02, 0x0A, 0x11, 0x1D, 0x23, 0x35, 0x41, 0x4B, 0x4B, 0x42, 0x3A, 0x27, 0x1B, 0x08, 0x09, 0x03, 0x00, 0x01, +#endif + }; + table8_ads = HX8357_99_regValues, table_size = sizeof(HX8357_99_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + +#ifdef SUPPORT_8230 + case 0x8230: //thanks Auzman + _lcd_capable = 0 | REV_SCREEN | INVERT_GS | INVERT_RGB | READ_BGR; + static const uint16_t UC8230_regValues[] PROGMEM = { + //After pin Reset wait at least 100ms + TFTLCD_DELAY, 100, //at least 100ms + 0x0046, 0x0002, //MTP Disable + 0x0010, 0x1590, //SAP=1, BT=5, APE=1, AP=1 + 0x0011, 0x0227, //DC1=2, DC0=2, VC=7 + 0x0012, 0x80ff, //P5VMD=1, PON=7, VRH=15 + 0x0013, 0x9c31, //VDV=28, VCM=49 + TFTLCD_DELAY, 10, //at least 10ms + 0x0002, 0x0300, //set N-line = 1 + 0x0003, 0x1030, //set GRAM writing direction & BGR=1 + 0x0060, 0xa700, //GS; gate scan: start position & drive line Q'ty + 0x0061, 0x0001, //REV, NDL, VLE + /*--------------------Gamma control------------------------*/ + 0x0030, 0x0303, + 0x0031, 0x0303, + 0x0032, 0x0303, + 0x0033, 0x0300, + 0x0034, 0x0003, + 0x0035, 0x0303, + 0x0036, 0x1400, + 0x0037, 0x0303, + 0x0038, 0x0303, + 0x0039, 0x0303, + 0x003a, 0x0300, + 0x003b, 0x0003, + 0x003c, 0x0303, + 0x003d, 0x1400, + //-----------------------------------------------------------// + 0x0020, 0x0000, //GRAM horizontal address + 0x0021, 0x0000, //GRAM vertical address + //************** Partial Display control*********************// + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x0000, + 0x0083, 0x0000, + 0x0084, 0x0000, + 0x0085, 0x0000, + //-----------------------------------------------------------// + 0x0092, 0x0200, + 0x0093, 0x0303, + 0x0090, 0x0010, //set clocks/Line + 0x0000, 0x0001, + TFTLCD_DELAY, 200, // Delay 200 ms + 0x0007, 0x0173, //Display on setting + }; + init_table16(UC8230_regValues, sizeof(UC8230_regValues)); + break; +#endif + +#ifdef SUPPORT_9163 + case 0x9163: // + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + static const uint8_t PROGMEM table9163C[] = { + // (COMMAND_BYTE), n, data_bytes.... + 0x26, 1, 0x02, // [01] GAMMASET use CURVE=1, 2, 4, 8 + 0xB1, 2, 0x08, 0x02, // [0E 14] FRMCTR1 if GM==011 61.7Hz + 0xB4, 1, 0x07, // [02] INVCTR + 0xB8, 1, 0x01, // [00] GSCTRL + 0xC0, 2, 0x0A, 0x02, // [0A 05] PWCTR1 if LCM==10 + 0xC1, 1, 0x02, // [07] PWCTR2 + 0xC5, 2, 0x50, 0x63, // [43 4D] VMCTR1 + 0xC7, 1, 0, // [40] VCOMOFFS + }; + table8_ads = table9163C, table_size = sizeof(table9163C); // + p16 = (int16_t *) & HEIGHT; + *p16 = 160; + p16 = (int16_t *) & WIDTH; + *p16 = 128; + break; +#endif + +#ifdef SUPPORT_9225 +#define ILI9225_DRIVER_OUTPUT_CTRL (0x01u) // Driver Output Control +#define ILI9225_LCD_AC_DRIVING_CTRL (0x02u) // LCD AC Driving Control +#define ILI9225_ENTRY_MODE (0x03u) // Entry Mode +#define ILI9225_DISP_CTRL1 (0x07u) // Display Control 1 +#define ILI9225_BLANK_PERIOD_CTRL1 (0x08u) // Blank Period Control +#define ILI9225_FRAME_CYCLE_CTRL (0x0Bu) // Frame Cycle Control +#define ILI9225_INTERFACE_CTRL (0x0Cu) // Interface Control +#define ILI9225_OSC_CTRL (0x0Fu) // Osc Control +#define ILI9225_POWER_CTRL1 (0x10u) // Power Control 1 +#define ILI9225_POWER_CTRL2 (0x11u) // Power Control 2 +#define ILI9225_POWER_CTRL3 (0x12u) // Power Control 3 +#define ILI9225_POWER_CTRL4 (0x13u) // Power Control 4 +#define ILI9225_POWER_CTRL5 (0x14u) // Power Control 5 +#define ILI9225_VCI_RECYCLING (0x15u) // VCI Recycling +#define ILI9225_RAM_ADDR_SET1 (0x20u) // Horizontal GRAM Address Set +#define ILI9225_RAM_ADDR_SET2 (0x21u) // Vertical GRAM Address Set +#define ILI9225_GRAM_DATA_REG (0x22u) // GRAM Data Register +#define ILI9225_GATE_SCAN_CTRL (0x30u) // Gate Scan Control Register +#define ILI9225_VERTICAL_SCROLL_CTRL1 (0x31u) // Vertical Scroll Control 1 Register +#define ILI9225_VERTICAL_SCROLL_CTRL2 (0x32u) // Vertical Scroll Control 2 Register +#define ILI9225_VERTICAL_SCROLL_CTRL3 (0x33u) // Vertical Scroll Control 3 Register +#define ILI9225_PARTIAL_DRIVING_POS1 (0x34u) // Partial Driving Position 1 Register +#define ILI9225_PARTIAL_DRIVING_POS2 (0x35u) // Partial Driving Position 2 Register +#define ILI9225_HORIZONTAL_WINDOW_ADDR1 (0x36u) // Horizontal Address END Position HEA +#define ILI9225_HORIZONTAL_WINDOW_ADDR2 (0x37u) // Horizontal Address START Position HSA +#define ILI9225_VERTICAL_WINDOW_ADDR1 (0x38u) // Vertical Address END Position VEA +#define ILI9225_VERTICAL_WINDOW_ADDR2 (0x39u) // Vertical Address START Position VSA +#define ILI9225_GAMMA_CTRL1 (0x50u) // Gamma Control 1 +#define ILI9225_GAMMA_CTRL2 (0x51u) // Gamma Control 2 +#define ILI9225_GAMMA_CTRL3 (0x52u) // Gamma Control 3 +#define ILI9225_GAMMA_CTRL4 (0x53u) // Gamma Control 4 +#define ILI9225_GAMMA_CTRL5 (0x54u) // Gamma Control 5 +#define ILI9225_GAMMA_CTRL6 (0x55u) // Gamma Control 6 +#define ILI9225_GAMMA_CTRL7 (0x56u) // Gamma Control 7 +#define ILI9225_GAMMA_CTRL8 (0x57u) // Gamma Control 8 +#define ILI9225_GAMMA_CTRL9 (0x58u) // Gamma Control 9 +#define ILI9225_GAMMA_CTRL10 (0x59u) // Gamma Control 10 + +#define ILI9225C_INVOFF 0x20 +#define ILI9225C_INVON 0x21 + + case 0x6813: + case 0x9226: + _lcd_ID = 0x9225; //fall through + case 0x9225: + _lcd_capable = REV_SCREEN | READ_BGR; //thanks tongbajiel + static const uint16_t ILI9225_regValues[] PROGMEM = { + /* Start Initial Sequence */ + /* Set SS bit and direction output from S528 to S1 */ + ILI9225_POWER_CTRL1, 0x0000, // Set SAP,DSTB,STB + ILI9225_POWER_CTRL2, 0x0000, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x0000, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x0000, // Set GVDD + ILI9225_POWER_CTRL5, 0x0000, // Set VCOMH/VCOML voltage + TFTLCD_DELAY, 40, + + // Power-on sequence + ILI9225_POWER_CTRL2, 0x0018, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x6121, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x006F, // Set GVDD /*007F 0088 */ + ILI9225_POWER_CTRL5, 0x495F, // Set VCOMH/VCOML voltage + ILI9225_POWER_CTRL1, 0x0800, // Set SAP,DSTB,STB + TFTLCD_DELAY, 10, + ILI9225_POWER_CTRL2, 0x103B, // Set APON,PON,AON,VCI1EN,VC + TFTLCD_DELAY, 50, + + ILI9225_DRIVER_OUTPUT_CTRL, 0x011C, // set the display line number and display direction + ILI9225_LCD_AC_DRIVING_CTRL, 0x0100, // set 1 line inversion + ILI9225_ENTRY_MODE, 0x1030, // set GRAM write direction and BGR=1. + ILI9225_DISP_CTRL1, 0x0000, // Display off + ILI9225_BLANK_PERIOD_CTRL1, 0x0808, // set the back porch and front porch + ILI9225_FRAME_CYCLE_CTRL, 0x1100, // set the clocks number per line + ILI9225_INTERFACE_CTRL, 0x0000, // CPU interface + ILI9225_OSC_CTRL, 0x0D01, // Set Osc /*0e01*/ + ILI9225_VCI_RECYCLING, 0x0020, // Set VCI recycling + ILI9225_RAM_ADDR_SET1, 0x0000, // RAM Address + ILI9225_RAM_ADDR_SET2, 0x0000, // RAM Address + + /* Set GRAM area */ + ILI9225_GATE_SCAN_CTRL, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB, + ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000, + ILI9225_PARTIAL_DRIVING_POS1, 0x00DB, + ILI9225_PARTIAL_DRIVING_POS2, 0x0000, + ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF, + ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000, + ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB, + ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000, + + /* Set GAMMA curve */ + ILI9225_GAMMA_CTRL1, 0x0000, + ILI9225_GAMMA_CTRL2, 0x0808, + ILI9225_GAMMA_CTRL3, 0x080A, + ILI9225_GAMMA_CTRL4, 0x000A, + ILI9225_GAMMA_CTRL5, 0x0A08, + ILI9225_GAMMA_CTRL6, 0x0808, + ILI9225_GAMMA_CTRL7, 0x0000, + ILI9225_GAMMA_CTRL8, 0x0A00, + ILI9225_GAMMA_CTRL9, 0x0710, + ILI9225_GAMMA_CTRL10, 0x0710, + + ILI9225_DISP_CTRL1, 0x0012, + TFTLCD_DELAY, 50, + ILI9225_DISP_CTRL1, 0x1017, + }; + init_table16(ILI9225_regValues, sizeof(ILI9225_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 220; + p16 = (int16_t *) & WIDTH; + *p16 = 176; + break; +#endif + + case 0x0001: + _lcd_capable = 0 | REV_SCREEN | INVERT_GS; //no RGB bug. thanks Ivo_Deshev + goto common_9320; + case 0x5408: + _lcd_capable = 0 | REV_SCREEN | READ_BGR; //Red 2.4" thanks jorgenv, Ardlab_Gent +// _lcd_capable = 0 | REV_SCREEN | READ_BGR | INVERT_GS; //Blue 2.8" might be different + goto common_9320; + case 0x1505: //R61505 thanks Ravi_kanchan2004. R61505V, R61505W different + case 0x9320: + _lcd_capable = 0 | REV_SCREEN | READ_BGR; + common_9320: + static const uint16_t ILI9320_regValues[] PROGMEM = { + 0x00e5, 0x8000, + 0x0000, 0x0001, + 0x0001, 0x100, + 0x0002, 0x0700, + 0x0003, 0x1030, + 0x0004, 0x0000, + 0x0008, 0x0202, + 0x0009, 0x0000, + 0x000A, 0x0000, + 0x000C, 0x0000, + 0x000D, 0x0000, + 0x000F, 0x0000, + //-----Power On sequence----------------------- + 0x0010, 0x0000, + 0x0011, 0x0007, + 0x0012, 0x0000, + 0x0013, 0x0000, + TFTLCD_DELAY, 50, + 0x0010, 0x17B0, //SAP=1, BT=7, APE=1, AP=3 + 0x0011, 0x0007, //DC1=0, DC0=0, VC=7 + TFTLCD_DELAY, 10, + 0x0012, 0x013A, //VCMR=1, PON=3, VRH=10 + TFTLCD_DELAY, 10, + 0x0013, 0x1A00, //VDV=26 + 0x0029, 0x000c, //VCM=12 + TFTLCD_DELAY, 10, + //-----Gamma control----------------------- + 0x0030, 0x0000, + 0x0031, 0x0505, + 0x0032, 0x0004, + 0x0035, 0x0006, + 0x0036, 0x0707, + 0x0037, 0x0105, + 0x0038, 0x0002, + 0x0039, 0x0707, + 0x003C, 0x0704, + 0x003D, 0x0807, + //-----Set RAM area----------------------- + 0x0060, 0xA700, //GS=1 + 0x0061, 0x0001, + 0x006A, 0x0000, + 0x0021, 0x0000, + 0x0020, 0x0000, + //-----Partial Display Control------------ + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x0000, + 0x0083, 0x0000, + 0x0084, 0x0000, + 0x0085, 0x0000, + //-----Panel Control---------------------- + 0x0090, 0x0010, + 0x0092, 0x0000, + 0x0093, 0x0003, + 0x0095, 0x0110, + 0x0097, 0x0000, + 0x0098, 0x0000, + //-----Display on----------------------- + 0x0007, 0x0173, + TFTLCD_DELAY, 50, + }; + init_table16(ILI9320_regValues, sizeof(ILI9320_regValues)); + break; + case 0x6809: + _lcd_capable = 0 | REV_SCREEN | INVERT_GS | AUTO_READINC; + goto common_93x5; + case 0x9328: + case 0x9325: + _lcd_capable = 0 | REV_SCREEN | INVERT_GS; + goto common_93x5; + case 0x9331: + case 0x9335: + _lcd_capable = 0 | REV_SCREEN; + common_93x5: + static const uint16_t ILI9325_regValues[] PROGMEM = { + 0x00E5, 0x78F0, // set SRAM internal timing + 0x0001, 0x0100, // set Driver Output Control + 0x0002, 0x0200, // set 1 line inversion + 0x0003, 0x1030, // set GRAM write direction and BGR=1. + 0x0004, 0x0000, // Resize register + 0x0005, 0x0000, // .kbv 16bits Data Format Selection + 0x0008, 0x0207, // set the back porch and front porch + 0x0009, 0x0000, // set non-display area refresh cycle ISC[3:0] + 0x000A, 0x0000, // FMARK function + 0x000C, 0x0000, // RGB interface setting + 0x000D, 0x0000, // Frame marker Position + 0x000F, 0x0000, // RGB interface polarity + // ----------- Power On sequence ----------- // + 0x0010, 0x0000, // SAP, BT[3:0], AP, DSTB, SLP, STB + 0x0011, 0x0007, // DC1[2:0], DC0[2:0], VC[2:0] + 0x0012, 0x0000, // VREG1OUT voltage + 0x0013, 0x0000, // VDV[4:0] for VCOM amplitude + 0x0007, 0x0001, + TFTLCD_DELAY, 200, // Dis-charge capacitor power voltage + 0x0010, 0x1690, // SAP=1, BT=6, APE=1, AP=1, DSTB=0, SLP=0, STB=0 + 0x0011, 0x0227, // DC1=2, DC0=2, VC=7 + TFTLCD_DELAY, 50, // wait_ms 50ms + 0x0012, 0x000D, // VCIRE=1, PON=0, VRH=5 + TFTLCD_DELAY, 50, // wait_ms 50ms + 0x0013, 0x1200, // VDV=28 for VCOM amplitude + 0x0029, 0x000A, // VCM=10 for VCOMH + 0x002B, 0x000D, // Set Frame Rate + TFTLCD_DELAY, 50, // wait_ms 50ms + 0x0020, 0x0000, // GRAM horizontal Address + 0x0021, 0x0000, // GRAM Vertical Address + // ----------- Adjust the Gamma Curve ----------// + + 0x0030, 0x0000, + 0x0031, 0x0404, + 0x0032, 0x0003, + 0x0035, 0x0405, + 0x0036, 0x0808, + 0x0037, 0x0407, + 0x0038, 0x0303, + 0x0039, 0x0707, + 0x003C, 0x0504, + 0x003D, 0x0808, + + //------------------ Set GRAM area ---------------// + 0x0060, 0x2700, // Gate Scan Line GS=0 [0xA700] + 0x0061, 0x0001, // NDL,VLE, REV .kbv + 0x006A, 0x0000, // set scrolling line + //-------------- Partial Display Control ---------// + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x0000, + 0x0083, 0x0000, + 0x0084, 0x0000, + 0x0085, 0x0000, + //-------------- Panel Control -------------------// + 0x0090, 0x0010, + 0x0092, 0x0000, + 0x0007, 0x0133, // 262K color and display ON + }; + init_table16(ILI9325_regValues, sizeof(ILI9325_regValues)); + break; + +#if defined(SUPPORT_9326_5420) + case 0x5420: + case 0x9326: + _lcd_capable = REV_SCREEN | READ_BGR; + static const uint16_t ILI9326_CPT28_regValues[] PROGMEM = { +//************* Start Initial Sequence **********// + 0x0702, 0x3008, // Set internal timing, don’t change this value + 0x0705, 0x0036, // Set internal timing, don’t change this value + 0x070B, 0x1213, // Set internal timing, don’t change this value + 0x0001, 0x0100, // set SS and SM bit + 0x0002, 0x0100, // set 1 line inversion + 0x0003, 0x1030, // set GRAM write direction and BGR=1. + 0x0008, 0x0202, // set the back porch and front porch + 0x0009, 0x0000, // set non-display area refresh cycle ISC[3:0] + 0x000C, 0x0000, // RGB interface setting + 0x000F, 0x0000, // RGB interface polarity +//*************Power On sequence ****************// + 0x0100, 0x0000, // SAP, BT[3:0], AP, DSTB, SLP, STB + 0x0102, 0x0000, // VREG1OUT voltage + 0x0103, 0x0000, // VDV[4:0] for VCOM amplitude + TFTLCD_DELAY, 200, // Dis-charge capacitor power voltage + 0x0100, 0x1190, // SAP, BT[3:0], AP, DSTB, SLP, STB + 0x0101, 0x0227, // DC1[2:0], DC0[2:0], VC[2:0] + TFTLCD_DELAY, 50, // Delay 50ms + 0x0102, 0x01BD, // VREG1OUT voltage + TFTLCD_DELAY, 50, // Delay 50ms + 0x0103, 0x2D00, // VDV[4:0] for VCOM amplitude + 0x0281, 0x000E, // VCM[5:0] for VCOMH + TFTLCD_DELAY, 50, // + 0x0200, 0x0000, // GRAM horizontal Address + 0x0201, 0x0000, // GRAM Vertical Address +// ----------- Adjust the Gamma Curve ----------// + 0x0300, 0x0000, // + 0x0301, 0x0707, // + 0x0302, 0x0606, // + 0x0305, 0x0000, // + 0x0306, 0x0D00, // + 0x0307, 0x0706, // + 0x0308, 0x0005, // + 0x0309, 0x0007, // + 0x030C, 0x0000, // + 0x030D, 0x000A, // +//------------------ Set GRAM area ---------------// + 0x0400, 0x3100, // Gate Scan Line 400 lines + 0x0401, 0x0001, // NDL,VLE, REV + 0x0404, 0x0000, // set scrolling line +//-------------- Partial Display Control ---------// + 0x0500, 0x0000, // Partial Image 1 Display Position + 0x0501, 0x0000, // Partial Image 1 RAM Start/End Address + 0x0502, 0x0000, // Partial Image 1 RAM Start/End Address + 0x0503, 0x0000, // Partial Image 2 Display Position + 0x0504, 0x0000, // Partial Image 2 RAM Start/End Address + 0x0505, 0x0000, // Partial Image 2 RAM Start/End Address +//-------------- Panel Control -------------------// + 0x0010, 0x0010, // DIVI[1:0];RTNI[4:0] + 0x0011, 0x0600, // NOWI[2:0];SDTI[2:0] + 0x0020, 0x0002, // DIVE[1:0];RTNE[5:0] + 0x0007, 0x0173, // 262K color and display ON + }; + init_table16(ILI9326_CPT28_regValues, sizeof(ILI9326_CPT28_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 400; + p16 = (int16_t *) & WIDTH; + *p16 = 240; + break; +#endif + + case 0x9327: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; + static const uint8_t ILI9327_regValues[] PROGMEM = { + 0xB0, 1, 0x00, //Disable Protect for cmds B1-DF, E0-EF, F0-FF + // 0xE0, 1, 0x20, //NV Memory Write [00] + // 0xD1, 3, 0x00, 0x71, 0x19, //VCOM control [00 40 0F] + // 0xD0, 3, 0x07, 0x01, 0x08, //Power Setting [07 04 8C] + 0xC1, 4, 0x10, 0x10, 0x02, 0x02, //Display Timing [10 10 02 02] + 0xC0, 6, 0x00, 0x35, 0x00, 0x00, 0x01, 0x02, //Panel Drive [00 35 00 00 01 02 REV=0,GS=0,SS=0 + 0xC5, 1, 0x04, //Frame Rate [04] + 0xD2, 2, 0x01, 0x04, //Power Setting [01 44] + // 0xC8, 15, 0x04, 0x67, 0x35, 0x04, 0x08, 0x06, 0x24, 0x01, 0x37, 0x40, 0x03, 0x10, 0x08, 0x80, 0x00, + // 0xC8, 15, 0x00, 0x77, 0x77, 0x04, 0x04, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xCA, 1, 0x00, //DGC LUT ??? + 0xEA, 1, 0x80, //3-Gamma Function Enable + // 0xB0, 1, 0x03, //Enable Protect + }; + table8_ads = ILI9327_regValues, table_size = sizeof(ILI9327_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 400; + p16 = (int16_t *) & WIDTH; + *p16 = 240; + break; + case 0x1602: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //does not readGRAM + static const uint8_t XX1602_regValues[] PROGMEM = { + 0xB8, 1, 0x01, //GS [00] + 0xC0, 1, 0x0E, //??Power [0A] + }; + table8_ads = XX1602_regValues, table_size = sizeof(XX1602_regValues); + break; + + case 0x2053: //weird from BangGood + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN | READ_BGR; + goto common_9329; + case 0xAC11: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; //thanks viliam + goto common_9329; + case 0x9302: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; + goto common_9329; + case 0x9338: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + goto common_9329; + case 0x9329: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | REV_SCREEN; + common_9329: + static const uint8_t ILI9329_regValues[] PROGMEM = { +// 0xF6, 3, 0x01, 0x01, 0x00, //Interface Control needs EXTC=1 MX_EOR=1, TM=0, RIM=0 +// 0xB6, 3, 0x0A, 0x82, 0x27, //Display Function [0A 82 27] +// 0xB7, 1, 0x06, //Entry Mode Set [06] + 0x36, 1, 0x00, //Memory Access [00] pointless but stops an empty array + }; + table8_ads = ILI9329_regValues, table_size = sizeof(ILI9329_regValues); + break; + + case 0x9340: //ILI9340 thanks Ravi_kanchan2004 and valmor_jr + //_lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; //Ravi + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; //my new shield + goto common_9341; + case 0x9341: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + common_9341: + static const uint8_t ILI9341_regValues_2_4[] PROGMEM = { // BOE 2.4" + 0xF6, 3, 0x01, 0x01, 0x00, //Interface Control needs EXTC=1 MV_EOR=0, TM=0, RIM=0 + 0xCF, 3, 0x00, 0x81, 0x30, //Power Control B [00 81 30] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xE8, 3, 0x85, 0x10, 0x78, //Driver Timing A [04 11 7A] + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xB0, 1, 0x00, //RGB Signal [00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] + // 0xB6, 2, 0x0A, 0xA2, 0x27, //Display Function [0A 82 27 XX] .kbv SS=1 + 0xB4, 1, 0x00, //Inversion Control [02] .kbv NLA=1, NLB=1, NLC=1 + 0xC0, 1, 0x21, //Power Control 1 [26] + 0xC1, 1, 0x11, //Power Control 2 [00] + 0xC5, 2, 0x3F, 0x3C, //VCOM 1 [31 3C] + 0xC7, 1, 0xB5, //VCOM 2 [C0] + 0x36, 1, 0x48, //Memory Access [00] + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x26, 0x24, 0x0b, 0x0e, 0x09, 0x54, 0xa8, 0x46, 0x0c, 0x17, 0x09, 0x0f, 0x07, 0x00, + 0xE1, 15, 0x00, 0x19, 0x1b, 0x04, 0x10, 0x07, 0x2a, 0x47, 0x39, 0x03, 0x06, 0x06, 0x30, 0x38, 0x0f, + }; + static const uint8_t ILI9341_regValues_ada[] PROGMEM = { // Adafruit_TFTLCD only works with EXTC=0 + // 0xF6, 3, 0x00, 0x01, 0x00, //Interface Control needs EXTC=1 TM=0, RIM=0 + // 0xF6, 3, 0x01, 0x01, 0x03, //Interface Control needs EXTC=1 RM=1, RIM=1 + 0xF6, 3, 0x09, 0x01, 0x03, //Interface Control needs EXTC=1 RM=0, RIM=1 + 0xB0, 1, 0x40, //RGB Signal [40] RCM=2 + 0xB4, 1, 0x00, //Inversion Control [02] .kbv NLA=1, NLB=1, NLC=1 + 0xC0, 1, 0x23, //Power Control 1 [26] + 0xC1, 1, 0x10, //Power Control 2 [00] + 0xC5, 2, 0x2B, 0x2B, //VCOM 1 [31 3C] + 0xC7, 1, 0xC0, //VCOM 2 [C0] + 0x36, 1, 0x88, //Memory Access [00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] + 0xB7, 1, 0x07, //Entry Mode [00] + }; + table8_ads = ILI9341_regValues_2_4, table_size = sizeof(ILI9341_regValues_2_4); // + break; +#if defined(SUPPORT_9342) + case 0x9342: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | INVERT_GS | REV_SCREEN; + static const uint8_t ILI9342_regValues_CPT24[] PROGMEM = { //CPT 2.4" + (0xB9), 3, 0xFF, 0x93, 0x42, //[00 00 00] + (0xC0), 2, 0x1D, 0x0A, //[26 09] + (0xC1), 1, 0x02, //[10] + (0xC5), 2, 0x2F, 0x2F, //[31 3C] + (0xC7), 1, 0xC3, //[C0] + (0xB8), 1, 0x0B, //[07] + (0xE0), 15, 0x0F, 0x33, 0x30, 0x0C, 0x0F, 0x08, 0x5D, 0x66, 0x4A, 0x07, 0x13, 0x05, 0x1B, 0x0E, 0x08, + (0xE1), 15, 0x08, 0x0E, 0x11, 0x02, 0x0E, 0x02, 0x24, 0x33, 0x37, 0x03, 0x0A, 0x09, 0x26, 0x33, 0x0F, + }; + static const uint8_t ILI9342_regValues_Tianma23[] PROGMEM = { //Tianma 2.3" + (0xB9), 3, 0xFF, 0x93, 0x42, + (0xC0), 2, 0x1D, 0x0A, + (0xC1), 1, 0x01, + (0xC5), 2, 0x2C, 0x2C, + (0xC7), 1, 0xC6, + (0xB8), 1, 0x09, + (0xE0), 15, 0x0F, 0x26, 0x21, 0x07, 0x0A, 0x03, 0x4E, 0x62, 0x3E, 0x0B, 0x11, 0x00, 0x08, 0x02, 0x00, + (0xE1), 15, 0x00, 0x19, 0x1E, 0x03, 0x0E, 0x03, 0x30, 0x23, 0x41, 0x03, 0x0B, 0x07, 0x2F, 0x36, 0x0F, + }; + static const uint8_t ILI9342_regValues_HSD23[] PROGMEM = { //HSD 2.3" + (0xB9), 3, 0xFF, 0x93, 0x42, + (0xC0), 2, 0x1D, 0x0A, + (0xC1), 1, 0x02, + (0xC5), 2, 0x2F, 0x27, + (0xC7), 1, 0xA4, + (0xB8), 1, 0x0B, + (0xE0), 15, 0x0F, 0x24, 0x21, 0x0C, 0x0F, 0x06, 0x50, 0x75, 0x3F, 0x07, 0x12, 0x05, 0x11, 0x0B, 0x08, + (0xE1), 15, 0x08, 0x1D, 0x20, 0x02, 0x0E, 0x04, 0x31, 0x24, 0x42, 0x03, 0x0B, 0x09, 0x30, 0x36, 0x0F, + }; + table8_ads = ILI9342_regValues_CPT24, table_size = sizeof(ILI9342_regValues_CPT24); // + // table8_ads = ILI9342_regValues_Tianma23, table_size = sizeof(ILI9342_regValues_Tianma23); // + // table8_ads = ILI9342_regValues_HSD23, table_size = sizeof(ILI9342_regValues_HSD23); // + p16 = (int16_t *) & HEIGHT; + *p16 = 240; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; +#endif + case 0x1581: //no BGR in MADCTL. set BGR in Panel Control + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; //thanks zdravke + goto common_9481; + case 0x9481: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_BGR; + common_9481: + static const uint8_t ILI9481_regValues[] PROGMEM = { // Atmel MaxTouch + 0xB0, 1, 0x00, // unlocks E0, F0 + 0xB3, 4, 0x02, 0x00, 0x00, 0x00, //Frame Memory, interface [02 00 00 00] + 0xB4, 1, 0x00, // Frame mode [00] + 0xD0, 3, 0x07, 0x42, 0x18, // Set Power [00 43 18] x1.00, x6, x3 + 0xD1, 3, 0x00, 0x07, 0x10, // Set VCOM [00 00 00] x0.72, x1.02 + 0xD2, 2, 0x01, 0x02, // Set Power for Normal Mode [01 22] + 0xD3, 2, 0x01, 0x02, // Set Power for Partial Mode [01 22] + 0xD4, 2, 0x01, 0x02, // Set Power for Idle Mode [01 22] + 0xC0, 5, 0x12, 0x3B, 0x00, 0x02, 0x11, //Panel Driving BGR for 1581 [10 3B 00 02 11] + 0xC1, 3, 0x10, 0x10, 0x88, // Display Timing Normal [10 10 88] + 0xC5, 1, 0x03, //Frame Rate [03] + 0xC6, 1, 0x02, //Interface Control [02] + 0xC8, 12, 0x00, 0x32, 0x36, 0x45, 0x06, 0x16, 0x37, 0x75, 0x77, 0x54, 0x0C, 0x00, + 0xCC, 1, 0x00, //Panel Control [00] + }; + static const uint8_t ILI9481_CPT29_regValues[] PROGMEM = { // 320x430 + 0xB0, 1, 0x00, + 0xD0, 3, 0x07, 0x42, 0x1C, // Set Power [00 43 18] + 0xD1, 3, 0x00, 0x02, 0x0F, // Set VCOM [00 00 00] x0.695, x1.00 + 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22] + 0xC0, 5, 0x10, 0x35, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11] + 0xC5, 1, 0x03, //Frame Rate [03] + 0xC8, 12, 0x00, 0x30, 0x36, 0x45, 0x04, 0x16, 0x37, 0x75, 0x77, 0x54, 0x0F, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + 0xF3, 2, 0x02, 0x1A, + }; + static const uint8_t ILI9481_PVI35_regValues[] PROGMEM = { // 320x480 + 0xB0, 1, 0x00, + 0xD0, 3, 0x07, 0x41, 0x1D, // Set Power [00 43 18] + 0xD1, 3, 0x00, 0x2B, 0x1F, // Set VCOM [00 00 00] x0.900, x1.32 + 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22] + 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11] + 0xC5, 1, 0x03, //Frame Rate [03] + 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, 0x36, 0x77, 0x00, 0x0F, 0x00, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + 0xF3, 2, 0x40, 0x0A, + }; + static const uint8_t ILI9481_AUO317_regValues[] PROGMEM = { // 320x480 + 0xB0, 1, 0x00, + 0xD0, 3, 0x07, 0x40, 0x1D, // Set Power [00 43 18] + 0xD1, 3, 0x00, 0x18, 0x13, // Set VCOM [00 00 00] x0.805, x1.08 + 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22] + 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11] + 0xC5, 1, 0x03, //Frame Rate [03] + 0xC8, 12, 0x00, 0x44, 0x06, 0x44, 0x0A, 0x08, 0x17, 0x33, 0x77, 0x44, 0x08, 0x0C, + 0xE4, 1, 0xA0, + 0xF0, 1, 0x01, + }; + static const uint8_t ILI9481_CMO35_regValues[] PROGMEM = { // 320480 + 0xB0, 1, 0x00, + 0xD0, 3, 0x07, 0x41, 0x1D, // Set Power [00 43 18] 07,41,1D + 0xD1, 3, 0x00, 0x1C, 0x1F, // Set VCOM [00 00 00] x0.825, x1.32 1C,1F + 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22] + 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11] + 0xC5, 1, 0x03, //Frame Rate [03] + 0xC6, 1, 0x83, + 0xC8, 12, 0x00, 0x26, 0x21, 0x00, 0x00, 0x1F, 0x65, 0x23, 0x77, 0x00, 0x0F, 0x00, + 0xF0, 1, 0x01, //? + 0xE4, 1, 0xA0, //?SETCABC on Himax + 0x36, 1, 0x48, //Memory Access [00] + 0xB4, 1, 0x11, + }; + static const uint8_t ILI9481_RGB_regValues[] PROGMEM = { // 320x480 + 0xB0, 1, 0x00, + 0xD0, 3, 0x07, 0x41, 0x1D, // SETPOWER [00 43 18] + 0xD1, 3, 0x00, 0x2B, 0x1F, // SETVCOM [00 00 00] x0.900, x1.32 + 0xD2, 2, 0x01, 0x11, // SETNORPOW for Normal Mode [01 22] + 0xC0, 6, 0x10, 0x3B, 0x00, 0x02, 0x11, 0x00, //SETPANEL [10 3B 00 02 11] + 0xC5, 1, 0x03, //SETOSC Frame Rate [03] + 0xC6, 1, 0x80, //SETRGB interface control + 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, 0x36, 0x77, 0x00, 0x0F, 0x00, + 0xF3, 2, 0x40, 0x0A, + 0xF0, 1, 0x08, + 0xF6, 1, 0x84, + 0xF7, 1, 0x80, + 0x0C, 2, 0x00, 0x55, //RDCOLMOD + 0xB4, 1, 0x00, //SETDISPLAY +// 0xB3, 4, 0x00, 0x01, 0x06, 0x01, //SETGRAM simple example + 0xB3, 4, 0x00, 0x01, 0x06, 0x30, //jpegs example + }; + table8_ads = ILI9481_regValues, table_size = sizeof(ILI9481_regValues); +// table8_ads = ILI9481_CPT29_regValues, table_size = sizeof(ILI9481_CPT29_regValues); +// table8_ads = ILI9481_PVI35_regValues, table_size = sizeof(ILI9481_PVI35_regValues); +// table8_ads = ILI9481_AUO317_regValues, table_size = sizeof(ILI9481_AUO317_regValues); +// table8_ads = ILI9481_CMO35_regValues, table_size = sizeof(ILI9481_CMO35_regValues); +// table8_ads = ILI9481_RGB_regValues, table_size = sizeof(ILI9481_RGB_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + case 0x9486: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //Red 3.5", Blue 3.5" +// _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN; //old Red 3.5" + static const uint8_t ILI9486_regValues[] PROGMEM = { +/* + 0xF2, 9, 0x1C, 0xA3, 0x32, 0x02, 0xB2, 0x12, 0xFF, 0x12, 0x00, //f.k + 0xF1, 2, 0x36, 0xA4, // + 0xF8, 2, 0x21, 0x04, // + 0xF9, 2, 0x00, 0x08, // +*/ + 0xC0, 2, 0x0d, 0x0d, //Power Control 1 [0E 0E] + 0xC1, 2, 0x43, 0x00, //Power Control 2 [43 00] + 0xC2, 1, 0x00, //Power Control 3 [33] + 0xC5, 4, 0x00, 0x48, 0x00, 0x48, //VCOM Control 1 [00 40 00 40] + 0xB4, 1, 0x00, //Inversion Control [00] + 0xB6, 3, 0x02, 0x02, 0x3B, // Display Function Control [02 02 3B] +#define GAMMA9486 4 +#if GAMMA9486 == 0 + // default GAMMA terrible +#elif GAMMA9486 == 1 + // GAMMA f.k. bad + 0xE0, 15, 0x0f, 0x31, 0x2b, 0x0c, 0x0e, 0x08, 0x4e, 0xf1, 0x37, 0x07, 0x10, 0x03, 0x0e, 0x09, 0x00, + 0xE1, 15, 0x00, 0x0e, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0f, 0x0c, 0x31, 0x36, 0x0f, +#elif GAMMA9486 == 2 + // 1.2 CPT 3.5 Inch Initial Code not bad + 0xE0, 15, 0x0F, 0x1B, 0x18, 0x0B, 0x0E, 0x09, 0x47, 0x94, 0x35, 0x0A, 0x13, 0x05, 0x08, 0x03, 0x00, + 0xE1, 15, 0x0F, 0x3A, 0x37, 0x0B, 0x0C, 0x05, 0x4A, 0x24, 0x39, 0x07, 0x10, 0x04, 0x27, 0x25, 0x00, +#elif GAMMA9486 == 3 + // 2.2 HSD 3.5 Inch Initial Code not bad + 0xE0, 15, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + 0xE1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, +#elif GAMMA9486 == 4 + // 3.2 TM 3.2 Inch Initial Code not bad + 0xE0, 15, 0x0F, 0x21, 0x1C, 0x0B, 0x0E, 0x08, 0x49, 0x98, 0x38, 0x09, 0x11, 0x03, 0x14, 0x10, 0x00, + 0xE1, 15, 0x0F, 0x2F, 0x2B, 0x0C, 0x0E, 0x06, 0x47, 0x76, 0x37, 0x07, 0x11, 0x04, 0x23, 0x1E, 0x00, +#elif GAMMA9486 == 5 + // 4.2 WTK 3.5 Inch Initial Code too white + 0xE0, 15, 0x0F, 0x10, 0x08, 0x05, 0x09, 0x05, 0x37, 0x98, 0x26, 0x07, 0x0F, 0x02, 0x09, 0x07, 0x00, + 0xE1, 15, 0x0F, 0x38, 0x36, 0x0D, 0x10, 0x08, 0x59, 0x76, 0x48, 0x0A, 0x16, 0x0A, 0x37, 0x2F, 0x00, +#endif + }; + table8_ads = ILI9486_regValues, table_size = sizeof(ILI9486_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + case 0x7796: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //thanks to safari1 + static const uint8_t PROGMEM ST7796_regValues[] = { + 0xB7, 1, 0xC6, //Entry Mode [06] + 0xE8, 8, 0x40, 0x8A, 0x00, 0x00, 0x29, 0x19, 0xA5, 0x33, //Adj3 [40 8A 00 00 25 0A 38 33] + }; + table8_ads = ST7796_regValues, table_size = sizeof(ST7796_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + //goto common_9488; + case 0x9487: //with thanks to Charlyf + case 0x9488: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + common_9488: + static const uint8_t ILI9488_regValues_max[] PROGMEM = { // Atmel MaxTouch + 0xC0, 2, 0x10, 0x10, //Power Control 1 [0E 0E] + 0xC1, 1, 0x41, //Power Control 2 [43] + 0xC5, 4, 0x00, 0x22, 0x80, 0x40, //VCOM Control 1 [00 40 00 40] + 0x36, 1, 0x68, //Memory Access [00] + 0xB0, 1, 0x00, //Interface [00] + 0xB1, 2, 0xB0, 0x11, //Frame Rate Control [B0 11] + 0xB4, 1, 0x02, //Inversion Control [02] + 0xB6, 3, 0x02, 0x02, 0x3B, // Display Function Control [02 02 3B] .kbv NL=480 + 0xB7, 1, 0xC6, //Entry Mode [06] + 0x3A, 1, 0x55, //Interlace Pixel Format [XX] + 0xF7, 4, 0xA9, 0x51, 0x2C, 0x82, //Adjustment Control 3 [A9 51 2C 82] + }; + table8_ads = ILI9488_regValues_max, table_size = sizeof(ILI9488_regValues_max); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + case 0xB505: //R61505V + case 0xC505: //R61505W + _lcd_capable = 0 | REV_SCREEN | READ_LOWHIGH; + static const uint16_t R61505V_regValues[] PROGMEM = { + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0001, + 0x00A4, 0x0001, //CALB=1 + TFTLCD_DELAY, 10, + 0x0060, 0x2700, //NL + 0x0008, 0x0808, //FP & BP + 0x0030, 0x0214, //Gamma settings + 0x0031, 0x3715, + 0x0032, 0x0604, + 0x0033, 0x0E16, + 0x0034, 0x2211, + 0x0035, 0x1500, + 0x0036, 0x8507, + 0x0037, 0x1407, + 0x0038, 0x1403, + 0x0039, 0x0020, + 0x0090, 0x0015, //DIVI & RTNI + 0x0010, 0x0410, //BT=4,AP=1 + 0x0011, 0x0237, //DC1=2,DC0=3, VC=7 + 0x0029, 0x0046, //VCM1=70 + 0x002A, 0x0046, //VCMSEL=0,VCM2=70 + // Sleep mode IN sequence + 0x0007, 0x0000, + //0x0012, 0x0000, //PSON=0,PON=0 + // Sleep mode EXIT sequence + 0x0012, 0x0189, //VCMR=1,PSON=0,PON=0,VRH=9 + 0x0013, 0x1100, //VDV=17 + TFTLCD_DELAY, 150, + 0x0012, 0x01B9, //VCMR=1,PSON=1,PON=1,VRH=9 [018F] + 0x0001, 0x0100, //SS=1 Other mode settings + 0x0002, 0x0200, //BC0=1--Line inversion + 0x0003, 0x1030, + 0x0009, 0x0001, //ISC=1 [0000] + 0x000A, 0x0000, // [0000] + // 0x000C, 0x0001, //RIM=1 [0000] + 0x000D, 0x0000, // [0000] + 0x000E, 0x0030, //VEM=3 VCOM equalize [0000] + 0x0061, 0x0001, + 0x006A, 0x0000, + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x005F, + 0x0092, 0x0100, + 0x0093, 0x0701, + TFTLCD_DELAY, 80, + 0x0007, 0x0100, //BASEE=1--Display On + }; + init_table16(R61505V_regValues, sizeof(R61505V_regValues)); + break; + +#if defined(SUPPORT_B509_7793) + case 0x7793: + case 0xB509: + _lcd_capable = REV_SCREEN; + static const uint16_t R61509V_regValues[] PROGMEM = { + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + TFTLCD_DELAY, 15, + 0x0400, 0x6200, //NL=0x31 (49) i.e. 400 rows + 0x0008, 0x0808, + //gamma + 0x0300, 0x0C00, + 0x0301, 0x5A0B, + 0x0302, 0x0906, + 0x0303, 0x1017, + 0x0304, 0x2300, + 0x0305, 0x1700, + 0x0306, 0x6309, + 0x0307, 0x0C09, + 0x0308, 0x100C, + 0x0309, 0x2232, + + 0x0010, 0x0016, //69.5Hz 0016 + 0x0011, 0x0101, + 0x0012, 0x0000, + 0x0013, 0x0001, + + 0x0100, 0x0330, //BT,AP + 0x0101, 0x0237, //DC0,DC1,VC + 0x0103, 0x0D00, //VDV + 0x0280, 0x6100, //VCM + 0x0102, 0xC1B0, //VRH,VCMR,PSON,PON + TFTLCD_DELAY, 50, + + 0x0001, 0x0100, + 0x0002, 0x0100, + 0x0003, 0x1030, //1030 + 0x0009, 0x0001, + 0x000C, 0x0000, + 0x0090, 0x8000, + 0x000F, 0x0000, + + 0x0210, 0x0000, + 0x0211, 0x00EF, + 0x0212, 0x0000, + 0x0213, 0x018F, //432=01AF,400=018F + 0x0500, 0x0000, + 0x0501, 0x0000, + 0x0502, 0x005F, //??? + 0x0401, 0x0001, //REV=1 + 0x0404, 0x0000, + TFTLCD_DELAY, 50, + + 0x0007, 0x0100, //BASEE + TFTLCD_DELAY, 50, + + 0x0200, 0x0000, + 0x0201, 0x0000, + }; + init_table16(R61509V_regValues, sizeof(R61509V_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 400; + break; +#endif + +#ifdef SUPPORT_9806 + case 0x9806: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + // from ZinggJM + static const uint8_t ILI9806_regValues[] PROGMEM = { + (0xFF), 3, /* EXTC Command Set enable register*/ 0xFF, 0x98, 0x06, + (0xBA), 1, /* SPI Interface Setting*/0xE0, + (0xBC), 21, /* GIP 1*/0x03, 0x0F, 0x63, 0x69, 0x01, 0x01, 0x1B, 0x11, 0x70, 0x73, 0xFF, 0xFF, 0x08, 0x09, 0x05, 0x00, 0xEE, 0xE2, 0x01, 0x00, 0xC1, + (0xBD), 8, /* GIP 2*/0x01, 0x23, 0x45, 0x67, 0x01, 0x23, 0x45, 0x67, + (0xBE), 9, /* GIP 3*/0x00, 0x22, 0x27, 0x6A, 0xBC, 0xD8, 0x92, 0x22, 0x22, + (0xC7), 1, /* Vcom*/0x1E, + (0xED), 3, /* EN_volt_reg*/0x7F, 0x0F, 0x00, + (0xC0), 3, /* Power Control 1*/0xE3, 0x0B, 0x00, + (0xFC), 1, 0x08, + (0xDF), 6, /* Engineering Setting*/0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + (0xF3), 1, /* DVDD Voltage Setting*/0x74, + (0xB4), 3, /* Display Inversion Control*/0x00, 0x00, 0x00, + (0xF7), 1, /* 480x854*/0x81, + (0xB1), 3, /* Frame Rate*/0x00, 0x10, 0x14, + (0xF1), 3, /* Panel Timing Control*/0x29, 0x8A, 0x07, + (0xF2), 4, /*Panel Timing Control*/0x40, 0xD2, 0x50, 0x28, + (0xC1), 4, /* Power Control 2*/0x17, 0x85, 0x85, 0x20, + (0xE0), 16, 0x00, 0x0C, 0x15, 0x0D, 0x0F, 0x0C, 0x07, 0x05, 0x07, 0x0B, 0x10, 0x10, 0x0D, 0x17, 0x0F, 0x00, + (0xE1), 16, 0x00, 0x0D, 0x15, 0x0E, 0x10, 0x0D, 0x08, 0x06, 0x07, 0x0C, 0x11, 0x11, 0x0E, 0x17, 0x0F, 0x00, + (0x35), 1, /*Tearing Effect ON*/0x00, + }; + table8_ads = ILI9806_regValues, table_size = sizeof(ILI9806_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 854; + break; +#endif + default: + p16 = (int16_t *) & WIDTH; + *p16 = 0; //error value for WIDTH + break; + } + _lcd_rev = ((_lcd_capable & REV_SCREEN) != 0); + if (table8_ads != NULL) { + static const uint8_t reset_off[] PROGMEM = { + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 150, // .kbv will power up with ONLY reset, sleep out, display on + 0x28, 0, //Display Off + 0x3A, 1, 0x55, //Pixel read=565, write=565. + }; + static const uint8_t wake_on[] PROGMEM = { + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 150, + 0x29, 0, //Display On + }; + init_table(&reset_off, sizeof(reset_off)); + init_table(table8_ads, table_size); //can change PIXFMT + init_table(&wake_on, sizeof(wake_on)); + } + setRotation(0); //PORTRAIT + invertDisplay(false); +#if defined(SUPPORT_9488_555) + if (_lcd_ID == 0x9488) { + is555 = 0; + drawPixel(0, 0, 0xFFE0); + if (readPixel(0, 0) == 0xFF1F) { + uint8_t pixfmt = 0x06; + pushCommand(0x3A, &pixfmt, 1); + _lcd_capable &= ~READ_24BITS; + is555 = 1; + } + } +#endif +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.h b/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.h new file mode 100644 index 0000000..db142b8 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/MCUFRIEND_kbv.h @@ -0,0 +1,77 @@ +/* + * MCUFRIEND_kbv class inherits from Adafruit_GFX class and the Arduino Print class. + * Any use of MCUFRIEND_kbv class and examples is dependent on Adafruit and Arduino licenses + * The license texts are in the accompanying license.txt file + */ + +#ifndef MCUFRIEND_KBV_H_ +#define MCUFRIEND_KBV_H_ 299 + +//#define USE_SERIAL + +#if ARDUINO < 101 +#define USE_GFX_KBV +#include "ADA_GFX_kbv.h" +#else +#include "Adafruit_GFX.h" +#endif + +class MCUFRIEND_kbv : public Adafruit_GFX { + + public: +// MCUFRIEND_kbv(int CS=A3, int RS=A2, int WR=A1, int RD=A0, int RST=A4); //shield wiring + MCUFRIEND_kbv(int CS=0, int RS=0, int WR=0, int RD=0, int _RST=0); //dummy arguments + void reset(void); // you only need the constructor + void begin(uint16_t ID = 0x9341); // you only need the constructor + virtual void drawPixel(int16_t x, int16_t y, uint16_t color); // and these three + void WriteCmdData(uint16_t cmd, uint16_t dat); // ?public methods !!! + void pushCommand(uint16_t cmd, uint8_t * block, int8_t N); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3); } + uint16_t readID(void); + virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); + virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { fillRect(x, y, 1, h, color); } + virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { fillRect(x, y, w, 1, color); } + virtual void fillScreen(uint16_t color) { fillRect(0, 0, _width, _height, color); } + virtual void setRotation(uint8_t r); + virtual void invertDisplay(boolean i); + + uint16_t readReg(uint16_t reg, int8_t index=0); + int16_t readGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h); + uint16_t readPixel(int16_t x, int16_t y) { uint16_t color; readGRAM(x, y, &color, 1, 1); return color; } + void setAddrWindow(int16_t x, int16_t y, int16_t x1, int16_t y1); + void pushColors(uint16_t *block, int16_t n, bool first); + void pushColors(uint8_t *block, int16_t n, bool first); + void pushColors(const uint8_t *block, int16_t n, bool first, bool bigend = false); + void vertScroll(int16_t top, int16_t scrollines, int16_t offset); + + protected: + uint32_t readReg32(uint16_t reg); + uint32_t readReg40(uint16_t reg); + uint16_t _lcd_xor, _lcd_capable; + + private: + uint16_t _lcd_ID, _lcd_rev, _lcd_madctl, _lcd_drivOut, _MC, _MP, _MW, _SC, _EC, _SP, _EP; +}; + +// New color definitions. thanks to Bodmer +#define TFT_BLACK 0x0000 /* 0, 0, 0 */ +#define TFT_NAVY 0x000F /* 0, 0, 128 */ +#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define TFT_MAROON 0x7800 /* 128, 0, 0 */ +#define TFT_PURPLE 0x780F /* 128, 0, 128 */ +#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define TFT_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define TFT_BLUE 0x001F /* 0, 0, 255 */ +#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ +#define TFT_CYAN 0x07FF /* 0, 255, 255 */ +#define TFT_RED 0xF800 /* 255, 0, 0 */ +#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ +#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ +#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ +#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define TFT_PINK 0xFC9F + +#endif diff --git a/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.cpp b/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.cpp new file mode 100644 index 0000000..3dc3150 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.cpp @@ -0,0 +1,20 @@ +// this will avoid any library editing +// +// but the sketch must use specific OPENSMART_kbv class constructor + +#define USE_SPECIAL //SPECIAL will use the first match +//#define USE_OPENSMART_SHIELD_PINOUT //deprecated +//select the target board +#define USE_OPENSMART_SHIELD_PINOUT_UNO +#define USE_OPENSMART_SHIELD_PINOUT_MEGA +#define USE_OPENSMART_SHIELD_PINOUT_DUE //thanks Michel53 +//select the target controllers that are not enabled by default +#define SUPPORT_8352A //HX8352A +#define SUPPORT_8352B //HX8352B +#define SUPPORT_9225 //RM68130 + +#include "OPENSMART_kbv.h" //class declaration + +#define MCUFRIEND_kbv OPENSMART_kbv //rename the class scope + +#include "MCUFRIEND_kbv.cpp" //same methods, but with OPENSMART_kbv class scope diff --git a/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.h b/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.h new file mode 100644 index 0000000..543cba3 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/OPENSMART_kbv.h @@ -0,0 +1,78 @@ +/* + * OPENSMART_kbv class inherits from Adafruit_GFX class and the Arduino Print class. + * Any use of OPENSMART_kbv class and examples is dependent on Adafruit and Arduino licenses + * The license texts are in the accompanying license.txt file + */ + +#ifndef OPENSMART_KBV_H_ +#define OPENSMART_KBV_H_ 101 //version number +#define MCUFRIEND_KBV_H_ OPENSMART_KBV_H_ //guard against any MCUFRIEND_kbv.h include + +//#define USE_SERIAL + +#if ARDUINO < 101 +#define USE_GFX_KBV +#include "ADA_GFX_kbv.h" +#else +#include "Adafruit_GFX.h" +#endif + +class OPENSMART_kbv : public Adafruit_GFX { + + public: +// OPENSMART_kbv(int CS=A3, int RS=A2, int WR=A1, int RD=A0, int RST=A4); //shield wiring + OPENSMART_kbv(int CS=0, int RS=0, int WR=0, int RD=0, int _RST=0); //dummy arguments + void reset(void); // you only need the constructor + void begin(uint16_t ID = 0x9341); // you only need the constructor + virtual void drawPixel(int16_t x, int16_t y, uint16_t color); // and these three + void WriteCmdData(uint16_t cmd, uint16_t dat); // ?public methods !!! + void pushCommand(uint16_t cmd, uint8_t * block, int8_t N); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3); } + uint16_t readID(void); + virtual void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); + virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { fillRect(x, y, 1, h, color); } + virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { fillRect(x, y, w, 1, color); } + virtual void fillScreen(uint16_t color) { fillRect(0, 0, _width, _height, color); } + virtual void setRotation(uint8_t r); + virtual void invertDisplay(boolean i); + + uint16_t readReg(uint16_t reg, int8_t index=0); + int16_t readGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h); + uint16_t readPixel(int16_t x, int16_t y) { uint16_t color; readGRAM(x, y, &color, 1, 1); return color; } + void setAddrWindow(int16_t x, int16_t y, int16_t x1, int16_t y1); + void pushColors(uint16_t *block, int16_t n, bool first); + void pushColors(uint8_t *block, int16_t n, bool first); + void pushColors(const uint8_t *block, int16_t n, bool first, bool bigend = false); + void vertScroll(int16_t top, int16_t scrollines, int16_t offset); + + protected: + uint32_t readReg32(uint16_t reg); + uint32_t readReg40(uint16_t reg); + uint16_t _lcd_xor, _lcd_capable; + + private: + uint16_t _lcd_ID, _lcd_rev, _lcd_madctl, _lcd_drivOut, _MC, _MP, _MW, _SC, _EC, _SP, _EP; +}; + +// New color definitions. thanks to Bodmer +#define TFT_BLACK 0x0000 /* 0, 0, 0 */ +#define TFT_NAVY 0x000F /* 0, 0, 128 */ +#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define TFT_MAROON 0x7800 /* 128, 0, 0 */ +#define TFT_PURPLE 0x780F /* 128, 0, 128 */ +#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define TFT_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define TFT_BLUE 0x001F /* 0, 0, 255 */ +#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ +#define TFT_CYAN 0x07FF /* 0, 255, 255 */ +#define TFT_RED 0xF800 /* 255, 0, 0 */ +#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ +#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ +#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ +#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define TFT_PINK 0xFC9F + +#endif diff --git a/Arduino/Libraries/MCUFRIEND_kbv/README.md b/Arduino/Libraries/MCUFRIEND_kbv/README.md new file mode 100644 index 0000000..45ce52b --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/README.md @@ -0,0 +1,30 @@ +#MCUFRIEND_kbv +Library for Uno 2.4, 2.8, 3.5, 3.6, 3.95 inch mcufriend Shields + +1. The Arduino Library Manager should find and install MCUFRIEND_kbv library + +2. Install the Adafruit_GFX library if not already in your User libraries. + +3. Insert your Mcufriend style display shield into UNO. Only 28-pin shields are supported. + +4. Build any of the Examples from the File->Examples->Mcufriend_kbv menu. e.g. + +graphictest_kbv.ino: shows all the methods. + +LCD_ID_readreg.ino: diagnostic check to identify unsupported controllers. + +MCUFRIEND_kbv inherits all the methods from +the Adafruit_GFX class: https://learn.adafruit.com/adafruit-gfx-graphics-library/overview +and Print class: https://www.arduino.cc/en/Serial/Print + +The only "new" methods are hardware related: +vertScroll(), readGRAM(), readPixel(), setAddrWindow(), pushColors(), readID(), begin() + +readReg(), pushCommand() access the controller registers + +The File layout changed with v2.9.3. If replacing a pre-v2.9.3 library: +Please leave IDE. Delete the existing MCUFRIEND_kbv folder. Start the IDE. Install from Library Manager. + +HOW TO INSTALL AND USE: is now in "mcufriend_how_to.txt" + +CHANGE HISTORY: is now in "mcufriend_history.txt" diff --git a/Arduino/Libraries/MCUFRIEND_kbv/TFT_HX8357GLUE.h b/Arduino/Libraries/MCUFRIEND_kbv/TFT_HX8357GLUE.h new file mode 100644 index 0000000..8eacb01 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/TFT_HX8357GLUE.h @@ -0,0 +1,172 @@ +// NOT FOR PUBLIC USE + +#define HX8357_BLACK 0x0000 +#define HX8357_BLUE 0x001F +#define HX8357_RED 0xF800 +#define HX8357_GREEN 0x07E0 +#define HX8357_CYAN 0x07FF +#define HX8357_MAGENTA 0xF81F +#define HX8357_YELLOW 0xFFE0 +#define HX8357_WHITE 0xFFFF + +//#include // Core graphics library +#include // Hardware-specific library +#if !defined(AVR) +#include +#endif + +#include +#include +#include +#include +#include + +const GFXfont *Fonts[] = { + NULL, + NULL, + &FreeSans9pt7b, + NULL, + &FreeSans12pt7b, + NULL, + &FreeSans18pt7b, + &FreeSerifItalic12pt7b, + &FreeMonoBold24pt7b, +}; +#define TFT_BLACK 0x0000 +#define TFT_NAVY 0x000F +#define TFT_DARKGREEN 0x03E0 +#define TFT_DARKCYAN 0x03EF +#define TFT_MAROON 0x7800 +#define TFT_PURPLE 0x780F +#define TFT_OLIVE 0x7BE0 +#define TFT_LIGHTGREY 0xC618 +#define TFT_DARKGREY 0x7BEF +#define TFT_BLUE 0x001F +#define TFT_GREEN 0x07E0 +#define TFT_CYAN 0x07FF +#define TFT_RED 0xF800 +#define TFT_MAGENTA 0xF81F +#define TFT_YELLOW 0xFFE0 +#define TFT_WHITE 0xFFFF +#define TFT_ORANGE 0xFD20 +#define TFT_GREENYELLOW 0xAFE5 +#define TFT_PINK 0xF81F + +#define MC_DATUM 4 + +class TFT_HX8357GLUE : public MCUFRIEND_kbv +{ + public: + TFT_HX8357GLUE() {} + void begin(void) { + init(); + } + void init(void) + { + MCUFRIEND_kbv::reset(); + _ID = MCUFRIEND_kbv::readID(); + if (_ID == 0x00D3 || _ID == 0xD3D3) + _ID = 0x9486; + MCUFRIEND_kbv::begin(_ID); + MCUFRIEND_kbv::setRotation(1); + _first = true; + } + void setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) + { + MCUFRIEND_kbv::setAddrWindow(x0, y0, x1, y1); + _first = true; + } + + void pushColors(uint8_t *data, uint16_t len) + { + MCUFRIEND_kbv::pushColors((uint8_t*)data, len, _first); + _first = false; + } + + void pushColors(uint16_t *data, uint8_t len) + { + MCUFRIEND_kbv::pushColors((uint16_t*)data, len, _first); + _first = false; + } + + void pushColors(uint16_t *data, uint16_t len, int first) + { + MCUFRIEND_kbv::pushColors((uint16_t*)data, len, first); + } + + void pushColor(uint16_t color) + { + uint16_t c = color; + MCUFRIEND_kbv::pushColors(&c, 1, _first); + _first = false; + } + + void setCursor(int16_t x, int16_t y) + { + setCursor(x, y, _font); + } + + void setCursor(int16_t x, int16_t y, uint8_t idx) + { + + const GFXfont *f = Fonts[idx]; + MCUFRIEND_kbv::setFont(f); +// MCUFRIEND_kbv::setCursor(x, y + f->glyph->height); + + MCUFRIEND_kbv::setCursor(x, y); + } + + void setTextFont(uint8_t font) + { + _font = font; + MCUFRIEND_kbv::setFont(Fonts[_font]); + } + + int16_t drawNumber(long long_num, int16_t poX, int16_t poY, int16_t idx) + { + char buf[12]; + ltoa(long_num, buf, 10); + return drawString(buf, poX, poY, idx); + } + + int16_t drawChar(char c, int16_t poX, int16_t poY, int16_t idx) + { + char buf[2]; + buf[0] = c; + buf[1] = 0; + return drawString(buf, poX, poY, idx); + } + + int16_t drawString(char *string, int16_t poX, int16_t poY, int16_t idx) + { + int16_t x1, y1; + uint16_t w, h; + setFont(Fonts[_font = idx]); + getTextBounds(string, poX, poY, &x1, &y1, &w, &h); + fillRect(x1, y1 + h, w, h, 0x0000); + MCUFRIEND_kbv::setCursor(poX, poY + h); + print(string); + return w; + } + int16_t drawCentreString(char *string, int16_t poX, int16_t poY, int16_t idx) + { + int16_t x1, y1; + uint16_t w, h; + setFont(Fonts[_font = idx]); + getTextBounds(string, poX, poY, &x1, &y1, &w, &h); + poX -= w/2; + x1 -= w/2; + fillRect(x1, y1 + h, w, h, 0x0000); + MCUFRIEND_kbv::setCursor(poX, poY + h); + print(string); + return w; +// return drawString(string, dX, poY, idx); + } + void setTextDatum(uint8_t datum) { ; } + void setTextPadding(uint16_t x_width) { ; } + + private: + uint16_t _ID; + uint8_t _font, _first; +}; + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/TFT_PRINTGLUE.h b/Arduino/Libraries/MCUFRIEND_kbv/TFT_PRINTGLUE.h new file mode 100644 index 0000000..0a84b7f --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/TFT_PRINTGLUE.h @@ -0,0 +1,233 @@ +// NOT FOR PUBLIC USE + +//#include // Core graphics library +#include // Hardware-specific library +#if !defined(AVR) +#include +#endif + +#include +#include +#include +#include +#include + +const GFXfont *Fonts[] = { + NULL, + NULL, + &FreeSans9pt7b, //FONT2 + NULL, + &FreeSans12pt7b, //FONT4 + NULL, + &FreeSans18pt7b, //FONT6 + &FreeSevenSegNumFontPlusPlus, //FONT7 + &FreeSevenSegNumFontPlusPlus, //FONT8 + // &FreeMonoBold24pt7b, //FONT8 +}; + +//These enumerate the text plotting alignment (reference datum point) +#define TL_DATUM 0 // Top left (default) +#define TC_DATUM 1 // Top centre +#define TR_DATUM 2 // Top right +#define ML_DATUM 3 // Middle left +#define CL_DATUM 3 // Centre left, same as above +#define MC_DATUM 4 // Middle centre +#define CC_DATUM 4 // Centre centre, same as above +#define MR_DATUM 5 // Middle right +#define CR_DATUM 5 // Centre right, same as above +#define BL_DATUM 6 // Bottom left +#define BC_DATUM 7 // Bottom centre +#define BR_DATUM 8 // Bottom right +#define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on) +#define C_BASELINE 10 // Centre character baseline +#define R_BASELINE 11 // Right character baseline + +class TFT_PRINTGLUE : public MCUFRIEND_kbv +{ + public: + TFT_PRINTGLUE() {} + void begin(void) { + init(); + } + void init(void) + { + MCUFRIEND_kbv::reset(); + _ID = MCUFRIEND_kbv::readID(); + if (_ID == 0xD3D3) _ID = 0x9486; + MCUFRIEND_kbv::begin(_ID); + MCUFRIEND_kbv::setRotation(1); + _first = true; + _datum = TL_DATUM; + } + void setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) + { + MCUFRIEND_kbv::setAddrWindow(x0, y0, x1, y1); + _first = true; + } + + void pushColors(uint8_t *data, uint16_t len) + { + MCUFRIEND_kbv::pushColors((uint8_t*)data, len, _first); + _first = false; + } + + void pushColors(uint16_t *data, uint8_t len) + { + MCUFRIEND_kbv::pushColors((uint16_t*)data, len, _first); + _first = false; + } + + void pushColors(uint16_t *data, uint16_t len, int first) + { + MCUFRIEND_kbv::pushColors((uint16_t*)data, len, first); + } + + void pushColor(uint16_t color) + { + uint16_t c = color; + MCUFRIEND_kbv::pushColors(&c, 1, _first); + _first = false; + } + + void setCursor(int16_t x, int16_t y, uint8_t idx = 255) + { + if (idx == 255) idx = _font; //use current font + setTextFont(idx); + MCUFRIEND_kbv::setCursor(x, y + _ydatum); + } + + void setFreeFont(const GFXfont *pfont) + { + _font = 1; + _ascent = 7; + _descent = 1; + MCUFRIEND_kbv::setFont(_pfont = pfont); + if (pfont != NULL) { + int16_t x = 0, y = 0, x1, y1 = 0, x2, y2 = 0; + MCUFRIEND_kbv::setTextSize(1); + charBounds('0', &x, &y, &x1, &y1, &x2, &y2); + _ascent = y2 - y1; //yAdvance + GFXfont f; + memcpy_P(&f, _pfont, sizeof(f)); + if (f.last >= '{' && '{' >= f.first) { + charBounds('{', &x, &y, &x1, &y1, &x2, &y2); + _descent = y2 - y1 + 1 - _ascent; // + } + } + setTextDatum(_datum); + } + + int16_t drawNumber(long long_num, int16_t poX, int16_t poY, uint8_t idx) + { + char buf[12]; + ltoa(long_num, buf, 10); + return drawString(buf, poX, poY, idx); + } + + int16_t drawChar(char c, int16_t poX, int16_t poY, uint8_t idx) + { + char buf[2]; + buf[0] = c; + buf[1] = 0; + return drawString(buf, poX, poY, idx); + } + + int16_t drawString(const char *string, int16_t poX, int16_t poY, uint8_t idx) + { + int16_t x1, y1; + uint16_t w, h; + setTextFont(idx); + getTextBounds(string, 0, 50, &x1, &y1, &w, &h); //assume no newlines + w += x1; + x1 = poX; + uint16_t xpad = (_padding > w) ? _padding : w; + switch (_datum) { + case TC_DATUM: + case MC_DATUM: + case BC_DATUM: + case C_BASELINE: + poX -= w / 2; + x1 -= xpad / 2; + break; + case TR_DATUM: + case MR_DATUM: + case BR_DATUM: + case R_BASELINE: + poX -= w; + x1 -= xpad; + break; + } + if (textcolor != textbgcolor) fillRect(x1, poY + _ydatum - _ascent, xpad, _ascent + _descent, textbgcolor); + MCUFRIEND_kbv::setCursor(poX, poY + _ydatum); + print(string); + return w; + } + int16_t drawCentreString(const char *string, int16_t poX, int16_t poY, uint8_t idx) + { + uint8_t datum = _datum; + setTextDatum(TC_DATUM); + uint16_t len = drawString(string, poX, poY, idx); + setTextDatum(datum); + return len; + } + int16_t drawRightString(const char *string, int16_t poX, int16_t poY, uint8_t idx) + { + uint8_t datum = _datum; + setTextDatum(TR_DATUM); + uint16_t len = drawString(string, poX, poY, idx); + setTextDatum(datum); + return len; + } + int16_t drawFloat(float fp_num, uint8_t dec, int16_t poX, int16_t poY, int16_t idx) + { + char buf[12]; + dtostrf(fp_num, 0, dec, buf); + return drawString(buf, poX, poY, idx); + } + + void setTextDatum(uint8_t datum) { + _padding = 0; + switch (_datum = datum) { + case TL_DATUM: + case TR_DATUM: + case TC_DATUM: + _ydatum = _ascent; + break; + case ML_DATUM: + case MR_DATUM: + case MC_DATUM: + _ydatum = _ascent / 2; + break; + case BL_DATUM: + case BR_DATUM: + case BC_DATUM: + _ydatum = -_descent; + break; + case L_BASELINE: + case R_BASELINE: + case C_BASELINE: + _ydatum = 0; + break; + } + } + void setTextPadding(uint16_t x_width) { + _padding = x_width; + } + uint8_t fontHeight(uint8_t idx) { + GFXfont f; + memcpy_P(&f, _pfont, sizeof(f)); + return f.yAdvance; + } + void setTextFont(uint8_t idx) + { + if (_font == idx) return; + _font = idx; + setFreeFont(Fonts[_font]); + } + + private: + uint16_t _ID, _padding; + uint8_t _font, _first, _datum, _ascent, _descent; + int8_t _ydatum; + const GFXfont *_pfont; +}; diff --git a/Arduino/Libraries/MCUFRIEND_kbv/UTFTGLUE.h b/Arduino/Libraries/MCUFRIEND_kbv/UTFTGLUE.h new file mode 100644 index 0000000..d3dfa88 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/UTFTGLUE.h @@ -0,0 +1,198 @@ +/* + * utftglue.h @@@@@@@@@@@@@@@@@@@@@@@@ LIBRARY @@@@@@@@@@@@@@@@@@@@@@@@@ + * + * Created: 12/05/2019 14:25:06 + * Author: David Prentice + * + * 1. replace "UTFT.h" with "UTFTGLUE.h" + * 2. replace UTFT constructor with UTFTGLUE(model_ID, 0,0,0,0,0) + * 3. remove smallFont, BigFont, SeveSegNumFont declarations + * 4. UTFTGLUE uses FreeFonts or NULL (System 5x7) + * + * 5. knows FreeSmallFont, FreeBigFont and FreeSevenSegNumFont + * 6. any other Fonts just need to #include "FreeOtherXXX.h" + * 7. #define OtherXXX &FreeOtherXXX + */ + +#warning @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@ + +#ifndef UTFTGLUE_H_ +#define UTFTGLUE_H_ + +#define LEFT 0 +#define RIGHT 9999 +#define CENTER 9998 + +#define PORTRAIT 0 +#define LANDSCAPE 1 + +#include + +#include +#if defined(__arm__) && !defined(TEENSYDUINO) +#include +#endif + +#include +#define SmallFont &FreeSmallFont +#define BigFont &FreeBigFont +#define SevenSegNumFont &FreeSevenSegNumFont + +class UTFTGLUE : public MCUFRIEND_kbv +{ + public: +// UTFTGLUE() : MCUFRIEND_kbv() {} + UTFTGLUE(int model_ID, int RS, int WR,int CS, int RST, int RD = A0) + : MCUFRIEND_kbv(CS, RS, WR, RD, RST) { _model_ID = model_ID; } + void InitLCD(byte orientation=LANDSCAPE) { + MCUFRIEND_kbv::reset(); + uint16_t ID = MCUFRIEND_kbv::readID(); +// if (ID == 0) ID = 0x9341; //DealExtreme with EXTC=0 +// if (ID == 0x8989) ID = 0x1289; +// if (ID == 0xD3D3) ID = 0x9481; //write-only controller +// if (ID == 0xD3D3) ID = 0x9486; //write-only controller + if (ID == 0xD3D3) ID = 0x9090; //write-only controller HX8357-D +// if (ID == 0x9327 && orientation == LANDSCAPE) orientation = 3; + MCUFRIEND_kbv::begin(ID); + MCUFRIEND_kbv::setRotation(_orient = orientation); + _radius = 4; + } + void clrScr() { MCUFRIEND_kbv::fillScreen(0x0000);} + void drawPixel(int x, int y) { MCUFRIEND_kbv::drawPixel(x, y, _fcolor);} + void drawLine(int x1, int y1, int x2, int y2) { MCUFRIEND_kbv::drawLine(x1, y1, x2, y2, _fcolor);} + void fillScr(uint16_t color) { MCUFRIEND_kbv::fillScreen(color);} + void fillScr(byte r, byte g, byte b) { MCUFRIEND_kbv::fillScreen(setrgb(r, g, b));} + void drawRect(int x1, int y1, int x2, int y2) { + int w = x2 - x1 + 1, h = y2 - y1 + 1; + if (w < 0) { x1 = x2; w = -w; } + if (h < 0) { y1 = y2; h = -h; } + MCUFRIEND_kbv::drawRect(x1, y1, w, h, _fcolor); + } + void drawRoundRect(int x1, int y1, int x2, int y2) { + int w = x2 - x1 + 1, h = y2 - y1 + 1; + if (w < 0) { x1 = x2; w = -w; } + if (h < 0) { y1 = y2; h = -h; } + MCUFRIEND_kbv::drawRoundRect(x1, y1, w, h, _radius, _fcolor); + } + void fillRect(int x1, int y1, int x2, int y2) { + int w = x2 - x1 + 1, h = y2 - y1 + 1; + if (w < 0) { x1 = x2; w = -w; } + if (h < 0) { y1 = y2; h = -h; } + MCUFRIEND_kbv::fillRect(x1, y1, w, h, _fcolor); + } + void fillRoundRect(int x1, int y1, int x2, int y2) { + int w = x2 - x1 + 1, h = y2 - y1 + 1; + if (w < 0) { x1 = x2; w = -w; } + if (h < 0) { y1 = y2; h = -h; } + MCUFRIEND_kbv::fillRoundRect(x1, y1, w, h, _radius, _fcolor); + } + void drawCircle(int x, int y, int radius) { MCUFRIEND_kbv::drawCircle(x, y, radius, _fcolor);} + void fillCircle(int x, int y, int radius) { MCUFRIEND_kbv::fillCircle(x, y, radius, _fcolor);} + void setColor(byte r, byte g, byte b) { setColor(setrgb(r, g, b));} + void setColor(uint16_t c) { MCUFRIEND_kbv::setTextColor(_fcolor = c, _bcolor); } + void setBackColor(byte r, byte g, byte b) { setBackColor(setrgb(r, g, b)); } + void setBackColor(uint32_t c) { + if (c == 0xFFFFFFFF) _bcolor = _fcolor; + else _bcolor = c; + MCUFRIEND_kbv::setTextColor(_fcolor, _bcolor); + } + void print(const char *st, int x, int y, int deg=0) { + settextcursor((char*)st, x, y); MCUFRIEND_kbv::print(st);} + void print(char *st, int x, int y, int deg=0) { + settextcursor(st, x, y); MCUFRIEND_kbv::print(st);} + void print(String st, int x, int y, int deg=0) { + settextcursor((char*)(st.c_str()), x, y); MCUFRIEND_kbv::print(st);} + void printNumI(long num, int x, int y, int length=0, char filler=' ') { + printNumF(num, 0, x, y, '.', length, filler); + } + void printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ') { + char buf[20]; + dtostrf(num, length, dec, buf); + for (int i = 0; buf[i] == ' '; i++) buf[i] = filler; + settextcursor(buf, x, y, length * _dig_wid * MCUFRIEND_kbv::textsize_x); + MCUFRIEND_kbv::print(buf); + } + void setTextSize(int sz) { MCUFRIEND_kbv::setTextSize(gfxFont == NULL ? sz : 1); } // ####### GFX ######## + void setFont(const GFXfont* font) { + MCUFRIEND_kbv::setFont(font); + _ascend = 8; + _descend = 1; + _dig_wid = 6; + if (font != NULL) { + int16_t x = 0, y = 0, x1, y1 = 0, x2, y2 = 0; + MCUFRIEND_kbv::setTextSize(1); + charBounds('0', &x, &y, &x1, &y1, &x2, &y2); + _ascend = y2 - y1; //yAdvance + _dig_wid = x; //xAdvance + } + } + void drawBitmap(int x, int y, int sx, int sy, const uint16_t *data, int scale=1) { + uint16_t color; + MCUFRIEND_kbv::setAddrWindow(x, y, x + sx*scale - 1, y + sy*scale - 1); + if (scale == 1) MCUFRIEND_kbv::pushColors((const uint8_t*)data, sx * sy, 1); + else { + for (int row = 0; row < sy; row++) { + for (int col = 0; col < sx; col++) { + color = pgm_read_word(data + (row*sx + col)*1); + MCUFRIEND_kbv::fillRect(x+col*scale, y+row*scale, scale, scale, color); + } + } + } + } +// void drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy); +// void lcdOff(); +// void lcdOn(); + void setContrast(char c) {} + int getDisplayXSize() { return MCUFRIEND_kbv::width(); } + int getDisplayYSize() { return MCUFRIEND_kbv::height(); } + void setBrightness(byte br) {} +// void LCD_Write_DATA(char VH,char VL); +// void dispBitmap(File inFile); + uint8_t _ascend, _descend, _dig_wid; + uint16_t _model_ID; + + protected: + uint16_t _fcolor; + uint16_t _bcolor; +// uint8_t _ascend, _descend, _dig_wid; + uint8_t _radius; + uint8_t _orient; + void settextcursor(char *st, int x, int y, int pad = 0) { + int16_t pos, x1, y1; + uint16_t len, w, h; + bool is_gfx = (MCUFRIEND_kbv::gfxFont != NULL); + getTextBounds(st, 0, 0, &x1, &y1, &w, &h); //always + len = x1 + w + 0; // assumes the final right padding = 1. + if (pad >= len) pad = pad - len; + pos = (MCUFRIEND_kbv::width() - len - pad); + if (x == CENTER) x = pos/2; + else if (x == RIGHT) x = pos - 1; + if (is_gfx) { //only GFX fonts need to paint background + h = _ascend + _descend; //pgm_read_byte(&gfxFont->yAdvance); + if (_fcolor != _bcolor) MCUFRIEND_kbv::fillRect(x, y, len + pad + 1, h, _bcolor); + y += h; + } + MCUFRIEND_kbv::setCursor(x + pad, y); + } + uint16_t setrgb(byte r, byte g, byte b) { return ((r&0xF8) << 8) | ((g&0xFC) << 3) | (b>>3);} +}; + +#define VGA_BLACK 0x0000 +#define VGA_WHITE 0xFFFF +#define VGA_RED 0xF800 +#define VGA_GREEN 0x0400 +#define VGA_BLUE 0x001F +#define VGA_SILVER 0xC618 +#define VGA_GRAY 0x8410 +#define VGA_MAROON 0x8000 +#define VGA_YELLOW 0xFFE0 +#define VGA_OLIVE 0x8400 +#define VGA_LIME 0x07E0 +#define VGA_AQUA 0x07FF +#define VGA_TEAL 0x0410 +#define VGA_NAVY 0x0010 +#define VGA_FUCHSIA 0xF81F +#define VGA_PURPLE 0x8010 +#define VGA_TRANSPARENT 0xFFFFFFFF + +#endif /* UTFTGLUE_H_ */ \ No newline at end of file diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/Font_simple/Font_simple.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/Font_simple/Font_simple.ino new file mode 100644 index 0000000..79e7988 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/Font_simple/Font_simple.ino @@ -0,0 +1,68 @@ +#include // Core graphics library +#include // Hardware-specific library +MCUFRIEND_kbv tft; + +#include +#include +#include + +#include + +#define BLACK 0x0000 +#define RED 0xF800 +#define GREEN 0x07E0 +#define WHITE 0xFFFF +#define GREY 0x8410 + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + Serial.println("Example: Font_simple"); + Serial.print("found ID = 0x"); + Serial.println(ID, HEX); + if (ID == 0xD3D3) ID = 0x9481; //force ID if write-only display + tft.begin(ID); + tft.setRotation(0); +} + +void loop(void) +{ + tft.fillScreen(BLACK); + showmsgXY(20, 10, 1, NULL, "System x1"); + showmsgXY(20, 24, 2, NULL, "System x2"); + showmsgXY(20, 60, 1, &FreeSans9pt7b, "FreeSans9pt7b"); + showmsgXY(20, 80, 1, &FreeSans12pt7b, "FreeSans12pt7b"); + showmsgXY(20, 100, 1, &FreeSerif12pt7b, "FreeSerif12pt7b"); + showmsgXY(20, 120, 1, &FreeSmallFont, "FreeSmallFont"); + showmsgXY(5, 180, 1, &FreeSevenSegNumFont, "01234"); + showmsgXY(5, 190, 1, NULL, "System Font is drawn from topline"); + tft.setTextColor(RED, GREY); + tft.setTextSize(2); + tft.setCursor(0, 220); + tft.print("7x5 can overwrite"); + delay(1000); + tft.setCursor(0, 220); + tft.print("if background set"); + delay(1000); + showmsgXY(5, 260, 1, &FreeSans9pt7b, "Free Fonts from baseline"); + showmsgXY(5, 285, 1, &FreeSans9pt7b, "Free Fonts transparent"); + delay(1000); + showmsgXY(5, 285, 1, &FreeSans9pt7b, "Free Fonts XXX"); + delay(1000); + showmsgXY(5, 310, 1, &FreeSans9pt7b, "erase backgnd with fillRect()"); + delay(10000); +} + +void showmsgXY(int x, int y, int sz, const GFXfont *f, const char *msg) +{ + int16_t x1, y1; + uint16_t wid, ht; + tft.drawFastHLine(0, y, tft.width(), WHITE); + tft.setFont(f); + tft.setCursor(x, y); + tft.setTextColor(GREEN); + tft.setTextSize(sz); + tft.print(msg); + delay(1000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino new file mode 100644 index 0000000..b09e53c --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_220x176/GLUE_Demo_220x176.ino @@ -0,0 +1,342 @@ +// UTFT_Demo_220x176 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 220x176 pixels. +// +// This program requires the UTFT library. +// + +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args + +// Declare which fonts we will be using +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB22,A5,A4,A3,A2); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(); + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[218]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 219, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 162, 219, 175); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("** Universal TFT Library **", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("> Rinky-Dink Electronics <", CENTER, 163); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 219, 161); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(109, 15, 109, 160); + myGLCD.drawLine(1, 88, 218, 88); + + for (int i=9; i<210; i+=10) + myGLCD.drawLine(i, 86, i, 90); + for (int i=19; i<155; i+=10) + myGLCD.drawLine(107, i, 111, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(sin(((i*1.65)*3.14)/180)*70)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(cos(((i*1.65)*3.14)/180)*70)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<218; i++) + { + myGLCD.drawPixel(i,88+(tan(((i*1.65)*3.14)/180))); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(109, 15, 109, 160); + myGLCD.drawLine(1, 88, 218, 88); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(218*20); i++) + { + x++; + if (x==219) + x=1; + if (i>219) + { + if ((x==109)||(buf[x-1]==88)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=88+(sin(((i*1.6)*3.14)/180)*(65-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRect(44+(i*15), 23+(i*15), 88+(i*15), 63+(i*15)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled, rounded rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRoundRect(132-(i*15), 23+(i*15), 172-(i*15), 63+(i*15)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some filled circles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillCircle(64+(i*15),43+(i*15), 20); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<160; i+=5) + { + myGLCD.drawLine(1, i, (i*1.44)-10, 160); + } + myGLCD.setColor (255,0,0); + for (int i=160; i>15; i-=5) + { + myGLCD.drawLine(218, i, (i*1.44)-12, 15); + } + myGLCD.setColor (0,255,255); + for (int i=160; i>15; i-=5) + { + myGLCD.drawLine(1, i, 232-(i*1.44), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<160; i+=5) + { + myGLCD.drawLine(218, i, 231-(i*1.44), 160); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random circles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=22+random(176); + y=35+random(105); + r=random(20); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + +// Draw some random rounded rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(216); + y=16+random(143); + x2=2+random(216); + y2=16+random(143); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,218,160); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(216), 16+random(143)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(40, 57, 179, 119); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 62); + myGLCD.print("Restarting in a", CENTER, 88); + myGLCD.print("few seconds...", CENTER, 101); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 146); + myGLCD.printNumI(millis(), CENTER, 161); + + delay (10000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino new file mode 100644 index 0000000..7d06205 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_320x240/GLUE_Demo_320x240.ino @@ -0,0 +1,341 @@ +// UTFT_Demo_320x240 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 320x240 pixels. +// +// This program requires the UTFT library. +// + +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args + +// Declare which fonts we will be using +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB32S,38,39,40,41); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(); + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[318]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 319, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 226, 319, 239); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("", CENTER, 227); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 319, 225); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(159, 15, 159, 224); + myGLCD.drawLine(1, 119, 318, 119); + for (int i=9; i<310; i+=10) + myGLCD.drawLine(i, 117, i, 121); + for (int i=19; i<220; i+=10) + myGLCD.drawLine(157, i, 161, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<318; i++) + { + myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<318; i++) + { + myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<318; i++) + { + myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180))); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(159, 15, 159, 224); + myGLCD.drawLine(1, 119, 318, 119); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(318*20); i++) + { + x++; + if (x==319) + x=1; + if (i>319) + { + if ((x==159)||(buf[x-1]==119)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some filled rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRect(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some filled, rounded rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRoundRect(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some filled circles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillCircle(100+(i*20),60+(i*20), 30); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<224; i+=5) + { + myGLCD.drawLine(1, i, (i*1.44)-10, 224); + } + myGLCD.setColor (255,0,0); + for (int i=224; i>15; i-=5) + { + myGLCD.drawLine(318, i, (i*1.44)-11, 15); + } + myGLCD.setColor (0,255,255); + for (int i=224; i>15; i-=5) + { + myGLCD.drawLine(1, i, 331-(i*1.44), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<224; i+=5) + { + myGLCD.drawLine(318, i, 330-(i*1.44), 224); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some random circles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=32+random(256); + y=45+random(146); + r=random(30); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some random rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(316); + y=16+random(207); + x2=2+random(316); + y2=16+random(207); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + +// Draw some random rounded rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(316); + y=16+random(207); + x2=2+random(316); + y2=16+random(207); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(316); + y=16+random(209); + x2=2+random(316); + y2=16+random(209); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,318,224); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(316), 16+random(209)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(80, 70, 239, 169); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 93); + myGLCD.print("Restarting in a", CENTER, 119); + myGLCD.print("few seconds...", CENTER, 132); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 210); + myGLCD.printNumI(millis(), CENTER, 225); + + delay (10000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino new file mode 100644 index 0000000..e89af66 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_400x240/GLUE_Demo_400x240.ino @@ -0,0 +1,343 @@ +// UTFT_Demo_400x240 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 400x240 pixels. +// +// This program requires the UTFT library. +// + +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args + +// Declare which fonts we will be using +//extern uint8_t SmallFont[]; + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB32WD,38,39,40,41); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(); + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[398]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 399, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 226, 399, 239); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("*** Universal Color TFT Display Library ***", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("< http://www.RinkyDinkElectronics.com/ >", CENTER, 227); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 399, 225); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(199, 15, 199, 224); + myGLCD.drawLine(1, 119, 398, 119); + for (int i=9; i<390; i+=10) + myGLCD.drawLine(i, 117, i, 121); + for (int i=19; i<220; i+=10) + myGLCD.drawLine(197, i, 201, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<398; i++) + { + myGLCD.drawPixel(i,119+(sin(((i*0.9)*3.14)/180)*95)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<398; i++) + { + myGLCD.drawPixel(i,119+(cos(((i*0.9)*3.14)/180)*95)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<398; i++) + { + y=119+(tan(((i*0.9)*3.14)/180)); + if ((y>15) && (y<224)) + myGLCD.drawPixel(i,y); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(199, 15, 199, 224); + myGLCD.drawLine(1, 119, 398, 119); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(398*20); i++) + { + x++; + if (x==399) + x=1; + if (i>399) + { + if ((x==199)||(buf[x-1]==119)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=119+(sin(((i)*3.14)/180)*(90-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some filled rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRect(110+(i*20), 30+(i*20), 170+(i*20), 90+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some filled, rounded rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRoundRect(230-(i*20), 30+(i*20), 290-(i*20), 90+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some filled circles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillCircle(110+(i*30),60+(i*20), 30); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<224; i+=5) + { + myGLCD.drawLine(1, i, (i*1.77)-10, 224); + } + myGLCD.setColor (255,0,0); + for (int i=224; i>15; i-=5) + { + myGLCD.drawLine(398, i, (i*1.77)-11, 15); + } + myGLCD.setColor (0,255,255); + for (int i=224; i>15; i-=5) + { + myGLCD.drawLine(1, i, 411-(i*1.77), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<224; i+=5) + { + myGLCD.drawLine(398, i, 410-(i*1.77), 224); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some random circles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=32+random(336); + y=45+random(146); + r=random(30); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some random rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(396); + y=16+random(207); + x2=2+random(396); + y2=16+random(207); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + +// Draw some random rounded rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(396); + y=16+random(207); + x2=2+random(396); + y2=16+random(207); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(396); + y=16+random(209); + x2=2+random(396); + y2=16+random(209); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,398,224); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(396), 16+random(209)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(120, 70, 279, 169); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 93); + myGLCD.print("Restarting in a", CENTER, 119); + myGLCD.print("few seconds...", CENTER, 132); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 210); + myGLCD.printNumI(millis(), CENTER, 225); + + delay (10000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino new file mode 100644 index 0000000..8ee943e --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_480x320/GLUE_Demo_480x320.ino @@ -0,0 +1,341 @@ +// UTFT_Demo_480x320 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 480x320 pixels. +// +// This program requires the UTFT library. +// + +//################################################ +// GLUE class that implements the UTFT API +// replace UTFT include and constructor statements +// remove UTFT font declaration e.g. SmallFont +//################################################ + +#include //use GLUE class and constructor +UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args + +// Declare which fonts we will be using +//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(CTE32HR,38,39,40,41); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(); + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[478]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 479, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 306, 479, 319); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("", CENTER, 307); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 479, 305); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(239, 15, 239, 304); + myGLCD.drawLine(1, 159, 478, 159); + for (int i=9; i<470; i+=10) + myGLCD.drawLine(i, 157, i, 161); + for (int i=19; i<220; i+=10) + myGLCD.drawLine(237, i, 241, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<478; i++) + { + myGLCD.drawPixel(i,159+(sin(((i*1.13)*3.14)/180)*95)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<478; i++) + { + myGLCD.drawPixel(i,159+(cos(((i*1.13)*3.14)/180)*95)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<478; i++) + { + myGLCD.drawPixel(i,159+(tan(((i*1.13)*3.14)/180))); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(239, 15, 239, 304); + myGLCD.drawLine(1, 159, 478, 159); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(478*15); i++) + { + x++; + if (x==479) + x=1; + if (i>479) + { + if ((x==239)||(buf[x-1]==159)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=159+(sin(((i*0.7)*3.14)/180)*(90-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some filled rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRect(150+(i*20), 70+(i*20), 210+(i*20), 130+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some filled, rounded rectangles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillRoundRect(270-(i*20), 70+(i*20), 330-(i*20), 130+(i*20)); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some filled circles + for (int i=1; i<6; i++) + { + switch (i) + { + case 1: + myGLCD.setColor(255,0,255); + break; + case 2: + myGLCD.setColor(255,0,0); + break; + case 3: + myGLCD.setColor(0,255,0); + break; + case 4: + myGLCD.setColor(0,0,255); + break; + case 5: + myGLCD.setColor(255,255,0); + break; + } + myGLCD.fillCircle(180+(i*20),100+(i*20), 30); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<304; i+=5) + { + myGLCD.drawLine(1, i, (i*1.6)-10, 304); + } + myGLCD.setColor (255,0,0); + for (int i=304; i>15; i-=5) + { + myGLCD.drawLine(478, i, (i*1.6)-11, 15); + } + myGLCD.setColor (0,255,255); + for (int i=304; i>15; i-=5) + { + myGLCD.drawLine(1, i, 491-(i*1.6), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<304; i+=5) + { + myGLCD.drawLine(478, i, 490-(i*1.6), 304); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some random circles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=32+random(416); + y=45+random(226); + r=random(30); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some random rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(476); + y=16+random(289); + x2=2+random(476); + y2=16+random(289); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + +// Draw some random rounded rectangles + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(476); + y=16+random(289); + x2=2+random(476); + y2=16+random(289); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + + for (int i=0; i<100; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(476); + y=16+random(289); + x2=2+random(476); + y2=16+random(289); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,478,304); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(476), 16+random(289)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(160, 70, 319, 169); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 93); + myGLCD.print("Restarting in a", CENTER, 119); + myGLCD.print("few seconds...", CENTER, 132); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 290); + myGLCD.printNumI(millis(), CENTER, 305); + + delay (10000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_800x480/GLUE_Demo_800x480.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_800x480/GLUE_Demo_800x480.ino new file mode 100644 index 0000000..1a9ff43 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/GLUE_Demo_800x480/GLUE_Demo_800x480.ino @@ -0,0 +1,296 @@ +// UTFT_Demo_800x480 +// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved +// web: http://www.RinkyDinkElectronics.com/ +// +// This program is a demo of how to use most of the functions +// of the library with a supported display modules. +// +// This demo was made for modules with a screen resolution +// of 800x480 pixels. +// +// This program requires the UTFT library. +// + +#include +#include +UTFTGLUE myGLCD(0x9163,A2,A1,A3,A4,A0); //arguments are ignored + +// Declare which fonts we will be using +extern uint8_t SmallFont[]; + +// Set the pins to the correct ones for your development shield +// ------------------------------------------------------------ +// Arduino Uno / 2009: +// ------------------- +// Standard Arduino Uno/2009 shield : ,A5,A4,A3,A2 +// DisplayModule Arduino Uno TFT shield : ,A5,A4,A3,A2 +// +// Arduino Mega: +// ------------------- +// Standard Arduino Mega/Due shield : ,38,39,40,41 +// CTE TFT LCD/SD Shield for Arduino Mega : ,38,39,40,41 +// +// Remember to change the model parameter to suit your display module! +//UTFT myGLCD(ITDB50,38,39,40,41); + +void setup() +{ + randomSeed(analogRead(0)); + +// Setup the LCD + myGLCD.InitLCD(PORTRAIT); //800x480 is already wider than tall. + myGLCD.setFont(SmallFont); +} + +void loop() +{ + int buf[798]; + int x, x2; + int y, y2; + int r; + +// Clear the screen and draw the frame + myGLCD.clrScr(); + + myGLCD.setColor(255, 0, 0); + myGLCD.fillRect(0, 0, 799, 13); + myGLCD.setColor(64, 64, 64); + myGLCD.fillRect(0, 466, 799, 479); + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1); + myGLCD.setBackColor(64, 64, 64); + myGLCD.setColor(255,255,0); + myGLCD.print("", CENTER, 467); + + myGLCD.setColor(0, 0, 255); + myGLCD.drawRect(0, 14, 799, 465); + +// Draw crosshairs + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(399, 15, 399, 464); + myGLCD.drawLine(1, 239, 798, 239); + for (int i=9; i<790; i+=10) + myGLCD.drawLine(i, 237, i, 242); + for (int i=19; i<470; i+=10) + myGLCD.drawLine(397, i, 402, i); + +// Draw sin-, cos- and tan-lines + myGLCD.setColor(0,255,255); + myGLCD.print("Sin", 5, 15); + for (int i=1; i<798; i++) + { + myGLCD.drawPixel(i,239+(sin(((i*1.13)*3.14)/180)*200)); + } + + myGLCD.setColor(255,0,0); + myGLCD.print("Cos", 5, 27); + for (int i=1; i<798; i++) + { + myGLCD.drawPixel(i,239+(cos(((i*1.13)*3.14)/180)*200)); + } + + myGLCD.setColor(255,255,0); + myGLCD.print("Tan", 5, 39); + for (int i=1; i<798; i++) + { + myGLCD.drawPixel(i,239+(tan(((i*0.9)*3.14)/180))); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + myGLCD.setColor(0, 0, 255); + myGLCD.setBackColor(0, 0, 0); + myGLCD.drawLine(399, 15, 399, 464); + myGLCD.drawLine(1, 239, 798, 239); + +// Draw a moving sinewave + x=1; + for (int i=1; i<(798*20); i++) + { + x++; + if (x==799) + x=1; + if (i>799) + { + if ((x==399)||(buf[x-1]==239)) + myGLCD.setColor(0,0,255); + else + myGLCD.setColor(0,0,0); + myGLCD.drawPixel(x,buf[x-1]); + } + myGLCD.setColor(0,255,255); + y=239+(sin(((i*1.65)*3.14)/180)*(200-(i / 100))); + myGLCD.drawPixel(x,y); + buf[x-1]=y; + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random filled rectangles + for (int i=0; i<50; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(746); + y=16+random(397); + x2=x+50; + y2=y+50; + myGLCD.fillRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random filled, rounded rectangles + for (int i=0; i<50; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(746); + y=16+random(397); + x2=x+50; + y2=y+50; + myGLCD.fillRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random filled circles + for (int i=0; i<50; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=27+random(746); + y=41+random(397); + myGLCD.fillCircle(x, y, 25); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some lines in a pattern + myGLCD.setColor (255,0,0); + for (int i=15; i<463; i+=5) + { + myGLCD.drawLine(1, i, (i*1.66)-10, 463); + } + myGLCD.setColor (255,0,0); + for (int i=463; i>15; i-=5) + { + myGLCD.drawLine(798, i, (i*1.66)+30, 15); + } + myGLCD.setColor (0,255,255); + for (int i=463; i>15; i-=5) + { + myGLCD.drawLine(1, i, 770-(i*1.66), 15); + } + myGLCD.setColor (0,255,255); + for (int i=15; i<463; i+=5) + { + myGLCD.drawLine(798, i, 810-(i*1.66), 463); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random circles + for (int i=0; i<250; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=32+random(736); + y=45+random(386); + r=random(30); + myGLCD.drawCircle(x, y, r); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random rectangles + for (int i=0; i<250; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(796); + y=16+random(447); + x2=2+random(796); + y2=16+random(447); + myGLCD.drawRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + +// Draw some random rounded rectangles + for (int i=0; i<250; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(796); + y=16+random(447); + x2=2+random(796); + y2=16+random(447); + myGLCD.drawRoundRect(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + + for (int i=0; i<250; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + x=2+random(796); + y=16+random(447); + x2=2+random(796); + y2=16+random(447); + myGLCD.drawLine(x, y, x2, y2); + } + + delay(2000); + + myGLCD.setColor(0,0,0); + myGLCD.fillRect(1,15,798,464); + + for (int i=0; i<10000; i++) + { + myGLCD.setColor(random(255), random(255), random(255)); + myGLCD.drawPixel(2+random(796), 16+random(447)); + } + + delay(2000); + + myGLCD.fillScr(0, 0, 255); + myGLCD.setColor(255, 0, 0); + myGLCD.fillRoundRect(320, 190, 479, 289); + + myGLCD.setColor(255, 255, 255); + myGLCD.setBackColor(255, 0, 0); + myGLCD.print("That's it!", CENTER, 213); + myGLCD.print("Restarting in a", CENTER, 239); + myGLCD.print("few seconds...", CENTER, 252); + + myGLCD.setColor(0, 255, 0); + myGLCD.setBackColor(0, 0, 255); + myGLCD.print("Runtime: (msecs)", CENTER, 450); + myGLCD.printNumI(millis(), CENTER, 465); + + delay (10000); +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readnew/LCD_ID_readnew.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readnew/LCD_ID_readnew.ino new file mode 100644 index 0000000..92b28ec --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readnew/LCD_ID_readnew.ino @@ -0,0 +1,734 @@ +// adapted from LCD_ID_Reader from http://misc.ws/lcd_information +// controllers either read as 16-bit or as a sequence of 8-bit values + +//-- Arduino UNO or Mega 2560 Plugged as shield +#define LCD_RST A4 //A1 +#define LCD_CS A3 +#define LCD_RS A2 +#define LCD_WR A1 +#define LCD_RD A0 + +#define LCD_D0 8 +#define LCD_D1 9 +#define LCD_D2 2 //10 +#define LCD_D3 3 //11 +#define LCD_D4 4 +#define LCD_D5 5 //13 +#define LCD_D6 6 +#define LCD_D7 7 + +uint8_t unlock_1520[] = { (0xB0), 2, 0x00, 0x00 }; +uint8_t unlock_1526[] = { (0xB0), 2, 0x3F, 0x3F }; +uint8_t unlock_8357[] = { (0xB9), 3, 0xFF, 0x83, 0x57}; +uint8_t unlock_5310[] = { (0xED), 2, 0x01, 0xFE}; +uint8_t d5310_0_in[] = { (0xEE), 2, 0xDE, 0x21}; //enter CMD3 8bit args +//uint8_t d5310_1[] = { (0x??), 2, 0xDE, 0x21}; +uint8_t d5310_1_in[] = { (0xBF), 1, 0xAA}; //enter page#1 16bit args +uint8_t d5310_1_out[] = { (0x00), 1, 0xAA}; //leave page#1 16bit args +uint8_t d1526nvm[] = { (0xE2), 1, 0x3F}; +uint8_t *unlock = NULL; +uint8_t *page_N = NULL; + +void setup() +{ + Serial.begin(9600); + while (!Serial) ; + Serial.println(F("Read Registers on MCUFRIEND UNO shield")); + Serial.println(F("controllers either read as single 16-bit")); + Serial.println(F("e.g. the ID is at readReg(0)")); + Serial.println(F("or as a sequence of 8-bit values")); + Serial.println(F("in special locations (first is dummy)")); + Serial.println(F("")); + lcdInit(); + lcdReset(); //ensures that controller is in default state + // unlock = unlock_1520; + // unlock = unlock_1526; + // unlock = unlock_8357; + // unlock = unlock_5310; + // page_N = d5310_1_in; + // for (uint16_t i = 0x00; i <= 0xFE; i++) readReg(i, 10, "f.k"); + read_regs("diagnose any controller"); + // read_xxxx("mystery"); + // read_5310_P0("NT35310 P0"); + // read_5310_P1("NT35310 P1"); + // read_61509("R61509 / ILI9326"); + // read_61526("R61520 / R61526"); + // read_8357("HX8357X"); + // read_9320("ILI9320"); + // read_9327("ILI9327"); + // read_9338("ILI9302 / ILI9329 / ILI9338 / ILI9341"); + // read_9481("ILI9481 / HX8357-B / R61581"); + // read_9486("ILI9486 / 1LI9488"); +} + +void loop() +{ + // put your main code here, to run repeatedly: + +} + +void printhex(uint8_t val) +{ + if (val < 0x10) Serial.print("0"); + Serial.print(val, HEX); +} + +void readReg(uint16_t reg, uint8_t n, const char *msg) +{ + uint8_t val8; + lcdReset(); + lcdSetWriteDir(); + if (unlock) pushCommand(unlock[0], unlock + 2, unlock[1]); + if (page_N) pushCommand(page_N[0], page_N + 2, page_N[1]); + Serial.print("reg(0x"); + printhex(reg >> 8); + printhex(reg); + Serial.print(")"); + lcdWriteCommand(reg); + lcdSetReadDir(); + while (n--) { + val8 = lcdReadData8(); + Serial.print(" "); + printhex(val8); + } + lcdSetWriteDir(); + digitalWrite(LCD_CS, HIGH); + + Serial.print("\t"); + Serial.println(msg); +} + +void lcdInit() +{ + pinMode(LCD_CS, OUTPUT); + digitalWrite(LCD_CS, HIGH); + pinMode(LCD_RS, OUTPUT); + digitalWrite(LCD_RS, HIGH); + pinMode(LCD_WR, OUTPUT); + digitalWrite(LCD_WR, HIGH); + pinMode(LCD_RD, OUTPUT); + digitalWrite(LCD_RD, HIGH); + pinMode(LCD_RST, OUTPUT); + digitalWrite(LCD_RST, HIGH); +} + +void lcdReset() +{ + digitalWrite(LCD_RST, LOW); + delay(2); + digitalWrite(LCD_RST, HIGH); + delay(10); //allow controller to re-start +} + +void lcdWrite8(uint16_t data) +{ + digitalWrite(LCD_D0, data & 1); + digitalWrite(LCD_D1, (data & 2) >> 1); + digitalWrite(LCD_D2, (data & 4) >> 2); + digitalWrite(LCD_D3, (data & 8) >> 3); + digitalWrite(LCD_D4, (data & 16) >> 4); + digitalWrite(LCD_D5, (data & 32) >> 5); + digitalWrite(LCD_D6, (data & 64) >> 6); + digitalWrite(LCD_D7, (data & 128) >> 7); +} + +uint16_t lcdRead8() +{ + uint16_t result = digitalRead(LCD_D7); + result <<= 1; + result |= digitalRead(LCD_D6); + result <<= 1; + result |= digitalRead(LCD_D5); + result <<= 1; + result |= digitalRead(LCD_D4); + result <<= 1; + result |= digitalRead(LCD_D3); + result <<= 1; + result |= digitalRead(LCD_D2); + result <<= 1; + result |= digitalRead(LCD_D1); + result <<= 1; + result |= digitalRead(LCD_D0); + + return result; +} + +void lcdSetWriteDir() +{ + uint8_t mode = OUTPUT; + pinMode(LCD_D0, mode); + pinMode(LCD_D1, mode); + pinMode(LCD_D2, mode); + pinMode(LCD_D3, mode); + pinMode(LCD_D4, mode); + pinMode(LCD_D5, mode); + pinMode(LCD_D6, mode); + pinMode(LCD_D7, mode); +} + + +void lcdSetReadDir() +{ + uint8_t mode = INPUT; + pinMode(LCD_D0, mode); + pinMode(LCD_D1, mode); + pinMode(LCD_D2, mode); + pinMode(LCD_D3, mode); + pinMode(LCD_D4, mode); + pinMode(LCD_D5, mode); + pinMode(LCD_D6, mode); + pinMode(LCD_D7, mode); +} + +void lcdWriteData(uint16_t data) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data >> 8); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_CS, HIGH); +} + +void lcdWriteCommand(uint16_t command) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, LOW); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command >> 8); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + // digitalWrite(LCD_CS, HIGH); +} + +uint8_t lcdReadData8() +{ + uint8_t result; + lcdSetReadDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_RD, LOW); + delayMicroseconds(10); + result = lcdRead8(); + digitalWrite(LCD_RD, HIGH); + + delayMicroseconds(10); + + return result; +} + + +uint16_t lcdReadData16() +{ + uint16_t result; + result = lcdReadData8() << 8; + result |= lcdReadData8(); + return result; +} + + +void lcdWriteRegister(uint16_t addr, uint16_t data) +{ + lcdWriteCommand(addr); + lcdWriteData(data); +} + +void pushCommand(uint8_t command, uint8_t *block, int8_t n) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, LOW); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + digitalWrite(LCD_RS, HIGH); + while (n--) { + lcdWrite8(*block++); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + } + digitalWrite(LCD_CS, HIGH); + +} + +// make all the functions static. +// the linker will discard unused anonymous strings. + +static void read_regs(char *title) +{ + Serial.println(title); + readReg(0x00, 2, "ID: ILI9320, ILI9325, ILI9335, ..."); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x30, 5, "PTLAR"); + readReg(0x33, 7, "VSCRLDEF"); + readReg(0x61, 2, "RDID1 HX8347-G"); + readReg(0x62, 2, "RDID2 HX8347-G"); + readReg(0x63, 2, "RDID3 HX8347-G"); + readReg(0x64, 2, "RDID1 HX8347-A"); + readReg(0x65, 2, "RDID2 HX8347-A"); + readReg(0x66, 2, "RDID3 HX8347-A"); + readReg(0x67, 2, "RDID Himax HX8347-A"); + readReg(0x70, 2, "Panel Himax HX8347-A"); + readReg(0xA1, 5, "RD_DDB SSD1963"); + readReg(0xB0, 2, "RGB Interface Signal Control"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xB6, 5, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xBF, 6, "ILI9481, HX8357-B"); + readReg(0xC0, 9, "Panel Control"); + readReg(0xC1, 4, "Display Timing"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 4, "ILI9341, ILI9488"); + readReg(0xD4, 4, "Novatek"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xEF, 6, "ILI9327"); + readReg(0xF2, 12, "Adjust Control 2"); + readReg(0xF6, 4, "Interface Control"); +} + +static void read_5310_P0(char *title) +{ + Serial.println(title); + readReg(0xB0, 2, "DISPLAY_CTRL"); + readReg(0xB1, 4, "PORCH_CTRL"); + readReg(0xB2, 4, "FRAME_CTRL"); + readReg(0xB3, 2, "SPI_RGB"); + readReg(0xB6, 7, "SOURCE_EQ"); + readReg(0xC0, 5, "PWR_CTRL1"); + readReg(0xC1, 3, "PWR_CTRL2"); + readReg(0xC2, 4, "PWR_CTRL3"); + readReg(0xC3, 2, "PWR_CTRL5"); + readReg(0xC4, 2, "PWR_CTRL6"); + readReg(0xC5, 5, "PWR_CTRL7"); + readReg(0xC6, 5, "PWR_CTRL8"); + readReg(0xD1, 2, "WRID"); + readReg(0xD2, 2, "WRID"); + readReg(0xD3, 2, "WRID"); + readReg(0xD4, 5, "RDID4"); + readReg(0xD5, 5, "WRDDB"); + readReg(0xDE, 4, "EPWR"); + readReg(0xFF, 2, "PAGE_STATUS"); +} + +static void read_5310_P1(char *title) +{ + Serial.println(title); + /* + readReg(0xB0, 19, "f.k"); + readReg(0xB1, 7, "f.k"); + readReg(0xB2, 7, "f.k"); + readReg(0xB3, 25, "f.k"); + readReg(0xB4, 7, "f.k"); + readReg(0xB5, 7, "f.k"); + readReg(0xB6, 3, "f.k"); + readReg(0xB7, 23, "f.k"); + readReg(0xB8, 7, "f.k"); + readReg(0xBA, 5, "f.k"); + readReg(0xC0, 19, "f.k"); + readReg(0xC1, 7, "f.k"); + readReg(0xC2, 5, "f.k"); + readReg(0xC3, 49, "f.k"); + readReg(0xC4, 27, "f.k"); + readReg(0xC5, 11, "f.k"); + readReg(0xC6, 7, "f.k"); + readReg(0xC7, 5, "f.k"); + readReg(0xC8, 5, "f.k"); + readReg(0xC9, 17, "f.k"); + */ + readReg(0xE0, 37, "GAMMA_RED_P"); + readReg(0xE1, 37, "GAMMA_RED_N"); + readReg(0xE2, 37, "GAMMA_GREEN_P"); + readReg(0xE3, 37, "GAMMA_GREEN_N"); + readReg(0xE4, 37, "GAMMA_BLUE_P"); + readReg(0xE5, 37, "GAMMA_BLUE_N"); + readReg(0xE6, 33, "CABC_RED"); + readReg(0xE7, 33, "CABC_GREEN"); + readReg(0xE8, 33, "CABC_BLUE"); + // readReg(0xE9, 5, "f.k."); + readReg(0xFF, 2, "PAGE_STATUS"); +} + +static void read_61509(char *title) +{ + Serial.println(title); + readReg(0x0000, 2, "Device Code Read"); + readReg(0x0001, 2, "Device Output Control"); + readReg(0x0002, 2, "LCD Waveform Control"); + readReg(0x0003, 2, "Entry Mode"); + readReg(0x0007, 2, "Display Control 1"); + readReg(0x0008, 2, "Display Control 2"); + readReg(0x0009, 2, "Display Control 3"); + readReg(0x0010, 2, "Panel Interface Control 1"); + readReg(0x0011, 2, "Panel Interface Control 2"); + readReg(0x0012, 2, "Panel Interface Control 3"); + readReg(0x0013, 2, "Panel Interface Control 4"); + readReg(0x0100, 2, "Power Control 1"); + readReg(0x0101, 2, "Power Control 2"); + readReg(0x0102, 2, "Power Control 3"); + readReg(0x0103, 2, "Power Control 4"); + readReg(0x0210, 2, "Horiz SA"); + readReg(0x0211, 2, "Horiz EA"); + readReg(0x0212, 2, "Vert SA"); + readReg(0x0213, 2, "Vert EA"); + readReg(0x0400, 2, "Base Image NL"); + readReg(0x0401, 2, "Base Image Control"); + readReg(0x0404, 2, "Base Image Scroll"); +} + +static void read_61526(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x0A, 2, "Get Power Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xB3, 6, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xC0, 9, "Panel Control"); + readReg(0xC1, 6, "Display Timing Normal"); + readReg(0xC3, 6, "Display Timing Idle"); + readReg(0xC4, 6, "Timing setting"); + readReg(0xC8, 23, "GAMMA"); + readReg(0xC9, 23, "GAMMA"); + readReg(0xCA, 23, "GAMMA"); + readReg(0xD0, 7, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xE0, 4, "NVM Access"); + readReg(0xE1, 2, "set_DDB"); + readReg(0xE2, 2, "NVM Load Control"); +} + +static void read_8357(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Power Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "SETOSC"); + readReg(0xB1, 8, "SETPOWER"); + readReg(0xB2, 6, "SETDISPLAY"); + readReg(0xB3, 5, "SETRGB"); + readReg(0xB4, 8, "SETCYC"); + readReg(0xB5, 4, "SETBGP"); + readReg(0xB6, 3, "SETVCOM"); + readReg(0xB7, 6, "SETOTP"); + readReg(0xB9, 4, "SETEXTC"); + readReg(0xC0, 7, "SETSTBA"); + readReg(0xC1, 11, "SETDGC"); + readReg(0xC3, 5, "SETID"); + readReg(0xC4, 5, "SETDDB"); + readReg(0xC9, 3, "SETCABC"); + readReg(0xCC, 2, "SETPANEL"); + readReg(0xD0, 4, "GETICID"); + readReg(0xE0, 35, "SETGAMMA"); + readReg(0xE9, 2, "SETIMAGEI"); + readReg(0xEA, 2, "SETMESSI"); +} + +static void read_fk(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xF0, 4, "f.k."); + readReg(0xF2, 18, "f.k."); + readReg(0xF3, 2, "f.k."); + readReg(0xF4, 14, "f.k."); + readReg(0xF5, 11, "f.k."); + readReg(0xF6, 10, "f.k."); + readReg(0xF7, 4, "f.k."); + readReg(0xF8, 2, "f.k."); + readReg(0xF9, 2, "f.k."); + readReg(0xFA, 12, "f.k."); + readReg(0xFB, 2, "f.k."); + readReg(0xFC, 2, "f.k."); + readReg(0xFD, 12, "f.k."); + readReg(0xFE, 2, "f.k."); +} + +static void read_xxxx(char *title) +{ + Serial.println(title); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 3, "Command Access Protect"); + readReg(0xBF, 5, "Device Code Read"); + readReg(0xC6, 2, "f.k."); + readReg(0xD6, 4, "f.k."); + readReg(0xD7, 5, "f.k."); + readReg(0xD8, 5, "f.k."); + readReg(0xD9, 4, "f.k."); + readReg(0xE0, 2, "f.k."); + readReg(0xE1, 3, "f.k."); + readReg(0xF0, 2, "f.k."); + readReg(0xF1, 2, "f.k."); + readReg(0xF2, 12, "f.k."); + readReg(0xF3, 9, "f.k."); + readReg(0xF4, 6, "f.k."); + readReg(0xF5, 7, "f.k."); + readReg(0xF6, 5, "f.k."); + readReg(0xF7, 16, "f.k."); + readReg(0xFD, 4, "f.k."); + readReg(0xFE, 2, "f.k."); + readReg(0xFF, 2, "f.k."); +} + +static void read_9320(char *title) +{ + Serial.println(title); + readReg(0x0000, 2, "Device Code Read"); + readReg(0x0001, 2, "Drive Output Control"); + readReg(0x0002, 2, "LCD Waveform Control"); + readReg(0x0003, 2, "Entry Mode"); + readReg(0x0007, 2, "Display Control 1"); + readReg(0x0008, 2, "Display Control 2"); + readReg(0x0009, 2, "Display Control 3"); + readReg(0x000A, 2, "Display Control 4"); + readReg(0x0010, 2, "Power Control 1"); + readReg(0x0011, 2, "Power Control 2"); + readReg(0x0012, 2, "Power Control 3"); + readReg(0x0013, 2, "Power Control 4"); + readReg(0x0014, 2, "Power Control 5"); + readReg(0x0015, 2, "Power Control 6"); + readReg(0x0029, 2, "Power Control 7"); + readReg(0x002B, 2, "Frame Rate"); +} + +static void read_9327(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 2, "Command Access Protect"); + readReg(0xB1, 2, "Low Power Control"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xB5, 2, "Sub Panel Control"); + readReg(0xBF, 2, "Backlight Control"); + readReg(0xC0, 7, "Panel Control"); + readReg(0xC1, 4, "Display Timing Normal"); + readReg(0xC3, 4, "Display Timing Idle"); + readReg(0xC4, 2, "VCOM Timing"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC6, 2, "Interface Control"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xC9, 13, "GAMMA Red/Blue"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 3, "Power Partial"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xEF, 6, "Device Code Read"); +} + +static void read_9338(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + // readReg(0x05, 2, "DSI errors"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xB0, 2, "Interface Mode"); + readReg(0xB1, 3, "Frame Rate Normal"); + readReg(0xB2, 3, "Frame Rate Idle"); + readReg(0xB3, 3, "Frame Rate Partial"); + readReg(0xB4, 3, "Inversion Control"); + readReg(0xB5, 5, "Blanking Porch"); + readReg(0xB6, 4, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xC0, 2, "Power Control 1"); + readReg(0xC1, 2, "Power Control 2"); + readReg(0xC2, 2, "Power Control 3"); + readReg(0xC3, 2, "Power Control 4"); + readReg(0xC4, 2, "Power Control 5"); + readReg(0xC5, 3, "VCOM Control 1"); + readReg(0xC7, 2, "VCOM Control 2"); + /* + readReg(0xD0, 3, "NVM Write"); + readReg(0xD1, 4, "NVM key"); + */ + readReg(0xD2, 3, "NVM Status"); + readReg(0xD3, 4, "RDID4"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xF2, 2, "GAMMA-3G"); + readReg(0xF6, 4, "Interface Control"); +} + +static void read_9481(char *title) +{ + Serial.println(title); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xA1, 6, "RD_DDB Start"); + readReg(0xB0, 2, "Command Access Protect"); + readReg(0xB3, 5, "Frame Memory"); + readReg(0xB4, 2, "Frame Mode"); + readReg(0xBF, 6, "Device Code Read"); + readReg(0xC0, 6, "Panel Control"); + readReg(0xC1, 4, "Display Timing Normal"); + readReg(0xC2, 4, "Display Timing Partial"); + readReg(0xC3, 4, "Display Timing Idle"); + readReg(0xC5, 2, "Frame Rate"); + readReg(0xC6, 2, "Interface Control"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 4, "Power Control"); + readReg(0xD1, 4, "VCOM Control"); + readReg(0xD2, 3, "Power Normal"); + readReg(0xD3, 3, "Power Partial"); + readReg(0xD4, 3, "Power Idle"); + readReg(0xE4, 4, "? SETCABC(HX) (f.k. ILI)"); + readReg(0xE9, 4, "? Set Panel Related(HX)"); + readReg(0xEE, 5, "? Set EQ Function(HX)"); + readReg(0xF0, 4, "f.k (ILI)"); + readReg(0xF1, 2, "f.k"); + readReg(0xF2, 4, "f.k"); + readReg(0xF3, 4, "f.k (ILI)"); + readReg(0xF4, 4, "f.k"); + readReg(0xF5, 2, "f.k"); + readReg(0xF6, 2, "f.k"); + readReg(0xF7, 4, "f.k"); + readReg(0xF8, 3, "f.k"); + readReg(0xF9, 2, "f.k"); +} + +static void read_9486(char *title) +{ + Serial.println(title); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x05, 2, "DSI errors"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Powsr Mode"); + readReg(0x0B, 2, "Get Address Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x0D, 2, "Get Display Mode"); + readReg(0x0E, 2, "Get Signal Mode"); + readReg(0x0F, 2, "Get Diagnostic Result"); + readReg(0xB0, 2, "Interface Mode"); + readReg(0xB1, 3, "Frame Rate Normal"); + readReg(0xB2, 3, "Frame Rate Idle"); + readReg(0xB3, 3, "Frame Rate Partial"); + readReg(0xB4, 2, "Inversion Control"); + readReg(0xB5, 5, "Blanking Porch"); + readReg(0xB6, 4, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xBF, 6, "NON-Ilitek Device Code Read"); + readReg(0xC0, 3, "Power Control 1"); + readReg(0xC1, 3, "Power Control 2"); + readReg(0xC2, 2, "Power Control 3"); + readReg(0xC3, 2, "Power Control 4"); + readReg(0xC4, 2, "Power Control 5"); + readReg(0xC5, 5, "VCOM Control 1"); + /* + readReg(0xC6, 3, "CABC Control 1"); + readReg(0xC8, 3, "CABC Control 2"); + readReg(0xC9, 2, "CABC Control 3"); + readReg(0xCA, 2, "CABC Control 4"); + readReg(0xCB, 2, "CABC Control 5"); + readReg(0xCC, 2, "CABC Control 6"); + readReg(0xCD, 2, "CABC Control 7"); + readReg(0xCE, 2, "CABC Control 8"); + readReg(0xCF, 2, "CABC Control 9"); + readReg(0xD0, 3, "NVM Write"); + readReg(0xD1, 4, "NVM key"); + readReg(0xD2, 5, "NVM Status"); + */ + readReg(0xD3, 4, "RDID4"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xF2, 10, "Adjust 2"); + readReg(0xF7, 5, "Adjust 3"); + readReg(0xF8, 3, "Adjust 4"); + readReg(0xF9, 3, "Adjust 5"); + readReg(0xFB, 2, "SPI Read"); + readReg(0xFC, 3, "Adjust 6"); +} + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readreg/LCD_ID_readreg.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readreg/LCD_ID_readreg.ino new file mode 100644 index 0000000..eb373f8 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/LCD_ID_readreg/LCD_ID_readreg.ino @@ -0,0 +1,266 @@ +// adapted from LCD_ID_Reader from http://misc.ws/lcd_information +// controllers either read as 16-bit or as a sequence of 8-bit values + +//-- Arduino UNO or Mega 2560 Plugged as shield +#define LCD_RST A4 +#define LCD_CS A3 +#define LCD_RS A2 +#define LCD_WR A1 +#define LCD_RD A0 + +#define LCD_D0 8 +#define LCD_D1 9 +#define LCD_D2 2 +#define LCD_D3 3 +#define LCD_D4 4 +#define LCD_D5 5 +#define LCD_D6 6 +#define LCD_D7 7 + +void setup() +{ + Serial.begin(9600); + while (!Serial) ; + Serial.println("Read Registers on MCUFRIEND UNO shield"); + Serial.println("controllers either read as single 16-bit"); + Serial.println("e.g. the ID is at readReg(0)"); + Serial.println("or as a sequence of 8-bit values"); + Serial.println("in special locations (first is dummy)"); + Serial.println(""); + lcdInit(); + lcdReset(); //ensures that controller is in default state +// for (uint16_t i = 0; i < 256; i++) readReg(i, 7, "f.k"); + readReg(0x00, 2, "ID: ILI9320, ILI9325, ILI9335, ..."); + readReg(0x04, 4, "Manufacturer ID"); + readReg(0x09, 5, "Status Register"); + readReg(0x0A, 2, "Get Power Mode"); + readReg(0x0C, 2, "Get Pixel Format"); + readReg(0x61, 2, "RDID1 HX8347-G"); + readReg(0x62, 2, "RDID2 HX8347-G"); + readReg(0x63, 2, "RDID3 HX8347-G"); + readReg(0x64, 2, "RDID1 HX8347-A"); + readReg(0x65, 2, "RDID2 HX8347-A"); + readReg(0x66, 2, "RDID3 HX8347-A"); + readReg(0x67, 2, "RDID Himax HX8347-A"); + readReg(0x70, 2, "Panel Himax HX8347-A"); + readReg(0xA1, 5, "RD_DDB SSD1963"); + readReg(0xB0, 2, "RGB Interface Signal Control"); + readReg(0xB4, 2, "Inversion Control"); + readReg(0xB6, 5, "Display Control"); + readReg(0xB7, 2, "Entry Mode Set"); + readReg(0xBF, 6, "ILI9481, HX8357-B"); + readReg(0xC0, 9, "Panel Control"); + readReg(0xC8, 13, "GAMMA"); + readReg(0xCC, 2, "Panel Control"); + readReg(0xD0, 3, "Power Control"); + readReg(0xD2, 5, "NVM Read"); + readReg(0xD3, 4, "ILI9341, ILI9488"); + readReg(0xD4, 4, "Novatek ID"); + readReg(0xDA, 2, "RDID1"); + readReg(0xDB, 2, "RDID2"); + readReg(0xDC, 2, "RDID3"); + readReg(0xE0, 16, "GAMMA-P"); + readReg(0xE1, 16, "GAMMA-N"); + readReg(0xEF, 6, "ILI9327"); + readReg(0xF2, 12, "Adjust Control 2"); + readReg(0xF6, 4, "Interface Control"); +} + +void loop() +{ + // put your main code here, to run repeatedly: + +} + +void printhex(uint8_t val) +{ + if (val < 0x10) Serial.print("0"); + Serial.print(val, HEX); +} + +void readReg(uint16_t reg, uint8_t n, const char *msg) +{ + uint8_t val8; + lcdReset(); + lcdSetWriteDir(); + lcdWriteCommand(0xB0); //Command Access Protect + lcdWriteData(0x00); //looks wrong +/* + lcdWriteCommand(0xF6); + lcdWriteData(0x01); + lcdWriteData(0x01); + lcdWriteData(0x03); +*/ + lcdWriteCommand(reg); + Serial.print("reg(0x"); + printhex(reg >> 8); + printhex(reg); + Serial.print(")"); + lcdSetReadDir(); + while (n--) { + val8 = lcdReadData8(); + Serial.print(" "); + printhex(val8); + } + lcdSetWriteDir(); + Serial.print("\t"); + Serial.println(msg); +} + +void lcdInit() +{ + pinMode(LCD_CS, OUTPUT); + digitalWrite(LCD_CS, HIGH); + pinMode(LCD_RS, OUTPUT); + digitalWrite(LCD_RS, HIGH); + pinMode(LCD_WR, OUTPUT); + digitalWrite(LCD_WR, HIGH); + pinMode(LCD_RD, OUTPUT); + digitalWrite(LCD_RD, HIGH); + pinMode(LCD_RST, OUTPUT); + digitalWrite(LCD_RST, HIGH); +} + +void lcdReset() +{ + digitalWrite(LCD_RST, LOW); + delay(2); + digitalWrite(LCD_RST, HIGH); + delay(10); //allow controller to re-start +} + +void lcdWrite8(uint16_t data) +{ + digitalWrite(LCD_D0, data & 1); + digitalWrite(LCD_D1, (data & 2) >> 1); + digitalWrite(LCD_D2, (data & 4) >> 2); + digitalWrite(LCD_D3, (data & 8) >> 3); + digitalWrite(LCD_D4, (data & 16) >> 4); + digitalWrite(LCD_D5, (data & 32) >> 5); + digitalWrite(LCD_D6, (data & 64) >> 6); + digitalWrite(LCD_D7, (data & 128) >> 7); +} + +uint16_t lcdRead8() +{ + uint16_t result = digitalRead(LCD_D7); + result <<= 1; + result |= digitalRead(LCD_D6); + result <<= 1; + result |= digitalRead(LCD_D5); + result <<= 1; + result |= digitalRead(LCD_D4); + result <<= 1; + result |= digitalRead(LCD_D3); + result <<= 1; + result |= digitalRead(LCD_D2); + result <<= 1; + result |= digitalRead(LCD_D1); + result <<= 1; + result |= digitalRead(LCD_D0); + + return result; +} + +void lcdSetWriteDir() +{ + pinMode(LCD_D0, OUTPUT); + pinMode(LCD_D1, OUTPUT); + pinMode(LCD_D2, OUTPUT); + pinMode(LCD_D3, OUTPUT); + pinMode(LCD_D4, OUTPUT); + pinMode(LCD_D5, OUTPUT); + pinMode(LCD_D6, OUTPUT); + pinMode(LCD_D7, OUTPUT); +} + + +void lcdSetReadDir() +{ + pinMode(LCD_D0, INPUT); + pinMode(LCD_D1, INPUT); + pinMode(LCD_D2, INPUT); + pinMode(LCD_D3, INPUT); + pinMode(LCD_D4, INPUT); + pinMode(LCD_D5, INPUT); + pinMode(LCD_D6, INPUT); + pinMode(LCD_D7, INPUT); +} + +void lcdWriteData(uint16_t data) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data >> 8); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + lcdWrite8(data); + + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_CS, HIGH); +} + +void lcdWriteCommand(uint16_t command) +{ + lcdSetWriteDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, LOW); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command >> 8); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + lcdWrite8(command); + digitalWrite(LCD_WR, LOW); + delayMicroseconds(10); + digitalWrite(LCD_WR, HIGH); + digitalWrite(LCD_CS, HIGH); +} + +uint8_t lcdReadData8() +{ + uint8_t result; + lcdSetReadDir(); + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RS, HIGH); + digitalWrite(LCD_RD, HIGH); + digitalWrite(LCD_WR, HIGH); + + digitalWrite(LCD_RD, LOW); + delayMicroseconds(10); + result = lcdRead8(); + digitalWrite(LCD_RD, HIGH); + + delayMicroseconds(10); + + return result; +} + + +uint16_t lcdReadData16() +{ + uint16_t result; + result = lcdReadData8() << 8; + result |= lcdReadData8(); + return result; +} + + +void lcdWriteRegister(uint16_t addr, uint16_t data) +{ + lcdWriteCommand(addr); + lcdWriteData(data); +} + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_Calibr_native.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_Calibr_native.ino new file mode 100644 index 0000000..ec9a5f8 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_Calibr_native.ino @@ -0,0 +1,453 @@ +// TouchScreen_Calibr_native for MCUFRIEND UNO Display Shields +// adapted by David Prentice +// for Adafruit's Resistive Touch Screen Library +// from Henning Karlsen's original UTouch_Calibration program. +// Many Thanks. + +#define PORTRAIT 0 +#define LANDSCAPE 1 +#define USE_XPT2046 0 +#define USE_LOCAL_KBV 1 + +#define TOUCH_ORIENTATION PORTRAIT + +#if defined(USB_PID) && USB_PID == 0x804E // Arduino M0 Native +#define Serial SerialUSB +#endif + +#define SWAP(x, y) { int t = x; x = y; y = t; } + +#define TITLE "TouchScreen.h GFX Calibration" +#include +#include +MCUFRIEND_kbv tft; + +// MCUFRIEND UNO shield shares pins with the TFT. +#if defined(ESP32) +int XP = 27, YP = 4, XM = 15, YM = 14; //most common configuration +#else +//int XP = 6, YP = A1, XM = A2, YM = 7; //most common configuration +int XP = 7, YP = A2, XM = A1, YM = 6; //next common configuration +//int XP=PB7,XM=PA6,YP=PA7,YM=PB6; //BLUEPILL must have Analog for YP, XM +#endif +#if USE_LOCAL_KBV +#include "TouchScreen_kbv.h" //my hacked version +#define TouchScreen TouchScreen_kbv +#define TSPoint TSPoint_kbv +#else +#include //Adafruit Library +#endif +TouchScreen ts(XP, YP, XM, YM, 300); //re-initialised after diagnose +TSPoint tp; //global point + +void readResistiveTouch(void) +{ + tp = ts.getPoint(); + pinMode(YP, OUTPUT); //restore shared pins + pinMode(XM, OUTPUT); + //digitalWrite(YP, HIGH); //because TFT control pins + //digitalWrite(XM, HIGH); + // Serial.println("tp.x=" + String(tp.x) + ", tp.y=" + String(tp.y) + ", tp.z =" + String(tp.z)); +} + +uint16_t readID(void) { + uint16_t ID = tft.readID(); + if (ID == 0xD3D3) ID = 0x9486; + return ID; +} +#define TFT_BEGIN() tft.begin(ID) + +#define WHITE 0xFFFF +#define RED 0xF800 +#define BLUE 0x001F +#define GREEN 0x07E0 +#define BLACK 0x0000 + +//#define GRAY 0x2408 //un-highlighted cross-hair +#define GRAY BLUE //idle cross-hair colour +#define GRAY_DONE RED //finished cross-hair + +bool ISPRESSED(void) +{ + // .kbv this was too sensitive !! + // now touch has to be stable for 50ms + int count = 0; + bool state, oldstate; + while (count < 10) { + readResistiveTouch(); + state = tp.z > 200; //ADJUST THIS VALUE TO SUIT YOUR SCREEN e.g. 20 ... 250 + if (state == oldstate) count++; + else count = 0; + oldstate = state; + delay(5); + } + return oldstate; +} + +uint32_t cx, cy, cz; +uint32_t rx[8], ry[8]; +int32_t clx, crx, cty, cby; +float px, py; +int dispx, dispy, text_y_center, swapxy; +uint32_t calx, caly, cals; + +char *Aval(int pin) +{ + static char buf[2][10], cnt; + cnt = !cnt; +#if defined(ESP32) + sprintf(buf[cnt], "%d", pin); +#else + sprintf(buf[cnt], "A%d", pin - A0); +#endif + return buf[cnt]; +} + +void showpins(int A, int D, int value, const char *msg) +{ + char buf[40]; + sprintf(buf, "%s (%s, D%d) = %d", msg, Aval(A), D, value); + Serial.println(buf); +} + +void bofe(char *buf) +{ + tft.println(buf); + Serial.println(buf); +} + +#if USE_XPT2046 == 0 +bool diagnose_pins() +{ + uint8_t i, j, Apins[2], Dpins[2], found = 0; + uint16_t value, Values[2]; + + Serial.println(F("Making all control and bus pins INPUT_PULLUP")); + Serial.println(F("Typical 30k Analog pullup with corresponding pin")); + Serial.println(F("would read low when digital is written LOW")); + Serial.println(F("e.g. reads ~25 for 300R X direction")); + Serial.println(F("e.g. reads ~30 for 500R Y direction")); + Serial.println(F("")); + + for (i = A0; i < A5; i++) pinMode(i, INPUT_PULLUP); + for (i = 2; i < 10; i++) pinMode(i, INPUT_PULLUP); + for (i = A0; i < A4; i++) { + pinMode(i, INPUT_PULLUP); + for (j = 5; j < 10; j++) { + pinMode(j, OUTPUT); + digitalWrite(j, LOW); + value = analogRead(i); // ignore first reading + value = analogRead(i); + if (value < 100 && value > 0) { + showpins(i, j, value, "Testing :"); + if (found < 2) { + Apins[found] = i; + Dpins[found] = j; + Values[found] = value; + } + found++; + } + pinMode(j, INPUT_PULLUP); + } + pinMode(i, INPUT_PULLUP); + } + if (found == 2) { + int idx = Values[0] < Values[1]; + /* + Serial.println(F("Diagnosing as:-")); + for (i = 0; i < 2; i++) { + showpins(Apins[i], Dpins[i], Values[i], + (Values[i] < Values[!i]) ? "XM,XP: " : "YP,YM: "); + } + */ + XM = Apins[!idx]; XP = Dpins[!idx]; YP = Apins[idx]; YM = Dpins[idx]; + ts = TouchScreen(XP, YP, XM, YM, 300); //re-initialise with pins + return true; //success + } + if (found == 0) Serial.println(F("MISSING TOUCHSCREEN")); + //else Serial.println(F("BROKEN TOUCHSCREEN")); + return false; +} +#endif + +void setup() +{ + char buf[40]; + uint16_t ID = readID(); + TFT_BEGIN(); + tft.fillScreen(TFT_NAVY); + tft.println("Waiting for Serial"); + delay(1000); + Serial.begin(9600); + while (!Serial); + tft.fillScreen(TFT_BLUE); + Serial.println(TITLE); + bool ret = true; +#if USE_XPT2046 || defined(__arm__) || defined(ESP32) + Serial.println(F("Not possible to diagnose Touch pins on ARM or ESP32")); +#else + ret = diagnose_pins(); //destroys TFT pin modes + TFT_BEGIN(); //start again +#endif + tft.setRotation(TOUCH_ORIENTATION); + dispx = tft.width(); + dispy = tft.height(); + text_y_center = (dispy / 2) - 6; + sprintf(buf, "ID = 0x%04x", ID); + Serial.println(buf); + if (ret == false) { + centerprint("BROKEN TOUCHSCREEN", text_y_center); + fail(); + } +} + +void loop() +{ + startup(); + + int x, y, cnt, idx = 0; + tft.fillScreen(BLACK); + for (x = 10, cnt = 0; x < dispx; x += (dispx - 20) / 2) { + for (y = 10; y < dispy; y += (dispy - 20) / 2) { + if (++cnt != 5) drawCrossHair(x, y, GRAY); + } + } + centerprint("***********", text_y_center - 12); + centerprint("***********", text_y_center + 12); + for (x = 10, cnt = 0; x < dispx; x += (dispx - 20) / 2) { + for (y = 10; y < dispy; y += (dispy - 20) / 2) { + if (++cnt != 5) calibrate(x, y, idx++, F(" X, Y, Pressure")); + } + } + + cals = (long(dispx - 1) << 12) + (dispy - 1); + swapxy = rx[2] - rx[0]; + //else swapxy = ry[2] - ry[0]; + swapxy = (swapxy < -400 || swapxy > 400); + if (swapxy != 0) { + clx = (ry[0] + ry[1] + ry[2]); //rotate 90 + crx = (ry[5] + ry[6] + ry[7]); + cty = (rx[0] + rx[3] + rx[5]); + cby = (rx[2] + rx[4] + rx[7]); + } else { + clx = (rx[0] + rx[1] + rx[2]); //regular + crx = (rx[5] + rx[6] + rx[7]); + cty = (ry[0] + ry[3] + ry[5]); + cby = (ry[2] + ry[4] + ry[7]); + } + clx /= 3; + crx /= 3; + cty /= 3; + cby /= 3; + px = float(crx - clx) / (dispx - 20); + py = float(cby - cty) / (dispy - 20); + // px = 0; + clx -= px * 10; + crx += px * 10; + cty -= py * 10; + cby += py * 10; + + calx = (long(clx) << 14) + long(crx); + caly = (long(cty) << 14) + long(cby); + if (swapxy) + cals |= (1L << 31); + + report(); // report results + while (true) {} // tread water +} + +void readCoordinates() +{ + int iter = 5000; + int failcount = 0; + int cnt = 0; + uint32_t tx = 0; + uint32_t ty = 0; + uint32_t tz = 0; + bool OK = false; + + while (OK == false) + { + centerprint("* PRESS *", text_y_center); + while (ISPRESSED() == false) {} + centerprint("* HOLD! *", text_y_center); + cnt = 0; + iter = 400; + do + { + readResistiveTouch(); + if (tp.z > 200) //.kbv + { + tx += tp.x; + ty += tp.y; + tz += tp.z; + cnt++; + } + else + failcount++; + } while ((cnt < iter) && (failcount < 10000)); + if (cnt >= iter) + { + OK = true; + } + else + { + tx = 0; + ty = 0; + tz = 0; + cnt = 0; + } + if (failcount >= 10000) + fail(); + } + + cx = tx / iter; + cy = ty / iter; + cz = tz / iter; +} + +void calibrate(int x, int y, int i, String msg) +{ + drawCrossHair(x, y, WHITE); + readCoordinates(); + centerprint("* RELEASE *", text_y_center); + drawCrossHair(x, y, GRAY_DONE); + rx[i] = cx; + ry[i] = cy; + char buf[40]; + sprintf(buf, "\r\ncx=%ld cy=%ld cz=%ld %s", cx, cy, cz, msg.c_str()); + Serial.print(buf); + while (ISPRESSED() == true) {} +} + +void report() +{ + uint16_t TS_LEFT, TS_RT, TS_TOP, TS_BOT, TS_WID, TS_HT, TS_SWAP; + int16_t tmp; + char buf[60]; + centertitle(TITLE); + + tft.println(F("To use the new calibration")); + tft.println(F("settings you must map the values")); + tft.println(F("from Point p = ts.getPoint() e.g. ")); + tft.println(F("x = map(p.x, LEFT, RT, 0, tft.width());")); + tft.println(F("y = map(p.y, TOP, BOT, 0, tft.height());")); + tft.println(F("swap p.x and p.y if diff ORIENTATION")); + + //.kbv show human values + TS_LEFT = (calx >> 14) & 0x3FFF; + TS_RT = (calx >> 0) & 0x3FFF; + TS_TOP = (caly >> 14) & 0x3FFF; + TS_BOT = (caly >> 0) & 0x3FFF; + TS_WID = ((cals >> 12) & 0x0FFF) + 1; + TS_HT = ((cals >> 0) & 0x0FFF) + 1; + TS_SWAP = (cals >> 31); + if (TOUCH_ORIENTATION == LANDSCAPE) { //always show PORTRAIT first + tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; + tmp = TS_WID, TS_WID = TS_HT, TS_HT = tmp; + } + sprintf(buf, "\n\n*** COPY-PASTE from Serial Terminal:"); + bofe(buf); + bool ts_landscape = (TOUCH_ORIENTATION == LANDSCAPE) ^ swapxy; +#if (USE_XPT2046) + sprintf(buf, "const int TS_LANDSCAPE=%d; //%s", ts_landscape, TITLE); + bofe(buf); +#else + if (ts_landscape) { + SWAP(XM, YP); + SWAP(XP, YM); + SWAP(TS_LEFT, TS_RT); + SWAP(TS_TOP, TS_BOT); + } + sprintf(buf, "const int XP=%d,XM=%s,YP=%s,YM=%d; //%dx%d ID=0x%04X", + XP, Aval(XM), Aval(YP), YM, TS_WID, TS_HT, readID()); + Serial.println(buf); + sprintf(buf, "\nTouch Pin Wiring XP=%d XM=%s YP=%s YM=%d", + XP, Aval(XM), Aval(YP), YM); + tft.println(buf); +#endif + sprintf(buf, "const int TS_LEFT=%d,TS_RT=%d,TS_TOP=%d,TS_BOT=%d;", + TS_LEFT, TS_RT, TS_TOP, TS_BOT); + Serial.println(buf); + +#if !defined(ARDUINO_AVR_LEONARDO) + for (int orient = 0; orient < 2; orient++) { + sprintf(buf, "\n%s CALIBRATION %d x %d", + orient ? "LANDSCAPE" : "PORTRAIT ", TS_WID, TS_HT); + bofe(buf); + sprintf(buf, "x = map(p.%s, LEFT=%d, RT=%d, 0, %d)", + orient ? "y" : "x", TS_LEFT, TS_RT, TS_WID); + bofe(buf); + sprintf(buf, "y = map(p.%s, TOP=%d, BOT=%d, 0, %d)", + orient ? "x" : "y", TS_TOP, TS_BOT, TS_HT); + bofe(buf); + tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; + tmp = TS_WID, TS_WID = TS_HT, TS_HT = tmp; + } + + int16_t x_range = TS_LEFT - TS_RT, y_range = TS_TOP - TS_BOT; + if (abs(x_range) > 500 && abs(y_range) > 650) //LANDSCAPE + return; + sprintf(buf, "\n*** UNUSUAL CALIBRATION RANGES %d %d", x_range, y_range); + bofe(buf); +#endif +} + +void drawCrossHair(int x, int y, uint16_t color) +{ + tft.drawRect(x - 10, y - 10, 20, 20, color); + tft.drawLine(x - 5, y, x + 5, y, color); + tft.drawLine(x, y - 5, x, y + 5, color); +} + +void centerprint(const char *s, int y) +{ + int len = strlen(s) * 6; + tft.setTextColor(WHITE, RED); + tft.setCursor((dispx - len) / 2, y); + tft.print(s); +} + +void centertitle(const char *s) +{ + tft.fillScreen(BLACK); + tft.fillRect(0, 0, dispx, 14, RED); + tft.fillRect(0, 14, dispx, 1, WHITE); + centerprint(s, 1); + tft.setCursor(0, 30); + tft.setTextColor(WHITE, BLACK); +} + +void startup() +{ + centertitle(TITLE); + + tft.println(F("#define NUMSAMPLES 3 in Library\n")); + tft.println(F("Use a stylus or something")); + tft.println(F("similar to touch as close")); + tft.println(F("to the center of the WHITE")); + tft.println(F("crosshair. Keep holding")); + tft.println(F("until crosshair turns RED.")); + tft.println(F("Repeat for all crosshairs.\n")); + tft.println(F("Report can be pasted from Serial\n")); + tft.println(F("Touch screen to continue")); + + while (ISPRESSED() == false) {} + while (ISPRESSED() == true) {} + // waitForTouch(); +} + +void fail() +{ + centertitle("Touch Calibration FAILED"); + + tft.println(F("Unable to read the position")); + tft.println(F("of the press. This is a")); + tft.println(F("hardware issue and can not")); + tft.println(F("be corrected in software.")); + tft.println(F("check XP, XM pins with a multimeter")); + tft.println(F("check YP, YM pins with a multimeter")); + tft.println(F("should be about 300 ohms")); + + while (true) {}; +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.cpp b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.cpp new file mode 100644 index 0000000..938a027 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.cpp @@ -0,0 +1,181 @@ +// Touch screen library with X Y and Z (pressure) readings as well +// as oversampling to avoid 'bouncing' +// adapted from (c) ladyada / adafruit + +#include "Arduino.h" + +#include "TouchScreen_kbv.h" + +#define NUMSAMPLES 3 //.kbv +#if defined(__STM32F1__) || defined(ESP32) //Maple core +#define ADC_ADJUST >>2 +#else +#define ADC_ADJUST +#endif + +TSPoint_kbv::TSPoint_kbv(void) { + x = y = 0; +} + +TSPoint_kbv::TSPoint_kbv(int16_t x0, int16_t y0, int16_t z0) { + x = x0; + y = y0; + z = z0; +} + +bool TSPoint_kbv::operator==(TSPoint_kbv p1) { + return ((p1.x == x) && (p1.y == y) && (p1.z == z)); +} + +bool TSPoint_kbv::operator!=(TSPoint_kbv p1) { + return ((p1.x != x) || (p1.y != y) || (p1.z != z)); +} + +static void insert_sort(int array[], uint8_t size) { + uint8_t j; + int save; + + for (int i = 1; i < size; i++) { + save = array[i]; + for (j = i; j >= 1 && save < array[j - 1]; j--) + array[j] = array[j - 1]; + array[j] = save; + } +} + +TSPoint_kbv TouchScreen_kbv::getPoint(void) { + int x, y, z; + int samples[NUMSAMPLES]; + uint8_t i, valid; + + valid = 1; + + pinMode(_yp, INPUT); + pinMode(_ym, INPUT); + + digitalWrite(_yp, LOW); + digitalWrite(_ym, LOW); + + pinMode(_xp, OUTPUT); + pinMode(_xm, OUTPUT); + digitalWrite(_xp, HIGH); + digitalWrite(_xm, LOW); + + for (i = 0; i < NUMSAMPLES; i++) { + samples[i] = analogRead(_yp) ADC_ADJUST; + } + insert_sort(samples, NUMSAMPLES); + x = (1023 - samples[NUMSAMPLES / 2]); //choose median + + pinMode(_xp, INPUT); + pinMode(_xm, INPUT); + digitalWrite(_xp, LOW); + digitalWrite(_xm, LOW); //.kbv for Due + + pinMode(_yp, OUTPUT); + digitalWrite(_yp, HIGH); + pinMode(_ym, OUTPUT); + digitalWrite(_ym, LOW); //.kbv for Due + + for (i = 0; i < NUMSAMPLES; i++) { + samples[i] = analogRead(_xm) ADC_ADJUST; + } + + insert_sort(samples, NUMSAMPLES); + + y = (1023 - samples[NUMSAMPLES / 2]); + + // Set X+ to ground + pinMode(_xp, OUTPUT); + digitalWrite(_xp, LOW); + + // Set Y- to VCC + pinMode(_ym, OUTPUT); //.kbv + digitalWrite(_ym, HIGH); + + // Hi-Z X- and Y+ + digitalWrite(_xm, LOW); //.kbv + pinMode(_xm, INPUT); //.kbv + digitalWrite(_yp, LOW); + pinMode(_yp, INPUT); + + int z1 = analogRead(_xm) ADC_ADJUST; + int z2 = analogRead(_yp) ADC_ADJUST; + + z = (1023 - (z2 - z1)); + + return TSPoint_kbv(x, y, z); //XM, YP still in ANALOG mode +} + +TouchScreen_kbv::TouchScreen_kbv(uint8_t xp, uint8_t yp, uint8_t xm, uint8_t ym) { + _yp = yp; + _xm = xm; + _ym = ym; + _xp = xp; + _rxplate = 0; + pressureThreshhold = 10; +} + + +TouchScreen_kbv::TouchScreen_kbv(uint8_t xp, uint8_t yp, uint8_t xm, uint8_t ym, + uint16_t rxplate) { + _yp = yp; + _xm = xm; + _ym = ym; + _xp = xp; + _rxplate = rxplate; + + pressureThreshhold = 10; +} + +int TouchScreen_kbv::readTouchX(void) { + pinMode(_yp, INPUT); + pinMode(_ym, INPUT); + digitalWrite(_yp, LOW); + digitalWrite(_ym, LOW); + + pinMode(_xp, OUTPUT); + digitalWrite(_xp, HIGH); + pinMode(_xm, OUTPUT); + digitalWrite(_xm, LOW); + + return (1023 - (analogRead(_yp)) ADC_ADJUST); +} + + +int TouchScreen_kbv::readTouchY(void) { + pinMode(_xp, INPUT); + pinMode(_xm, INPUT); + digitalWrite(_xp, LOW); + digitalWrite(_xm, LOW); + + pinMode(_yp, OUTPUT); + digitalWrite(_yp, HIGH); + pinMode(_ym, OUTPUT); + digitalWrite(_ym, LOW); + + return (1023 - (analogRead(_xm)) ADC_ADJUST); +} + + +uint16_t TouchScreen_kbv::pressure(void) { + // Set X+ to ground + pinMode(_xp, OUTPUT); + digitalWrite(_xp, LOW); + + // Set Y- to VCC + pinMode(_ym, OUTPUT); + digitalWrite(_ym, HIGH); + + // Hi-Z X- and Y+ + digitalWrite(_xm, LOW); + pinMode(_xm, INPUT); + digitalWrite(_yp, LOW); + pinMode(_yp, INPUT); + + int z1 = analogRead(_xm) ADC_ADJUST; + int z2 = analogRead(_yp) ADC_ADJUST; + + return (1023 - (z2 - z1)); +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.h b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.h new file mode 100644 index 0000000..b94fc07 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/TouchScreen_Calibr_native/TouchScreen_kbv.h @@ -0,0 +1,39 @@ +// Touch screen library with X Y and Z (pressure) readings as well +// as oversampling to avoid 'bouncing' +// (c) ladyada / adafruit +// Code under MIT License + +#ifndef _TOUCHSCREEN_KBV_H_ +#define _TOUCHSCREEN_KBV_H_ +#include + +class TSPoint_kbv { + public: + TSPoint_kbv(void); + TSPoint_kbv(int16_t x, int16_t y, int16_t z); + + bool operator==(TSPoint_kbv); + bool operator!=(TSPoint_kbv); + + int16_t x, y, z; +}; + +class TouchScreen_kbv { + public: + TouchScreen_kbv(uint8_t xp, uint8_t yp, uint8_t xm, uint8_t ym); + TouchScreen_kbv(uint8_t xp, uint8_t yp, uint8_t xm, uint8_t ym, uint16_t rx); + +// bool isTouching(void); + uint16_t pressure(void); + int readTouchY(); + int readTouchX(); + TSPoint_kbv getPoint(); + int16_t pressureThreshhold; + + private: + uint8_t _yp, _ym, _xm, _xp; + uint16_t _rxplate; +}; + +#endif + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/Touch_shield_new/Touch_shield_new.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/Touch_shield_new/Touch_shield_new.ino new file mode 100644 index 0000000..d97546e --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/Touch_shield_new/Touch_shield_new.ino @@ -0,0 +1,202 @@ +// the regular Adafruit "TouchScreen.h" library only works on AVRs + +// different mcufriend shields have Touchscreen on different pins +// and rotation. +// Run the TouchScreen_Calibr_native sketch for calibration of your shield + +#include +MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. +#include + +char *name = "Please Calibrate."; //edit name of shield +const int XP=6,XM=A2,YP=A1,YM=7; //ID=0x9341 +const int TS_LEFT=907,TS_RT=136,TS_TOP=942,TS_BOT=139; + +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); +TSPoint tp; + +#define MINPRESSURE 200 +#define MAXPRESSURE 1000 + +int16_t BOXSIZE; +int16_t PENRADIUS = 1; +uint16_t ID, oldcolor, currentcolor; +uint8_t Orientation = 0; //PORTRAIT + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void show_Serial(void) +{ + Serial.println(F("Most Touch Screens use pins 6, 7, A1, A2")); + Serial.println(F("But they can be in ANY order")); + Serial.println(F("e.g. right to left or bottom to top")); + Serial.println(F("or wrong direction")); + Serial.println(F("Edit name and calibration statements\n")); + Serial.println(name); + Serial.print(F("ID=0x")); + Serial.println(ID, HEX); + Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); + Serial.println("Calibration is: "); + Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); + Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); + Serial.println("Wiring is always PORTRAIT"); + Serial.println("YP=" + String(YP) + " XM=" + String(XM)); + Serial.println("YM=" + String(YM) + " XP=" + String(XP)); +} + +void show_tft(void) +{ + tft.setCursor(0, 0); + tft.setTextSize(1); + tft.print(F("ID=0x")); + tft.println(ID, HEX); + tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); + tft.println(""); + tft.setTextSize(2); + tft.println(name); + tft.setTextSize(1); + tft.println("PORTRAIT Values:"); + tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); + tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); + tft.println("\nWiring is: "); + tft.println("YP=" + String(YP) + " XM=" + String(XM)); + tft.println("YM=" + String(YM) + " XP=" + String(XP)); + tft.setTextSize(2); + tft.setTextColor(RED); + tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4); + tft.print("EXIT"); + tft.setTextColor(YELLOW, BLACK); + tft.setCursor(0, (tft.height() * 6) / 8); + tft.print("Touch screen for loc"); + while (1) { + tp = ts.getPoint(); + pinMode(XM, OUTPUT); + pinMode(YP, OUTPUT); + if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; + if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; + tft.setCursor(0, (tft.height() * 3) / 4); + tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " "); + } +} + + +void setup(void) +{ + uint16_t tmp; + + tft.reset(); + ID = tft.readID(); + tft.begin(ID); + Serial.begin(9600); + show_Serial(); + tft.setRotation(Orientation); + tft.fillScreen(BLACK); + show_tft(); + + BOXSIZE = tft.width() / 6; + tft.fillScreen(BLACK); + + tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); + tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); + tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); + tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); + tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); + tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); + + tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); + currentcolor = RED; + delay(1000); +} + +void loop() +{ + uint16_t xpos, ypos; //screen coordinates + tp = ts.getPoint(); //tp.x, tp.y are ADC values + + // if sharing pins, you'll need to fix the directions of the touchscreen pins + pinMode(XM, OUTPUT); + pinMode(YP, OUTPUT); + // we have some minimum pressure we consider 'valid' + // pressure of 0 means no pressing! + + if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { + // most mcufriend have touch (with icons) that extends below the TFT + // screens without icons need to reserve a space for "erase" + // scale the ADC values from ts.getPoint() to screen values e.g. 0-239 + // + // Calibration is true for PORTRAIT. tp.y is always long dimension + // map to your current pixel orientation + switch (Orientation) { + case 0: + xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); + ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); + break; + case 1: + xpos = map(tp.y, TS_TOP, TS_BOT, 0, tft.width()); + ypos = map(tp.x, TS_RT, TS_LEFT, 0, tft.height()); + break; + case 2: + xpos = map(tp.x, TS_RT, TS_LEFT, 0, tft.width()); + ypos = map(tp.y, TS_BOT, TS_TOP, 0, tft.height()); + break; + case 3: + xpos = map(tp.y, TS_BOT, TS_TOP, 0, tft.width()); + ypos = map(tp.x, TS_LEFT, TS_RT, 0, tft.height()); + break; + } + + // are we in top color box area ? + if (ypos < BOXSIZE) { //draw white border on selected color box + oldcolor = currentcolor; + + if (xpos < BOXSIZE) { + currentcolor = RED; + tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); + } else if (xpos < BOXSIZE * 2) { + currentcolor = YELLOW; + tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); + } else if (xpos < BOXSIZE * 3) { + currentcolor = GREEN; + tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE); + } else if (xpos < BOXSIZE * 4) { + currentcolor = CYAN; + tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE); + } else if (xpos < BOXSIZE * 5) { + currentcolor = BLUE; + tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE); + } else if (xpos < BOXSIZE * 6) { + currentcolor = MAGENTA; + tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE); + } + + if (oldcolor != currentcolor) { //rub out the previous white border + if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); + if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); + if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); + if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); + if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); + if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); + } + } + // are we in drawing area ? + if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) { + tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); + } + // are we in erase area ? + // Plain Touch panels use bottom 10 pixels e.g. > h - 10 + // Touch panels with icon area e.g. > h - 0 + if (ypos > tft.height() - 10) { + // press the bottom of the screen to erase + tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); + } + } +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/aspect_kbv/aspect_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/aspect_kbv/aspect_kbv.ino new file mode 100644 index 0000000..1de1ae3 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/aspect_kbv/aspect_kbv.ino @@ -0,0 +1,40 @@ +#include // Hardware-specific library +#include +MCUFRIEND_kbv tft; + +void setup() +{ + // put your setup code here, to run once: + Serial.begin(9600); + tft.reset(); + uint16_t identifier = tft.readID(); + Serial.print("ID = 0x"); + Serial.println(identifier, HEX); + if (identifier == 0xEFEF) identifier = 0x9486; + tft.begin(identifier); + // tft.fillScreen(BLACK); +} + +char *msg[] = { "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" }; +uint8_t aspect; + +void loop() +{ + // put your main code here, to run repeatedly: + uint16_t x = 50, y = 100; + tft.setRotation(aspect); + tft.fillScreen(0x0000); + tft.setCursor(0, 0); + tft.setTextSize(2); + tft.println(msg[aspect]); + tft.setCursor(x, y); + tft.println("[x=" + String(x) + ",y=" + String(y) + "]"); + delay(5000); + tft.println("INVERT ON"); + tft.invertDisplay(true); + delay(1000); + tft.invertDisplay(false); + tft.println("INVERT OFF"); + delay(1000); + if (++aspect >= 4) aspect = 0; +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_list.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_list.ino new file mode 100644 index 0000000..95d7355 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_list.ino @@ -0,0 +1,116 @@ +/* an alternative approach. swap the #if 1 / 0 values to try it + * + */ +#if 0 + +#include +#include +MCUFRIEND_kbv tft; +#include +#define MINPRESSURE 200 +#define MAXPRESSURE 1000 + +// ALL Touch panels and wiring is DIFFERENT +// copy-paste results from TouchScreen_Calibr_native.ino +const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341 +const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139; + +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); + +Adafruit_GFX_Button on_btn, off_btn; + +int pixel_x, pixel_y; //Touch_getXY() updates global vars +bool Touch_getXY(void) +{ + TSPoint p = ts.getPoint(); + pinMode(YP, OUTPUT); //restore shared pins + pinMode(XM, OUTPUT); + digitalWrite(YP, HIGH); //because TFT control pins + digitalWrite(XM, HIGH); + bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE); + if (pressed) { + pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me + pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height()); + } + return pressed; +} + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + Serial.print("TFT ID = 0x"); + Serial.println(ID, HEX); + Serial.println("Calibrate for your Touch Panel"); + if (ID == 0xD3D3) ID = 0x9486; // write-only shield + tft.begin(ID); + tft.setRotation(0); //PORTRAIT + tft.fillScreen(BLACK); + on_btn.initButton(&tft, 60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2); + off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2); + on_btn.drawButton(false); + off_btn.drawButton(false); + tft.fillRect(40, 80, 160, 80, RED); +} + +/* + * updating multiple buttons from a list + * + * anything more than two buttons gets repetitive + * + * you can place button addresses in separate lists + * e.g. for separate menu screens + */ + +// Array of button addresses to behave like a list +Adafruit_GFX_Button *buttons[] = {&on_btn, &off_btn, NULL}; + +/* update the state of a button and redraw as reqd + * + * main program can use isPressed(), justPressed() etc + */ +bool update_button(Adafruit_GFX_Button *b, bool down) +{ + b->press(down && b->contains(pixel_x, pixel_y)); + if (b->justReleased()) + b->drawButton(false); + if (b->justPressed()) + b->drawButton(true); + return down; +} + +/* most screens have different sets of buttons + * life is easier if you process whole list in one go + */ +bool update_button_list(Adafruit_GFX_Button **pb) +{ + bool down = Touch_getXY(); + for (int i = 0 ; pb[i] != NULL; i++) { + update_button(pb[i], down); + } + return down; +} + +/* compare the simplicity of update_button_list() + */ +void loop(void) +{ + update_button_list(buttons); //use helper function + if (on_btn.justPressed()) { + tft.fillRect(40, 80, 160, 80, GREEN); + } + if (off_btn.justPressed()) { + tft.fillRect(40, 80, 160, 80, RED); + } +} +#endif + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_simple.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_simple.ino new file mode 100644 index 0000000..a944a85 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/button_simple/button_simple.ino @@ -0,0 +1,84 @@ +#if 1 + +#include +#include +MCUFRIEND_kbv tft; +#include +#define MINPRESSURE 200 +#define MAXPRESSURE 1000 + +// ALL Touch panels and wiring is DIFFERENT +// copy-paste results from TouchScreen_Calibr_native.ino +const int XP = 6, XM = A2, YP = A1, YM = 7; //ID=0x9341 +const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139; + +TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); + +Adafruit_GFX_Button on_btn, off_btn; + +int pixel_x, pixel_y; //Touch_getXY() updates global vars +bool Touch_getXY(void) +{ + TSPoint p = ts.getPoint(); + pinMode(YP, OUTPUT); //restore shared pins + pinMode(XM, OUTPUT); + digitalWrite(YP, HIGH); //because TFT control pins + digitalWrite(XM, HIGH); + bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE); + if (pressed) { + pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me + pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height()); + } + return pressed; +} + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void setup(void) +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + Serial.print("TFT ID = 0x"); + Serial.println(ID, HEX); + Serial.println("Calibrate for your Touch Panel"); + if (ID == 0xD3D3) ID = 0x9486; // write-only shield + tft.begin(ID); + tft.setRotation(0); //PORTRAIT + tft.fillScreen(BLACK); + on_btn.initButton(&tft, 60, 200, 100, 40, WHITE, CYAN, BLACK, "ON", 2); + off_btn.initButton(&tft, 180, 200, 100, 40, WHITE, CYAN, BLACK, "OFF", 2); + on_btn.drawButton(false); + off_btn.drawButton(false); + tft.fillRect(40, 80, 160, 80, RED); +} + +/* two buttons are quite simple + */ +void loop(void) +{ + bool down = Touch_getXY(); + on_btn.press(down && on_btn.contains(pixel_x, pixel_y)); + off_btn.press(down && off_btn.contains(pixel_x, pixel_y)); + if (on_btn.justReleased()) + on_btn.drawButton(); + if (off_btn.justReleased()) + off_btn.drawButton(); + if (on_btn.justPressed()) { + on_btn.drawButton(true); + tft.fillRect(40, 80, 160, 80, GREEN); + } + if (off_btn.justPressed()) { + off_btn.drawButton(true); + tft.fillRect(40, 80, 160, 80, RED); + } +} +#endif + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_TFT_support/diagnose_TFT_support.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_TFT_support/diagnose_TFT_support.ino new file mode 100644 index 0000000..93738bb --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_TFT_support/diagnose_TFT_support.ino @@ -0,0 +1,126 @@ +#include +MCUFRIEND_kbv tft; + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF +#define GRAY 0x8410 + +uint16_t version = MCUFRIEND_KBV_H_; + +void setup() +{ + Serial.begin(9600); + if (!Serial) delay(5000); //allow some time for Leonardo + uint16_t ID = tft.readID(); // + Serial.println(F("Diagnose whether this controller is supported")); + Serial.println(F("There are FAQs in extras/mcufriend_how_to.txt")); + Serial.println(F("")); + Serial.print(F("tft.readID() finds: ID = 0x")); + Serial.println(ID, HEX); + Serial.println(F("")); + Serial.print(F("MCUFRIEND_kbv version: ")); + Serial.print(version/100); + Serial.print(F(".")); + Serial.print((version / 10) % 10); + Serial.print(F(".")); + Serial.println(version % 10); + Serial.println(F("")); + if (ID == 0x0404) { + Serial.println(F("Probably a write-only Mega2560 Shield")); + Serial.println(F("#define USE_SPECIAL in mcufriend_shield.h")); + Serial.println(F("#define appropriate SPECIAL in mcufriend_special.h")); + Serial.println(F("e.g. USE_MEGA_16BIT_SHIELD")); + Serial.println(F("e.g. USE_MEGA_8BIT_SHIELD")); + Serial.println(F("Hint. A Mega2560 Shield has a 18x2 male header")); + Serial.println(F("Often a row of resistor-packs near the 18x2")); + Serial.println(F("RP1-RP7 implies 16-bit but it might be 8-bit")); + Serial.println(F("RP1-RP4 or RP1-RP5 can only be 8-bit")); + } + if (ID == 0xD3D3) { + uint16_t guess_ID = 0x9481; // write-only shield + Serial.println(F("Probably a write-only Mega2560 Shield")); + Serial.print(F("Try to force ID = 0x")); + Serial.println(guess_ID, HEX); + tft.begin(guess_ID); + } + else tft.begin(ID); + Serial.println(F("")); + if (tft.width() == 0) { + Serial.println(F("This ID is not supported")); + Serial.println(F("look up ID in extras/mcufriend_how_to.txt")); + Serial.println(F("you may need to edit MCUFRIEND_kbv.cpp")); + Serial.println(F("to enable support for this ID")); + Serial.println(F("e.g. #define SUPPORT_8347D")); + Serial.println(F("")); + Serial.println(F("New controllers appear on Ebay often")); + Serial.println(F("If your ID is not supported")); + Serial.println(F("run LCD_ID_readreg.ino from examples/")); + Serial.println(F("Copy-Paste the output from the Serial Terminal")); + Serial.println(F("to a message in Displays topic on Arduino Forum")); + Serial.println(F("or to Issues on GitHub")); + Serial.println(F("")); + Serial.println(F("Note that OPEN-SMART boards have diff pinout")); + Serial.println(F("Edit the pin defines in LCD_ID_readreg to match")); + Serial.println(F("Edit mcufiend_shield.h for USE_SPECIAL")); + Serial.println(F("Edit mcufiend_special.h for USE_OPENSMART_SHIELD_PINOUT")); + while (1); //just die + } else { + Serial.print(F("PORTRAIT is ")); + Serial.print(tft.width()); + Serial.print(F(" x ")); + Serial.println(tft.height()); + Serial.println(F("")); + Serial.println(F("Run the examples/graphictest_kbv sketch")); + Serial.println(F("All colours, text, directions, rotations, scrolls")); + Serial.println(F("should work. If there is a problem, make notes on paper")); + Serial.println(F("Post accurate description of problem to Forum")); + Serial.println(F("Or post a link to a video (or photos)")); + Serial.println(F("")); + Serial.println(F("I rely on good information from remote users")); + } +} + +void loop() +{ + static uint8_t aspect = 0; + const char *aspectname[] = { + "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" + }; + const char *colorname[] = { "BLUE", "GREEN", "RED", "GRAY" }; + uint16_t colormask[] = { BLUE, GREEN, RED, GRAY }; + uint16_t ID = tft.readID(); // + tft.setRotation(aspect); + int width = tft.width(); + int height = tft.height(); + tft.fillScreen(colormask[aspect]); + tft.drawRect(0, 0, width, height, WHITE); + tft.drawRect(32, 32, width - 64, height - 64, WHITE); + tft.setTextSize(2); + tft.setTextColor(BLACK); + tft.setCursor(40, 40); + tft.print("ID=0x"); + tft.print(ID, HEX); + if (ID == 0xD3D3) tft.print(" w/o"); + tft.setCursor(40, 70); + tft.print(aspectname[aspect]); + tft.setCursor(40, 100); + tft.print(width); + tft.print(" x "); + tft.print(height); + tft.setTextColor(WHITE); + tft.setCursor(40, 130); + tft.print(colorname[aspect]); + tft.setCursor(40, 160); + tft.setTextSize(1); + tft.print("MCUFRIEND_KBV_H_ = "); + tft.print(version); + if (++aspect > 3) aspect = 0; + delay(5000); +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_Touchpins/diagnose_Touchpins.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_Touchpins/diagnose_Touchpins.ino new file mode 100644 index 0000000..acdbc3b --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/diagnose_Touchpins/diagnose_Touchpins.ino @@ -0,0 +1,49 @@ +void showpins(int A, int D, int value, const char *msg) +{ + Serial.print(msg); + Serial.print(" (A" + String(A - A0) + ", D" + String(D) + ") = "); + Serial.println(value); +} +void setup() +{ + int i, j, value, Apins[2], Dpins[2], Values[2], found = 0; + Serial.begin(9600); + Serial.println("Making all control and bus pins INPUT_PULLUP"); + Serial.println("Typical 30k Analog pullup with corresponding pin"); + Serial.println("would read low when digital is written LOW"); + Serial.println("e.g. reads ~25 for 300R X direction"); + Serial.println("e.g. reads ~30 for 500R Y direction"); + Serial.println(""); + for (i = A0; i < A5; i++) pinMode(i, INPUT_PULLUP); + for (i = 2; i < 10; i++) pinMode(i, INPUT_PULLUP); + for (i = A0; i < A4; i++) { + for (j = 5; j < 10; j++) { + pinMode(j, OUTPUT); + digitalWrite(j, LOW); + value = analogRead(i); // ignore first reading + value = analogRead(i); + if (value < 100) { + showpins(i, j, value, "Testing :"); + if (found < 2) { + Apins[found] = i; + Dpins[found] = j; + Values[found] = value; + found++; + } + } + pinMode(j, INPUT_PULLUP); + } + } + if (found == 2) { + Serial.println("Diagnosing as:-"); + for (i = 0; i < 2; i++) { + showpins(Apins[i], Dpins[i], Values[i], (Values[i] < Values[!i]) ? "XM,XP: " : "YP,YM: "); + } + } +} + +void loop() +{ + // put your main code here, to run repeatedly: + +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_RGB.h b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_RGB.h new file mode 100644 index 0000000..8865758 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_RGB.h @@ -0,0 +1,668 @@ +// several programs can convert BMP, JPG, PNG images to C arrays of pixels +// these used the utility bundled with UTFT. +// Online tool at http://www.rinkydinkelectronics.com/t_imageconverter565.php + +// Generated by : ImageConverter 565 v2.3 +// Generated from: marilyn_64x64.bmp +// Time generated: 14-May-18 06:55:31 +// Dimensions : 64x64 pixels +// Size : 8,192 Bytes + +#include + +//const unsigned short marilyn_64x64[0x1000] PROGMEM ={ +// uint16_t is not ambiguous +const uint16_t marilyn_64x64[0x1000] PROGMEM ={ +0x98E5, 0x98E5, 0x98E5, 0x98E5, 0x98E5, 0x98E4, 0x90E4, 0x9905, 0x9905, 0x9104, 0x90E4, 0x9905, 0x9925, 0x9925, 0x9925, 0x9945, // 0x0010 (16) +0x9945, 0x9945, 0x9946, 0xA1A6, 0xAA07, 0xB289, 0xBB4B, 0xCC4F, 0xE5F5, 0xF6B8, 0xF6D9, 0xFEF9, 0xFED8, 0xF6D8, 0xF677, 0xEDD4, // 0x0020 (32) +0xD46F, 0xBAEA, 0xAA08, 0xA186, 0x9966, 0x9966, 0xA166, 0xA166, 0x9946, 0x9946, 0x9945, 0x9926, 0x9926, 0x9946, 0x9925, 0x9925, // 0x0030 (48) +0x9926, 0x9946, 0xA146, 0xA166, 0xA167, 0xA167, 0xA146, 0xA147, 0xA146, 0xA167, 0xA167, 0xA167, 0xA987, 0xA987, 0xA967, 0xA967, // 0x0040 (64) +0x98E5, 0x98E4, 0x98E4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x90E4, 0x9104, 0x9104, 0x9905, 0x9104, 0x9925, 0x9925, // 0x0050 (80) +0x9965, 0x9966, 0xA1C6, 0xBB0A, 0xC3ED, 0xD511, 0xE5B3, 0xE614, 0xEE34, 0xF6B7, 0xF6F8, 0xFF19, 0xF6D7, 0xEE76, 0xF6D8, 0xF6D8, // 0x0060 (96) +0xF697, 0xE5D5, 0xD4B0, 0xB2CA, 0x9986, 0x9966, 0x9966, 0x9966, 0x9946, 0x9945, 0x9925, 0x9925, 0x9925, 0x9946, 0x9925, 0x9925, // 0x0070 (112) +0x9925, 0x9946, 0x9946, 0xA146, 0xA146, 0xA146, 0x9946, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA967, 0xA967, 0xA967, 0xA967, // 0x0080 (128) +0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x9104, 0x9104, 0x9104, 0x9104, 0x9124, 0x9945, // 0x0090 (144) +0xAA48, 0xC38C, 0xDD73, 0xF677, 0xF71A, 0xFF3A, 0xF6D7, 0xEE75, 0xEE75, 0xF6B7, 0xF6D8, 0xEE75, 0xE5F3, 0xEE35, 0xF676, 0xF6D8, // 0x00A0 (160) +0xF6D8, 0xEE97, 0xEE77, 0xEE15, 0xCC0E, 0xAA28, 0xA1A6, 0xA186, 0x9945, 0x9945, 0x9945, 0x9925, 0x9945, 0x9945, 0x9925, 0x9925, // 0x00B0 (176) +0x9925, 0x9925, 0x9946, 0x9946, 0x9946, 0x9946, 0x9926, 0xA146, 0xA146, 0x9926, 0xA146, 0xA146, 0xA167, 0xA967, 0xA967, 0xA967, // 0x00C0 (192) +0x90C4, 0x90C4, 0x90C4, 0x90E4, 0x90E4, 0x90E4, 0x9104, 0x9904, 0x9104, 0x9104, 0x9925, 0x9925, 0x9925, 0x9924, 0x9945, 0xAA47, // 0x00D0 (208) +0xD4AF, 0xEE15, 0xF6B7, 0xF697, 0xF697, 0xEE96, 0xF6B7, 0xF6B7, 0xF6D7, 0xF6B7, 0xEE55, 0xD571, 0xCCEF, 0xD530, 0xDD92, 0xE614, // 0x00E0 (224) +0xF6F8, 0xF6D8, 0xEE76, 0xE656, 0xEE35, 0xCC2E, 0xAA28, 0xA9C7, 0xA166, 0x9945, 0x9945, 0x9945, 0x9945, 0x9945, 0x9925, 0x9925, // 0x00F0 (240) +0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0x9946, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA146, 0xA967, 0xA967, 0xA967, // 0x0100 (256) +0x90C4, 0x90E4, 0x90E4, 0x98E4, 0x90E4, 0x9104, 0x9904, 0x9904, 0x9925, 0x9925, 0x9945, 0x9945, 0x9945, 0xA185, 0xB268, 0xD46E, // 0x0110 (272) +0xEE14, 0xEE96, 0xEE96, 0xDDB2, 0xCCEF, 0xBC6D, 0xC4CF, 0xD5B2, 0xE655, 0xEE55, 0xDDB2, 0xD530, 0xC4AE, 0xC46D, 0xD510, 0xD530, // 0x0120 (288) +0xE614, 0xEE55, 0xE676, 0xEE97, 0xEE76, 0xE5B4, 0xC34B, 0xA9E7, 0xA186, 0xA166, 0xA166, 0xA165, 0x9945, 0x9946, 0x9946, 0x9945, // 0x0130 (304) +0x9946, 0x9946, 0x9946, 0xA166, 0xA146, 0xA146, 0x9946, 0xA146, 0xA166, 0xA166, 0xA146, 0xA146, 0xA166, 0xA166, 0xA967, 0xA967, // 0x0140 (320) +0x90E4, 0x90E4, 0x90E4, 0x90E4, 0x9904, 0x9904, 0x9904, 0x9924, 0x9925, 0x9945, 0xA165, 0xA165, 0xA186, 0xAA27, 0xCC4E, 0xDDB2, // 0x0150 (336) +0xEE96, 0xF6D8, 0xE614, 0xC4CF, 0xABCB, 0x9B49, 0x8AE8, 0x9B8A, 0xBCAE, 0xD572, 0xD530, 0xCD0F, 0xC4AE, 0xB3EB, 0xCCAE, 0xD530, // 0x0160 (352) +0xDD91, 0xE5F3, 0xEE76, 0xEE97, 0xEE56, 0xEE77, 0xD48F, 0xB269, 0xA9C7, 0xA1A6, 0xA186, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, // 0x0170 (368) +0xA146, 0xA146, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, 0xA166, 0xA167, 0xA166, 0xA166, 0xA166, 0xA166, 0xA987, 0xA987, 0xA987, // 0x0180 (384) +0x90E4, 0x98E4, 0x9904, 0x9904, 0x9904, 0x9904, 0x9925, 0x9945, 0xA165, 0xA165, 0xA186, 0xA9E7, 0xB248, 0xC3CC, 0xD530, 0xE635, // 0x0190 (400) +0xE655, 0xD592, 0xC4F0, 0xAC0C, 0x9B49, 0x8AC8, 0x82A7, 0x7A66, 0x9B8A, 0xBC8E, 0xC4AE, 0xCD10, 0xD530, 0xC46D, 0xCCF0, 0xDD51, // 0x01A0 (416) +0xE5F3, 0xE5D3, 0xEE97, 0xF6D8, 0xEE56, 0xF6D8, 0xE573, 0xCB8C, 0xBAA9, 0xB1E7, 0xA9C7, 0xA1A6, 0xA186, 0xA186, 0xA187, 0xA186, // 0x01B0 (432) +0xA166, 0xA166, 0xA166, 0xA187, 0xA187, 0xA167, 0xA167, 0xA166, 0xA187, 0xA987, 0xA987, 0xA167, 0xA167, 0xA987, 0xA987, 0xA987, // 0x01C0 (448) +0x9904, 0x9904, 0x9905, 0x9925, 0x9925, 0x9925, 0x9925, 0xA166, 0xA186, 0xA1A6, 0xB248, 0xBB2A, 0xCBED, 0xCCCF, 0xDDD3, 0xE614, // 0x01D0 (464) +0xBC4D, 0xA36A, 0x92C8, 0x92E8, 0x9329, 0x8AC8, 0x8287, 0x7A26, 0x9329, 0xB44D, 0xC4CF, 0xDDB2, 0xE614, 0xDD92, 0xE5F4, 0xE615, // 0x01E0 (480) +0xF6B7, 0xEE55, 0xEE96, 0xEE77, 0xE635, 0xFEF9, 0xEE15, 0xDC4E, 0xCB8C, 0xB208, 0xB208, 0xA9C7, 0xA9C7, 0xA9C7, 0xA9A7, 0xA986, // 0x01F0 (496) +0xA186, 0xA186, 0xA9A7, 0xA9A7, 0xA987, 0xA987, 0xA187, 0xA187, 0xA9A7, 0xA9A7, 0xA987, 0xA987, 0xA987, 0xA987, 0xA9A7, 0xA9A7, // 0x0200 (512) +0x9905, 0x9925, 0x9925, 0x9925, 0x9925, 0x9945, 0x9945, 0xA186, 0xA1A6, 0xAA68, 0xBBCC, 0xDD93, 0xE5F4, 0xD592, 0xE635, 0xD591, // 0x0210 (528) +0xC48D, 0xB42C, 0x8AC8, 0x8AA7, 0x9309, 0x9309, 0x8AC8, 0x8AC8, 0xABEC, 0xCCEF, 0xDDD3, 0xEE55, 0xF696, 0xEE34, 0xEE55, 0xEE76, // 0x0220 (544) +0xFF3A, 0xF6F8, 0xE614, 0xDDD3, 0xE635, 0xF6D8, 0xF656, 0xDC8F, 0xDC4F, 0xBAA9, 0xB249, 0xB208, 0xB228, 0xBA69, 0xA9E7, 0xA9A7, // 0x0230 (560) +0xA9A7, 0xA9A7, 0xA9C7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA987, 0xA9A7, 0xA9A7, 0xA9A8, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9A8, // 0x0240 (576) +0x9925, 0xA125, 0xA145, 0xA145, 0xA145, 0xA165, 0xA166, 0xAA07, 0xAA68, 0x9288, 0x9B4A, 0xCD11, 0xEE76, 0xE635, 0xE5F4, 0xE5F3, // 0x0250 (592) +0xDDB2, 0x9B6A, 0x69A5, 0x7A26, 0x8AE8, 0x9B6A, 0x8AE8, 0xA3CB, 0xC4AE, 0xE614, 0xF6B7, 0xEE76, 0xF6D7, 0xF6B7, 0xEE76, 0xE635, // 0x0260 (608) +0xFF19, 0xF6F8, 0xD571, 0xDDD3, 0xEE56, 0xF697, 0xEE35, 0xE552, 0xE4F0, 0xCBAC, 0xD3CD, 0xDCD1, 0xE573, 0xE552, 0xCBCD, 0xBA69, // 0x0270 (624) +0xB208, 0xB1E7, 0xA9C7, 0xA9C8, 0xA9C8, 0xA9A7, 0xA9A7, 0xA9A7, 0xA9C8, 0xA9C8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, 0xA9A8, // 0x0280 (640) +0x9925, 0xA145, 0xA145, 0xA165, 0xA166, 0xA186, 0xA1C6, 0xAA68, 0xBB6B, 0x8AA8, 0xA38B, 0xCD31, 0xCD51, 0xD571, 0xD5B2, 0xEE76, // 0x0290 (656) +0xE635, 0x934A, 0x69C5, 0x7226, 0x9329, 0xA3CB, 0xA3AB, 0xB44E, 0xCD31, 0xEE96, 0xF6D8, 0xF6B7, 0xEE96, 0xF6B7, 0xEE56, 0xEE55, // 0x02A0 (672) +0xE634, 0xE5F4, 0xDDB3, 0xE635, 0xE655, 0xE635, 0xEE56, 0xE5D4, 0xEDF4, 0xEE35, 0xF656, 0xFED9, 0xF677, 0xEDF4, 0xED94, 0xD42E, // 0x02B0 (688) +0xBA69, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xA9C8, 0xB1C8, 0xA9C8, 0xB1C8, 0xB1C8, 0xB1C8, // 0x02C0 (704) +0xA145, 0xA145, 0xA166, 0xA166, 0xA186, 0xA9C7, 0xA9E7, 0xB2A9, 0xBB8B, 0x934A, 0x8AC8, 0x92C8, 0x9B8A, 0xAC0D, 0xC510, 0xDE14, // 0x02D0 (720) +0xD5B3, 0xA3AB, 0x7A68, 0x82E9, 0xA3CC, 0xB46E, 0xC4CF, 0xC4CF, 0xCD31, 0xDDF4, 0xDDF4, 0xDDD4, 0xD592, 0xE614, 0xE614, 0xE635, // 0x02E0 (736) +0xD572, 0xC4F0, 0xCD31, 0xDDB3, 0xCD10, 0xD592, 0xEE76, 0xEE56, 0xF6B7, 0xFEF9, 0xFF19, 0xFED8, 0xF697, 0xF636, 0xEDD4, 0xED52, // 0x02F0 (752) +0xD38C, 0xBA49, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1C8, 0xB1C8, 0xB1E8, 0xB1E8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, 0xB1C8, // 0x0300 (768) +0xA145, 0xA166, 0xA186, 0xA186, 0xA9A6, 0xA9E7, 0xB248, 0xBB6B, 0xC46E, 0x8AE8, 0x8287, 0x92C8, 0xA3AB, 0xB44D, 0xB46E, 0xCD51, // 0x0310 (784) +0xD572, 0xAC0D, 0x7268, 0x934A, 0xBC8E, 0xCCF0, 0xD510, 0xD510, 0xD510, 0xD571, 0xD531, 0xCCF0, 0xC4CF, 0xDD92, 0xCD10, 0xD552, // 0x0320 (800) +0xD551, 0xCCF0, 0xC4AF, 0xA3AB, 0x8AC9, 0xB44E, 0xEE56, 0xFF1A, 0xFF1A, 0xFF1A, 0xFEF9, 0xF696, 0xF6B7, 0xF6B8, 0xF677, 0xF615, // 0x0330 (816) +0xE4F1, 0xCB4C, 0xB228, 0xB208, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, 0xB1E8, // 0x0340 (832) +0xA166, 0xA186, 0xA986, 0xA9A6, 0xA9A6, 0xAA07, 0xB2A9, 0xCC8E, 0xCCF0, 0x9B4A, 0x9329, 0xABEC, 0xC4CF, 0xD551, 0xCCEF, 0xC4CF, // 0x0350 (848) +0xD571, 0xBCAF, 0x932A, 0xABCC, 0xDD31, 0xE5B2, 0xEDB2, 0xEDD3, 0xEDF4, 0xEDF4, 0xEDF4, 0xE592, 0xDD52, 0xDD51, 0xDD52, 0xE5B3, // 0x0360 (864) +0xE551, 0xDD31, 0xCCAF, 0xB3ED, 0xA3AB, 0xBC6E, 0xE615, 0xF6B7, 0xFF3A, 0xFF5A, 0xFF19, 0xF697, 0xF6B7, 0xF697, 0xFEF8, 0xFE97, // 0x0370 (880) +0xF5F5, 0xE4B0, 0xC2AA, 0xB229, 0xB208, 0xB1E8, 0xB1E8, 0xB209, 0xB209, 0xB209, 0xB209, 0xB1E9, 0xB209, 0xB209, 0xB209, 0xB1E8, // 0x0380 (896) +0xA986, 0xA986, 0xA9A7, 0xA9A7, 0xA9C7, 0xB207, 0xBAC9, 0xD510, 0xCD10, 0x8B09, 0x7A88, 0xAC2D, 0xE635, 0xE634, 0xC4AE, 0xAC0C, // 0x0390 (912) +0xC4CF, 0xC4CF, 0xB40C, 0xC46D, 0xE591, 0xEDF3, 0xF614, 0xF655, 0xF676, 0xF676, 0xF655, 0xF615, 0xEDF4, 0xF614, 0xF5F4, 0xF5F4, // 0x03A0 (928) +0xEDB3, 0xE572, 0xDD30, 0xCCAF, 0xC46E, 0xCCD0, 0xDDB3, 0xEE76, 0xF719, 0xF6D8, 0xF6B7, 0xEE76, 0xF696, 0xEE55, 0xF6B7, 0xFED8, // 0x03B0 (944) +0xF676, 0xEDB4, 0xD3CD, 0xBA49, 0xB229, 0xB229, 0xB209, 0xB209, 0xB229, 0xB229, 0xB209, 0xB209, 0xB209, 0xBA29, 0xBA09, 0xBA29, // 0x03C0 (960) +0xB1C7, 0xA9C7, 0xB1C7, 0xB1E7, 0xB1E7, 0xB228, 0xBAEA, 0xDD92, 0xCD30, 0x8AE8, 0x7A26, 0x92E8, 0xB42D, 0xC4CF, 0xC4CE, 0xB42D, // 0x03D0 (976) +0x9B8B, 0xBC8E, 0xBC4D, 0xCC8E, 0xE591, 0xF614, 0xF634, 0xFE75, 0xFE97, 0xFE97, 0xFE96, 0xF655, 0xF635, 0xFE56, 0xF655, 0xF655, // 0x03E0 (992) +0xF614, 0xEDD3, 0xE551, 0xD4EF, 0xCC8E, 0xC4AF, 0xCD10, 0xDDB3, 0xE655, 0xE635, 0xEE55, 0xF697, 0xF6B7, 0xEE77, 0xEE35, 0xF655, // 0x03F0 (1008) +0xFEB7, 0xF636, 0xE4F1, 0xBA8A, 0xBA49, 0xBA49, 0xBA29, 0xB229, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, 0xBA29, // 0x0400 (1024) +0xB1C7, 0xB1E7, 0xB1E7, 0xB1E7, 0xB207, 0xBA68, 0xC32A, 0xD531, 0xCD51, 0xB42D, 0x9B8B, 0x9329, 0xA38A, 0xABEC, 0xABEB, 0xABCB, // 0x0410 (1040) +0x8AE8, 0x8AA7, 0x9B09, 0xAB8A, 0xD4CE, 0xEDF3, 0xF655, 0xFED7, 0xFED8, 0xFEB7, 0xFEB7, 0xFE96, 0xFE76, 0xFE76, 0xFE76, 0xFE76, // 0x0420 (1056) +0xF634, 0xEDF3, 0xE592, 0xDD30, 0xCCAF, 0xC46E, 0xBC6E, 0xCD31, 0xD592, 0xE635, 0xE614, 0xEE97, 0xF6B8, 0xEE76, 0xEE14, 0xEE34, // 0x0430 (1072) +0xFED8, 0xF636, 0xEDB4, 0xCAEB, 0xBA69, 0xBA69, 0xBA49, 0xBA29, 0xBA29, 0xBA49, 0xBA49, 0xBA29, 0xBA29, 0xBA49, 0xBA49, 0xBA29, // 0x0440 (1088) +0xB1E7, 0xB1E7, 0xB1E7, 0xB1E7, 0xB227, 0xBAA9, 0xC32A, 0xC4AE, 0xBCAF, 0xB44E, 0xAC2D, 0x9B6A, 0xA3EC, 0x9349, 0x8AE8, 0x8AE8, // 0x0450 (1104) +0x9309, 0x8246, 0x8A87, 0x9AC8, 0xC40C, 0xEE14, 0xFED7, 0xFF19, 0xFF19, 0xFEF8, 0xFED8, 0xFEB7, 0xFEB7, 0xFEB7, 0xFEB7, 0xFE76, // 0x0460 (1120) +0xF635, 0xF5F4, 0xEDB2, 0xDD51, 0xD4EF, 0xC46E, 0xB42D, 0xBCAF, 0xD572, 0xE656, 0xDDD3, 0xD571, 0xDDD3, 0xE5F4, 0xE614, 0xF696, // 0x0470 (1136) +0xFEF8, 0xF676, 0xEDD5, 0xCB2C, 0xC28A, 0xBA69, 0xBA69, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, 0xBA49, // 0x0480 (1152) +0xB208, 0xB207, 0xB207, 0xB207, 0xBA48, 0xC2C9, 0xC32A, 0xB3CC, 0x9BAB, 0xAC4D, 0xA42D, 0x936A, 0xAC4D, 0xBCCF, 0xA3EC, 0xA3CC, // 0x0490 (1168) +0xBC6D, 0xBC0C, 0xB3AB, 0xC42C, 0xE5B2, 0xFEB7, 0xFEF8, 0xFF19, 0xFF39, 0xFF19, 0xFEF8, 0xFED8, 0xFED8, 0xFED8, 0xFED8, 0xFE97, // 0x04A0 (1184) +0xF634, 0xEDF3, 0xEDB2, 0xE551, 0xD4F0, 0xC46E, 0xB40D, 0xAC0D, 0xC4F0, 0xC531, 0xDDB3, 0xD551, 0xDD92, 0xE614, 0xEE76, 0xF6B7, // 0x04B0 (1200) +0xF6B7, 0xF697, 0xEDD4, 0xCB4C, 0xC2AA, 0xBA8A, 0xBA69, 0xBA49, 0xBA69, 0xBA69, 0xBA49, 0xBA49, 0xBA49, 0xBA69, 0xC269, 0xC249, // 0x04C0 (1216) +0xBA28, 0xBA28, 0xBA48, 0xBA47, 0xBA88, 0xC34A, 0xC3CC, 0xABAB, 0xA40C, 0xAC6E, 0xAC2D, 0x9BCC, 0xAC6E, 0xCD51, 0xCD31, 0xCD31, // 0x04D0 (1232) +0xD50F, 0xD50F, 0xDD30, 0xEDF3, 0xFEB6, 0xFED7, 0xFEF8, 0xFF39, 0xFF3A, 0xFF3A, 0xFF19, 0xFEF8, 0xFEF9, 0xFF19, 0xFEF9, 0xFEB7, // 0x04E0 (1248) +0xF655, 0xF5F4, 0xED92, 0xDD51, 0xD4F0, 0xC48E, 0xBC2E, 0xABCC, 0xB42D, 0xB48F, 0xD593, 0xDDF4, 0xD571, 0xDDB2, 0xDDD3, 0xEE34, // 0x04F0 (1264) +0xF635, 0xF676, 0xE532, 0xCB0B, 0xC2AA, 0xC28A, 0xBA69, 0xBA69, 0xBA69, 0xBA69, 0xC269, 0xC26A, 0xC269, 0xC26A, 0xC26A, 0xC269, // 0x0500 (1280) +0xBA48, 0xBA48, 0xBA48, 0xBA68, 0xC309, 0xC40C, 0xBC4C, 0xABEC, 0xB4AF, 0xBCCF, 0xAC4D, 0xA40C, 0xB4AF, 0xBCCF, 0xBCCF, 0xCD51, // 0x0510 (1296) +0xC4AE, 0xD4EF, 0xEDD2, 0xF675, 0xFE96, 0xFEB7, 0xFEF8, 0xFF3A, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF3A, 0xFF3A, 0xFF3A, 0xFF1A, 0xFEF9, // 0x0520 (1312) +0xFE96, 0xF635, 0xEDB2, 0xDD51, 0xD510, 0xCCAF, 0xC46E, 0xABED, 0xA3CC, 0xA3ED, 0xC511, 0xD572, 0xD551, 0xDDB2, 0xDD92, 0xE5F3, // 0x0530 (1328) +0xEE14, 0xF635, 0xE4D1, 0xCB0B, 0xC2CA, 0xC28A, 0xC28A, 0xC26A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, // 0x0540 (1344) +0xBA68, 0xBA68, 0xBA68, 0xC2A9, 0xC3CB, 0xC42C, 0xBC0C, 0xA3EC, 0xC531, 0xBCCF, 0xB46D, 0xB48E, 0xA42D, 0xB46E, 0x9BCB, 0xABCC, // 0x0550 (1360) +0xC46E, 0xDD30, 0xEDF3, 0xEDF4, 0xDD92, 0xE5B2, 0xEE35, 0xF677, 0xF71A, 0xFF5B, 0xFF5B, 0xFF5A, 0xFF5A, 0xFF1A, 0xFF19, 0xFEF8, // 0x0560 (1376) +0xF676, 0xEDF4, 0xDD31, 0xCCAF, 0xB40D, 0xABCC, 0xB40D, 0xB40D, 0xA3AC, 0x9B6B, 0xA3AC, 0xAC2D, 0xCD30, 0xDD92, 0xDD92, 0xE5F3, // 0x0570 (1392) +0xEE35, 0xF635, 0xE4F1, 0xD38C, 0xCAEB, 0xC2AA, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC2AA, 0xC28A, 0xC28A, // 0x0580 (1408) +0xBA68, 0xBA68, 0xC288, 0xC2E9, 0xCC8E, 0xCCCF, 0xB44C, 0xAC2D, 0xC510, 0xB48E, 0xBCCF, 0xC531, 0xAC2D, 0xA3CB, 0xA3EC, 0xBC4D, // 0x0590 (1424) +0xD4CF, 0xDD30, 0xDD51, 0xABCC, 0xA38B, 0xABAB, 0xABAB, 0xABCC, 0xBC6E, 0xD551, 0xEE15, 0xFF19, 0xFF3A, 0xFEF9, 0xFEB7, 0xF697, // 0x05A0 (1440) +0xE5B3, 0xBC4D, 0x930A, 0x8288, 0x7A47, 0x8288, 0x7A89, 0x936B, 0x9B8C, 0x8B0A, 0x9B6B, 0xA3AC, 0xC4CF, 0xE5F3, 0xE5D3, 0xE5F3, // 0x05B0 (1456) +0xEE14, 0xF614, 0xED72, 0xDC2E, 0xCB0B, 0xC2AA, 0xC2AA, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC28A, 0xC2AA, 0xC2AA, 0xC28A, // 0x05C0 (1472) +0xC288, 0xC289, 0xC2A9, 0xC30A, 0xD4CF, 0xD550, 0xB44C, 0xA42D, 0xBCEF, 0xB48E, 0xDDD3, 0xE676, 0xBCEF, 0xA3EC, 0xABEC, 0xBC2D, // 0x05D0 (1488) +0xCC8E, 0xCC8E, 0xABAB, 0xCCAF, 0xE5B2, 0xE5D3, 0xDD51, 0xCCAE, 0xC44D, 0xC46E, 0xE592, 0xF697, 0xFEF8, 0xFEB8, 0xF635, 0xE592, // 0x05E0 (1504) +0xC42D, 0xA32A, 0x9B0A, 0xB3EC, 0xCC8E, 0xCC6E, 0xB3ED, 0x8B4B, 0x936C, 0x82A9, 0x8B0A, 0x9B4A, 0xC4CF, 0xE614, 0xEE14, 0xE5F3, // 0x05F0 (1520) +0xEE14, 0xEDD3, 0xEDD3, 0xED52, 0xD36C, 0xC2CB, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC28A, 0xC28A, 0xC2AA, 0xCACA, 0xC2AA, 0xC2AA, // 0x0600 (1536) +0xC288, 0xC2A9, 0xC2A9, 0xC309, 0xD4AE, 0xD571, 0xB44D, 0xA40D, 0xBCCF, 0xC530, 0xD592, 0xC531, 0xA42D, 0x9BAB, 0x9B8B, 0xB3EC, // 0x0610 (1552) +0xBC2D, 0xABCC, 0xC44D, 0xDD51, 0xEDB2, 0xEDD3, 0xEDB2, 0xDD51, 0xDD10, 0xD510, 0xE592, 0xF635, 0xFED8, 0xF697, 0xEDB3, 0xD4AF, // 0x0620 (1568) +0xAB8B, 0xA34A, 0xBC2D, 0xD4AF, 0xD4AF, 0xCC4D, 0xB3CC, 0xAC0E, 0x9BCD, 0x7A48, 0x930A, 0x9B6A, 0xC4AF, 0xE5F4, 0xEE13, 0xE5D2, // 0x0630 (1584) +0xEDF3, 0xEDB3, 0xED93, 0xF5F5, 0xD38C, 0xCACB, 0xC2CA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, 0xC2AA, // 0x0640 (1600) +0xC289, 0xC2A9, 0xC2A9, 0xC309, 0xC3AB, 0xBC6D, 0xB44D, 0x9C0C, 0xC530, 0xC530, 0xBCCF, 0xB48E, 0xA40C, 0x8B4A, 0x9B6A, 0xB3CC, // 0x0650 (1616) +0xB3CC, 0xABAB, 0xCC6E, 0xD4CF, 0xE551, 0xF656, 0xFEB7, 0xF676, 0xEE14, 0xE5B3, 0xDD51, 0xF614, 0xFEB8, 0xFEB8, 0xE572, 0xB3EC, // 0x0660 (1632) +0x9B2A, 0xD4F0, 0xF656, 0xF656, 0xE572, 0xBC0D, 0x9B0A, 0x9B4B, 0xAC4F, 0x7248, 0x9B4B, 0xA3AB, 0xCCCF, 0xDD92, 0xE5D2, 0xEDF3, // 0x0670 (1648) +0xEDF3, 0xF5F4, 0xF5B3, 0xF5D4, 0xD38D, 0xCAEA, 0xCACA, 0xC2AA, 0xC2AA, 0xCAAA, 0xC2AA, 0xC2AA, 0xCAAA, 0xCACB, 0xCACA, 0xCACA, // 0x0680 (1664) +0xC2A9, 0xC2C9, 0xC2C9, 0xC2E9, 0xC3AB, 0xAB8A, 0x9BAA, 0xA40D, 0xC531, 0xB46E, 0xB48E, 0xAC4D, 0x9BCB, 0x8309, 0x9B6B, 0xB3CC, // 0x0690 (1680) +0xB3CC, 0xB3AB, 0xBC2D, 0xCC8E, 0xDD51, 0xDDB3, 0xCD52, 0xC4D0, 0xD531, 0xE5B3, 0xE5B3, 0xEDD3, 0xFE97, 0xFED8, 0xDD31, 0x9B2A, // 0x06A0 (1696) +0xBC4F, 0xDD93, 0xC511, 0xAC2E, 0xABED, 0xABAC, 0x8AC9, 0x8AC9, 0xA40E, 0x7A68, 0x9B6B, 0xABEC, 0xC4AE, 0xDD71, 0xE5D3, 0xE5D2, // 0x06B0 (1712) +0xEDF3, 0xF614, 0xF635, 0xEDB3, 0xD38C, 0xCAEA, 0xCACA, 0xC2CA, 0xC2CA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACB, 0xCACA, 0xCACA, // 0x06C0 (1728) +0xC2C9, 0xC2E9, 0xCAE9, 0xC2E9, 0xC329, 0xB3AB, 0x9329, 0x8B6B, 0xAC6E, 0x8B4A, 0x9BCC, 0x9BCC, 0x936B, 0x8B09, 0x936A, 0xABCC, // 0x06D0 (1744) +0xB3EC, 0xB3CC, 0xA38B, 0x930A, 0x7247, 0x5144, 0x4103, 0x6207, 0x934A, 0xC48F, 0xEE15, 0xEDF4, 0xF635, 0xFE97, 0xDD31, 0xA36B, // 0x06E0 (1760) +0xC4B0, 0xA3ED, 0x7AEA, 0x4144, 0x38C2, 0x40E3, 0x59A6, 0x7268, 0xA3ED, 0x82C9, 0x936B, 0xABEC, 0xBC4C, 0xD530, 0xEE34, 0xEE34, // 0x06F0 (1776) +0xEDF3, 0xEDD3, 0xF676, 0xEDB3, 0xD38C, 0xCAEB, 0xCAEA, 0xC2CA, 0xC2CA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACB, 0xCACB, 0xCACB, // 0x0700 (1792) +0xC2C9, 0xCAE9, 0xCAEA, 0xCB0A, 0xCB0A, 0xBB09, 0x8A67, 0x7A88, 0x8B2A, 0x59A5, 0x7AC9, 0x9BEC, 0xA40C, 0x936A, 0x936B, 0xABEC, // 0x0710 (1808) +0xC46E, 0xCCAF, 0xBC4E, 0x7A88, 0x6A06, 0x8B2A, 0xB46E, 0xCCF0, 0xDDB3, 0xEE56, 0xF656, 0xEE14, 0xEE14, 0xF656, 0xDD52, 0xB40D, // 0x0720 (1824) +0xCCCF, 0xDD72, 0xDD72, 0xBC8F, 0xA3AC, 0x82C9, 0x6A07, 0x934B, 0xB44E, 0x938C, 0x934A, 0xAC0C, 0xBC4D, 0xC4AE, 0xDD51, 0xEE54, // 0x0730 (1840) +0xF676, 0xEDD3, 0xF614, 0xED32, 0xD38C, 0xCB0B, 0xCAEB, 0xCAEA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCACA, 0xCAEB, 0xCAEB, 0xCACB, // 0x0740 (1856) +0xCAE9, 0xCAEA, 0xCB0A, 0xCB0A, 0xCB0A, 0xCB2A, 0xB32A, 0x7206, 0x7247, 0x61A5, 0x82E9, 0xAC0C, 0xAC4D, 0xA3CB, 0x9BAB, 0xBC4D, // 0x0750 (1872) +0xD4EF, 0xE592, 0xEDF3, 0xEE14, 0xE5F4, 0xEE35, 0xEDF4, 0xEE55, 0xF6B8, 0xF6B7, 0xF676, 0xEE14, 0xEDD3, 0xEDF4, 0xE572, 0xCCB0, // 0x0760 (1888) +0xC44E, 0xD510, 0xE592, 0xE592, 0xDD51, 0xDD51, 0xCCD0, 0xB40D, 0xBC6F, 0xB46F, 0x9BAB, 0xAC0C, 0xBC4D, 0xC4CF, 0xDD71, 0xE5F3, // 0x0770 (1904) +0xFED8, 0xEDB2, 0xED72, 0xE4B0, 0xD34B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEA, 0xCAEA, 0xCACA, 0xCACA, 0xCAEB, 0xCAEB, 0xCACB, 0xCAEB, // 0x0780 (1920) +0xC2C9, 0xCAE9, 0xCB0A, 0xCB09, 0xCB09, 0xCB4A, 0xC3AB, 0x8267, 0x7247, 0x69E6, 0x6164, 0x9B4A, 0xBCAF, 0xB42C, 0xABEC, 0xBC6E, // 0x0790 (1936) +0xDD51, 0xEDF3, 0xF676, 0xFEB7, 0xFEF8, 0xFED8, 0xFED8, 0xFEF8, 0xFEF8, 0xFEB7, 0xF656, 0xEDD3, 0xE571, 0xEDF4, 0xEDB3, 0xD511, // 0x07A0 (1952) +0xBC2D, 0xCCCF, 0xE551, 0xE5B3, 0xEDD3, 0xE5B2, 0xE572, 0xD510, 0xCD11, 0xCD73, 0xA3CC, 0xA3AB, 0xB40C, 0xC4CE, 0xE5F3, 0xEE34, // 0x07B0 (1968) +0xF696, 0xE530, 0xE4AF, 0xD3CD, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEA, 0xCAEB, 0xCACA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, // 0x07C0 (1984) +0xC2C9, 0xC2E9, 0xC2E9, 0xC2E9, 0xCB09, 0xCB4A, 0xBB6A, 0x8AC8, 0x82C8, 0x7226, 0x6984, 0x8247, 0xB44D, 0xBC6E, 0xB42D, 0xBC6E, // 0x07D0 (2000) +0xD530, 0xE5B3, 0xF675, 0xFEB7, 0xFEF8, 0xFEF8, 0xFEF8, 0xFEF7, 0xFEF8, 0xFEB7, 0xF634, 0xE551, 0xDD31, 0xF677, 0xF656, 0xD4F0, // 0x07E0 (2016) +0xBC6F, 0xCC8F, 0xE551, 0xE572, 0xED92, 0xE571, 0xDD31, 0xD4F0, 0xD552, 0xD593, 0xA3AB, 0xA38A, 0xB42D, 0xC4EF, 0xE614, 0xEE34, // 0x07F0 (2032) +0xE5B2, 0xDCAF, 0xD3ED, 0xCB2B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEA, 0xCAEA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCACB, // 0x0800 (2048) +0xC2E9, 0xCAE9, 0xCB09, 0xCB09, 0xCB2A, 0xB309, 0xBB8B, 0x82A8, 0x82C8, 0x82E8, 0x8267, 0xAB6A, 0xCCAE, 0xB3EC, 0xABCC, 0xB42D, // 0x0810 (2064) +0xCCAF, 0xDD51, 0xEDF3, 0xF655, 0xFEB7, 0xFEF8, 0xFF39, 0xFF19, 0xFEF8, 0xF696, 0xE5B2, 0xD4CF, 0xBBEC, 0xC42D, 0xBC2D, 0x8AA8, // 0x0820 (2080) +0x8AEA, 0xA3AC, 0xE551, 0xEDB2, 0xEDB2, 0xE572, 0xDCF0, 0xD4F0, 0xDDD4, 0xCD32, 0xA36B, 0xA3AB, 0xB42D, 0xCD30, 0xDD92, 0xE5F3, // 0x0830 (2096) +0xDD10, 0xD3CC, 0xD34B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0840 (2112) +0xCB09, 0xCB09, 0xCB09, 0xC309, 0xBAE9, 0xB2E9, 0xB36A, 0x7A46, 0x8287, 0x8AC8, 0xABCB, 0xC44D, 0xDD2F, 0xAB6A, 0xA36A, 0xABAB, // 0x0850 (2128) +0xB40D, 0xD4CF, 0xE571, 0xEDF3, 0xF655, 0xFEF8, 0xFF7B, 0xFF3A, 0xFED7, 0xF655, 0xDD10, 0xB38B, 0x7A06, 0x92C8, 0x71E6, 0x5103, // 0x0860 (2144) +0x5103, 0x71E6, 0xD4CF, 0xEDD3, 0xEDF4, 0xE592, 0xDCD0, 0xD4F0, 0xE636, 0xB46F, 0x8AA8, 0x9329, 0xBC8E, 0xDDD3, 0xDD92, 0xE5B2, // 0x0870 (2160) +0xE531, 0xD3CC, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEA, 0xCAEB, 0xCB0B, 0xCAEB, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0880 (2176) +0xCB09, 0xCB0A, 0xCB0A, 0xCB09, 0xC2E9, 0x9A46, 0x8266, 0x71E5, 0x82A7, 0xABEB, 0xD551, 0xD550, 0xD4EE, 0xBBCB, 0xBC0C, 0xA34A, // 0x0890 (2192) +0xA34A, 0xBC0C, 0xD4CF, 0xE530, 0xEDB2, 0xF696, 0xFF19, 0xFEF8, 0xF655, 0xF634, 0xE5B3, 0xC46E, 0xDD10, 0xD4D0, 0x9B2A, 0x8247, // 0x08A0 (2208) +0x69A5, 0x7A27, 0xCC8E, 0xEDD3, 0xEDF4, 0xE571, 0xD48E, 0xCCAF, 0xD593, 0xA3AC, 0x8227, 0x8247, 0xAC0D, 0xC4CF, 0xCCEF, 0xDD30, // 0x08B0 (2224) +0xE551, 0xD3ED, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x08C0 (2240) +0xCB09, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB2A, 0x9A67, 0x6184, 0x7226, 0x8AC8, 0xABEB, 0xD571, 0xD571, 0xC46D, 0xD50F, 0xCC8E, 0xA34A, // 0x08D0 (2256) +0x92E9, 0xAB8B, 0xC42C, 0xD4AE, 0xE530, 0xEDD3, 0xF675, 0xF675, 0xEE14, 0xF655, 0xF635, 0xF635, 0xF635, 0xEE14, 0xEDB3, 0xDD30, // 0x08E0 (2272) +0xC46E, 0xC46E, 0xCCAF, 0xE551, 0xE592, 0xD4F0, 0xC40D, 0xB3EC, 0xBC8F, 0x9B6B, 0x7A07, 0x7A06, 0x9309, 0xB40C, 0xCCAE, 0xDD31, // 0x08F0 (2288) +0xE531, 0xD3AC, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCAEB, 0xCAEA, 0xCAEB, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, 0xCAEB, 0xCAEB, // 0x0900 (2304) +0xCB0A, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB2A, 0xB2C8, 0x8206, 0x8B29, 0x934A, 0xB48E, 0xCD30, 0xC4EE, 0xBC4C, 0xD4EF, 0xDD71, 0xB3CB, // 0x0910 (2320) +0x8AE9, 0x9B09, 0xB3CB, 0xC42C, 0xD4AE, 0xE550, 0xEDD2, 0xEE13, 0xEE14, 0xF635, 0xEE14, 0xED92, 0xEE14, 0xE551, 0xDCF0, 0xD44D, // 0x0920 (2336) +0xB32A, 0xBBAB, 0xBC2D, 0xCC8E, 0xD4CF, 0xC42D, 0xB3AB, 0x9B4A, 0xA3CC, 0x9B4B, 0x71C6, 0x61A5, 0x8AC8, 0xABEC, 0xCCCF, 0xE571, // 0x0930 (2352) +0xDCAF, 0xD36C, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCAEA, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, // 0x0940 (2368) +0xCB0A, 0xCB0A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xBB09, 0x9AC8, 0x7A88, 0xA40C, 0xBCEF, 0xB44D, 0xABCA, 0xC44D, 0xDD30, 0xBC2C, // 0x0950 (2384) +0x9309, 0x9B2A, 0xB3AB, 0xC40C, 0xD48D, 0xDD2F, 0xE591, 0xEDD2, 0xEDF3, 0xDD51, 0xB2E9, 0xAA26, 0xAA87, 0xA226, 0x99C5, 0x9184, // 0x0960 (2400) +0x78C1, 0x70C1, 0x81E5, 0xABAB, 0xD4AF, 0xC44D, 0xAB8B, 0x930A, 0xA3CC, 0x8AEA, 0x4104, 0x5165, 0x92E9, 0xA38A, 0xBC0C, 0xCC6E, // 0x0970 (2416) +0xCB6C, 0xCB2B, 0xCB2B, 0xD34C, 0xD34B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCAEB, // 0x0980 (2432) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB6A, 0xD38B, 0xC329, 0x79A5, 0x69E5, 0x7AC8, 0x8B08, 0x9308, 0xAB69, 0xB40C, 0xAC0C, // 0x0990 (2448) +0x9B8B, 0x9B4A, 0xB3AB, 0xBC0B, 0xCC8D, 0xDD0F, 0xE571, 0xE571, 0xDD30, 0x9A05, 0x80E1, 0x9A47, 0xC490, 0xD594, 0xCD11, 0xBC8F, // 0x09A0 (2464) +0x8A67, 0x60C2, 0x5860, 0x9288, 0xCC8E, 0xC46D, 0xABAB, 0x934B, 0xAC0D, 0x6AA9, 0x3125, 0x4986, 0x7268, 0x9B2A, 0xB3CB, 0xD46E, // 0x09B0 (2480) +0xCB4B, 0xCB2B, 0xD34B, 0xD34C, 0xD34C, 0xD32B, 0xCB2B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, // 0x09C0 (2496) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xD36B, 0xCB6B, 0xBAE9, 0x81A5, 0x50E2, 0x5984, 0x5984, 0x6184, 0x8AC8, 0x7288, 0x41E7, // 0x09D0 (2512) +0x8B09, 0x934A, 0xABAB, 0xBC0C, 0xCC8D, 0xDD0F, 0xE571, 0xDD50, 0xC42C, 0x60A1, 0x6123, 0xA38C, 0xC4F1, 0xCD52, 0xCD52, 0xB44E, // 0x09E0 (2528) +0x8AE9, 0x6185, 0x58C2, 0xB36A, 0xCCAE, 0xC46E, 0xABCC, 0xA3AC, 0xAC4E, 0x4985, 0x28C4, 0x3105, 0x7ACA, 0xA36A, 0xB3AB, 0xD40D, // 0x09F0 (2544) +0xCB4B, 0xCB2B, 0xD34C, 0xD34C, 0xD34C, 0xD34B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB0B, 0xCB0B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, // 0x0A00 (2560) +0xCB4A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB4A, 0xD36A, 0xD36A, 0x8A06, 0x5923, 0x48E3, 0x5164, 0x5984, 0x5984, 0x49C6, 0x3965, 0x39C7, // 0x0A10 (2576) +0x59E6, 0x832A, 0xABAB, 0xBC0C, 0xCC8E, 0xDD30, 0xE591, 0xEDD2, 0xE591, 0xA267, 0x9AA8, 0xCC8F, 0xD532, 0xDDB4, 0xD594, 0xBBEC, // 0x0A20 (2592) +0x9206, 0x70E3, 0x91E5, 0xC44D, 0xCCAE, 0xC44D, 0xB3EC, 0xABEC, 0xB44E, 0x4186, 0x3146, 0x30C4, 0x8B2B, 0xB3CC, 0xCBCC, 0xD3AC, // 0x0A30 (2608) +0xD34B, 0xD34B, 0xD34C, 0xD36C, 0xD34C, 0xD34B, 0xCB2B, 0xD32B, 0xCB2B, 0xCB0B, 0xCB0B, 0xCB2B, 0xD32B, 0xD32B, 0xCB0B, 0xCB0B, // 0x0A40 (2624) +0xCB4A, 0xCB4A, 0xD36A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0x79C5, 0x69C5, 0x7267, 0x61C5, 0x61A5, 0x5143, 0x2061, 0x3145, 0x20C3, // 0x0A50 (2640) +0x2125, 0x6ACA, 0xA38B, 0xBC0C, 0xCC6D, 0xDD0F, 0xE591, 0xEDF3, 0xEE13, 0xDCF0, 0xAA46, 0xAA26, 0xC36B, 0xC36B, 0xBB09, 0xA1C5, // 0x0A60 (2656) +0x88E2, 0x8984, 0xAB6A, 0xC44D, 0xC44D, 0xBC2D, 0xABED, 0xAC0D, 0x9BCD, 0x2041, 0x3925, 0x6228, 0xA36B, 0xCBAC, 0xD38C, 0xCB4B, // 0x0A70 (2672) +0xCB4B, 0xD34B, 0xD34C, 0xD36C, 0xD34C, 0xD34C, 0xD34C, 0xD34B, 0xD32B, 0xCB2B, 0xCB2B, 0xD32B, 0xD34B, 0xD32B, 0xD32B, 0xD32B, // 0x0A80 (2688) +0xCB4A, 0xCB4A, 0xD36A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB4A, 0x7184, 0x61A4, 0x7AA7, 0x6A26, 0x4902, 0x3061, 0x2925, 0x4208, 0x4A8A, // 0x0A90 (2704) +0x20E4, 0x4165, 0x8309, 0xABCB, 0xC44D, 0xD4CE, 0xDD50, 0xE5D2, 0xEE13, 0xEE14, 0xDCCF, 0xB2C8, 0xA1E5, 0xA226, 0xA1E5, 0x8984, // 0x0AA0 (2720) +0x9226, 0xAB4A, 0xBC0D, 0xBC0C, 0xBC0C, 0xB3EC, 0xABCC, 0xAC2D, 0x82EA, 0x4924, 0x5186, 0xAB6B, 0xCB8C, 0xCB6B, 0xD36B, 0xCB4B, // 0x0AB0 (2736) +0xCB4B, 0xD34C, 0xD36C, 0xD36C, 0xD36C, 0xD36C, 0xD34C, 0xD34B, 0xCB2B, 0xD32B, 0xD34B, 0xD36C, 0xD36C, 0xD36C, 0xD34B, 0xD34C, // 0x0AC0 (2752) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB4A, 0x7143, 0x6184, 0x8B49, 0x938B, 0x8309, 0x40E2, 0x3082, 0x28E3, 0x41E8, // 0x0AD0 (2768) +0x28E4, 0x30C2, 0x6A67, 0x936A, 0xB40C, 0xC46D, 0xD50F, 0xE591, 0xEDF3, 0xF634, 0xEE14, 0xEDD3, 0xE551, 0xDCF0, 0xD4AF, 0xD4AF, // 0x0AE0 (2784) +0xCC8E, 0xCC6E, 0xC46E, 0xBC2D, 0xB3EC, 0xA3AB, 0xA38B, 0xA3EC, 0xA3CC, 0x7A68, 0xA36B, 0xCBCC, 0xCB6C, 0xD36B, 0xD36B, 0xD34B, // 0x0AF0 (2800) +0xD34B, 0xD34C, 0xD36C, 0xD36C, 0xD38C, 0xDBEE, 0xE4B1, 0xE4D1, 0xDC6F, 0xDC6F, 0xE4B0, 0xE511, 0xED31, 0xE4F0, 0xE48F, 0xDC2E, // 0x0B00 (2816) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xAA87, 0x7184, 0x7226, 0x8B49, 0x936A, 0x7287, 0x48E2, 0x4144, 0x4164, // 0x0B10 (2832) +0x2861, 0x30C3, 0x7267, 0x7AC9, 0x934A, 0xBC4D, 0xCCCE, 0xDD30, 0xE5B2, 0xEE14, 0xF655, 0xF655, 0xF676, 0xF676, 0xF614, 0xEDB3, // 0x0B20 (2848) +0xDD10, 0xD4F0, 0xCC8E, 0xBC2D, 0xA3AB, 0x9B6B, 0x9B6B, 0x8B0A, 0xA3CC, 0x8B6B, 0x9B8C, 0xB3AD, 0xCBAC, 0xCB6B, 0xD36B, 0xD34B, // 0x0B30 (2864) +0xD36C, 0xD3AC, 0xDC0E, 0xE4D1, 0xEE16, 0xF6FA, 0xF6B8, 0xF6B7, 0xFEB7, 0xFEB7, 0xFED8, 0xFED8, 0xFED8, 0xFE96, 0xF614, 0xED92, // 0x0B40 (2880) +0xCB2A, 0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xB2C8, 0x71A5, 0x71E6, 0x8287, 0x82E8, 0x7AA7, 0x7267, 0x8309, 0x51A4, // 0x0B50 (2896) +0x38A1, 0x3881, 0x7AA8, 0x8B29, 0x6A47, 0x9B6A, 0xBC4C, 0xCCCE, 0xDD51, 0xEDD3, 0xF635, 0xF696, 0xFED8, 0xFEF9, 0xF655, 0xEDB3, // 0x0B60 (2912) +0xDCF0, 0xD4EF, 0xC46E, 0xABEC, 0x9B6B, 0x8B2A, 0x7A68, 0x6A27, 0x936B, 0x8B6C, 0x834C, 0x7B2B, 0x9BED, 0xB3CD, 0xB34B, 0xB36C, // 0x0B70 (2928) +0xC46F, 0xE5B5, 0xF71B, 0xFFDE, 0xFFDF, 0xF71A, 0xFF39, 0xFF3A, 0xFF3A, 0xFF39, 0xFF3A, 0xFF5A, 0xFF3A, 0xFF19, 0xFE97, 0xF634, // 0x0B80 (2944) +0xCB2A, 0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xD38B, 0xD38B, 0xC329, 0x81E5, 0x7226, 0x8B09, 0x8B08, 0x8AE8, 0x936A, 0x7AE9, 0x6A67, // 0x0B90 (2960) +0x6206, 0x4103, 0x7AC9, 0xAC0C, 0x82C8, 0x59E6, 0x82E9, 0xABEC, 0xC48E, 0xDD50, 0xEDD3, 0xF655, 0xF696, 0xEE55, 0xE5D3, 0xEDD3, // 0x0BA0 (2976) +0xDD30, 0xCC8E, 0xABCC, 0x934A, 0x82C9, 0x6A07, 0x5965, 0x5985, 0x6A07, 0x7B4B, 0x838D, 0x7B4C, 0x8BCD, 0x9C4F, 0xACB0, 0xAC90, // 0x0BB0 (2992) +0xD636, 0xF75C, 0xFFDF, 0xFFFF, 0xF73B, 0xFF5A, 0xFF7B, 0xFF5A, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF18, 0xFE96, // 0x0BC0 (3008) +0xCB4A, 0xCB4A, 0xCB4A, 0xD36A, 0xD36B, 0xD38B, 0xD3AB, 0xCB8B, 0x89E5, 0x5943, 0x7267, 0x8B09, 0x8B29, 0x8B6A, 0x8309, 0x9BEC, // 0x0BD0 (3024) +0x834A, 0x51C5, 0x6A88, 0xAC2D, 0xAC0C, 0x6A27, 0x4923, 0x6227, 0x934A, 0xB40D, 0xCCCF, 0xD551, 0xD551, 0xD510, 0xCCAF, 0xCCF0, // 0x0BE0 (3040) +0xB40D, 0x932A, 0x82C9, 0x7A88, 0x61E6, 0x5964, 0x5944, 0x5144, 0x5144, 0x49C6, 0x6289, 0x6ACA, 0x83AD, 0xBD74, 0xE6B9, 0xDE99, // 0x0BF0 (3056) +0xEF1B, 0xFFDE, 0xFFFF, 0xFFDF, 0xF71A, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF7B, 0xFF9B, 0xFF9B, 0xFF7B, 0xFF3A, 0xFED7, // 0x0C00 (3072) +0xCB4A, 0xCB4A, 0xD36A, 0xD36B, 0xD36A, 0xD38B, 0xD3AB, 0xD3AB, 0xAA67, 0x50E2, 0x5964, 0x69E5, 0x7AC8, 0x834A, 0xA44D, 0xB4F0, // 0x0C10 (3088) +0xC5B3, 0xA4B0, 0x8BAC, 0xAC2D, 0xC48E, 0xB42D, 0x7AA8, 0x4103, 0x4123, 0x6227, 0x7AA9, 0x8B2A, 0x8B09, 0x82A8, 0x7247, 0x7227, // 0x0C20 (3104) +0x69E6, 0x6A06, 0x61C6, 0x5985, 0x5144, 0x5144, 0x5124, 0x5103, 0x48E3, 0x2041, 0x1800, 0x1800, 0x1820, 0x3124, 0x83CF, 0xBDF7, // 0x0C30 (3120) +0xF77D, 0xFFDF, 0xFFFF, 0xF79D, 0xEED8, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF9B, 0xFF3A, 0xFEF8, // 0x0C40 (3136) +0xCB4A, 0xD34B, 0xD36B, 0xD38B, 0xD36B, 0xD38B, 0xD3AB, 0xD38B, 0xB2C9, 0x7985, 0x71A5, 0x8267, 0x8B09, 0x8B4A, 0xBD10, 0xDE97, // 0x0C50 (3152) +0xEF3B, 0xEF3B, 0xDE98, 0xBCF0, 0xC4AE, 0xC4CF, 0xB44D, 0x82A8, 0x5184, 0x4103, 0x4124, 0x4964, 0x5165, 0x5164, 0x5164, 0x5964, // 0x0C60 (3168) +0x5964, 0x5944, 0x5144, 0x5124, 0x5124, 0x5144, 0x5124, 0x5103, 0x40C3, 0x2041, 0x1800, 0x1800, 0x1821, 0x1842, 0x2083, 0x3146, // 0x0C70 (3184) +0x738E, 0xCE59, 0xF7BF, 0xE6B9, 0xEEB8, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7A, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF39, 0xFED8, // 0x0C80 (3200) +0xCB4A, 0xD34A, 0xD36B, 0xD36B, 0xCB6B, 0xD38B, 0xD3AB, 0xD38B, 0xC34A, 0x91E6, 0x8A26, 0x9AE9, 0x9B4A, 0x9BCB, 0xDE77, 0xEF1A, // 0x0C90 (3216) +0xF79D, 0xFFDE, 0xFFBE, 0xD615, 0xBCCE, 0xCCEF, 0xCD10, 0xC4AE, 0x9B8B, 0x6206, 0x4964, 0x4124, 0x4924, 0x4923, 0x5144, 0x5144, // 0x0CA0 (3232) +0x5124, 0x5944, 0x5944, 0x5124, 0x5124, 0x5144, 0x5944, 0x5124, 0x48E3, 0x2841, 0x1800, 0x1800, 0x1821, 0x1863, 0x1883, 0x1884, // 0x0CB0 (3248) +0x20A4, 0x2925, 0x736E, 0xA42E, 0xF6F9, 0xFF7C, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF9B, 0xFF9B, 0xFF7B, 0xFF19, 0xFED7, // 0x0CC0 (3264) +0xCB4A, 0xCB4B, 0xD36B, 0xD36B, 0xD36B, 0xD38B, 0xD3AB, 0xD3AC, 0xD3AB, 0xC34A, 0xB2E9, 0xBB4A, 0xC3EC, 0xDE36, 0xFFBE, 0xFFBE, // 0x0CD0 (3280) +0xFFBE, 0xFFFF, 0xFFDE, 0xEF1A, 0xC510, 0xCD0F, 0xCD30, 0xD550, 0xC4CF, 0x9BAB, 0x7267, 0x5185, 0x4944, 0x4944, 0x5144, 0x5144, // 0x0CE0 (3296) +0x5944, 0x5964, 0x5964, 0x5124, 0x5124, 0x5964, 0x5964, 0x5144, 0x4903, 0x3082, 0x1820, 0x1821, 0x1862, 0x1883, 0x1884, 0x1884, // 0x0CF0 (3312) +0x1883, 0x2084, 0x20C4, 0x6269, 0xEE97, 0xFF5B, 0xFF7B, 0xFF9C, 0xFF9C, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5A, 0xFF19, 0xF6B6, // 0x0D00 (3328) +0xD36B, 0xD36B, 0xD36B, 0xD38B, 0xD38B, 0xD3AB, 0xD3AB, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD40D, 0xE5D5, 0xFFBE, 0xFFFF, 0xFFFF, // 0x0D10 (3344) +0xFFFF, 0xFFFF, 0xFFDE, 0xF79D, 0xD5D4, 0xC510, 0xCD30, 0xD571, 0xD571, 0xCCEF, 0xA3EC, 0x7AA8, 0x59A5, 0x5164, 0x5164, 0x5164, // 0x0D20 (3360) +0x5965, 0x5964, 0x5964, 0x5944, 0x5944, 0x5965, 0x5985, 0x5164, 0x5144, 0x4904, 0x4924, 0x30C3, 0x20A4, 0x20A4, 0x2084, 0x2084, // 0x0D30 (3376) +0x1884, 0x1884, 0x1883, 0x28E4, 0x732C, 0xDE57, 0xFF5A, 0xFF7B, 0xFF9B, 0xFF7B, 0xFF7B, 0xFF7B, 0xFF5B, 0xFF3A, 0xFEF8, 0xF675, // 0x0D40 (3392) +0xD36B, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3ED, 0xDCB0, 0xF75C, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D50 (3408) +0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xDE77, 0xC510, 0xCD30, 0xD551, 0xD551, 0xD550, 0xC4CF, 0xABEC, 0x82C8, 0x61E6, 0x5985, 0x5985, // 0x0D60 (3424) +0x5985, 0x5985, 0x5965, 0x5964, 0x5985, 0x5985, 0x5985, 0x5985, 0x5965, 0x69E6, 0x934A, 0x936B, 0x3946, 0x28C5, 0x20A4, 0x2084, // 0x0D70 (3440) +0x1884, 0x1884, 0x1883, 0x1884, 0x20C4, 0x49E8, 0xACF2, 0xEEF9, 0xFF5B, 0xFF5A, 0xFF5A, 0xFF7B, 0xFF3A, 0xFF18, 0xF6B6, 0xEE34, // 0x0D80 (3456) +0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3CC, 0xDC0D, 0xE4F1, 0xFF9D, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0D90 (3472) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFDE, 0xEF1A, 0xC530, 0xC50F, 0xD550, 0xD550, 0xD550, 0xCD30, 0xC4AE, 0xABEC, 0x8AE9, 0x7227, 0x69E6, // 0x0DA0 (3488) +0x61A5, 0x61A5, 0x61A5, 0x5985, 0x5985, 0x61A5, 0x61A5, 0x61C6, 0x61E6, 0x9309, 0xBC4D, 0xD510, 0x8B8C, 0x3105, 0x20C5, 0x20A4, // 0x0DB0 (3504) +0x2084, 0x1883, 0x1884, 0x1884, 0x1863, 0x20A4, 0x2905, 0x7B8D, 0xDE77, 0xFF39, 0xFF3A, 0xFF3A, 0xFF19, 0xFED7, 0xF696, 0xEE34, // 0x0DC0 (3520) +0xD36B, 0xD38B, 0xD3AB, 0xD38B, 0xD38B, 0xD3AB, 0xD3AC, 0xD3CC, 0xD3CC, 0xD3EC, 0xDC0D, 0xDC6E, 0xF6D9, 0xF79D, 0xFFDF, 0xFFFF, // 0x0DD0 (3536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79D, 0xBCEF, 0xBCCE, 0xCD30, 0xD571, 0xD571, 0xCD50, 0xCD10, 0xC4AE, 0xB42C, 0x9B4A, 0x82C8, // 0x0DE0 (3552) +0x7247, 0x6A06, 0x69E6, 0x61C6, 0x61A5, 0x61C5, 0x69E6, 0x7227, 0x82C8, 0xB40C, 0xCCEF, 0xDD92, 0xDD92, 0x832B, 0x28E5, 0x20A4, // 0x0DF0 (3568) +0x20A4, 0x1884, 0x1884, 0x1884, 0x1884, 0x1863, 0x18A4, 0x20C4, 0x41A7, 0xB512, 0xEEB7, 0xF6F8, 0xFEF8, 0xF6B7, 0xF675, 0xEE34, // 0x0E00 (3584) +0xCB6B, 0xD38B, 0xD3AB, 0xD3AB, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3CC, 0xD3EC, 0xD40D, 0xDC4D, 0xE572, 0xEF1A, 0xF79D, 0xFFDF, // 0x0E10 (3600) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC551, 0xB46D, 0xC50F, 0xCD70, 0xD571, 0xD550, 0xCD10, 0xCCEF, 0xC4CE, 0xB44D, 0xA3AB, // 0x0E20 (3616) +0x8B09, 0x82A8, 0x7A67, 0x7227, 0x6A06, 0x6A27, 0x7A88, 0x8AE9, 0xA3AB, 0xC4AE, 0xD551, 0xE5D3, 0xE614, 0xCD72, 0x41A7, 0x28E5, // 0x0E30 (3632) +0x20C5, 0x18A4, 0x1884, 0x18A4, 0x1884, 0x1863, 0x1883, 0x1884, 0x18A4, 0x3146, 0x940F, 0xEEB7, 0xF6D7, 0xF6B6, 0xEE75, 0xEE34, // 0x0E40 (3648) +0xCB6A, 0xD38B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xD40C, 0xDC2D, 0xDC4E, 0xDC8E, 0xE615, 0xEF5B, 0xF7BE, // 0x0E50 (3664) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF1A, 0xB48E, 0xBCAE, 0xCD30, 0xD571, 0xD571, 0xCD50, 0xCD2F, 0xCD0F, 0xC4CE, 0xBC6D, // 0x0E60 (3680) +0xA3EB, 0x9B6A, 0x9329, 0x8B09, 0x8B09, 0x936A, 0xA3CC, 0xB44D, 0xC4CE, 0xD550, 0xDDB2, 0xE613, 0xEE34, 0xEE55, 0xAC8F, 0x4187, // 0x0E70 (3696) +0x2905, 0x20C4, 0x18A4, 0x18A4, 0x18A4, 0x18A4, 0x1884, 0x1083, 0x1883, 0x18A4, 0x20E5, 0x6B0B, 0xD5D4, 0xEE75, 0xEE54, 0xE614, // 0x0E80 (3712) +0xCB6A, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xDC2D, 0xDC4D, 0xDC6E, 0xDC8E, 0xEDF4, 0xEF7C, 0xF7BD, // 0x0E90 (3728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xCDF5, 0xAC6D, 0xC50F, 0xCD70, 0xD571, 0xD571, 0xD550, 0xD550, 0xCD0F, 0xC4EE, // 0x0EA0 (3744) +0xBC6D, 0xB42C, 0xAC0C, 0xAC0C, 0xB42C, 0xBC8E, 0xC4CF, 0xCD0F, 0xD571, 0xDDD2, 0xE613, 0xEE54, 0xEE55, 0xEE75, 0xE635, 0x9C0E, // 0x0EB0 (3760) +0x3126, 0x20E5, 0x18C4, 0x18C5, 0x18C5, 0x18A4, 0x18A4, 0x18A4, 0x1084, 0x1883, 0x18A4, 0x20C4, 0x5229, 0xACD0, 0xDDF3, 0xE5F3, // 0x0EC0 (3776) +0xCB6B, 0xD36B, 0xD38B, 0xD38B, 0xD38B, 0xD3AB, 0xD3CB, 0xD3EC, 0xD40C, 0xDC2D, 0xDC4D, 0xDC6E, 0xDC8E, 0xEE15, 0xF7BD, 0xF7DE, // 0x0ED0 (3792) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xB4F0, 0xC52F, 0xD570, 0xD591, 0xD591, 0xD570, 0xD570, 0xD570, 0xD550, // 0x0EE0 (3808) +0xCCEF, 0xC4CE, 0xC4AE, 0xC4CF, 0xCD10, 0xD571, 0xDDB2, 0xDDB2, 0xE5F2, 0xEE33, 0xEE54, 0xEE54, 0xEE75, 0xF695, 0xEE96, 0xE655, // 0x0EF0 (3824) +0x5208, 0x2905, 0x20C4, 0x18C4, 0x18C5, 0x18A5, 0x1083, 0x18A4, 0x18A4, 0x10A4, 0x1083, 0x18A4, 0x18C4, 0x2905, 0x8B8C, 0xD591, // 0x0F00 (3840) +0xCB4B, 0xCB6B, 0xD38B, 0xD38A, 0xD38B, 0xD3AB, 0xD3CB, 0xD3CC, 0xD3EC, 0xDC0C, 0xDC2D, 0xDC4D, 0xDC8E, 0xE635, 0xF7BE, 0xF7DE, // 0x0F10 (3856) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6B9, 0xD592, 0xE5F2, 0xE613, 0xE613, 0xDDD2, 0xDDB1, 0xDDB1, 0xDD91, // 0x0F20 (3872) +0xD570, 0xD570, 0xDD71, 0xDDB2, 0xE5F3, 0xE613, 0xEE34, 0xEE33, 0xEE34, 0xEE54, 0xEE54, 0xEE54, 0xF675, 0xF696, 0xF696, 0xEE96, // 0x0F30 (3888) +0xA46F, 0x3166, 0x20E5, 0x18C4, 0x18C5, 0x18A5, 0x1083, 0x18A4, 0x18A4, 0x1084, 0x1084, 0x1083, 0x1083, 0x18A4, 0x20E5, 0x5228, // 0x0F40 (3904) +0xCB4A, 0xCB4A, 0xCB6A, 0xD36A, 0xD38A, 0xD3AB, 0xD3AB, 0xD3CB, 0xD3EC, 0xD40C, 0xDC2D, 0xD46E, 0xD4EF, 0xE677, 0xF7BE, 0xFFFF, // 0x0F50 (3920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xE655, 0xEE74, 0xF675, 0xEE75, 0xEE54, 0xEE53, 0xE613, 0xE612, // 0x0F60 (3936) +0xE5F2, 0xE5F3, 0xE613, 0xEE34, 0xF675, 0xF695, 0xF675, 0xEE75, 0xF675, 0xEE75, 0xEE75, 0xEE75, 0xF695, 0xF696, 0xF696, 0xF6B6, // 0x0F70 (3952) +0xE635, 0x62CA, 0x2105, 0x18C4, 0x18A4, 0x18A5, 0x10A4, 0x1083, 0x18A4, 0x10A4, 0x1084, 0x1084, 0x1083, 0x1083, 0x1083, 0x1883, // 0x0F80 (3968) +0xCB2A, 0xCB4A, 0xCB6A, 0xCB6A, 0xCB6A, 0xD38B, 0xD3AB, 0xD3CB, 0xD3EC, 0xD42D, 0xD4CE, 0xD571, 0xDE34, 0xF77C, 0xFFDF, 0xFFFF, // 0x0F90 (3984) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB594, 0xE654, 0xF6B6, 0xF6D6, 0xF6B6, 0xF695, 0xF695, 0xF695, // 0x0FA0 (4000) +0xEE54, 0xEE54, 0xEE54, 0xF675, 0xF695, 0xF6B5, 0xF695, 0xF695, 0xF695, 0xEE75, 0xEE75, 0xEE75, 0xF695, 0xF696, 0xF6B6, 0xF6B7, // 0x0FB0 (4016) +0xEE96, 0xB4F1, 0x2926, 0x20C5, 0x18A4, 0x18C5, 0x18A5, 0x1083, 0x10A4, 0x10A4, 0x1084, 0x1084, 0x1084, 0x1083, 0x1063, 0x1063, // 0x0FC0 (4032) +0xCB2A, 0xCB4A, 0xCB4A, 0xCB6A, 0xCB6A, 0xD38B, 0xD3AB, 0xD3CB, 0xD44D, 0xD52F, 0xDDD2, 0xE654, 0xF75B, 0xFFDF, 0xFFFF, 0xFFFF, // 0x0FD0 (4048) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9E, 0x73AE, 0xACAF, 0xF6B6, 0xF6F7, 0xF6B6, 0xF6B6, 0xF6D6, 0xF6B6, // 0x0FE0 (4064) +0xF695, 0xF695, 0xF695, 0xF6B6, 0xF6B6, 0xF6D6, 0xF6D6, 0xF6B6, 0xF695, 0xF675, 0xF675, 0xEE75, 0xEE75, 0xF696, 0xF6B6, 0xF6B6, // 0x0FF0 (4080) +0xEE96, 0xDDF4, 0x4A08, 0x20E5, 0x18A4, 0x18C5, 0x18A5, 0x1083, 0x1084, 0x10A4, 0x10A4, 0x10A4, 0x1084, 0x1063, 0x1063, 0x1043, // 0x1000 (4096) +}; + +// Generated by : ImageConverter 565 v2.3 +// Generated from: tractor10.jpg +// Time generated: 11-May-18 09:27:27 +// Dimensions : 96x64 pixels +// Size : 12,288 Bytes + +#include + +const uint16_t tractor10_96x64[0x1800] PROGMEM ={ +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0010 (16) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0020 (32) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0040 (64) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0050 (80) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0080 (128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0090 (144) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00B0 (176) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00D0 (208) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00F0 (240) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x9C71, 0x838D, 0x7B4C, 0x9410, 0xC5D6, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0110 (272) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0130 (304) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0150 (336) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9430, 0xA4B2, 0xF77D, 0xACF3, 0xC5D7, 0xB575, 0x942F, 0xC5F7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0170 (368) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0190 (400) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x83AE, 0xEF3C, 0xFFFF, 0xDEDB, 0xCE38, 0xFFFF, 0xEF5C, 0x9C92, 0xAD34, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01C0 (448) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01D0 (464) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01E0 (480) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01F0 (496) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD34, 0xCE59, 0xFFFF, 0xFFFF, 0xB595, 0xF7BE, 0xFFFF, 0xFFFF, 0xACF3, 0xA4F3, 0xFFFF, 0xFFFF, // 0x0220 (544) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0230 (560) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0240 (576) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0250 (592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x0260 (608) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF9E, 0xBD96, 0xFFDF, 0xFFFF, 0xC5B7, 0x83CF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8B8E, 0xCE18, 0xFFFF, // 0x0280 (640) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0290 (656) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02B0 (688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, // 0x02C0 (704) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEDA, 0xDE38, 0xEFBE, 0xF77D, 0xF71B, 0xEE99, // 0x02D0 (720) +0xEDD5, 0xE512, 0xE4B0, 0xE42E, 0xDB49, 0xCA25, 0xD3AC, 0xC533, 0x9268, 0x6922, 0xB34B, 0xC574, 0xE75D, 0xD659, 0x8C30, 0xFFFF, // 0x02E0 (736) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02F0 (752) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0300 (768) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0310 (784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, // 0x0320 (800) +0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF75D, 0xF6FB, 0xEE38, 0xE553, 0xE4B0, 0xE44E, 0xCA25, 0xB921, 0xD265, 0xDA23, 0xD1E2, 0xD1A1, // 0x0330 (816) +0xD160, 0xD920, 0xD920, 0xD920, 0xE180, 0xE180, 0xE1A0, 0xC161, 0x9901, 0xC982, 0xD940, 0xC900, 0xB2E9, 0xB574, 0x8451, 0xFFFF, // 0x0340 (832) +0xFFFF, 0xFF9E, 0xFF5D, 0xFF5C, 0xFFBE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0350 (848) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0360 (864) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0370 (880) +0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DF, 0xF77D, 0xF71B, 0xF699, 0xEDF6, 0xE532, // 0x0380 (896) +0xE48F, 0xE3ED, 0xE329, 0xDA85, 0xD9E3, 0xD9C2, 0xD980, 0xD920, 0xD920, 0xD920, 0xE160, 0xE180, 0xE160, 0xE180, 0xE9A0, 0xF1C1, // 0x0390 (912) +0xF243, 0xF264, 0xEA44, 0xF2A6, 0xEA86, 0xD204, 0xCA45, 0xAA04, 0x7142, 0x7963, 0x9163, 0xA961, 0xB141, 0x81E5, 0x9C30, 0xED93, // 0x03A0 (928) +0xE40D, 0xD286, 0xD1E3, 0xD9E3, 0xD245, 0xCBAC, 0xEEBA, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFF9D, 0xFF7D, 0xFFFF, // 0x03B0 (944) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03C0 (960) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976) +0xFFFF, 0xFFFF, 0xFFFF, 0xF77C, 0xF71B, 0xEE78, 0xEDD5, 0xECF1, 0xE44F, 0xE3AB, 0xDAE7, 0xDA44, 0xE204, 0xE1C2, 0xE160, 0xE120, // 0x03E0 (992) +0xE140, 0xE160, 0xE160, 0xE160, 0xE160, 0xE980, 0xE981, 0xE1A1, 0xE9C2, 0xEA03, 0xEA65, 0xF2A6, 0xEAA5, 0xEAE8, 0xE2C7, 0xD265, // 0x03F0 (1008) +0xCA86, 0xBA45, 0xA1C3, 0x91A4, 0x8983, 0x6922, 0x6902, 0x7122, 0x7942, 0x7963, 0x7164, 0x5944, 0x5943, 0x8122, 0xD1A1, 0xE1A1, // 0x0400 (1024) +0xE9E2, 0xE1A1, 0xD980, 0xE1A0, 0xD161, 0x80C0, 0xAA06, 0xFF9D, 0xFFFF, 0xFFFF, 0xF73C, 0xBCF3, 0x8ACA, 0x69C5, 0x69A4, 0x7A68, // 0x0410 (1040) +0xA44F, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0420 (1056) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0430 (1072) +0xFED9, 0xD40E, 0xCAE8, 0xD224, 0xD9E2, 0xD9A1, 0xD960, 0xD940, 0xD940, 0xE140, 0xE180, 0xE180, 0xE181, 0xE980, 0xE980, 0xE9A0, // 0x0440 (1088) +0xE9A1, 0xE9C2, 0xE9E2, 0xF264, 0xEAC6, 0xF2C6, 0xF307, 0xF38A, 0xEB08, 0xD2C7, 0xCAE8, 0xC287, 0x99C4, 0x9183, 0x9182, 0x6901, // 0x0450 (1104) +0x6101, 0x68E1, 0x6102, 0x60E1, 0x7122, 0x8142, 0x8942, 0x9142, 0x9942, 0xB982, 0xB9A2, 0xA962, 0xD1A1, 0xE9C1, 0xE1A2, 0xD9A1, // 0x0460 (1120) +0xE1A1, 0xD162, 0xD182, 0xD182, 0xB982, 0x8100, 0xBB29, 0xFFFF, 0xFFDE, 0xAC70, 0x5944, 0x4080, 0x68C1, 0x8901, 0x9941, 0x9920, // 0x0470 (1136) +0x98E0, 0x8A27, 0xDEDB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0480 (1152) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE6DA, // 0x0490 (1168) +0xB182, 0xC900, 0xD981, 0xE180, 0xE181, 0xE981, 0xE9A1, 0xE1C1, 0xE1C1, 0xE9C1, 0xE9C1, 0xE9E2, 0xEA64, 0xF2C7, 0xF2C6, 0xFAE7, // 0x04A0 (1184) +0xFB69, 0xF3AB, 0xE2E8, 0xD308, 0xD2C8, 0xBA45, 0x99A4, 0x8983, 0x9142, 0x7102, 0x58E1, 0x68E1, 0x68E2, 0x48E2, 0x60E1, 0x8942, // 0x04B0 (1200) +0x8162, 0x8962, 0xA162, 0xB182, 0xB982, 0xC9C2, 0xD1C2, 0xD9A1, 0xC9C2, 0xB181, 0xC981, 0xE1C1, 0xD9A0, 0xD9A1, 0xD1A1, 0xD1A1, // 0x04C0 (1216) +0xD1A1, 0xC981, 0xC981, 0xB181, 0x9121, 0x91A5, 0xFF9E, 0xEEDB, 0x7227, 0x4840, 0x8901, 0xC182, 0xD9C2, 0xD1C2, 0xE9A1, 0xE981, // 0x04D0 (1232) +0xE181, 0xC0E0, 0xA267, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x04E0 (1248) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD38C, // 0x04F0 (1264) +0x98E0, 0xE1C1, 0xE1A1, 0xE9C1, 0xF1C1, 0xE9E2, 0xEA02, 0xE9C1, 0xE9A1, 0xF1E2, 0xF3AA, 0xEBAA, 0xF34A, 0xEB4A, 0xCAC7, 0xCA44, // 0x0500 (1280) +0xB1C4, 0xA183, 0x8121, 0x70E1, 0xB121, 0x70E1, 0x7902, 0x70E2, 0x6902, 0x6901, 0x7922, 0x7901, 0x9AC9, 0xA4F2, 0x49C6, 0x99C3, // 0x0510 (1296) +0xD1A2, 0xD1A2, 0xD9C2, 0xD9C2, 0xD9C1, 0xD9A2, 0xD9C2, 0xE1A1, 0xC9A1, 0xA981, 0xB981, 0xD1A1, 0xE1C1, 0xE9C2, 0xE9C1, 0xE1A2, // 0x0520 (1312) +0xE9A1, 0xE9A1, 0xD182, 0xA141, 0x6102, 0xD617, 0xE6DA, 0x8184, 0x80C0, 0xC982, 0xD982, 0xD9A1, 0xD160, 0xE181, 0xD9C2, 0xA286, // 0x0530 (1328) +0xA225, 0x89C4, 0x6922, 0xA4B1, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0540 (1344) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7FF, 0xDBED, // 0x0550 (1360) +0xB920, 0xE9E1, 0xE9C1, 0xE9C1, 0xE9A1, 0xEAC7, 0xEBAA, 0xE9C1, 0xE9E2, 0xE9E2, 0xEA03, 0xE9C2, 0xE1A0, 0xD981, 0x88E1, 0x8922, // 0x0560 (1376) +0x6902, 0x7102, 0x7122, 0x7122, 0x8902, 0x58C1, 0x48E1, 0x58E1, 0x58A1, 0x48A1, 0x8122, 0x9900, 0xB44E, 0xE6FA, 0x52CB, 0x48E1, // 0x0570 (1392) +0xD9A2, 0xD9A1, 0xE1C2, 0xD9A2, 0xD9A1, 0xD9C2, 0xD1C3, 0xD1E3, 0xB981, 0xB981, 0x7122, 0x7142, 0x7941, 0x9941, 0xB961, 0xB981, // 0x0580 (1408) +0xB982, 0xA142, 0x6921, 0x40E2, 0x6142, 0xBBAD, 0x81E5, 0xB100, 0xE1A2, 0xD9A1, 0xD981, 0xC182, 0xBAA8, 0xA941, 0x59E5, 0x52AA, // 0x0590 (1424) +0x52AA, 0x4248, 0x52EB, 0x41E7, 0x5269, 0xAD33, 0xF79D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x05A0 (1440) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xC36B, // 0x05B0 (1456) +0xB120, 0xE1C1, 0xE1C1, 0xD9A1, 0xE9C1, 0xF1C1, 0xE9C2, 0xD9C1, 0xC1A2, 0xC9A2, 0xD182, 0xD1A1, 0xD9A1, 0xC9A2, 0x8922, 0x7102, // 0x05C0 (1472) +0x58E1, 0x50C1, 0x48C2, 0x3082, 0x2061, 0x1861, 0x2041, 0xA9A4, 0xE284, 0xB962, 0x8921, 0xA921, 0x9BAC, 0xF75C, 0x52CB, 0x60E1, // 0x05D0 (1488) +0xEA22, 0xCA24, 0xC9E3, 0xD203, 0xCA03, 0xC9C3, 0xC1E2, 0xC9E2, 0xC182, 0xB961, 0x38E2, 0x5902, 0x6102, 0x40E2, 0x7102, 0x7143, // 0x05E0 (1504) +0x38C2, 0x40A1, 0x6922, 0x8122, 0xC181, 0x88C0, 0xC141, 0xD9A1, 0xD181, 0xE181, 0xE981, 0xA143, 0x6B2C, 0x6289, 0x4A89, 0x5269, // 0x05F0 (1520) +0x5248, 0x5289, 0x5269, 0x3185, 0x3185, 0x4227, 0x41E7, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0600 (1536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x9A88, // 0x0610 (1552) +0x90E0, 0xC981, 0xC182, 0xC182, 0xC182, 0xD245, 0xD265, 0xC182, 0xB161, 0xA962, 0xA982, 0xB162, 0xC982, 0x8921, 0x2861, 0x2061, // 0x0620 (1568) +0x1861, 0x1881, 0x1061, 0x3061, 0x6102, 0x48A1, 0x3860, 0x6102, 0x8984, 0x5922, 0x7122, 0xE9A1, 0xB1C3, 0x7B8D, 0x3985, 0x40E2, // 0x0630 (1584) +0x91A3, 0xD203, 0xD1C2, 0xD9C2, 0xD9A2, 0xE1A1, 0xE9C1, 0x9141, 0x9141, 0xD182, 0x40C2, 0x38A2, 0x5902, 0x7923, 0x6921, 0xA942, // 0x0640 (1600) +0xA1C3, 0xA309, 0x9182, 0xD1A1, 0xA942, 0xB982, 0xE9A1, 0xD9A1, 0xCA03, 0x71C5, 0x91C4, 0x832A, 0x4A89, 0x5269, 0x5268, 0x5269, // 0x0650 (1616) +0x5249, 0x4208, 0x5269, 0x3165, 0x20E4, 0x4207, 0x2103, 0x2924, 0xB595, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0660 (1632) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAB4B, // 0x0670 (1648) +0x8102, 0x5902, 0x40A1, 0x48C1, 0x48A1, 0x5903, 0x5103, 0x50A1, 0xA962, 0xC1A2, 0xC9A2, 0xC9A2, 0xE1C2, 0x9941, 0x1841, 0x3881, // 0x0680 (1664) +0x7122, 0x9122, 0x8942, 0x8941, 0xB9C3, 0xDCF2, 0x9BAD, 0x48E2, 0xA143, 0x6122, 0xA962, 0xE1C2, 0xC9A2, 0x48C1, 0x38C3, 0x30C2, // 0x0690 (1680) +0x9162, 0xE1C1, 0xE1A1, 0xE1C1, 0xE1A1, 0xE9C1, 0xC9A2, 0x40C2, 0x8141, 0xD9C2, 0x9162, 0x38E2, 0x6102, 0x7922, 0x6902, 0x7902, // 0x06A0 (1696) +0xE182, 0x9AC8, 0xA9A4, 0xC181, 0x8942, 0xC962, 0xD981, 0xE160, 0xD2A7, 0x7BCF, 0x2986, 0x4A48, 0x5228, 0x734C, 0x8C0F, 0x5248, // 0x06B0 (1712) +0x20E3, 0x2924, 0x2924, 0x2924, 0x2103, 0x2124, 0x2104, 0x2904, 0x39A6, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x06C0 (1728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB3EE, // 0x06D0 (1744) +0x8122, 0x5903, 0x2840, 0x3881, 0x4081, 0x40E2, 0x38C2, 0x4081, 0xB162, 0xC982, 0xC9A2, 0xD1A2, 0xE1C1, 0x9941, 0x2060, 0xA9A2, // 0x06E0 (1760) +0xD204, 0xB162, 0xB182, 0xA142, 0xA941, 0xCC90, 0xDE9A, 0x7207, 0xB1A2, 0xA142, 0xD1A2, 0xD1A2, 0xE9C2, 0xA962, 0x3902, 0x7142, // 0x06F0 (1776) +0xD981, 0xE1C2, 0xD9E2, 0xDA43, 0xD204, 0xD9A1, 0x9962, 0x38E2, 0x7122, 0xC9A1, 0xC161, 0x8142, 0x9982, 0xC161, 0x6122, 0x38E2, // 0x0700 (1792) +0xA141, 0xB982, 0x8142, 0xA941, 0x6122, 0xA161, 0xF1A1, 0xF181, 0xA1C4, 0x83EE, 0x39A6, 0x5AA9, 0x8C0F, 0xAD13, 0x9C91, 0x5AA9, // 0x0710 (1808) +0x3185, 0x20E3, 0x2104, 0x2104, 0x18E3, 0x18E3, 0x18C3, 0x2924, 0x18A2, 0x9491, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0720 (1824) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB470, // 0x0730 (1840) +0x7902, 0x6923, 0x3881, 0x4881, 0x48A0, 0x50E2, 0x48C2, 0x60C1, 0xC982, 0xC9A2, 0xD1A2, 0xD1A2, 0xE1C1, 0xA161, 0x30A1, 0xB983, // 0x0740 (1856) +0x9942, 0x8942, 0x8121, 0xB182, 0xC981, 0xA962, 0xCD34, 0x9C70, 0xBA04, 0xA121, 0xD1A2, 0xD1C2, 0xE1C2, 0xE1C2, 0xC9A3, 0xCA04, // 0x0750 (1872) +0xD203, 0xD244, 0xD204, 0xD204, 0xE1E2, 0xA142, 0x4102, 0x40E3, 0x5922, 0xB9C2, 0xB9A2, 0xA162, 0x9162, 0xB162, 0x5922, 0x38C2, // 0x0760 (1888) +0x5901, 0xC9A2, 0xA962, 0x8941, 0x38E3, 0x7102, 0x9942, 0x8162, 0x4164, 0x62EB, 0x736C, 0x6B2C, 0x7BAD, 0x5A69, 0x39A6, 0x2944, // 0x0770 (1904) +0x2104, 0x20E3, 0x20C3, 0x20C3, 0x18E3, 0x18C3, 0x18A2, 0x20E3, 0x18A2, 0x2945, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0780 (1920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC4F3, // 0x0790 (1936) +0x70E1, 0x6123, 0x4061, 0x48A1, 0x48A1, 0x48E2, 0x48C2, 0x68C1, 0xC9C1, 0xD1C2, 0xD1C1, 0xD9C2, 0xE1C1, 0xA922, 0x48E2, 0x4144, // 0x07A0 (1952) +0x28C2, 0x8942, 0xA182, 0x8121, 0x8963, 0x7901, 0x6A07, 0xC618, 0xA2C9, 0xB961, 0xC9C2, 0xD9E2, 0xDA85, 0xC9C3, 0xD9E2, 0xD9E2, // 0x07B0 (1968) +0xD9C2, 0xD9A1, 0xE1C2, 0xE9A1, 0xD182, 0x4902, 0x38E3, 0x38E3, 0x6123, 0xB9C3, 0xB9A2, 0x9942, 0x6143, 0x5122, 0x8922, 0x5902, // 0x07C0 (1984) +0x5902, 0x9983, 0x8942, 0x6921, 0x40C2, 0x5164, 0x4A68, 0x4248, 0x83AF, 0x5A69, 0x62EA, 0x6B0B, 0x5269, 0x3165, 0x2924, 0x20E3, // 0x07D0 (2000) +0x18C3, 0x18C2, 0x31A5, 0x4A28, 0x41E7, 0x20E3, 0x18A2, 0x20C3, 0x20C3, 0x18C2, 0x736D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x07E0 (2016) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD595, // 0x07F0 (2032) +0x8101, 0x7164, 0x4881, 0x50A1, 0x4080, 0x40C2, 0x40A2, 0x70E2, 0xD1A2, 0xD9C2, 0xD9C2, 0xE1C2, 0xE9E2, 0xB161, 0x3922, 0x2965, // 0x0800 (2048) +0x2104, 0x2103, 0x30A2, 0x3081, 0xBA05, 0x68C1, 0x80E0, 0xDD53, 0xA4D2, 0xA1A2, 0x9942, 0xE1C2, 0xE1E2, 0xE9A1, 0xE9C1, 0xE9C1, // 0x0810 (2064) +0xE9C1, 0xE9E1, 0xE9C2, 0xE1C2, 0x7142, 0x30E3, 0x6143, 0x5922, 0x9962, 0xD9C3, 0xC9A2, 0xA182, 0x9162, 0x8122, 0x9142, 0x9162, // 0x0820 (2080) +0x9143, 0x4902, 0x6122, 0x7922, 0x48E2, 0x5185, 0x734C, 0x3986, 0x41E7, 0x6B0C, 0xBDB5, 0xD678, 0x8C30, 0x39A6, 0x2924, 0x18C3, // 0x0830 (2096) +0x2924, 0x632C, 0x736D, 0x7BAD, 0x83CF, 0x7B8E, 0x39A6, 0x1082, 0x18C3, 0x18A2, 0x9492, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0840 (2112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE37, // 0x0850 (2128) +0x98E1, 0x6122, 0x4081, 0x4861, 0x3860, 0x38C2, 0x30A1, 0x8101, 0xD9A1, 0xD9C2, 0xD9C2, 0xE1C2, 0xF1E1, 0xA982, 0x2165, 0x5248, // 0x0860 (2144) +0x4A48, 0x4208, 0x5185, 0xA142, 0xCA44, 0x8102, 0xD960, 0xD265, 0xC5F8, 0x830B, 0x78E1, 0xE1A1, 0xF1C1, 0xE9C1, 0xE1C2, 0xD1A2, // 0x0870 (2160) +0xC162, 0x9943, 0x8142, 0x6122, 0x30E3, 0x5903, 0xB1A3, 0xB182, 0xB9A2, 0xB1A3, 0xA182, 0x9963, 0x9183, 0xB9A3, 0xA982, 0x9942, // 0x0880 (2176) +0x8942, 0x9962, 0xA982, 0xC1C3, 0x6902, 0x38C2, 0x838D, 0x4A48, 0x5AAA, 0x9C90, 0xBD94, 0x9470, 0x4A08, 0x20E3, 0x18A2, 0x2904, // 0x0890 (2192) +0xB5F7, 0xB470, 0x80C0, 0x7207, 0x630B, 0x7B8D, 0x83CE, 0x2924, 0x18C3, 0x1081, 0x630B, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x08A0 (2208) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEEFB, // 0x08B0 (2224) +0xA163, 0x6922, 0x40A1, 0x3881, 0x3060, 0x30A1, 0x3082, 0x9121, 0xE1C2, 0xE1C1, 0xE1C2, 0xE9E1, 0xF9E2, 0xB182, 0x18C3, 0x18E3, // 0x08C0 (2240) +0x18E3, 0x18E3, 0x18C2, 0x6101, 0xD203, 0x9122, 0xD181, 0xD940, 0xCC2D, 0x8C51, 0x5923, 0x9121, 0x8962, 0x7122, 0x50E2, 0x6164, // 0x08D0 (2256) +0x7964, 0x40E2, 0x6923, 0x7122, 0x7142, 0x8183, 0xA162, 0xB163, 0x9962, 0xA1C3, 0xD285, 0xDA44, 0xE265, 0xF223, 0xC9A2, 0xB183, // 0x08E0 (2272) +0xC9A2, 0xD182, 0xA162, 0xB962, 0x7122, 0x3924, 0x5A89, 0x5A89, 0x83AD, 0xAD13, 0x9450, 0x2945, 0x2104, 0x20E3, 0x18A2, 0xAD75, // 0x08F0 (2288) +0xFF5C, 0xD266, 0x8080, 0xC513, 0xB5D7, 0x62EB, 0x9450, 0x6B0B, 0x18A2, 0x18E3, 0x18C3, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0900 (2304) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF77E, // 0x0910 (2320) +0xA1C5, 0x7922, 0x3881, 0x3081, 0x3081, 0x38C2, 0x3082, 0x9921, 0xE1A1, 0xE1C1, 0xE9C1, 0xE9C1, 0xF9E1, 0xB161, 0x18E3, 0x2924, // 0x0920 (2336) +0x2104, 0x2104, 0x28C2, 0x8123, 0xA9E3, 0x8941, 0xB9A2, 0xE9A1, 0xD1A1, 0xC595, 0xA32C, 0x68E0, 0x38E2, 0x58E3, 0x7942, 0x9205, // 0x0930 (2352) +0x6943, 0xD1A2, 0xC9C2, 0xC9A1, 0xC9C2, 0x8983, 0x9962, 0xE9C2, 0xC9A1, 0xC182, 0xE9A2, 0xF1C2, 0xE9A1, 0xE1C1, 0xA963, 0x9182, // 0x0940 (2368) +0xC9C2, 0xC9A2, 0xA962, 0x9182, 0x41C6, 0x3186, 0x41E7, 0x9450, 0x83CD, 0x5AAA, 0x41C6, 0x3986, 0x2924, 0x1061, 0x7BAE, 0xFFFF, // 0x0950 (2384) +0xE3CE, 0xC8C0, 0xA0C0, 0xCCD1, 0xFFFF, 0x8C30, 0x9471, 0x9C71, 0x2945, 0x20E3, 0x0861, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0960 (2400) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, // 0x0970 (2416) +0x91C6, 0x8101, 0x40A1, 0x3060, 0x3861, 0x38C2, 0x38A2, 0xA162, 0xE1C1, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9E1, 0xB161, 0x20A2, 0x40E2, // 0x0980 (2432) +0x48E1, 0x48E2, 0x60C1, 0xB1A2, 0xDA03, 0xB1C3, 0xB1C3, 0xC203, 0xF308, 0xC34A, 0xC5B4, 0xB9A3, 0x9100, 0xF1E2, 0xE203, 0x81C5, // 0x0990 (2448) +0x9982, 0xE1E2, 0xC161, 0xC9A2, 0xB1A3, 0x9942, 0xB1A2, 0xF1C2, 0xD1A2, 0x9962, 0xB982, 0xC9C2, 0xE9C2, 0xD982, 0xB181, 0xC1A3, // 0x09A0 (2464) +0xB9C3, 0xC9A3, 0xD182, 0xB204, 0x4A49, 0x5AAA, 0x8C0E, 0x5AA9, 0x736C, 0xC5D5, 0x83EF, 0x3165, 0x20E3, 0x2945, 0xD699, 0xD69A, // 0x09B0 (2480) +0x9183, 0xB1A3, 0xD940, 0xAA47, 0xFFFF, 0xCE38, 0xA4B1, 0xB554, 0x4207, 0x1061, 0x4208, 0xF79D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x09C0 (2496) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x09D0 (2512) +0x9227, 0x88E1, 0x4081, 0x3861, 0x3881, 0x38E2, 0x38A2, 0xA941, 0xE1C1, 0xE9C1, 0xF1E1, 0xF1C1, 0xF9E1, 0xA161, 0x3081, 0xC9A2, // 0x09E0 (2528) +0xD9C1, 0xE1C2, 0xE1C2, 0xC204, 0xAA05, 0x6142, 0x60E1, 0xB2C8, 0xDC0D, 0x98E0, 0xB4D2, 0xCDB4, 0x9A46, 0xE160, 0xB1E4, 0x7163, // 0x09F0 (2544) +0xD9C3, 0xB1C2, 0xB9C3, 0xB1A3, 0xB9A3, 0xD1E2, 0xD9A2, 0xE9C1, 0xD1A1, 0xA142, 0x5922, 0x9962, 0xF1C1, 0xE9A1, 0xE1A1, 0xEA24, // 0x0A00 (2560) +0xE1E3, 0xC9A2, 0xB982, 0x7963, 0x6AEA, 0x41E8, 0x5248, 0x6B2B, 0xC5B5, 0xCE16, 0x62CB, 0x20C3, 0x10C3, 0x6A48, 0xB266, 0x8142, // 0x0A10 (2576) +0x9921, 0xD9C3, 0xE9A1, 0xA100, 0xD639, 0xF79D, 0xAD13, 0xCDF6, 0x6B0B, 0x0821, 0x5269, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A20 (2592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A30 (2608) +0xAAC9, 0x80C1, 0x48A1, 0x2880, 0x3861, 0x40E2, 0x48C2, 0xB961, 0xE9C1, 0xE9C1, 0xF1E1, 0xF1C1, 0xF9E1, 0xB161, 0x7101, 0xE1C2, // 0x0A40 (2624) +0xE9E2, 0xE1C1, 0xE1E2, 0xC1A2, 0x8121, 0xA141, 0x8100, 0xCB6B, 0xEC4E, 0x90E0, 0x8142, 0x8B6D, 0xC5F6, 0xD3ED, 0x7122, 0xB960, // 0x0A50 (2640) +0xF9E2, 0xB9A2, 0xD1C2, 0xCA03, 0xA982, 0xB9A2, 0xA162, 0xA982, 0xA982, 0xA962, 0x9962, 0xC182, 0xF1C1, 0xD9A2, 0xE1A1, 0xE1E3, // 0x0A60 (2656) +0xD1A2, 0xE9A2, 0xA982, 0x38A1, 0x730A, 0x5269, 0x41C7, 0x62CA, 0x83CE, 0x6B0B, 0x3165, 0x20C4, 0x2966, 0xAA46, 0xF140, 0xE160, // 0x0A70 (2672) +0xF1A1, 0xC182, 0xC1A2, 0xD0E0, 0xB3EE, 0xF7FF, 0xB574, 0xD678, 0x83CE, 0x1082, 0x18C3, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A80 (2688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0A90 (2704) +0xBBAD, 0x88C1, 0x48C2, 0x2861, 0x3840, 0x40C2, 0x48E2, 0xC182, 0xE1E2, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9C1, 0xC1C3, 0xAA66, 0xA942, // 0x0AA0 (2720) +0xF1C1, 0xC1C3, 0xA162, 0xF1C2, 0xF1C2, 0xF9E1, 0xC141, 0xB2A7, 0xAB4A, 0x78E1, 0xA961, 0x9900, 0x7A06, 0xAD74, 0xBCB1, 0xE224, // 0x0AB0 (2736) +0xC961, 0x9101, 0xB962, 0xC9E2, 0x8121, 0x50A2, 0x7142, 0x8142, 0xA982, 0xA183, 0xC982, 0x8941, 0xB162, 0xD9E2, 0xC981, 0xC182, // 0x0AC0 (2752) +0xA962, 0xE1C1, 0x9162, 0x4123, 0x5228, 0x732C, 0x3985, 0x5269, 0x734C, 0x39A6, 0x2924, 0x20C4, 0x31A6, 0x9983, 0xE9A1, 0xE9A1, // 0x0AD0 (2768) +0xE9A1, 0xD161, 0xC182, 0xB921, 0x9205, 0xD638, 0xCDF7, 0xE6D9, 0x8C2F, 0x18C3, 0x1061, 0x840F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AE0 (2784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0AF0 (2800) +0xBC51, 0x90C0, 0x50C1, 0x2881, 0x2840, 0x30E2, 0x40E2, 0xC982, 0xD9E2, 0xE9E1, 0xF1C1, 0xF1C1, 0xF1E1, 0xBA24, 0x89E5, 0xA163, // 0x0B00 (2816) +0xF9E2, 0xC1E3, 0xC1A2, 0xE9C1, 0xE9C1, 0xE9C1, 0xF1E1, 0xE181, 0xA100, 0xA162, 0xC182, 0xC182, 0xB141, 0x7903, 0x93CE, 0xC574, // 0x0B10 (2832) +0x9B0B, 0x92EA, 0xB205, 0xB920, 0x8247, 0x8AEA, 0x90E0, 0x9921, 0xB182, 0xB982, 0xB9A2, 0x7122, 0xA162, 0xC9A1, 0xC181, 0xC9A2, // 0x0B20 (2848) +0xB181, 0xC9A2, 0x8962, 0x31C6, 0x31A6, 0x3165, 0x5AAA, 0x6B0B, 0x62CA, 0x4A28, 0x3165, 0x18C3, 0x62A9, 0x6963, 0xB961, 0xE9A1, // 0x0B30 (2864) +0xE9A1, 0xE9E3, 0xA162, 0x8122, 0x9101, 0x8121, 0xCD74, 0xF75B, 0x8C0F, 0x18A3, 0x10A2, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B40 (2880) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0B50 (2896) +0xBCD2, 0x98A0, 0xB981, 0xA161, 0xA142, 0x99C4, 0xA1A3, 0xD9A2, 0xD9A2, 0xE9C1, 0xF1C1, 0xF1C1, 0xF9E1, 0xA9E3, 0x71C5, 0xA1A2, // 0x0B60 (2912) +0xE9C2, 0xE1A1, 0xE9C1, 0xF1E1, 0xF1E1, 0xF1C1, 0xF1C1, 0xD9A1, 0xD1A2, 0xB182, 0xB9A1, 0xA983, 0x9941, 0x6080, 0x938E, 0xBD54, // 0x0B70 (2928) +0xB513, 0xE6DB, 0xE658, 0xCC50, 0xF75D, 0xF71B, 0xC533, 0xAC70, 0xB1E4, 0x9920, 0xA183, 0xD1C2, 0xE1A1, 0xE1C1, 0xE1C1, 0xE181, // 0x0B80 (2944) +0xD1A2, 0xB142, 0x6963, 0x4207, 0x4A28, 0x5269, 0x5249, 0x5A89, 0xA4D2, 0x5269, 0x2103, 0x18C2, 0xB554, 0x8A48, 0x88E1, 0xE9A1, // 0x0B90 (2960) +0xE9A1, 0xDA24, 0xA941, 0xB961, 0xB942, 0x932B, 0xEED9, 0xEF3B, 0x734C, 0x0841, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BA0 (2976) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0BB0 (2992) +0xDD74, 0xA0E0, 0xD1A2, 0xF1C1, 0xF9C1, 0xF9E2, 0xF1E2, 0xD9A1, 0xD9A2, 0xE9C1, 0xF1E2, 0xF1E2, 0xF9E1, 0xA962, 0x8944, 0xA182, // 0x0BC0 (3008) +0xD9C2, 0xD9C1, 0xC9A1, 0xD1A2, 0xD9C2, 0xB9A2, 0x9942, 0x7102, 0x5101, 0x5901, 0xA163, 0x58C1, 0x38E3, 0x5164, 0xE6B9, 0xFFFF, // 0x0BD0 (3024) +0xCDD7, 0xA491, 0xCDB6, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD40E, 0x90C0, 0x9142, 0x9101, 0x9962, 0xB162, 0x8942, 0x7A26, // 0x0BE0 (3040) +0x89C4, 0x7268, 0x49C7, 0x5A48, 0x4A29, 0x5269, 0x39A6, 0x62CB, 0x6B2C, 0x39A6, 0x2924, 0x20E3, 0xBDB6, 0xAA46, 0x9901, 0xD9A1, // 0x0BF0 (3056) +0xD181, 0xA920, 0xB141, 0xA982, 0xA122, 0xD4B0, 0xF79C, 0xE6FA, 0x5269, 0x0820, 0x9CB2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C00 (3072) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C10 (3088) +0xEE37, 0xB941, 0xC982, 0xE1C1, 0xE9C1, 0xE9C1, 0xE9C1, 0xD9A1, 0xD1A1, 0xE9C1, 0xF1C1, 0xF1E1, 0xD9A2, 0xB961, 0xB1A2, 0xA9A3, // 0x0C20 (3104) +0xB182, 0xD9E3, 0xB982, 0x7942, 0x5122, 0x4103, 0x40A1, 0x38A1, 0x50C1, 0x7942, 0x6123, 0x4902, 0xD679, 0xF79D, 0xFFFF, 0xFFFF, // 0x0C30 (3120) +0xFFFF, 0xEF1C, 0xB513, 0xB533, 0xDE78, 0xFFDF, 0xFFFF, 0xFFFF, 0xF7BF, 0xCE17, 0xBC2F, 0xC42F, 0xA450, 0x8A47, 0xB575, 0xD6FB, // 0x0C40 (3136) +0xBAE9, 0xB3CD, 0xD679, 0x9CD3, 0x2924, 0x3165, 0x3986, 0x41C7, 0x41C7, 0x41E7, 0x2924, 0x2145, 0xB34B, 0xE181, 0xC961, 0xB962, // 0x0C50 (3152) +0xB181, 0x8901, 0x78E2, 0x78C0, 0x8247, 0xE657, 0xF77C, 0xD678, 0x3986, 0x1061, 0x4A28, 0xFFDE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0C60 (3168) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xA4D3, // 0x0C70 (3184) +0x7ACA, 0xC9A2, 0xC981, 0xE1C2, 0xE9E1, 0xE9C1, 0xE9C1, 0xD1A1, 0xD1C1, 0xE9C1, 0xF1C1, 0xF1C1, 0xB982, 0xCA03, 0xC1E2, 0x8961, // 0x0C80 (3200) +0x6903, 0x8142, 0x7121, 0x48C2, 0x60A1, 0xA100, 0xCB4A, 0xD5D5, 0xA1A3, 0x8921, 0x6060, 0x8B6D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0C90 (3216) +0xFFFF, 0xFFFF, 0xFFFF, 0xD659, 0xB4F3, 0xCD96, 0xEEFB, 0xEF3C, 0xDE79, 0xC595, 0xACD2, 0xB5B6, 0xD554, 0xC32A, 0xC5F7, 0xA4D1, // 0x0CA0 (3232) +0x91A3, 0xA309, 0xCE18, 0x5AEB, 0x39A6, 0x2924, 0x3144, 0x41E7, 0x41E7, 0x2104, 0x20E3, 0x2186, 0xA9A3, 0xC9A2, 0xE1A2, 0xD961, // 0x0CB0 (3248) +0xD181, 0xB161, 0x70A0, 0x81C6, 0xEF5C, 0xF75C, 0xF77B, 0xB553, 0x2924, 0x1082, 0x630C, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CC0 (3264) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD6, 0x6B4C, 0x71E6, // 0x0CD0 (3280) +0x7183, 0xB9C2, 0xD1C2, 0xE9E1, 0xF1C1, 0xF223, 0xEA03, 0xD9C1, 0xD9C1, 0xF1C1, 0xE9E2, 0xC9A2, 0xD1A1, 0xDA03, 0xB1A2, 0x8123, // 0x0CE0 (3296) +0x8963, 0xB1E3, 0x7983, 0x79E4, 0xC287, 0xB2C8, 0xC533, 0xDD54, 0xA962, 0xA100, 0xA205, 0xE69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0CF0 (3312) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF3C, 0xB554, 0x9C71, 0xACF3, 0xC596, 0xCDF7, 0xAC91, 0xB4D2, 0x8AA9, 0x9A26, 0xB40F, 0xC450, // 0x0D00 (3328) +0xD574, 0xFF1C, 0xB535, 0x18C3, 0x3165, 0x2924, 0x3986, 0x4A08, 0x3986, 0x2945, 0x2924, 0x2966, 0x89C4, 0xD980, 0xE140, 0xD181, // 0x0D10 (3344) +0xB161, 0xB161, 0xA121, 0xDE17, 0xF7BD, 0xEF1A, 0xEF5A, 0x738C, 0x1081, 0x8410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D20 (3360) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD34, 0x5A89, 0x41E7, 0x69E6, // 0x0D30 (3376) +0x9162, 0x8942, 0x9962, 0xC1A2, 0xB961, 0xC285, 0xC224, 0xB961, 0xB982, 0xB182, 0x8142, 0x9962, 0xD9C2, 0x8942, 0x3060, 0x78C1, // 0x0D40 (3392) +0x79E4, 0x930A, 0x8A68, 0x8ACA, 0x93CD, 0x93CF, 0xABEE, 0xD4B0, 0xCD74, 0x91E5, 0xBC2F, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D50 (3408) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0xEF5C, 0xFFDF, 0xFFFF, 0xFF9D, 0xDDD6, 0xDDB6, 0xF6FA, 0xFFBE, 0xFFFF, // 0x0D60 (3424) +0xFFFF, 0xFFFF, 0xD6DB, 0x39C7, 0x2924, 0x3165, 0x39A6, 0x2945, 0x41C7, 0x3165, 0x2945, 0x2165, 0x71A4, 0xB901, 0xBA87, 0x91A4, // 0x0D70 (3440) +0x9141, 0xC900, 0xC3AC, 0xF7DF, 0xE6D9, 0xEF3B, 0xCE17, 0x39A6, 0x18C2, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0D80 (3456) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD54, 0x4A48, 0x4A07, 0x5269, 0x2965, // 0x0D90 (3472) +0x3904, 0x7A06, 0x7983, 0xA162, 0x9942, 0x91C4, 0x9183, 0x9142, 0x8141, 0x8142, 0x8162, 0xA9A2, 0x8942, 0x6184, 0x9BAE, 0x92C8, // 0x0DA0 (3488) +0x99C4, 0xC4F2, 0xE6FA, 0xFFBE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDD75, 0xC3CC, 0xF6FC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DB0 (3504) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DC0 (3520) +0xFFFF, 0xFFFF, 0xFFFF, 0x7BAE, 0x3165, 0x2945, 0x2104, 0x3165, 0x39A6, 0x4208, 0x3986, 0x20E4, 0x6ACA, 0xE6BA, 0xF7FF, 0xB4D2, // 0x0DD0 (3536) +0x98E0, 0xA182, 0xD638, 0xEF3B, 0xE6D9, 0xEF1A, 0x83CF, 0x2904, 0x0840, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0DE0 (3552) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDA, 0x5248, 0x3986, 0x5289, 0x39A6, 0x3A08, // 0x0DF0 (3568) +0x934C, 0x9B4B, 0x9A47, 0x8921, 0xA961, 0x9962, 0xB181, 0xD9C2, 0xB981, 0xA162, 0xB181, 0xC182, 0x99C3, 0xE6BA, 0xFFFF, 0xFFFF, // 0x0E00 (3584) +0xE5F6, 0xC3ED, 0xCC0E, 0xE658, 0xFFFF, 0xFFFF, 0xEF5C, 0xB3CD, 0xB36B, 0xF77D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E10 (3600) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E20 (3616) +0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x2124, 0x2103, 0x2924, 0x2924, 0x39A6, 0x41C7, 0x2924, 0x2924, 0x5ACA, 0xFFDF, 0xFFFF, 0xF7BE, // 0x0E30 (3632) +0xB1E5, 0x8901, 0xC554, 0xE6FA, 0xE6FA, 0xB574, 0x41E7, 0x20C3, 0x18C2, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E40 (3648) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C30, 0x3985, 0x41E7, 0x41E7, 0x39E8, 0xAC2F, // 0x0E50 (3664) +0xDA03, 0xB141, 0xA961, 0xAA46, 0xB3AD, 0xC981, 0x9121, 0x8121, 0x7142, 0x60C0, 0xA100, 0xD9A1, 0xD1E1, 0xEB69, 0xEDD5, 0xFFFF, // 0x0E60 (3680) +0xFFFF, 0xFFFF, 0xDE58, 0x9A27, 0xA30A, 0xCCF2, 0xA246, 0x99C4, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E70 (3696) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0E80 (3712) +0xFFFF, 0xFFFF, 0xFFFF, 0x9CB2, 0x18C3, 0x3186, 0x2924, 0x2924, 0x3186, 0x2104, 0x2904, 0x3165, 0x39C6, 0x9CB2, 0xE71C, 0xDEFB, // 0x0E90 (3728) +0xBD13, 0xA36B, 0xD616, 0xE6FA, 0xC5D6, 0x5ACA, 0x20E3, 0x5269, 0xDEDA, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EA0 (3744) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x4A49, 0x3165, 0x39A6, 0x2924, 0x8C0F, 0xE265, // 0x0EB0 (3760) +0xE1A1, 0x9162, 0xC181, 0x9942, 0x8C30, 0xC1E3, 0x81A4, 0x4944, 0x50C1, 0xA3AC, 0xCBED, 0xB161, 0xD140, 0xE980, 0xEA65, 0xE349, // 0x0EC0 (3776) +0xD46F, 0xF79C, 0xEF7C, 0xC267, 0x7880, 0x8983, 0x81A3, 0x8944, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0ED0 (3792) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0EE0 (3808) +0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x3186, 0x2103, 0x3145, 0x3165, 0x2945, 0x2904, 0x2904, 0x3145, 0x39C6, 0x5A8A, 0xB554, 0xCE17, // 0x0EF0 (3824) +0xCE57, 0xD658, 0xDE79, 0xBD75, 0x734C, 0x3986, 0x20C3, 0xD699, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F00 (3840) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xAD75, 0x2904, 0x2944, 0x20E3, 0x4A28, 0xB40F, 0xB941, // 0x0F10 (3856) +0xB981, 0xA9C3, 0xB1A2, 0x80E1, 0x6269, 0xBCF2, 0xC553, 0x4207, 0x0841, 0xB5B6, 0xFFFF, 0xE679, 0xAB4B, 0xA942, 0xD1C3, 0xEB07, // 0x0F20 (3872) +0xCA04, 0xBA67, 0xA1C4, 0xB961, 0x9206, 0xDEBA, 0xEF3B, 0xDDB5, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F30 (3888) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F40 (3904) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA514, 0x1882, 0x3165, 0x2924, 0x20E3, 0x2924, 0x3186, 0x2924, 0x3165, 0x4A28, 0x6B2B, 0xA4F2, // 0x0F50 (3920) +0xBDB5, 0xB553, 0x9471, 0x732C, 0x41C7, 0x18A2, 0x1082, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F60 (3936) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BCE, 0x1062, 0x20C3, 0x1081, 0x738E, 0xD329, 0xB940, // 0x0F70 (3952) +0xA982, 0xB9C2, 0xB9A3, 0x70E1, 0x6227, 0xE6FA, 0xE6F9, 0x41A6, 0x1061, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xDE78, 0xAB6A, 0xB141, // 0x0F80 (3968) +0x9982, 0xA9E4, 0xB224, 0xC9A1, 0xB30A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0F90 (3984) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FA0 (4000) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x18A2, 0x20E3, 0x20E3, 0x3165, 0x3186, 0x20E3, 0x2924, 0x39A6, 0x5269, 0x6B2B, // 0x0FB0 (4016) +0x7BAD, 0x736C, 0x62CA, 0x39A6, 0x1882, 0x5269, 0x8430, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FC0 (4032) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0821, 0x18A2, 0x1082, 0x8430, 0xDB49, 0xD960, // 0x0FD0 (4048) +0x9962, 0x8142, 0xC182, 0x68E1, 0x7902, 0xEDF5, 0xD678, 0x3144, 0x20E3, 0xD699, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE679, // 0x0FE0 (4064) +0xA288, 0x8901, 0xBA04, 0xCAA6, 0x8AA8, 0xA4B1, 0x8C10, 0x9451, 0xAD34, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0FF0 (4080) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1000 (4096) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x20C3, 0x20C3, 0x2904, 0x2924, 0x20E3, 0x20E3, 0x2945, 0x2924, 0x3145, 0x41E7, // 0x1010 (4112) +0x4A28, 0x41A6, 0x2924, 0x18A2, 0x41C7, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1020 (4128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x83EF, 0x0820, 0x18C3, 0x1082, 0x7C0F, 0xDB8B, 0xB100, // 0x1030 (4144) +0x9983, 0x8942, 0x80A0, 0x71C5, 0xC574, 0xF73A, 0xACF2, 0x18A2, 0x41C7, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1040 (4160) +0xED94, 0x9942, 0x8AC9, 0x9C2F, 0x8BEF, 0x62A9, 0x41C6, 0x41C6, 0x3145, 0x4A07, 0xA4F3, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1050 (4176) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1060 (4192) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CB3, 0x1882, 0x20E3, 0x28E3, 0x20C3, 0x2924, 0x3165, 0x20E3, 0x2924, 0x2944, // 0x1070 (4208) +0x2904, 0x20E3, 0x1882, 0x18A2, 0x5249, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1080 (4224) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB575, 0x1021, 0x18C3, 0x1081, 0x4A28, 0x9A88, 0x8183, // 0x1090 (4240) +0xA941, 0xC1C3, 0xB32A, 0xD5D6, 0xE75B, 0xE6FA, 0x5AAA, 0x0820, 0x8C30, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10A0 (4256) +0xC5F7, 0x93CD, 0x9C90, 0x7BAE, 0x39E6, 0x3164, 0x3145, 0x2924, 0x2924, 0x2104, 0x18A2, 0x7BCF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10B0 (4272) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10C0 (4288) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDB6, 0x3145, 0x1041, 0x18A2, 0x2924, 0x2104, 0x18C3, 0x3165, 0x18C3, // 0x10D0 (4304) +0x1882, 0x18C2, 0x8C71, 0xCE58, 0xBDB6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10E0 (4320) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x2924, 0x1082, 0x18C3, 0x2904, 0x736D, 0xC5B6, // 0x10F0 (4336) +0xD594, 0xD658, 0xE73C, 0xE73B, 0xEEFA, 0x8C2F, 0x2104, 0x2945, 0xEF5D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xC5F7, // 0x1100 (4352) +0x7BAD, 0x83CE, 0x630B, 0x3986, 0x2924, 0x2124, 0x18A3, 0x18C2, 0x18A2, 0x18C3, 0x2924, 0x1882, 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1110 (4368) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1120 (4384) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x7BCF, 0x3165, 0x18A2, 0x20E3, 0x2904, 0x1061, 0x6B2C, // 0x1130 (4400) +0x94B2, 0x39E7, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1140 (4416) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C30, 0x0000, 0x18C3, 0x18C3, 0x39C6, 0x9491, // 0x1150 (4432) +0xCE78, 0xD678, 0xD657, 0xCE16, 0x8C0F, 0x39A6, 0x1061, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD6BA, 0x62CA, // 0x1160 (4448) +0x6B0B, 0x5A89, 0x3185, 0x2944, 0x20E3, 0x39A6, 0x736D, 0x8C2F, 0x83CE, 0x39A7, 0x18C3, 0x20E3, 0x39C7, 0xEF7D, 0xFFFF, 0xFFFF, // 0x1170 (4464) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1180 (4480) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0xB575, 0xB596, 0xB596, 0x630C, 0xE75D, // 0x1190 (4496) +0xFFFF, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11A0 (4512) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x5249, 0x0000, 0x20C3, 0x2924, 0x4A08, // 0x11B0 (4528) +0x736D, 0x8BCE, 0x83AE, 0x5AAA, 0x2924, 0x0861, 0x9CD2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x738E, 0x41E7, // 0x11C0 (4544) +0x4A48, 0x39A6, 0x2945, 0x20E3, 0x6B8D, 0xD6DA, 0xEF9E, 0xEF7D, 0xD658, 0xC5D6, 0x4A28, 0x18A2, 0x18A2, 0xAD75, 0xFFFF, 0xFFFF, // 0x11D0 (4560) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11E0 (4576) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x11F0 (4592) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1200 (4608) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x528A, 0x0861, 0x0841, 0x1882, // 0x1210 (4624) +0x20E3, 0x2904, 0x18C3, 0x0841, 0x3186, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDD7, 0x3185, 0x41E7, // 0x1220 (4640) +0x39C7, 0x2924, 0x2904, 0x7C0F, 0xBCB1, 0xE3AA, 0xDAE8, 0xE4F2, 0xD679, 0xDEB9, 0xBD94, 0x2903, 0x18A2, 0x8410, 0xFFFF, 0xFFFF, // 0x1230 (4656) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1240 (4672) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1250 (4688) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1260 (4704) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x6B4D, 0x4A28, // 0x1270 (4720) +0x39C6, 0x4207, 0x5ACA, 0x9CD3, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x630C, 0x2924, 0x3986, // 0x1280 (4736) +0x2945, 0x20C3, 0x630B, 0xB554, 0x936C, 0xD100, 0xF1A1, 0xE120, 0xDBCC, 0xDF3C, 0xE6B9, 0x5AAA, 0x1061, 0x62EC, 0xFFFF, 0xFFFF, // 0x1290 (4752) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12A0 (4768) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12B0 (4784) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x12C0 (4800) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x12D0 (4816) +0xF7BE, 0xFFDE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEFB, 0x3165, 0x2944, 0x3165, // 0x12E0 (4832) +0x20E3, 0x4A8A, 0xD554, 0xC9C4, 0xB203, 0xDA02, 0xE1E1, 0xE9A2, 0xD9E3, 0xCD53, 0xCE58, 0x7BAD, 0x0841, 0x528A, 0xFFFF, 0xFFFF, // 0x12F0 (4848) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1300 (4864) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1310 (4880) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1320 (4896) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1330 (4912) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CD3, 0x18C2, 0x3145, 0x2924, // 0x1340 (4928) +0x1882, 0x94D3, 0xFC4D, 0xF140, 0xF2A6, 0xE4CF, 0xCA66, 0xC982, 0xE1E3, 0xA3CD, 0xC637, 0x8C0F, 0x0820, 0x528A, 0xFFFF, 0xFFFF, // 0x1350 (4944) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1360 (4960) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1370 (4976) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1380 (4992) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1390 (5008) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6B4C, 0x1082, 0x2924, 0x20E3, // 0x13A0 (5024) +0x2945, 0xC5D6, 0xEA44, 0xF1A1, 0xE224, 0xE285, 0xE2C7, 0xB1C3, 0xB163, 0xB4F1, 0xDED9, 0x7B8D, 0x1041, 0x738E, 0xFFFF, 0xFFFF, // 0x13B0 (5040) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13C0 (5056) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13D0 (5072) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x13E0 (5088) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x13F0 (5104) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x1082, 0x2924, 0x20E3, // 0x1400 (5120) +0x41E7, 0xDE99, 0xDA24, 0xF1E1, 0xD9A2, 0xB962, 0xDA86, 0xA9C4, 0x99E5, 0xFF9D, 0xF77C, 0x4A48, 0x0841, 0xA514, 0xFFFF, 0xFFFF, // 0x1410 (5136) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1420 (5152) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1430 (5168) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1440 (5184) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x1450 (5200) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x62EB, 0x1082, 0x2124, 0x18C3, // 0x1460 (5216) +0x41E8, 0xDE99, 0xD246, 0xF1E2, 0xE9E2, 0xB9A3, 0x9162, 0x88C0, 0xCC90, 0xFFFF, 0xCE17, 0x2944, 0x2103, 0xD69A, 0xFFFF, 0xFFFF, // 0x1470 (5232) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1480 (5248) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1490 (5264) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14A0 (5280) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, // 0x14B0 (5296) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x1081, 0x2124, 0x18C2, // 0x14C0 (5312) +0x31A6, 0xD69A, 0xD328, 0xF180, 0xF1C1, 0xF202, 0xD141, 0xCB8B, 0xEFBD, 0xFFDD, 0x7BAD, 0x1081, 0x5ACB, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14D0 (5328) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14E0 (5344) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x14F0 (5360) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1500 (5376) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1510 (5392) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x9492, 0x0861, 0x2104, 0x20E3, // 0x1520 (5408) +0x2924, 0xBE18, 0xE595, 0xC9E3, 0xCA44, 0xD182, 0xCB6A, 0xE75B, 0xFFFE, 0xBDD5, 0x3165, 0x18A2, 0xC5F7, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1530 (5424) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1540 (5440) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1550 (5456) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1560 (5472) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1570 (5488) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x10A2, 0x20E3, 0x2104, // 0x1580 (5504) +0x20E3, 0x7BCE, 0xDE58, 0xB40E, 0x83EF, 0xB513, 0xDF1A, 0xFFBD, 0xCE57, 0x4A48, 0x1061, 0x630C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1590 (5520) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15A0 (5536) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15B0 (5552) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15C0 (5568) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15D0 (5584) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A49, 0x1081, 0x2103, // 0x15E0 (5600) +0x20E3, 0x3165, 0x9CB1, 0xBDB5, 0xAD14, 0xE71B, 0xE6FA, 0xB553, 0x5A89, 0x18A2, 0x39A6, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x15F0 (5616) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1600 (5632) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1610 (5648) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1620 (5664) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1630 (5680) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xCE38, 0x1082, 0x18A2, // 0x1640 (5696) +0x20E3, 0x2124, 0x39A6, 0x7B6D, 0x9450, 0x9450, 0x7B8E, 0x4207, 0x20C3, 0x2104, 0xD679, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1650 (5712) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1660 (5728) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1670 (5744) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1680 (5760) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1690 (5776) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x18C3, // 0x16A0 (5792) +0x1082, 0x18C2, 0x2104, 0x3165, 0x39A6, 0x39A6, 0x2944, 0x1061, 0x3165, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16B0 (5808) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16C0 (5824) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16D0 (5840) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16E0 (5856) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x16F0 (5872) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xB5B6, // 0x1700 (5888) +0x4A28, 0x2104, 0x1061, 0x0820, 0x0820, 0x1061, 0x2944, 0x7BAE, 0xEF5C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1710 (5904) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1720 (5920) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1730 (5936) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1740 (5952) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1750 (5968) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1760 (5984) +0xFFDF, 0xD6BA, 0xB596, 0x9CD3, 0x9CD3, 0xB596, 0xEF3C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1770 (6000) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1780 (6016) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1790 (6032) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17A0 (6048) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17B0 (6064) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17C0 (6080) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17D0 (6096) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17E0 (6112) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7DE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x17F0 (6128) +0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x1800 (6144) +}; + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_mono.h b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_mono.h new file mode 100644 index 0000000..938aef0 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/bitmap_mono.h @@ -0,0 +1,343 @@ +// http://skaarhoj.com/FreeStuff/GraphicDisplayImageConverter.php + +// width x height = 64,64 +static const uint8_t magnify_inv_64x64[] PROGMEM = { + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xfc,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xe0,0x00,0x7f,0xff,0xff,0xff, + 0xff,0xff,0x80,0x00,0x1f,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xff, + 0xff,0xfc,0x00,0x00,0x03,0xff,0xff,0xff, + 0xff,0xf8,0x00,0x00,0x01,0xff,0xff,0xff, + 0xff,0xf0,0x00,0x40,0x01,0xff,0xff,0xff, + 0xff,0xf0,0x07,0xfe,0x00,0xff,0xff,0xff, + 0xff,0xe0,0x0f,0xff,0x00,0x7f,0xff,0xff, + 0xff,0xc0,0x3f,0xff,0xc0,0x7f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xc0,0x3f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x01,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x81,0xff,0xff,0xf8,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0xff,0xff,0xf0,0x1f,0xff,0xff, + 0xff,0x80,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0xc0,0x7f,0xff,0xe0,0x3f,0xff,0xff, + 0xff,0xc0,0x3f,0xff,0xc0,0x7f,0xff,0xff, + 0xff,0xe0,0x1f,0xff,0x00,0x7f,0xff,0xff, + 0xff,0xf0,0x07,0xfe,0x00,0x7f,0xff,0xff, + 0xff,0xf0,0x00,0xf0,0x00,0x7f,0xff,0xff, + 0xff,0xf8,0x00,0x00,0x00,0x3f,0xff,0xff, + 0xff,0xfc,0x00,0x00,0x00,0x1f,0xff,0xff, + 0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff, + 0xff,0xff,0x80,0x00,0x10,0x07,0xff,0xff, + 0xff,0xff,0xe0,0x00,0x78,0x03,0xff,0xff, + 0xff,0xff,0xfc,0x03,0xfc,0x01,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfe,0x00,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0x00,0x7f,0xff, + 0xff,0xff,0xff,0xff,0xff,0x80,0x3f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xc0,0x1f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xe0,0x0f,0xff, + 0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff, + 0xff,0xff,0xff,0xff,0xff,0xf8,0x03,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfc,0x01,0xff, + 0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x7f, + 0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x3f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x7f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +}; + +// width x height = 64,64 +static const uint8_t magnify_64x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x03,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1f,0xff,0x80,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xff,0xe0,0x00,0x00,0x00, + 0x00,0x00,0xff,0xff,0xf0,0x00,0x00,0x00, + 0x00,0x03,0xff,0xff,0xfc,0x00,0x00,0x00, + 0x00,0x07,0xff,0xff,0xfe,0x00,0x00,0x00, + 0x00,0x0f,0xff,0xbf,0xfe,0x00,0x00,0x00, + 0x00,0x0f,0xf8,0x01,0xff,0x00,0x00,0x00, + 0x00,0x1f,0xf0,0x00,0xff,0x80,0x00,0x00, + 0x00,0x3f,0xc0,0x00,0x3f,0x80,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x3f,0xc0,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0xfe,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7e,0x00,0x00,0x07,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x00,0x00,0x0f,0xe0,0x00,0x00, + 0x00,0x7f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x3f,0x80,0x00,0x1f,0xc0,0x00,0x00, + 0x00,0x3f,0xc0,0x00,0x3f,0x80,0x00,0x00, + 0x00,0x1f,0xe0,0x00,0xff,0x80,0x00,0x00, + 0x00,0x0f,0xf8,0x01,0xff,0x80,0x00,0x00, + 0x00,0x0f,0xff,0x0f,0xff,0x80,0x00,0x00, + 0x00,0x07,0xff,0xff,0xff,0xc0,0x00,0x00, + 0x00,0x03,0xff,0xff,0xff,0xe0,0x00,0x00, + 0x00,0x01,0xff,0xff,0xff,0xf0,0x00,0x00, + 0x00,0x00,0x7f,0xff,0xef,0xf8,0x00,0x00, + 0x00,0x00,0x1f,0xff,0x87,0xfc,0x00,0x00, + 0x00,0x00,0x03,0xfc,0x03,0xfe,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0xff,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xff,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0x7f,0xc0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x1f,0xf0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x00, + 0x00,0x00,0x00,0x00,0x00,0x07,0xfc,0x00, + 0x00,0x00,0x00,0x00,0x00,0x03,0xfe,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xc0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,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, +}; + +// width x height = 96,64 (768 bytes) +static const uint8_t camera_96x64[] PROGMEM = { + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x01,0xff,0x00,0x0f,0xff, + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0x00,0x0f,0xff, + 0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x7f,0x00,0x0f,0xff, + 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0xc0,0x03,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x3f,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xc0, + 0x03,0xf0,0x7f,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xc0,0x1f,0xf8,0x03,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x3f,0xfc,0x01,0xff,0xff,0xff,0xc0, + 0x01,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x80, + 0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x0f,0xff,0xff,0xf0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfc,0x07,0xff,0xff,0xe0,0x3f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x07,0xff,0xff,0xe0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x03,0xff,0xff,0xc0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xfe,0x03,0xff,0xff,0xc0,0x7f,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x01,0xff,0xff,0x80,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x7f,0xfe,0x01,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0x80,0x1f,0xf8,0x01,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xc0,0x03,0xc0,0x03,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0x80,0x01,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +// width x height = 96,64 +static const uint8_t camera_inv_96x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xfe,0x00,0xff,0xf0,0x00, + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xf0,0x00, + 0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0x80,0xff,0xf0,0x00, + 0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x07,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x01,0xff,0xff,0xff,0xff, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0x3f,0xfc,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x03,0xff,0xff,0xc0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0xc0,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f, + 0xfc,0x0f,0x80,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x3f,0xe0,0x07,0xfc,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0xc0,0x03,0xfe,0x00,0x00,0x00,0x3f, + 0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x7f, + 0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x7f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x03,0xf8,0x00,0x00,0x1f,0xc0,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xf8,0x00,0x00,0x1f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xfc,0x00,0x00,0x3f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x01,0xfc,0x00,0x00,0x3f,0x80,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0xfe,0x00,0x00,0x7f,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0x80,0x01,0xfe,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x7f,0xe0,0x07,0xfe,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x3f,0xfc,0x3f,0xfc,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x1f,0xff,0xff,0xf8,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x01,0xff,0xff,0x80,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +}; + +// width x height = 128,64 (1024 bytes) +static const uint8_t tractor_128x64[] PROGMEM = { + 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x31,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x28,0x70,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x24,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x23,0x38,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x23,0xec,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x1f,0x84,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x03,0xf8,0x7c,0x00,0x00,0x00,0x1b,0x84,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0f,0xff,0xff,0xfc,0x00,0x00,0x0e,0x44,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x80,0x00,0x1f,0xff,0xfc,0x06,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x39,0x00,0x00,0x00,0x30,0x1e,0x6f,0x9f,0xc0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x39,0x00,0x00,0x00,0x00,0x01,0xfc,0xff,0xe0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x79,0x00,0x09,0x00,0x08,0x00,0xf8,0xff,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf9,0x80,0xf0,0x12,0x4a,0x22,0xf1,0xfe,0x07,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7c,0x04,0x28,0x00,0x08,0x00,0xf3,0xf3,0xfd,0xc0,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7f,0xf2,0x09,0xff,0xc8,0x00,0xf3,0xf0,0x0c,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x01,0x7c,0x01,0x2f,0xff,0xef,0xff,0x67,0xeb,0xe4,0x78,0x00,0x00,0x00,0x00, + 0x00,0x01,0xff,0xfd,0xbf,0xff,0xc0,0x00,0x7f,0x0f,0xe0,0x38,0x00,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xfd,0x7f,0xff,0xcf,0xff,0xff,0x90,0x20,0x1c,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3c,0x01,0x3f,0xff,0xef,0xff,0xff,0x81,0x00,0x0e,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfd,0x3c,0x03,0xef,0xff,0xff,0x67,0x0f,0xce,0x00,0x00,0x00,0x00, + 0x00,0x00,0x7f,0xfc,0x3f,0xff,0xef,0xf0,0xfc,0x5f,0x9f,0xe6,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x3f,0xff,0xef,0xc1,0x3c,0x70,0x3f,0xe7,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0x3f,0xff,0xff,0x87,0xbe,0xc0,0x70,0x73,0x80,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0xbf,0xff,0xff,0x87,0xde,0x00,0x67,0xb3,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x9b,0x80,0xe0,0x07,0xdc,0x0e,0xef,0xdf,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x83,0x80,0xe0,0x07,0x59,0xbc,0xdf,0xef,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3f,0xfc,0x93,0xc0,0xe0,0x77,0x50,0x70,0xe1,0xef,0x00,0x00,0x00,0x00, + 0x00,0x00,0x1c,0x00,0x9f,0xff,0xe0,0x77,0xd8,0xe0,0x80,0xdf,0x80,0x00,0x00,0x00, + 0x00,0x00,0x5f,0xe0,0x9f,0xff,0xe0,0x7a,0xd9,0x80,0x80,0xd7,0xc0,0x00,0x00,0x00, + 0x00,0x01,0xbf,0xfc,0x9f,0xff,0xe0,0xfa,0xbd,0x08,0x80,0xd7,0x80,0x00,0x00,0x00, + 0x00,0x02,0xfc,0x00,0x1f,0xe0,0xf3,0xfc,0x7c,0x1c,0x80,0x77,0x80,0x00,0x00,0x00, + 0x00,0x05,0x3f,0xff,0xdf,0xb0,0x37,0xff,0xf2,0xb8,0x00,0x7f,0x80,0x00,0x00,0x00, + 0x00,0x0a,0x7c,0x00,0x03,0x40,0x1f,0xff,0xf1,0xf0,0x04,0x6f,0x80,0x00,0x00,0x00, + 0x00,0x14,0xfe,0x00,0x06,0x90,0x0f,0xff,0xf1,0x60,0x06,0x6f,0x80,0x00,0x00,0x00, + 0x00,0x15,0xff,0x00,0x0d,0x07,0x8f,0xfe,0xf0,0xc0,0x04,0x63,0xc0,0x00,0x00,0x00, + 0x00,0x2b,0xff,0xff,0xfc,0x4f,0xc7,0xf9,0xf9,0x80,0x04,0x77,0xc0,0x00,0x00,0x00, + 0x00,0x2b,0x9f,0xff,0xfa,0x98,0x67,0xc7,0xfd,0x0c,0x40,0x77,0x80,0x00,0x00,0x00, + 0x00,0x27,0x1f,0xff,0xfa,0xb7,0x34,0x3f,0xfe,0x1c,0x00,0xf7,0x80,0x00,0x00,0x00, + 0x00,0x37,0x01,0xff,0xf8,0x2f,0xb3,0xff,0xfa,0x3c,0x00,0xd7,0x80,0x00,0x00,0x00, + 0x00,0x37,0x00,0xff,0x9c,0x39,0xdb,0xff,0xf9,0x3c,0x00,0xc7,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1c,0xff,0x9c,0x20,0xdb,0xff,0xfc,0x78,0x21,0xaf,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1e,0x3f,0x9c,0x40,0xdb,0xff,0xfe,0xf0,0x13,0x0f,0x80,0x00,0x00,0x00, + 0x00,0x36,0x1f,0xff,0x9c,0x42,0x5b,0xff,0xe6,0xf2,0x1e,0x5f,0x00,0x00,0x00,0x00, + 0x00,0x36,0x1f,0xff,0xfc,0x41,0x5b,0xff,0xc3,0x67,0x00,0x1e,0x00,0x00,0x00,0x00, + 0x00,0x26,0x1f,0xff,0xfc,0x0f,0x5b,0xff,0xc7,0xee,0x00,0x37,0x00,0x00,0x00,0x00, + 0x00,0x27,0x02,0xff,0xfd,0x0e,0x5b,0xff,0xc3,0xfe,0x07,0xe7,0x00,0x00,0x00,0x00, + 0x00,0x37,0x44,0xe0,0x1d,0x00,0xd7,0xff,0x81,0xfc,0xc3,0xc6,0x00,0x00,0x00,0x00, + 0x00,0x1b,0x38,0xe0,0x19,0x00,0x97,0xff,0x80,0xfc,0xc0,0x0c,0x00,0x00,0x00,0x00, + 0x00,0x13,0x81,0xe0,0x1b,0x20,0xb7,0xff,0x00,0xfd,0x80,0x18,0x00,0x00,0x00,0x00, + 0x00,0x1b,0xc3,0xc0,0x0a,0x33,0x27,0xff,0xfc,0xff,0x90,0x3f,0xe0,0x00,0x00,0x00, + 0x00,0x0f,0xff,0xc0,0x0e,0x1e,0x6f,0xff,0xff,0xff,0xb8,0xff,0xe0,0x00,0x00,0x00, + 0x00,0x3f,0xff,0x80,0x0d,0x98,0xcf,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00, + 0x03,0xff,0xff,0xff,0xfd,0x8f,0x9f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x7f,0xff,0xff,0xff,0xff,0xc0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0xff,0xff,0x83,0xff,0xc0,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0xe0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/drawBitmap_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/drawBitmap_kbv.ino new file mode 100644 index 0000000..a40ae6c --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/drawBitmap_kbv/drawBitmap_kbv.ino @@ -0,0 +1,160 @@ +#include "MCUFRIEND_kbv.h" +MCUFRIEND_kbv tft; + +#define LOWFLASH (defined(__AVR_ATmega328P__) && defined(MCUFRIEND_KBV_H_)) + +#include "bitmap_mono.h" +#include "bitmap_RGB.h" + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF +#define GREY 0x8410 +#define ORANGE 0xE880 + +void setup() +{ + Serial.begin(9600); + uint16_t ID = tft.readID(); + + Serial.print(F("ID = 0x")); + Serial.println(ID, HEX); + + Serial.println(F("GFX drawBitmap() plots one mono pixel at a time")); + Serial.println(F("it defaults to transparent plotting")); + Serial.println(F("unless you specify foreground and background colours")); + Serial.println(F("it can plot a monochrome bitmap from Flash or SRAM")); + + Serial.println(F("")); + Serial.println(F("GFX drawGrayscaleBitmap() is not relevant for OLED, TFT")); + Serial.println(F("GFX drawRGBBitmap() plots one colour pixel at a time")); + Serial.println(F("from Flash or SRAM and with a monochrome transparent bitmask")); + Serial.println(F("")); + Serial.println(F("Using the hardware pushColors() methods is faster")); + Serial.println(F("pushColors() expects uint16 array in SRAM")); + Serial.println(F("for any runtime generated images")); + Serial.println(F("but it expects uint8_t array of serialised bytes in Flash")); + Serial.println(F("")); + + Serial.println(F("Colour TFTs are natively big-endian")); + Serial.println(F("Many microcontrollers and Tools are little-endian")); + Serial.println(F("you can use the optional argument to select big-end")); + tft.begin(ID); + // invertmap(betty_1_bmp + 62, 8960); + // while (1); +} + +// GFX drawBitmap() expects each row to be on 8-bit boundary. i.e. pad = 7 +// Mono BMP rows are on 32-bit boundary. i.e. pad = 31, rows are in RVS order. +// FreeFont bitmaps have no padding. i.e. pad = 0. e.g. 5x4 bitmap is in 3 bytes +void showbgd(int x, int y, const uint8_t *bmp, int w, int h, uint16_t color, uint16_t bg, uint8_t pad = 7) +{ + int yy, xx; + uint8_t first = 1, RVS = pad & 0x80; + uint16_t pixel; + pad &= 31; + uint16_t wid = (w + pad) & ~pad; //bits per row + tft.setAddrWindow(x, y, x + w - 1, y + h - 1); // + for (yy = 0; yy < h; yy++) { + uint32_t ofs = (RVS ? (h - yy - 1) : yy) * wid; //bit offset + const uint8_t *p = bmp + (ofs >> 3); //flash address + uint8_t mask = 0x80 >> (ofs & 7); //bit mask + uint8_t c = pgm_read_byte(p++); + for (xx = 0; xx < w; xx++) { + if (mask == 0) { + c = pgm_read_byte(p++); + mask = 0x80; + } + pixel = (c & mask) ? color : bg; + tft.pushColors(&pixel, 1, first); + first = 0; + mask >>= 1; + } + } + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); +} + +void msg_time(int x, int y, String msg, uint32_t t) +{ + t = millis() - t; + tft.setCursor(x, y); + tft.print(msg); + tft.print(t); + tft.print(F("ms")); +} + +void loop(void) +{ + int x = 5, y, w = 128, h = 64; + uint32_t t; + const int SZ = w * h / 8; + uint8_t sram[SZ]; + memcpy_P(sram, tractor_128x64, SZ); + + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawBitmap(x, y, tractor_128x64, 128, 64, BLUE); + msg_time(0, y + 66, F("drawBitmap() transparent flash "), t); + y = 80; t = millis(); + tft.drawBitmap(x, y, tractor_128x64, 128, 64, RED, YELLOW); + msg_time(0, y + 66, F("drawBitmap() background flash "), t); + y = 160; t = millis(); + tft.fillRect(x, y, w, h, GREY); + tft.drawBitmap(x, y, sram, 128, 64, GREEN); + msg_time(0, y + 66, F("drawBitmap() fill bgd SRAM "), t); + y = 240; t = millis(); + showbgd(x, y, tractor_128x64, 128, 64, MAGENTA, YELLOW); + msg_time(0, y + 66, F("pushColors() background flash "), t); + delay(5000); + + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawRGBBitmap(x, y, marilyn_64x64, 64, 64); + msg_time(0, y + 66, "drawRGBBitmap() flash ", t); + y = 80; t = millis(); + tft.setAddrWindow(x, y, x + 64 - 1, y + 64 - 1); + tft.pushColors((const uint8_t*)marilyn_64x64, 64 * 64, 1, false); + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); + msg_time(0, y + 66, F("pushColors() flash "), t); + y = 160; t = millis(); + w = 64; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, marilyn_64x64, magnify_64x64, 64, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + y = 240; t = millis(); + w = 64; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, marilyn_64x64, magnify_inv_64x64, 64, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + delay(5000); + +#if !LOWFLASH + tft.fillScreen(BLACK); + y = 0; t = millis(); + tft.drawRGBBitmap(x, y, tractor10_96x64, 96, 64); + msg_time(0, y + 66, "drawRGBBitmap() flash ", t); + y = 80; t = millis(); + tft.setAddrWindow(x, y, x + 96 - 1, y + 64 - 1); + tft.pushColors((const uint8_t*)tractor10_96x64, 96 * 64, 1, false); + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); + msg_time(0, y + 66, F("pushColors() flash "), t); + y = 160; t = millis(); + w = 96; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, tractor10_96x64, camera_96x64, 96, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + y = 240; t = millis(); + w = 96; + tft.fillRect(x, y, w, h, GREY); + tft.drawRGBBitmap(x, y, tractor10_96x64, camera_inv_96x64, 96, 64); + msg_time(0, y + 66, F("drawRGBBitmap() with mask "), t); + delay(5000); +#endif +} + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/graphictest_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/graphictest_kbv.ino new file mode 100644 index 0000000..916b5a2 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/graphictest_kbv.ino @@ -0,0 +1,586 @@ +// All the mcufriend.com UNO shields have the same pinout. +// i.e. control pins A0-A4. Data D2-D9. microSD D10-D13. +// Touchscreens are normally A1, A2, D7, D6 but the order varies +// +// This demo should work with most Adafruit TFT libraries +// If you are not using a shield, use a full Adafruit constructor() +// e.g. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +#define LCD_CS A3 // Chip Select goes to Analog 3 +#define LCD_CD A2 // Command/Data goes to Analog 2 +#define LCD_WR A1 // LCD Write goes to Analog 1 +#define LCD_RD A0 // LCD Read goes to Analog 0 +#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin + +#include // f.k. for Arduino-1.5.2 +#include "Adafruit_GFX.h"// Hardware-specific library +#include +MCUFRIEND_kbv tft; +//#include +//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +void setup(void); +void loop(void); +unsigned long testFillScreen(); +unsigned long testText(); +unsigned long testLines(uint16_t color); +unsigned long testFastLines(uint16_t color1, uint16_t color2); +unsigned long testRects(uint16_t color); +unsigned long testFilledRects(uint16_t color1, uint16_t color2); +unsigned long testFilledCircles(uint8_t radius, uint16_t color); +unsigned long testCircles(uint8_t radius, uint16_t color); +unsigned long testTriangles(); +unsigned long testFilledTriangles(); +unsigned long testRoundRects(); +unsigned long testFilledRoundRects(); +void progmemPrint(const char *str); +void progmemPrintln(const char *str); + +void runtests(void); + +uint16_t g_identifier; + +extern const uint8_t hanzi[]; +void showhanzi(unsigned int x, unsigned int y, unsigned char index) +{ + uint8_t i, j, c, first = 1; + uint8_t *temp = (uint8_t*)hanzi; + uint16_t color; + tft.setAddrWindow(x, y, x + 31, y + 31); //设置区域 + temp += index * 128; + for (j = 0; j < 128; j++) + { + c = pgm_read_byte(temp); + for (i = 0; i < 8; i++) + { + if ((c & (1 << i)) != 0) + { + color = RED; + } + else + { + color = BLACK; + } + tft.pushColors(&color, 1, first); + first = 0; + } + temp++; + } +} + +void setup(void) { + Serial.begin(9600); + uint32_t when = millis(); + // while (!Serial) ; //hangs a Leonardo until you connect a Serial + if (!Serial) delay(5000); //allow some time for Leonardo + Serial.println("Serial took " + String((millis() - when)) + "ms to start"); + // tft.reset(); //hardware reset + uint16_t ID = tft.readID(); // + Serial.print("ID = 0x"); + Serial.println(ID, HEX); + if (ID == 0xD3D3) ID = 0x9481; // write-only shield +// ID = 0x9329; // force ID + tft.begin(ID); +} + +#if defined(MCUFRIEND_KBV_H_) +uint16_t scrollbuf[320]; // my biggest screen is 320x480 +#define READGRAM(x, y, buf, w, h) tft.readGRAM(x, y, buf, w, h) +#else +uint16_t scrollbuf[320]; // Adafruit only does 240x320 +// Adafruit can read a block by one pixel at a time +int16_t READGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h) +{ + uint16_t *p; + for (int row = 0; row < h; row++) { + p = block + row * w; + for (int col = 0; col < w; col++) { + *p++ = tft.readPixel(x + col, y + row); + } + } +} +#endif + +void windowScroll(int16_t x, int16_t y, int16_t wid, int16_t ht, int16_t dx, int16_t dy, uint16_t *buf) +{ + if (dx) for (int16_t row = 0; row < ht; row++) { + READGRAM(x, y + row, buf, wid, 1); + tft.setAddrWindow(x, y + row, x + wid - 1, y + row); + tft.pushColors(buf + dx, wid - dx, 1); + tft.pushColors(buf + 0, dx, 0); + } + if (dy) for (int16_t col = 0; col < wid; col++) { + READGRAM(x + col, y, buf, 1, ht); + tft.setAddrWindow(x + col, y, x + col, y + ht - 1); + tft.pushColors(buf + dy, ht - dy, 1); + tft.pushColors(buf + 0, dy, 0); + } +} + +void printmsg(int row, const char *msg) +{ + tft.setTextColor(YELLOW, BLACK); + tft.setCursor(0, row); + tft.println(msg); +} + +void loop(void) { + uint8_t aspect; + uint16_t pixel; + const char *aspectname[] = { + "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" + }; + const char *colorname[] = { "BLUE", "GREEN", "RED", "GRAY" }; + uint16_t colormask[] = { 0x001F, 0x07E0, 0xF800, 0xFFFF }; + uint16_t dx, rgb, n, wid, ht, msglin; + tft.setRotation(0); + runtests(); + delay(2000); + if (tft.height() > 64) { + for (uint8_t cnt = 0; cnt < 4; cnt++) { + aspect = (cnt + 0) & 3; + tft.setRotation(aspect); + wid = tft.width(); + ht = tft.height(); + msglin = (ht > 160) ? 200 : 112; + testText(); + dx = wid / 32; + for (n = 0; n < 32; n++) { + rgb = n * 8; + rgb = tft.color565(rgb, rgb, rgb); + tft.fillRect(n * dx, 48, dx, 63, rgb & colormask[aspect]); + } + tft.drawRect(0, 48 + 63, wid, 1, WHITE); + tft.setTextSize(2); + tft.setTextColor(colormask[aspect], BLACK); + tft.setCursor(0, 72); + tft.print(colorname[aspect]); + tft.setTextColor(WHITE); + tft.println(" COLOR GRADES"); + tft.setTextColor(WHITE, BLACK); + printmsg(184, aspectname[aspect]); + delay(1000); + tft.drawPixel(0, 0, YELLOW); + pixel = tft.readPixel(0, 0); + tft.setTextSize((ht > 160) ? 2 : 1); //for messages +#if defined(MCUFRIEND_KBV_H_) +#if 1 + extern const uint8_t penguin[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 1 - 40, 20 + 39); + tft.pushColors(penguin, 1600, 1); +#elif 1 + extern const uint8_t wifi_full[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 40 - 40 + 31, 20 + 31); + tft.pushColors(wifi_full, 1024, 1, true); +#elif 1 + extern const uint8_t icon_40x40[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 1 - 40, 20 + 39); + tft.pushColors(icon_40x40, 1600, 1); +#endif + tft.setAddrWindow(0, 0, wid - 1, ht - 1); + if (aspect & 1) tft.drawRect(wid - 1, 0, 1, ht, WHITE); + else tft.drawRect(0, ht - 1, wid, 1, WHITE); + printmsg(msglin, "VERTICAL SCROLL UP"); + uint16_t maxscroll; + if (tft.getRotation() & 1) maxscroll = wid; + else maxscroll = ht; + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, i); + delay(10); + } + delay(1000); + printmsg(msglin, "VERTICAL SCROLL DN"); + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, 0 - (int16_t)i); + delay(10); + } + tft.vertScroll(0, maxscroll, 0); + printmsg(msglin, "SCROLL DISABLED "); + + delay(1000); + if ((aspect & 1) == 0) { //Portrait + tft.setTextColor(BLUE, BLACK); + printmsg(msglin, "ONLY THE COLOR BAND"); + for (uint16_t i = 1; i <= 64; i++) { + tft.vertScroll(48, 64, i); + delay(20); + } + delay(1000); + } +#endif + tft.setTextColor(YELLOW, BLACK); + if (pixel == YELLOW) { + printmsg(msglin, "SOFTWARE SCROLL "); +#if 0 + // diagonal scroll of block + for (int16_t i = 45, dx = 2, dy = 1; i > 0; i -= dx) { + windowScroll(24, 8, 90, 40, dx, dy, scrollbuf); + } +#else + // plain horizontal scroll of block + n = (wid > 320) ? 320 : wid; + for (int16_t i = n, dx = 4, dy = 0; i > 0; i -= dx) { + windowScroll(0, 200, n, 16, dx, dy, scrollbuf); + } +#endif + } + else if (pixel == CYAN) + tft.println("readPixel() reads as BGR"); + else if ((pixel & 0xF8F8) == 0xF8F8) + tft.println("readPixel() should be 24-bit"); + else { + tft.print("readPixel() reads 0x"); + tft.println(pixel, HEX); + } + delay(5000); + } + } + printmsg(msglin, "INVERT DISPLAY "); + tft.invertDisplay(true); + delay(2000); + tft.invertDisplay(false); +} + +typedef struct { + PGM_P msg; + uint32_t ms; +} TEST; +TEST result[12]; + +#define RUNTEST(n, str, test) { result[n].msg = PSTR(str); result[n].ms = test; delay(500); } + +void runtests(void) +{ + uint8_t i, len = 24, cnt; + uint32_t total; + RUNTEST(0, "FillScreen ", testFillScreen()); + RUNTEST(1, "Text ", testText()); + RUNTEST(2, "Lines ", testLines(CYAN)); + RUNTEST(3, "Horiz/Vert Lines ", testFastLines(RED, BLUE)); + RUNTEST(4, "Rectangles (outline) ", testRects(GREEN)); + RUNTEST(5, "Rectangles (filled) ", testFilledRects(YELLOW, MAGENTA)); + RUNTEST(6, "Circles (filled) ", testFilledCircles(10, MAGENTA)); + RUNTEST(7, "Circles (outline) ", testCircles(10, WHITE)); + RUNTEST(8, "Triangles (outline) ", testTriangles()); + RUNTEST(9, "Triangles (filled) ", testFilledTriangles()); + RUNTEST(10, "Rounded rects (outline) ", testRoundRects()); + RUNTEST(11, "Rounded rects (filled) ", testFilledRoundRects()); + + tft.fillScreen(BLACK); + tft.setTextColor(GREEN); + tft.setCursor(0, 0); + uint16_t wid = tft.width(); + if (wid > 176) { + tft.setTextSize(2); +#if defined(MCUFRIEND_KBV_H_) + tft.print("MCUFRIEND "); +#if MCUFRIEND_KBV_H_ != 0 + tft.print(0.01 * MCUFRIEND_KBV_H_, 2); +#else + tft.print("for"); +#endif + tft.println(" UNO"); +#else + tft.println("Adafruit-Style Tests"); +#endif + } else len = wid / 6 - 8; + tft.setTextSize(1); + total = 0; + for (i = 0; i < 12; i++) { + PGM_P str = result[i].msg; + char c; + if (len > 24) { + if (i < 10) tft.print(" "); + tft.print(i); + tft.print(": "); + } + uint8_t cnt = len; + while ((c = pgm_read_byte(str++)) && cnt--) tft.print(c); + tft.print(" "); + tft.println(result[i].ms); + total += result[i].ms; + } + tft.setTextSize(2); + tft.print("Total:"); + tft.print(0.000001 * total); + tft.println("sec"); + g_identifier = tft.readID(); + tft.print("ID: 0x"); + tft.println(tft.readID(), HEX); +// tft.print("Reg(00):0x"); +// tft.println(tft.readReg(0x00), HEX); + tft.print("F_CPU:"); + tft.print(0.000001 * F_CPU); +#if defined(__OPTIMIZE_SIZE__) + tft.println("MHz -Os"); +#else + tft.println("MHz"); +#endif + + delay(10000); +} + +// Standard Adafruit tests. will adjust to screen size + +unsigned long testFillScreen() { + unsigned long start = micros(); + tft.fillScreen(BLACK); + tft.fillScreen(RED); + tft.fillScreen(GREEN); + tft.fillScreen(BLUE); + tft.fillScreen(BLACK); + return micros() - start; +} + +unsigned long testText() { + unsigned long start; + tft.fillScreen(BLACK); + start = micros(); + tft.setCursor(0, 0); + tft.setTextColor(WHITE); tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(YELLOW); tft.setTextSize(2); + tft.println(123.45); + tft.setTextColor(RED); tft.setTextSize(3); + tft.println(0xDEADBEEF, HEX); + tft.println(); + tft.setTextColor(GREEN); + tft.setTextSize(5); + tft.println("Groop"); + tft.setTextSize(2); + tft.println("I implore thee,"); + tft.setTextSize(1); + tft.println("my foonting turlingdromes."); + tft.println("And hooptiously drangle me"); + tft.println("with crinkly bindlewurdles,"); + tft.println("Or I will rend thee"); + tft.println("in the gobberwarts"); + tft.println("with my blurglecruncheon,"); + tft.println("see if I don't!"); + return micros() - start; +} + +unsigned long testLines(uint16_t color) { + unsigned long start, t; + int x1, y1, x2, y2, + w = tft.width(), + h = tft.height(); + + tft.fillScreen(BLACK); + + x1 = y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t = micros() - start; // fillScreen doesn't count against timing + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = 0; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + + return micros() - start; +} + +unsigned long testFastLines(uint16_t color1, uint16_t color2) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(); + + tft.fillScreen(BLACK); + start = micros(); + for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1); + for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2); + + return micros() - start; +} + +unsigned long testRects(uint16_t color) { + unsigned long start; + int n, i, i2, + cx = tft.width() / 2, + cy = tft.height() / 2; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + start = micros(); + for (i = 2; i < n; i += 6) { + i2 = i / 2; + tft.drawRect(cx - i2, cy - i2, i, i, color); + } + + return micros() - start; +} + +unsigned long testFilledRects(uint16_t color1, uint16_t color2) { + unsigned long start, t = 0; + int n, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + for (i = n; i > 0; i -= 6) { + i2 = i / 2; + start = micros(); + tft.fillRect(cx - i2, cy - i2, i, i, color1); + t += micros() - start; + // Outlines are not included in timing results + tft.drawRect(cx - i2, cy - i2, i, i, color2); + } + + return t; +} + +unsigned long testFilledCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; + + tft.fillScreen(BLACK); + start = micros(); + for (x = radius; x < w; x += r2) { + for (y = radius; y < h; y += r2) { + tft.fillCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, r2 = radius * 2, + w = tft.width() + radius, + h = tft.height() + radius; + + // Screen is not cleared for this one -- this is + // intentional and does not affect the reported time. + start = micros(); + for (x = 0; x < w; x += r2) { + for (y = 0; y < h; y += r2) { + tft.drawCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testTriangles() { + unsigned long start; + int n, i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(cx, cy); + start = micros(); + for (i = 0; i < n; i += 5) { + tft.drawTriangle( + cx , cy - i, // peak + cx - i, cy + i, // bottom left + cx + i, cy + i, // bottom right + tft.color565(0, 0, i)); + } + + return micros() - start; +} + +unsigned long testFilledTriangles() { + unsigned long start, t = 0; + int i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + for (i = min(cx, cy); i > 10; i -= 5) { + start = micros(); + tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(0, i, i)); + t += micros() - start; + tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(i, i, 0)); + } + + return t; +} + +unsigned long testRoundRects() { + unsigned long start; + int w, i, i2, red, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + w = min(tft.width(), tft.height()); + start = micros(); + red = 0; + step = (256 * 6) / w; + for (i = 0; i < w; i += 6) { + i2 = i / 2; + red += step; + tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(red, 0, 0)); + } + + return micros() - start; +} + +unsigned long testFilledRoundRects() { + unsigned long start; + int i, i2, green, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + green = 256; + step = (256 * 6) / min(tft.width(), tft.height()); + for (i = min(tft.width(), tft.height()); i > 20; i -= 6) { + i2 = i / 2; + green -= step; + tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, green, 0)); + } + + return micros() - start; +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/icons.c b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/icons.c new file mode 100644 index 0000000..d973df6 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_kbv/icons.c @@ -0,0 +1,542 @@ +#if defined(__arm__) || defined(ESP8266) || defined(ESP32) +#define PROGMEM +#else +#include +#endif + +const unsigned char PROGMEM penguin[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, + 0XBA, 0XD6, 0XB6, 0XB5, 0XF3, 0X9C, 0XB2, 0X94, 0XB3, 0X9C, 0XB2, 0X94, 0X34, 0XA5, 0XF7, 0XBD, + 0XFB, 0XDE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XFB, 0XDE, 0XF3, 0X9C, 0XCB, 0X5A, + 0XC7, 0X39, 0X04, 0X21, 0X82, 0X10, 0X42, 0X10, 0X42, 0X10, 0X41, 0X08, 0X83, 0X18, 0X45, 0X29, + 0XC7, 0X39, 0X0C, 0X63, 0X75, 0XAD, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XB2, 0X94, 0X08, 0X42, 0XC3, 0X18, 0X82, 0X10, + 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X41, 0X08, 0XC3, 0X18, 0X08, 0X42, 0XF3, 0X9C, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XDE, 0X0C, 0X63, 0XC3, 0X18, 0XC3, 0X18, 0X45, 0X29, 0XC7, 0X39, + 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0XC7, 0X39, 0XC7, 0X39, + 0X86, 0X31, 0X86, 0X31, 0X04, 0X21, 0X41, 0X08, 0X82, 0X10, 0XCB, 0X5A, 0XBA, 0XD6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFB, 0XDE, 0XCB, 0X5A, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X08, 0X42, + 0X09, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X08, 0X42, 0XC7, 0X39, + 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X83, 0X18, 0X00, 0X00, 0XC8, 0X41, 0X38, 0XC6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X7D, 0XEF, 0X8E, 0X73, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X09, 0X4A, 0X8A, 0X52, + 0X30, 0X84, 0XCF, 0X7B, 0X8A, 0X52, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XCB, 0X5A, 0XCF, 0X7B, + 0X0C, 0X63, 0X08, 0X42, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X00, 0X00, 0X49, 0X4A, + 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF3, 0X9C, 0XC3, 0X18, 0X04, 0X21, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X72, 0X94, + 0X7D, 0XEF, 0X7D, 0XEF, 0XB2, 0X94, 0X4A, 0X52, 0X49, 0X4A, 0X8A, 0X52, 0X75, 0XAD, 0XBE, 0XF7, + 0XBA, 0XD6, 0X4D, 0X6B, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X41, 0X08, + 0XCF, 0X7B, 0X7C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0XD6, + 0X08, 0X42, 0X82, 0X10, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8E, 0X73, 0XFB, 0XDE, + 0XFF, 0XFF, 0XBE, 0XF7, 0XBA, 0XD6, 0X8E, 0X73, 0X08, 0X42, 0X30, 0X84, 0X3C, 0XE7, 0X7D, 0XEF, + 0XFF, 0XFF, 0XB6, 0XB5, 0X49, 0X4A, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, 0X41, 0X08, + 0X45, 0X29, 0XB6, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X71, 0X8C, + 0X41, 0X08, 0X45, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0XB2, 0X94, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0XB6, 0XB5, 0XF3, 0X9C, 0X0C, 0X63, + 0X38, 0XC6, 0XBA, 0XD6, 0X0C, 0X63, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, + 0X41, 0X08, 0X30, 0X84, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XCB, 0X5A, + 0X41, 0X08, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X52, 0X8A, 0X52, 0XF3, 0X9C, 0XFF, 0XFF, + 0X7D, 0XEF, 0XC7, 0X39, 0XC3, 0X18, 0X0C, 0X63, 0XCB, 0X5A, 0XB6, 0XB5, 0XB2, 0X94, 0XCB, 0X5A, + 0X75, 0XAD, 0XFA, 0XD6, 0X4D, 0X6B, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X41, 0X08, 0X8A, 0X52, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X86, 0X31, + 0X04, 0X21, 0XC8, 0X41, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XB1, 0X8C, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0X74, 0XA5, 0X7D, 0XEF, 0X7C, 0XE7, + 0XBE, 0XF7, 0X79, 0XCE, 0X0C, 0X63, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X45, 0X29, 0X75, 0XAD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X34, 0XA5, 0X82, 0X10, + 0X86, 0X31, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X49, 0X4A, 0X4D, 0X6B, 0XBA, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0X79, 0XCE, 0X0D, 0X63, 0XC7, 0X39, 0XCF, 0X7B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X75, 0XAD, 0X08, 0X42, 0X86, 0X31, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC3, 0X18, 0XC3, 0X18, 0XB2, 0X94, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XB2, 0X8C, 0X41, 0X08, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X8A, 0X52, 0X4A, 0X4A, 0XD0, 0X7B, + 0X7A, 0XC6, 0X7B, 0XBE, 0X90, 0X6B, 0XC9, 0X39, 0X88, 0X31, 0XC9, 0X39, 0XB3, 0X84, 0XBB, 0XC6, + 0XF8, 0XB5, 0XCC, 0X5A, 0X86, 0X31, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC4, 0X20, 0X41, 0X08, 0X30, 0X84, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0X8A, 0X4A, 0XC3, 0X10, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X4A, 0X4A, 0X42, 0X09, 0X3A, 0X08, 0X4A, + 0X09, 0X6B, 0X49, 0X7B, 0XC6, 0X7A, 0X05, 0X83, 0X46, 0X83, 0XC5, 0X7A, 0XC6, 0X72, 0X09, 0X7B, + 0X48, 0X5A, 0X87, 0X31, 0X88, 0X21, 0X88, 0X29, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0X04, 0X21, 0X41, 0X08, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC5, 0X82, 0X50, 0X05, 0X41, + 0XC7, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X42, 0X49, 0X4A, 0X09, 0X7B, 0X88, 0X9B, 0XC6, 0XB3, + 0X21, 0XD4, 0XA0, 0XDC, 0XE1, 0XE4, 0X61, 0XED, 0X61, 0XED, 0X21, 0XED, 0XA0, 0XE4, 0X20, 0XDC, + 0X80, 0XCB, 0X43, 0XAB, 0XC4, 0X82, 0X06, 0X5A, 0X47, 0X21, 0X46, 0X29, 0X45, 0X29, 0X04, 0X29, + 0X04, 0X19, 0X82, 0X10, 0X82, 0X18, 0XF3, 0X9C, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4D, 0X93, 0X00, 0XA0, 0X82, 0XB8, + 0XC7, 0X31, 0X09, 0X32, 0X49, 0X4A, 0X86, 0X7A, 0X43, 0XC3, 0X6B, 0XED, 0XF4, 0XF6, 0XEB, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XF4, 0XC1, 0XDB, 0X83, 0X9A, 0XC5, 0X49, 0X45, 0X29, 0X04, 0X19, + 0XC4, 0X20, 0X82, 0X38, 0X00, 0X50, 0XCB, 0X6A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XEE, 0X04, 0XA1, 0X00, 0XC0, 0X00, 0XF0, + 0XC3, 0XA0, 0XC8, 0X41, 0X49, 0X42, 0X05, 0X9B, 0X20, 0XFC, 0XA4, 0XFC, 0X69, 0XFD, 0XE8, 0XFD, + 0X63, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0XE0, 0XFC, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XFC, 0X20, 0XFC, 0X41, 0XD3, 0XC5, 0X49, 0X45, 0X19, 0XC4, 0X38, + 0X82, 0X68, 0X41, 0X88, 0X00, 0X70, 0X49, 0X5A, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XF6, 0X82, 0XC0, 0X00, 0XD0, 0X86, 0XC1, + 0X46, 0XF1, 0X41, 0XC8, 0X45, 0X79, 0X89, 0X52, 0X88, 0X62, 0X86, 0X6A, 0XC6, 0X7A, 0XC4, 0XBB, + 0XE1, 0XFC, 0X60, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XFC, + 0X60, 0XE4, 0X03, 0X93, 0X84, 0X72, 0X44, 0X6A, 0XC5, 0X41, 0X45, 0X29, 0XC3, 0X58, 0X41, 0XA8, + 0X40, 0X98, 0X00, 0XB0, 0X00, 0X60, 0X0C, 0X6B, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCE, 0X83, 0X82, 0X88, 0X00, 0XF8, 0XC4, 0XD8, + 0X0C, 0XF3, 0X8A, 0XFA, 0X82, 0XE8, 0X82, 0XB0, 0X45, 0X69, 0XC7, 0X51, 0X08, 0X42, 0X08, 0X3A, + 0X86, 0X5A, 0X83, 0X9B, 0XA2, 0XBC, 0X22, 0XCD, 0X21, 0XCD, 0XA1, 0XC4, 0X22, 0XB4, 0XC4, 0X7A, + 0X06, 0X3A, 0X86, 0X29, 0X45, 0X29, 0X05, 0X31, 0XC4, 0X50, 0X41, 0X90, 0X00, 0XC0, 0X00, 0XA8, + 0X00, 0XA0, 0X00, 0XA8, 0X00, 0X30, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X8E, 0X73, 0XC3, 0X18, 0X05, 0X39, 0X82, 0XA8, 0X00, 0XF8, + 0XC3, 0XF8, 0X4D, 0XFB, 0X4D, 0XFB, 0XC7, 0XF9, 0XC3, 0XF0, 0X82, 0XD8, 0XC3, 0XB0, 0X04, 0X81, + 0X45, 0X61, 0X46, 0X51, 0X86, 0X49, 0X86, 0X49, 0X46, 0X41, 0X45, 0X41, 0X45, 0X41, 0X45, 0X41, + 0X05, 0X49, 0X04, 0X61, 0X82, 0X90, 0X41, 0XB0, 0X00, 0XD0, 0X00, 0XC8, 0X00, 0XA8, 0X00, 0XA8, + 0X00, 0XB8, 0X41, 0X58, 0X82, 0X10, 0X82, 0X10, 0XB2, 0X94, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0XCF, 0X7B, 0X82, 0X10, 0X04, 0X21, 0X86, 0X29, 0X86, 0X41, 0X04, 0X99, + 0X40, 0XE8, 0X41, 0XF8, 0X86, 0XF9, 0XCB, 0XFA, 0X49, 0XFA, 0X82, 0XF8, 0X00, 0XF8, 0X00, 0XF0, + 0X00, 0XE8, 0X41, 0XD8, 0X41, 0XD0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC8, + 0X00, 0XD0, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XD0, 0X00, 0XB8, 0X00, 0XA8, 0X41, 0X88, + 0X82, 0X48, 0X82, 0X10, 0X82, 0X10, 0X00, 0X00, 0X45, 0X29, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XF3, 0X9C, 0X82, 0X10, 0XC3, 0X18, 0X45, 0X29, 0X86, 0X31, 0XC7, 0X31, 0X30, 0X7C, + 0XF3, 0XDC, 0X86, 0XE1, 0X00, 0XF0, 0X00, 0XF8, 0X41, 0XF8, 0X41, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XC8, 0X41, 0XA0, 0X8A, 0X9A, 0X0C, 0X63, + 0X04, 0X11, 0X82, 0X10, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X4D, 0X6B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFB, 0XDE, 0X08, 0X42, 0X42, 0X10, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X49, 0X4A, 0X38, 0XBE, + 0XFF, 0XFF, 0X38, 0XD6, 0X86, 0XA9, 0X00, 0XC8, 0X00, 0XE0, 0X00, 0XF0, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X00, 0XF0, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XD0, 0XC3, 0X98, 0X8A, 0X8A, 0XB2, 0XA4, 0XBA, 0XC6, 0XF7, 0XB5, + 0X08, 0X42, 0X41, 0X08, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X45, 0X29, 0XF7, 0XBD, 0XFF, 0XFF, + 0X71, 0X8C, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X0C, 0X63, 0X3C, 0XE7, + 0XFF, 0XFF, 0X79, 0XD6, 0X46, 0XB9, 0X00, 0XE0, 0X42, 0XC8, 0X82, 0XA8, 0X82, 0XB0, 0X41, 0XD8, + 0X82, 0XE8, 0X82, 0XF0, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XF0, 0X41, 0XE8, 0X41, 0XD8, + 0X04, 0XC1, 0X08, 0X92, 0X4D, 0X8B, 0X34, 0XA5, 0XFB, 0XC6, 0XFB, 0XD6, 0XBA, 0XCE, 0X3C, 0XE7, + 0X30, 0X84, 0XC3, 0X18, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X41, 0X08, 0XCF, 0X7B, 0X7D, 0XEF, + 0X49, 0X4A, 0X00, 0X00, 0X04, 0X21, 0X45, 0X29, 0X46, 0X31, 0X86, 0X31, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XF7, 0XF7, 0XDD, 0X09, 0XDA, 0X83, 0XF8, 0X01, 0XF0, 0X42, 0XC0, 0X82, 0X98, 0X49, 0X9A, + 0XF3, 0XB4, 0XF3, 0XCC, 0X71, 0XBC, 0X8E, 0XBB, 0X8E, 0XBB, 0X30, 0XBC, 0X71, 0XBC, 0XF3, 0XBC, + 0XB6, 0XBD, 0XFB, 0XCE, 0XBE, 0XE7, 0X7D, 0XE7, 0X3B, 0XDF, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, + 0X75, 0XAD, 0X86, 0X31, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X49, 0X4A, 0XFB, 0XDE, + 0X04, 0X21, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X45, 0X29, 0X87, 0X39, 0XB2, 0X94, 0XFF, 0XFF, + 0XBE, 0XF7, 0X34, 0XDD, 0X0C, 0XEB, 0X09, 0XFA, 0X00, 0XF0, 0X01, 0XD8, 0X00, 0XD8, 0X8B, 0XD2, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XFF, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0X78, 0XC6, 0XC7, 0X39, 0X00, 0X00, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X79, 0XCE, + 0X00, 0X00, 0X82, 0X10, 0XC3, 0X18, 0X04, 0X21, 0X05, 0X29, 0X86, 0X31, 0XB3, 0X9C, 0XFF, 0XFF, + 0XFF, 0XF7, 0X75, 0XDD, 0XC7, 0XE9, 0XC7, 0XF9, 0X01, 0XF8, 0X01, 0XF0, 0X00, 0XE8, 0X49, 0XE2, + 0XFB, 0XEE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0XB9, 0XCE, 0X08, 0X42, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X38, 0XC6, + 0X00, 0X00, 0X82, 0X10, 0X82, 0X10, 0X04, 0X21, 0X04, 0X21, 0X45, 0X29, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XFF, 0X38, 0XDE, 0XC4, 0XD0, 0X00, 0XF0, 0X01, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X08, 0XD2, + 0XFB, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XBA, 0XD6, + 0X79, 0XCE, 0XC7, 0X39, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X00, 0X00, 0X00, 0X00, 0XC3, 0X18, 0XCB, 0X5A, 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X7D, 0XEF, + 0XFF, 0XFF, 0X7D, 0XEF, 0XCF, 0XBB, 0XC3, 0XB0, 0X41, 0XD0, 0X41, 0XD0, 0X82, 0XB8, 0X4D, 0XB3, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XBE, 0XF7, 0X3D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFA, 0XD6, + 0XF7, 0XBD, 0X04, 0X21, 0X86, 0X31, 0X04, 0X21, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X75, 0XAD, 0XCF, 0X7B, 0X41, 0X08, 0X86, 0X31, 0XF7, 0XBD, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XEF, 0X74, 0XB5, 0X30, 0X9C, 0X30, 0X9C, 0X72, 0XA4, 0XBB, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0X3C, 0XE7, + 0X71, 0X8C, 0X81, 0X08, 0X0C, 0X63, 0XCF, 0X7B, 0X82, 0X10, 0X00, 0X00, 0X8A, 0X52, 0X38, 0XC6, + 0X75, 0XAD, 0X71, 0X8C, 0XB6, 0XB5, 0X3C, 0XE7, 0XFB, 0XDE, 0XC7, 0X39, 0X00, 0X00, 0XCF, 0X73, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X7D, 0XEF, 0X3B, 0XDF, 0XFA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFB, 0XDE, 0XB9, 0XCE, + 0XC7, 0X39, 0XC4, 0X20, 0X71, 0X8C, 0XBA, 0XD6, 0X71, 0X8C, 0XCB, 0X5A, 0XB2, 0X94, 0XBA, 0XD6, + 0XFF, 0XFF, 0X7D, 0XEF, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB6, 0XB5, 0X46, 0X29, 0X05, 0X19, + 0X75, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, 0XFC, 0XDE, 0X4E, 0X63, + 0X42, 0X08, 0X0C, 0X63, 0XF7, 0XBD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBE, 0XF7, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF4, 0X9C, 0X04, 0X21, + 0X05, 0X21, 0XB6, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, + 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, 0XBB, 0XD6, 0XD1, 0X73, 0X83, 0X18, + 0X86, 0X39, 0X34, 0X9D, 0XBD, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XFF, 0X35, 0XD6, 0XEB, 0XCC, 0X43, 0XB3, + 0X40, 0X51, 0X05, 0X19, 0XF5, 0X8C, 0XBE, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, + 0XFB, 0XDE, 0XBA, 0XDE, 0XBA, 0XD6, 0X3C, 0XDF, 0X3A, 0XBE, 0X4F, 0X63, 0X82, 0X49, 0X40, 0XA3, + 0X23, 0XB4, 0XCC, 0X83, 0X3A, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XF7, 0XB5, 0XBD, 0X82, 0X92, 0X20, 0XF4, 0XA0, 0XFC, + 0X60, 0XE4, 0X40, 0X82, 0X84, 0X41, 0X8F, 0X6B, 0X77, 0XAD, 0X3D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, + 0XFB, 0XDE, 0X3D, 0XE7, 0XBB, 0XCE, 0X36, 0X9D, 0X0B, 0X6B, 0X41, 0X6A, 0X60, 0XC4, 0X20, 0XFE, + 0X60, 0XF5, 0X00, 0X8B, 0XC7, 0X6A, 0X38, 0XC6, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4B, 0X7B, 0X80, 0XB2, 0XA0, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0XE0, 0XFC, 0XC0, 0XCB, 0XC1, 0X8A, 0X45, 0X62, 0X4D, 0X6B, 0XB3, 0X94, 0XF7, 0XBD, + 0X3D, 0XDF, 0XFF, 0XF7, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X7D, 0XE7, 0X3D, 0XDF, + 0XBA, 0XC6, 0X75, 0XA5, 0X8D, 0X7B, 0X84, 0X7A, 0X40, 0XB3, 0XE0, 0XEC, 0XE0, 0XFD, 0XE0, 0XFD, + 0X60, 0XF5, 0X20, 0XE5, 0XA0, 0XD4, 0X0A, 0X6B, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCC, 0X93, 0X40, 0XEB, 0X60, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0X20, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XD4, 0XC0, 0XBB, 0X42, 0X9B, 0X45, 0X8B, + 0X6B, 0X9C, 0XAE, 0X9C, 0X71, 0X8C, 0XB3, 0X94, 0X33, 0X9D, 0X34, 0XA5, 0XF2, 0XA4, 0XF0, 0XB4, + 0XCA, 0X9B, 0X04, 0X9B, 0X40, 0XBB, 0X20, 0XE4, 0X20, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0X20, 0XC4, 0X88, 0X5A, 0X38, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X78, 0XD6, 0X46, 0XAB, 0X40, 0XDB, 0X20, 0XF4, + 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0X60, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XDC, + 0XC0, 0XB3, 0XC0, 0X51, 0X86, 0X29, 0X0D, 0X63, 0X8F, 0X7B, 0X0D, 0X5B, 0XC7, 0X41, 0X01, 0X82, + 0X00, 0XC3, 0XC0, 0XE3, 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0XE0, 0XFC, 0X60, 0XF5, 0X60, 0XF5, + 0X20, 0XE5, 0X80, 0X9B, 0X86, 0X62, 0X30, 0X84, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X2D, 0X9C, 0X05, 0X93, + 0X43, 0XA3, 0X82, 0XB3, 0XC2, 0XBB, 0XC2, 0XBB, 0X22, 0XB4, 0X82, 0XA3, 0X42, 0X93, 0XC3, 0X7A, + 0X85, 0X62, 0X0B, 0X63, 0X71, 0X84, 0XB6, 0XB5, 0X79, 0XCE, 0X79, 0XC6, 0XB5, 0XAD, 0X70, 0X94, + 0X4A, 0X8B, 0X06, 0X83, 0X04, 0X93, 0X04, 0X9B, 0X43, 0X9B, 0X43, 0X9B, 0X43, 0X93, 0X04, 0X83, + 0X08, 0X73, 0X8D, 0X73, 0XB3, 0X94, 0X79, 0XCE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XDF, 0X38, 0XBE, + 0X75, 0XB5, 0X33, 0XA5, 0X33, 0XA5, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X94, 0XF3, 0X9C, + 0X35, 0XA5, 0XF8, 0XBD, 0XFB, 0XDE, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7E, 0XEF, + 0XBB, 0XD6, 0XF8, 0XBD, 0XB6, 0XAD, 0X75, 0XAD, 0X34, 0XA5, 0X33, 0X9D, 0X34, 0X9D, 0X35, 0XA5, + 0XB7, 0XAD, 0X79, 0XC6, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char PROGMEM icon_40x40[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0X71, 0X8C, 0X31, 0X84, 0X31, 0X84, + 0X93, 0XC5, 0X92, 0XCD, 0X91, 0XCD, 0X91, 0XD5, 0X91, 0XD5, 0X91, 0XCD, 0X72, 0XCD, 0X72, 0XC5, + 0X56, 0XDE, 0XBE, 0XFF, 0XDB, 0XDE, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X7B, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X5A, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0XE0, 0XD4, 0XA0, 0XD4, + 0X61, 0XA3, 0XA7, 0X39, 0XE5, 0X18, 0X05, 0X21, 0X92, 0X94, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XEE, 0XEB, 0X9B, 0XA1, 0X18, 0X23, 0X73, 0X81, 0XC5, 0X21, 0X9C, + 0X61, 0X39, 0X81, 0XEE, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XE0, 0XFE, 0X40, 0XFF, 0XC0, 0XF6, + 0XC0, 0X49, 0XA0, 0X18, 0X00, 0X42, 0X60, 0X18, 0X00, 0X00, 0X74, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X93, 0XCD, 0XC3, 0XBB, 0XA0, 0X51, 0XE1, 0X39, 0XC2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0X63, 0XBD, 0X61, 0XE6, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XC0, 0XFE, 0X60, 0XFF, 0X21, 0X73, + 0XE1, 0X28, 0X81, 0XEE, 0X61, 0XFF, 0X21, 0XEE, 0XA0, 0X41, 0X20, 0X08, 0X90, 0XCD, 0XDE, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, + 0X0B, 0XAC, 0XC0, 0XB3, 0XA1, 0XEE, 0XC3, 0X5A, 0X22, 0X8C, 0XE1, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0XC0, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XA1, 0XAC, + 0X21, 0XC5, 0X20, 0XFF, 0X60, 0XFE, 0X00, 0XFF, 0X02, 0XDE, 0XE0, 0X20, 0X40, 0X82, 0X49, 0XBC, + 0X3B, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, 0X67, 0X9B, + 0XE0, 0XB3, 0X81, 0XFF, 0XC3, 0XFF, 0X83, 0X9C, 0X82, 0XDE, 0XC0, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0XE0, 0XFE, 0XA2, 0XB4, 0X41, 0XBC, 0X20, 0XCC, + 0X87, 0XA3, 0XB8, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0XA8, 0XA3, 0X60, 0XBC, + 0XA2, 0XFF, 0XA5, 0XFF, 0X44, 0XFF, 0XA1, 0XFF, 0XA0, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X40, 0XFE, + 0XE0, 0XCB, 0XE3, 0X92, 0X7C, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X4C, 0XAC, 0XC0, 0XB3, 0XA4, 0XFF, + 0XA6, 0XFF, 0X45, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XE0, 0XC3, 0X2A, 0XAC, 0X7D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XD4, 0XD5, 0X40, 0XAB, 0X43, 0XFF, 0XA8, 0XFF, + 0X67, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XA2, 0X11, 0XBD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDA, 0XE6, 0XE4, 0X9A, 0XE1, 0XE5, 0XE8, 0XFF, 0X69, 0XFF, + 0X65, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XE0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XE4, 0X85, 0XAB, 0XFA, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X2B, 0XB4, 0XC0, 0XB3, 0XC8, 0XFF, 0X8C, 0XFF, 0X68, 0XFF, + 0X61, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0XA1, 0XDE, 0X61, 0XEF, + 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0XC0, 0XFF, 0X61, 0XDE, 0X00, 0XE6, 0X80, 0XFE, 0X40, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XC0, 0XC3, 0XE9, 0XAB, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0XA3, 0XAB, 0XA3, 0XF6, 0XCC, 0XFF, 0X4C, 0XFF, 0X64, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0X61, 0XEF, 0X22, 0X6B, 0X82, 0X5A, 0X82, 0XB5, + 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0XA0, 0XFF, 0XE1, 0XFF, 0X42, 0X8C, 0XC1, 0X41, 0X21, 0XA4, 0XA0, 0XFE, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X20, 0XF5, 0XC0, 0X9A, 0X35, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X51, 0XC5, 0X60, 0XBC, 0XC9, 0XFF, 0X8E, 0XFF, 0X6A, 0XFF, 0X61, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE1, 0XFF, 0XE1, 0X62, 0X80, 0X10, 0X05, 0XE7, 0XA4, 0XF7, + 0XE4, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XC1, 0XFF, 0XE2, 0X83, 0X40, 0X08, 0X22, 0XCE, 0X60, 0XF7, 0XA0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0XA0, 0XFD, 0XA0, 0XC3, 0XAC, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XDE, 0XFF, 0XA7, 0XAB, 0X81, 0XDD, 0XED, 0XFF, 0XB0, 0XFF, 0X69, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X61, 0XD6, 0X22, 0X29, 0XA6, 0X31, 0XE3, 0X7B, 0X46, 0XEF, + 0XE6, 0XFF, 0XE4, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X81, 0XD6, 0XA0, 0X18, 0XC4, 0X18, 0XA1, 0X62, 0XC1, 0XCD, 0X40, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0XA0, 0XEC, 0X48, 0XBC, 0XDF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF9, 0XE6, 0XE3, 0X9A, 0X67, 0XEE, 0XD1, 0XFF, 0XB0, 0XFF, 0X86, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X60, 0X94, 0X91, 0X73, 0XD9, 0XBD, 0X00, 0X00, 0X05, 0X84, + 0XE8, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XE9, 0X41, 0XB7, 0XB5, 0X01, 0X00, 0X60, 0X62, 0X21, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XE3, 0XBB, 0XD9, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XD3, 0XCD, 0X40, 0XA3, 0X2B, 0XF7, 0XD3, 0XFF, 0XB0, 0XFF, 0X63, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA0, 0X9C, 0X30, 0X6B, 0X97, 0XB5, 0X00, 0X00, 0X83, 0X52, + 0XC6, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XEA, 0X41, 0X77, 0XAD, 0X01, 0X00, 0XC0, 0X49, 0XE0, 0XF6, 0XA0, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0XA0, 0XBB, 0XD3, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X00, 0XB4, 0X8E, 0XFF, 0XF4, 0XFF, 0XB0, 0XFF, 0X42, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X25, 0X8C, + 0XE5, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0XE1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X61, 0X5A, 0X20, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0X00, 0XFE, 0XE0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XC0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XB0, 0XFF, 0XF5, 0XFF, 0X8F, 0XFF, 0X41, 0XFF, 0X80, 0XFF, + 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0X21, 0X8C, 0X60, 0X10, 0X43, 0X6B, 0X44, 0XEF, + 0XE2, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0XE1, 0XFF, 0XC1, 0XA4, 0XC2, 0X18, 0XA2, 0X39, 0XA1, 0XCD, 0X20, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XD2, 0XFF, 0XF7, 0XFF, 0XAF, 0XFF, 0X01, 0XFF, 0X00, 0XFF, + 0X00, 0XFF, 0X40, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XFF, 0X82, 0XD6, 0XC2, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0XC1, 0XFF, 0X82, 0XDE, 0XC2, 0XEE, 0X61, 0XFF, 0X80, 0XFE, 0XC0, 0XFD, 0X20, 0XFD, + 0XA1, 0XFC, 0X61, 0XFC, 0X61, 0XFC, 0XC0, 0XFC, 0X60, 0XFD, 0XE0, 0XCB, 0X51, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X60, 0XC4, 0XD4, 0XFF, 0XF9, 0XFF, 0X2D, 0XFF, 0X00, 0XFE, 0XC0, 0XFD, + 0XA1, 0XFD, 0X21, 0XFE, 0XE0, 0XFE, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0XA0, 0XFE, 0X20, 0XFE, 0X01, 0XFD, 0X01, 0XFC, + 0X62, 0XFB, 0X42, 0XFB, 0X82, 0XFB, 0X21, 0XFC, 0X20, 0XFD, 0X00, 0XD4, 0X71, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X20, 0XC4, 0XD4, 0XFF, 0XBA, 0XFF, 0X2E, 0XFE, 0XE1, 0XFC, 0X61, 0XFC, + 0X61, 0XFC, 0X01, 0XFD, 0X01, 0XFE, 0X20, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X80, 0XFD, 0X61, 0XFC, 0X62, 0XFB, + 0XA3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0XE0, 0XFC, 0XE0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0XC0, 0XB3, 0XB3, 0XFF, 0X7A, 0XFF, 0X91, 0XFD, 0X03, 0XFC, 0X02, 0XFB, + 0X22, 0XFB, 0X62, 0XFC, 0X81, 0XFD, 0XC0, 0XFE, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, 0X60, 0XFE, 0X60, 0XFD, 0X41, 0XFC, 0X62, 0XFB, + 0XC3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0X20, 0XFD, 0XC0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X14, 0XD6, 0X20, 0XAB, 0X51, 0XF7, 0XBE, 0XFF, 0X17, 0XFE, 0X65, 0XFC, 0X61, 0XFB, + 0XA2, 0XFB, 0XA1, 0XFC, 0XC1, 0XFD, 0X00, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0XC0, 0XFD, 0XC0, 0XFC, 0X41, 0XFC, + 0XC1, 0XFB, 0XA2, 0XFB, 0X01, 0XFC, 0XA0, 0XFC, 0X40, 0XFD, 0XA0, 0XC3, 0XF4, 0XD5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X5B, 0XEF, 0X24, 0X9B, 0X49, 0XE6, 0XB8, 0XFF, 0X92, 0XFE, 0X25, 0XFD, 0XA0, 0XFC, + 0X02, 0XFD, 0XE1, 0XFD, 0XE0, 0XFE, 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, + 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X80, 0XFD, 0X01, 0XF5, + 0X41, 0XFD, 0X01, 0XFD, 0XC0, 0XFC, 0X40, 0XFD, 0X00, 0XF5, 0XC4, 0XBB, 0XFA, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X2A, 0XB4, 0XA0, 0XD4, 0XA2, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, 0X00, 0XFE, + 0X80, 0XFE, 0X21, 0XEE, 0X41, 0XE6, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, + 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X40, 0XCC, + 0XE1, 0XAB, 0XC1, 0XED, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XE4, 0X29, 0XB4, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X15, 0XD6, 0XE0, 0XBB, 0X60, 0XFE, 0XC8, 0XFE, 0XC8, 0XFE, 0X02, 0XFF, + 0X60, 0XDD, 0X40, 0XA3, 0XA1, 0XDD, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, + 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X40, 0XED, + 0XC0, 0X9A, 0X40, 0XA3, 0X80, 0XF5, 0X60, 0XFD, 0X60, 0XBB, 0XEE, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X63, 0XAB, 0X42, 0XE5, 0XB4, 0XFF, 0X97, 0XFF, 0XAA, 0XF6, + 0X80, 0XAB, 0XA0, 0X92, 0XA1, 0XDD, 0X41, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, + 0XC0, 0XFE, 0X80, 0XFE, 0X61, 0XFE, 0X00, 0XFE, 0XA0, 0XED, 0X20, 0XE5, 0X21, 0XCC, 0X80, 0XB3, + 0X00, 0XBC, 0XE0, 0XC3, 0X40, 0XED, 0XC0, 0XEC, 0X60, 0X92, 0X97, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XC5, 0X00, 0XA3, 0XAA, 0XF6, 0X93, 0XFF, 0X2D, 0XEE, + 0X63, 0XDD, 0X80, 0XD5, 0X42, 0XB4, 0X82, 0XCC, 0X00, 0XCD, 0X40, 0XD5, 0XA0, 0XDD, 0XE1, 0XE5, + 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0X80, 0XDD, 0X60, 0XDD, 0X20, 0XD5, 0XC0, 0XCC, + 0XA0, 0XCC, 0X61, 0XC4, 0X21, 0XC4, 0X01, 0XBC, 0X01, 0XBC, 0XE0, 0XBB, 0XC0, 0XBB, 0X60, 0XD4, + 0X80, 0XFD, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XBB, 0X2B, 0XAC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0X87, 0XA3, 0X60, 0XD4, 0X0A, 0XFF, 0XCF, 0XFE, + 0XC9, 0XFE, 0XC0, 0XFE, 0XC0, 0XF6, 0X40, 0XE6, 0X41, 0XCD, 0X42, 0XB4, 0XC1, 0XAB, 0X60, 0XA3, + 0X60, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0XA0, 0XAB, 0XC1, 0XAB, 0XE1, 0XB3, 0X22, 0XB4, + 0X82, 0XC4, 0XC0, 0XCC, 0X00, 0XD5, 0X60, 0XE5, 0X81, 0XED, 0X80, 0XF5, 0X80, 0XFD, 0X80, 0XFD, + 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XE4, 0X85, 0XAB, 0X5C, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFA, 0XE6, 0X23, 0XA3, 0XE0, 0XE4, 0XE8, 0XFE, + 0X6A, 0XFE, 0X05, 0XFE, 0X40, 0XFE, 0XA0, 0XFE, 0XC0, 0XFE, 0XE1, 0XFE, 0XA0, 0XF6, 0XA0, 0XF6, + 0XA0, 0XF6, 0XA0, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X60, 0XF6, 0X61, 0XFE, 0X81, 0XFE, + 0X61, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, + 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XA2, 0XB4, 0XCD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X52, 0XC5, 0XE0, 0XA2, 0XA1, 0XF5, + 0X86, 0XFE, 0X06, 0XFE, 0XE2, 0XFD, 0XE0, 0XFD, 0X00, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, + 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, + 0XA0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, + 0X60, 0XFD, 0X60, 0XBB, 0X6C, 0XB4, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X92, 0XCD, 0XC0, 0XA2, + 0X20, 0XED, 0X22, 0XFE, 0XC1, 0XFD, 0XA0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X40, 0XFD, + 0X20, 0XB3, 0XEA, 0XA3, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8E, 0XBC, + 0XE1, 0XA2, 0X00, 0XE5, 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, + 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, + 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X80, 0XFD, 0X00, 0XF5, 0X40, 0XBB, + 0X2B, 0XAC, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X35, 0XD6, 0XE2, 0X9A, 0XA0, 0XC3, 0XA0, 0XFD, 0XE0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X00, 0XD4, 0XC1, 0X9A, 0X10, 0XC5, + 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X98, 0XDE, 0X2B, 0XAC, 0X40, 0XB3, 0X00, 0XD4, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XFD, + 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X40, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XDC, 0X80, 0XBB, 0XE8, 0XAB, 0X57, 0XDE, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X37, 0XD6, 0X86, 0XA3, 0XC0, 0X9A, 0XE0, 0XCB, 0X80, 0XEC, + 0XE0, 0XF4, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X00, 0XF5, + 0XA0, 0XEC, 0X00, 0XD4, 0X40, 0XB3, 0X03, 0X9B, 0X92, 0XC5, 0XBD, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XF5, 0XCD, 0XAD, 0XBC, 0X69, 0XBC, + 0X05, 0XBC, 0X03, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0XE2, 0XC3, 0X24, 0XC4, + 0X68, 0XBC, 0XAC, 0XBC, 0XD3, 0XCD, 0X9E, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5B, 0XEF, 0X98, 0XDE, 0X56, 0XD6, 0X57, 0XD6, 0X57, 0XD6, 0X56, 0XD6, 0X77, 0XDE, 0X1B, 0XEF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char PROGMEM wifi_full[2048] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x21, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0xA0, 0xCB, 0x23, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xC3, 0x03, 0x18, 0x60, 0x00, 0x00, + 0x08, 0x20, 0xD3, 0x23, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xC3, 0x03, 0x00, 0x00, + 0x59, 0x61, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x41, 0x01, + 0x8A, 0x22, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0x89, 0xFE, 0x34, 0xFE, 0xB7, 0xFF, 0x19, 0xFF, 0x3A, 0xFF, 0x3A, 0xFE, 0xD8, + 0xFE, 0x76, 0xF5, 0xD1, 0xF5, 0x0C, 0xEB, 0xE6, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xF5, 0x90, 0xEC, 0x06, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x54, + 0xF4, 0x47, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xBD, 0xFF, 0x7C, 0xFF, 0x7C, 0xFF, 0x9D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF6, 0x13, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xF4, 0x47, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xC4, 0xF4, 0x48, 0xF5, 0x2E, 0xFE, 0x55, 0xFF, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xF5, 0x0C, 0xFE, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xB1, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x27, 0xF4, 0xCB, 0xF5, 0x0C, 0xF5, 0x0C, + 0xF4, 0xAB, 0xF4, 0x27, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0xEC, + 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x34, 0xEB, 0xC4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xFE, 0x76, 0xF4, 0xEC, 0xEB, 0xC4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xC5, 0xFE, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x55, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF6, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xF5, 0x6F, 0xEB, 0xC4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xF2, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x69, 0xF5, 0x0C, 0xF4, 0xAA, 0xF4, 0x89, + 0xF4, 0xCB, 0xF5, 0x6F, 0xFE, 0x55, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, + 0xF4, 0x48, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF5, 0x0D, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xF4, 0xEC, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDE, 0xF5, 0x0D, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBE, 0xF4, 0x27, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xDE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4E, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xB7, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xFF, 0x3A, 0xFF, 0x9D, + 0xFF, 0x9C, 0xFF, 0x19, 0xF6, 0x13, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x48, + 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xEB, 0xC5, 0xFF, 0x7C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xD8, 0xFF, 0x19, + 0xFF, 0x19, 0xFF, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, + 0xF4, 0x47, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xBE, 0xF4, 0x47, 0xEB, 0xA4, 0xF4, 0xEC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x27, 0xF5, 0xD1, 0xFF, 0xBD, 0xFF, 0xFF, 0xF5, 0xD2, 0xEB, 0xA4, + 0xEB, 0xA4, 0xF4, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD8, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xCB, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEC, 0x06, 0xFE, 0xB7, 0xFF, 0xFF, 0xFE, 0x34, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF6, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xF5, 0x0C, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x55, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xF4, 0x27, 0xF5, 0x4E, 0xF5, 0x2D, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xC4, 0xFE, 0x96, 0xFF, 0xFF, + 0xF5, 0x6F, 0xEB, 0xA4, 0xEB, 0xE5, 0xFF, 0xBE, 0xFF, 0xFF, 0xFE, 0xF9, 0xEB, 0xA4, 0xEB, 0xC4, + 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xEB, 0xC5, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0xEC, + 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xEC, 0x48, 0xEB, 0x84, 0xEB, 0xC5, 0xFF, 0x5B, + 0xFF, 0xDE, 0xEC, 0x07, 0xE3, 0x84, 0xF5, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x28, 0xE3, 0x84, + 0xF6, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xAB, 0xE3, 0x64, 0xE3, 0x64, 0x79, 0xE2, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0xC5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x98, 0xB2, 0x84, 0xB2, 0x84, 0xC4, 0x0C, + 0xFF, 0xFF, 0xDD, 0x93, 0xB2, 0x84, 0xBB, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x11, 0xB2, 0x84, + 0xCC, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x32, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xC3, 0x8A, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xF7, 0x3B, 0xFF, 0x9D, 0xB2, 0x85, 0xB2, 0x84, 0xF7, 0x5C, 0xEE, 0xFA, 0xD4, 0xD0, 0xB2, 0x84, + 0xB2, 0xE6, 0xDD, 0x93, 0xCC, 0x6E, 0xBB, 0x68, 0xB2, 0x85, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xBB, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x5C, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xDD, 0x52, 0xEE, 0xD9, 0xBB, 0x07, 0xB2, 0x84, 0xB2, 0x85, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xA2, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xE5, 0xD5, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xAF, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0x9A, 0x43, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0xA5, + 0xD4, 0xF0, 0xEE, 0x99, 0xEE, 0x78, 0xCC, 0x4D, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x79, 0xC3, + 0x81, 0xE3, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x59, 0x42, + 0x79, 0xC3, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x59, 0x42, + 0x51, 0x42, 0x79, 0xC3, 0x79, 0xC3, 0x9A, 0x23, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0x92, 0x23, 0x79, 0xC3, 0x79, 0xC3, 0x38, 0xE1, +}; diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/graphictest_opensmart.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/graphictest_opensmart.ino new file mode 100644 index 0000000..a10660b --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/graphictest_opensmart.ino @@ -0,0 +1,586 @@ +// All the mcufriend.com UNO shields have the same pinout. +// i.e. control pins A0-A4. Data D2-D9. microSD D10-D13. +// Touchscreens are normally A1, A2, D7, D6 but the order varies +// +// This demo should work with most Adafruit TFT libraries +// If you are not using a shield, use a full Adafruit constructor() +// e.g. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +#define LCD_CS A3 // Chip Select goes to Analog 3 +#define LCD_CD A2 // Command/Data goes to Analog 2 +#define LCD_WR A1 // LCD Write goes to Analog 1 +#define LCD_RD A0 // LCD Read goes to Analog 0 +#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin + +#include // f.k. for Arduino-1.5.2 +#include "Adafruit_GFX.h"// Hardware-specific library +#include +OPENSMART_kbv tft; +//#include +//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +void setup(void); +void loop(void); +unsigned long testFillScreen(); +unsigned long testText(); +unsigned long testLines(uint16_t color); +unsigned long testFastLines(uint16_t color1, uint16_t color2); +unsigned long testRects(uint16_t color); +unsigned long testFilledRects(uint16_t color1, uint16_t color2); +unsigned long testFilledCircles(uint8_t radius, uint16_t color); +unsigned long testCircles(uint8_t radius, uint16_t color); +unsigned long testTriangles(); +unsigned long testFilledTriangles(); +unsigned long testRoundRects(); +unsigned long testFilledRoundRects(); +void progmemPrint(const char *str); +void progmemPrintln(const char *str); + +void runtests(void); + +uint16_t g_identifier; + +extern const uint8_t hanzi[]; +void showhanzi(unsigned int x, unsigned int y, unsigned char index) +{ + uint8_t i, j, c, first = 1; + uint8_t *temp = (uint8_t*)hanzi; + uint16_t color; + tft.setAddrWindow(x, y, x + 31, y + 31); //设置区域 + temp += index * 128; + for (j = 0; j < 128; j++) + { + c = pgm_read_byte(temp); + for (i = 0; i < 8; i++) + { + if ((c & (1 << i)) != 0) + { + color = RED; + } + else + { + color = BLACK; + } + tft.pushColors(&color, 1, first); + first = 0; + } + temp++; + } +} + +void setup(void) { + Serial.begin(9600); + uint32_t when = millis(); + // while (!Serial) ; //hangs a Leonardo until you connect a Serial + if (!Serial) delay(5000); //allow some time for Leonardo + Serial.println("Serial took " + String((millis() - when)) + "ms to start"); + // tft.reset(); //hardware reset + uint16_t ID = tft.readID(); // + Serial.print("ID = 0x"); + Serial.println(ID, HEX); + if (ID == 0xD3D3) ID = 0x9481; // write-only shield +// ID = 0x9329; // force ID + tft.begin(ID); +} + +#if defined(MCUFRIEND_KBV_H_) +uint16_t scrollbuf[320]; // my biggest screen is 320x480 +#define READGRAM(x, y, buf, w, h) tft.readGRAM(x, y, buf, w, h) +#else +uint16_t scrollbuf[320]; // Adafruit only does 240x320 +// Adafruit can read a block by one pixel at a time +int16_t READGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h) +{ + uint16_t *p; + for (int row = 0; row < h; row++) { + p = block + row * w; + for (int col = 0; col < w; col++) { + *p++ = tft.readPixel(x + col, y + row); + } + } +} +#endif + +void windowScroll(int16_t x, int16_t y, int16_t wid, int16_t ht, int16_t dx, int16_t dy, uint16_t *buf) +{ + if (dx) for (int16_t row = 0; row < ht; row++) { + READGRAM(x, y + row, buf, wid, 1); + tft.setAddrWindow(x, y + row, x + wid - 1, y + row); + tft.pushColors(buf + dx, wid - dx, 1); + tft.pushColors(buf + 0, dx, 0); + } + if (dy) for (int16_t col = 0; col < wid; col++) { + READGRAM(x + col, y, buf, 1, ht); + tft.setAddrWindow(x + col, y, x + col, y + ht - 1); + tft.pushColors(buf + dy, ht - dy, 1); + tft.pushColors(buf + 0, dy, 0); + } +} + +void printmsg(int row, const char *msg) +{ + tft.setTextColor(YELLOW, BLACK); + tft.setCursor(0, row); + tft.println(msg); +} + +void loop(void) { + uint8_t aspect; + uint16_t pixel; + const char *aspectname[] = { + "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" + }; + const char *colorname[] = { "BLUE", "GREEN", "RED", "GRAY" }; + uint16_t colormask[] = { 0x001F, 0x07E0, 0xF800, 0xFFFF }; + uint16_t dx, rgb, n, wid, ht, msglin; + tft.setRotation(0); + runtests(); + delay(2000); + if (tft.height() > 64) { + for (uint8_t cnt = 0; cnt < 4; cnt++) { + aspect = (cnt + 0) & 3; + tft.setRotation(aspect); + wid = tft.width(); + ht = tft.height(); + msglin = (ht > 160) ? 200 : 112; + testText(); + dx = wid / 32; + for (n = 0; n < 32; n++) { + rgb = n * 8; + rgb = tft.color565(rgb, rgb, rgb); + tft.fillRect(n * dx, 48, dx, 63, rgb & colormask[aspect]); + } + tft.drawRect(0, 48 + 63, wid, 1, WHITE); + tft.setTextSize(2); + tft.setTextColor(colormask[aspect], BLACK); + tft.setCursor(0, 72); + tft.print(colorname[aspect]); + tft.setTextColor(WHITE); + tft.println(" COLOR GRADES"); + tft.setTextColor(WHITE, BLACK); + printmsg(184, aspectname[aspect]); + delay(1000); + tft.drawPixel(0, 0, YELLOW); + pixel = tft.readPixel(0, 0); + tft.setTextSize((ht > 160) ? 2 : 1); //for messages +#if defined(MCUFRIEND_KBV_H_) +#if 1 + extern const uint8_t penguin[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 1 - 40, 20 + 39); + tft.pushColors(penguin, 1600, 1); +#elif 1 + extern const uint8_t wifi_full[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 40 - 40 + 31, 20 + 31); + tft.pushColors(wifi_full, 1024, 1, true); +#elif 1 + extern const uint8_t icon_40x40[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 1 - 40, 20 + 39); + tft.pushColors(icon_40x40, 1600, 1); +#endif + tft.setAddrWindow(0, 0, wid - 1, ht - 1); + if (aspect & 1) tft.drawRect(wid - 1, 0, 1, ht, WHITE); + else tft.drawRect(0, ht - 1, wid, 1, WHITE); + printmsg(msglin, "VERTICAL SCROLL UP"); + uint16_t maxscroll; + if (tft.getRotation() & 1) maxscroll = wid; + else maxscroll = ht; + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, i); + delay(10); + } + delay(1000); + printmsg(msglin, "VERTICAL SCROLL DN"); + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, 0 - (int16_t)i); + delay(10); + } + tft.vertScroll(0, maxscroll, 0); + printmsg(msglin, "SCROLL DISABLED "); + + delay(1000); + if ((aspect & 1) == 0) { //Portrait + tft.setTextColor(BLUE, BLACK); + printmsg(msglin, "ONLY THE COLOR BAND"); + for (uint16_t i = 1; i <= 64; i++) { + tft.vertScroll(48, 64, i); + delay(20); + } + delay(1000); + } +#endif + tft.setTextColor(YELLOW, BLACK); + if (pixel == YELLOW) { + printmsg(msglin, "SOFTWARE SCROLL "); +#if 0 + // diagonal scroll of block + for (int16_t i = 45, dx = 2, dy = 1; i > 0; i -= dx) { + windowScroll(24, 8, 90, 40, dx, dy, scrollbuf); + } +#else + // plain horizontal scroll of block + n = (wid > 320) ? 320 : wid; + for (int16_t i = n, dx = 4, dy = 0; i > 0; i -= dx) { + windowScroll(0, 200, n, 16, dx, dy, scrollbuf); + } +#endif + } + else if (pixel == CYAN) + tft.println("readPixel() reads as BGR"); + else if ((pixel & 0xF8F8) == 0xF8F8) + tft.println("readPixel() should be 24-bit"); + else { + tft.print("readPixel() reads 0x"); + tft.println(pixel, HEX); + } + delay(5000); + } + } + printmsg(msglin, "INVERT DISPLAY "); + tft.invertDisplay(true); + delay(2000); + tft.invertDisplay(false); +} + +typedef struct { + PGM_P msg; + uint32_t ms; +} TEST; +TEST result[12]; + +#define RUNTEST(n, str, test) { result[n].msg = PSTR(str); result[n].ms = test; delay(500); } + +void runtests(void) +{ + uint8_t i, len = 24, cnt; + uint32_t total; + RUNTEST(0, "FillScreen ", testFillScreen()); + RUNTEST(1, "Text ", testText()); + RUNTEST(2, "Lines ", testLines(CYAN)); + RUNTEST(3, "Horiz/Vert Lines ", testFastLines(RED, BLUE)); + RUNTEST(4, "Rectangles (outline) ", testRects(GREEN)); + RUNTEST(5, "Rectangles (filled) ", testFilledRects(YELLOW, MAGENTA)); + RUNTEST(6, "Circles (filled) ", testFilledCircles(10, MAGENTA)); + RUNTEST(7, "Circles (outline) ", testCircles(10, WHITE)); + RUNTEST(8, "Triangles (outline) ", testTriangles()); + RUNTEST(9, "Triangles (filled) ", testFilledTriangles()); + RUNTEST(10, "Rounded rects (outline) ", testRoundRects()); + RUNTEST(11, "Rounded rects (filled) ", testFilledRoundRects()); + + tft.fillScreen(BLACK); + tft.setTextColor(GREEN); + tft.setCursor(0, 0); + uint16_t wid = tft.width(); + if (wid > 176) { + tft.setTextSize(2); +#if defined(MCUFRIEND_KBV_H_) + tft.print("MCUFRIEND "); +#if MCUFRIEND_KBV_H_ != 0 + tft.print(0.01 * MCUFRIEND_KBV_H_, 2); +#else + tft.print("for"); +#endif + tft.println(" UNO"); +#else + tft.println("Adafruit-Style Tests"); +#endif + } else len = wid / 6 - 8; + tft.setTextSize(1); + total = 0; + for (i = 0; i < 12; i++) { + PGM_P str = result[i].msg; + char c; + if (len > 24) { + if (i < 10) tft.print(" "); + tft.print(i); + tft.print(": "); + } + uint8_t cnt = len; + while ((c = pgm_read_byte(str++)) && cnt--) tft.print(c); + tft.print(" "); + tft.println(result[i].ms); + total += result[i].ms; + } + tft.setTextSize(2); + tft.print("Total:"); + tft.print(0.000001 * total); + tft.println("sec"); + g_identifier = tft.readID(); + tft.print("ID: 0x"); + tft.println(tft.readID(), HEX); +// tft.print("Reg(00):0x"); +// tft.println(tft.readReg(0x00), HEX); + tft.print("F_CPU:"); + tft.print(0.000001 * F_CPU); +#if defined(__OPTIMIZE_SIZE__) + tft.println("MHz -Os"); +#else + tft.println("MHz"); +#endif + + delay(10000); +} + +// Standard Adafruit tests. will adjust to screen size + +unsigned long testFillScreen() { + unsigned long start = micros(); + tft.fillScreen(BLACK); + tft.fillScreen(RED); + tft.fillScreen(GREEN); + tft.fillScreen(BLUE); + tft.fillScreen(BLACK); + return micros() - start; +} + +unsigned long testText() { + unsigned long start; + tft.fillScreen(BLACK); + start = micros(); + tft.setCursor(0, 0); + tft.setTextColor(WHITE); tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(YELLOW); tft.setTextSize(2); + tft.println(123.45); + tft.setTextColor(RED); tft.setTextSize(3); + tft.println(0xDEADBEEF, HEX); + tft.println(); + tft.setTextColor(GREEN); + tft.setTextSize(5); + tft.println("Groop"); + tft.setTextSize(2); + tft.println("I implore thee,"); + tft.setTextSize(1); + tft.println("my foonting turlingdromes."); + tft.println("And hooptiously drangle me"); + tft.println("with crinkly bindlewurdles,"); + tft.println("Or I will rend thee"); + tft.println("in the gobberwarts"); + tft.println("with my blurglecruncheon,"); + tft.println("see if I don't!"); + return micros() - start; +} + +unsigned long testLines(uint16_t color) { + unsigned long start, t; + int x1, y1, x2, y2, + w = tft.width(), + h = tft.height(); + + tft.fillScreen(BLACK); + + x1 = y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t = micros() - start; // fillScreen doesn't count against timing + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = 0; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + + return micros() - start; +} + +unsigned long testFastLines(uint16_t color1, uint16_t color2) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(); + + tft.fillScreen(BLACK); + start = micros(); + for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1); + for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2); + + return micros() - start; +} + +unsigned long testRects(uint16_t color) { + unsigned long start; + int n, i, i2, + cx = tft.width() / 2, + cy = tft.height() / 2; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + start = micros(); + for (i = 2; i < n; i += 6) { + i2 = i / 2; + tft.drawRect(cx - i2, cy - i2, i, i, color); + } + + return micros() - start; +} + +unsigned long testFilledRects(uint16_t color1, uint16_t color2) { + unsigned long start, t = 0; + int n, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + for (i = n; i > 0; i -= 6) { + i2 = i / 2; + start = micros(); + tft.fillRect(cx - i2, cy - i2, i, i, color1); + t += micros() - start; + // Outlines are not included in timing results + tft.drawRect(cx - i2, cy - i2, i, i, color2); + } + + return t; +} + +unsigned long testFilledCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; + + tft.fillScreen(BLACK); + start = micros(); + for (x = radius; x < w; x += r2) { + for (y = radius; y < h; y += r2) { + tft.fillCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, r2 = radius * 2, + w = tft.width() + radius, + h = tft.height() + radius; + + // Screen is not cleared for this one -- this is + // intentional and does not affect the reported time. + start = micros(); + for (x = 0; x < w; x += r2) { + for (y = 0; y < h; y += r2) { + tft.drawCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testTriangles() { + unsigned long start; + int n, i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(cx, cy); + start = micros(); + for (i = 0; i < n; i += 5) { + tft.drawTriangle( + cx , cy - i, // peak + cx - i, cy + i, // bottom left + cx + i, cy + i, // bottom right + tft.color565(0, 0, i)); + } + + return micros() - start; +} + +unsigned long testFilledTriangles() { + unsigned long start, t = 0; + int i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + for (i = min(cx, cy); i > 10; i -= 5) { + start = micros(); + tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(0, i, i)); + t += micros() - start; + tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(i, i, 0)); + } + + return t; +} + +unsigned long testRoundRects() { + unsigned long start; + int w, i, i2, red, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + w = min(tft.width(), tft.height()); + start = micros(); + red = 0; + step = (256 * 6) / w; + for (i = 0; i < w; i += 6) { + i2 = i / 2; + red += step; + tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(red, 0, 0)); + } + + return micros() - start; +} + +unsigned long testFilledRoundRects() { + unsigned long start; + int i, i2, green, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + green = 256; + step = (256 * 6) / min(tft.width(), tft.height()); + for (i = min(tft.width(), tft.height()); i > 20; i -= 6) { + i2 = i / 2; + green -= step; + tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, green, 0)); + } + + return micros() - start; +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/icons.c b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/icons.c new file mode 100644 index 0000000..d973df6 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_opensmart/icons.c @@ -0,0 +1,542 @@ +#if defined(__arm__) || defined(ESP8266) || defined(ESP32) +#define PROGMEM +#else +#include +#endif + +const unsigned char PROGMEM penguin[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, + 0XBA, 0XD6, 0XB6, 0XB5, 0XF3, 0X9C, 0XB2, 0X94, 0XB3, 0X9C, 0XB2, 0X94, 0X34, 0XA5, 0XF7, 0XBD, + 0XFB, 0XDE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XFB, 0XDE, 0XF3, 0X9C, 0XCB, 0X5A, + 0XC7, 0X39, 0X04, 0X21, 0X82, 0X10, 0X42, 0X10, 0X42, 0X10, 0X41, 0X08, 0X83, 0X18, 0X45, 0X29, + 0XC7, 0X39, 0X0C, 0X63, 0X75, 0XAD, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XB2, 0X94, 0X08, 0X42, 0XC3, 0X18, 0X82, 0X10, + 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X41, 0X08, 0XC3, 0X18, 0X08, 0X42, 0XF3, 0X9C, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XDE, 0X0C, 0X63, 0XC3, 0X18, 0XC3, 0X18, 0X45, 0X29, 0XC7, 0X39, + 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0XC7, 0X39, 0XC7, 0X39, + 0X86, 0X31, 0X86, 0X31, 0X04, 0X21, 0X41, 0X08, 0X82, 0X10, 0XCB, 0X5A, 0XBA, 0XD6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFB, 0XDE, 0XCB, 0X5A, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X08, 0X42, + 0X09, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X08, 0X42, 0XC7, 0X39, + 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X83, 0X18, 0X00, 0X00, 0XC8, 0X41, 0X38, 0XC6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X7D, 0XEF, 0X8E, 0X73, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X09, 0X4A, 0X8A, 0X52, + 0X30, 0X84, 0XCF, 0X7B, 0X8A, 0X52, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XCB, 0X5A, 0XCF, 0X7B, + 0X0C, 0X63, 0X08, 0X42, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X00, 0X00, 0X49, 0X4A, + 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF3, 0X9C, 0XC3, 0X18, 0X04, 0X21, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X72, 0X94, + 0X7D, 0XEF, 0X7D, 0XEF, 0XB2, 0X94, 0X4A, 0X52, 0X49, 0X4A, 0X8A, 0X52, 0X75, 0XAD, 0XBE, 0XF7, + 0XBA, 0XD6, 0X4D, 0X6B, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X41, 0X08, + 0XCF, 0X7B, 0X7C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0XD6, + 0X08, 0X42, 0X82, 0X10, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8E, 0X73, 0XFB, 0XDE, + 0XFF, 0XFF, 0XBE, 0XF7, 0XBA, 0XD6, 0X8E, 0X73, 0X08, 0X42, 0X30, 0X84, 0X3C, 0XE7, 0X7D, 0XEF, + 0XFF, 0XFF, 0XB6, 0XB5, 0X49, 0X4A, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, 0X41, 0X08, + 0X45, 0X29, 0XB6, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X71, 0X8C, + 0X41, 0X08, 0X45, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0XB2, 0X94, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0XB6, 0XB5, 0XF3, 0X9C, 0X0C, 0X63, + 0X38, 0XC6, 0XBA, 0XD6, 0X0C, 0X63, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, + 0X41, 0X08, 0X30, 0X84, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XCB, 0X5A, + 0X41, 0X08, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X52, 0X8A, 0X52, 0XF3, 0X9C, 0XFF, 0XFF, + 0X7D, 0XEF, 0XC7, 0X39, 0XC3, 0X18, 0X0C, 0X63, 0XCB, 0X5A, 0XB6, 0XB5, 0XB2, 0X94, 0XCB, 0X5A, + 0X75, 0XAD, 0XFA, 0XD6, 0X4D, 0X6B, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X41, 0X08, 0X8A, 0X52, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X86, 0X31, + 0X04, 0X21, 0XC8, 0X41, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XB1, 0X8C, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0X74, 0XA5, 0X7D, 0XEF, 0X7C, 0XE7, + 0XBE, 0XF7, 0X79, 0XCE, 0X0C, 0X63, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X45, 0X29, 0X75, 0XAD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X34, 0XA5, 0X82, 0X10, + 0X86, 0X31, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X49, 0X4A, 0X4D, 0X6B, 0XBA, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0X79, 0XCE, 0X0D, 0X63, 0XC7, 0X39, 0XCF, 0X7B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X75, 0XAD, 0X08, 0X42, 0X86, 0X31, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC3, 0X18, 0XC3, 0X18, 0XB2, 0X94, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XB2, 0X8C, 0X41, 0X08, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X8A, 0X52, 0X4A, 0X4A, 0XD0, 0X7B, + 0X7A, 0XC6, 0X7B, 0XBE, 0X90, 0X6B, 0XC9, 0X39, 0X88, 0X31, 0XC9, 0X39, 0XB3, 0X84, 0XBB, 0XC6, + 0XF8, 0XB5, 0XCC, 0X5A, 0X86, 0X31, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC4, 0X20, 0X41, 0X08, 0X30, 0X84, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0X8A, 0X4A, 0XC3, 0X10, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X4A, 0X4A, 0X42, 0X09, 0X3A, 0X08, 0X4A, + 0X09, 0X6B, 0X49, 0X7B, 0XC6, 0X7A, 0X05, 0X83, 0X46, 0X83, 0XC5, 0X7A, 0XC6, 0X72, 0X09, 0X7B, + 0X48, 0X5A, 0X87, 0X31, 0X88, 0X21, 0X88, 0X29, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0X04, 0X21, 0X41, 0X08, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC5, 0X82, 0X50, 0X05, 0X41, + 0XC7, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X42, 0X49, 0X4A, 0X09, 0X7B, 0X88, 0X9B, 0XC6, 0XB3, + 0X21, 0XD4, 0XA0, 0XDC, 0XE1, 0XE4, 0X61, 0XED, 0X61, 0XED, 0X21, 0XED, 0XA0, 0XE4, 0X20, 0XDC, + 0X80, 0XCB, 0X43, 0XAB, 0XC4, 0X82, 0X06, 0X5A, 0X47, 0X21, 0X46, 0X29, 0X45, 0X29, 0X04, 0X29, + 0X04, 0X19, 0X82, 0X10, 0X82, 0X18, 0XF3, 0X9C, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4D, 0X93, 0X00, 0XA0, 0X82, 0XB8, + 0XC7, 0X31, 0X09, 0X32, 0X49, 0X4A, 0X86, 0X7A, 0X43, 0XC3, 0X6B, 0XED, 0XF4, 0XF6, 0XEB, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XF4, 0XC1, 0XDB, 0X83, 0X9A, 0XC5, 0X49, 0X45, 0X29, 0X04, 0X19, + 0XC4, 0X20, 0X82, 0X38, 0X00, 0X50, 0XCB, 0X6A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XEE, 0X04, 0XA1, 0X00, 0XC0, 0X00, 0XF0, + 0XC3, 0XA0, 0XC8, 0X41, 0X49, 0X42, 0X05, 0X9B, 0X20, 0XFC, 0XA4, 0XFC, 0X69, 0XFD, 0XE8, 0XFD, + 0X63, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0XE0, 0XFC, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XFC, 0X20, 0XFC, 0X41, 0XD3, 0XC5, 0X49, 0X45, 0X19, 0XC4, 0X38, + 0X82, 0X68, 0X41, 0X88, 0X00, 0X70, 0X49, 0X5A, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XF6, 0X82, 0XC0, 0X00, 0XD0, 0X86, 0XC1, + 0X46, 0XF1, 0X41, 0XC8, 0X45, 0X79, 0X89, 0X52, 0X88, 0X62, 0X86, 0X6A, 0XC6, 0X7A, 0XC4, 0XBB, + 0XE1, 0XFC, 0X60, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XFC, + 0X60, 0XE4, 0X03, 0X93, 0X84, 0X72, 0X44, 0X6A, 0XC5, 0X41, 0X45, 0X29, 0XC3, 0X58, 0X41, 0XA8, + 0X40, 0X98, 0X00, 0XB0, 0X00, 0X60, 0X0C, 0X6B, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCE, 0X83, 0X82, 0X88, 0X00, 0XF8, 0XC4, 0XD8, + 0X0C, 0XF3, 0X8A, 0XFA, 0X82, 0XE8, 0X82, 0XB0, 0X45, 0X69, 0XC7, 0X51, 0X08, 0X42, 0X08, 0X3A, + 0X86, 0X5A, 0X83, 0X9B, 0XA2, 0XBC, 0X22, 0XCD, 0X21, 0XCD, 0XA1, 0XC4, 0X22, 0XB4, 0XC4, 0X7A, + 0X06, 0X3A, 0X86, 0X29, 0X45, 0X29, 0X05, 0X31, 0XC4, 0X50, 0X41, 0X90, 0X00, 0XC0, 0X00, 0XA8, + 0X00, 0XA0, 0X00, 0XA8, 0X00, 0X30, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X8E, 0X73, 0XC3, 0X18, 0X05, 0X39, 0X82, 0XA8, 0X00, 0XF8, + 0XC3, 0XF8, 0X4D, 0XFB, 0X4D, 0XFB, 0XC7, 0XF9, 0XC3, 0XF0, 0X82, 0XD8, 0XC3, 0XB0, 0X04, 0X81, + 0X45, 0X61, 0X46, 0X51, 0X86, 0X49, 0X86, 0X49, 0X46, 0X41, 0X45, 0X41, 0X45, 0X41, 0X45, 0X41, + 0X05, 0X49, 0X04, 0X61, 0X82, 0X90, 0X41, 0XB0, 0X00, 0XD0, 0X00, 0XC8, 0X00, 0XA8, 0X00, 0XA8, + 0X00, 0XB8, 0X41, 0X58, 0X82, 0X10, 0X82, 0X10, 0XB2, 0X94, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0XCF, 0X7B, 0X82, 0X10, 0X04, 0X21, 0X86, 0X29, 0X86, 0X41, 0X04, 0X99, + 0X40, 0XE8, 0X41, 0XF8, 0X86, 0XF9, 0XCB, 0XFA, 0X49, 0XFA, 0X82, 0XF8, 0X00, 0XF8, 0X00, 0XF0, + 0X00, 0XE8, 0X41, 0XD8, 0X41, 0XD0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC8, + 0X00, 0XD0, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XD0, 0X00, 0XB8, 0X00, 0XA8, 0X41, 0X88, + 0X82, 0X48, 0X82, 0X10, 0X82, 0X10, 0X00, 0X00, 0X45, 0X29, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XF3, 0X9C, 0X82, 0X10, 0XC3, 0X18, 0X45, 0X29, 0X86, 0X31, 0XC7, 0X31, 0X30, 0X7C, + 0XF3, 0XDC, 0X86, 0XE1, 0X00, 0XF0, 0X00, 0XF8, 0X41, 0XF8, 0X41, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XC8, 0X41, 0XA0, 0X8A, 0X9A, 0X0C, 0X63, + 0X04, 0X11, 0X82, 0X10, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X4D, 0X6B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFB, 0XDE, 0X08, 0X42, 0X42, 0X10, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X49, 0X4A, 0X38, 0XBE, + 0XFF, 0XFF, 0X38, 0XD6, 0X86, 0XA9, 0X00, 0XC8, 0X00, 0XE0, 0X00, 0XF0, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X00, 0XF0, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XD0, 0XC3, 0X98, 0X8A, 0X8A, 0XB2, 0XA4, 0XBA, 0XC6, 0XF7, 0XB5, + 0X08, 0X42, 0X41, 0X08, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X45, 0X29, 0XF7, 0XBD, 0XFF, 0XFF, + 0X71, 0X8C, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X0C, 0X63, 0X3C, 0XE7, + 0XFF, 0XFF, 0X79, 0XD6, 0X46, 0XB9, 0X00, 0XE0, 0X42, 0XC8, 0X82, 0XA8, 0X82, 0XB0, 0X41, 0XD8, + 0X82, 0XE8, 0X82, 0XF0, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XF0, 0X41, 0XE8, 0X41, 0XD8, + 0X04, 0XC1, 0X08, 0X92, 0X4D, 0X8B, 0X34, 0XA5, 0XFB, 0XC6, 0XFB, 0XD6, 0XBA, 0XCE, 0X3C, 0XE7, + 0X30, 0X84, 0XC3, 0X18, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X41, 0X08, 0XCF, 0X7B, 0X7D, 0XEF, + 0X49, 0X4A, 0X00, 0X00, 0X04, 0X21, 0X45, 0X29, 0X46, 0X31, 0X86, 0X31, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XF7, 0XF7, 0XDD, 0X09, 0XDA, 0X83, 0XF8, 0X01, 0XF0, 0X42, 0XC0, 0X82, 0X98, 0X49, 0X9A, + 0XF3, 0XB4, 0XF3, 0XCC, 0X71, 0XBC, 0X8E, 0XBB, 0X8E, 0XBB, 0X30, 0XBC, 0X71, 0XBC, 0XF3, 0XBC, + 0XB6, 0XBD, 0XFB, 0XCE, 0XBE, 0XE7, 0X7D, 0XE7, 0X3B, 0XDF, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, + 0X75, 0XAD, 0X86, 0X31, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X49, 0X4A, 0XFB, 0XDE, + 0X04, 0X21, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X45, 0X29, 0X87, 0X39, 0XB2, 0X94, 0XFF, 0XFF, + 0XBE, 0XF7, 0X34, 0XDD, 0X0C, 0XEB, 0X09, 0XFA, 0X00, 0XF0, 0X01, 0XD8, 0X00, 0XD8, 0X8B, 0XD2, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XFF, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0X78, 0XC6, 0XC7, 0X39, 0X00, 0X00, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X79, 0XCE, + 0X00, 0X00, 0X82, 0X10, 0XC3, 0X18, 0X04, 0X21, 0X05, 0X29, 0X86, 0X31, 0XB3, 0X9C, 0XFF, 0XFF, + 0XFF, 0XF7, 0X75, 0XDD, 0XC7, 0XE9, 0XC7, 0XF9, 0X01, 0XF8, 0X01, 0XF0, 0X00, 0XE8, 0X49, 0XE2, + 0XFB, 0XEE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0XB9, 0XCE, 0X08, 0X42, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X38, 0XC6, + 0X00, 0X00, 0X82, 0X10, 0X82, 0X10, 0X04, 0X21, 0X04, 0X21, 0X45, 0X29, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XFF, 0X38, 0XDE, 0XC4, 0XD0, 0X00, 0XF0, 0X01, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X08, 0XD2, + 0XFB, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XBA, 0XD6, + 0X79, 0XCE, 0XC7, 0X39, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X00, 0X00, 0X00, 0X00, 0XC3, 0X18, 0XCB, 0X5A, 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X7D, 0XEF, + 0XFF, 0XFF, 0X7D, 0XEF, 0XCF, 0XBB, 0XC3, 0XB0, 0X41, 0XD0, 0X41, 0XD0, 0X82, 0XB8, 0X4D, 0XB3, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XBE, 0XF7, 0X3D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFA, 0XD6, + 0XF7, 0XBD, 0X04, 0X21, 0X86, 0X31, 0X04, 0X21, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X75, 0XAD, 0XCF, 0X7B, 0X41, 0X08, 0X86, 0X31, 0XF7, 0XBD, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XEF, 0X74, 0XB5, 0X30, 0X9C, 0X30, 0X9C, 0X72, 0XA4, 0XBB, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0X3C, 0XE7, + 0X71, 0X8C, 0X81, 0X08, 0X0C, 0X63, 0XCF, 0X7B, 0X82, 0X10, 0X00, 0X00, 0X8A, 0X52, 0X38, 0XC6, + 0X75, 0XAD, 0X71, 0X8C, 0XB6, 0XB5, 0X3C, 0XE7, 0XFB, 0XDE, 0XC7, 0X39, 0X00, 0X00, 0XCF, 0X73, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X7D, 0XEF, 0X3B, 0XDF, 0XFA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFB, 0XDE, 0XB9, 0XCE, + 0XC7, 0X39, 0XC4, 0X20, 0X71, 0X8C, 0XBA, 0XD6, 0X71, 0X8C, 0XCB, 0X5A, 0XB2, 0X94, 0XBA, 0XD6, + 0XFF, 0XFF, 0X7D, 0XEF, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB6, 0XB5, 0X46, 0X29, 0X05, 0X19, + 0X75, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, 0XFC, 0XDE, 0X4E, 0X63, + 0X42, 0X08, 0X0C, 0X63, 0XF7, 0XBD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBE, 0XF7, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF4, 0X9C, 0X04, 0X21, + 0X05, 0X21, 0XB6, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, + 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, 0XBB, 0XD6, 0XD1, 0X73, 0X83, 0X18, + 0X86, 0X39, 0X34, 0X9D, 0XBD, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XFF, 0X35, 0XD6, 0XEB, 0XCC, 0X43, 0XB3, + 0X40, 0X51, 0X05, 0X19, 0XF5, 0X8C, 0XBE, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, + 0XFB, 0XDE, 0XBA, 0XDE, 0XBA, 0XD6, 0X3C, 0XDF, 0X3A, 0XBE, 0X4F, 0X63, 0X82, 0X49, 0X40, 0XA3, + 0X23, 0XB4, 0XCC, 0X83, 0X3A, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XF7, 0XB5, 0XBD, 0X82, 0X92, 0X20, 0XF4, 0XA0, 0XFC, + 0X60, 0XE4, 0X40, 0X82, 0X84, 0X41, 0X8F, 0X6B, 0X77, 0XAD, 0X3D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, + 0XFB, 0XDE, 0X3D, 0XE7, 0XBB, 0XCE, 0X36, 0X9D, 0X0B, 0X6B, 0X41, 0X6A, 0X60, 0XC4, 0X20, 0XFE, + 0X60, 0XF5, 0X00, 0X8B, 0XC7, 0X6A, 0X38, 0XC6, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4B, 0X7B, 0X80, 0XB2, 0XA0, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0XE0, 0XFC, 0XC0, 0XCB, 0XC1, 0X8A, 0X45, 0X62, 0X4D, 0X6B, 0XB3, 0X94, 0XF7, 0XBD, + 0X3D, 0XDF, 0XFF, 0XF7, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X7D, 0XE7, 0X3D, 0XDF, + 0XBA, 0XC6, 0X75, 0XA5, 0X8D, 0X7B, 0X84, 0X7A, 0X40, 0XB3, 0XE0, 0XEC, 0XE0, 0XFD, 0XE0, 0XFD, + 0X60, 0XF5, 0X20, 0XE5, 0XA0, 0XD4, 0X0A, 0X6B, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCC, 0X93, 0X40, 0XEB, 0X60, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0X20, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XD4, 0XC0, 0XBB, 0X42, 0X9B, 0X45, 0X8B, + 0X6B, 0X9C, 0XAE, 0X9C, 0X71, 0X8C, 0XB3, 0X94, 0X33, 0X9D, 0X34, 0XA5, 0XF2, 0XA4, 0XF0, 0XB4, + 0XCA, 0X9B, 0X04, 0X9B, 0X40, 0XBB, 0X20, 0XE4, 0X20, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0X20, 0XC4, 0X88, 0X5A, 0X38, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X78, 0XD6, 0X46, 0XAB, 0X40, 0XDB, 0X20, 0XF4, + 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0X60, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XDC, + 0XC0, 0XB3, 0XC0, 0X51, 0X86, 0X29, 0X0D, 0X63, 0X8F, 0X7B, 0X0D, 0X5B, 0XC7, 0X41, 0X01, 0X82, + 0X00, 0XC3, 0XC0, 0XE3, 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0XE0, 0XFC, 0X60, 0XF5, 0X60, 0XF5, + 0X20, 0XE5, 0X80, 0X9B, 0X86, 0X62, 0X30, 0X84, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X2D, 0X9C, 0X05, 0X93, + 0X43, 0XA3, 0X82, 0XB3, 0XC2, 0XBB, 0XC2, 0XBB, 0X22, 0XB4, 0X82, 0XA3, 0X42, 0X93, 0XC3, 0X7A, + 0X85, 0X62, 0X0B, 0X63, 0X71, 0X84, 0XB6, 0XB5, 0X79, 0XCE, 0X79, 0XC6, 0XB5, 0XAD, 0X70, 0X94, + 0X4A, 0X8B, 0X06, 0X83, 0X04, 0X93, 0X04, 0X9B, 0X43, 0X9B, 0X43, 0X9B, 0X43, 0X93, 0X04, 0X83, + 0X08, 0X73, 0X8D, 0X73, 0XB3, 0X94, 0X79, 0XCE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XDF, 0X38, 0XBE, + 0X75, 0XB5, 0X33, 0XA5, 0X33, 0XA5, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X94, 0XF3, 0X9C, + 0X35, 0XA5, 0XF8, 0XBD, 0XFB, 0XDE, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7E, 0XEF, + 0XBB, 0XD6, 0XF8, 0XBD, 0XB6, 0XAD, 0X75, 0XAD, 0X34, 0XA5, 0X33, 0X9D, 0X34, 0X9D, 0X35, 0XA5, + 0XB7, 0XAD, 0X79, 0XC6, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char PROGMEM icon_40x40[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0X71, 0X8C, 0X31, 0X84, 0X31, 0X84, + 0X93, 0XC5, 0X92, 0XCD, 0X91, 0XCD, 0X91, 0XD5, 0X91, 0XD5, 0X91, 0XCD, 0X72, 0XCD, 0X72, 0XC5, + 0X56, 0XDE, 0XBE, 0XFF, 0XDB, 0XDE, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X7B, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X5A, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0XE0, 0XD4, 0XA0, 0XD4, + 0X61, 0XA3, 0XA7, 0X39, 0XE5, 0X18, 0X05, 0X21, 0X92, 0X94, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XEE, 0XEB, 0X9B, 0XA1, 0X18, 0X23, 0X73, 0X81, 0XC5, 0X21, 0X9C, + 0X61, 0X39, 0X81, 0XEE, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XE0, 0XFE, 0X40, 0XFF, 0XC0, 0XF6, + 0XC0, 0X49, 0XA0, 0X18, 0X00, 0X42, 0X60, 0X18, 0X00, 0X00, 0X74, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X93, 0XCD, 0XC3, 0XBB, 0XA0, 0X51, 0XE1, 0X39, 0XC2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0X63, 0XBD, 0X61, 0XE6, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XC0, 0XFE, 0X60, 0XFF, 0X21, 0X73, + 0XE1, 0X28, 0X81, 0XEE, 0X61, 0XFF, 0X21, 0XEE, 0XA0, 0X41, 0X20, 0X08, 0X90, 0XCD, 0XDE, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, + 0X0B, 0XAC, 0XC0, 0XB3, 0XA1, 0XEE, 0XC3, 0X5A, 0X22, 0X8C, 0XE1, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0XC0, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XA1, 0XAC, + 0X21, 0XC5, 0X20, 0XFF, 0X60, 0XFE, 0X00, 0XFF, 0X02, 0XDE, 0XE0, 0X20, 0X40, 0X82, 0X49, 0XBC, + 0X3B, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, 0X67, 0X9B, + 0XE0, 0XB3, 0X81, 0XFF, 0XC3, 0XFF, 0X83, 0X9C, 0X82, 0XDE, 0XC0, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0XE0, 0XFE, 0XA2, 0XB4, 0X41, 0XBC, 0X20, 0XCC, + 0X87, 0XA3, 0XB8, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0XA8, 0XA3, 0X60, 0XBC, + 0XA2, 0XFF, 0XA5, 0XFF, 0X44, 0XFF, 0XA1, 0XFF, 0XA0, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X40, 0XFE, + 0XE0, 0XCB, 0XE3, 0X92, 0X7C, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X4C, 0XAC, 0XC0, 0XB3, 0XA4, 0XFF, + 0XA6, 0XFF, 0X45, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XE0, 0XC3, 0X2A, 0XAC, 0X7D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XD4, 0XD5, 0X40, 0XAB, 0X43, 0XFF, 0XA8, 0XFF, + 0X67, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XA2, 0X11, 0XBD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDA, 0XE6, 0XE4, 0X9A, 0XE1, 0XE5, 0XE8, 0XFF, 0X69, 0XFF, + 0X65, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XE0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XE4, 0X85, 0XAB, 0XFA, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X2B, 0XB4, 0XC0, 0XB3, 0XC8, 0XFF, 0X8C, 0XFF, 0X68, 0XFF, + 0X61, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0XA1, 0XDE, 0X61, 0XEF, + 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0XC0, 0XFF, 0X61, 0XDE, 0X00, 0XE6, 0X80, 0XFE, 0X40, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XC0, 0XC3, 0XE9, 0XAB, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0XA3, 0XAB, 0XA3, 0XF6, 0XCC, 0XFF, 0X4C, 0XFF, 0X64, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0X61, 0XEF, 0X22, 0X6B, 0X82, 0X5A, 0X82, 0XB5, + 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0XA0, 0XFF, 0XE1, 0XFF, 0X42, 0X8C, 0XC1, 0X41, 0X21, 0XA4, 0XA0, 0XFE, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X20, 0XF5, 0XC0, 0X9A, 0X35, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X51, 0XC5, 0X60, 0XBC, 0XC9, 0XFF, 0X8E, 0XFF, 0X6A, 0XFF, 0X61, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE1, 0XFF, 0XE1, 0X62, 0X80, 0X10, 0X05, 0XE7, 0XA4, 0XF7, + 0XE4, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XC1, 0XFF, 0XE2, 0X83, 0X40, 0X08, 0X22, 0XCE, 0X60, 0XF7, 0XA0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0XA0, 0XFD, 0XA0, 0XC3, 0XAC, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XDE, 0XFF, 0XA7, 0XAB, 0X81, 0XDD, 0XED, 0XFF, 0XB0, 0XFF, 0X69, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X61, 0XD6, 0X22, 0X29, 0XA6, 0X31, 0XE3, 0X7B, 0X46, 0XEF, + 0XE6, 0XFF, 0XE4, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X81, 0XD6, 0XA0, 0X18, 0XC4, 0X18, 0XA1, 0X62, 0XC1, 0XCD, 0X40, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0XA0, 0XEC, 0X48, 0XBC, 0XDF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF9, 0XE6, 0XE3, 0X9A, 0X67, 0XEE, 0XD1, 0XFF, 0XB0, 0XFF, 0X86, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X60, 0X94, 0X91, 0X73, 0XD9, 0XBD, 0X00, 0X00, 0X05, 0X84, + 0XE8, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XE9, 0X41, 0XB7, 0XB5, 0X01, 0X00, 0X60, 0X62, 0X21, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XE3, 0XBB, 0XD9, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XD3, 0XCD, 0X40, 0XA3, 0X2B, 0XF7, 0XD3, 0XFF, 0XB0, 0XFF, 0X63, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA0, 0X9C, 0X30, 0X6B, 0X97, 0XB5, 0X00, 0X00, 0X83, 0X52, + 0XC6, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XEA, 0X41, 0X77, 0XAD, 0X01, 0X00, 0XC0, 0X49, 0XE0, 0XF6, 0XA0, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0XA0, 0XBB, 0XD3, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X00, 0XB4, 0X8E, 0XFF, 0XF4, 0XFF, 0XB0, 0XFF, 0X42, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X25, 0X8C, + 0XE5, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0XE1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X61, 0X5A, 0X20, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0X00, 0XFE, 0XE0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XC0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XB0, 0XFF, 0XF5, 0XFF, 0X8F, 0XFF, 0X41, 0XFF, 0X80, 0XFF, + 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0X21, 0X8C, 0X60, 0X10, 0X43, 0X6B, 0X44, 0XEF, + 0XE2, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0XE1, 0XFF, 0XC1, 0XA4, 0XC2, 0X18, 0XA2, 0X39, 0XA1, 0XCD, 0X20, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XD2, 0XFF, 0XF7, 0XFF, 0XAF, 0XFF, 0X01, 0XFF, 0X00, 0XFF, + 0X00, 0XFF, 0X40, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XFF, 0X82, 0XD6, 0XC2, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0XC1, 0XFF, 0X82, 0XDE, 0XC2, 0XEE, 0X61, 0XFF, 0X80, 0XFE, 0XC0, 0XFD, 0X20, 0XFD, + 0XA1, 0XFC, 0X61, 0XFC, 0X61, 0XFC, 0XC0, 0XFC, 0X60, 0XFD, 0XE0, 0XCB, 0X51, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X60, 0XC4, 0XD4, 0XFF, 0XF9, 0XFF, 0X2D, 0XFF, 0X00, 0XFE, 0XC0, 0XFD, + 0XA1, 0XFD, 0X21, 0XFE, 0XE0, 0XFE, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0XA0, 0XFE, 0X20, 0XFE, 0X01, 0XFD, 0X01, 0XFC, + 0X62, 0XFB, 0X42, 0XFB, 0X82, 0XFB, 0X21, 0XFC, 0X20, 0XFD, 0X00, 0XD4, 0X71, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X20, 0XC4, 0XD4, 0XFF, 0XBA, 0XFF, 0X2E, 0XFE, 0XE1, 0XFC, 0X61, 0XFC, + 0X61, 0XFC, 0X01, 0XFD, 0X01, 0XFE, 0X20, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X80, 0XFD, 0X61, 0XFC, 0X62, 0XFB, + 0XA3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0XE0, 0XFC, 0XE0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0XC0, 0XB3, 0XB3, 0XFF, 0X7A, 0XFF, 0X91, 0XFD, 0X03, 0XFC, 0X02, 0XFB, + 0X22, 0XFB, 0X62, 0XFC, 0X81, 0XFD, 0XC0, 0XFE, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, 0X60, 0XFE, 0X60, 0XFD, 0X41, 0XFC, 0X62, 0XFB, + 0XC3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0X20, 0XFD, 0XC0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X14, 0XD6, 0X20, 0XAB, 0X51, 0XF7, 0XBE, 0XFF, 0X17, 0XFE, 0X65, 0XFC, 0X61, 0XFB, + 0XA2, 0XFB, 0XA1, 0XFC, 0XC1, 0XFD, 0X00, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0XC0, 0XFD, 0XC0, 0XFC, 0X41, 0XFC, + 0XC1, 0XFB, 0XA2, 0XFB, 0X01, 0XFC, 0XA0, 0XFC, 0X40, 0XFD, 0XA0, 0XC3, 0XF4, 0XD5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X5B, 0XEF, 0X24, 0X9B, 0X49, 0XE6, 0XB8, 0XFF, 0X92, 0XFE, 0X25, 0XFD, 0XA0, 0XFC, + 0X02, 0XFD, 0XE1, 0XFD, 0XE0, 0XFE, 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, + 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X80, 0XFD, 0X01, 0XF5, + 0X41, 0XFD, 0X01, 0XFD, 0XC0, 0XFC, 0X40, 0XFD, 0X00, 0XF5, 0XC4, 0XBB, 0XFA, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X2A, 0XB4, 0XA0, 0XD4, 0XA2, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, 0X00, 0XFE, + 0X80, 0XFE, 0X21, 0XEE, 0X41, 0XE6, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, + 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X40, 0XCC, + 0XE1, 0XAB, 0XC1, 0XED, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XE4, 0X29, 0XB4, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X15, 0XD6, 0XE0, 0XBB, 0X60, 0XFE, 0XC8, 0XFE, 0XC8, 0XFE, 0X02, 0XFF, + 0X60, 0XDD, 0X40, 0XA3, 0XA1, 0XDD, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, + 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X40, 0XED, + 0XC0, 0X9A, 0X40, 0XA3, 0X80, 0XF5, 0X60, 0XFD, 0X60, 0XBB, 0XEE, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X63, 0XAB, 0X42, 0XE5, 0XB4, 0XFF, 0X97, 0XFF, 0XAA, 0XF6, + 0X80, 0XAB, 0XA0, 0X92, 0XA1, 0XDD, 0X41, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, + 0XC0, 0XFE, 0X80, 0XFE, 0X61, 0XFE, 0X00, 0XFE, 0XA0, 0XED, 0X20, 0XE5, 0X21, 0XCC, 0X80, 0XB3, + 0X00, 0XBC, 0XE0, 0XC3, 0X40, 0XED, 0XC0, 0XEC, 0X60, 0X92, 0X97, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XC5, 0X00, 0XA3, 0XAA, 0XF6, 0X93, 0XFF, 0X2D, 0XEE, + 0X63, 0XDD, 0X80, 0XD5, 0X42, 0XB4, 0X82, 0XCC, 0X00, 0XCD, 0X40, 0XD5, 0XA0, 0XDD, 0XE1, 0XE5, + 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0X80, 0XDD, 0X60, 0XDD, 0X20, 0XD5, 0XC0, 0XCC, + 0XA0, 0XCC, 0X61, 0XC4, 0X21, 0XC4, 0X01, 0XBC, 0X01, 0XBC, 0XE0, 0XBB, 0XC0, 0XBB, 0X60, 0XD4, + 0X80, 0XFD, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XBB, 0X2B, 0XAC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0X87, 0XA3, 0X60, 0XD4, 0X0A, 0XFF, 0XCF, 0XFE, + 0XC9, 0XFE, 0XC0, 0XFE, 0XC0, 0XF6, 0X40, 0XE6, 0X41, 0XCD, 0X42, 0XB4, 0XC1, 0XAB, 0X60, 0XA3, + 0X60, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0XA0, 0XAB, 0XC1, 0XAB, 0XE1, 0XB3, 0X22, 0XB4, + 0X82, 0XC4, 0XC0, 0XCC, 0X00, 0XD5, 0X60, 0XE5, 0X81, 0XED, 0X80, 0XF5, 0X80, 0XFD, 0X80, 0XFD, + 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XE4, 0X85, 0XAB, 0X5C, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFA, 0XE6, 0X23, 0XA3, 0XE0, 0XE4, 0XE8, 0XFE, + 0X6A, 0XFE, 0X05, 0XFE, 0X40, 0XFE, 0XA0, 0XFE, 0XC0, 0XFE, 0XE1, 0XFE, 0XA0, 0XF6, 0XA0, 0XF6, + 0XA0, 0XF6, 0XA0, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X60, 0XF6, 0X61, 0XFE, 0X81, 0XFE, + 0X61, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, + 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XA2, 0XB4, 0XCD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X52, 0XC5, 0XE0, 0XA2, 0XA1, 0XF5, + 0X86, 0XFE, 0X06, 0XFE, 0XE2, 0XFD, 0XE0, 0XFD, 0X00, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, + 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, + 0XA0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, + 0X60, 0XFD, 0X60, 0XBB, 0X6C, 0XB4, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X92, 0XCD, 0XC0, 0XA2, + 0X20, 0XED, 0X22, 0XFE, 0XC1, 0XFD, 0XA0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X40, 0XFD, + 0X20, 0XB3, 0XEA, 0XA3, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8E, 0XBC, + 0XE1, 0XA2, 0X00, 0XE5, 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, + 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, + 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X80, 0XFD, 0X00, 0XF5, 0X40, 0XBB, + 0X2B, 0XAC, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X35, 0XD6, 0XE2, 0X9A, 0XA0, 0XC3, 0XA0, 0XFD, 0XE0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X00, 0XD4, 0XC1, 0X9A, 0X10, 0XC5, + 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X98, 0XDE, 0X2B, 0XAC, 0X40, 0XB3, 0X00, 0XD4, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XFD, + 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X40, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XDC, 0X80, 0XBB, 0XE8, 0XAB, 0X57, 0XDE, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X37, 0XD6, 0X86, 0XA3, 0XC0, 0X9A, 0XE0, 0XCB, 0X80, 0XEC, + 0XE0, 0XF4, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X00, 0XF5, + 0XA0, 0XEC, 0X00, 0XD4, 0X40, 0XB3, 0X03, 0X9B, 0X92, 0XC5, 0XBD, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XF5, 0XCD, 0XAD, 0XBC, 0X69, 0XBC, + 0X05, 0XBC, 0X03, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0XE2, 0XC3, 0X24, 0XC4, + 0X68, 0XBC, 0XAC, 0XBC, 0XD3, 0XCD, 0X9E, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5B, 0XEF, 0X98, 0XDE, 0X56, 0XD6, 0X57, 0XD6, 0X57, 0XD6, 0X56, 0XD6, 0X77, 0XDE, 0X1B, 0XEF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char PROGMEM wifi_full[2048] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x21, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, + 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x71, 0xC2, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x28, 0xA0, 0xCB, 0x23, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xC3, 0x03, 0x18, 0x60, 0x00, 0x00, + 0x08, 0x20, 0xD3, 0x23, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xC3, 0x03, 0x00, 0x00, + 0x59, 0x61, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x41, 0x01, + 0x8A, 0x22, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0x89, 0xFE, 0x34, 0xFE, 0xB7, 0xFF, 0x19, 0xFF, 0x3A, 0xFF, 0x3A, 0xFE, 0xD8, + 0xFE, 0x76, 0xF5, 0xD1, 0xF5, 0x0C, 0xEB, 0xE6, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xF5, 0x90, 0xEC, 0x06, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xF4, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x54, + 0xF4, 0x47, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xBD, 0xFF, 0x7C, 0xFF, 0x7C, 0xFF, 0x9D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF6, 0x13, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xF4, 0x47, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xC4, 0xF4, 0x48, 0xF5, 0x2E, 0xFE, 0x55, 0xFF, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xF5, 0x0C, 0xFE, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xB1, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x27, 0xF4, 0xCB, 0xF5, 0x0C, 0xF5, 0x0C, + 0xF4, 0xAB, 0xF4, 0x27, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0xEC, + 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x34, 0xEB, 0xC4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xFE, 0x76, 0xF4, 0xEC, 0xEB, 0xC4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xC5, 0xFE, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x55, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF6, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xF5, 0x6F, 0xEB, 0xC4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xF2, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x69, 0xF5, 0x0C, 0xF4, 0xAA, 0xF4, 0x89, + 0xF4, 0xCB, 0xF5, 0x6F, 0xFE, 0x55, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, + 0xF4, 0x48, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF5, 0x0D, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xF4, 0xEC, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xDE, 0xF5, 0x0D, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBE, 0xF4, 0x27, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF5, 0x4E, 0xFF, 0xDE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4E, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xB7, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xC4, 0xFF, 0x3A, 0xFF, 0x9D, + 0xFF, 0x9C, 0xFF, 0x19, 0xF6, 0x13, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x48, + 0xFF, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xEB, 0xC5, 0xFF, 0x7C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xD8, 0xFF, 0x19, + 0xFF, 0x19, 0xFF, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0xF4, 0xAA, 0xEB, 0xA4, 0xEB, 0xA4, + 0xF4, 0x47, 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xBE, 0xF4, 0x47, 0xEB, 0xA4, 0xF4, 0xEC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0x27, 0xF5, 0xD1, 0xFF, 0xBD, 0xFF, 0xFF, 0xF5, 0xD2, 0xEB, 0xA4, + 0xEB, 0xA4, 0xF4, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD8, 0xEB, 0xA4, 0xEB, 0xA4, 0xFE, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xCB, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEC, 0x06, 0xFE, 0xB7, 0xFF, 0xFF, 0xFE, 0x34, + 0xEB, 0xA4, 0xEB, 0xA4, 0xF6, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xEC, 0xEB, 0xA4, 0xF5, 0x0C, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x55, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, + 0xF4, 0x27, 0xF5, 0x4E, 0xF5, 0x2D, 0xEB, 0xE5, 0xEB, 0xA4, 0xEB, 0xC4, 0xFE, 0x96, 0xFF, 0xFF, + 0xF5, 0x6F, 0xEB, 0xA4, 0xEB, 0xE5, 0xFF, 0xBE, 0xFF, 0xFF, 0xFE, 0xF9, 0xEB, 0xA4, 0xEB, 0xC4, + 0xFF, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xEB, 0xC5, 0xEB, 0xA4, 0xEB, 0xA4, 0x71, 0xC2, + 0x92, 0x42, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xEB, 0xA4, 0xF4, 0xEC, + 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xEC, 0x48, 0xEB, 0x84, 0xEB, 0xC5, 0xFF, 0x5B, + 0xFF, 0xDE, 0xEC, 0x07, 0xE3, 0x84, 0xF5, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x28, 0xE3, 0x84, + 0xF6, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xAB, 0xE3, 0x64, 0xE3, 0x64, 0x79, 0xE2, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0xC5, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x98, 0xB2, 0x84, 0xB2, 0x84, 0xC4, 0x0C, + 0xFF, 0xFF, 0xDD, 0x93, 0xB2, 0x84, 0xBB, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x11, 0xB2, 0x84, + 0xCC, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x32, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xC3, 0x8A, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xF7, 0x3B, 0xFF, 0x9D, 0xB2, 0x85, 0xB2, 0x84, 0xF7, 0x5C, 0xEE, 0xFA, 0xD4, 0xD0, 0xB2, 0x84, + 0xB2, 0xE6, 0xDD, 0x93, 0xCC, 0x6E, 0xBB, 0x68, 0xB2, 0x85, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xAA, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xBB, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x5C, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xDD, 0x52, 0xEE, 0xD9, 0xBB, 0x07, 0xB2, 0x84, 0xB2, 0x85, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0xA2, 0x64, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xE5, 0xD5, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xAF, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x92, 0x23, + 0x9A, 0x43, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0xA5, + 0xD4, 0xF0, 0xEE, 0x99, 0xEE, 0x78, 0xCC, 0x4D, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x79, 0xC3, + 0x81, 0xE3, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x59, 0x42, + 0x79, 0xC3, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, + 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0xB2, 0x84, 0x59, 0x42, + 0x51, 0x42, 0x79, 0xC3, 0x79, 0xC3, 0x9A, 0x23, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, + 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0xA2, 0x63, 0x92, 0x23, 0x79, 0xC3, 0x79, 0xC3, 0x38, 0xE1, +}; diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_slim.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_slim.ino new file mode 100644 index 0000000..e552137 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_slim.ino @@ -0,0 +1,21 @@ +#include // f.k. for Arduino-1.5.2 +#include "Adafruit_GFX.h"// Hardware-specific library +#include + +/* + * an empty Leonardo sketch uses 3.5kB + 4kB bootloader + * + * this C++ program avoids Serial and f-p. + * so it just fits in the Flash. + * + * This is a complete dummy sketch. + * its only purpose is to tell the IDE which libraries to use + * + * The actual program is in the graphictest_v25.cpp + * + * This enables me to build an identical AS7 project + * + * Edit the HOW_SLIM macro to build for other chips + * + */ + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_v25.cpp b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_v25.cpp new file mode 100644 index 0000000..b2bf3f7 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/graphictest_v25.cpp @@ -0,0 +1,552 @@ +#if defined(__AVR_ATmega32U4__) //Leonardo +#define HOW_SLIM 3 +#else +#define HOW_SLIM 0 //no slimming measures +#endif + +// All the mcufriend.com UNO shields have the same pinout. +// i.e. control pins A0-A4. Data D2-D9. microSD D10-D13. +// Touchscreens are normally A1, A2, D7, D6 but the order varies +// +// This demo should work with most Adafruit TFT libraries +// If you are not using a shield, use a full Adafruit constructor() +// e.g. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +#define LCD_CS A3 // Chip Select goes to Analog 3 +#define LCD_CD A2 // Command/Data goes to Analog 2 +#define LCD_WR A1 // LCD Write goes to Analog 1 +#define LCD_RD A0 // LCD Read goes to Analog 0 +#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin + +#if ARDUINO < 165 +#define USE_GFX_KBV +#include "ADA_GFX_kbv.h" +#else +#include "Adafruit_GFX.h" +#endif +#include +MCUFRIEND_kbv tft; +//#include +//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +void setup(void); +void loop(void); +unsigned long testFillScreen(); +unsigned long testText(); +unsigned long testLines(uint16_t color); +unsigned long testFastLines(uint16_t color1, uint16_t color2); +unsigned long testRects(uint16_t color); +unsigned long testFilledRects(uint16_t color1, uint16_t color2); +unsigned long testFilledCircles(uint8_t radius, uint16_t color); +unsigned long testCircles(uint8_t radius, uint16_t color); +unsigned long testTriangles(); +unsigned long testFilledTriangles(); +unsigned long testRoundRects(); +unsigned long testFilledRoundRects(); +void progmemPrint(const char *str); +void progmemPrintln(const char *str); + +void runtests(void); + +uint16_t g_identifier; + +void setup(void) { +#if HOW_SLIM < 1 + Serial.begin(9600); + uint32_t when = millis(); + // while (!Serial) ; //hangs a Leonardo until you connect a Serial + if (!Serial) delay(5000); //allow some time for Leonardo + Serial.println("Serial took " + String((millis() - when)) + "ms to start"); +#endif + static uint16_t identifier; + tft.reset(); //we can't read ID on 9341 until begin() + g_identifier = tft.readID(); // +#if HOW_SLIM < 1 + Serial.print("ID = 0x"); + Serial.println(g_identifier, HEX); +#endif + if (g_identifier == 0x00D3) g_identifier = 0x9481; // write-only shield + if (g_identifier == 0xFFFF) g_identifier = 0x9341; // serial + // g_identifier = 0x7789; // force ID + tft.begin(g_identifier); +} + +#if defined(MCUFRIEND_KBV_H_) +uint16_t scrollbuf[480]; // my biggest screen is 320x480 +#define READGRAM(x, y, buf, w, h) tft.readGRAM(x, y, buf, w, h) +#else +uint16_t scrollbuf[320]; // Adafruit only does 240x320 +// Adafruit can read a block by one pixel at a time +int16_t READGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h) +{ + uint16_t *p; + for (int row = 0; row < h; row++) { + p = block + row * w; + for (int col = 0; col < w; col++) { + *p++ = tft.readPixel(x + col, y + row); + } + } +} +#endif + +void windowScroll(int16_t x, int16_t y, int16_t wid, int16_t ht, int16_t dx, int16_t dy, uint16_t *buf) +{ + if (dx) for (int16_t row = 0; row < ht; row++) { + READGRAM(x, y + row, buf, wid, 1); + tft.setAddrWindow(x, y + row, x + wid - 1, y + row); + tft.pushColors(buf + dx, wid - dx, 1); + tft.pushColors(buf + 0, dx, 0); + } + if (dy) for (int16_t col = 0; col < wid; col++) { + READGRAM(x + col, y, buf, 1, ht); + tft.setAddrWindow(x + col, y, x + col, y + ht - 1); + tft.pushColors(buf + dy, ht - dy, 1); + tft.pushColors(buf + 0, dy, 0); + } +} + +void loop(void) { + uint8_t aspect; + uint16_t pixel; + char *aspectname[] = { + "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" + }; + char *colorname[] = { "BLUE", "GREEN", "RED", "GRAY" }; + uint16_t colormask[] = { 0x001F, 0x07E0, 0xF800, 0xFFFF }; + uint16_t dx, rgb, n, wid, ht; + tft.setRotation(1); + runtests(); + delay(2000); + if (tft.height() > 64) { + for (uint8_t cnt = 0; cnt < 4; cnt++) { + aspect = (cnt + 0) & 3; + tft.setRotation(aspect); + wid = tft.width(); + ht = tft.height(); + testText(); + dx = wid / 32; + for (n = 0; n < 32; n++) { + rgb = n * 8; + rgb = tft.color565(rgb, rgb, rgb); + tft.fillRect(n * dx, 48, dx, 64, rgb & colormask[aspect]); + } + tft.setTextSize(2); + tft.setTextColor(colormask[aspect], BLACK); + tft.setCursor(0, 72); + tft.print(colorname[aspect]); + tft.setTextColor(WHITE); + tft.println(" COLOR GRADES"); + tft.setTextColor(WHITE, BLACK); + tft.setCursor(0, 184); + tft.println(aspectname[aspect]); + delay(1000); + tft.drawPixel(0, 0, YELLOW); + pixel = tft.readPixel(0, 0); +#if defined(MCUFRIEND_KBV_H_) +#if HOW_SLIM < 3 + extern const uint8_t penguin[]; + tft.setAddrWindow(wid - 40 - 40, 20 + 0, wid - 1 - 40, 20 + 39); + tft.pushColors(penguin, 1600, 1); +#endif + tft.setTextColor(WHITE, BLACK); + tft.println("VERTICAL SCROLL UP"); + uint16_t maxscroll; + if (tft.getRotation() & 1) maxscroll = wid; + else maxscroll = ht; + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, i); + delay(10); + } + tft.vertScroll(0, maxscroll, 0); + tft.setCursor(0, 200); + tft.println("VERTICAL SCROLL DN"); + for (uint16_t i = 1; i <= maxscroll; i++) { + tft.vertScroll(0, maxscroll, 0 - (int16_t)i); + delay(10); + } + delay(1000); + tft.vertScroll(0, maxscroll, 0); + if ((aspect & 1) == 0) { //Portrait + tft.setCursor(0, 200); + tft.setTextColor(BLUE, BLACK); + tft.println("ONLY THE COLOR BAND"); + for (uint16_t i = 0; i < 64; i++) { + tft.vertScroll(48, 64, i + 1); + delay(20); + } + delay(1000); + tft.vertScroll(0, maxscroll, 0); + } +#endif + tft.setCursor(0, 200); + tft.setTextColor(YELLOW, BLACK); + if (pixel == YELLOW) { + tft.println("SOFTWARE SCROLL "); +#if 1 + for (int16_t i = 45, dx = 2, dy = 1; i > 0; i -= dx) { + windowScroll(24, 8, 90, 40, dx, dy, scrollbuf); + } +#else + // scroll a whole width of the screen + for (int16_t i = wid, dx = 4, dy = 0; i > 0; i -= dx) { + windowScroll(0, 200, wid, 16, dx, dy, scrollbuf); + } +#endif + } + else if (pixel == CYAN) + tft.println("readPixel() reads as BGR"); + else if (pixel == 0xFFFF) + tft.println("readPixel() should be 24-bit"); + else { + tft.print("readPixel() reads 0x"); + tft.println(pixel, HEX); + } + delay(5000); + } + } + tft.println("INVERT DISPLAY"); + tft.invertDisplay(true); + delay(2000); + tft.invertDisplay(false); +} + +typedef struct { + PGM_P msg; + uint32_t ms; +} TEST; +TEST result[12]; + +#define RUNTEST(n, str, test) { result[n].msg = PSTR(str); result[n].ms = test; delay(500); } + +void runtests(void) +{ + uint8_t i; + uint32_t total; + RUNTEST(0, "FillScreen ", testFillScreen()); + RUNTEST(1, "Text ", testText()); + RUNTEST(2, "Lines ", testLines(CYAN)); + RUNTEST(3, "Horiz/Vert Lines ", testFastLines(RED, BLUE)); + RUNTEST(4, "Rectangles (outline) ", testRects(GREEN)); + RUNTEST(5, "Rectangles (filled) ", testFilledRects(YELLOW, MAGENTA)); + RUNTEST(6, "Circles (filled) ", testFilledCircles(10, MAGENTA)); + RUNTEST(7, "Circles (outline) ", testCircles(10, WHITE)); + RUNTEST(8, "Triangles (outline) ", testTriangles()); + RUNTEST(9, "Triangles (filled) ", testFilledTriangles()); + RUNTEST(10, "Rounded rects (outline) ", testRoundRects()); + RUNTEST(11, "Rounded rects (filled) ", testFilledRoundRects()); + + tft.setRotation(1); + tft.fillScreen(BLACK); + tft.setCursor(0, 0); + tft.setTextSize(2); + tft.println("MCUFRIEND for UNO"); + + tft.setTextSize(1); + total = 0; + for (i = 0; i < 12; i++) { + PGM_P str = result[i].msg; + char c; + if (i < 10) tft.print(" "); + tft.print(i); + tft.print(": "); + while (c = pgm_read_byte(str++)) tft.print(c); + tft.println(result[i].ms); + total += result[i].ms; + } + tft.setTextSize(2); + tft.print("Total:"); +#if HOW_SLIM < 2 + tft.print(0.000001 * total); + tft.println("sec"); +#else + tft.print(total / 1000, DEC); + tft.println(" ms"); +#endif + g_identifier = tft.readID(); + tft.print("ID: 0x"); + tft.println(tft.readID(), HEX); + tft.print("Reg(00):0x"); + tft.println(tft.readReg(0x00), HEX); + tft.print("F_CPU:"); +#if HOW_SLIM < 2 + tft.print(0.000001 * F_CPU); +#else + tft.print((int)(F_CPU/1000000)); +#endif +#if defined(__OPTIMIZE_SIZE__) + tft.println("MHz -Os"); +#else + tft.println("MHz"); +#endif + + delay(10000); +} + +// Standard Adafruit tests. will adjust to screen size + +unsigned long testFillScreen() { + unsigned long start = micros(); + tft.fillScreen(BLACK); + tft.fillScreen(RED); + tft.fillScreen(GREEN); + tft.fillScreen(BLUE); + tft.fillScreen(BLACK); + return micros() - start; +} + +unsigned long testText() { + unsigned long start; + tft.fillScreen(BLACK); + start = micros(); + tft.setCursor(0, 0); + tft.setTextColor(WHITE); tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(YELLOW); tft.setTextSize(2); +#if HOW_SLIM < 2 + tft.println(123.45); +#else + tft.println("456.78"); +#endif + tft.setTextColor(RED); tft.setTextSize(3); + tft.println(0xDEADBEEF, HEX); + tft.println(); + tft.setTextColor(GREEN); + tft.setTextSize(5); + tft.println("Groop"); + tft.setTextSize(2); + tft.println("I implore thee,"); + tft.setTextSize(1); + tft.println("my foonting turlingdromes."); + tft.println("And hooptiously drangle me"); + tft.println("with crinkly bindlewurdles,"); + tft.println("Or I will rend thee"); + tft.println("in the gobberwarts"); + tft.println("with my blurglecruncheon,"); + tft.println("see if I don't!"); + return micros() - start; +} + +unsigned long testLines(uint16_t color) { + unsigned long start, t; + int x1, y1, x2, y2, + w = tft.width(), + h = tft.height(); + + tft.fillScreen(BLACK); + + x1 = y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t = micros() - start; // fillScreen doesn't count against timing + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = 0; + y2 = h - 1; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = 0; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = w - 1; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + t += micros() - start; + + tft.fillScreen(BLACK); + + x1 = w - 1; + y1 = h - 1; + y2 = 0; + start = micros(); + for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color); + x2 = 0; + for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color); + + return micros() - start; +} + +unsigned long testFastLines(uint16_t color1, uint16_t color2) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(); + + tft.fillScreen(BLACK); + start = micros(); + for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1); + for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2); + + return micros() - start; +} + +unsigned long testRects(uint16_t color) { + unsigned long start; + int n, i, i2, + cx = tft.width() / 2, + cy = tft.height() / 2; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + start = micros(); + for (i = 2; i < n; i += 6) { + i2 = i / 2; + tft.drawRect(cx - i2, cy - i2, i, i, color); + } + + return micros() - start; +} + +unsigned long testFilledRects(uint16_t color1, uint16_t color2) { + unsigned long start, t = 0; + int n, i, i2, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(tft.width(), tft.height()); + for (i = n; i > 0; i -= 6) { + i2 = i / 2; + start = micros(); + tft.fillRect(cx - i2, cy - i2, i, i, color1); + t += micros() - start; + // Outlines are not included in timing results + tft.drawRect(cx - i2, cy - i2, i, i, color2); + } + + return t; +} + +unsigned long testFilledCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; + + tft.fillScreen(BLACK); + start = micros(); + for (x = radius; x < w; x += r2) { + for (y = radius; y < h; y += r2) { + tft.fillCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testCircles(uint8_t radius, uint16_t color) { + unsigned long start; + int x, y, r2 = radius * 2, + w = tft.width() + radius, + h = tft.height() + radius; + + // Screen is not cleared for this one -- this is + // intentional and does not affect the reported time. + start = micros(); + for (x = 0; x < w; x += r2) { + for (y = 0; y < h; y += r2) { + tft.drawCircle(x, y, radius, color); + } + } + + return micros() - start; +} + +unsigned long testTriangles() { + unsigned long start; + int n, i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + n = min(cx, cy); + start = micros(); + for (i = 0; i < n; i += 5) { + tft.drawTriangle( + cx , cy - i, // peak + cx - i, cy + i, // bottom left + cx + i, cy + i, // bottom right + tft.color565(0, 0, i)); + } + + return micros() - start; +} + +unsigned long testFilledTriangles() { + unsigned long start, t = 0; + int i, cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + for (i = min(cx, cy); i > 10; i -= 5) { + start = micros(); + tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(0, i, i)); + t += micros() - start; + tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, + tft.color565(i, i, 0)); + } + + return t; +} + +unsigned long testRoundRects() { + unsigned long start; + int w, i, i2, red, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + w = min(tft.width(), tft.height()); + start = micros(); + red = 0; + step = (256 * 6) / w; + for (i = 0; i < w; i += 6) { + i2 = i / 2; + red += step; + tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(red, 0, 0)); + } + + return micros() - start; +} + +unsigned long testFilledRoundRects() { + unsigned long start; + int i, i2, green, step, + cx = tft.width() / 2 - 1, + cy = tft.height() / 2 - 1; + + tft.fillScreen(BLACK); + start = micros(); + green = 256; + step = (256 * 6) / min(tft.width(), tft.height()); + for (i = min(tft.width(), tft.height()); i > 20; i -= 6) { + i2 = i / 2; + green -= step; + tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, green, 0)); + } + + return micros() - start; +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/icons.c b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/icons.c new file mode 100644 index 0000000..97edda8 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/graphictest_slim/icons.c @@ -0,0 +1,408 @@ +#include + +const unsigned char PROGMEM penguin[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, + 0XBA, 0XD6, 0XB6, 0XB5, 0XF3, 0X9C, 0XB2, 0X94, 0XB3, 0X9C, 0XB2, 0X94, 0X34, 0XA5, 0XF7, 0XBD, + 0XFB, 0XDE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XFB, 0XDE, 0XF3, 0X9C, 0XCB, 0X5A, + 0XC7, 0X39, 0X04, 0X21, 0X82, 0X10, 0X42, 0X10, 0X42, 0X10, 0X41, 0X08, 0X83, 0X18, 0X45, 0X29, + 0XC7, 0X39, 0X0C, 0X63, 0X75, 0XAD, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XB2, 0X94, 0X08, 0X42, 0XC3, 0X18, 0X82, 0X10, + 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X41, 0X08, 0XC3, 0X18, 0X08, 0X42, 0XF3, 0X9C, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XDE, 0X0C, 0X63, 0XC3, 0X18, 0XC3, 0X18, 0X45, 0X29, 0XC7, 0X39, + 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0X08, 0X42, 0XC7, 0X39, 0XC7, 0X39, + 0X86, 0X31, 0X86, 0X31, 0X04, 0X21, 0X41, 0X08, 0X82, 0X10, 0XCB, 0X5A, 0XBA, 0XD6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFB, 0XDE, 0XCB, 0X5A, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X08, 0X42, + 0X09, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X49, 0X4A, 0X08, 0X42, 0XC7, 0X39, + 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X83, 0X18, 0X00, 0X00, 0XC8, 0X41, 0X38, 0XC6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X7D, 0XEF, 0X8E, 0X73, 0X82, 0X10, 0X45, 0X29, 0XC7, 0X39, 0X08, 0X42, 0X09, 0X4A, 0X8A, 0X52, + 0X30, 0X84, 0XCF, 0X7B, 0X8A, 0X52, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XCB, 0X5A, 0XCF, 0X7B, + 0X0C, 0X63, 0X08, 0X42, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X00, 0X00, 0X49, 0X4A, + 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF3, 0X9C, 0XC3, 0X18, 0X04, 0X21, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X72, 0X94, + 0X7D, 0XEF, 0X7D, 0XEF, 0XB2, 0X94, 0X4A, 0X52, 0X49, 0X4A, 0X8A, 0X52, 0X75, 0XAD, 0XBE, 0XF7, + 0XBA, 0XD6, 0X4D, 0X6B, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, 0X41, 0X08, + 0XCF, 0X7B, 0X7C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0XD6, + 0X08, 0X42, 0X82, 0X10, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8E, 0X73, 0XFB, 0XDE, + 0XFF, 0XFF, 0XBE, 0XF7, 0XBA, 0XD6, 0X8E, 0X73, 0X08, 0X42, 0X30, 0X84, 0X3C, 0XE7, 0X7D, 0XEF, + 0XFF, 0XFF, 0XB6, 0XB5, 0X49, 0X4A, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, 0X41, 0X08, + 0X45, 0X29, 0XB6, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0X71, 0X8C, + 0X41, 0X08, 0X45, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0XB2, 0X94, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0XB6, 0XB5, 0XF3, 0X9C, 0X0C, 0X63, + 0X38, 0XC6, 0XBA, 0XD6, 0X0C, 0X63, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0XC3, 0X18, + 0X41, 0X08, 0X30, 0X84, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0XCB, 0X5A, + 0X41, 0X08, 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X52, 0X8A, 0X52, 0XF3, 0X9C, 0XFF, 0XFF, + 0X7D, 0XEF, 0XC7, 0X39, 0XC3, 0X18, 0X0C, 0X63, 0XCB, 0X5A, 0XB6, 0XB5, 0XB2, 0X94, 0XCB, 0X5A, + 0X75, 0XAD, 0XFA, 0XD6, 0X4D, 0X6B, 0X87, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X41, 0X08, 0X8A, 0X52, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X86, 0X31, + 0X04, 0X21, 0XC8, 0X41, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X52, 0X49, 0X4A, 0XB1, 0X8C, 0XBE, 0XF7, + 0XBE, 0XF7, 0XB2, 0X94, 0XCF, 0X7B, 0XCF, 0X7B, 0X49, 0X4A, 0X74, 0XA5, 0X7D, 0XEF, 0X7C, 0XE7, + 0XBE, 0XF7, 0X79, 0XCE, 0X0C, 0X63, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X04, 0X21, + 0X82, 0X10, 0X45, 0X29, 0X75, 0XAD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X34, 0XA5, 0X82, 0X10, + 0X86, 0X31, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X49, 0X4A, 0X4D, 0X6B, 0XBA, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0X79, 0XCE, 0X0D, 0X63, 0XC7, 0X39, 0XCF, 0X7B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X75, 0XAD, 0X08, 0X42, 0X86, 0X31, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC3, 0X18, 0XC3, 0X18, 0XB2, 0X94, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XB2, 0X8C, 0X41, 0X08, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X8A, 0X52, 0X8A, 0X52, 0X4A, 0X4A, 0XD0, 0X7B, + 0X7A, 0XC6, 0X7B, 0XBE, 0X90, 0X6B, 0XC9, 0X39, 0X88, 0X31, 0XC9, 0X39, 0XB3, 0X84, 0XBB, 0XC6, + 0XF8, 0XB5, 0XCC, 0X5A, 0X86, 0X31, 0XC7, 0X39, 0XC7, 0X39, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0XC4, 0X20, 0X41, 0X08, 0X30, 0X84, 0X3C, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XE7, 0X8A, 0X4A, 0XC3, 0X10, + 0XC7, 0X39, 0X08, 0X42, 0X49, 0X4A, 0X49, 0X4A, 0X4A, 0X4A, 0X4A, 0X42, 0X09, 0X3A, 0X08, 0X4A, + 0X09, 0X6B, 0X49, 0X7B, 0XC6, 0X7A, 0X05, 0X83, 0X46, 0X83, 0XC5, 0X7A, 0XC6, 0X72, 0X09, 0X7B, + 0X48, 0X5A, 0X87, 0X31, 0X88, 0X21, 0X88, 0X29, 0X86, 0X31, 0X86, 0X31, 0X45, 0X29, 0X45, 0X29, + 0X04, 0X21, 0X41, 0X08, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF7, 0XC5, 0X82, 0X50, 0X05, 0X41, + 0XC7, 0X29, 0X08, 0X42, 0X49, 0X4A, 0X4A, 0X42, 0X49, 0X4A, 0X09, 0X7B, 0X88, 0X9B, 0XC6, 0XB3, + 0X21, 0XD4, 0XA0, 0XDC, 0XE1, 0XE4, 0X61, 0XED, 0X61, 0XED, 0X21, 0XED, 0XA0, 0XE4, 0X20, 0XDC, + 0X80, 0XCB, 0X43, 0XAB, 0XC4, 0X82, 0X06, 0X5A, 0X47, 0X21, 0X46, 0X29, 0X45, 0X29, 0X04, 0X29, + 0X04, 0X19, 0X82, 0X10, 0X82, 0X18, 0XF3, 0X9C, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4D, 0X93, 0X00, 0XA0, 0X82, 0XB8, + 0XC7, 0X31, 0X09, 0X32, 0X49, 0X4A, 0X86, 0X7A, 0X43, 0XC3, 0X6B, 0XED, 0XF4, 0XF6, 0XEB, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XF4, 0XC1, 0XDB, 0X83, 0X9A, 0XC5, 0X49, 0X45, 0X29, 0X04, 0X19, + 0XC4, 0X20, 0X82, 0X38, 0X00, 0X50, 0XCB, 0X6A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XEE, 0X04, 0XA1, 0X00, 0XC0, 0X00, 0XF0, + 0XC3, 0XA0, 0XC8, 0X41, 0X49, 0X42, 0X05, 0X9B, 0X20, 0XFC, 0XA4, 0XFC, 0X69, 0XFD, 0XE8, 0XFD, + 0X63, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0XE0, 0XFC, + 0XE0, 0XFC, 0XA0, 0XFC, 0X60, 0XFC, 0X20, 0XFC, 0X41, 0XD3, 0XC5, 0X49, 0X45, 0X19, 0XC4, 0X38, + 0X82, 0X68, 0X41, 0X88, 0X00, 0X70, 0X49, 0X5A, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFB, 0XF6, 0X82, 0XC0, 0X00, 0XD0, 0X86, 0XC1, + 0X46, 0XF1, 0X41, 0XC8, 0X45, 0X79, 0X89, 0X52, 0X88, 0X62, 0X86, 0X6A, 0XC6, 0X7A, 0XC4, 0XBB, + 0XE1, 0XFC, 0X60, 0XFD, 0X60, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XFC, + 0X60, 0XE4, 0X03, 0X93, 0X84, 0X72, 0X44, 0X6A, 0XC5, 0X41, 0X45, 0X29, 0XC3, 0X58, 0X41, 0XA8, + 0X40, 0X98, 0X00, 0XB0, 0X00, 0X60, 0X0C, 0X6B, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCE, 0X83, 0X82, 0X88, 0X00, 0XF8, 0XC4, 0XD8, + 0X0C, 0XF3, 0X8A, 0XFA, 0X82, 0XE8, 0X82, 0XB0, 0X45, 0X69, 0XC7, 0X51, 0X08, 0X42, 0X08, 0X3A, + 0X86, 0X5A, 0X83, 0X9B, 0XA2, 0XBC, 0X22, 0XCD, 0X21, 0XCD, 0XA1, 0XC4, 0X22, 0XB4, 0XC4, 0X7A, + 0X06, 0X3A, 0X86, 0X29, 0X45, 0X29, 0X05, 0X31, 0XC4, 0X50, 0X41, 0X90, 0X00, 0XC0, 0X00, 0XA8, + 0X00, 0XA0, 0X00, 0XA8, 0X00, 0X30, 0X4A, 0X4A, 0XBA, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X8E, 0X73, 0XC3, 0X18, 0X05, 0X39, 0X82, 0XA8, 0X00, 0XF8, + 0XC3, 0XF8, 0X4D, 0XFB, 0X4D, 0XFB, 0XC7, 0XF9, 0XC3, 0XF0, 0X82, 0XD8, 0XC3, 0XB0, 0X04, 0X81, + 0X45, 0X61, 0X46, 0X51, 0X86, 0X49, 0X86, 0X49, 0X46, 0X41, 0X45, 0X41, 0X45, 0X41, 0X45, 0X41, + 0X05, 0X49, 0X04, 0X61, 0X82, 0X90, 0X41, 0XB0, 0X00, 0XD0, 0X00, 0XC8, 0X00, 0XA8, 0X00, 0XA8, + 0X00, 0XB8, 0X41, 0X58, 0X82, 0X10, 0X82, 0X10, 0XB2, 0X94, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0XCF, 0X7B, 0X82, 0X10, 0X04, 0X21, 0X86, 0X29, 0X86, 0X41, 0X04, 0X99, + 0X40, 0XE8, 0X41, 0XF8, 0X86, 0XF9, 0XCB, 0XFA, 0X49, 0XFA, 0X82, 0XF8, 0X00, 0XF8, 0X00, 0XF0, + 0X00, 0XE8, 0X41, 0XD8, 0X41, 0XD0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0XC8, + 0X00, 0XD0, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XD0, 0X00, 0XB8, 0X00, 0XA8, 0X41, 0X88, + 0X82, 0X48, 0X82, 0X10, 0X82, 0X10, 0X00, 0X00, 0X45, 0X29, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XF3, 0X9C, 0X82, 0X10, 0XC3, 0X18, 0X45, 0X29, 0X86, 0X31, 0XC7, 0X31, 0X30, 0X7C, + 0XF3, 0XDC, 0X86, 0XE1, 0X00, 0XF0, 0X00, 0XF8, 0X41, 0XF8, 0X41, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XE0, 0X00, 0XD8, 0X00, 0XC8, 0X41, 0XA0, 0X8A, 0X9A, 0X0C, 0X63, + 0X04, 0X11, 0X82, 0X10, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X4D, 0X6B, 0X7D, 0XEF, 0XFF, 0XFF, + 0XFB, 0XDE, 0X08, 0X42, 0X42, 0X10, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X49, 0X4A, 0X38, 0XBE, + 0XFF, 0XFF, 0X38, 0XD6, 0X86, 0XA9, 0X00, 0XC8, 0X00, 0XE0, 0X00, 0XF0, 0X00, 0XF8, 0X00, 0XF8, + 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X00, 0XF0, + 0X00, 0XE8, 0X00, 0XE0, 0X00, 0XD0, 0XC3, 0X98, 0X8A, 0X8A, 0XB2, 0XA4, 0XBA, 0XC6, 0XF7, 0XB5, + 0X08, 0X42, 0X41, 0X08, 0X82, 0X10, 0X41, 0X08, 0X00, 0X00, 0X45, 0X29, 0XF7, 0XBD, 0XFF, 0XFF, + 0X71, 0X8C, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X86, 0X31, 0X86, 0X31, 0X0C, 0X63, 0X3C, 0XE7, + 0XFF, 0XFF, 0X79, 0XD6, 0X46, 0XB9, 0X00, 0XE0, 0X42, 0XC8, 0X82, 0XA8, 0X82, 0XB0, 0X41, 0XD8, + 0X82, 0XE8, 0X82, 0XF0, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XE8, 0X41, 0XF0, 0X41, 0XE8, 0X41, 0XD8, + 0X04, 0XC1, 0X08, 0X92, 0X4D, 0X8B, 0X34, 0XA5, 0XFB, 0XC6, 0XFB, 0XD6, 0XBA, 0XCE, 0X3C, 0XE7, + 0X30, 0X84, 0XC3, 0X18, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X41, 0X08, 0XCF, 0X7B, 0X7D, 0XEF, + 0X49, 0X4A, 0X00, 0X00, 0X04, 0X21, 0X45, 0X29, 0X46, 0X31, 0X86, 0X31, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XF7, 0XF7, 0XDD, 0X09, 0XDA, 0X83, 0XF8, 0X01, 0XF0, 0X42, 0XC0, 0X82, 0X98, 0X49, 0X9A, + 0XF3, 0XB4, 0XF3, 0XCC, 0X71, 0XBC, 0X8E, 0XBB, 0X8E, 0XBB, 0X30, 0XBC, 0X71, 0XBC, 0XF3, 0XBC, + 0XB6, 0XBD, 0XFB, 0XCE, 0XBE, 0XE7, 0X7D, 0XE7, 0X3B, 0XDF, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, + 0X75, 0XAD, 0X86, 0X31, 0X41, 0X08, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X49, 0X4A, 0XFB, 0XDE, + 0X04, 0X21, 0X41, 0X08, 0X04, 0X21, 0X45, 0X29, 0X45, 0X29, 0X87, 0X39, 0XB2, 0X94, 0XFF, 0XFF, + 0XBE, 0XF7, 0X34, 0XDD, 0X0C, 0XEB, 0X09, 0XFA, 0X00, 0XF0, 0X01, 0XD8, 0X00, 0XD8, 0X8B, 0XD2, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XFF, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0X78, 0XC6, 0XC7, 0X39, 0X00, 0X00, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X79, 0XCE, + 0X00, 0X00, 0X82, 0X10, 0XC3, 0X18, 0X04, 0X21, 0X05, 0X29, 0X86, 0X31, 0XB3, 0X9C, 0XFF, 0XFF, + 0XFF, 0XF7, 0X75, 0XDD, 0XC7, 0XE9, 0XC7, 0XF9, 0X01, 0XF8, 0X01, 0XF0, 0X00, 0XE8, 0X49, 0XE2, + 0XFB, 0XEE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, + 0XB9, 0XCE, 0X08, 0X42, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XC7, 0X39, 0X38, 0XC6, + 0X00, 0X00, 0X82, 0X10, 0X82, 0X10, 0X04, 0X21, 0X04, 0X21, 0X45, 0X29, 0X30, 0X84, 0XFF, 0XFF, + 0XFF, 0XFF, 0X38, 0XDE, 0XC4, 0XD0, 0X00, 0XF0, 0X01, 0XF8, 0X00, 0XF8, 0X00, 0XF0, 0X08, 0XD2, + 0XFB, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XBA, 0XD6, + 0X79, 0XCE, 0XC7, 0X39, 0X41, 0X08, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X00, 0X00, 0X00, 0X00, 0XC3, 0X18, 0XCB, 0X5A, 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X7D, 0XEF, + 0XFF, 0XFF, 0X7D, 0XEF, 0XCF, 0XBB, 0XC3, 0XB0, 0X41, 0XD0, 0X41, 0XD0, 0X82, 0XB8, 0X4D, 0XB3, + 0X7D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0XBE, 0XF7, 0X3D, 0XEF, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFA, 0XD6, + 0XF7, 0XBD, 0X04, 0X21, 0X86, 0X31, 0X04, 0X21, 0X00, 0X00, 0X00, 0X00, 0X86, 0X31, 0X38, 0XC6, + 0X86, 0X31, 0XC3, 0X18, 0XCB, 0X5A, 0X75, 0XAD, 0XCF, 0X7B, 0X41, 0X08, 0X86, 0X31, 0XF7, 0XBD, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XEF, 0X74, 0XB5, 0X30, 0X9C, 0X30, 0X9C, 0X72, 0XA4, 0XBB, 0XD6, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBE, 0XF7, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0X3C, 0XE7, + 0X71, 0X8C, 0X81, 0X08, 0X0C, 0X63, 0XCF, 0X7B, 0X82, 0X10, 0X00, 0X00, 0X8A, 0X52, 0X38, 0XC6, + 0X75, 0XAD, 0X71, 0X8C, 0XB6, 0XB5, 0X3C, 0XE7, 0XFB, 0XDE, 0XC7, 0X39, 0X00, 0X00, 0XCF, 0X73, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X7D, 0XEF, 0X3B, 0XDF, 0XFA, 0XD6, 0X79, 0XCE, 0X79, 0XCE, 0XFB, 0XDE, 0XB9, 0XCE, + 0XC7, 0X39, 0XC4, 0X20, 0X71, 0X8C, 0XBA, 0XD6, 0X71, 0X8C, 0XCB, 0X5A, 0XB2, 0X94, 0XBA, 0XD6, + 0XFF, 0XFF, 0X7D, 0XEF, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB6, 0XB5, 0X46, 0X29, 0X05, 0X19, + 0X75, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, + 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XBA, 0XD6, 0XFC, 0XDE, 0X4E, 0X63, + 0X42, 0X08, 0X0C, 0X63, 0XF7, 0XBD, 0XBE, 0XF7, 0XFF, 0XFF, 0XFB, 0XDE, 0XFB, 0XDE, 0XBE, 0XF7, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF4, 0X9C, 0X04, 0X21, + 0X05, 0X21, 0XB6, 0XA5, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, + 0X3C, 0XE7, 0XFB, 0XDE, 0XBA, 0XD6, 0X79, 0XCE, 0XFB, 0XDE, 0XBB, 0XD6, 0XD1, 0X73, 0X83, 0X18, + 0X86, 0X39, 0X34, 0X9D, 0XBD, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XFF, 0X35, 0XD6, 0XEB, 0XCC, 0X43, 0XB3, + 0X40, 0X51, 0X05, 0X19, 0XF5, 0X8C, 0XBE, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, + 0XFB, 0XDE, 0XBA, 0XDE, 0XBA, 0XD6, 0X3C, 0XDF, 0X3A, 0XBE, 0X4F, 0X63, 0X82, 0X49, 0X40, 0XA3, + 0X23, 0XB4, 0XCC, 0X83, 0X3A, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBF, 0XF7, 0XB5, 0XBD, 0X82, 0X92, 0X20, 0XF4, 0XA0, 0XFC, + 0X60, 0XE4, 0X40, 0X82, 0X84, 0X41, 0X8F, 0X6B, 0X77, 0XAD, 0X3D, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0XFF, 0XBE, 0XF7, 0XBE, 0XF7, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X3C, 0XE7, 0XFB, 0XDE, + 0XFB, 0XDE, 0X3D, 0XE7, 0XBB, 0XCE, 0X36, 0X9D, 0X0B, 0X6B, 0X41, 0X6A, 0X60, 0XC4, 0X20, 0XFE, + 0X60, 0XF5, 0X00, 0X8B, 0XC7, 0X6A, 0X38, 0XC6, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0X4B, 0X7B, 0X80, 0XB2, 0XA0, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0XE0, 0XFC, 0XC0, 0XCB, 0XC1, 0X8A, 0X45, 0X62, 0X4D, 0X6B, 0XB3, 0X94, 0XF7, 0XBD, + 0X3D, 0XDF, 0XFF, 0XF7, 0XFF, 0XFF, 0XBE, 0XF7, 0X7D, 0XEF, 0X7D, 0XEF, 0X7D, 0XE7, 0X3D, 0XDF, + 0XBA, 0XC6, 0X75, 0XA5, 0X8D, 0X7B, 0X84, 0X7A, 0X40, 0XB3, 0XE0, 0XEC, 0XE0, 0XFD, 0XE0, 0XFD, + 0X60, 0XF5, 0X20, 0XE5, 0XA0, 0XD4, 0X0A, 0X6B, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7D, 0XEF, 0XCC, 0X93, 0X40, 0XEB, 0X60, 0XFC, 0XA0, 0XFC, + 0XE0, 0XFC, 0X20, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XD4, 0XC0, 0XBB, 0X42, 0X9B, 0X45, 0X8B, + 0X6B, 0X9C, 0XAE, 0X9C, 0X71, 0X8C, 0XB3, 0X94, 0X33, 0X9D, 0X34, 0XA5, 0XF2, 0XA4, 0XF0, 0XB4, + 0XCA, 0X9B, 0X04, 0X9B, 0X40, 0XBB, 0X20, 0XE4, 0X20, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0X20, 0XC4, 0X88, 0X5A, 0X38, 0XBE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X78, 0XD6, 0X46, 0XAB, 0X40, 0XDB, 0X20, 0XF4, + 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0X60, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XDC, + 0XC0, 0XB3, 0XC0, 0X51, 0X86, 0X29, 0X0D, 0X63, 0X8F, 0X7B, 0X0D, 0X5B, 0XC7, 0X41, 0X01, 0X82, + 0X00, 0XC3, 0XC0, 0XE3, 0X60, 0XFC, 0XA0, 0XFC, 0XE0, 0XFC, 0XE0, 0XFC, 0X60, 0XF5, 0X60, 0XF5, + 0X20, 0XE5, 0X80, 0X9B, 0X86, 0X62, 0X30, 0X84, 0X79, 0XCE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X38, 0XC6, 0X2D, 0X9C, 0X05, 0X93, + 0X43, 0XA3, 0X82, 0XB3, 0XC2, 0XBB, 0XC2, 0XBB, 0X22, 0XB4, 0X82, 0XA3, 0X42, 0X93, 0XC3, 0X7A, + 0X85, 0X62, 0X0B, 0X63, 0X71, 0X84, 0XB6, 0XB5, 0X79, 0XCE, 0X79, 0XC6, 0XB5, 0XAD, 0X70, 0X94, + 0X4A, 0X8B, 0X06, 0X83, 0X04, 0X93, 0X04, 0X9B, 0X43, 0X9B, 0X43, 0X9B, 0X43, 0X93, 0X04, 0X83, + 0X08, 0X73, 0X8D, 0X73, 0XB3, 0X94, 0X79, 0XCE, 0X7D, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3C, 0XDF, 0X38, 0XBE, + 0X75, 0XB5, 0X33, 0XA5, 0X33, 0XA5, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X9C, 0XF3, 0X94, 0XF3, 0X9C, + 0X35, 0XA5, 0XF8, 0XBD, 0XFB, 0XDE, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X7E, 0XEF, + 0XBB, 0XD6, 0XF8, 0XBD, 0XB6, 0XAD, 0X75, 0XAD, 0X34, 0XA5, 0X33, 0X9D, 0X34, 0X9D, 0X35, 0XA5, + 0XB7, 0XAD, 0X79, 0XC6, 0X3C, 0XE7, 0XBE, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char PROGMEM icon_40x40[3200] = { /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0X71, 0X8C, 0X31, 0X84, 0X31, 0X84, + 0X93, 0XC5, 0X92, 0XCD, 0X91, 0XCD, 0X91, 0XD5, 0X91, 0XD5, 0X91, 0XCD, 0X72, 0XCD, 0X72, 0XC5, + 0X56, 0XDE, 0XBE, 0XFF, 0XDB, 0XDE, 0XFB, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCE, 0X7B, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X5A, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0X20, 0XDD, 0XE0, 0XD4, 0XA0, 0XD4, + 0X61, 0XA3, 0XA7, 0X39, 0XE5, 0X18, 0X05, 0X21, 0X92, 0X94, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XEE, 0XEB, 0X9B, 0XA1, 0X18, 0X23, 0X73, 0X81, 0XC5, 0X21, 0X9C, + 0X61, 0X39, 0X81, 0XEE, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XE0, 0XFE, 0X40, 0XFF, 0XC0, 0XF6, + 0XC0, 0X49, 0XA0, 0X18, 0X00, 0X42, 0X60, 0X18, 0X00, 0X00, 0X74, 0XB5, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X93, 0XCD, 0XC3, 0XBB, 0XA0, 0X51, 0XE1, 0X39, 0XC2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0X63, 0XBD, 0X61, 0XE6, 0X40, 0XFF, 0XE0, 0XFE, 0XE0, 0XFE, 0XC0, 0XFE, 0X60, 0XFF, 0X21, 0X73, + 0XE1, 0X28, 0X81, 0XEE, 0X61, 0XFF, 0X21, 0XEE, 0XA0, 0X41, 0X20, 0X08, 0X90, 0XCD, 0XDE, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, + 0X0B, 0XAC, 0XC0, 0XB3, 0XA1, 0XEE, 0XC3, 0X5A, 0X22, 0X8C, 0XE1, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0XC0, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XA1, 0XAC, + 0X21, 0XC5, 0X20, 0XFF, 0X60, 0XFE, 0X00, 0XFF, 0X02, 0XDE, 0XE0, 0X20, 0X40, 0X82, 0X49, 0XBC, + 0X3B, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X5C, 0XF7, 0X67, 0X9B, + 0XE0, 0XB3, 0X81, 0XFF, 0XC3, 0XFF, 0X83, 0X9C, 0X82, 0XDE, 0XC0, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0XE0, 0XFE, 0XA2, 0XB4, 0X41, 0XBC, 0X20, 0XCC, + 0X87, 0XA3, 0XB8, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0XA8, 0XA3, 0X60, 0XBC, + 0XA2, 0XFF, 0XA5, 0XFF, 0X44, 0XFF, 0XA1, 0XFF, 0XA0, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X40, 0XFE, + 0XE0, 0XCB, 0XE3, 0X92, 0X7C, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X4C, 0XAC, 0XC0, 0XB3, 0XA4, 0XFF, + 0XA6, 0XFF, 0X45, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XE0, 0XC3, 0X2A, 0XAC, 0X7D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XD4, 0XD5, 0X40, 0XAB, 0X43, 0XFF, 0XA8, 0XFF, + 0X67, 0XFF, 0X62, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XA2, 0X11, 0XBD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XDA, 0XE6, 0XE4, 0X9A, 0XE1, 0XE5, 0XE8, 0XFF, 0X69, 0XFF, + 0X65, 0XFF, 0X60, 0XFF, 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0X00, 0XFF, 0X20, 0XFF, 0XE0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, 0X00, 0XFE, + 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XE4, 0X85, 0XAB, 0XFA, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X2B, 0XB4, 0XC0, 0XB3, 0XC8, 0XFF, 0X8C, 0XFF, 0X68, 0XFF, + 0X61, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0XA1, 0XDE, 0X61, 0XEF, + 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X60, 0XFF, 0XC0, 0XFF, 0X61, 0XDE, 0X00, 0XE6, 0X80, 0XFE, 0X40, 0XFE, 0X00, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XC0, 0XC3, 0XE9, 0XAB, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X5D, 0XEF, 0XA3, 0XAB, 0XA3, 0XF6, 0XCC, 0XFF, 0X4C, 0XFF, 0X64, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0X61, 0XEF, 0X22, 0X6B, 0X82, 0X5A, 0X82, 0XB5, + 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0XA0, 0XFF, 0XE1, 0XFF, 0X42, 0X8C, 0XC1, 0X41, 0X21, 0XA4, 0XA0, 0XFE, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X20, 0XF5, 0XC0, 0X9A, 0X35, 0XD6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X51, 0XC5, 0X60, 0XBC, 0XC9, 0XFF, 0X8E, 0XFF, 0X6A, 0XFF, 0X61, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XE1, 0XFF, 0XE1, 0X62, 0X80, 0X10, 0X05, 0XE7, 0XA4, 0XF7, + 0XE4, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XC1, 0XFF, 0XE2, 0X83, 0X40, 0X08, 0X22, 0XCE, 0X60, 0XF7, 0XA0, 0XFE, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0XA0, 0XFD, 0XA0, 0XC3, 0XAC, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XDE, 0XFF, 0XA7, 0XAB, 0X81, 0XDD, 0XED, 0XFF, 0XB0, 0XFF, 0X69, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X61, 0XD6, 0X22, 0X29, 0XA6, 0X31, 0XE3, 0X7B, 0X46, 0XEF, + 0XE6, 0XFF, 0XE4, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X81, 0XD6, 0XA0, 0X18, 0XC4, 0X18, 0XA1, 0X62, 0XC1, 0XCD, 0X40, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0XA0, 0XEC, 0X48, 0XBC, 0XDF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF9, 0XE6, 0XE3, 0X9A, 0X67, 0XEE, 0XD1, 0XFF, 0XB0, 0XFF, 0X86, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0X60, 0X94, 0X91, 0X73, 0XD9, 0XBD, 0X00, 0X00, 0X05, 0X84, + 0XE8, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XE9, 0X41, 0XB7, 0XB5, 0X01, 0X00, 0X60, 0X62, 0X21, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XF5, 0XE3, 0XBB, 0XD9, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XD3, 0XCD, 0X40, 0XA3, 0X2B, 0XF7, 0XD3, 0XFF, 0XB0, 0XFF, 0X63, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA0, 0X9C, 0X30, 0X6B, 0X97, 0XB5, 0X00, 0X00, 0X83, 0X52, + 0XC6, 0XFF, 0XE5, 0XFF, 0XE3, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0X20, 0XAD, 0XEA, 0X41, 0X77, 0XAD, 0X01, 0X00, 0XC0, 0X49, 0XE0, 0XF6, 0XA0, 0XFE, 0X20, 0XFE, + 0XE0, 0XFD, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0XA0, 0XBB, 0XD3, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X00, 0XB4, 0X8E, 0XFF, 0XF4, 0XFF, 0XB0, 0XFF, 0X42, 0XFF, 0X60, 0XFF, + 0X80, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X25, 0X8C, + 0XE5, 0XFF, 0XE3, 0XFF, 0XE2, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, + 0XE1, 0XDE, 0X01, 0X21, 0X00, 0X00, 0X00, 0X00, 0X61, 0X5A, 0X20, 0XFF, 0X80, 0XFE, 0X20, 0XFE, + 0X00, 0XFE, 0XE0, 0XFD, 0XA0, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XC0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XB0, 0XFF, 0XF5, 0XFF, 0X8F, 0XFF, 0X41, 0XFF, 0X80, 0XFF, + 0XA0, 0XFF, 0XC0, 0XFF, 0XE0, 0XFF, 0XE1, 0XFF, 0X21, 0X8C, 0X60, 0X10, 0X43, 0X6B, 0X44, 0XEF, + 0XE2, 0XFF, 0XE2, 0XFF, 0XE1, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0XE1, 0XFF, 0XC1, 0XA4, 0XC2, 0X18, 0XA2, 0X39, 0XA1, 0XCD, 0X20, 0XFF, 0X60, 0XFE, 0X20, 0XFE, + 0XC0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0XE0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X40, 0XC4, 0XD2, 0XFF, 0XF7, 0XFF, 0XAF, 0XFF, 0X01, 0XFF, 0X00, 0XFF, + 0X00, 0XFF, 0X40, 0XFF, 0XA0, 0XFF, 0XE0, 0XFF, 0XA1, 0XFF, 0X82, 0XD6, 0XC2, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0XC1, 0XFF, 0X82, 0XDE, 0XC2, 0XEE, 0X61, 0XFF, 0X80, 0XFE, 0XC0, 0XFD, 0X20, 0XFD, + 0XA1, 0XFC, 0X61, 0XFC, 0X61, 0XFC, 0XC0, 0XFC, 0X60, 0XFD, 0XE0, 0XCB, 0X51, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X60, 0XC4, 0XD4, 0XFF, 0XF9, 0XFF, 0X2D, 0XFF, 0X00, 0XFE, 0XC0, 0XFD, + 0XA1, 0XFD, 0X21, 0XFE, 0XE0, 0XFE, 0XC0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, 0XE0, 0XFF, + 0XE0, 0XFF, 0XE0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X80, 0XFF, 0X20, 0XFF, 0XA0, 0XFE, 0X20, 0XFE, 0X01, 0XFD, 0X01, 0XFC, + 0X62, 0XFB, 0X42, 0XFB, 0X82, 0XFB, 0X21, 0XFC, 0X20, 0XFD, 0X00, 0XD4, 0X71, 0XC5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0X20, 0XC4, 0XD4, 0XFF, 0XBA, 0XFF, 0X2E, 0XFE, 0XE1, 0XFC, 0X61, 0XFC, + 0X61, 0XFC, 0X01, 0XFD, 0X01, 0XFE, 0X20, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XC0, 0XFF, 0XC0, 0XFF, + 0XC0, 0XFF, 0XC0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X80, 0XFD, 0X61, 0XFC, 0X62, 0XFB, + 0XA3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0XE0, 0XFC, 0XE0, 0XCB, 0X71, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X50, 0XCD, 0XC0, 0XB3, 0XB3, 0XFF, 0X7A, 0XFF, 0X91, 0XFD, 0X03, 0XFC, 0X02, 0XFB, + 0X22, 0XFB, 0X62, 0XFC, 0X81, 0XFD, 0XC0, 0XFE, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, 0XA0, 0XFF, + 0XA0, 0XFF, 0XA0, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X20, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, 0X60, 0XFE, 0X60, 0XFD, 0X41, 0XFC, 0X62, 0XFB, + 0XC3, 0XFA, 0XA3, 0XFA, 0X42, 0XFB, 0X01, 0XFC, 0X20, 0XFD, 0XC0, 0XCB, 0X91, 0XCD, 0XFF, 0XFF, + 0XFF, 0XFF, 0X14, 0XD6, 0X20, 0XAB, 0X51, 0XF7, 0XBE, 0XFF, 0X17, 0XFE, 0X65, 0XFC, 0X61, 0XFB, + 0XA2, 0XFB, 0XA1, 0XFC, 0XC1, 0XFD, 0X00, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, + 0X80, 0XFF, 0X80, 0XFF, 0X80, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X20, 0XFF, + 0X00, 0XFF, 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0XC0, 0XFD, 0XC0, 0XFC, 0X41, 0XFC, + 0XC1, 0XFB, 0XA2, 0XFB, 0X01, 0XFC, 0XA0, 0XFC, 0X40, 0XFD, 0XA0, 0XC3, 0XF4, 0XD5, 0XFF, 0XFF, + 0XFF, 0XFF, 0X5B, 0XEF, 0X24, 0X9B, 0X49, 0XE6, 0XB8, 0XFF, 0X92, 0XFE, 0X25, 0XFD, 0XA0, 0XFC, + 0X02, 0XFD, 0XE1, 0XFD, 0XE0, 0XFE, 0X40, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X00, 0XFF, + 0XC0, 0XFE, 0XA0, 0XFE, 0X80, 0XFE, 0X40, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X80, 0XFD, 0X01, 0XF5, + 0X41, 0XFD, 0X01, 0XFD, 0XC0, 0XFC, 0X40, 0XFD, 0X00, 0XF5, 0XC4, 0XBB, 0XFA, 0XE6, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X2A, 0XB4, 0XA0, 0XD4, 0XA2, 0XFE, 0X20, 0XFE, 0XE0, 0XFD, 0X00, 0XFE, + 0X80, 0XFE, 0X21, 0XEE, 0X41, 0XE6, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, + 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, + 0XA0, 0XFE, 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X00, 0XFE, 0X40, 0XCC, + 0XE1, 0XAB, 0XC1, 0XED, 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XE4, 0X29, 0XB4, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X15, 0XD6, 0XE0, 0XBB, 0X60, 0XFE, 0XC8, 0XFE, 0XC8, 0XFE, 0X02, 0XFF, + 0X60, 0XDD, 0X40, 0XA3, 0XA1, 0XDD, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, + 0X20, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, 0XC0, 0XFE, 0XC0, 0XFE, 0XA0, 0XFE, + 0X80, 0XFE, 0X60, 0XFE, 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X40, 0XED, + 0XC0, 0X9A, 0X40, 0XA3, 0X80, 0XF5, 0X60, 0XFD, 0X60, 0XBB, 0XEE, 0XBC, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X63, 0XAB, 0X42, 0XE5, 0XB4, 0XFF, 0X97, 0XFF, 0XAA, 0XF6, + 0X80, 0XAB, 0XA0, 0X92, 0XA1, 0XDD, 0X41, 0XFF, 0X40, 0XFF, 0X60, 0XFF, 0X60, 0XFF, 0X60, 0XFF, + 0X60, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X40, 0XFF, 0X20, 0XFF, 0X20, 0XFF, 0X00, 0XFF, 0XE0, 0XFE, + 0XC0, 0XFE, 0X80, 0XFE, 0X61, 0XFE, 0X00, 0XFE, 0XA0, 0XED, 0X20, 0XE5, 0X21, 0XCC, 0X80, 0XB3, + 0X00, 0XBC, 0XE0, 0XC3, 0X40, 0XED, 0XC0, 0XEC, 0X60, 0X92, 0X97, 0XE6, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XC5, 0X00, 0XA3, 0XAA, 0XF6, 0X93, 0XFF, 0X2D, 0XEE, + 0X63, 0XDD, 0X80, 0XD5, 0X42, 0XB4, 0X82, 0XCC, 0X00, 0XCD, 0X40, 0XD5, 0XA0, 0XDD, 0XE1, 0XE5, + 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0XC1, 0XE5, 0X80, 0XDD, 0X60, 0XDD, 0X20, 0XD5, 0XC0, 0XCC, + 0XA0, 0XCC, 0X61, 0XC4, 0X21, 0XC4, 0X01, 0XBC, 0X01, 0XBC, 0XE0, 0XBB, 0XC0, 0XBB, 0X60, 0XD4, + 0X80, 0XFD, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XBB, 0X2B, 0XAC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9D, 0XF7, 0X87, 0XA3, 0X60, 0XD4, 0X0A, 0XFF, 0XCF, 0XFE, + 0XC9, 0XFE, 0XC0, 0XFE, 0XC0, 0XF6, 0X40, 0XE6, 0X41, 0XCD, 0X42, 0XB4, 0XC1, 0XAB, 0X60, 0XA3, + 0X60, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0X80, 0XA3, 0XA0, 0XAB, 0XC1, 0XAB, 0XE1, 0XB3, 0X22, 0XB4, + 0X82, 0XC4, 0XC0, 0XCC, 0X00, 0XD5, 0X60, 0XE5, 0X81, 0XED, 0X80, 0XF5, 0X80, 0XFD, 0X80, 0XFD, + 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XE4, 0X85, 0XAB, 0X5C, 0XEF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFA, 0XE6, 0X23, 0XA3, 0XE0, 0XE4, 0XE8, 0XFE, + 0X6A, 0XFE, 0X05, 0XFE, 0X40, 0XFE, 0XA0, 0XFE, 0XC0, 0XFE, 0XE1, 0XFE, 0XA0, 0XF6, 0XA0, 0XF6, + 0XA0, 0XF6, 0XA0, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X80, 0XF6, 0X60, 0XF6, 0X61, 0XFE, 0X81, 0XFE, + 0X61, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XC0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X20, 0XFD, 0X20, 0XFD, + 0X60, 0XFD, 0X20, 0XF5, 0XA0, 0XA2, 0XB4, 0XCD, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X52, 0XC5, 0XE0, 0XA2, 0XA1, 0XF5, + 0X86, 0XFE, 0X06, 0XFE, 0XE2, 0XFD, 0XE0, 0XFD, 0X00, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, + 0X40, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X20, 0XFE, 0X00, 0XFE, 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, + 0XA0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, + 0X60, 0XFD, 0X60, 0XBB, 0X6C, 0XB4, 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X92, 0XCD, 0XC0, 0XA2, + 0X20, 0XED, 0X22, 0XFE, 0XC1, 0XFD, 0XA0, 0XFD, 0XC0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, 0XE0, 0XFD, + 0XE0, 0XFD, 0XE0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X60, 0XFD, 0X40, 0XFD, + 0X20, 0XB3, 0XEA, 0XA3, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8E, 0XBC, + 0XE1, 0XA2, 0X00, 0XE5, 0XE0, 0XFD, 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, + 0XC0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0XA0, 0XFD, 0X80, 0XFD, 0X80, 0XFD, 0X60, 0XFD, + 0X40, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X80, 0XFD, 0X00, 0XF5, 0X40, 0XBB, + 0X2B, 0XAC, 0X9D, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X35, 0XD6, 0XE2, 0X9A, 0XA0, 0XC3, 0XA0, 0XFD, 0XE0, 0XFD, 0X80, 0XFD, 0X60, 0XFD, 0X80, 0XFD, + 0X80, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X20, 0XFD, 0X20, 0XFD, 0X40, 0XFD, 0X60, 0XFD, 0X60, 0XFD, 0X00, 0XD4, 0XC1, 0X9A, 0X10, 0XC5, + 0XDE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X98, 0XDE, 0X2B, 0XAC, 0X40, 0XB3, 0X00, 0XD4, 0X40, 0XFD, 0X80, 0XFD, 0X80, 0XFD, + 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, 0X40, 0XFD, + 0X40, 0XFD, 0X60, 0XFD, 0X40, 0XFD, 0X40, 0XDC, 0X80, 0XBB, 0XE8, 0XAB, 0X57, 0XDE, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XDF, 0XFF, 0X37, 0XD6, 0X86, 0XA3, 0XC0, 0X9A, 0XE0, 0XCB, 0X80, 0XEC, + 0XE0, 0XF4, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X20, 0XFD, 0X00, 0XF5, + 0XA0, 0XEC, 0X00, 0XD4, 0X40, 0XB3, 0X03, 0X9B, 0X92, 0XC5, 0XBD, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XBE, 0XF7, 0XF5, 0XCD, 0XAD, 0XBC, 0X69, 0XBC, + 0X05, 0XBC, 0X03, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0X01, 0XC4, 0XE2, 0XC3, 0X24, 0XC4, + 0X68, 0XBC, 0XAC, 0XBC, 0XD3, 0XCD, 0X9E, 0XF7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5B, 0XEF, 0X98, 0XDE, 0X56, 0XD6, 0X57, 0XD6, 0X57, 0XD6, 0X56, 0XD6, 0X77, 0XDE, 0X1B, 0XEF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/readpixel_kbv/readpixel_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/readpixel_kbv/readpixel_kbv.ino new file mode 100644 index 0000000..0fea603 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/readpixel_kbv/readpixel_kbv.ino @@ -0,0 +1,135 @@ +#define LCD_CS A3 // Chip Select goes to Analog 3 +#define LCD_CD A2 // Command/Data goes to Analog 2 +#define LCD_WR A1 // LCD Write goes to Analog 1 +#define LCD_RD A0 // LCD Read goes to Analog 0 +#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin + +#include // Hardware-specific library +#include +MCUFRIEND_kbv tft; + +//#include // Hardware-specific library +//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); +//Adafruit_TFTLCD tft; + +// Assign human-readable names to some common 16-bit color values: +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +void setup(void); +void loop(void); + +uint16_t g_identifier; + +void setup(void) { + tft.reset(); + g_identifier = tft.readID(); + + Serial.begin(9600); + Serial.print("readID = 0x"); + Serial.println(g_identifier, HEX); + if (g_identifier == 0xFFFF) g_identifier = 0x9341; + if (g_identifier == 0) { + Serial.println("Unknown ID"); + while (1); + } + + tft.begin(g_identifier); + tft.setRotation(0); +} + +uint16_t colors[] = { + BLACK, BLUE +}; + +void colordump(uint16_t x, uint16_t y) +{ + uint16_t pixel, pixels[32]; + char i, j, buf[20], dirty; + uint8_t wid = (tft.width() - 9 * 6)/ (5 * 6), ht = (tft.height() / 8) - 1; + tft.setTextColor(WHITE); + tft.setTextSize(1); + for (j = 0; j < ht; j++) { + sprintf(buf, "%3d,%3d:", x, y + j); + tft.print(buf); + dirty = 1; + for (i = 0; i < wid; i++) { +#if 1 && defined(MCUFRIEND_KBV_H_) + if (dirty) tft.readGRAM(x, y + j, pixels, wid, 1); + dirty = 0; + pixel = pixels[i]; +#else + pixel = tft.readPixel(x + i, y + j); +#endif + tft.print(" "); + if (pixel == WHITE) tft.setTextColor(GREEN); + sprintf(buf, "%04X", pixel); + tft.print(buf); + tft.setTextColor(WHITE); + } + tft.println(); + } +} + +uint16_t bgr(uint16_t color) +{ + return ((color & 0xF800) >> 11) | (color & 0x7E0) | (color & 0x1F) << 11; +} + +void duffcolor(uint16_t color) +{ + uint16_t pixel, x, y; + char done, buf[20]; + uint16_t BGR = bgr(color); + for (done = 0, y = 0; y < 320 && !done; y++) { + for (x= 0; x < 240; x++) { + // pixel = readxy(x, y); + pixel = tft.readPixel(x, y); + if (pixel != BGR) { + done = 1; + sprintf(buf, "0x%04X @ %d, %d", pixel, x, y); + tft.println(buf); + break; + } + } + } +} + +uint8_t aspect; +char *aspectname[] = { + "PORTRAIT", "LANDSCAPE", "PORTRAIT_REV", "LANDSCAPE_REV" +}; + +void loop(void) +{ + uint16_t iter, color; + char buf[80]; + aspect = (aspect + 1) & 3; + tft.setRotation(aspect); + for (iter = 0; iter < sizeof(colors) / sizeof(uint16_t); iter++) { + color = colors[iter]; + tft.fillScreen(color); + tft.setTextColor(WHITE); + tft.setTextSize(1); + tft.setCursor(0, 0); + sprintf(buf, "ID=0x%04X Background=%04X %s", + tft.readID(), color, aspectname[aspect]); + tft.println(buf); + colordump(6 * 6, 0); + // duffcolor(color); + delay(5000); + } +} + + + + + + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/scroll_kbv/scroll_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/scroll_kbv/scroll_kbv.ino new file mode 100644 index 0000000..a92db93 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/scroll_kbv/scroll_kbv.ino @@ -0,0 +1,49 @@ +#include // Hardware-specific library +#include +MCUFRIEND_kbv tft; + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +// work in line numbers. Font height in ht +int16_t ht = 16, top = 3, line, lines = 15, scroll; + +void setup() +{ + tft.reset(); + uint16_t id = tft.readID(); + tft.begin(id); + tft.setRotation(0); //Portrait + tft.fillScreen(BLACK); + tft.setTextColor(WHITE, BLACK); + tft.setTextSize(2); // System font is 8 pixels. ht = 8*2=16 + tft.setCursor(100, 0); + tft.print("ID = 0x"); + tft.println(id, HEX); + if (id == 0x9320 || id == 0x9325 || id == 0xB509) { + top = 0; // these controllers scroll full screen + lines = tft.height() / ht; // we are in portrait mode + } + if (id == 0x7783) { + tft.println("can NOT scroll"); + while (1); // die. + } + tft.setCursor(0, 0); + for (line = 1; line < 21; line++) tft.println(String(line) + ": "); +} + +void loop() +{ + tft.setCursor(0, (scroll + top) * ht); + if (++scroll >= lines) scroll = 0; + tft.vertScroll(top * ht, lines * ht, (scroll) * ht); + tft.println(String(line) + ": [" + String(scroll) + "] "); + delay(100); + line++; +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_kbv_Uno/showBMP_kbv_Uno.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_kbv_Uno/showBMP_kbv_Uno.ino new file mode 100644 index 0000000..9711b1d --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_kbv_Uno/showBMP_kbv_Uno.ino @@ -0,0 +1,258 @@ +// MCUFRIEND UNO shields have microSD on pins 10, 11, 12, 13 +// The official library only works on the hardware SPI pins +// e.g. 11, 12, 13 on a Uno (or STM32 Nucleo) +// +// copy all your BMP files to the root directory on the microSD with your PC +// (or another directory) + +#include // f.k. for Arduino-1.5.2 +//#define USE_SDFAT +#include // Use the official SD library on hardware pins + +#include // Hardware-specific library +#include +MCUFRIEND_kbv tft; + +#if defined(ESP32) +#define SD_CS 5 +#else +#define SD_CS 10 +#endif +#define NAMEMATCH "" // "" matches any name +//#define NAMEMATCH "tiger" // *tiger*.bmp +#define PALETTEDEPTH 0 // do not support Palette modes +//#define PALETTEDEPTH 8 // support 256-colour Palette + +char namebuf[32] = "/"; //BMP files in root directory +//char namebuf[32] = "/bitmaps/"; //BMP directory e.g. files in /bitmaps/*.bmp + +File root; +int pathlen; + +void setup() +{ + uint16_t ID; + Serial.begin(9600); + Serial.print("Show BMP files on TFT with ID:0x"); + ID = tft.readID(); + Serial.println(ID, HEX); + if (ID == 0x0D3D3) ID = 0x9481; + tft.begin(ID); + tft.fillScreen(0x001F); + tft.setTextColor(0xFFFF, 0x0000); + bool good = SD.begin(SD_CS); + if (!good) { + Serial.print(F("cannot start SD")); + while (1); + } + root = SD.open(namebuf); + pathlen = strlen(namebuf); +} + +void loop() +{ + char *nm = namebuf + pathlen; + File f = root.openNextFile(); + uint8_t ret; + uint32_t start; + if (f != NULL) { +#ifdef USE_SDFAT + f.getName(nm, 32 - pathlen); +#else + strcpy(nm, (char *)f.name()); +#endif + f.close(); + strlwr(nm); + if (strstr(nm, ".bmp") != NULL && strstr(nm, NAMEMATCH) != NULL) { + Serial.print(namebuf); + Serial.print(F(" - ")); + tft.fillScreen(0); + start = millis(); + ret = showBMP(namebuf, 5, 5); + switch (ret) { + case 0: + Serial.print(millis() - start); + Serial.println(F("ms")); + delay(5000); + break; + case 1: + Serial.println(F("bad position")); + break; + case 2: + Serial.println(F("bad BMP ID")); + break; + case 3: + Serial.println(F("wrong number of planes")); + break; + case 4: + Serial.println(F("unsupported BMP format")); + break; + case 5: + Serial.println(F("unsupported palette")); + break; + default: + Serial.println(F("unknown")); + break; + } + } + } + else root.rewindDirectory(); +} + +#define BMPIMAGEOFFSET 54 + +#define BUFFPIXEL 20 + +uint16_t read16(File& f) { + uint16_t result; // read little-endian + f.read((uint8_t*)&result, sizeof(result)); + return result; +} + +uint32_t read32(File& f) { + uint32_t result; + f.read((uint8_t*)&result, sizeof(result)); + return result; +} + +uint8_t showBMP(char *nm, int x, int y) +{ + File bmpFile; + int bmpWidth, bmpHeight; // W+H in pixels + uint8_t bmpDepth; // Bit depth (currently must be 24, 16, 8, 4, 1) + uint32_t bmpImageoffset; // Start of image data in file + uint32_t rowSize; // Not always = bmpWidth; may have padding + uint8_t sdbuffer[3 * BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) + uint16_t lcdbuffer[(1 << PALETTEDEPTH) + BUFFPIXEL], *palette = NULL; + uint8_t bitmask, bitshift; + boolean flip = true; // BMP is stored bottom-to-top + int w, h, row, col, lcdbufsiz = (1 << PALETTEDEPTH) + BUFFPIXEL, buffidx; + uint32_t pos; // seek position + boolean is565 = false; // + + uint16_t bmpID; + uint16_t n; // blocks read + uint8_t ret; + + if ((x >= tft.width()) || (y >= tft.height())) + return 1; // off screen + + bmpFile = SD.open(nm); // Parse BMP header + bmpID = read16(bmpFile); // BMP signature + (void) read32(bmpFile); // Read & ignore file size + (void) read32(bmpFile); // Read & ignore creator bytes + bmpImageoffset = read32(bmpFile); // Start of image data + (void) read32(bmpFile); // Read & ignore DIB header size + bmpWidth = read32(bmpFile); + bmpHeight = read32(bmpFile); + n = read16(bmpFile); // # planes -- must be '1' + bmpDepth = read16(bmpFile); // bits per pixel + pos = read32(bmpFile); // format + if (bmpID != 0x4D42) ret = 2; // bad ID + else if (n != 1) ret = 3; // too many planes + else if (pos != 0 && pos != 3) ret = 4; // format: 0 = uncompressed, 3 = 565 + else if (bmpDepth < 16 && bmpDepth > PALETTEDEPTH) ret = 5; // palette + else { + bool first = true; + is565 = (pos == 3); // ?already in 16-bit format + // BMP rows are padded (if needed) to 4-byte boundary + rowSize = (bmpWidth * bmpDepth / 8 + 3) & ~3; + if (bmpHeight < 0) { // If negative, image is in top-down order. + bmpHeight = -bmpHeight; + flip = false; + } + + w = bmpWidth; + h = bmpHeight; + if ((x + w) >= tft.width()) // Crop area to be loaded + w = tft.width() - x; + if ((y + h) >= tft.height()) // + h = tft.height() - y; + + if (bmpDepth <= PALETTEDEPTH) { // these modes have separate palette + //bmpFile.seek(BMPIMAGEOFFSET); //palette is always @ 54 + bmpFile.seek(bmpImageoffset - (4<>= bmpDepth; + bitshift = 8 - bmpDepth; + n = 1 << bmpDepth; + lcdbufsiz -= n; + palette = lcdbuffer + lcdbufsiz; + for (col = 0; col < n; col++) { + pos = read32(bmpFile); //map palette to 5-6-5 + palette[col] = ((pos & 0x0000F8) >> 3) | ((pos & 0x00FC00) >> 5) | ((pos & 0xF80000) >> 8); + } + } + + // Set TFT address window to clipped image bounds + tft.setAddrWindow(x, y, x + w - 1, y + h - 1); + for (row = 0; row < h; row++) { // For each scanline... + // Seek to start of scan line. It might seem labor- + // intensive to be doing this on every line, but this + // method covers a lot of gritty details like cropping + // and scanline padding. Also, the seek only takes + // place if the file position actually needs to change + // (avoids a lot of cluster math in SD library). + uint8_t r, g, b, *sdptr; + int lcdidx, lcdleft; + if (flip) // Bitmap is stored bottom-to-top order (normal BMP) + pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize; + else // Bitmap is stored top-to-bottom + pos = bmpImageoffset + row * rowSize; + if (bmpFile.position() != pos) { // Need seek? + bmpFile.seek(pos); + buffidx = sizeof(sdbuffer); // Force buffer reload + } + + for (col = 0; col < w; ) { //pixels in row + lcdleft = w - col; + if (lcdleft > lcdbufsiz) lcdleft = lcdbufsiz; + for (lcdidx = 0; lcdidx < lcdleft; lcdidx++) { // buffer at a time + uint16_t color; + // Time to read more pixel data? + if (buffidx >= sizeof(sdbuffer)) { // Indeed + bmpFile.read(sdbuffer, sizeof(sdbuffer)); + buffidx = 0; // Set index to beginning + r = 0; + } + switch (bmpDepth) { // Convert pixel from BMP to TFT format + case 24: + b = sdbuffer[buffidx++]; + g = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + color = tft.color565(r, g, b); + break; + case 16: + b = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + if (is565) + color = (r << 8) | (b); + else + color = (r << 9) | ((b & 0xE0) << 1) | (b & 0x1F); + break; + case 1: + case 4: + case 8: + if (r == 0) + b = sdbuffer[buffidx++], r = 8; + color = palette[(b >> bitshift) & bitmask]; + r -= bmpDepth; + b <<= bmpDepth; + break; + } + lcdbuffer[lcdidx] = color; + + } + tft.pushColors(lcdbuffer, lcdidx, first); + first = false; + col += lcdidx; + } // end cols + } // end rows + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); //restore full screen + ret = 0; // good render + } + bmpFile.close(); + return (ret); +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_not_Uno/showBMP_not_Uno.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_not_Uno/showBMP_not_Uno.ino new file mode 100644 index 0000000..6b1c278 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/showBMP_not_Uno/showBMP_not_Uno.ino @@ -0,0 +1,261 @@ +// MCUFRIEND UNO shields have microSD on pins 10, 11, 12, 13 +// The official library only works on the hardware SPI pins +// e.g. 11, 12, 13 on a Uno +// e.g. 50, 51, 52 on a Mega2560 +// e.g. 74, 75, 76 on a Due +// +// if you are not using a UNO, you must use Software SPI: +// +// install v1.0.1 of the library with the Arduino Library Manager. +// edit the src/SdFatConfig.h file to #define ENABLE_SOFTWARE_SPI_CLASS 1 +// +// copy all your BMP files to the root directory on the microSD with your PC +// (or another directory) + +#include // f.k. for Arduino-1.5.2 +#define USE_SDFAT +#include // Use the SdFat library +SdFatSoftSpi<12, 11, 13> SD; //Bit-Bang on the Shield pins + +#include // Hardware-specific library +#include +MCUFRIEND_kbv tft; + +#define SD_CS 10 +#define NAMEMATCH "" // "" matches any name +//#define NAMEMATCH "tiger" // *tiger*.bmp +#define PALETTEDEPTH 8 // support 256-colour Palette + +char namebuf[32] = "/"; //BMP files in root directory +//char namebuf[32] = "/bitmaps/"; //BMP directory e.g. files in /bitmaps/*.bmp + +File root; +int pathlen; + +void setup() +{ + uint16_t ID; + Serial.begin(9600); + Serial.print("Show BMP files on TFT with ID:0x"); + ID = tft.readID(); + Serial.println(ID, HEX); + if (ID == 0x0D3D3) ID = 0x9481; + tft.begin(ID); + tft.fillScreen(0x001F); + tft.setTextColor(0xFFFF, 0x0000); + bool good = SD.begin(SD_CS); + if (!good) { + Serial.print(F("cannot start SD")); + while (1); + } + root = SD.open(namebuf); + pathlen = strlen(namebuf); +} + +void loop() +{ + char *nm = namebuf + pathlen; + File f = root.openNextFile(); + uint8_t ret; + uint32_t start; + if (f != NULL) { +#ifdef USE_SDFAT + f.getName(nm, 32 - pathlen); +#else + strcpy(nm, (char *)f.name()); +#endif + f.close(); + strlwr(nm); + if (strstr(nm, ".bmp") != NULL && strstr(nm, NAMEMATCH) != NULL) { + Serial.print(namebuf); + Serial.print(F(" - ")); + tft.fillScreen(0); + start = millis(); + ret = showBMP(namebuf, 5, 5); + switch (ret) { + case 0: + Serial.print(millis() - start); + Serial.println(F("ms")); + delay(5000); + break; + case 1: + Serial.println(F("bad position")); + break; + case 2: + Serial.println(F("bad BMP ID")); + break; + case 3: + Serial.println(F("wrong number of planes")); + break; + case 4: + Serial.println(F("unsupported BMP format")); + break; + case 5: + Serial.println(F("unsupported palette")); + break; + default: + Serial.println(F("unknown")); + break; + } + } + } + else root.rewindDirectory(); +} + +#define BMPIMAGEOFFSET 54 + +#define BUFFPIXEL 20 + +uint16_t read16(File& f) { + uint16_t result; // read little-endian + f.read(&result, sizeof(result)); + return result; +} + +uint32_t read32(File& f) { + uint32_t result; + f.read(&result, sizeof(result)); + return result; +} + +uint8_t showBMP(char *nm, int x, int y) +{ + File bmpFile; + int bmpWidth, bmpHeight; // W+H in pixels + uint8_t bmpDepth; // Bit depth (currently must be 24, 16, 8, 4, 1) + uint32_t bmpImageoffset; // Start of image data in file + uint32_t rowSize; // Not always = bmpWidth; may have padding + uint8_t sdbuffer[3 * BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) + uint16_t lcdbuffer[(1 << PALETTEDEPTH) + BUFFPIXEL], *palette = NULL; + uint8_t bitmask, bitshift; + boolean flip = true; // BMP is stored bottom-to-top + int w, h, row, col, lcdbufsiz = (1 << PALETTEDEPTH) + BUFFPIXEL, buffidx; + uint32_t pos; // seek position + boolean is565 = false; // + + uint16_t bmpID; + uint16_t n; // blocks read + uint8_t ret; + + if ((x >= tft.width()) || (y >= tft.height())) + return 1; // off screen + + bmpFile = SD.open(nm); // Parse BMP header + bmpID = read16(bmpFile); // BMP signature + (void) read32(bmpFile); // Read & ignore file size + (void) read32(bmpFile); // Read & ignore creator bytes + bmpImageoffset = read32(bmpFile); // Start of image data + (void) read32(bmpFile); // Read & ignore DIB header size + bmpWidth = read32(bmpFile); + bmpHeight = read32(bmpFile); + n = read16(bmpFile); // # planes -- must be '1' + bmpDepth = read16(bmpFile); // bits per pixel + pos = read32(bmpFile); // format + if (bmpID != 0x4D42) ret = 2; // bad ID + else if (n != 1) ret = 3; // too many planes + else if (pos != 0 && pos != 3) ret = 4; // format: 0 = uncompressed, 3 = 565 + else if (bmpDepth < 16 && bmpDepth > PALETTEDEPTH) ret = 5; // palette + else { + bool first = true; + is565 = (pos == 3); // ?already in 16-bit format + // BMP rows are padded (if needed) to 4-byte boundary + rowSize = (bmpWidth * bmpDepth / 8 + 3) & ~3; + if (bmpHeight < 0) { // If negative, image is in top-down order. + bmpHeight = -bmpHeight; + flip = false; + } + + w = bmpWidth; + h = bmpHeight; + if ((x + w) >= tft.width()) // Crop area to be loaded + w = tft.width() - x; + if ((y + h) >= tft.height()) // + h = tft.height() - y; + + if (bmpDepth <= PALETTEDEPTH) { // these modes have separate palette + //bmpFile.seek(BMPIMAGEOFFSET); //palette is always @ 54 + bmpFile.seek(bmpImageoffset - (4<>= bmpDepth; + bitshift = 8 - bmpDepth; + n = 1 << bmpDepth; + lcdbufsiz -= n; + palette = lcdbuffer + lcdbufsiz; + for (col = 0; col < n; col++) { + pos = read32(bmpFile); //map palette to 5-6-5 + palette[col] = ((pos & 0x0000F8) >> 3) | ((pos & 0x00FC00) >> 5) | ((pos & 0xF80000) >> 8); + } + } + + // Set TFT address window to clipped image bounds + tft.setAddrWindow(x, y, x + w - 1, y + h - 1); + for (row = 0; row < h; row++) { // For each scanline... + // Seek to start of scan line. It might seem labor- + // intensive to be doing this on every line, but this + // method covers a lot of gritty details like cropping + // and scanline padding. Also, the seek only takes + // place if the file position actually needs to change + // (avoids a lot of cluster math in SD library). + uint8_t r, g, b, *sdptr; + int lcdidx, lcdleft; + if (flip) // Bitmap is stored bottom-to-top order (normal BMP) + pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize; + else // Bitmap is stored top-to-bottom + pos = bmpImageoffset + row * rowSize; + if (bmpFile.position() != pos) { // Need seek? + bmpFile.seek(pos); + buffidx = sizeof(sdbuffer); // Force buffer reload + } + + for (col = 0; col < w; ) { //pixels in row + lcdleft = w - col; + if (lcdleft > lcdbufsiz) lcdleft = lcdbufsiz; + for (lcdidx = 0; lcdidx < lcdleft; lcdidx++) { // buffer at a time + uint16_t color; + // Time to read more pixel data? + if (buffidx >= sizeof(sdbuffer)) { // Indeed + bmpFile.read(sdbuffer, sizeof(sdbuffer)); + buffidx = 0; // Set index to beginning + r = 0; + } + switch (bmpDepth) { // Convert pixel from BMP to TFT format + case 24: + b = sdbuffer[buffidx++]; + g = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + color = tft.color565(r, g, b); + break; + case 16: + b = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + if (is565) + color = (r << 8) | (b); + else + color = (r << 9) | ((b & 0xE0) << 1) | (b & 0x1F); + break; + case 1: + case 4: + case 8: + if (r == 0) + b = sdbuffer[buffidx++], r = 8; + color = palette[(b >> bitshift) & bitmask]; + r -= bmpDepth; + b <<= bmpDepth; + break; + } + lcdbuffer[lcdidx] = color; + + } + tft.pushColors(lcdbuffer, lcdidx, first); + first = false; + col += lcdidx; + } // end cols + } // end rows + tft.setAddrWindow(0, 0, tft.width() - 1, tft.height() - 1); //restore full screen + ret = 0; // good render + } + bmpFile.close(); + return (ret); +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/examples/testcard_kbv/testcard_kbv.ino b/Arduino/Libraries/MCUFRIEND_kbv/examples/testcard_kbv/testcard_kbv.ino new file mode 100644 index 0000000..91bd0a9 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/examples/testcard_kbv/testcard_kbv.ino @@ -0,0 +1,193 @@ +/* + * generate testcard similar to BMP + */ + +#include +#if defined(_GFXFONT_H_) //are we using the new library? +#include +#define ADJ_BASELINE 11 //new fonts setCursor to bottom of letter +#else +#define ADJ_BASELINE 0 //legacy setCursor to top of letter +#endif +#include +MCUFRIEND_kbv tft; + +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF + +#define RGB(r, g, b) (((r&0xF8)<<8)|((g&0xFC)<<3)|(b>>3)) + +#define GREY RGB(127, 127, 127) +#define DARKGREY RGB(64, 64, 64) +#define TURQUOISE RGB(0, 128, 128) +#define PINK RGB(255, 128, 192) +#define OLIVE RGB(128, 128, 0) +#define PURPLE RGB(128, 0, 128) +#define AZURE RGB(0, 128, 255) +#define ORANGE RGB(255,128,64) + +#include + +uint16_t ID; +uint8_t hh, mm, ss; //containers for current time + +uint8_t conv2d(const char* p) +{ + uint8_t v = 0; + if ('0' <= *p && *p <= '9') v = *p - '0'; + return 10 * v + *++p - '0'; +} + +void setup(void) +{ + Serial.begin(9600); + tft.reset(); + ID = tft.readID(); + Serial.print("TFT ID = 0x"); + Serial.println(ID, HEX); + // if (ID == 0xD3D3) ID = 0x9481; // write-only shield + if (ID == 0xD3D3) ID = 0x9486; // write-only shield + tft.begin(ID); + tft.setRotation(1); + tft.fillScreen(BLACK); +#if defined(_GFXFONT_H_) + tft.setFont(&FreeSans9pt7b); +#endif + hh = conv2d(__TIME__); + mm = conv2d(__TIME__ + 3); + ss = conv2d(__TIME__ + 6); + +} + +void loop(void) +{ + int16_t x, y, dx, dy, radius = 108, idx; + uint16_t w, h, len, mask; + uint16_t colors[8] = { BLACK, WHITE, YELLOW, CYAN, GREEN, MAGENTA, RED, BLUE }; + uint16_t height, width; + width = tft.width(); + height = tft.height(); + tft.fillRect(0, 0, 7, 3, WHITE); + tft.fillRect(313, 0, 7, 3, WHITE); + tft.fillRect(0, 237, 7, 3, WHITE); + tft.fillRect(313, 237, 7, 3, WHITE); + for (y = 0, w = 18, h = 3; y < 240; y += 13 * w + h) { + for (x = 25; x < 320 - 18; x += 2 * w) { + tft.fillRect(x, y, w, h, WHITE); + } + } + for (x = 0, w = 7, h = 18; x < 320; x += 17 * h + w) { + for (y = 21; y < 240 - 18; y += 2 * h) { + tft.fillRect(x, y, w, h, WHITE); + } + } + tft.fillRect(7, 3, 17 * 18, 13 * 18, GREY); + for (x = 7, y = 0, w = 1, h = 240; x < 320; x += 18) { + tft.fillRect(x, y, w, h, WHITE); + } + for (x = 0, y = 3, w = 320, h = 1; y < 240; y += 18) { + tft.fillRect(x, y, w, h, WHITE); + } + tft.fillRect(26, 22, 17, 99, TURQUOISE); + tft.fillRect(26, 120, 17, 99, PINK); + tft.fillRect(44, 22, 17, 35, AZURE); + tft.fillRect(44, 184, 17, 35, ORANGE); + tft.fillRect(260, 22, 17, 35, AZURE); + tft.fillRect(260, 184, 17, 35, ORANGE); + tft.fillRect(278, 22, 17, 99, OLIVE); + tft.fillRect(278, 120, 17, 99, PURPLE); + + for (dx = radius; dx > -radius; dx--) { + w = sqrt(radius * radius - dx * dx); + y = 120 - dx; + dy = (y - 3) / 18; + mask = 7; + colors[0] = (dy == 3) ? DARKGREY : BLACK; + switch (dy) { + case 0: + case 1: idx = 1; len = 0; break; + case 2: idx = 0; len = 0; break; + case 3: idx = 0; len = 13; mask = 1; break; + case 4: + case 5: idx = 2; len = 38; break; + case 6: + case 7: + case 8: idx = 0; len = 0; break; + case 9: for (idx = 2; idx < 8; idx++) { + //dy = 0xFF >> (7 - idx); + dy = (idx - 2) * 51; + colors[idx] = tft.color565(dy, dy, dy); + } + idx = 2; len = 38; break; + case 10: idx = 1; len = 0; break; + case 11: + case 12: colors[2] = YELLOW; idx = 2; len = 0; break; + } + if (len == 0) + tft.fillRect(160 - w, y, w * 2, 1, colors[idx]); + + else { + if (mask == 1) idx = 1 + (w) / len; + dy = w % len; + for (x = 160 - w; x < 160 + w; idx++) { + tft.fillRect(x, y, dy, 1, colors[idx & mask]); + x += dy; + if (x + len > 160 + w) dy = w % len; + else dy = len; + } + } + + } + for (x = 72, y = 129, dx = 5, dy = 0; dx > 0; x += 2 * dx) { + tft.fillRect(x, y, dx, 36, WHITE); + dy += dx * 2; + if (dy >= 36) { + dy = 0; + dx--; + } + } + tft.fillRect(160 - 8, 5 * 18 + 3, 17, 3 * 18, BLACK); + for (x = 3 * 18 + 7, y = 6 * 18 + 3, w = 1, h = 18; x < 160 + 108; x += 18) { + tft.fillRect(x, y, w, h, WHITE); + } + tft.fillRect(160 - 108, 120, 108 * 2, 1, WHITE); + tft.fillRect(160, 5 * 18 + 3, 1, 3 * 18, WHITE); + tft.fillRect(108, 2 * 18 + 3, 6 * 18, 18, WHITE); + // tft.fillRect(108, 10 * 18 + 3, 6 * 18, 18, BLACK); + tft.fillRect(160 - 8, 11 * 18 + 3, 17, radius - 18*9/2, RED); + tft.setCursor(160 - 36, 24 + ADJ_BASELINE); + tft.setTextColor(BLACK); + tft.setTextSize(1); + tft.print("320x240"); + tft.setCursor(109, 43 + ADJ_BASELINE); + tft.setTextColor(BLACK); + tft.setTextSize(1); + tft.print("ID=0x"); + tft.print(tft.readID(), HEX); + tft.setTextColor(WHITE, BLACK); + // tft.setFont(NULL); + // tft.setTextSize(2); + while (1) { + if (++ss > 59) { + ss = 0; + mm++; + if (mm > 59) { + mm = 0; + hh++; + if (hh > 23) hh = 0; + } + } + char buf[20]; + sprintf(buf, "%02d:%02d:%02d", hh, mm, ss); + tft.fillRect(108, 10 * 18 + 3, 6 * 18, 18, BLACK); + tft.setCursor(128, 187 + ADJ_BASELINE); + tft.print(buf); + delay(1000); + } +} diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_1.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dc9df3b4a4e8ee6232c72d130b389314c54898cb GIT binary patch literal 9022 zcmds+O>88^7025$iX#Q>Tp}e0a344%H;9nJqW$P7cfuiOKv5((Wrt*y-6gYj4Qzxj zB%@U>L<0KAF;YlGqQ$NuR&XT1eLw;sz&(x$L$t&_&ItERy1QQfuc|+)r+fCEyxsn) zU%glFz53{C&-Wj>c%P%?BF^8&@i!dbTXCEf{L_+i^H80M$idMrsMZcp`hUfS%`nUO ze(5z}$p)P}u&rQa`drFt1Xdk6OBQl@Bh2R69_ zOP4dDmNF{YVNs{db;bG(maY{xo9u8R^7>ABQ_P2eUN%gfZ?KS#3`?6#(n-$N8+wv* zU*_*L*p3pWEFLx30ZETo#${g1*bgX_nng_(QDE4h$-XR@pZjag_jzISPE1U7vpAK$ zWE2W6R3gt$jU6yT1|ogM$99?Dn+H*P?$k+0^9f)wt}2N^eTKaFDdH z*f5zSO`ACrSu5jlqLwi3ofAr1^v1;Oh-ORKfd1XWBCY4rco|Ct1+5J0%Zw<9oAE_F z|B#a#<0cE34M?4J+nI6+EtXP_3DyI!hG*3eA=sSwe<`INGq_UqkTuSj!Ntl;i}_#} zg?eD*R!f`ABtkD+tLrI`szHr9wjTR0aTH=R&azhkTx|v)m1t)v{6J1CDfL21eWKcX zz-AuR(pj|^60c+BdWCzNaVqU}RxHpdDc7W$UZB?rJDs+kMBR|<7gG8ekU*JVl=HP@ zkxq%%&N%E^$}BzZ1$&fPHpk5Dkz_M2uZ3ROjJfx=a8y$I$?Tw00o>JC`6e<|N;ZXF zEt{4evuf&T#Zr&goVuG;d(5mgi4|*l^SWZmxV^OAV8xIZ^^KaRHAda{Ol0OAp~XQbAnZaYgU`|SBAXjtXDY%f;nh52)#a;q3EcC?YbC^MRg!mh=Rd)cq# zxtZfN*yt;dCE2q(-`XpPl}|spFwJhh(Und1xkw)zXE(PWf2!%{)<|`?vfunZ3!8o( zMe-<~-~PcbuDPPHn)`{Ju#CVS|Jl`}vc;UasSeP}duJ4{z^BH^UnjZU>8grayZ3U_aV)kG7+b``AcsbLWb? zsmPyhld6_2&D6^HmVZ&v7rkwom9CiaIag=j4R^BX$-Ud*bSi2#V;cQD+Q~lco!Jh@ zS)EOsYiGMVS$gitjG}7J7kPQj z{7NLjr12(a!^@%EQCD9&IQB>kb8iewy>lOd_3qgRqpy3WO~YckHz8)-O9Bg5WagS- zLH|rIP^#y5HwD)7WSVkz4BHW78HAh9ToHTSQOPhbKM6uHzx3lbm?7P4)#&Z^ z(MBl#-2LGnzZpGfF)myzN z{5anDK$42%6Fn@W-J>`&tLO^PC+*ruN^h`G%x^br;c+BncG=B$+MeV*Nx8*#jGFom9+4s7<%$xjGO z9Q1s=kMmEL+~zaE9|OeYN4=0p7?VW|PkCV)<4q81 zq?x)XFdnu;%_QC~7Nhg@p_pxBKu07bPJX3F57URd-Qyh*SWsgR&LjDs{fH9HLVG@_ zco@m~quLP0Zk~*boU4Te^t7Djk0vpI%x@3duEI5E~$|MTR zv-D;jGkQcD>Y@8UwIF9Fl<_w3ihfR*iIPRpdEN`%YGViM7X`BNw#YY2w%!NN5>N2I zYTq%UZ5HyEpGT)*gjOLoLpBCTMk1mVx0tl4;41mpom@o_nGETMVVV@2z7?h9C3}c48oKc;n+`g2$zRG7<(VimZaU?JdKh3Ny7>azt z^2iKJFRm=c7laSF+_XWiqHKEEYn;lI`28&ow z1(@rrMJD*$h}lyRVPM5f zGJ%Rk$g)Wi#cB%=DGr9>0_@IA<5ynAE1$cH5ZH%%A4&S~itQ8i}m<%WLK5{MT9y zHAcpOr59r{@ENNXhDG9KX7ses7h5l-_&JwnLknA{nUJh;PM_^u$B$#}4S7Zj9~B^# zpK%v62>sOC7okQLLpk<6L^q!kII~oG$?rtMOLl)n<{enEd0^ORrRdy>O;%m4H(4oW zi^ZIdW~UpJ|5dzVLuXAh1aW#}!Iz=4nsgsTA=pZTtt8KLp@@~U!2aT_Wc@Q-7}H$~ zY|n9o;~J)`Sh4T*FK!mBv#8e>kAKuMqdiK^yl7?lAgnXQ z4T)wvd+k1|ekhBQ0zQeLHdP^2{r9_<;F)LKVZr!5R{9b2DdwrH*q(n9&F3a-C9d z;yCE-)I%9Oc5$iLsPC9wo4H_qjqMifMVML*YixiLE}(BR(|2WiK1xy-EjF22#}B2m z4*9dMqI!M2DE>wDfi=~c+}&i}S(Le{JG=*1L<7N%zNX?DZbj<#+t_txlY1OyuC8C{ zrJ6ZQnTrY>gILg0C|gBVnQ2t|qC93SV5ZwkhWCs?%uLEEwncpduQl}sg9#MumOHEot0fs*W1mo zO5~F(S1o*@NrsY@a-Yb!WW0vqr(eN^xs;682<$@q0^nM)M6~xtP7SH2l?a{zTR@!5rk&E`1Ful+P>|idHpGGGv z0IoLU&qIF+iz!|Amav58L$QR-iZA$_+wCcL%hIa*LjBHiR&2gnY}SE11 C)EN8# literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_4.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/betty_4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b2d1e8cfed529a7987f0ab54b9131037bb7e865d GIT binary patch literal 26326 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 m^^>>wscW^)_G#;~ebHXksh_@fb;*Cq{}M+ literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/marilyn_240x240x8.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/marilyn_240x240x8.bmp new file mode 100644 index 0000000000000000000000000000000000000000..331b230c59122a8e3344c033095e785291548b7a GIT binary patch literal 58678 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

kRB^$YL8 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 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/miniwoof.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/miniwoof.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5045d5a03c7aba2df6499a910f6cb60d67b1405 GIT binary patch literal 57654 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 z

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


dFgdm}h~Kcbm8nD(0}_6JP= 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 DT1}dMu$|M7J*amMuFLZMf91pe^T^ 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 I@4xus|2X64SO5S3 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger16T.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger16T.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b9599d780eba808374d71b49641cf802ee9f9731 GIT binary patch literal 153666 zcmYJcYj7L)ndYlVynrHQQ;E-6x@xPAC|*I4w!kEF0_>NdDUw1{RHEj1&T(Tt#Asg8 zBptDp*)svRDmK6?Aj-CoWG4ex#S*|fD91LP-PuxVEZ#*)RN{i00;u;r=RzEp7;H?lxF4sJbXz0DO@VKeDh0(4n5`jmkt#kI>Pru z-2dhLL-s{}wEz9_(4l|HJ#^@QOqM=~OX;oT2D`=TkluM9J<>w*2 zoh@4}S98>Cwlb|<+Y72zp1B%mGEbQu+Lkw4nb7xwdB$E~FW@wr%qp&}>U;WLU_x)u zjvAd>${lenxf``?CFv?x9|h#Gs{wh$u)gGuxR>1(YKPjPP3ps1BiG7#T*TGtO1g5? zEpLO?p|0tZdWTl7a*NWTR;W1&&&9L0I+xtpo-Oy1E5)Nzt^xbE8kHq?%AKR6+=esa z+H%Wt+J8a);u_D$bMVuIx})W`Y^zI3N^MuldG29tSew*_G z@V!CZ;(3R)Rb3vjsvkAhc+HFMY_);Us6lN|meq29g?~p|)++tE{*=1SUszTvxn*0+ z@t3z`HM$z&4sK;{m_wR8 zUjAk|f5~BEJS?tp+mtcar-i^&!29eLBJZa2mWSEt_ZXh0L%SI*6*FgR2FxnQ$_||XRY~P-+b;D zwdr3k{rcwd^!>yQws(^b{#u#F`w#2}o#tN9VeSUG9&qrgj~aPKp6Os)4UFrh>VkLC zyWrjQCEbR5(O0est_FDryLzJ*c8A@I-fVS<_cW^y%&eIR=46j>8x{Y z`BL7)#fGbq{W!s=B3KiowL0qsB|L|{DcS0hx5QaeTvA-;taFAz7@Icl!&LK_L{rS9riBz zveiv*y|SWqwT!lm`YT&jv=x0zZ}9IJm6vk68;pq7#*vq2Oz1;_Hm!`mT(9m12laYw zP)}(K$^*}*wVzh8)jsqrDy>R`DoEle0ILmZqn5)lGOV}ro10!i?J&2?@x176XCJNv zR@mc1FiHlGYc|tN>IRHZ=Sq2p^xeQjz!&NY?T5?N$v{^q4~$IkC@{?Pu5hhUKWg0x zpO3u|i-qzmr!^a{iPyx(5@U&b$y2fE=xBH~xcB|L(P!c>#E;Lvf3q)rA^kLYKly56 zCD^XF@hU)^;RI(5yenR(PhRs;GE0)wg&j5oX5eK+NO_v$NO#9n#>&4a4W7l(2;Vty51@J^h6T2CBCbVu1Qac?=j%Wl=yHX@K&$J)3E4j7QUW?Fl>z6HYuQx? zwo`7wE$DR$g9;YIuq2z!z=AE1?2_lqQ5WIlC2zI|ynwz1&-L0st>G#0EV!=2m`l7` zVcA7*9e+Inf|KqocY{(6BX8L_7Cbh&A)Brv@XMMN%l{Nwg%(L z(U8sGF4M|1!EHUix1~N*9@K(BwgugYw)s*D_^g5Q88Lsg;6iMd1%TzD?F1Im41b26~j_xS4h#N)p` zKL6JIh56mS9kAt~5*~$92leYPT$Xy>d)>=12C`PEkYJCCaITZfgubuWxfZ>dx@ljE$YnweSOqaCT?o-efhUZRl@2#SDPJ9Fc4;PmTMV=8r0;lD*_|(OyESGPpYV3#^znm8IR$4z4lh^Ezd2_>z)WqQtDac zQQ(w4QRh-%)Fo;_xzed^d*vA5UGYl8JWGels|Ixu_Lv--!i^<7M^f2TOPflY7L_{X zjIyOQ`WyUPYEH`z7^&CV^aZcs&gO_OLj(9)rv1|`zLwmU6*ar1&A(;j{AJ3|cWsbQ za#&Bg4?6>{O>id_3pNIS8$iSj+qs4|B2d?N`b zwNqokr(RCw*@VrL_R%bLPVkql2_KY;R#fvjCN|yWJVI(CIHO_;H^|tV!+1Vf@f2?u7qL5dL`Q zTF&~V+BIl<0pUz=0Vc*(M^jhJNE7u}T~@PNT3eQ2z?8q$zsPS^qUW+b@>oy~A2)#B zL0wQ5Q5Te3o{zvE2;{YgJtc}LL_u6RbwvJ7BR@5O@+?J=D0MSe5$#=uivL!u%5b9k z&{@W$?l33yP7qkH*%;(qH0o8>c@$l5;#{H{HMbt!kBSNu{jo_^kaya^Gr#T<9R9%G zBOjf(RoUv@x*!aUnhXR(x5LxngYc@Jt<`fJEP8hWx#o5688=7{IExH>^wKsd%d zrBCa&YoQ)1aES2JNvFcs!-6&&qgm|DGu%=K4$74!&}XYZL7J`Lgn>l2fffD+d@t1% z{5?4FPSJy+Bl0L$r6RR=85bk?6z-F+N4~fwte4{VTV1W-R9H~hSP+=;FM=@8gFc84dte!lmVsHQ?InCWl9!!F<^gq&$r2Y27lmEw8SD`<#md-ybcFSh09VO zQbz_*E#q1)u4C1|>Ywm8`d7e0J?NqOdu4wl`8ufPHdV0Ywm4e0v{LwQ$*}R)vZ-$K z+k#kOv~23?N}!&-U&g-7R$Eb)U*NCyBiQ@8CqhlZ<=HHW+T-sufJYv0<9rvs5g)RP z;?LpUm=&Y0q_^;tK;G)_OBMir$brzf$P-D zQjj`<+C&@pu2Tg?1uL$fp7>7DYek1)>oRQ?(`C1Z$JvOYpZBShHR1q^Jj~DaTA;UpN{Eh0deOhHcFj;j@=oREMTH?DQ!S zH+2zA@TPF*trORZJ}No`_X*xI3l^6-6h$a|cydPwjP*eXIsLbex1K`n}1Dg>NLUB(5aKP;+C+ zn)rUS%c_TolU|-v3wtN{8`o|9AqX(IcHLX-{HXGy$_JHUP#WOVGJN&?y;b}MTVNu% zg4YdN>ku6)-9|l{7vr+Bj z=Reio!)QIJk%AOzFqr&;)A;_N=ppO^y7N+q9#$Dc7BW;_GNi zgXdku$!x-Vi|`&Bb+3)jCv(hQca?a`n|2MgJFj)vpW8B|$>;nh{TFr%j}1_Nx0Nl= zl1J2GqtWIcHaD^02*+`d90 z*M);#L0^uBx~!pq18umEOJ1>co}hn_zerXT6emI@wzIhvZrjr@ThwPN?W!*M+Yq(* z*?!@)c6ncHU=HOi8tB^*)Eu9Qf@h=-f{U~0I&s115k9Xa?_pR^{HW*#R3g<^ycu8N zOOQm?BHBt=CE~gTe!v%)Sz^B~xpO>8m(Kj|N8 zDR0__AzR_YdIdJ1`r_kl?8)8`m4h4hZIZ;aw>Vq7T7%ur?oKLO8JV1E4S}L8jT(mk zD8(x;E88A6&{yH_G$xF3E`$E@mT?qgSxbZetl!}u*CwbzlNm?B9&P~Z4InqEe8GSy zK)kk^!kM(QUxq;7qPGz&4(Xx<`Hu5AYDVEaGc;;V=!?E~U2{El7;Dw*&DNk>3hk8aFw|p?g}}~(Gb|s7w!B5UBxF)*5F;d z;Iv>xUajEMfrDO;`nUxz9a;~~gj6_>Jk!RxFyD@iKPN0WNbYiqN-ViCxe%8o*pQN9m0Kii!g_~`KLt}6^vO?|+vHlE z;D$%H!lZ&c!Jv2@@x}wrh>a?FL`kvW>`&Nhb)5l+a(e_e;~Ia--bByw3c;gm(KV>- zYL#HFqh$*8t@`);d4IX*Uv25ID|1fM0NM45){a}r;;5nq`=kz^p_)$keXTRyqupxv zh<{uVqpk5-Qib>g%TQ5x4{e-E5BikcrnBh74r7R|5wASxUq&&OQTxfD{ZVVh-ls!g zcrcJf-ITln;yK_(j_n~3u*+X7r&5XkjfSJ-Afm;@aiFn+!BC}D zW!(w+tQl)iAD{|P1e&Z-u+fh9z>n~HkHvnObfr(HpUi^5#L;ORRzu*)+pX|He_0NqI4gE?bP96Z8kg;GHs2xOATxaq5l%c=bz4Iw$o{0 zB#t0doFHsm-}0>nyUc9mq%**)a>Az6|3DXh<7{X;Ecx|Bu!Gy_q40OGZ9lYjE7PqSp&Ec&h`&@4$E;6}`hPx5OWx5M;Fq_E3?6VX3_a z_>+n(7!*9pqyAK#c3e?8GB!$~(e}{k6nDVa~yGCBC^Dlj^LD{<1 z*1Xm||IyZ?t&fcS?o*e}UAo)<%)ko+$Nt0YrBjzi%r@=18_oiMl3A@vN`i}93HVI< za=4Eio98P0?XX`1eY;U>%3L$|%smS>Goi;ASslEK^} z1Kc990d-`Iq|H>fa%F-VIBKOskHZd=en)VnPZU@sK4UkyD~VocCR`JXl9TMkoF=9}Xj1EN5+4sbmYkQz7>cB1z_I+3jfL&suw zLgHaKI)Ysx$pI@(YAGJu`9(ih`Zo=Fw;6*6QGHZ;@xOa`-d*~Is2)Bg8-d)iYGbwB z_E2Q~;PKf=1<1ON;t@qCC@j|udb(~;u`plJYlS4y zMW2GWYjPX6yu)ojAOnyzP;?&0fc>mexg(&7EJri|uSi~tJRc|pkHW<{>b7^AioZ?m zEmucK7ewg`2ct~Mfu=N$MY=z^c;hbrls~Vvs#R@`c1NkQ(e9bKf7V}pX~fupk0$Lb;i#F-XUU$Y<_yx8SkYJ1TnB{v-p;Zp!sfQm33KJxSF}aCAGGAD;=6 z+*!B5Uk?UlLfIF*echo58zSE?$E2a;MwR4 z@%u?(DN-`}ubWgiUWYg1TBO!Vm5q`R7R1)!+De#BdLO$mrC^YED~<*Akp;#sn{(DV z^Qb@15cMetlx(O&C4I5I`)Xh@)~bzG+f_v97cZj!q<0aSl>zOTf(G z=S#SD3%7e142pj~BMA%0`xKn9*=Pf;{46Z^5h#{N$n|%M4nIEtuIg-_llm>}DK!_i zgAIj?kJui%&N)Cby^W9EMv-O|pmf_h*^i=W<=u;~$W|(pHL5`l)c|)Q_1N!&4R0H# zx~tH5LF(H~ot#xlu-iBcamZ-=I=N@FxM&0cJ>CN$M#zQgpfx5V)*y6e>(KV80m_n=lfako5W zEmM}0B%_M{z#2*{N`lv$oDOe%un#UqK-5Uc2R?jM$2|HH!dxrlFEim4YGylmaV2$G z4b{Y`%kkva%G#QLB5;;xYuAGo6_Q+Mo#%w1 zZLZ!8c3CUI)gbtTx9jzB&>}ffJM~vO8>eu)yYRHiyPD(`?*-0TAd7ria3wilC7+*E z>_ND;ky<~Y_gLAezjM}bpq%HT%S|naxO>bU@3OtmP8p-xC@FL+xM~Gm5%(EMj@kQC zfj_OJLV_2;ocIP(L%s_Ofe&ir18`N!qrshYIc$!jp4w<@g)tAK@&v(xL%H=@(Y3-1 zV*e-p?BBEXA63`pQE&(H;5lk5e+6X-*UEjcZi?*Ytg;`Fp0DV?j0@TJ-PXnVkmbRO zGFgxfKMEG5|40W9RRNR1R6b+c95Fko$w#TYO_yT*k0W;@bNxO21^rRn^_kXDC=PI`A>z7Bm5#Ewf}g}zNW>1UXV*bdU9!zON6c<&TW zWP;>busC5)P{^!>+yhF@HL9~{7U70$^)4QGQhyY{=aE4PH{`&@j{;rVHWf;=UxELu zU9|%2bzvIev&<&fKLS^RH?T+L6%-yWhOg)h9|n^ri@CS*2z3z;%cE?kK}Ds`f+#_Z zRA{NZ8T`Fg_=@8@j@Lk<;F>IkXZw`zB`~4X-iRd58Zp(|W0&$Xy3kD^X0fBHJ3QL#nqf~*FKrRUhOlEc(!#Ia& zH2bAhOJaf^>*beAM`n5Rc&MvM-}sXO}sZ@H>to(Ug@VuVDb#9FZK2-7FR4ixjm|IrZQ!#r_6jXnQt_ZGo{!k zIcTJ8Wl!(nw%humtI8O&a@kXogGu(%N*-83y%olbxMbQzkY?9DkRUn?=K#JWFF8UT z7G|>%2F6f@JhHU-9qxT_;-pk?5GZQVehjD+%zel4O$Wa(h_zjdAQXRVyWLE^m1HML z##p} zN#MnQRa$fzILdc)hf!(n1a{yqI`!!8aVFSSxF+4Fo$v4VfkA7Bxu?~Da8A&ivWAU4 zwn_hrv28A!!hga@E5QjKC2Z*nO@MGGXqzE-lbU%aN=9eSFu}PVU8h11o8|s8e>T$& zrA_U|uyxj&CUZNV7$I+IPDq~DWs!J*u(8B6TCX5J8VZ6vyedB(M4RIW(K|R1CI-T2 zHzxiH;_J~H$@7U{CO=Q!PtJkCvE-HH>GX}{X&lH*)U;yOD!pWtn%)MorOpRQ6FW$( zM?>YfT_4Q99wze(kAy0$agIIdT!2cF&!q2}*eaMK>BB1x**#yTZTzInGPM}Q)xwrT z%;;qtu%J_p{2@*D(1iYC?3}sAvkAw_9+AG#q<%5BVU2*?RoxZIRm#ZE>6XHgt*AOU zN0{yl96qR&`U(aGZ(I{+&`QEQXje;NJYg}Zt{Ef>>!sXhY|P4if=<~`fnc2h|%uz#otRtHyL=|(J~mo1uD!~9H6i(n%)}0H#GW%xQHf>ZfMl7R#rCzR z?@6$k$^C|HB+7hj2lc4QykXh>5B5|eDx`tE(xH7f=8EL7mxi>9u}b#l8OdJ6YoheQ z3EKnEkpzdrgePqr-Licy=qx@%ezI)WL_v?uZ!nwGRH?zG&NfgbdJ*(-n~gWYC%-=c zas{dK=#QxCRCxOt#ET42f0=%%b)WtLIXMiULw7J!hsE~|Qhk}8K%>~M6g9sREJb0Rv2q$9@)*F-_cspy-PK9uoqxQGuN)Wf;{O_t?*q~ zWhQ)ZRVrO~;uIV;9e&J&p3HgrtO}#us0V-BfiCtsxm$RLV<1Wg?fz`xe17b9*ohWh z4_8@_VaL_rK@>j3n>gUcnz)KCXiBW(HF{$=k~L_*W-u#!c#KMXJe8SSzLI#Fyg_a5 zp(6Ljk5QkmB&%c2(6M-Pyvt$^zK`@eIEmv}4XpNcaeQ$M>PeEKMP?DCx0>`01s-3$ zk%awh1{~CU)bc9u$2>iX5)~*Fm-;ZG2?vxb!h7Pnhd{S{*5#yprz4`nsXgeRN(22# zy*>yxo6?1AP+yEp=}X>HYA&gT*PfUXBo)>-#pcwqD%C3OTUvQ*lwsO?Q5|5z&&U=<)ZwS@0 z#-~$G4&P3tgaw%In?M&XNnR`%YUcA0G_xC8b?zfDttojBMTbXI<>D>NM)OYGa|^I4r%1L|?unhLE)qcA0G zN5{32IxGmCq7JSG?}q1+`LR3U+w?+Yn&2SH>kZzGzMJT!Hm^~0kEf0^p?p66E;9#X zIFVzqJnMz{=Yqia@zjO+&+Q!gcuF*34R!enIQ22<*OL%^ilPYNaAB*iPdOfY9UUtoicV?t^( z999osiAxZ?QIiFA+``WwQkV|BvI!D}`EG$vQG&vZ!hPbM<>%7kheZoTS$w@FDPU!Z zUE`S$6V(U1p#gbSQhmi6$=??S6!(#X%cu~1;XS&0sbj}7`m8ziS3>+xm1#4~8W>JGMB2^q#17UW`2mYkewmAnSGqkZNj4Aj#H^pXj_Ks!}GeK^^lm6}S-m6g-%=n8opmBf(MOLQokz zVp!5YFe$DB9%Q1u3_R@zlI~$W9TLqgm(SHr#j#ODKZ7FGD{-q_yzXPgQ0(n$6P;0G6nIw^}MZ6$38fvx` zS$^D1R-?-fsKeqb=&ON0nVjE2nLb9>6~y-Gt3|^-@ReMqxn2;%dnCt_y>XfGJD<1% zhSsA&Rvmpg^{+Rrw3hxH4;-JrAOB_IA8uZqKNk5`?7Q*#c`IF;{ybTm>YFE#i3h_o z=z$q>#$KNHZnSUy#k3^b(jzgMQ$RoTO>-RJWzoKZ_#k{K>CK)lJ_2lk%PQjuT|Zcl zS*lEB&NUo7W`$XURW9wY;2Ox>3ry)xLe<8-kYG`I!i{*3RsEECTfY|?v$lQPzG3~% z*tV}xt7HbIPVx-)rJY}Z$Ss>q*v}pV*0bG&a2fbG0yB+jUar;A=EofaW4gCSPezRO1=)B`ZOZfwg#V zGD;ObxLO0A?y%~jH~uRALGJ6NX1eC9IUb@^!DjT^4Ql9>#75%F z|G~U9|1|N-#HIOvz4>R$Z{2jwA5Zrt#FM<5sGZm5YtuXeCah*#XEwEf8C6hdZ^ER( z@Z+n@9N?2i!;>gcaoXrn=4cAjR9^ohQ7)qPm*$@Lmo{J^PDQ zmiQC6rd*lU&Z>2y|Lm%o!P{Z@X-3Pazl_ckrjz@a_oD|Qyw=K3xC$z*=)QV5^I?%g z5fo<}^Xr9K#p5m?>a9|7D7hdIj21osr8pM!;A@57bi88YQQR?Jh3yEh;|%&RV(UZk zAk}7%X}@9+COr_*gu;0;r{Up_#0y4rQJV-hsZHfdPG~$BCH`kfs z1z|DEH0i;CDBK4wh#rw475OvrNx4m>3Zqr%WQzuzBwNYmlbs0I__MwpI}84#OT}cF zQDBTvnO=C#mF=(lZG`WO7M#1?5{T^+Hk;rOt{jYeV-PDW2AL zypoxe+8R*$Zi2+aaNjKuCwa;lobZw71%Iv1aW}dU{7Dx>Dm0u}H0WA!`_uxz5B#k# z{ny4b4LBbby+THK!g1md8+r9B zR!p&aRJxAhc;!OXpEkBPtf7U}*rfWHCiIx~XG5l^X7s%$bj!%>WeU&0A-1dvax z2ArYWS7-3H)%buO_-CI?nQJo)K?Q< zW(_dx2C`vLIB*VaDBCnXX(oIZUo*xOHMoU~pUxg!y^>VTyP>$bm=NQ1u~ zTNSR*Llj3sea8Qa4wMx7s4+>;WiGU)chi@?$9Ja8m;u~ltw$%-$uz4CNo4MZE<`F= zIoJtjba1;MkUgY!@?4W(OlDG2%o|8H5@GIGG7-5}q3r8|F{&**C+?sPRH6d;dd9he zT5Dso)g0BDm6xtF)ZcnI4D>!<&wYZqN~OR*s``{%&yH)*HSThF7I4I`*!Vki$m@6w z{CT;&UMOl2t>|3n0GjHVL|wz7r*pTabwRNgYUFGpPq zT!#J1wQg&QG?Z)r-N%$JGaXE=!Gl%SYG6CCqc6jT73Nv#hroDwI9W*m1*2y}d!apx zDFeD_Z7uBv8J@AFC$%#+>I~+rNC&u(Wclpt-V~dSf8Bx3>xFIB(QtyI%SKL!{#_XK+1oR2+J_~&oPFtUWM);6Poy%so^R;Vy2)tJ5=93y_9QLQ#)j(&g|ThB!>CXRJLcn?oekG6v;!J=^CzP@9lZICKk zshlARTyYEkIg}Z7pB{9V;!}3qUFr_F6<2(#@LJ*Pg`y?1Y}`G>z3jS0Ee6$H_n3yu4(kJOts)Tc#o3X zPs!9I{gXW~wnI;3nN>tNMkUNA>QJVicBBJ>4?IinVv=o$&hMa9V57{x$jY`hC5yFp zhAT5IDS7DwR#ez4UWB9h`>p7N20a+=nU(DK;A#)53${x>{ou3Nf_M-6_`K*nJc-=C zG1~*bt%sYbip}8S3hX7EbRW#U3StDU8?(ZVqVYD8_u#MIWPH9Q{l6~%+42Wq&q59U z!%d4b7}Ta~=ilY`3qj!1+2d)LRIqpxRX49uqYLM6fHSHt&+$THY!cHY=KE3O5&L4o#+}SclV6LDq+(COAGvg0 zK_*TT&&lUm4nv+ZtIZS$l*y|Ut4RusHt?5OW7(w+a!rs}O0T5NIjya0u$wZ7&nWQA zwH460;wtcWsq5U=rJhx~)C1jt4jc!=^`Nd4E|u#mV7Uyf7*&JHs2YVWeafzT#pP2r zLW8aosKjqN&hW_Biq5KM*xx7JpH@DA6=gQ8)S1ik?&}AEW!Pwq<4bbY9O|-YjV)if zR*q8cfD1)iOP;sG$|CWxxZZ$+{LT^D=@TE^Wp&^<+UfnS$cFnZH<%9%7;sJ?>H+Vt`C=d&8T z_dfUbNlm`V*$spp=PkawxF5g6-)-i?-vn`@41}9|!QhSL{dYrhWPiql*>_{Cpy%GxATp17JgmPMxeyUQ zd@*)0MmGgtOobK%GQlr-Aq>bh(e)La!9x0Wa#n~OrUf$-o}Fp|GuBJ2BT3>$J4hO( zrry?2ajtxDHAprimvPswdsK5pe2i2N!j&7=3THwfb#eQYUPCzSK<`ooCF^*RT*cv8 z0bPQ_6&|zV>Qc)<;)*+}9`hgb-_d5kU{G}`ceG>vg`yL-S{!gK*lt?(JlW3)Sg~-~ zHLb1SM@n4#froVbTHSM@Or9<|B6HJhk~e`ud)4DaU_7u418!@i$_Ds@8QTLZppOY+ zE0_L9JHBJZbad|;lVmUD{w1cGSwF0nDA(aXNdrWEh>w>(_n$U#Q}QWH(;?hrX7Au? zZxRkn+{T9%;&10>_i+dJseZD8Xbd#bJBy3{dpi5%17SnKpLBKa!${1R!dt!K8N&Cu zcT5~a>{aUI7%cX5_86$?<=G_HIR+9xxOo+fX*TXYPkwp6g`eN&lJO~c6*y6wmmK?8 z;yhLT&ec0t*RLK+9D`MFQ1frh(#2*A;&|ynhj#m9t%%c_Cj05oC9Te*F7E|=RuKG2 zKThuDCsriop%GSMeIHt|_o%XT4;?ohpfrH&-3Q5mYD}R)Jq!N-pkY2Mp}% zZ^a7ym5MOhhBZo^9c2CID9pF6H5>cj??7)hM?qmFb@)%450-@K+z*R(-A*d?d1FSq z!*3M$*EOFqXN{TH3dN^<(=n}`aO}9R6|v{xo$nN$aTOT3$`L&CNoNJ_o(aavvuc;d zM2B6Isf+NSOkyTcjdD#Uie;5sigj)g)~luLJholm=^H19Sq^Ro8o}HEonJ@y9@F-n zu;I2O*_;)j-t*A)Itti!T&PoFKRguv>6?ys3I{lXMtRN6%$qk;Gtx{R_mUr<14H-O zzhhEyLEWp&&TBWH&R$8rOBKX5b4yQphRCLt!p5=Iz@)qPHNggFR2kd?PTgFMo+uR%qMA> z40M|v+LO>D68+PWYO|fSEBFzzzk4B6IGV7qU#7#lElFhuNp2)RLnpy^Y&eoB{E77Q zKp;+9*7&AeZ8(x?w43zDI@R0Sm?=uJuz$>u>(lUHX|eFy3V7-@i$j5cQ;=%ea1)pZBNkqUZzb}lFtyR6vhnc;E0<_vzhz<=I2)^ebo zjvQ!Z#S2AVha@?#6jpMAv2PZBlkb&EP+fot$&5&Wn#~eAdj{+$vpvFqT+oJLa3>oT z*_{G`vTbqZf>zG)VX#8HO_f;~l4w5XcAQC>zuv#(&*|PZSJ8r<##v*Bl{B1FOxx22 zl`@Y^=nS~Tjg^2w@$j!W#EaqajROCexk2VyVDwn0BOfQem;P#sYRB9P2}p8mR`z%= z*M#A0G)mSY7>MVS)#ZaGyB5wC-h`3tE-`pSD;DA=U_fr)0Jj_b7Csr&fXP|Wd~-HB z=RjyP&vBfJEUs3b0pv3)*hd8x&3A?0bj=G-_Sx*H%@@)``5Xk_pOtg0Madv%LNU~x ztW0TVicih~L*B(FM%Rwnw;c5($Fx1cLP{$uM7qXTK>p(B?*BCWMuTkTd-w3J`Xv0l%9Z3@x zia1%F5{sz*;c6C?V)h5u!Dey-&PS5Be3PAF8 z`3y$1W{Jm9Dve}`vf^h%dqSO^*3LLPRb0At0}Nh7Rl4B1 z0>4z}Y9pVjd(OBR=>wM=R{sU!>k=3apEItwr{=r=ep;7aY2;Z-c*F&!{@8 zIy`Nt#dUqxcD+IMsdb)CJO?O zIGfD}V4+ieFD|}7>hVcC%NA!UsFPK8t@c!fOfVX7;SrC*8Db{e$v&r^SA4NTf=R_m2+?^o|*oIJe$<+EB4A@akLk2UWDDm zzgT#Z!nD-#YU#OkgkV&2hbv;(~c7gBA!7q2na;Y**|%=aA}&g&3WFW3RC+) zAIbFy3FfDqAFeOf=7f=`$DF5-<5g;Ni7+1NHQA+&zXwGM*G@VE&RfotAn=u1#dAi< zQZjWpTTQ9iO>IrftTr#hA$OWn)ZkUUOUv~%uhE z)Qfx^Uo#c>LhNGvSK#lZ)V?md_7$>D$u9>ugF!5OiU}Cuv@u)PNyUT%LDU%6=D?MB zV{iqY#^A*BneVt|VMXcRNjh_d>ylxwU#$k2S71L9JlJ&(HWW71z#QIp$xdWoM|pnn z8BabCL~g*9;E&4v`3Illsh{%o4s(bzV36(&Ypoum>r44~V zF=DPh*lpboOlmRijajE`-@6(V&)bCh7|}Qu7gSPn<8Ywa7kNMS+z^tpF!-7H=}DuG>0rkUV#sP?QMWUcHiWa<9SZxGI4e6fP%0K0*G2bbwb3F;w zn5eM~{!l3-bao9ET`1T)0}`2cp!!lv;KzXTBj=Z@Ua9rg9I!9R=#9>#%G;FxkelWG&3UO@s{$!E0BCtRUSY275Rj{<9)ll7F*L&xAz;Bx52 z$Q$t=&A%0+)5AKzR|+LvUtkKTjXlz#n$+VOe21hU@D@2=Z}RHh3*h95t>w6ljamw( zMAHenBroX&MH}RIQn_WyWsJPKTJ)p69pfw4z;(reQ_QnUz zpuHE&%G|b!c0+-Q+E-`7lIvCBK7wdKX1PTLO4bMd@|ew+mBEtK=b0~ZZp&SnqeSaf zo9lt2OeIv&Bax1r^oHj`OWrwa$K7lmK_gb11`{qDp(oZftKd@ZXZxFtCGRO*L?snN z_6@vB?O6nc(&HDOxa7U9-_~XIML8>hw$U~hB7Oa^DxdF#$PLTYKL^)6;d=p<_9;xa zFYe~jTd}^#*Wdm)_WSr#FnIy)`+535rRA1i$H8U)4S4b#d$7Qds`QNDO2i3|yK0OT z^xHJaU$fDS>IG}Rg+A#H@$GRAMGxluc9trLoiR(F% zil4!MFQt1-;XYm~-JKJTYc~Ey(A|&7VH>py&bbyPIcp;OJ5NP^6gT3&VTm(BC9|#J^@WFIaY@d9El(CvD?>w4NkSNb0-zZ?sGej-9lFpQK+tuh1JW2(YJlVlnX_(F7jF|Wlkmw|9QCa^dNX#Q+ z`B{Q9CEz$%^Gn)9uY;9v-4=5OJaf`5=UMB-NBYnwhn=ztY0Zv@}A`pquPi%idvhd?!FI;^}t*%9L9x64{X>B7JF^{ z-9QJ5=97B_ZSR9asl30B|2XyY^zY*z$G-ly3pON|Fg7fH6E3d6hlp=x@|hmXI8Hf( zIbppS{$_!H!}>TOH5eV~|2Qrj*kjIUGaL(&8%lRh_A31p?W3Z7eTEwO8fmmlFbD#{ zpj~lAE0<7zGrhBn|BxK{FnD|57W}mZROV{_g%qW+P{g9)btA zw6NOBIgot*sBy=fF)CXeEkS?KP>npUsm5LFz4&hvUwQjyu^0PI<1^IXS5jX~y%+CN zsl04nUgOLozGCnXlMt$n9#9=V37>3Yas<%>6UpAC{huGqn5t-988F)#V&aWt@jZ z`U%_KW!cC?H<*<#j4XLCTL);v zN4k%*p*mE~s)Xv3X#|<}J43yA&F=iSa<+j3Y79Pr+C2x>-ojJ(6k)uN@wQSSr4Db9 z&ovu8U`l+)$MN@LPeaH1Gw6HnhyRp*>Fu|`k4RxDJE8YqhV}meg)?4(OB4Qe|6PHM&`` zo{sEWxh;d7zhFyC+GmSiR!05n#yYF%I{nlB+lFj%%Yhm6ztI0~?2X8){m)!_Ot19K z*sl^_OMM()rf=i5xzFpk&LqYtSev!Z$B&cCT#Vd9Cw`oGGxn9#@4)WYQ-78I%G=^w zE|OdwkGLZLbn{0k$#b52`=!)}cn!MWgKDuOAL6>b^O zOVlHthnz{SRL(64%9Q7o;-qt#?v=gCL>p+_awnZh=Mo#v$yMR0@SOFKJ;Q!@j&Kv{ z3p_~YP0oiDq{}AX>HqRwx*p<_zZ+x19KW%K=gMa;fteR7CKK)SY*BM~;Ai_!NBUyY z`MhkgmX^t+jnFx!1f@fInVevRv}S~gEUqRWKB8N|6wHpdjkDy+^s=nu5Z_whpTjo@ zy6~dZ;7X+$H*p~%`0FwHB6KS3tXTX(v+=*+GY<4>|5NxA@xRwN%cbF2 zkbJ=h?KN=XQv56rGOADs`DVZzPqLS)f%q zz@LTk>3sB9^nS@-r04r2yg?p)k?HNr);VhNDOB5>MQ@EhZ;#25p`1lkSE`vA7{fKd zq(HARM)m6@aUlzV>+ru;51HK4&I)ZE93^ullAb_I9O{ZMcy z{CB+nLcb=i*t$U;?%WU6Ee=q&>`5#kv_XBUmzkg5g_g><6$q(m$a_{dx5d?l?`Lhs{ zU?g&)-~!KID?U=27AoH*AL+ zS#UjcmDHX@|AoRD`0vB{m#MO-!@$?mFE9Ub{%ddl4ulph|FzA2e|_)& zxc5d(_-~U}ehvP+<&>GkHgfaTAk2iDVO1}Q1=$7~CB?K`3V)H34!e!NT#rPnuAG|QT051j~#b`{{}U4jLQsr>nUs} zTVelc(&{T-^9@-^Fv)6{IZHClAttva!IiTd4C~LmU0_H~B&o)? zV`HS5Q-MywpVq0%jL(zMS@l9p)Zi_;!ZJzC8IRZ=2n)i4vdLMvE?eWQN|Ey<2?AMD zP?-PKITF7q zZP5Mj#JKyd_@AfVjDL9Zham4wkoc9<#|fV&gFkQKI{O0dvsmxqy_hIk{>Pg|zxYS6 z_s5%mxLE||zOnpAQ261^@8A1g>U88u=;!lA%imc3!%ZFsb$tT_{`I~8>)yY=_vN=I z^{oq8%7W{<^Y!8dXQ`*29^wEDI0+io$b`%73Jdu=$w1#3VGec8v*W zSL8OG-D)QEVZQ*nj~VD@Q1@Ou-(V70-@q@gl0Ua zDyYOhb;m1RS;rR+b;QoP)=6Nczg`X3(Y3WX&qw8B#)`?SE@o9`n1xx_571`&U{Cz( z4YLRTaKoxGM&U{6>0W_BS3viSWM@piN@rRoxF^uDkC=xTf|W0$ePlLgQvX`2+LRfp zM(s)XlvxNo7lIXvt|xDo1LQOyx#6>t&REfvun0jQ0o7C)jc?zkKie_x^w`{K-8MgT!;GqF>1NC*-{h`fU7t^1*zb zKbzy?p=-f;-MPvC6u=qi>CR-Ms7IJ$;{Tcw)KO;zb)xn}--*JOpO}9m&CPGACOaBo z8jgLd$(HXIvv&GR#njSw8I(UX7yU$fJWOy*%D5l$S(MJ@21mCeOU zvGTn4d2ey?^M~13CB=65`9SeC=YsQaZP-)Vl%nre+VnctvzoHO-# z&DQ&g-z9EqM~W}T{|KiE@``>T=zAG<`!~N3eaBDt{>vwSnExvn)D0(s%H{v^$=}`k zXD)yD$=`kQH=q2+PyX!Q3lS=?vf$o?0T*3ao=sNrFs+Hh-Qmn7GE2#tYA~3=TP2tq zh4H#Tp-f+n&`AOTFvBC!KTy@MQaGVmV9)G5}{k;cGn7h~O=i3SCT29!E1*-VH2COMoW)7>CVrV%bi zE;B=Yj&23BESwvmhsmsJV~q)z3LM%92<%eZnDA)BS<1|bOwbGCiQ|-cXPF+Aj{6Q% zQ%x=pOQ}bJ>%Io2C(60pMMqqWHPZRn2u+g_ zZ8IgY<1UqneG=&(uyKAGW&?lVARRV8D*P$iA;DSkt>Op8C#&je>ri}IU~3a*gG2b) zs9p55wJiJTyEPg7-(QRTZ%GlQj>m{s%;x(Zwd7l|cUiCV%fz>0kHgP^zKgNbk#EPU zjfYG{?D*bGycqlQ^ly`Yo}QooA#+d1)4xsZxP$>0P868GOFoyH=Kst28Y-{o7e6OY zLF+C5#Adda!QEfqds$F+??<*D5$uWM_~+mJf4}*+|IdH_&42&Re+7R({^Tz{xe{v^ z{P90j2>#?92uG)E+zqm4GWZ+dT*v4r_JKX|0n*48r1FxY7WO}T>50|NT<0V0vUwQ< zUN&SNPcE_&p9|;3k#q2u+UG49XN8umRJa>{5??5n6!ZUwNH+U@|Y4RMYu&ih5#BYwE>|~wf zYlXY+%)0T1MdPkPraWZcUT`UE$(a@9HlH$P9`g^%1S;!3yS^s_E z-xvN17ugOSf9?6hCzUEg{$H>Efxks6SqZmnDub*%U-oC$)p-uvKSw;|(wv(s>0ESX zRn>c*iM$zqLnfONZ^U1S2>zagn0N_ajE$(QXDOTsUQGNp`OCx)=P%8_%c{!b=}YsM z&2QTHdlaBLC+M1(AI^)<6%G{q;VfV_*?w~GZ$A0AJ1;MPE&aXu{~b=$1%03V^CyBm zLEwM>dg$m*{Y7;IxN$tKrPenUr~p zv!^}^kRtOr_MjbQ1xTej&MXS6gANJWn6!uMWP(&yZ#X;y+{T#<3I$PF#Vf7@l-`Ov zOI8hm!7P+en{(7oh-Kn*oqJ{8R2XxHzFB}S=(tNI=ax)zkaJ!?fiT3BhQ~W^h(im;8&fvvy6UHn&Y_EPG% z$$wb-kFeqQ1$|)ezy0R_-TrUe|MzeH({FzKo1e4w#v0^*g34qoP6PC@{-&6-Bg1@x zJ$p?eYb0d0oGRt5gau?yq#FMyJwqFRk&C3c!hC30D-9zyaCA?|d164GoSoN!!jrCB zkn?akN%5F?=4Wx)vGB98dobP*N_;3V9=sQx!yo@D@r0TEy}pkVf0bIJ{*u$k;{)hq zT=X-szSs!*sT|KCUh<{X>Hht|wy%eDWZBJL@2^H%pEGm8o?uR@=xc>c1%Mo3amfIy z=}E{8=?XYw{cn-X04x+uFn2!zx|rv4wSz%XgVGTZr(1(xmR`nz9#qADOwcuZNT;@p ziRnRC1!vtH3`9}z-Jx^*-=UY$w=bnG#BNx_I_E@WZSCuv7x51_L7#8ImyPS2Kw+W# zVmWG_c_G$`zGck-{al%_=X0jkjJqCyzwbCcDn!%j;7&FhdzouLaQsW*gJPvhsXbgJ z_}g@q)wX%sJoTO=>Tj@Rf^(m4sU@}7a3rz?IOprhV$Ra!+@uB%sgI*F(|m#1;`@m! z@pluF=e-&Kc1$KK(Y3xb|3AVnlV7It_T9X2^I0DE+eE(K>$rBJ+4@!DE2(F2E`mMD zT)qLv{r^R4(qHDDj$fZD&0A}wkxLPStp}_Q5nCvs)v{F@aE44e4$*eV* zbw1BqW_s=QTU8XrMScCg-{MiRigA+tOs7%id6RR%%M|~I8np9)kwgljPeF}xg^ZmYy>bF-wG!9f^*1B-(>6)jeZjJDK7O``% z)+EYi9>RhC7%wgI??VH2->uuH{%vT{?uZ>=P+>lp5IZa!cq%d=Dk^Ss+@7T9q_UJo zbtCvIWm34Hua|0XP>xOg2+LLv`iNB`qZDot1ZJjKm~C*T`{~FNbWB(1;P{Mr7$0|h ze*W|GbNB)?WFY7PN27vfdHl8UcP8`DzgHO}UfQg}+c|&0{Ksy|CVw#W3G9cz2mk%u z-2b@$-yeJfuDa_gjtKXwoMY{3*CY zi7g++28%7GYhpKj+zJ}aOnLH>Z>WF+QDtLkB~SZQ$%hF8Ugq^HC`t0nO6*ZX^;nb! zU{5kHQc*?|ExH7dggph9#K0g?d_}?4ieW39c-!!fbqMyrdq4lm$-aVrf&=4gVu(;A zUTh{0$HeF4(=|Httz;@ti3xcB6}smg+X|&tb%sbJBxMyffYh?2jv)w=th1<(6L~d5 z_QYQYrhkK1@~@DngV;`q?jnfr>cc})W^|%WmE7}3JWJl0N6ichmUin76kFA1o%xd< z$w_ZXi3YzFbS^(7f~cT(#D~SL_sVxjx!bG{dbtS65e<@=3jmV3Ur*=o~_;aDr}+Vq)efjvng< z0uxnw>Cc!OvC`AVj12n4pV625`T4ie3y9`C!I;AwtNrIs54O#IKKt?P$CJa8pLL{@ z?;bM!eCU8xrf9s2_jjL)S~Bs5W8<-?#2XjUqgVaCdwPc~Gg^&+4aD!rB{P+p3pgFKpO7lguiqP!9% z>i)tia@*Br$>D4x<0u)IGsa=7&fHG?a}<dztv*1opmO~9#_%4o* zqBe*#uAR^5%*O^JsIOjKcw#0(F2MN*pzhhv+vCQa`xqMpD9cCYv#GE zTh4Ur=omkX1s)y$^QpfhpZB%*Ecp9?=Wo1!J9W%@prdW_jr)I`2Y=oj-e;bl@SFtx zjz7`CgJ-?=8rj1l_+vJse-eO#GO@c-^AXGm_5xtRM-eh9rGZ`*(O*?iM?mdGtSbl< z3)=qqDQt5pw0spc*2oMo8syti@B%uNojEt+>7ZcCX_=h zhYuXrb8YMKlEY8V)yO3K09CebxC1Q;e@c#?ygqslYt4Y}M#S%9PuGlCTeZx^O+2KZ zN~V+JzFAvr;=$gr6s?V{F*hv=+LYcSJkLfVZYP~ zRI?`30cNgJ13I2p%xBQu-Xda`tTJ`oIKkY_7kNKn!;8CbMyAD?lN?DVuHxo6vS%Pr z@K?buuX46}Dfr7tXa7u0PDoAtJott84~swdzI*>K=l+Ne)rH;u`GXFx;4jJhlLudUYMvx<65+rvCNr3>BUY6z zDC{eGZYACjzmM5F)E(1_9Q}31E-F3#>32Pf`U<_VuAlnB8M4p#eRbmZJw-v6coLP3 z6{V1LX)*JO-^@&bD3uyS!KTbO+eFU(A}4kCCTz(g)uTvTq(haFQj(IMv?oq;_?IWk zQf$J#iLad0XdlI5wXm^a`gi%i7LLu_D3*wP1;8i$Vh#vbV$|!c4lBeG7If9S( z?fH8hZ5_lA1!j%Zc?XJrd(f8pamPThM>Aa<1_tZJ_VRFJf6>iz&6;(ecWl#>^%DFs zHB<5@QE^dm4Qwa0!n+vnpZkb8vM*|F) z!FKAb!@+5#>S)xPK`D5cFkw*2a`Bqw%=shTM+OJStRr(Hd6REX9vGi)52-69e_>>s zg57d?@U`*RX5Z$#KW`a1F#FD=rB3=Ut_?l_Z2RP2%>C;At8*VbcpawucjWGeyNV)js=Dxp-KuCZsN9u_OR7uicg)i|)Q0%pJ1?|o z#lsWMn=W|u!p^f)%(3@UD?DbtY&5I%WIse<_b5V7-8NLcAKwmDA8JzZ-Kxo{%G7Y$e zm+Bf58<`y>{B)U0_4D(|*E^?nUq1ma?f~z3C`0HM8=7PC%~KP4kLy)6p1j}0#^^ro zsH#az{Y`8fnQ7)|7H1bsY9=+2AkRTm!W>!fXG#p#o~CXxz@I|hiQ0=yQj)61o;Zng z75w1^ZiCl=QImyy0+JPHKKbqJPw#&_|M~1sA6!}dYVouA zZx>HI_({+9j_~p4^S@B=w*y}MYH^2RhrjY9J^91pV`|MZdBRL)<&v@uPcki18Svvz zrZ;WgE!uDee`LGp&jzcvBo9a~npzxMgKZ#C`s6Qz!n+_4l~+fUDAmAV8rUfTg>s0g zVLvQ+#KT>i;J$|_*ovrDiXEOHBX1)!kQQmezPJ;IVASr!-|lMG?Kruu5cXuV;3ieS zF8uh%sPIrjqZ7(ZiHChFh@a$c*k8C8{?6tbMLVCzANZ^;*SK1Y7Bw+Qo5tTl^jM<4 zzf$wOLkCaOM?`<6SmG;2=?a&6zi8m4;<~g;qkcw&ty6UOVrzGv{eI{k>eG8f4^`lK zj#=8P#d{MUlXZMfcf^UILG6fk@afp+^PkOcACEtuW$H1M8C0gV&aH!%5vOzi;ZCdOQ3O-gl>Vk8uudD8&?ySiSJ9HT(T4=bkrRaF zBOV@nbnukSbUql6{OHX<)eP82X^-mpo6#>p*Y2y|484I0>E8Kw>4tdO8b=N(2u{t? zwa|lH-7(y;^Fr;^?yJLC+fPuKS6f#NF$EE+sm#?ID9G0R=HRBpITTMJT5n#6HXw0R z@;0M7IWkr8{@_2EbNZBSi&m=o843?HVwL1oI@hmT^`vG+yF|rT{Jx93A4UrPy0u=d zSFJE0^CZn=U&>H6hZJTPF6(;KS%u3+&2g22zjX32ZnZfjUAC-arTzE|N}(Fi-qe{e zXdTgv+_J9>ZyC&+{Ppa%N&8sbV3x^S`?xmSa>r&F8*px$PnbXA30vIfXtL!D5;c$c z#tzKBJvoQno*M}tkMABFxdP7i&%QOgfA;6z54<~iG^Rs?znuLYeE1W^_CE8#j)K1@ z2eH0E>Hw+(;wx!TmzGfXG&3`&5hMyP%9KW#)qRs`+kwoU6~*Ib*is@&@k^xJCL2#n zG<1@U2`iM!tN4P)e#D<&JucoKwm4ln7r2&m3u1!>ft#?yH&qwmKNAR4^PXVx2K%$H z(!}2bM3aZ~r;Ss|b2Sy}dUPF|xQ z>R$PC*-q1)no)q3wkC$^utd^wTxgivVYeNiPq?pZS5)$igEtOdjJ+BA@Xbvceg0DH z-pIQ(E_#hl^qlC~eKq;|H>2N=x==`n%I)1e_ zk++CXem#41e%*1!qkHm!_gQzWDPi!nS&2M8n!mhw*&~mqzNfzM?{+*{t21FsTglY6 zf}=}V;9F>_WZsU<1Cg0_3Ii&ymLewLKsr9br(YQ({=G~-ksO~+5~I1=)UbpG@BE1(B`@o z1P13EIBrf!jq9U2@r)>f2`yOQ1e8>g=M$a#6#Yj_@b@h;J$uQl1?ghznkfBAFT3;< zRnx)SZfz%Wr9WKPMCQ3Dd{6SjH*dUo5w-EfgBRc2qd{2^8p=!}!Ro6Qz9i1r4Fi5Z z%JX$5p)lpuZVKzjBLh1+{&|N?cgUt=Tj~MN&l4eAWtT~%ZW61S2D&UY-=2TV_*kR( zBRE=21S{yA-gTpfR^7yaktLE373G>sA3dg>&>@f{r30qus z^)8gTmS!9i7RP}}%ZO^QsnarM9Py1=;7>u{`}1$jS1q1i3@5(5H(yy7Y`JYSI6m`y z1b0>~R>{}E-z(oe@qM+}YLuQFwBvLZL9)--D;R7G(C|L3+Nt%aMSmZ;9Ez{s}3P@)H_ z9jE}e>C1?n9L)9}Wd7hF5nLISKy969Jx^nSrJvUY_w69+c;D#LEhpE9M>4ClE8rOmUc}g9yNl(h`mILZqx;v$-)H0r6(=x-Z#H| zQd<~%xQE=8WUadJTjZqio!;bLZOGvkCO_Z83tXYUNX~R&Kl`jRbAr-P!^8;#ddPtv z>8>0L9@{r&akM&Gof?N>j7-bo zJ(qWs-w=6+S!gng4t3v2ulhIaLvEo*rZgomDTMn)Vh+)WGDV_zAAQ1})LRBSwQ~+L zTInN2=Nf8!8NZa78blOS&ak^abOfO(?p={DoeIbEi+FVK(O*C0Y|?DfJbWiA?@>f* z=+Z8&_JC5i)0sy)1b_cFT8p;)4})vA1gfHKlN+=1OpN`z`+q()I{tCTP+b*s5q6kA z9ol(8yoVD+A%|*$sjZn9P830QIhzhC(fKtbKRPI#^=cALXxy%uP!LmfR zqgdVns)d2O#rkXpRSxnn4JomQ-!@x~%epD8*i)%}5PJ~+ZccJ2HdSV-V#o0ZJ=$nE za9JP6?o8=$ThoV?Z2iAi*s30r)m~SAtpTp^z?Q`JI<*Uf@p9_n%Ct z@F2EWjYd2$DI+P6ytAAxyg;dp``IrFpV1#9zlcTPOL8~VG^)rj_fYpeX!aQ=Q}l6O zwbN)U>_zckf?_8Y3{pemJDS)6w6|b}8SKpLXPe!v+P%f5R4UBY=jWx1+(pH9f8n5R zg?Pn{mA$wtDm5T4DnBZJQ{Kbuhwp64yZB~6p1Me%|0uRNG%!*oS&4SR)$z^fH$!z( z*XFK{zTFXAkXhW?J~#Htc=hDY`x`Lf==k5=?_g%)FR6BX%AACEFFdQuVmr@7-sXad zJjwE9VIQ^`&(xLDS-OV$9(1pfRMxK*zyG|=n2 zs$VOdE^IlReRyBaWA!Cwv8|hqcH74)99hnCIj$h*fa@dp4~w~YWU8=s=UJJ}G`bY5vMIk3#C`VMky*xq{ z^l4x|e=`L>)Kr zWNt*B0)tT?(9d@dm7ZPcZJ+`p_~UoTcISR-v_+A6?*FZYF-d#l(&9pLeEM9vIAs2X z1(l1;hF-(R?@qOoy`O0hF_l&?<=>!panN)R?7eYz#QGHz2@L8+uvZ+K8hSIL7_9kE z00<1okIGBSk1C3)G#xWlK01gN9TvQm{Fd>3v^8&B__xvjh2rgV6pH%P#_Edpe%tAh zHgd3kHuZON^OL&q`SI65)z5qAd>CCVUP5cdEVP0kbQ4cZZ{YT7bS0^kx_jrt%`@l| z^{LtPA63#l0{Xz7Od1y)vfClKRVVYN{MVlD0iEQ%R|{@y)06a~IVB&B7f5D08of&o zOy?yJIHkP>?wG_*Ozy{DU`{E!KN^{RaGS66GIwpuVa?&n!<9LehhuX>b8e{{)s~v~ z&p#cUajarvR~DAtmlhfq5{|_p;uw1kta)jN)KFNkE$p}g=UU*TmeoEBAcSsdjVDYBJ$kc$uGL)WV zQZ78V)=<+hs52rb$n~YZv^mn0Zxf^yrR9~RHgHNfAq6FQrXt6O6Q?FV3`i{sPkl*v zaErR#`m3H_^}Kgs_w`TMN-@)(ZE@!Z6;ES{Um1UuZo-;zW8EuO>At>C=hye+RYuvL zJ(*fwa2E}<&MJSy$Dps0h^dsC6O(F~P18b05;G*38n??q`mMT9dOj(8qr|| zA8ycQsH2IHo0z@Ur@gIRR!*O$(lxU|08q=U&#rIv8DExV>;^q1oB*>UU*1r(ONd7H5O~QI})lwtL8T zm!A{#8GSjvSQxNnqxA;`ecxRLf1(?Z-Z;@9U8d40^-WPKi8@o>+jh7TD=U#O$WzWG zq7i@ep;+63?S*zC5OTlh{-lN~+DzH~(xUU*-zX*wgS|g>?Sm!hAeNd-Oj2V~bew~n z9uWu+$?JEa%{7txksXwRzZ);Ifo7)b2!3PLH+Q8GvGt~;$KCYvC{sUrxI6Zxh@$E! z9fUGvOZrY!b!Els)SIz4BSh=I-TDP_??%UlRd;gx;WCvvG*XFqP5Ir&+#h<5O=+fJ z*Lc+W{dC$%-`}0$>Dr+BiBnx478gBw6AYqt-ml*{{|`e2R6FwV_KtQ}wwD=7lCz34 zi{l5snEi(bJ4Um0Rdsa3(vSE7lVYT&Q+kw`-b+`fMk`+GG~I3?Y<38xhQ1GU(w`!; zsx|wVdKORbdJOEhTF}-Z)j^`A^D-Mya$*zse`(l_AnHV$i8cIZGrB*0Qa3o0?8>A% z{w;k}^@wdVYCSpXQcf8x=|7q3Cf%&%D3f%n$tNFOTw7Ri z$9cB+me+5sH@jP18i&O>;B0l-T~1f4bDzUI(Q~cR)x1#Qy0fsdaLb+Ha!+_BY}Y0y z^mg-by8T9%Z6agAura$4hSiRTIfXl0InEz^8*>}F|L6dJ8{-GjsT@N!Dzj7$o+KNK zn&=8RqRxL@RBzi3OMIJ73=)ceC%&L;Fb!dPqEz?s_6lZ*KhWdrL@ROyzk5IZVX@@n zTC@sdy|BJ%!hbxl$)L{^nMSu(TBJu+mXrzp^a|_ME4q#etcmnNrHL&Dd&I=39@5Cd z$ehX>U=Ov+uKLJ~q`s8kBt3b=Vl4PXq$9F~K8_i>7`N$}Cxg!GR&`@>N$M$L7CWl)soJU9wB%;P!O3@KUz=QOcUtBr zrMvLz=o>vsuO@S6WKJc$<@nh$gGPFy(2Eh_GAV(WX`eO(-E*eosCg$&|I-Vf4Ba~~ zJp^k^_PB)|4o$g9#~b+b>-JDzJrea5{+~?UW$rHco7DDzKd&yfFjP+_2K-Hdz94EK zz3iU8rN0CRMi)+MO==r)2^ds-MJC0#;u=@c0IQ@cr=0e>~lIx{>$YVU#c5jelW1CR6Xo;f900Z<#4Zbstp-EXeaS zyuuk`O23Y73MHC!j7jcKuAM|F(yb`DL#e(>Z?>r5TFK+kp~R#I|1n`X|MQ^vaj48x zRHS>*qv}g(N^&S!zW{UyH>DEH{23;IBu%L5!KykkYBvX-liEoD+W;?;3Dc<6k(=Z6 zaY0Gap|%I4N>76+vO-NoL^fm=SnHaLHz(ROkJxEZkN4le{PuUOulIb~vtj*1jh1O= zHzU$g)p_+r-IbF?Ax!$vGKpWh;zcRuW6S$G-OAEEKUlYF*jJEI?f!7-m_9F^Oig{b zLHDbnT1L)yjD9p&HL_-_Xb-jo7L*x|jKmLybsxhI{Kxy>jZ-CI+S-1sh;(c+r5xUq zinI90EoAFudj2*#9}J*x5cECSm?QI?i2CKY z_s_1k!G0g3C=n&EOciURE=5HOMddM`zamBif#M6&btv|>68uU0E7we}j|O&Zs?1W+gQzm8X5nxNl!v+r)t;y&a9M)oWrL-H!fD+-x(Bx!HFdFd4XO3v z0g1(Q`E=!%7((g{rni{H^u~pD^Zr5`RbB^k0X=!%{9vr?3M%X^HFlXQ$M@|=`xd9{ zhY#ys>zrX1vw};uD(_=bMwTu$v^YH1_%#{8(a9@=@q??j{?0zzihady90@fA7wj1S zM|y3(KzUD1xJRa^4$yzMjox9Y5K(IZh2Re#n`{@asGC!>{G#I+x|tJ0pA1#g!xt>b zGlA-`kH>C z%pJ19`N95!7Tf!>;BP}JABj&6d*|W5Hmjclzvy_*{VKT$e|1W9y^@uY2@~sdf63&Y z?Zn89RK%tKQmjHOS4g-|D!)X|%6IQ)%IE&V0eohe|LPzL?M7|ZtxO#OeW-IiqC=n( zSHedR(_$u3KG5eyL}HUXAj+61eC+6?hNSekz&JN(?dB_Zh2T)EGDnro|BG8?1Al28 zGn0ibQLV2MeHOLVAYDjZTJp_^r988t#IU&_-EgV;R_zQub>DWpr4K@7(4Cyg#Bz4e zF^xK;hFvYSN-rK89S@yn&wJfKd!;4Tlx>;rJTy4dz6LKGVyD4{-AqvL-`M*5S{f4*PKRDe&0+L+NGbFO5PcQtni z`bZ|KO0D>l(VeITiT_ZB<>BciqH2A{M3ES-cPw`qT~vCROVmgvR`9pS&wp}%lJ!IF zA_!!XRX0d;E1AG_#jnG&)0HXv1V1XN#+>6uPTcWTW4}JOu$&148L;Lg2yDO# ziyA9Nonv%bR&7HgqO^KzF?TT@>zfPy2Ary~(6Pr8*~AzXSYctkEa$+&K1Z-~dZESH zzmV+=f$camF)q(c%);bE@kIShplf2Lbp7_a3ifmUU=iQ%ho`sYR-CR(JiD6Ii zUPD85D7{Yy(4zDvr-qu7*&a?ONfX+lTh*6p_nBJSD=gWTO4D>ZyT45u%Rqa7X9XB+ zZExiCPk%~Qn0Anx_0&am#Gv6smkueqjO35(M%qThLq6`M?26t7OEJ?)46 zTB!uAlR0BvMT%$-#14~dAzGGb1&thjq*(2vc!O>~`=LQqro{4Wup+y~*9Y+X8b zes4jEA>Gge`qB-1sy7#xf-?|kx>Ic1)fEv{!mot?JU`IaGi7Qw#U=ufKXhW=u(@O7f#J`Dj1cF441|VVB(}%tq1C zp($M@XQ&2>f?9Un&gU zly{4=T&AR^+7uqdA}e;eTlCS=d57)Pb62nEmdL@#6>?!=g+W_6!>6^124Mm|=& zbn}ZmA~;k%BpQB9_H2M`hS>0UcsE$fECraa!LYY@bMfBdbc4hndkq=I%e7j%YwN?) z5(5kN@;%WYaH^UuX|;{jA*PD<$MyZ4u@+db9X5pXLQS{O9dX)YEhNoBcIA8hfq z_S+1WbT(FQKi|@x-JaE%)!y9R*LlZQ0S2F-1zEGJOkRzzeRT4lAN;?MfA%lQ)aoP` z^Lmfy0(V{zuTZAq2@~c~4b0`LULhi%p|A4_wT{coD3>{GqJL$&G>n))!-C9*?jjpt zB0duY2BqvpjSBbCS^kKMoOpxMW9~*-5B@;lUUeF%L~E6lrPkg*@C?3t-> z1v`j~VZab-CRwf(>}(uJTVC&Xlb7M0Ej|#q5$BV4H5*3BJ#ScGz{^xfp89q?(LL$F z0~EU}kJp)r`Uw>yL7ylsMMbIbAq@DuW5jxyJC}Le+`W?Rlek!B2W0bFy1~Ty3jUad zOeI3R!FwHL%t8??aM*)V%84e&>R=)^`F&;H2AdL4;s!G-O{NdtM9ZNq+?%v1Dj-VY z;4U%@OL*Egq7T_DO+6H)Aro)OnJ4gnvPu?%-BgODdRlj-Mm!~Qh<6zY;ahNU79Xz->kMVL|@d3%ck3+M+g5Wnye=-X!r!Q0Df&!SqAMLnY#WXXFi zo&B8}u(wAH+52o+?G>Hf`DN8PSYY^(Qg1@H z#q^8Ozk2-rXd-bObA8FOiailsEW4JtT1>cv1HY=1?)|6m-+t!vepQo)jXqN|!!)e{ zsvVb6F)|ySIfSSq(4eca4K`FmX70}=Vql3s0>B+J^Atsu;Lij4Je)wVCzZJ%HXJqS zRD}b^Y2(%-VuAbhE&A-j$2vitAAN$qEKqo-z+mcc59^LY3uA!mTEU>xDJ)k>^r7MN z0erw9hj#}41B2e-$5c78u)Jjp%j;mxSGG{@>T^qk(zhT=h1+gHp=KjzLk0T{Zshn* z!+&>u;ZJJ5>v;0&)axKl*za`(cc4&M5dM1=&86Uw4hN3(Q0P#~<$^or;?axkpIJ;M zCZ!eckhuVOe^ULBJWMt7lwZ9dHm;0^|FDe=Zy(%g%jkLIwN#m?QOGQ^XeO)%azAfE zTdpl^qF4G6cliYO^+R%8OHv``Gv(UCo6=7bf;t4=1A&r5^XD5|u*OH3+nZ6)jlNEw zO7111w7R5vkJw;CeV#2Z8m)V`^!VgY9C>uv8Cc6(|N+ZlR&SNSYYNNV=*LlTSFIyvbE!V-lG?ps90w6 z(r<^yC_9#9Ptwg@bSWfmPO4Wj0%S^=@*=#q8IMo)NblvN8*Y>{NoR+6iJ9sc@F%_O zcM3Fxcl2A1YypG9g9G}|!Y0^Ha3_Zeooq@m*0r=x!{%BTFc!pxj@g|WUTemdhaX=P zZx1yV3|I*#4lGQ&h(3sY`@mTod`EQz^!1Vt+z0l`(Fry!+*-f1E?l_0ZrwOS6=ZPZ zF7ZeBcOBmy_r5Xr!4MV~n=ANx7xcXg>OST1i9CZmLE-Zbl#ND*|*Thth_RI;gyO%LwBll z)MyH=`jV6zs;)#TBC1GcJ4JDg_i%@&lP7g!vC}x+c#I)jJE^pYVz?TAX@<=1A?CFP zsEV<&Ho9&bsvD{&YtyUK45#u;8k_Wi=iMyYZ0O4G0*~p23d`eqZ+$Gtt7z}Tg5I(B z+u{eCJ3}okiba)YdFPI8U;DoH$FQHbEvCJ@HK;SDeX@SCzPz*7-ZzYQG^QF^v1v!P z&l<-nii0AjQni+snM&3xI^VC((?||#8ODNs$4TP)9k;YocHoD)P1GB~XR@PTR;%#@I+c8m&A6Uj`jpU!V z__l&T%f?nuj_)%3H|I&KsT6oS2>uXz?O{FG{^=;g@AU>(jF zzpD9)cto-+Qg;hwCZH$=$**!f#i|_So)z}{w8w**NKUl!C@Z)G?m(Mzg!jOq#Gryg zQSE}ly=Zcm=xYtmSvOjZ(QJp`%+)QX(!Pg^Q(%(hr5)7aJmhLu3tl<-EjcsUesGA{ zE~w|26=r#7uRptvi)SW~RIncr2kRJ4?D%U>#LsGY2R zTt8L6&(hL<$JQ)}!D7ER_~%pqeE;9?Uz>YxD4cE%se=gan0LuXx_YIT z4!bN7h>L!J?O0#@8|<*ed%5^IxkhHub(|Rb9u?Avz*jF+}a=RxL1ii zZc`I!URYU&`|t^SLE>$9uY$?j?i}A1YRIDgdj)-#An?S4Kff+G+j-#w81G$PeS*sO zOa9H@fWJ?`;+I1bjl6ocO^HFiBFntvl0)sQsje zidnMRA7>D6xY_K+(MFS=B+Cp67x>!hYTT4>%YeRs24@Ee%knjwZGtIM1X1{KfSuN+FRdU z-wgvU6;0%)Y9dpMG&hSLDF{qAOx4EV}Vx!R;}fnf46Z&C00S&9;d)_qj6gw|q^7YHs_y6XmdKtff6h7gy(+{VQUR zAMPh#|B9$WaJG~9Luw-bgnl32x@RW}>1s6CI(qA zUk>fMnnxE*Bel;`w$c=Xz)M7}f;&tNZB!Jpt!5ExCi zC77v1+9R_kUq1cz*_ThxnR8DXnG*)~uq72_yyI)KEM=X>G3{9B$m8L3+a>s2GjeIz z;M~H$vXuy=g~v1+mu-vFC=dEwcih5my$f4?!hLthK(D%2h=}7h?tr}}&TV&-D+dnD z*+5I9#J^GlIgUR6Z|1HJ{Zxs0;XkpxFyHrdIef2t{ATDI1&@*$r1KwZF^p#YnbIvA zk|b&@$$$rjxiXlodr=(4r#v1Ql=fwzWLXoj&+pfAp` zbtHbIrE_-djR$}A_`m(jzmtL9!H$twl#()ES~`fU6faPEkrUv&9c-Svi%pR}Wyze% zWSMsE^#pQWZ*b>-IrQle{lv@?X`$kDiaL>7B{hwy7YG!e&qE(&H#KwVr<^2j#YA|n zh5uPz1%u1U7aW+WAh546?#R%|C)PRZQ|n#p8T0m&aYS!&Dzx#&R+GDR*)Hf)&b3e_ z78$?~v|xv0$H)oJSCSuGqXrU>`YOzG$T#f{^BAf4=6JSx?znHSZ}AB8MY|ra3;S(R zG%z`Me@5RCCH{Cu1R@#0_vXIF0u%d+{Urhx?h}>yuB-Bp*B}s2@ICPN4E^P+XR8$k z9Kh?B%CK~dh(@RdB*^|C7rAS{AE{)X$v8XM;31pXWEY!kz3i6vcvogT$!k1j?pa|- zwz6`f=}oYaIl!;s+B%f)$G$LGLUJ`S6PTHs*b5Y&y# zxa?TrSk8=V+iZnnl{#BLCk~r>#22PKAK`f`8m-&wjj-Mw>~Zh9s1$ODeTOzgy@k>D z&5?t-i!y76_vcJ1`t$1_D7<%~=L6VY5Vwm?uie*^uYmWBjN!Ejmz*%!&Ul%epIObc^P6*S@((giICRzw8{ zD=NqgB#)nlPt%R3XCgz59jAj`b_dEe%%&>EtXrl~XQ4Qp0gKb{p(qml8_3yFY1P(U zsx7TfH<14$`>d}|s|~2`%0HF=sOVJw#n?wh0ftAFkBZU^@Lw$!mD6OS>u^M(-9BtC zk%;79I-Bh=pz*f7+1|u^%hzrXdjx$p^RTHEMPcp4xuvdBd+%`La40^x7Tc>CGdL}d zU($K~56oHo8ThN4(wVh%#EYd64H4NZo~dbY&q}>RdX%4031PzsxxcS!l9<%+>RBue zl{%?c@471SUxHrrl~qhx?Fu(BAwF8EV{+f(`3dLw@kb_~{s_Sy{UiU0zz{5ym(2yT z1!WTa1@p5RbgYNu#2!`^4%X~HnR{}*#sdCi8$3+Hob(p@Eqm>^>BPKk>$NQp&pIt* zKIgi#l7C^gW8Jk*XIz-48I1KU7{S&NU%a9a#O|(hz#U(~_v>3Il{~aZMeK2!2qhjZ z>Kr=NGoCr$70)xz9~XDtzdug23-96Y4gD+V`+hVT?D>y$dkF%SOw8H$@B>|B0?FJP z-(pq;T2wZ7ijGpY7UUA&<)LRFYU_~wN|MOwQSyC@LYzKzq?aB+zN;g$ZR6r0|NUa->^PI`eXwgRe44 z%)7?`%YnZr4)`l7%0C7EmWm!7yIBM(Yr8?8uwy1M?227Ak|ps+=a!LXv;@#HaZ4>7Ls_9dz>;iv{*UE;=hI_HW%h#5#X~(o!;cD<)UJi?k%}r8x!SkEb4U2GmRu8SeR(uIPc%EMCFsI3MYDY zU6t&_T{hgvRBM?8kQRwmP*A6A+k^Q8Tf%=OQVHjGOHZs|Q1}n@VUK0Ebb~M;9LUBr zPBa{POWmYyVrx?ld*8MeO2>)#G2~clX7GrYhcAIa6>+e{zw5+S!haUWjI)(!Yy14R z#TMrwPZc&5Tu~_w!}9i`f@yMRl7s03nZkT!;7>*NncNE~Jp%qNd#X@WU*_W#dg6XJ zKQb=p`+DeVk9dB&u)2c1d=6I+D=Zk4NJQe4SI-_J3YOf}TY9l3OiZRjrWD`Uj`fvm zNTr>OmDuwj!5>kDSl$@$Ckk}&`4s#WWC{BC8eGT`&rpuy8A|qE6bphqh5M+JfIr#Y zkqvjqhL%{6*n;vwlo7&vm-t`xcc&bs^T}=ssVk}8YuIeqYgnpWs@zk3vGQVNQGP_; z!-J8@>S`=7K42PAv8O(!J+m{D+)6pohV*d7w5vu`BjpP3HSvFN+rA9L!HMu-CLGvk zcVl;NR-TFosJ(bDZFsNU-6au7FBsf{&%T9RnOI=m_*v%SeKY#rg^!F{rc;XTlo_ki z#TB^wQeqiXRz;UZHUWQ7D#5~mve!#?ZB`T4S2K0E`#ba|!VPst`L=tJWgOa@T8c?5xeKTtkqg1vGw&~jf(77OoBi9qP* zFYsAT4{o8OsMIzk(FdqoqaVq_D?9iT_OmGhEOLYc zB_2M}^C~lTp5ZNjRg+ujq<8F=^k+#FLLF|6>gIm@>uRg`lOK?OnG!zZc$G*)iF?@& zjW77Z8}vsUf>Q8@1)cZAHsPFlz(2h;Vj$Bs;L;F(+#W8sZ5`YSFWv@;(Kg4q`nIV0Q~58oJ{stmNFOd8 zzIAPjqZbUWTx-Tw$C0spiu8yO6=9e?eS7u5x&wN*XxM1-TOx{XP zIswm5?r5o?C!VBln4b7y>rvxy$9veFZ$`gm+SW0pZgS9EsojGDK{_zSYyQ#hn$e*B z$bXk!;O|HF^RgjQyuK-FoWhQRyh*GvmN-@Tkxi1IldUcI&{+!p*jZM5u;baFac~*C zki+Dc0f)u$*5bNz77xP$_q|4K*zVXrU*);%J1X(U!XX&&4qYQ<^teg1yTvCN>E89_ z=PI9;x*JgkXO+5$^pYF_vxhuqJV)sWehUWtGd42_0u@_J>>>Ee=aCHe2^aeDhaX6; zx{WG`WbCQ)9u7?rHDDu0b`nS=x<(E23%tLbAW(24r-z5aZW=Eb^S=`03F17=SY&&l zyh~0-KKg&A8~zgnn)yinR5Ucn(`?F`L6zBphFzJa%b&d8jj`Iv=S~Cln6W zRhlO28)^gb|FFM?t|Fq2{Gy_Vl@WQreRETC0GN!z12ok;>VqtOU@sF}tDuWYTEFcM zC~SiD%57WlcFJs0-Pke`H+Tm-+&Eljcbrq#Kl=M2YTO?(o(asBDg<``eU*ON<=RH*e7PtZSlQWepJ{;Sg#PZ^$_>Twt z^x3bVn#Ie;=t{|}7)dc=lp2rdI8i`4A&=O9Qml4}r1p^-8r>hpX z%?kcrWpmfRD){qTV35Zt!1~HZe=NNF>c5SCNNqtg_!C3oa+oEI1VG!G!pE+1Lm+oWm93 z?`iP=WJ8t#&o4A3aJS5;m$}U{!G2x0oY+**5C8Sx0d6iP>sNHMsH-S4?-YJtDpPefwKpqo76nx6#r}2%SsFo36OrC+JnofYEm^MEvEE_ox*!kE!}2!qy3dwr3$l66 zW!lI;*G9Ig+fvVUb?vbS+B58zhBL6snV_!^E1WapbQ~G9qBra$`mMI6Tt|atK1$W- zBWADG(??Q7*WCoRSo}iSEmuYU?=5^mnQ=Ib5>sZowOReS*sozwrnk}4^m zQ~jOfNK`AlCzcg<1AWq`+5Em`{#WEybe&f4mYa>_?t>gTWH5yx>3Sd1p@< zvC+pJiK7R{pNv_?n9IgFGGZLm4#J0H>-ZN=e7{v!*kTyH={%STBRp8{lGsD?&r*5A z{;qHJR1tUdQJss&M#mF(oB?--Kp%eKV(xq{TG!|Ef5~RJuSdTT3^HRv@aMO`eh*MS z-^Jt|*?rrtsH4#Y(o?fe1e^i-dda}V5(P+~^cgDV$GCPoFA(!etU*)-+K73T*L*IM zPKiJ`GM|F2*s38*_uY2(NFHVMN7pL=Bw0hJM33Mh~=FKpI|aq zQRqZ?Mx^XF>Lcr&WeT=<>dm$3hQQ(paQ3J&HSZ!(Z++hH-`td1l!rG6D$^9}o7ov` zX|j=nAp;|khH5O1N@pXUAN3G0*DSAye^=~}ua$#S@Mq5$Uh2B>VN`2s+s&@c_HSRRw=9Fa}bU_!kD`yDq)JpX?TrDLz!w{qeHcUvvm!mBklaW54K6hMtWKDF+-Q0y=FA{m&Y)R5jsZ6A^p zni7f@HI&>!DD#(R$U)z&WBM9CpiFdLHmuOq!<=zmvpq&CZYV$5&PP4Ck1bm(?A4M@ z41V-w5~Y-ZLTYjf5(TlcQ!)%))hfQ9WNw|{P-fO^h#*Vxrs~ns%Rcy}U5zTH?PB5f zsxBFVO`iI6;*5H1Z&d9P_V>}T07Ghiq~`a3t;E6L?@?u1wY#;PN^VAH4CpH-4k^bA zykp;os){*K#JqhxwhR)5z=q9O;vieJ9P)n;PZhUCciLdUz4mCE`&^K%%vNSEv)>vP zGCBi7drdMJ`vtU2C z@5LS~;XA+2XXbnT@voo#1b>r~u>o&VNfPVp$Dd4KU~@4$AwOa^U{&{_L407Ig#n%T zfD(mR9Qzk@@#F?v*{Gf;XHY&f9l@V_k;p^PxT>7~1(aMMFl;e_UUrFo?~;eP3=WwG z1ODEa`}6Bx3;u|I^Ff>NpFGP)I&JU-1&eQ-eV07+Fx}g-7grRibQW^A$%F(t^;5+M zl*tFOWBA+i2BtmB4E#9du|;-W%4RB1N4JF$OtRsKuNqej{fZifU2>T;U;?sSqI_1n9f_nWfFP7 zftkb}(bS_d?T)r$PIPCf{bE-awU9ttI&rYzuZcY3q{fCm)dzdXq`}U)|N3>obr<@A zYUw-Hx_8O;W+v?O+{Iim>0R|J5~|6$RFlCcVln2SmlpheIdm0`=DTd~d-M9Yc$8sS z0GUT2d`C7#L7g9c;12{!XIKUGT!|~h?*528g#lqf!Ji-(yNv%AoFbN3s&xK%#czH6 z7?fPhbU`>9lHTvgJ%6Zs)z-_5teg>M4LP^XZl8Ud*x@ai4&%vob|cW81bx|bg5c$m zdBF;UKkTw+D;1IzH~k`Fr9F}-JWU4hE*Ly5Y{-0tKPi{{nxs z7Aj1bLY?>o)u30|I)9gWJg$!L<7;%i?bko%e|#?%U^!K0wa3GMlDj%)bu#5%Hh#2n z_*hfPk`oa=_iEnt~LLSjaJJ+V& zn#+9duWGW@4dnmI_?I{GFB9FGXeRG6Wopo3uamQGT4M_3B4N zKiLc?8EU`%_4|zysWdZJQeqA~KJ-dqg;nHhWzvyo*>5ElD_(pmbF0$v{CepKaO(Q_ ze~`_%k0KiB`Ou@g+DsNYs`>_ayGRB)H4pEv=mycpp6WE>lagA&)l_R1+!x$V)Qk1J zO$J3Z(r2$w>TkpzU`}emF+3hCd1mUr=hUsXw!NJqM_LJNEhP z!ErXUbo~4MpZ&{!`}+LUr#uXz^3bBS7w<0v_A65uP_lqb;bltqz4NVXJ>Slqvz@bz zN&V}}7FIjR19u7*1&;=Hf80VDh*nj>A5}T3B(iT^c7jVr8^*)-?ni%6g^w<~V+OSA zOhy*|;D0bw7*8g0$;A3)ERd0H!s&?(2C0FR-~)CM`97+=QTgcD#r&eY)Vv!+A^{*T ztv0HR6Hf-Z6*sSK424`pQub5$^Vs86X>-I|G|E3r|<(! zZA)E`WFvC8@REh84k6US?lRow@zwfKHN`}&9bV{>>fWL2d5T!ZIOO4dkreYqnf zCzzoMC95gBZNiT;aoQ{@O0l_UFX6ur@BrUbcIQe~Yv+Yk>Wz|zmm_^(f<~FtBU~nR zNI(1e^Lh&UK%Ow6;7|B+itiV{PrhII83l2IKmS$@Y=Lh#4t!7^;F96$alh&(EY zIKqz$1FjX&*Y~yUyqmqc z$x{*!e|!EAdPmfb;6)BdLUACP1D-)r7XG+cUpaz4v9H2=g1^Z`axx0?v$M4~1 zc~4RF{`k}A+Nj7)>n@|Id)d5h*>?VDcLE5MIpo%{S7v>5gTy*E6LqPmhS<>puDGWc zs(k%K9f!y<%j|@H;@@c|B>1D_cpuRS8Nfs2txt1=33G{unR2xFd{%PM;sN^WZ;BT< zb?$}r75s@J^#teBpt*qHdwZx zubZ}6bFH}@+pROa?^F1&m0g5_ze~b@^oxiW$dN3~i#e9zsFK7#uTp&U1nh9G-hc-_ zu`3cEUb23rDv5~gL?7&mp)x1AlKw@{3WmP&kQ<{l}P8eu=S z%jt;MBPEWP`mWerQ6wBSR-@sSP8^9pJ|F@S>&rwL;zN8uX6{SOmkrtkIez;ouf=jo z4fjU`O(_@?>`4`*2PFP)_#^(1pXGP(TLiCC5y|2+c^$%U5)V*1t!01g0qXz=ThqHy3L-yIh^8Pr;* z!RI0PkNPnW(75>d{CDH>@B0ydl6k3B@K^gH|MDf*!ha+N7L}w_zf>s}#h%0}-Eh(m zw+;R~%>-y=?=&$+Yt0PE+ivw)e3k=jBY_XWqTo-gud3#8buZgjf9w)z0*6iHYI@1d z93n3(wfS5Hd!qTLA5pQufsx`prIK|Cp$`;2FFv> z!_U7-^l=IV78TX!lZzqtMSsw0u6MMWTQ`Hkv|4k$r_}=!_Srz+n8dtIL?d)0fvkPJ z#L-;10->HGvef|)GXFYy?_jYeNE>5qSf_oTBp3~$kIrw>sH9-ah$C}8~j$NdKW{LzP0LcUh? zsNeG)pE7;SMMsDz5L9X>(|X173j0YUCmKtX_%L84v4zAKu${%%?i24193Ehsm_#J& zvJV}MhSoebz<+Y2L*xY$-e%MJR_u(_M$w}y7Far;24K4VdJEISWe&^U$dHsUY_nu9 zh=(KjT45R6-?B~3mj3ojhEh6ro-xEJ~}D+)GBMqg7A-#nIZ` z8r?bBioTRuM+g{<>D(u}EYyJHWbgxn(Vhx3qQe?42Y;nlT(uH;Y^qP?qYd;q+8X)k zp!VSQQbP-wih=f{=MRtO8fU1JyNNP#^)hu@6!w95EE%A%Yu8?t?4VPn_$x^CBPj}U z@d4?fIe&s#`=5ZnPvAe|U-qkwjvgO6XqH^4pPK|PFqOi5!hY!J!Hq<*Xmr7oA60@k zvBZxRwiC{ipOWf`AP%+^-w`(StEGkgICPzJM~2S#1?`iBvf0)WjyQG8;kghecKPmTHs~Y50B86PRws72wQitp20ZdEvwbS-#P?$hTusP-av)wHeqb4u5%vq~CHfV0 z5?(vC7N(?gEyTXJ;{9c)#Oo70CKM*%6K1fZd<*x(E#__n>L&TCduwf)jN+bJ7?5rc zc#j$!Iq1BXG)4IVWM1~dfhDzjsvGKi>h&;TG?R+mZJxFe)PQ9~5`L`RAtq^t`>?-6 zA5Fx#OI=Iny3W<(`K7{t|36c20u=RuuKkL*;1VTKBdMCN3Pc1%BV-$y`c9RNYvW2s zlh~=RDl~4;ZqP9q>C~yvja!2owC0SETam>L&?vMyccd)^x>ckxE|95jq7zYEa7)z0 zeD}<)y1(b&$();iDTqrHo_?3-ectDdBmPkd8vV#@lni%IMX`-k*T$^gJ-O!FdRTeb zl?0f|b7|Xhb~lHygwZW=c8Rh=1x&W*c3E@F#>R-U)r-_rv%TDhC@M(Ig~{ z#W@CVsGT1D8sS*~hhaHKog<6ad)HPT!{ffQ=}B`+{bMxWwP?@mZ5P?i9Nboi8u}q9 z)VHLLB(m`~zCTRdOXPcW2Pm*6G6&WUTnbEdcy^Z(j)L?c{J5*p{|y-X)h88T`oE%| zD#38{Q+J~1r+ql(!Z(;Ft<9;+Jb?a!E6v2dF#hO4c*V$XKuD`|A2E7fsz9R-tOJ*s z4$$XJ;wCkZQ}@xS|FkcM5^yGaAs5iv&$G|VIjWk-zQZn^X;elMJ+24D(e=>viSHNR zl?&?brQhc3n-Hg)MuRe|P2*8F*A^}-aAz%}0<6w*Q32YPo@MS9XYQvSB)i&myR4WQ zo!iwPje_dHVpl>%@4kTN97qe&6*Cj2|CK8G5LF-<7~VO7YPLJPWT&sdMCdwSvyKI=UJKg6j0i1#%kSqaMm`&`w!?{-xJ`4{#X{0*##DEuflhu-4=S}e5C&4Y=6nJASWbu={H z&y%Ced0roFG@^TXUipo_ zCVrvsg@1SHF0PXg`*3SGKZ2P5#-A{#4I*Jv_z5E_(fE<#SvWU`KORPzzBh8QQTqvz zsse@0a28L@xN8#r=Gi-$svfWWy5;A(&dXWpp=Exdj9`~T55Bxn~qiIse`+E;U{#~lso6&nP zmqQtt4m+c5BzbdKin)k^N5X^5$kzsNq2T~(UNZ=s3}U{;&1qiFkM6x?G#W^dM{rbFbsPO%D17_W1MU0Vn@AJr|i1m_c87 z?xES6_~%xpSa*ADAp4aAD-NF8M4r8ON}9m)%;1=ca1%)C`*ZMI1FHw1f*DX@E6ecQs;b(@ z9L{qSEyAs;O^vnMPwd!?Q=_>pnN6L0XldqGZnb1)UUI4i92j>#J%Lw_(R=WkQ3T{R zyK&t$`ZIi;@LH@R8fs5nJoK|ld9scE@*CY3Z-@!*>)z0CrPATs?H!u4mAzf?Wz>5s z6$cI73R^K2?V{r6YoLx83F@Rr2-l0@@5B7G&}Q@>{5j%Zh<4;`qbvDW?iHd@!|-*5 zg(=SW?y7vH;bq^Vz$5;3bLrDc&}BU)b6y069dIx&b$L3(%V;k>scm@g1^N(JX=*a$Zdyn7ea(^TKjpp*z82k~& z?AejSR&??TX1~gVM=T5Yydg3B3_la@t_@ZP0{)H|72vSa2PHh@;u2%_G0~|0&Ve^o zd_vzrro&O(K1Z{VH#BDrDt}@hUkmLSCu_o-d@hZxcXY&I^r`>VSI~v_WpmnEx}jS! zIq3=3M6{Jyoac8CN>RiGPj)rT|wAC)q7-L@MrS4%BTYi`@5={fy6g%!iyrQ<1W5X z_f9EhCQG$cf7m9BU2>Mt2X|1XDq7#>6{EKcDI=)6+-F&_K7yc5A+*s;aPsi=z->y&?`6v_pItB8+M5QszOePb%T zRUa{aqzET$=`E4YnEod5XBe4SF%evce~o@!BF++U;>Ej5pVs_TZ{f}x)gSoFWH0#9 zwS~;#Uhk^wctqtlqARJ5Jtg{%T;ksYP$tC9qwYI|i>kZ>w}HrE%D}hrLNM?*?7Hef zco=HH`5~{t!MtYdABFL!&LfP)*G`5R!1v()erEogOWn0OEt2>bzJRoV&sskE4R-x= zj#v{71}2FZSVsg5cO4fE{FS)#nEZw(Z|C#27+dLzedoa+3I&u2DKIHvMfw`5bJcpf zMREZA9ZZwjMcC703#;hRUCH^V9TZoai?VK`EFDmyo?<|GFZgRg`DZd$!Mwl$E{!Gr z^)pG2HLlRe!mit>3TC2fK|fWof*NlY7#vhCJ?T~+#l9`ngv(K29ca|{M=Mb;yX?%y zn?){AnBh_<+)}ma)TUEGych?!C3Q$qc(Bpab{{RxU00uNQRycQ*U(nI@!1gO*3v98 z0ij;4ie8bngPqp*(AmHD<;zA4yolNYmWgeTqsHEFIXZkXFjH}qezW!$|1bW_mErhD zYy%yNaADOH?`NV@1AB^st9U=W)24k8p->+aF6mA9l|mMAk)N5vM-3*&h=_`K%F%;` zJmZ;7Y+nm>p)l~Y3WXAi82nezWmroTXCK;K(paLye#+saK;6A(Gw z4so0})GlbQ@Z=!(l8+Cfewmo_gqld2^x-gjx_&W$&BJrxY-Vy8dD%t{WrKa5#2osV zJ?pcPpXE6RJLPrYCi>kjODMkuBiCD&cFX)Fn_byG~X&k>Zzo*fz@)K9o)Pb<)5p}M8BKi`D)`=MdQf5 z)u{0!JXQOapBhX@SbJ(P_0PS=Ic>STO`vux<)*Wb4Tt~Z`#&)Emd`rK$5AjY+LuaT z@>XCd4PHC>MT6!^%E8)=yT}|Biw!=cSn1-iFaPm_Jv$wW-9v zXO(Y&zmaqxTsy)MA+P!2wfS&=CpFAaV@4uIrtkat#6RvVp~lkZ3IvjQ3pF<~-a6?+!rQ>?0@H!01ICH%x9be* zK62@P-;j35@QKlU$m|yWq;)}W0RHMhUzPYe1nieSf<-wf^f7yIKxolur+wq_V5T)^LXtARS<%gCxAYbzg92Yi7}u#atp!~9G* z3g&{oZ77Pi@vC@@c&NyS$FF{dj~IC4>trq`w|r z{zzsZ!@DMeS9g^gJ&2|sg~UATX=hLx1hFuh&&iKt4E!G(Sxh2cLVtk%htC(A zTx_g@1N1S&Kh#V-nGRU!vorCvJLeMZ><0D>H|76d^gBT2-NK`{Ql*~9yLbznyEdKH z=5$y!J<#o`b7?Pq7`_ngGP=js=mD>pGonA{k{}L04Jf(H&I5VHg*imPHdm|54GQUT z*>Ia)(8At%hAASQBTMF3BA|%}4K!PE{R{fD9c(Lf(W+N7Q_G>2%kj88t*GfW@jZX) zU|nKG6p`$9l{EHl#Z#AQ-w)f)6n&MCtSfte{@IPLvSp2T=uVQ_?zAR#+#^rR7caSu zT@t=dBLW3D0ER2-*G@{`S6*ypCr&Z&qP3t@9vjjpWEGe5FPWS(lbNQtRAsz0>OVYS z*rr?Du()AtP|m)W(E(1%8JeTGCw#TTR)urxHoB6nWZesVY#7cF?O^K&KUQ2ca0UYP zd-N^bCySjtA|(G7?ZP~aCL`ha7yh2z2Q($>h@R4cL=yq?1CN@g;1vB5mET%)%u~A1 z172SM8vD2x(hl$Z;M(zC?gTUYRW%4FO;kK$WM^tZ*uuWs>OLkJUC3%Ca%<2ArgWuT z-_7RMuf9KlKdG<^LEk>`Ck|TZlQ-LQZ}@8S4z!TE#USQ+9kq&_p5$$p%Y2qskt2!B z>!IH$0ef`3)OB%Wb6bdln~8qsnYx{aeco!Bn}gp6ledeOb4;gh z#U#W@gLRQP@42+9=-c42Dmv;3Nj5XRyHU!q9FKld2W@_tn;=FUU?kzxs}Y`nCBAv4mKWO z@2C~spUY!&#ku;yK1Xd0KcVhGO;SVD*`*y#n*^$QoeoB@E#Ml_iB^>#EntZY-`a2USkL8wbS4Ex|w?{ zZrI~{Ke(~;)!@_0$Ib@F1z6HP9!-FxkyPy$&ZUZYeby8Me}{!Gi@bBT@hulsk?DKhffbLC53q2eS{dyjG zM!!Tas}AG{dgrgns~3oWeN2SuKIE8153~9>tO2p5_8~?@Cg3y(`Ot4dy0C(-wOP|@8?a#dzPCR^l{PXYbH};9yIFobLq$I zx>vaa^?~qsD`q+K-o|1ca@0}B1zUVtMB2FYn@RYp!K>7`Zo{Xbf@Z>7?24oZ9+%!f zZGY0))L64(peYMB5G3M=peTqID+83~5CdDw)R$z?y$mc*VCHrJ-@5~+f~`{c-L7Kl z>#3sqjd1PXScI;hKSA7I-FT)W^vCQ6kFQf7GP7<##Z1t*QqD2lVmx9U4U1eDY(@=} zPEPsLY0GCx8Bd&Y*bv(gR$RVDejWn;W}t{R8m#O6^ZI zuNP}tqFLuK_|{=LvyHg-d-S_N^pjtX9-%RezQbTo=xgVjq8=5Z@gpN1S~Tx4sz6Zp zI}11nU4kOuDkch-@X#z{w{dX;7w-HP|46?jP!@XJ+`$FvDWTn6yNQ4=aj{_m_*>9B zxobW>1yPVE1uvKj^udS0AkJ;-Oo)(^$hnh1-322O(uWWObwzFg6`-oV-=iPdmy6!o zKv(S31OCtfrcs}1b|l3&Y#pjUHVFAU9%DZAz}9X}Ch8d)1g0J@l`be<$0or#?omD} zDWxK$^8kO!yIa7YIGD}0WM;k>Y!C4MRAnNK|Kyw@%=T`!>hy@qli50o z8UA4z*lR>pyu-fQKGZ(YGSJEt8Q+cZ?3Uwt<;p?b2e0f|Ru~EU9B;bGh0B|%KTP{! zPCpPByR;uDM3n_E69M8}bh0kkJd>vgwcy!&n`Z#p)D^$&wk;?3-rhHWO^*y$c3Jkm z2+!yFrmX(l5Gl$XN4B0x{JYB*`Ve&cn^DOe2s4JTFhN&>wJLgi@*2lp9HE^&g~s<| zzT{>n+eza1RqIr6(Z(74v^F^duX|oy^Knx8hTiXO*q4*OveHqtV}l=X;p^4l8x7@L zIK)ekY4IeY+*-SkC8TXt1xW1EzRZ2<7)8i-ro~i#)NuM$+xS@nm*7uPQV29ENaCmP zHygAO|M(`{fj=V;uY!RQ11OLF#kG6kfXe*^K1<+QXm@CYzpN`iRK~@Ig&=Uph8qP%zI3Q)rYiSn|J+cXe!rL!qHEk z8S80yKg0hZtbo*h?=uh>&b8=IcqPs!R;`79iT+GD#KY5WruIu_7GY-kG2eTs=5o!q zH9IR`M-5ow*4=ucPc9sK*h>P3_iUvOsSYmEugUL(-Ruv~r65^K#zJnEoV^K_ayztqS6g8(60vn*f};h zCfMcAFO^>Fn4=xN}V+us}5{8va+yunD>Ss}ZEm8Hp}}&Boe24d@`iV1d6Wkk50i>qO{k*Olw*xOTZ7Uyk{` zles~tzC!pr{Js1*v>P{&8gLcwOChbjI7Pp09cWSw25|Kwek~iC+j}o}fxq8sKYebL z1H?QpQS38z%jFUwM^q`JP2Ys@5x~*2DeHsrlRF4-2^Cn+E#W z1BtoAJ@NRoTK3-V;Ag7Xr^*lKNn^G#h<(iQdG4&9)cvs$=`GnAC=mML1xOW$9#9$h zW`0EB&5d!ch(diko8PmsKi}Kn^~S^d9VC~Ac|YbJ9#>TnJ0CV8U@SFdgvpg1SumjD z-l;sMZgecLh%2;9j7L!~8ztHz*;d|WYJqV+Vr}$(=hNjb#ky0$GJLH*;gV7X_gue6 zC;iWE>*>iKQd`8f#w2BIcYNWKgG|h6u7rF!s`ezzpYZp7=NH{w{!a2u+GmP>RK>)* zNhm*l$6pwG`d*(+-Wr%Rq8`7}=u3>qIPAkdelDDkRX^gUEf)@>7DUTH9wrVNJhUA4 z)=&W&5zxCB1a6=g_xWG#Y$OK0+WoBS3LE$Nq2t$I4?QHiPG%=qjtJZ?>}nVOw3mq^ zVB)nw^5tbe^E}M7R503J7Z=EUj_9Wy&3WvD{IPQ>_zUL>BNLxAJcx|Aw}krn6Y9X{ zUT%Zv>Jk6)1z_-jO*LR6Dz|)UlWmrJOft@KcihZX7wPaPlX>fyeJCcLBj3uKT>HKW z1_oz?#?5dqbJ_6XLM}RH?Yq?(e6uEOxfw#A>b;%zgK4*7cI1?ki;wZXIOt7jE*uaB zSZnAzCY0QP(bN357sqBMYamie)aj<4)U!!9Q%zZL(BLn^gcgQ=m>xvB1h|y!vN#v{ z7X(HS0d1a^eUU^w>8fzL+858(B{>?^3%tul6AVnhth1@(O!AkRP(B1U_C9)rE#&Ee zX!&o`NhiQ&udKdMJyDLn&I>jvPbcO43Ib79g1B!QaC|9!?X=MNPrOpU@BH-3JYu`* z+oX(3&hLEtf=h!h*gHoD)1Zj+bKsrM|Ge=Z-T9^4nT+6_&y-xsTzN{X;@d_X15b*0 zAnZQTPkERgB`1ZSABM}2-U@Z&JRu<#ngX$79TZxj4@?Z+sxAh~-4|34NNn z;H%8XxfAES$OT8~WbrKFVmazWM~f9z?9ZSk#B;0@X;K|0SgZ- zeA=RN?9_n6Rr%>!#)lo?uR2-?^JJFeizfx$0{Dr|$z)^DUuUUim!~C0*V3!a%kl!m zyI#+7bXAe;p4Z~7i>@9=Q*%jzHOCa6PXCeg!<--HoSF93RBAw;IJm$fdf2l>K*c_n z=Vnnx8TT8@BCE&O;c-gWdmHp=<|gKk3X#dj*^Ot4&J@Ki-5=XOy>)3qUP}F=wt3B4 znb{3Qhd;YK=&6Cx-puBR_DBw~L!83>q*}ZW65@Vzp5n9n4JiDk0sWZmlZFc7;rHx_ zIN6fZ1!MV%m^1Uezxuuhse93!zVIK1_waIM{gdv$-RSa%oKx5e(uC-e1V_FTD`M=r}`4H+5cS&8u(*|JjuQt9cs7- z(L6AWzdv`r-~E2~)zG!jnC>fG$F-B$#daK%I1jT9^nl=z$uM52TS4FjVqrU(SXV;& z9?qxxRSs6H)NZDxa>Cz^-e+Xs-_S=TNG?99+4t$l5Qj5cLZ-A zP}(z-6YrvL8EE~aIQXIHqukH)KhKZL%8qG?#brOep=s2O&So@PWM8&J_8Hs@zi&C4 zn?svc*Wa(6SaYOA_-l=MXhp?FFSoDrwbRMyORjngm4AtWh2U@UhpKLQy;;hCpDEp*fO8;IuHr(SPy~W_k2q&M z6TzRf!!zz4RW9}*cqR39Sr{mvwck)a#r&r}DZzF3aOMh#ec1y*P; zJ<$tpJpH-z9V&uy|Et|&I(HNQ7Q#bwJ*i_M_|x@?(93F-g_WW8r1I$9tJ;Sp%0Bv8W&V}U9qPp z7yYZ=Cv2}W>G`d)Q+Ki18s?S{8gmZ0Yb3DYCgcs`Jvk5EHk^lg%?GS`js{-S@Baay2MZ6N z0IVroRkFS2jfRI-ekE9)7X5kBSE*kmotgRrkI5u9hDf;dtK2i-PYA5q*B^$tWnWKK zOVzC^o2Qk?C)Y_agD!NY8LqGLW6|=(X}S-y9DJ1d`%4Ylcd41I39(LE^Zh|5dFOHq+< zHapZ?EcdM`+(e#7Wi1rWqrOoVo@9IsO;jpI%0mmy5R}vq{VOyMg_xO z1rab6|LwP^2Z(|G82Io%cK)%m3H&_|<%f24aeax7D?4WJ)Cd z4J3Na!d-GGJ;>0Ui6Bhqn`^{CA#uB7wJ`V_D(8Yf)rn+hgCkTl6p~R;^QY;(#EcY! zWz%liRpW-!3j=>+nMnT}cphq`2j11SJ9GsmaDCUV>nH)4c&sJfOHtuU;nsewg6tHE^{{5 zfve5^^IF*QFfniINt&LX?06Gx$$vIHBL2D-$EEFi?lgSg z?F_#6edo02#{N?q-p6yu!56H|Gi`_Q*_q2t3(!Xv77n*Ngg+1ngMHKyj*dd8;@}0N z3OxKTE=K4};+uNlPNGdJd+?)b7c-N7K}Y_=&s2~;_-bf06`(rdXUs#Cb6*Ng0*4Dh z-&(ln*So@8pKeymm*_r9)S~ri&VYL!hprFRGx&>7t9NR9_WfF2u+q+tDVh$1%=;Di>xT)D9AQ2}mvuJZ?Sg}L zRncFVJU8>jM58rew{0A(w78jZ2JYev)icbDXMgVJN&Wh1_U($kuOfm zY=+vuC;#Tgv$_3D%v+**l7fYHoTFx!)R=Ce)SeIGn1z5X5BQs8k1_a{|F^pWmxQ#> zRuJ*;rXO{FL)}-%74@mXE0yajcd|?Jyz7%2dvWX@)A>`)5GpJq68`SP22PYSG;9r<>)+ou5V)rIQtuc(KjG{P7X$jl0!sa? z4ychip!TwUMc1*RHu|$C&MTE~)t*E(vxFas5pB2j%F*6%FI8mw{nndYc_(oDL;e~A ziH7vR?0cvKRy{b&a?on00?aBNy+3A5y8rNCyr%7#9%q8bO7?i(v z@9|x*-7zO-Mke2!n!Qwi!nne!rQ`Dw@bi_IH|)4+eB4FrUSABejIqH!xJe~YVaWITQ)rgbqVf?LP zR;*4~oyctPH;C(8Dg57_fWSqiBZ^=0zS7|Hck@go|6c3*x$9c!L})#I@UyO6p%J0= z#)mxY-Mt*n){f2%tJH<*@|oL5OuzwPyO*w=5gYncl3_xh6Us^ z5S~nGb`BSBL_g);@K%-;*P_vTMt(L0WyA*J@ptU!M}M}~e#E-UN^Pf}HbegQVb5LV z;4tFC@A19i`X}`jd<^ezhOtSu*TZ6Kx-yAv@=ZqlH{i8nc1=Il<|LrMijQmHGq)Wt zGu#i7Bdz0X@nA2)lwm^6Qc$$?Oltq+ZI*nP`e(Yf3r93O=a%6*D&MKwS@8w(f))=G zYZe1&LYIG*8Awk)lZ<^4g;nq@)1?~RXP_@1g$vJD=uJP*m+H!e;|7!6^8RVD)PLh) zOSW0ARBA)xEw~acPdEJN+?=*QHhXD?s|qFJGBi1ZO7P{tLG(gJl%w6sE0wzLm%s(9 zEy|qvt6%tol@5Nx!oS-aa?xTwa;o6m8RI|pr%`%d>iyhwI%!= zwBB{?&qf2t3|PA$n#UC}gNrD*iH^!vh8Dq<;gWA)3w*O?a_o0V=?DI({0h%(%wXqe z2!4#y(_;In`_Oa^F9U0*bB$vp8uf0NiL2hEjIUDrWkt}7^e;G@KcIpuF3pcLs}DRX z+2H#NN`j9Yf-o|Yy-|Al6z4y-O z?sEUTz6Q4crPdE;VKES4eUP}r*4Xie*Y2it#lS<>)lB5?+lJ<>CVQq9k1XzVDvE(V z9`dj7L=K*7WaPQ6vGuO&=t|R80^i2&;y;=-`zDCouHmvwE4rYOPPOBNe+#K_a1a zgFHeYS3-I(hsGM%Tl$+C;aA^tuY3{Nj%Ft-9nanuzLPLnqtRwCAEGze3rqdP`M{P7 z|2fF$a)mrSLY*<^)vT9DXGFqG#k{Syt#H-)nDCcr&vSI(`ISnQG2d?H?wRf`--;3b z8tF>HTSh~3^qCu!F(VD%=d5MSdo!r|#u3*(Pg<3El?hRqx048Qk9(`P$!FP7Hnwer zziCmKj=B=*0f~LTJs>bkYE-EZ#<}(@-Z6j6AbX;T+311|#P6Apo+*m(fWv$@s)R=! zS^iv0c2q+07W84-fVzch1wE-{WbvEu#WBHAwdYK+(Q)RR8`-lfJBPPcUUNqqUx&cM ziZuWG-Q9E%f%MjxIhil~LZ6;7dzQl}4TxLq+*LWM*5~^rFgExx(^iYGz<-s_@~s;i zZj3hSKW?# zOQ1W@YFu0-iiuYN~9_E4H`Q=fZ zTHJ0;%G`#V&;)Qd8z&bbPmlD?(pw3Ezu`~Lr^b(0T37O`&)X*2>rqRu2jgOOk}_r_ z7jgM^X7X_QkMiPmIRkLsm=R~Uhfs7K%o~?RHcne+s7|x9K98-6ePDe?ZEzKKOcxKr zJ7$V}u!si!BI8CDzwRBMXEOi51f-uyo`B4Nv*bn;QP{KbX8xItAE9WmdE`RyDu(O+u6U`BGLBjg^1&dKM0 z5%?o&g92Y!Kr{ZgZY;jD;l|IQ3RSv;jUBm}zENtB`Qe@q-q1)0<|su6jH8hqe=V|J%pOdci&8(M@+ z&FVEfypk^BLfeEq1JX17aQ;i6#mv+-xc~LpeopK1w^4+z&>CqOv_uf zi}^o~#TDX(Z?WzE_Qr)9(GWu)KAF3N@tj(TXN z18+FtorFi8u+VBCj|m>X%V7WdMP)p%T9NUB^RXv98fRI+sxJgw2Bc zJHcz_gmA_v2jp z5oynffEhVykz`+L0U7wiP|};O5*8)qoF}6>lXgtNPR4@K7ef^Sc&=ngVh}c#ZA1 zF-&`PUqRLDGx|N^AGK#;=L_E+(Dz3;t+59GLgsV~wclrtS1La}7lcFud(znJIfVKT z=W*g=7@tDoO3M(c+Y!Yh@SB?gzo)t*GOmT*VP^6gyW-#coP^}KsMgpaIVH~FrJj-m zn~Q!VyoZ^T@eIA@+qFj>uJ8brU7w- zGoID#>;AWY{NW$J`t|3r(;OSfigK>4aqv|HfhbO!_*za0JiY$royGJY@1jP{M~U$= zn>M;fu^hFuwuU@7!{P@93OA+2CxgGV__Shr;MvrGA@@ksqbIz(!I}7z-Ar+%;w4R$9cP(c({lTS^daR^7d*XiE6<^MlUQy;Pm8iX^GqkUhT-|SC2vuE#{5tA3Xd* zz2F0fO@1%9c}fvb(FA$G`M+C+e#dxxuXsWwKsQ!XownG zer+%@@Gy8oFQAKNBMwD0*B6+4q!!bu+w;9k8oJp9`~dWQ5L5-q6c8*BjeWC#R*+q!%AlkcI`X2iapq(J%BP+w?UU}a#C-(3<%7kfLV)^ws$nRP?MLF!aR z;g;0%jYl87{P>kSPw|}HQFF(18|~Qo%D)o-{@(qp5*?ZF2dA0jl-Ej{kI5Ff%nSZ@ zcm33BdF;LOJoG00UKyE4a}QmC)E!)HEFD3MKA0)RIch&$`+$c@t~KSPx0w&wR?~fG zY8B46Wo)v&1v|w(VjO1HgFZR?f=A+^FgS%A-N}y0NaL%`{EjSqm|kQRu5QcdZ>aAr z+6c*lcN<+hin+rcI)WE|vC-tg-|*+49`wP?JZVbvXR$3J=jcbxb!-jm!b%dmGIQ8c z)o$E2oIBdt89bs$2oDp+AYS>`>7A)P=;u!B4nUbV^|N6gb`t%T!1jG$@S}eW{^Fn7 z`94@=L!Y_&=r2=?huYi8yVQPsVdr}jIu(Zo)9 z|3VxM%5D}#xcb30D+(H%3mfKf9xw_Mqp1eBY;sqXf9(5)iyQ~w0BzB&1uFwXYR$zd zpOuyltxfb-mG7r6q>pt^WiI!f-|j|tO?HkT{#||fcl0w>u(horC z(%=>E@?^PMSH&zd4RH>yJX-JYH=%j?IpFX=3;lHcl{?=?d=H#nm zfynhlNp&Xd6~Y^aC&=7lwjCzJv$YP^`97=H}T%s zU^#KHAkaj;JGW^BTXP-FW-bdSH%B!G*{n`tXIhM4Vw)~nuL6Ht4d1p^MkGw>8XkIx zmvL9%r0;3vb6zV)`FG@duT<`#zZ-k{15o$sX;itv_k(}w{0p-pIM^?z6i>7t23-eH zzDQGg-llsC!lB~e?>JQaJE*K{^ul5b1EyJ)5U!02OOJay9Ycu!gEM-l|6I|*wBa9S zp>|Hns4_Z}q6cR#ZdlrR(m%XD z2eq_re+_P%NBuV<&|Wdpzr7~W*us3>`zoKksllU;Dx*_!MK4P~S9rL5eodNx4Em;@ z1MhVo4?VrU_|D=RV>%b3@=({BR=k6muWo3{bqu8%IX7s!Ym!nW*HR2O+LP3SI;QZV#8|1BOLOEj%M@`cdc$2^Hd)!kw%4{s3U6?(- zE)e(u$TQFf_V#uE8BR6kwD3p8K%PbI2mZED`w4kN>=PYB*?LpF6Ye&10~2nBzBd7; zu$NgKlk@Z;AFeBXBQ6J;$wjj@t7)()Dv*A}-Cn+`e0GT(#>cVo zk>_5|XRFZCZA0|i_;VtgV%;DE5Zc(VmdR;MDHP2 zj%;QhH;YX8iT6|qZT(&Gh3Yw|1oPGR5*4Wc>3;LS%Ac0qkFB|$+->DtxFl9=PWvI% z=ALP9&%Db`?UlrZOnZWNoI{;aWO85Ll7?sXN2+_OiuSSX?z+=DuXjPHq-0Ig%Qxm% zE>9kagU(Qg&%d#=%U|lyl*UB-%Sm6JmsGN*UVPd+-T#5+<#N}k8>4Q#b>ruN4~|Qb zfbAOxt{8>}P)ea0$(wN6y^Hdy&$cSFHZ4BxEP9|KqF{e2wt%_M_Sl(E{Ck_f^Hn_E zM#EAGcS7RTN=3jWa0kNVs4tK6WP2n>XLBDJ^&}mjm<`nSQt7I zvM`vFlcn~9g}=UQ^Sb7RCi8pW)%IJhG-r+ct=?*Qv-V^9U+rV*`Lz2l-G5<{J$z6Qn2 zqGJ11Mf0_Y38v5Is!+%|z>4C})GwX+Z))~ZcHM|-n)#Ap_wBFhsXEIPt|fn*YZ^KP zJo9to;9<_-^uop^zj9h`cCH)*_j5hza?P{KG%g%f#r$B-$qZ7v#YHVMC1$L&jB}jL zD~j%iKlNw#C&twUT5;&UZpNSbI9$qF_`iWLhl4F|_&@Fb#os{uQ!fSn zOf&M#CCBQ^0%N+rxbex2E1>VE>+cf(-tO-5@8xS@?BBrV(FfycdC_`~8t?$K-$W`i z&CUkn#?*oyNHK7K%&nwi(`?IjRMWzqBA}w%3Em$K`V{%(ac{x2+pJH1Xyj@TSxAT=3T7$(F4{_qMR_H|MHmBGXm z1hUvudW>^wL(`+?sCwPF<-RNGaD28;DeorY&#|rJuu%ijg@DJ|9){W7?mCjAo0$a z$0eXVO+bq1-dlAGt%$`?j2P;ZGI$(44QSdXkLl&JVC!tV z()FN3_!}R0C@(88rqk;?VhMAJRWajm(41X9v3`AsneUC`T&TKy-SOD*c=4UL!RdGC zKvcP9F$*xXk~w(l8@he^V5wd}U@(0KcUk(=1@8xiEwS8$ve?0&GPm-r@~|RZIPZ$h zJ&DWPThxG~YlWjL?8+XmR2)1`ucCas-aw+bLv<&b4yfM=rq3o1i@y$Qvcw0z%;ZMg zIW-{6QI8(~?+AV| zTe;<`ZsbA7SuzKG|0I`;_ND4D_*^dfMCYv~o(ZW`qZs zriu4cXA1_U15&pkuFr^lQU+>5EPdc0V^*@#dOt7EeUV)eT-xB558-G4yGBOZAAQfd zfY;zEOZdlVNZgYux0MGAr{k_W4y9EjTRXbs!o?)E<`RtCTvafKa+%jIlQcOE)Ra}+ zKO*{3BW9Ren0V0lvVR^?Sj44FTwK5(9S3^99wOkGjc2CboR(dt2-$Natib9Ijy{T= z7E^>?CcfZd`DOmKN2tAuqR+-e#!aW*UrrUa-}F^%YwRk+9YVep=FC8r&D@heqb{K$ z$8;+x*?sx?v#t(zIRDPJ4y%DH^Yz&@uTlK#pFY4guw-r%jLVI$*{V1W`pSQCJbvp2 zm-^tj)a9v@0Da&kzhPOwaLbh;noV;YWp z>Ri=xgz+Xd)2J`W!9>AN8m@xAot2l#&2Q1&J_Up8O4pUHCmM?L)9=qh^{M#_{SVq4_b_eeTuWs|!}^zHmGn{&(p^ z#Kt7zDm={I6sV6o*Er+Qm*FU%ik(ar{UI5Fm)81hz z!K+uU)KVv{VLzvj$>jm=arMt*;>JWGBHfs9cwqUa#+hINlZuv}ttukwN%y=zSNNmS zqcb@>m5bAjTwEnWjsuy~Vm^u%X2+pwS-@AS0i{GPt_*aXJO^-N+ML$TRycm?7IuD5 zD_53SZf8~FwcnG3XKU;b=PsE2KHC7Y@A$Z&d3eo|j$ht={O+A4H~t9z`+w0p)bvX)5KCO9L^CmT&SQ=$w zJ-ZG6Ap^5tUO{KVo`vCrOwDO&hv6Afy2yKl-}g1U0uCnDhD(Qk5&Uy!^HCwMt)A-d z5!aLMHJ+Bq6dTW=Kv)NwPB@zCt@a=8QFV zx#;OWiB#Fzjv9kYzn+)bh}Xq}`!>5H(Or!quV2Sa$GYSZq);C5ir2nJl@!?EpY|YW@MiPAw z&4yQM7vp*~ zs`gEyAigimS@m`aIJiOyG}b@kD>6pipV;J~SS z4HMbGTFv~Ugdf)v{|?q|uG39#bJNUh?aueQzv%w7`#-?o^FX8j8kOfOwU>F#93tZBxvvLD z)BE}nO0QDX?PS?B7s08>Qq#dlEi=6Y=L5V4eP3{BuQbv9!bZZML=0 zU%-$>AF_6otguzZh%c*-erOr<>Fw0qiP?Mk3#to#hE{kt;%+Jvdi{w zY%x4eZLXrEY0*{L@^>k1cKBXtcC1CHLH@@%w!#|`<9sOmU zbteBBJ&|!+^R_o#s$XRp5ZA`6E@&<(kM>9VCfdXC54VoAdxfi;rUZ_6{iFy80xw^G z`SHhh#&l}V6?6KeFC2w554hx%|3O%1c8g8a+H`GV6BCK~TbYE+NFJ|gNZj);@jKAKE*&|cG0j{y$8=pCTYJ?U+$$Ae6#kAhIg5*33FjwZXmV@ec|3^QSlmf zMb3fm@yUw07p(K}n3AtlrrT38sb+Qk>ZVETUCpbpQ}Nxe>jZsvqM+I6JPy^RaLKi_ z=@3_!XI3n)K2UuCf1P6ahBe=5RWGbr2o)e)v@XQ0WwYc}uC!hu+bkl#tGawUIL1KV z7ohLY-S4mgb`9RK+~@GUiDvCQ@elMF+zXwr;vjkop>MTwwKK&zRNj-+g0p{nl!cXp zFW8bDn{82!6vs;Nr}!5~1guHFNc`KJ*FRbK!)ZM8ye&Q%zKkEuOinG9Yp@>OEeR{N zxt(h`c8&g0j$FIZWc^rgZ;EQ_^?aUM6vH)E7aQfM>zCEtDw~#dX6kJ$|(FOx+r#h!RESL9LTz0`}g`9nClL8QEq2Op{NW$}>+b(`_uudS+docqFDgy2MiSqu;id0n<(6D5KV;P<-Uo3e?^X1uF{tf?3Uwe?h=9?b4M&I7P7OFC zxrG`uXqv>-ObX`*Hfg5dqG9n{V#kqzw=svyr|Vs!7{{NngwN48XhwuL={K3>GiyCb zFS6H19<8yUZjruVFWjDH9K1Dfsz^ARP1_x4Af$LmqU-4+1E&x*q8z2TPUV(Nt~pk} zqyA_U*Mo_EbDKKh{TkXv`jhL~)UO`eG?z;@$$UMMo6c3AuRd5EU(r)ljDU4h>q5^$UA|pp*3o!yIhYKMA^Lr4M87Y(m#_iwj9Jk&cBFm&S89(} zD)Sn#kMD;t0ng;t?=X7`=v#yP-$eTbGVbi(SQxP}Qff&Jc*rWI@Vr&O{*J-F2!YGe z%#L>V3Tv2;u8Llk){C}J)p|?Jru6($DItujCC1nOZ@#PSsKzj}rcN)-&D`$L=M~qK zKu6n_YCKS*bIb|VGb->h#p7UnwawEn>+IB?{P?;I*V$B8*?!nMo9EU(Qxf8O{jlMJcx{|)Tv`S&OP z{^Wn&-PqaS+*Ht(RgJ!2KwPc)o@-uxUC9Kh#sp?$EAr;mPpS;CpQ+hRWZVR6Zu#Tp zUF=f`e``_9y!`mhJFiktuA}1lh!7$>b`D1LvlKow(dKsz+IIuqdOF*EVlza zQe=N8eDVmjAh7h3^P(k)(x%sZ2t|TaAz}+(^46DJuK%fKXH6%ww`kuyt~R97`#uJL z4b5a_B426K$Us!n;3ncBZmNUp$9xxz$tTEqOeCNB3(3kgzLljEbQ#M9BRUW zm?=%=*XY~2(0RR2-rE-A*-9O8&}ODi9>SgAmDWh&ohm?A^k(Ze_dtt!IVn=d$1OwYOZeyi$i z)wss#jgfV6o-=eIx7dBVIW40wyR4|Js;p(7oUp!{I?hz>fy<5UUvQvtb6s}U&8an> z@#vWwntu*Rf$_q>m|AIS@V{>S8+iM}KeSyWh5g^V_2d8bgy-)6?%w6?%^GMOpH^#{ zU^!PXj|(ny>!X}^O*7$*R~D>p+EF zxUTrTMb;yx0Giy5C|zGEm$)5VOG;z@rusIYK4gSHHSmNAP~Sfxd#DphZswY1^WdgU z)tiWc%i*Mhjhf8mijAfN5gXWdZO!##*DrTn4R!e!*RDrn?(khhnei#udym*Ry7Ova zci;qDpkt^4uQ7pnqc)5`VxL_(H;liDcJ&??;AO-^uL6Oq$hat=`H1l`%|>{l>`9J? z_y%r)0StE_MbR@YtK6H(xv*+=Y*|#QO7$Td zIowa8UftzA$u`+OI;Lk#ASaa5U6?l&j4!Ch!fkrpvc@Xp z0OMCMEgJ8v!u?5crUB)58>biCoLY=$bVQ-K=>(sFshvwZfAz1g43$jfK7yj&zuo=k zjbHuIY$2qUqHON|Yxn=Y@&DX;r!(XZrY}n$Xf>CVHjm(X_?7Edy0+J!F9@2Jr_Zvj zt~WbcV{KH2w_<0cA1Itxf93is-H+N9u*-N1&ERf6v+uC!{VF`+%Y0>@68*#^qeCDD z4f{~O8$>|ye3^&Igpb+L*zP!FJ#5=*;UbykE`4yD`Mzx~sy*$Bk$VlsS!~N&wI3_y zq2ZH?K=JK6;^3&-$=)3`7MMJ}mh>t^V+saeFy#%`pi9s}kb#M^L3T|hSP$lvxaolL zNWB6-ytDGB`eRHGv;2)P&-sBxaM1L^fhk&%m=} zGcoYasX1_g%D}T>Vz$D-tK z%jrR+FF<2Or#nRYTL*fca1TO;#XTGBfj%}i8=(B$`hd>^)oAO=8sG7NzE`HsNPgJz3yy2{`j7LrjKG(>zSB_oY|-ds7=h+ zsK`9GCj<6mFm?3)SohMI6_H>!6>Xk&ucrpT@vZlMT{D$`u=|nk2 z$A@y6Czy^N-;`(>Y9CRo*{*tE-L(<#qKHRk1y{H0!hM_1R^MbaO%Ddoi ztARSjJ`iYd(_*Q&QW-|sJyfw#_8Rk96bQm!eB9lFfw%}I;Pt}A%)G(QJ|-XsQNXmu z1kxXr*q!5HGvrmNJ44C1SR6>xwD1W|=c^t1e5ZpDw!}M!*5nl4F1wYRjdrUotCk3O zHk&E)Qg~p=H}^nu~D1z29?;%Tk@0(^|ji7 z-dcM3@BIJlR@^)3JB5-e3H;%wgfpm-8YRb^!+2k$%3A6gt;z{r$avAsoedxx{ z5#DjkR|k}%0qkdrjxU%|*S{b(YJX}~S(WD_>b$tZGesZen>_K=tz{^+qQ>)UBMSyM z&n_>DHAOEkXvInJ^~$NiU#b3v2yhJ&9XiVdoRHw@ZU>*M=w6Qsq}iZ?&fS zUn*6%-WpwOn%KOPd@4@mDLVY0K;k-F^ByP zH~S**;IA;o*mPvFKm;Vp)b93&D^LQq0OdFZB)tXZ5Puy%@fjz0|w^`+mh!%_f zcY;M6-9iw8UWKcgs#L=rh2kC_Z`6Um_Zy>XU-!tRXi}U9~5{>cQ}$gb*VMp5E@&5ir}ejRO!fH2T?!8){oO)%0#!9?ygCYfieB8aQNTPDx)UUd~TK{%Km`MNe9Ka z81XMMd4<*NT!redui^;b`YMK14y#OZPe*Th3l(RHqun+bKc8EC4dpDqIc>ijR5xWA&2IAS{+JF|R11scGpn@O!OEjLp?im`b%)kQFy>p_q3d2Y+T z>2z*r|3+eg3g zFDMe&63&=_QhX)R@;r5*;@J`Ru+nn{@#$gwp$aw)c5E%_s~%Re|2B2 zY>gdYyVICZU6p-y>e<|kx|ZzNsOqd`byZ7YSD1W!p4+-_M%~R^^}X=(d0@_SGc`MA zlWR~(hN;9kmTpF03-DIF&FJXH7bKmM_|;UIkgj{V$-O@Q5dV0*oCN6jIaBeXj) ztxFG8cQ8?(&mNr6_sX5iyBRIGWZ)CtNA8Q|mzun&SfnEz%O=!cy7v+Nq;%K* z{2o{!Tq>BSCW1dr`rM|?c@Imz#v@udmKNIQd!s=*Zj1lNdd0u>^dHAV!vnY@uow5Z zZ3_AKbvA_`wsAuahMEa*b5e6HJuo?#_qbRC6D=j+FfszKTeKKgh5B;8W!nuKv^ks}iC6mHLmUM`qUdOgr==MLSe6OoTQ6xBym%Iqrkh zA&xoj19@)Keq-i)3srieduZjbnz=P8xcLmLIb43X@LYj3S~lXwY|G2FT|~Jt#*X~( z95&0+78S!r2VZG;P(G=$9E}}5XE*eaC*ARBhbk_%-EC~8&#h^^T^38F*5>JND~iqW z6rr}N0)P9n`}G@_-sWjF3x7XMZC#q#)LyYH{gsA|VEOOh?}dLs<#77Mr!_D9fB1*+ z*XT`%v$4bb(3Zv){MAan3e+Pj*@vo(Nn1Du?$l(XcVXA#<|8G=#BpPq z80$7qsOW%q8P@fX8=8~F|A9YM*X&^Olm{%nH{gdyqIXQp+=SA(%22q(;{=i&-4dIV zz7ikBqijfnznnzN9kf9`D6w+Vd$WeZM653r?+iOil;SD`(?Kdg;$Sz3f!~HZ^0C!; zrSfq}u6sUPD8k<_bX%JEOJnx|_`{dM;32P8DgsuU+;oJ~neyFUn&;jHJ16uhN=lRO z<*}%aq(@!E^Q`M3+~%%OUGqqgXH>f2uZ}ZR9c{^6+7tfRN@_dOwhd)WcpAK|BZX}6 z_4Q-?zTIH15p~105H)cpd(na81_F1Iou6J;1bh}M_n$YE_XhUhoJ(Orn0hdGn=Et+B!L0pys&%E)^^Q9;1^DtG~J!kojdpQ z`zzUdZvO*zTpMHf>i78mzQ6D9_MdKE@Nb3Zx_eVLDF5bn|8~Q{RPB+<)Td?sL9~4^ z07n{#7Bw()0Uhq`%iwFx;*T6b)$$2_@HU(&p2g}MR+uKipJj(tQ|o#bo2TO0LyUMv zm4sRWk8fW0yq6egy7|(TBYg)t&NW8imZ!+PP36O?sT zclJaj=50idg1hIDy-`uw`?;klQE)zz9$XK#MS4MG-9*s@H6RR(#J}Bl4iN*X0eKzL ziIIC>x&5W`s#M}CSzV&zAHd(IblW9NJf!n%2YYN^_3@yk{hU24m?^kuiG-ufgCC{*qkriT5S89HstCM5%$>*9X0t8kcOq6h*p; zf=f764P{rFR9Y+Z5BESS_^UJv8=a%tv}v*!&e=1!c<6pcr)vB5KG~NPzU7xUb`S1? z4gJesliTn9_bb2e@a)Jk{DxR4vyZ=ljs6#LY+0B!y2*}~?W_1POreNh>wgw|pFWt{ z@6PkcL4R>)QyKA(ZMv!ADpNf*ktomoObQkzUR^jzHkJ(h3YASi-^J}$-WuEq`qtFk z+)>n3Y`c{#^E%zX{TL2khVpYLqOR~&o;B8@B1)$I%PY$*D}*Dy0!J(pU5S8+hy43B z`b4*!K%mrrrF~h0SAr7%z9Rbl1-#n#6b@46{<0S;)0i7K-s{_HC}@bQyHz8qs*=3& z%|@T|V{Za~bS*G85)=OQ<`1uY3>(e$V7R~|RDlb;0zbXe7JQM{*gUVcy>ud33t0`!!F;5pQ>`|BCWR`kp>`t*)& zV{+LseEYia8uhB`taKh8={=EO$om2K z`zxM*#X~<`{n{s<_oS%d|G18?zgNiuTi&Neo7 z`qdk6b)V@8G23 zWGu_~TD-U3;O!@h=dN5LLE#J&bfu$}9KXi?PE&bhc|@yryu@@&P$yNRd^f)H>$~Ki zFQ`;xr$x~N(tn(~^ZtUJ96TQx=T_X|1tb6FHn3MWu^u4%#?D0qiFFgT6RipxI7Sqd zjo`!5X%PF~Q05+|;d5eiGDl#kPATndDzZAqZP2N-a^#%)s-F7%TX?$`*rHJ#2(~ab{8h7I#(>F=S#T z@eif3@xtH_QGUzo?cb>Nv~Z-S`+CX_8N^FncoJcUnNN^?L$}{RLv-GoZyYvL@v@Il zY0}X<<}ne;^W_GH@ZL3`21<2>`=_*%#m9Cuo0>hfvB&q?BKi7m^*_S(NhdQvPx@VU zzIJfG-%JMmnbhw9k z^*e&C4y$@9yK6h~x4hD1$E9KqQ@48m0sjJQ1wKBo6`~kC61~klf7V${UYIczHb&G2 zy4uQe*|ChOBkIaBKFW@%VuSiP70wnkMzhA6Mw=>`{v;0tbZx_dj!(V9I17g?(T|l8 z>Oc9K{Ry;4XCaPTzhoxz9`_2Ky3RAD<-!O0?C+s+V%8-XOhiEif1zs%&EQ96<6Ve;+^#JzcXESYrgSty>c6Z8Dk z9!x)|2qg-_!GOP7@~~W|Ikd1Rx(AFg3&C%z^yUWByXS&Fe(f;Pj}Dm{@V#gWwVvF+ zRPz|Q`^N1{RLw^ItG?s8RdhpdCOTr7z>$f?E1MaJ#6y&-QVl+Cd_)ASv-Z-3c+?f; zR`rT@#MJ8;cg`vC&!$R5KQ@3jv7>4H+%NNT>EYl;6n3PXh;+Gpx8XN8etWkO^a(Pg z`V;5d@y6%DF;}v&%DCB4<*Jf73QRLfv`|xE%H1`P7vP#|AkWm5oxSPU_F>CfAT5|N zaoLrR!{3))K_6NJ_FlBGegn6EJ{*Hz=4Q;5e`gB(*T0kKC-Lup;aB?YyQMcXI(0j; zaX(VfM+96cp7Xo|zx-^med3m9*o=m|G^s42$v18Z(s58BZS_9!TnS!5g@u1bj0)mGwPB^!X1s#T5L67UiYhjvWjfW4}zW*#JM9&8^bzb7-fS=CKj<~*MV#W^H_Kf$!b)P2*xyt2Ueej9ATOE;XL z`gHUeEc+2&fx>a_bj+PA5`_D)7l-7AO@?{v^3q z)YVj!6MM<%NBEU@?td(tKCe`%|3pC`7ck`ltK3^XfT~ok(il70#b<8$xm7d?!U@h9 zrB0sXk@w6>=vdA(KN>@aRn%E)ZFNLVD_X%{H_qbXb~@&oa~3vG(Stn|j%67YMfDEr zHE)ntG5g5u#lw%Fh-#cJv)LO;ZT|!l_&>nkpF!ZiKX`k3zA?3A%rPHHb1v<(mZvsU zs&qT{Q@Q7RY#~D^FW`1p`r@Hxk44Qs=O$gos>Wt2aCDp3EUTKTvZH;!eeh?xi$Bv} z{5$iuf4i~AAik#mcJsH2<_ZKV`S-8E-!Ja=!}>QF1%F>hKlF=Ls#)J&E)&Sr5H2;D zR&-%)zNyIh$hVg&W`i010a&In=Xw9K7&dDlu?O(c@T_rBHrYyJ1iN=CDW$!el7tJ@nuRR_dJ8)a@_h-DT z#ARTd+?%V?D?O)9dx=T1!OT&^(DHbyFONxhwGqw_ZyCw&GC{~KuhQdrRr0>~UzFZf z6nL6|O+4$TL(cHoStQJCSEHdx;IWtxO4D?R$;h1AY$tfkT)V;hWJF zDE;i6#P+y?zt><5uK90IyZ~eJ9-X&1J4+ArJthDCgsUGvVIK1t^XT_4KGCPun)W1}|ubYN;j2I7i`(fL(FjRs+aZeU! zAM@>N9Wsq5K@D)VL#81AE;sU=-IGCFG=L&d6$<$bIDXsk+w?MrnH6aVs1<3{Yu zrCr-A$~`#i?^jguXV|6f%06rSYT=*n{uvfgYWF{0yw)x*R{N%Zu>POG+}}v=LH?B- zEckon?rAPF9B&k-e3=RBdBWK>#!P=-aBJ|mhaw03aWRq0Ip+6kqMyV+$-fevr2nM?WYQs14ygd|pkexi`Q{ZIGe1jo-efiDfrRn+ zjM|G%98F*8jj|gjE?#al!2RV>eHt{C=1l)-a#4~;q7bP+(myv|;<6fL; zOUF)}t=Ot?_F2!Nt>}S;De6q?%+pt>P^sWBZZj2G$BBWx&XUd*&?8Sa_!~C9=?##7 zMF}tXBl^)H{P}K(dQa{z$mU2-+2T)kp6E z_I|Mb=Li4u!GC}7#)BgZ2mBHB3YtZk4hqZCr0VtfB7Q2r8ZNGLv%#E%r%a1;m-hv_ zyIq5G%omHS8J%{=VgHLt^utGfp*`5*Bu;W=Ctpv#*7ca`oKHOGoNdlFM@Hw2sY;Lg zKhw%%Fg=sS%cYaq>C8R^eQ6DsxrEl<`2yOj1p1WRt5jve5dRY1K&lqOil8K@;O`IK zLtY2DO}K9|FaMG^9=v`RpK&-ySP$WWP!@ddAGfB~vwFgdIx_{!%Q=;FAxb(Zd%-;ls zSqr`7U%FvD5^zOWxWHx%S_A6R_lVD@xP0@e68A)}_RgInWaSd#95<)gS!O?nT>IQX zwgrKGRDJE}WaUk6Q_D?izr;u~uVid;F;URS@9VQNJ6DYuNAcPyvQ`-_+ziZ7sZ?%F zkEz%?hWcg9S zj$8>IxwzXfg4ai)13J{cZ(8~d={n?1>c7AKo%9|rvpatB&LfYCeP9S~@^2UVmTKe9 zpdTl)o&G}Ss=dNAq?^$-&$YhAqU$lRo2RY5{Vv z!q3ZRCLQo8qTeZ)0y+;KyVChCP|wl-3g(oY%XTmEaBttM7mr>%#nkrn#aH{TTF=8v z_c0@RtlaAoB#zN*7BsY3>;0oHak#HgFO_~+tWq!QhRt=>IwGJNO>~$GL~1l3#~Zf} zE=-)J>iv!q|L8x!UWkXzgBxov*^cAbtjbs=4|26ZRb;&d$2=V1COVNYnXgEtWks9K zy@VBJZ((~<`4SViVRQP#NFW+2iqytzp(@|BxtqC5bD4+Uhs+NG=No@>BT@AU`VtuY zGrh?_Qz3DYkN)nKCkL#;Kru_i1GY_2}bEhKk1Dc>s@D{gfGLVDR+C&*?Y7AQO-+?ObO?gF1sYrW>tkTgSn{+k8*j9LJ3wjl@8` zDqo+$j?1{?AhZ2hV^f(Pw~L7SoYN6Jg5FlXx=Q~`%&)+!f)PWu%|J*f*u^V%n-xa=AoP z_x6kmt)e`T_$QI?2PmL_u>M=n_qX(mpQ5rn5R7xHA$t>(vGOYOsD~}Y;7*=VPm>vb zhg&&rU5ato(mo*-G&=Pgy9U?Ik4#)hHa=zI_YU!IBhu=uGDR)%{u<{w*Dn98tA=i+ zg{XX%8|&ws{7Woo${G#jOE7?w#lpZyEz{n);W&j~z){=`B=gGkaw-%we1bfAlo=V5 z3}(Dkfbt{GRlNQ1#>f75s6LN^HFS3g^w9+g({>8ZcY#fEHZ1*_7iCIc2><6*r8QP_ zdHGSur)UZ!D^jVzzsrrd#Dju+`nBP$Ked%7m%Eh+SntOTW@0|(W8M~nhn8CnxE^o` zbDT&gRiL;LF@3u~Mg&Zsn1zGkPA2u@vse~?1AP&%iBt5y^7GGl|1PijjYz%V%-U|1 z>W)jmTp;AZH~o>Zn2OI&e|z-edxO`%eokL}5vQf|%}F!mZ*bmOZ5+y$zOu4x-SU{;|2oQ8(F!F{DE)_^@VC6VxH)+Z ze@bEmY)E!SrD`Ownb*{Gz+=}j&Fk8cTb8FklU<>*T0C4?umyTNZcQ%Cqg7MMzFe|i z{!|WcWM*={W&3V4UW)4ecmJp0PU$;@WBeB-`d#Pyb$DT8VutIl?j6T=gmt67c4liY zEVOg2@VF;#pW;fAO0&`yx7P;`OXbY7%R6o9Hl@|)mem*+P%6Ad_v@HQcZ^tUmNeI_ z?*N;#=UjrmvusOnVbfFKOm#%fJw|w>@-BF!OGMdqQwcW`eAW%;`}k;(cfsC|L=}Z^ zo`Sms@|ce)tcy(8q+k6Hq==vMw{Bd6f0oGtm$mrLzQ-dfP*HBfMowJew&DR|weYi6 z^{RGN*KHZ~)lc{%&*0F7qxvO@^((cD9dVv9^gB zUmNqcq6u+=mY!oQRvQ_+_k;>i^v{AgX7$WNp5VywB$i1BB6l|5zyC5F-e=(Ovpe5@ z@JDj*VOSmCM7v+z zEsdM&4KV74@)b>!e(T`p!542{_4}MNW^vqDVlOfuEovKmNV9RWSXd1%05{AM0l5f| z-`C&Loob~6fq_9|BwYWmxjfFc#;1cN+^G)h^cssc-X9G`!)cLdxI19AShY)R8|gJm zr7Jp5e-l$-z4{FEgbIxpJp$K2)Jyxivd?56%kE;QJHKSSafhP%lWCkxL3w-c3H!SZ#a=tuY4>ks5;|f!ZY z1P;Xo^^s9(JLYrBCNS=D#Jv+z_bI9v^nalA5$c#Gltq&}l1fzNd5wjr?HBx#h3l;O ze3h3W{l?u>yhdAGQL|K)MBDO0=bN~o z_=B^aTJ9&Mn79xJ`kKt=Tz*uU@55T1AeuyRwFztW>RkTrb-N!!rxH}M?-txdAN!7zjiVL=7s!&zKP*18W3p7QsWPpZ?T$liU^Jk9lC2SOM3X)P zmppV6H{ktbdUlszlV6qI;4e@Z2m&Qb{_x77!8xL>nn-pM?0rCV{)F#0+?s;HSfmdG z?(~m31%LVaFcGG6OB4d@c{RI@T=~a;JQUlS`teTU5Vn z7N8UUj^c@lC)|yhavhc03U`Aqv~LF~FAeV+Eb(^-n$Z|E1q|fiv`89CpR`C5zk=5q zGp!WYYQI~{M4@=7IK`L(PP=g@SqskuZUr*v9u|UsgfA2RPh)$ly}G2WzSJgp{$If0 zKR@^$JjJJXHkcqi3V2j(tZ&!ts6f}(4qoI=aMY4w+^>O8(p2H}_h#@g^~+(pwij>i z^cGt4jG)p~ZDeYu8S}hAbZB*DIMN)o{CP*DePRsGx&Y^%;t5~OIC0BY;}Q;0a(RyG z74n@GUL7alyYO z*cRDCcPd#o!9z0tr@j)!ydC_#Nd%mAt(j6A!&-w{PnB|Rj$>Mby48_u)3e>djU)9$(KVOn8TiUh-e={?m=)B@!K__jR)&vd+-Gr6HrE1qFVp z3$Bl-*6gd2H)39jYsHNpQMTS4B|*YK}5Wg?6h37v<`(?wsN={1xKueem2Z$9Ufj9KXN+HK}zT!2t)xSZ# z&P0jMBXh9M+H73rer%I*+Fa9+*7zhKGrC?+oip7rOZ8}s)CXH#g|1s{&Z;L$K;KzU zq0?i@FXeF4Cb-ghB<5)- zO!@q|DLrkvaa%N&{+(cHFCEYa^x*VCWYm+W64}_GTjjzpo(9wsa9LG)H}TJ+HQ1|t zB|@pAnzB=+Wuf%G5GMjY_z60+pO6zo$9vjyHK-F>B4q*|8St%C92$LNQr^I z5&DBEVlE#`x)I*%wm;GT>&^eF)H>h3`yMfZ@4>`5=ZvwnVTQ>-uG(O!aUJJEb;O>+ z{TmgxAEtC(^A^9{XSp4`;6211le`WK8dtT;{6D=8hxL}J)%7?q>l<^WJ6b$DgMH{U z>&f49xJz2b|yqPJ)6<({Kvq4mPGa%?wW@3Uf!CgYV zCmWrTYbEc}Bk;(A*L3rv;Q3&CuYBSmM9s zs)ZBEr)HRf!OHioheg4If)@44Jc_+NAXhXgqF@jW;~%-bgP--_xrV%w3XR^L;+YP} zzVDoD{DMJYx~To|UqgFO?U#9fc5xS1g3oUpygv#bI8OA-L><0|&FGi#gk|GbVF5SL zt_u1j3hs>_#VhV8kMy;DZ2vwn%HD@;BPH^zf=OiTA|~`brX~}vP409eSt3Tw)1mI+cVCNtOcjWKFx%p9$RvfiMaPZ$_PmlL)zaH5 z1Ks!z^@{H<2s{S{#eG~{c%N{MOYnyW5f=#$#^u)pflB|&Zq@}Q0wy+Nq$7G3$%@W{ z{VepT{rKFlp%1h75fcyDeWR`uKOz$k8JIm_qeMXke=uDwf4W&QDn zh@vs7knI9oB-Rw>W!~|TKWlK9+opOo_bb)Q+A#Szx%?Q++*J0IW)xSi%bqRd;rH+Z z`QGiH-NxN{Et`K?g8A2_%6i*oEDouZ6Mmc;6#Pjiu@~G)-hGSN#5GiSPsy&- zV#K-jV6C-EzoK2?-&AQ?b>nDHEE|_TfzDw!nNlvAe-xKk^~!^n@4n8DUvjPW+F)V* zWa%-TyT3{10Q{-3*xAKf-2bRy=S^|mxVJODlY2C~cz@vQM{cz~g%v!6GJ&0RYRlJ{ zF})g<>o%g^A4fwY+>f{`y@9{nXCUy^zUMOkuwGG~KI;MeuW(>9&4R^Q(=DD+6Ihgo zAA5|oIM*FC>@-|vOS2GnXkh_!OT5%=!{uCqN3WXI_rBNRKy{?|@O7t-(svuH^vUIy z_+D2T`R=&#JtaZW4_{|?`PIU=uJm;_m&>&fGA57wFA)#-lR1U4#e0J)5-ichSa2&< zsgu~}68DAu)NXohlO@$P9jJ9yGD(wKQyv9>%Fhht4o85Q=XF^Bz0sXq7?=*M;}(-_ zQgH*_qOq#O8n-4}rP9K6O}p=lwn_N_n)8w~TCK5&uVwYU<^2#|a#K z{MH%z<5?=l1MI?a#Sj0yQO~Ww3zuTD;D6A` zGMgon^56zZ1i{Os?=!uK0=Qqw11GjQV zc#I5uh~DN9uY_-b=y&Od1b;Cq(%wiGG5YYrkI^}bo01^#`d~l%^zSie)38-=+i{+G z&`$UndJp2@EpT^M-@|j3x^TqULoOa~fDPn3Qqv&UgT3XsC6lO#Y-MM;2%1(emkQfE zvM!E0iX6hCsi@nyKV<4QP3bHegXy>{!$0C{W;(DFbF+v>>K|A`$=;+)t_z{ZQPX@Pk(D^#gdW>WiUu27T_7Gby^EVW_;{8@j zg_#)&c|dL%KivP}K9wfd9PdBwdc@7^dTKZn{LINjLmyxhFQ`<2a@XdYsl@m0(i=SZ z`P#46eomkIIx2&2-`3nb=)Fucwp1NC1zHJs=KM7<|-i-TbBVEjT{vgK=QuYHX`@E5)6z12X>e!I$t2QME{IF~Uz z*IE|OE}p$N%N;`47owl!;WszP!054N$<1TJ|M4m~L|q`2<=!Z-V|0=-L)oSvbI%=d zc=$O_A_|J<;n#jS7e)8yCkB=%(-2{#FEekGNASmgG0myN#h4rL^-(rgoA7q95&PEJ za44)71@&2dA)CTa9c)AJb(%I?h*c_h>Skk_HEK>adM(v-wk!SBFtjkfc)t24-otTp z+*zYfF8d~WB_bGG-`PoJI*rvbf)mG3+kU!ey=rOS6dS=ZVcWkQE;nFgKY!Z1R4f~g z#7%xZ5dlHf_Eqfxv_!D7(JKlgb^wNDhS*mPv(QYxVK7T~F8IUSO*5o*Yi&e6BRt+t zG^Pi=*XX48UfkJUSTB0LNzi;2?flmE_KqVLzkB6q-*Nq#z1FoQ=!4BEnHUW`qFW^H zc?w*cVG+guUk8h=(r{5?-zBQQE-r+n;^_!eO$@uD>_&(tGohPW#GyxKVW5wA_g@}J zw@zmY?p_Chzv9B&8xKU+d7CP8Ej+%+W`;6pkh=);Aa6H3oM7?kq8+^Oz_qkEn@lMU z2Bt*G=4$+$#nJhkXsG!8{BG__9|Sum;7>lr$?FR)>B##J7H<2E9fb|t;2Wq6c$or- z2XrlwFD(|Imk3xy986pXd7|9JM2ku-C^uV~%Yid-#rgwRGW|?XcEbD0o`Td0?91Gd zEd%9IFepC53E#~3#MPg#_kzP{Enylg9N{+)(>asW-?lPuSsmBo<=$NiRbNz%uXaUk zgKYZS%Ecvm9sS3;`H2fZhv1kql`YLlc-M;ZW>cJwHf&!VNcE(E!5*A7x6q;O^lwlJ z^#ynNiyX}+E8H%wdRE0N!;BT@t-aiv~!^9JOzI$vhWakqh?d96aSK+pE=TFuA)cia##CPT~XBg!s>WoCqW;-cWFP9YmLDi zAvd-MW7O@LgC{^=tn)Fu&;<>0Gs}&GWJ->gO`%@y3%zJNb#Yg_O*L)b3i@DMzyz5$ zFzS08s3-fz>1C3Q@P5R9a%uQ9bj>(BSJp38t))L0j&wf0El<0jzl_->+^ z+-eh_0#U^m{^ff}`s@RBhu{ zYnefvY*`+Uha=%t1$E#r;t6||OkBIz%7x4^5WEWvOB~!q1|B5_?z(eA7-$85CH`va z<14rs9l3J^^vRt=(KzB#$RjaO9$c+)=91?+6UkHTSG~ZF%X6L$#|wQgTzu~EGp{S@ zsBKu@k(X1)g&iEr%24WL=ay`)m;P9G)r**PZ?0cAu9Iz>Ow*>vu0D3cQ}i&>rDt~J z;3^)mr#d73l79<8!YcVMU%zf*M(w9c85cO~!M@1A)8V2>q7vLn24@OPA1psg z{FCdLQi+N$pdT&KnCEjeHz(n}@KIn2@+;8y4gM1D!o)zLAdmcb<>f1%;?*TLCO+_@ zg5mkVdy<{|_RjQ%DPmBx3}=ywH59y;8`T}-OjE=&^(+W1M3vx$5v+oUzjehnb4&V1tS#AlIOvDzY54lC$iE`K4!1ajz znryAyCaJ*7rW$Y75&ZP(iI*irF}ZiT7mbKX(XAY1??*B*>P_&*^h%gvCHo@P$tovDlKQgMYAoGjki*~MbkZS`nf6in2>)|St0oT~+ z5dO^|q*r0^xb6mC1cAb(?Bc34-b>`oYjN3mJK$|bGe*_gwLIPw7$N3uCg-k!!L-P5 zxGCff7f}z&MM6RTZqO&HXvHI+{`)O-fv`Jw9CSdfuFoUyG53n0eh`*O6y8KXB@6#t z=|m(3{)p#w<$dC3g2$I}vy>qOtqbZmKfjQ;LM&WiN7WzY9v_D6~bznA#r|4jovxn(E&$?z| z)70d&1W#|IvQmS;wAgfb#Z5gzl_$|IsXPofMOPM*J|fqYVr=4=nV0YRSupIN^DA%- zoAvN9U3A3KN$Ykj6))>HyLv!?aLu{stK3>RZDXbRvJXUZV*obWGUxPJXY{LVO|Ge? zxgR0we2Jcz*cYkNeq5xW+DE6&7$dVhRzo8*{S33X&H z+H%AmbK?ed4O;6H7W!MV8BlBhHL)wA`&Qaefw13-f!coD! z9;W~J-=75Xhag%wuboI<&{t| zh~uy(xx`v-K(}tOR68Byni)^LU#Hm*b}GtMDtyDW`RtPwPuMIU?#m{+BzguF5vmfu z&Tg~|kKt(Q+4##q*JCH2kO4xKKHRSqF1jllcXH-#w$L=s3>YkQU8YLJAxFNe^rB~7 zDaIu_+i$8u&{rzX_*7rMR3}dP%rT~PlWlHYleyWKMy|^9=)iG0n}Dn8%|vqX2A8Q| zbBTLpgnSR;{phjy8n>Eh_F3}BDw$_f=q&? z8_xHnc$gC6TP71NsQ?obIwM`-0zMb$rFfp>dLe4QFYo+Ov~xU(yTV*I1buQD_Q=9c z|8ZVH#l*ft{GCJ|qTLu#h$trcG(L8(b&(ti3euTJ_IT2)O~w_jf*S0rZl;vfg=^%{ zR{qSbd!tJH6AX>g(MtWs4zF<9^dr0P7&+~pRCcL!lQzko9H8r1+)VFLvsg$59u6$K zFS#o~WD9?@^uY(?a4;L0_s=Z~Dy0uUgfbP~Dtk0rCa&L?Ik3z!3YcU zx@2DXKzaWoVxEFOE=mX8VKb(J7YoOR`?=6;mi^&TmIRIZjv5Qn=ccUJM7 zV4Kj!ou7in6-}~!NV~+9@@{&)ov4y3jTOo!rR2{kt;aq?{c{U_>4)g1RA5l%WRfM7 z%V@>2RcSNVIA=Uyim&BxC>qN5srtLx&XBW-TWrDQ1-i*Y)8PzM(9`6kV)kIvu$=Zt zp~E9nKO!HIOX*c$txre#slEcMc32_QS|4&_u7XQRR{IF}AWE5+P8-Z?=G2B6hm=vh7%SjL;2EfJz$)`B|NLtJa6K8SK$kFK7jDTIiVOf02q*@b= z-4NT_-KHot`x;Sh9sKDAR0C(gtG-{^gTn`*8+N`Z0;j^)Ry5%1$YW2`oLeq^EtwrY z5Ny-oCY!2Jzx8lsYt^FDBr{RrzU#grwgryU2_4gB(}PU5*>IGJYvvtxt4zh2=+yJN zYOF`2k!i^MX&ZUBtzNFj;A)Dmqj;w+XHONUJFabPe-4Yb@zS5lp8r06=)R8$pIR!g zkP`jSQB?7shm@BSQ!n*%#rB_8sO-75ko@i1StK)y4V>RY}KD{h&k!3>g{ z3k8GtJBgBIj!X<{R%gk=J2wt)2$PZpuQTFV)-wCtze#)M?d*YEdJf6Iye)19b4BP7 zY~jdfH45HjA5*kg5{o68N;e{1jJS4C+u*4s_&dtP=6$$sP)Gfjr~?1L`Y(aPL^hV# zCsp4EgPH9s*_9=0RCyz0T)CM71||A&Pg(BSjyGf)-oz8Xp8FE@9kOdUV?55pqY~~R z+5GVBOK)fE_Uqhei2ZON!|;JaWYEd%D&r^|G&vLHK!okJrBd-S>e_JzkAN=eGIpqx znk%==qt55z+GW0XDd5lIept7(j~(=N+Qh(@{`C8ekI0LA_zwDD z;M6f;j=DplCmRlBP_-5FS{debGYtM(@evTEfN-<;xhcwkyj3M?j!3 zfD#KO2Ums)r3T~{(pEl`%=>fvn-j5Ewu5m=B>z5wp*^K|6r<1vfA51o$-ctB{E}_^ z1nwjY3lsga68R(tzmC&?ChiSU@@Y{$w^E3GO(jhwl7WZIxL*bu*Htq(D6Vs9u?2_9 zxN2Qr+@Yp(oMr=Tg*#bOxYsAyk8#OT=59}1y$;z{U)ra~FX6a@xhX7!I2oSxrI?rY zNp}nW*bYl7n=F=2gN;Q{)P+M{6+4z;uD|K~_j6@Bg>APL_sTf^7+>Y45VN7M$3AST zfSr*Ds{?oP=XBi5x>P#VR^WO>-M=1aah-*gIpE*rFSM>`yR@=1nXQ2t(Jj5b33fcp zq}0ZohYO4ix0tkXk5xa4e|;~}{!n{wLqoV!Zrogp^D)U~!vTp}?4rS!NCt*;qj%*V(dsR35=s9FzNpcpQ(X%u*nuRKPN(lr zrS};|Cn@+7{#ePxN(ER85?dtyu0A3Pf?z&gU8Ki#*=SScmQ|?q+NIv5>mDWY#lc_% z{DH%WEsz}0hYJ?Z5r5?xm*7uwP@TeWXDaw>4?+0 zKj>h-d0AA-{i|GMOXjYdPQBUD;+S(DKqXzs)m=Lmf~U=M=z|{nWPf=CjlE7Y1bWy7 zLUW)}3pXPOln9nBlMfW3cwqG}y{*$FQ~TvJ1E6o9{*xRW?uTWhPnF**_yf7re&`mo z_>-gKRilir7j5c<_>o)*);g+CFr*k|>SjT6z@Fvlu-3}9;^z9wGQ5VEFpCp$8tx&p zTqr-$UW#{beoh7#h3dGd%FKtaz_h9ekK6QyY1~~RnymYufA#yXKH3oPm@O0Cye{&I z(oH;7>@8OX454n~^)RoN3?^f8R~LOTeXMX2+i?7N3U`A}L~#s|%{qAC`zJx3JQpOZ zM|wQ@++iCh*FL=`=%e0?KUsxG27_}_cfqU(N6c3Se5Frxdsgka#!cW)Wl!;qz}d;& zBIX!GNZx~FVF5Ganekch2b)3+d`$l2cg2pok{k79li75LbRbLD^JaM`wok#?*QmoYmdh1# zTk)IcIae`S>*pHBxYyWPpGLNoo>#JPb4d?5xR(vMk+M`S3*?nlG6}(Fojv=?vQ>4r zv73o8J%ByQ;_f$CrgUyylDf&XY8f`AaUC7sh?~C;?ip0$o-ks5>QT$?=we+g)itU6 zu=EU3a1xIIrXW004+^Su+nI&v3|#jZqI(b*z!9!NMfq+79dn4X4OS~wWl6=p|^SJ(S@{=lxum+T;kKKo0r zbQbb_;+1=Z(&K&t_V^jUmcZYsi}1@}4D1p6YRSLy6ji8U{${BCo;GGw?8f1L98R!` z%PQTtd=}QXFabG^R^&2nMUQZ<;7&Bm7vEPDm^mn6Eb6L8yz#v#kI)^Jp`$$EXEUAp zTe!=N$c%5bpSwm91>tjsP|PriBMJ(xmP%pyJQf|Q`|M@ivaZ@A-^;adUF@>YtsYWh zrBslDKiTt6Qs-JyP+X!miphqKbd;x~?+os_Xtc7IXcpe@61yt08^Mjuwo6=@gEPTX zt^nRO89iAyQQg3WnBGRYWPiRRy~57b*4+lVD_P79cczc3H8oeI8^x*V2^-OmLofb6 z690U$5}Y%e1NjQ>sz9FbNAlUyI}!t<;dNd$ZDcE{17#+`?gVPO#Qwx?dfN-=qF{CI zzeP2oa`)+E#6TG2dk^hevICrn*Ud!TfI^XnI9k1oJP&ZSiDv!a8 zT1a(FSAmwai9an2U@_BN{!TC^I8^Wl=HO!#?9q$B;7n6H>djQhY|B5~f9CB=*9}bJ zl*|hcvw0C7W-%JdQ@UVS7==gV^Wc>r2t=*GzviI4hEQdnM2r8)*J>Dg{e@H9k2uL> z{Rq$DizhF>%kw@66#Q|W1egAohp%>aGv&a8lGxWu#%XJ41BY$&y;)q5E~#j%*KkMW zbGfEsAf!8U!lrIF)yBjO~#0sYKTZu zfM18iyF|Vg-N7Wz<(>hlvWP9rC&Uv#6rS%4ZZU8Xqa?o(uY7b-N$6xJOPPVFRa%uc zRiE0RS5ZUg;~HU~D{-f)EbDE2&Sk8torl^V5&eELyvH!b&GvO_5y4&&PVTLZPmHK! zI>s7Xj3+j((HT7BwbUG-=M7bog{wluzd&V3qG45FI2U$py9_0I&g|a{m`l{$<$iMu)6C0q97$~*hZs|hEpEXKvP#7!bp)Q8) z&UaO?O^^+P!iE+~zHVLv%#y%-8aY^UF}*6Nd!jsJRDZYbo#km+91i5W^k$v96!3g21(TZz#!^9EyK-j*eyP{WqE7Nf#_LXyIVkQG!PlhcMZ-`{K^K z(N_}=ZD-!nLVq6fo{h!$lWjeDU_0K%`E26R}@OTwgMmBbI694E*CQIE~ zl+U8EQoL1Dat!5#jzY((7Uv)%Xq8uWBRe8kBzQ>%l?ef!%n0@Raz`bzJD!Z78$-eE6e| z{G1f-NMz6n%Prq?=+0)jUAq+?pto`7#7AEpx^Iu2rREdNH7VG$2@d)069>ccNG2BM zd>90_3R}zcLawQe^A(UdD02;oZ^E(2RDl^Ay1o$@fXcwyJTnKrw~5|ECKr#1I#RV2 z!nuHE`3e$kB~~_jJoX{Dr8B3yQ1W$46y|rZ)5Y&;C13ZFx9MET;L>#nbJBWGa49)_ zr9YW`m4t4S3|yCFPYPJ)!#o})!Gb_Kk+3y14GVdSYGnEM-TXMXYIk0em zGKKqsx!xyuzr^tLK!Ja8&&6#Q*??A_4KxNX_7Mdo3xhw&z#j~bl=s%3r|RC#4KdLh zw2^^}$v-FBpEZ8eQD$@Yfjuq>w86g|Xg|=t!6i2wygKLcjd7q=Xu}Q4qSI?9-%hfG zx!aqMYr*7c>StG>qs3KajH(v+6LJ;)A{$`hQ{z+cQb+A7ENOA1z{9;Q&15NAxHOlU z3ELAWppL=kb>S2w9mW)@04|%t5;EJ!mN-VmNX-}N&!7UTLu(ELLdS7Cc=BRKY-n7X0?Z6(`D zu9MzFSd+)FFG@wXC?8ca{V=Rl6AGU&yLZXPA>F0ZDy9FO4%q^>K%59h_9gmB-yqmK z_w}D|A@dd``jc39AX%?sn-=BH{)b1I0$;a;?K5qyN4RpC}u+S1m zr3aGN(gEVK%%zzqQ$fg7`CAXZ_2A<>ClzmLoVApVhG))s@E3DDBLcoa1QZ0m5B}cg zO8cvQ)i5j>6*J}I4T3ozE8g4tDC+9@VMTsyA3+;!eWs{_# zmkYY-))f5;(T~21{m9MyYdqXDuSR#U*}26(=1FbjDhgSw1#V}nA%;KY6Ex{|`oT6T z6Hy$fVaoD-QadiUMd*6FbRX_h7-hI=K_3@k5_3QJ6_qv#{nXUyDQdXzz&ba|n3_z~ zal7%HQ{6dZEUK?!mciVFyq&7Ab&mL&aJNb}>(S^fT`wJo+|}iR9Iw9JWQj34d^u7V-*-oWWgqWmP=Kb4&sWbwW1-|V$djAu|>(m!sSX#5p@BxwR`92 zW}AtqYvejX%q+2LREb#U_;Gf16wW0+PizfYnN#L*FWMI9W{93_Tsl3}HgvjcAer3H z1Vn03FbvAzTqOF*N8-;b2(0^hb|>=_I0bu`=EKrUr60mUKkQw;Zc}tuX^Uwv&;?2b z7!T+95-gxnMH0o88kU~vDKRipdL$+(qH6d9J=GuXAHkdEh3MhIJ#5rGc&hKgCZbKG)zbO8s>yr%JR)47dQ2VtGxiFt)kZEXfMH@Wy zQ!dD}9gO>NvfjqNwFSkadqCWpsfr^7PLCbm7B1Lz`$}+^s>N5CXe1RLaV%O^+pxL5 z&U(&a^our1YUK5hC`E3ucV6Hb3FI+BHIS2~W0kH%$-y9TGCM_YpKv|bGPp6L zKTG7h%GP}^)1Bv5nYFPk!#%g#ou1CQO2}xM%)^yG94vuXG+Xc-7Cy zmFwi&N)Si9gMH~H9(60RPjJU~Y`@8-fLtxSe=^UMAxxq5nVx1cPK?@ite`=X~ajeT_aP z3OchcW>FDlk(sxVpT`=Dn5{jb%9Hq4TwhG=sJio!sfrD47&YC}X-mJbt~JbRycYJ<$i2-dThtRJd|YM-Ml)PvG&jmHd0Pv$x?O?B8yAGjK(&{g6Ta{WB`LojTSi5%A6S6Wnt<(4JNi z*7@Lc(<4=IW6Ln)@GdYgRm8s(U$UT&XKH-%dU7Zi1yhuGML(?M;WV@*HGCg?zwSxr zsi6wNLK?FQumMB50*0dD)D*s9h40KBkoHXQ2Lk0u z#6bCR9#@iQ&OH~~JG;2sCeyVsUg5nB>iTu=7^jnuTkGu&PaCtCg;M|gR4{n8Gt0n5 zv(9t+5j>$sOkrKMvC?F)tPHH6H*1Y$1g(~c1vcGt*;CAZPSld#X*0+1iuPzl9RX7I&j2b2omF5BE>D9n*DbhfYtPUM9PX3ai@V z;cwXNsK)DJ#4Ieb6)t+Y7;pLFDJs4cRAW=P2QHW98w>HtsI}TmHO}KW6WAD?$ zjQR{!AbvyYoN}vXMYF1&rMKwo+}roOGri(`$5ncdwuY-6#r50{w(T*T;I4V5p{}8u zI5?-zPqj7^1Yt%WdtAj>iy_J@uCxs)uzd`=!&#=4JOL zv%9|%T}i~^*5GKXvf#*IVSX_MXT2+Go61fpkxN9$XZw>zaw?fvrf(m0Ug&t*c%t3Z*H-^jFV}UM zguqIT69KtU!F`HpSVKFVXE5Dsrf2Hxq*tXp2xsrB?j8U zxx_+w1AoX+lt zf#D&#WB#1HNuQBTt%ruey(5e&F%M5!k0!-*+{3GYz3?WslULdb9iy(tY=`9=xs#|d z7;}w7+DUv`vQ;X!j8pW@#^X#jPB8V&l&sqU+l2b%P`jPi7bn7m$r z;zjB|LA>Dq++sYexIYEpU>0YUk0q!(u_4pJOb~cw<0E1qx=4wC;7{V;UJ#b(KoY%& z#6jsr93XIBA|MyGW%|VAm)t8_H>tpjMRQLNT#V*pt$ZBy75TYQZiDm?_Y9_GRJJK- zo^2MJsR`FPzVGn2J;viizaF~He3u9HfXA-4=du}*X1$EE?@?eYh^VC}ZnCemr5dZu zbgb%{m_@nmcZM9S$;qJJF8njDPjIs<+`#dmWjesXV=2Ccxt$kUK+YBu6YCef4zF z3j%CJqC6BLQ{&R}RuNUm#(@ePz4$(Z5n>@IwDEZ7!6G?LW(#RxiOMRWa-vQvBo9kZ zO7Fz*_Rk8ZLu26xDO_jqUe!`|fxV(NB<;0%8ng z+gzm}A%hE0WN@wfQv*uOxFg_aramuR(aAzLGDQ>=zu{4CMfbum!S&() zFb@*b>(jZc%YAM#LoGMTS{j; zF?MldbV$iPIy8V1MZq|)i$aAdlz3U?qZS&Nx-L_=C#weqeP8u`b$+8yy5RWv_(wb! znCFOl{_cg{3%GR+z6Arl=i=^*a4rcR&^k`;by(-E5)TE7=NebhJbTOID)fI9we>X> zHE3Y?5r>09RL<26sSQ<)XqZqtuWC{oY$`Wwo=(~QmL5WS+2!KR4b5Do0e|G*ROd`6 zuJB=b@Fl{9rg$b#=Wx9%tZvpf84Deo9ck8xxtk5yb-FNdDG*Kt#*p{nf$)IE?uKXX zVrL2d54O3&4BHH+XbY{OaTk5Ns6Oh@l@#MekP+m(AG#})R{B+RY{}(0%V-RQiGt^3|Cd^r*Q89| z&dGe7Iwh^Xs>G6gIh4U}SS8>0B=W07AmS`oYYHX9`Xz(A+|bhX$?KEj$>1+1v?-Jn z%ApsLSSJ;nXP$4tykTBHUqKNK;)s56YQ#jgE&w4C@2LCv{!15-#?Ll`2*C`MACH1U zJ5%@)TUn&sQ|?iP*{%$$S2SU@ z8(ngN-auz63`&^YBtf0%@8DBV?dg~`L~!hhn=ccG^p;fTG&6U;_g~j1ppXfXr@xEM zI6UFmTtaonM_ZvcErbDF?O&l<3|lPbR5auU6KVle^Qc=;Bplmu2AAIoRhPEHoI);T z!Udv5Nh0npBlvL?h=V=%n5NBc^(8bhli5k?<HcoqE3YCjhr zw7EnuiGipYlx>uXa>1ZS>e|NU#tgaG3nMC($EdIZ=wjqHUJJV0X?Vu}x304ZYC28V zz6AVa=G0l9rGyU^x=*#U8hT~Im#8zRoE^O~;md&iR!OhKjr;?G!Jc_foE7$>Nl=j3 zJ*T8s(hDI0LFjp>3VJ17B_yEOa6YPrWmmnw>wXeYr%pYUkc8x)!2im1-}iNYJSUIk zB9m+Lpii;y1}q2qh(d}L1zRo{e~{ffi@+QhoP0L<>dB$$lUUxc#UI9Ecz>CdB(^vV z4wEp=k<|xj|J3@^Ajmq5Cevu=KeqxB*MvZ!;mGP(8qZRwSyBWd2JJ_S*+_)rS4Nb# zm0BX@Pxx(I8_aF*RPValLE&XFcgNXqzB_Z)Yc4IZf4Z2dC!^?6eW5@L9yiv4oDRN$ zKB@VVe40+GV6r1+UNSL|?gW1*FlK+5$zgur=jQ)Oh4~dTQqR-Ph#qM9-;d4jTPErd z@-8sQyIBYv?jG)9{y{U39RK1d`y;ngWi;13*GxxSZFy}pkZaDcn^bEp{kEXtS3=+xyKbSCgra2ll2j8^vIoK(`@cM( zra4O#!RtAO>?*ZezYVpdN2HGF|GG)mzdTju&CvCmML%Rx75(sID2Frj1_a-he~ zVm`7RGiZQ9Um45KGkl=%>&aJ7{pq4~FkNOW6`UpxSxGN>X%7s-ieL~+jn~+kmhvIp zLrb?hL6q<(i#WH`2Ii6=kLQD24 zHl1##FT8GkNdA777*lyHog0rGn~w$0_Q&sDzWZxx;$(4IU_`nHvpH(FF2CtnV!xn^ zkGmf?-t%>h5%*@8fATQZ${L&Y0aGgmcB4wI}_6e^y7TrIZ=_#t}6OKaE(-%=I zMP9ju>Eq}#Wwr9rGy^V3466v3qoCYKz0oTYCqw^IRGW!cq|iIeuP?sOJ0|_TeUVV8 zy|?OKIq17R^*n`Q6iYKFvhQS>INbWpvv{+In1e)g%-%YRM@l|xXYygA<|T#?vkQRj z;mf?_)AxTS`*eO;3SZq+U*hXY;!gR1pzImhHX)Gs1MIyb8jXUuAYR@2ll3RBo)+Qx zd05;4mbeHUDi)4{J}EV=LNiAZhv}><>TJRXlpiPLfdEi7xAXwK^@Bgvh*~s_2Z;VN zGMcEPKB@}z9U*Hb96I#LQkGi$!3-hr$kCQL-b%l*Xa@YvrHiQtrh1V7_vrN^I=<$y zzD;>w5kA$oflEJGsr4J{cZ#Q~tPWLCwXmnz9v3&A{=)UQ)|`^(77_5|$bxCcF?mar14@o$%2=Ja2Bdu7}%XK1;j*D|(qdqyGJ? zZ&7F`KRb`DK1C(m`Ol6ropOj?xC@|JvCXd(?XVZaJgme_WptYIo?tKj;QjJsxpGsg ziNlBRV&usq0hAXyEWu7Fk34CBU=sElrPs_)Rp|_S5*?D#tZxHID;LMf3owkD0%I!T z3|I^^%hcCPr7GWCGOg*csZpk_%@Eb~Q4`ySZD&6v{DXEFP%M~?7kO7g&(1yj?I_=c z;xn%U9c1vr|6F!#^kl_n16}p#g7_WGVQXX}R{7atax5F4l=OUz((r=#aR9uOljRWG zT>*tNFyIU*!{>Wa4*wQSKePLOZWX1$q*-I3QJS{^WZLi(<=0tk3oeys zP!z1_w-GFWN7HLESl%GG4jYeVR+I}V1NCCRBjAMRvKmosQ0>HiyINvD)&5D%R-^+$ zjZu{+A+jKv^YFOKF3(WKSx!CoDe*5y>x4@k{-jP8)74cLpPh8MX`xPCDKDtexkmK+ z&;R+Yq400yL6-2%W6P!87r(f~4CrgoYwQBjWxn4q`?|6JD|p!@BWD~4AG+T)+cPeJ zL``O^X8zsouxeL-O%@Nt60@j&VR!iVU;T;N1#aEbk$#_#axA`vS0mAZ-jZ;*SzdkO zayFEWu&V+yDHM&UTEj)Mvm<_Tyh7p3Z*QS1&*0~c8k3B z0xHD#9Mnn)4^Ky*+$y-IpOAel*VLMRd*DJK6Si!c30)?YCT z-vv0hE*18IvFwuvWPz1^qYev8%q@73_*V)vG01;y{`clz=nrYmP_;o6_j97s4{29+KE`0nrj{3oin{zmQA zUqGSO{~i0&*#EHzN9y)t{LEuFJ7ACEaGHszK~%Z`S&7+DI#vz?D%RbS>WTGA63-XK z%DmC*stqk-|7WwMVjvw{3ax}zJp8cCQvLMCllrNLWTYOZ z7pAsGl96IE-0PndHII!nrWU4SYhUjD^_OqKU(MztBFKKMrRrPy5~Gu_AO7AmVUcKK zlt=x%lcEnHe3ai2>w>^CVvsUW2?s9m?%*(h|CZz3iI$(@`^okaLBMw4>=b8xkOre#tHdjy4Zm?^lV^(oA6S1l(SmX25V(D_v#>M4y+v40{g&cCL!9}C;xt)U zY`m&n?-$XP@27%+8U}K_a4=XF@+Q!*#lly?ANnNSU(tBQ^m$N6Wdv5Zl<%TuB3vW? z@!w!i8nouD{_UqbnkH3y?9VkqUz8Rx-OS{z#FfM?Te84fSM&&+_cd#VxVJ35{uD6*3#_b`w-kc+{Jb|7cqu{j zn+AVr?$xD}D~CDP9k5a(?=1~RwJ-AGGl>Nc6F;+z^*Zs*w%{cEG((G+ zPpXSpuwa3Y?=Etjt2(+_R`H-%t%_>bWNafcOAa9DF$Iv!wENqQM?tb|wwO@+1C=Dx z3F$8j~Nkkcc>|Ni^gALjL7Z` zAn#iAuK9zH%|>60*4*4?0wB}X*eApg$X=K(YSE6YR4q`!3hRNt|6zeY?5|?%UDU*s zArLmj(>(S?gv=}Zt95x)n-pOu0|9!~dr+lOsMVvR?=3tC28)w9x|b5vQF|e>VxdH& zFXRtUKM&W{2g+;7>^3JusCuC!Gwv#wGtp1Rq=b4wsyWbs=hIEpb*SfIKGh0uQO9ta zT56`8j$U8CF5T3d&MwW2Y*3xqDl14V8Zi8!fUIP**_X+cg ziAuPyh}ZCEC{z?OCS3+goO>zF1mBE^qY^B2;KAvU1uSRBT8{66aHs2vwFRS9aPyMNCrxOvMN49f%PT3bM zw~#-`g=0}|(78IlRGv!2J^1ky`g09YHP?I}YfzujpTXW=&HhS<{-4d?69qq~?)XjZ z8}L_H!r^JMY>pAB`g69KT^iUK81B;QW-h9BU}eFDr**A4z1_`Uq@-Hkm7k~DnZFnV z{s$VP(5JOSX0IFX@eI%3?rFYR`qf)z#`}9_nNhCV`BA2vhMVh{7Fx+{oq6guj-X-; zph4H6pZQV=Y7K%hD*vdY497w(+RHl{DyF9?O#~68$2c?cz^n7-sJZEo4y`UPaHk0q z%!irQJ}Mpe6YL7X1S}Yr*+Vxxy4maL=B`h*P6c9t_zdboE7-&T0)JY8B_T2QGP4q0 z$-XRJg9CS7|NYpm&inDb3wzzabnji<{RpMubFN>Yq20-CF8PRk#eU~T&W&6FfAaf? zHL$vV9o_u10LYWll3bD&SeAbE^chPUi@ZOo5%^6Qe71r~+0sf`*|idjUONmQ`X1bd zeZ*aOYpO+AYv8(JtsP`;@|sO7doV3)ExxXTBc-`esn6o)j-ro?e0N;zA!~}=wWVh_ z;SUa^!tDRK5eZ%HyFNRK`Uo!$;XTTFciPe5Ks*j=eGGpaia#9p8TObAO-%MJw)Zbo zAYg?Je}DP$1^9#gSOxSIehP)M%*|M4W!heRMpr|3%@;McOVTjbwwi_ArN2Xq9Wy~= zmv(HWYC%~Ot6l(wTHucRDMi$v7fXFJ#-*7!o4AJlki)h+fkU8lzIFC@%eFKyoz~5X zf(fl!_W?Ypn&FKb*~u)sT?Q_1d=kAp8)=OZ7R4%)ji|^C#2D?UD91pX*sf_=J^tsZ zp+3qSw#s|uUG3o@e&hzb4<(3)6LDqUP`BfWc-W&xWCZW*N!e1Fd43_Rp|?`DbaEwt zB~Ho{d|8=m-?_c>90u&jy*BC3~ZK3#HiHG8`rh+}>2B_YDb|W!4zf@&$vuv)s0W7#3=_LAKzm6qkhjnu@niB4)jE;d*y{3y}Ftsu|K@H%%H-^HF#)LgJZ?LwNzV!j> z7&2bQtGw4h)l3CSO$Gf76;xwHy#zMYcV_*xce##Q8$8GRmDE)?FkPx01U6?LrcPyE zr;k!ubL_k4Ojl^U$NX)u7qr+U*j&yWJiL{7eKI@Zr{=E+-zE@OeyfOVSOEO>t(-F) zo?JS_y)51o_`?UQGz94SIrsy8drV7V-kJQJx4Fo2eX4KdWc*P4WL&l7R8cyf?yH^g3YVL&C$rcDtJ(w=A&}ON4_Fho5U+jGBXyvx2ui){(LOYE2e*B zRE&~2c~D9)wIpFP@gam{V6yyvkW&0Md#>lTt#WJ2bcG*d#Bx`Z5|;uAf;jtYf# zVx2UvndQ4p{y8R$$oi3w#TN^#jGFaT1kwllc`L*N;4k;mF;EB0^MKb24$Ovu;>QPWDL!DvX{qO?GAAk;#m?g@h+wVbIz71ZGEd@|s z%FOc<0?#d-!v^;e0axTIIrqdNoWJ8(Ej%gHFoeERSn&Mnz_e7CbBU89hvLuf92z-^ z{e5QMpW|2tEk!nJOmIazLte{o}sL>Fgp%w^3AdDkG?^RxvSDpI6mH;u*~yV#MehM zB~o9!K&*TU{Tf{A@xeR-#eRd90i2uO7)jzwr%|!`(~&jh->NOQEDK!2Ts9$4eIQ@j zA`|!1^LO~qq3zhG$IbUUhSfd5pR>{KI{!RuGPPLbKACyaRSkl~ZbToNSFSi$S`5CQ zI*fO@r~A|s5|#YZSGy?H%cfQ173y^$RMGI!o9Z_@%uHzXXzBtJp#+#qfIdIdA!l0F zLEdagQ&Y8WS;j+M!RRnV6VypHhhevMre?u$XX;>4AD8m8ZMC_U!=IH0TH(=bqz=2A zj8PriTi+8xbyS_{`i zI_qM91K8n8~gtT4%4j(F(0cF))NETPwtJ| zW8=B!+-iU^tH9Wxd2B+Ttgquhi+wGoZRE8bEFv3XUo^d`1haO6adnP3#e0GG&{43y zs4vohs<6FnuwN1c<|f6GE(0w6sNM)+SAWS$6%65rAge!+P$A`*`>78?IsxHr4TMpz?0eN0MbH>e&#zz05FSM?)&8;J#1F0%hEv`NUT{ zLua~b4AxPo$%CCPrrufFOlxy_pgur7HJVFtPm~!*s(-B`;!a-n^~~H@zY&OyQcvxp z7el%T+_y6GG6DCUT}HLlgZ#bj_wE%ubB9P9jk`XT9Z6DGTt2e)rSDKK@*^aR$tt4xSMX3oK|qg+UjSIQ$hb z>2Ro-986{dg(t|OD5DI&5rc>gr3Shw3%lIcqp_REy0yRh@XcM~6&}IG#uCGV$}pc| zZ<@oy<>3ML9@50HG*!r9cGpZ(d&>otri?m!`0uQy90V@UTvtsHxsh5AOU=}KFy}j4 z%+f75v8ALd(^An>M?H4G*Xq^LXW5F5m=5(Z6?2xUO>{*}hNvi)<|d`(ezC^~!n*Nyb+AoQ9mgzX5-`HLaOJbSrozh=s4ofAy_R(=FQLas1Ul}79Qvz z$532TSmp!rE>vHoi^&p)+bquS@^^Ls@8P}pKy2hhvDX%TVB<@;&4T{oH_QvK$JX&AHOYlxkz=$^oGkT zl>IHEo}e!jvN~w1UJZnZO8j(;1VLgsj2Hxc9+M@>Fo#eTiDNY5zL*XHucbVuj(A@x zNxrL<2tXOIvqbCSNT$>*9TUXm>1 z^Mr_g<@;%!v`CnaiKo(Eh(n}FKb7AnES3@VJ~IR=#+4;T^)tOs@rLCtKm)g6T={&m zyTThb-`J1%XK(xO&WhrPVQ+%yaQIJnhM<(WF_ZTf=*JxMDtaoqWIg@00SXem z%bq+nx-oq0;#CyTz0n)N81=)cY$A~uy&h_z9tMr7FXB~5%L4^&Oo9=*SKNDu@$i@ zC6Pj#*W8Ub@m^&1MtG#3+8ME*F{wNb(50gYfiUgb z)>2(E9czu%#S@eLOIMZm*z0DI7uu{g6bgx7qQ3kIdu%r9@2gb0zhQW8y zSGet-=U$a(K=4~Y-#Ak!9}0`LM?Y->h0Y>(fQ9i(6P*Fz0+j@+D+U{`JrQ zMxNx~{`@#vGq#-^XSZ-WpV(hNI&oT&2)JQyEPAjsC&OTom9nnu#rh!_qnFuV)-kEL9{p_ta8W93t-FbG$5J>EM z4(|^i5bsa*2B6S-kEAo}GQ%SQ*jL#Rp;37^F>!{xh53H+HL<3RvZ#1kQtHHc@&c>L zy;K|W94?&?Crmk9In+sG78i=K6e+=0uHuEq#AG_6vScTAA6fowh<6hI9m!NA{XO#h z0w~IJOO5tyjwOEOGwGHT07WBJ)YufWk5DW2H#<47Gz8Mg3)#AeHi|MzHctI;e}w;- zjkTs7H$Qp@fA1hL_^#D0Ag}QA0I`k>WrN8f=NZr;P$*g85HA++)t3R$4JZ2NjT}UM39tidagx@IWDW$f}mpgqvv zoNSq;nxPE7Bl=(|?x5O$s6)43ncqh>mSyAc{6L<6I)L5P?K19xKcWyJaC2o#Q3tD& zGvA5cF#+cZEij+qu75Jxdn2%Bl|5QJn*1aO%=W;M57j9@p4yaV?(+Jj-ftF11aoD<@1}ZT89B(ggTB zzRUMxmn;Y#rc|nJB9e>5y_$*0l&>}I7zT!%6}9-HfU$r4d4SIM@h5A1fWGI3JBPl9 zXB`&j;m1>Xi`-3hm*Nb~T==!{2Ku!A&8lNQh6fd+EDfLds`@+ajeMG3$v4w)rYrAj zUSk$zDH=~Q$2?*CS1~y;Lli)*k>W(z#X0OFdo*=3k9vYT6Of?o&a;i4rc48&EqS^)pn0ISy|xVm(uwRH@>KQ5Qr|h+i>m9tehLENJVn2Xg?(6EAIJ8~ z@1wR09OC_nYja$j4cX(H$1 zTcPp|h#6!Jfgpzs*=~nsp${K$uap>A{@-8@&2PCa<#||~>){dAZmXV8-vXgd$JY13 z#n@6`8qr@=BU9H~NA+J4^?4#EUN(N_$kn@NEW5YBJT~+fO~hi~*AMyc0Av4%Klg~R zcaWKLNQD2);tGZ1w!q(+0tWT-Hfx?q2}6I_4l9S;P4-P%w2O_!dRlaWDobqLcW>`? zKi*+JF`sg+i_gmZG<^J{%*4@raTaq)m?}wLw~{Ilc}RH7+&V(fP8)SwXaOiy%7?3) z|G{*}RC(`Md|O$4?s;8kJ+=bIV&iNtEx_?Sum(;&L7V4X7P;|{)j8=A-g7?5* zpm#k|-c!`ocX=jsg_-%YOrOECBsw3c9SA%O+zvdT=8IazSP0Kg`k%1oa%~{*DeQ;m zr;0yWU20%JzWC4SFv^Xz@+oqPd#!d#84u1km=QC`qf8c%bB0qnO3{VY95%T;yglSZ=`-t5vQ_3o$7f}g&Iq>A5uapSL>-Jn8&xH zK9?CfV#EyC3##5Bv7Vsc zGnS5du|DPt_OYZpmMJPHs>bhQeCcBypOtlc2KzlTB%;HB zJY_&s;l;x8mXZBFS-1k?gt7wO-e^oS>#D2}O(Hur*J@Hf7aP|1>F?tA@|2fF+Wtzf6Ob7m| zsJzQ18j}yHeQBenY6}LWnj9seA;q^E9}zokx%k7Y-qJ~scPM?%@E1sr;yJcj^?Q(M z85@bV)Yw!T^+Z&(F)vfoQP+vC&s~1Sd{pT`y14vGdo42%E?0h*Yl#x2-@5+w4eYPt z-~GxfA8ZH9aUuEubAAvW1mnUR5fqlcjNAutxT>A=_*32%1ajR3^9X;{yPQ=PJ+;4F z+PlPgm1iaIOY!n1u`(5Zrqw7aoMqQ}qkj zQ(Z2f69kI=v@_hd)Slv9fxnNXzhG0}U&3912@A+`&v^GY?zVgUzylQLy}S1D2M2br z+HKvo=WNxQQe(N33*?7~O$SsY{4w={rC$wy7yJI_<+tEU>MlG6j@VPh)LtIrzIbnl z-%+*8qu3y3l+C9r+2@sAE$^4m%UhAWouU&6n_S0SFxlnSbe8`q=Zh63*CxdozDpIQ z)+Yn(5kU`V%0D%OFJ07=WuMX{I}y%AWWUheK)69VBe`Zbu+A@xXp;}(CLqGr{obeg>dZ*Y%Lw+QwY zKp32e{gww=gYA}1@;OK39#~fQM?c>_A2X7?L~ELyiyg(hN06s`R`Y-*AIw$abw|~? zKefUC%h&7kf<(U$m;t>A|GDpq@K;b`z5#pmzwQ0M&C(w>i~rX z{1qP2PxqKpp+DfiyzLbd^ZaKvxPZU*GYu^59pa*ss~0Bl4P}!bqZT?<=A%D<^wq`3 zlNn8~)@1jlWq1Jo(?o1+322jwWfNn;r?^qq%0muNE%YGP)|;b3Fz5w)D?wrfo#`Iu zM;aeLSD049ZG1ddh{u9c31SOo$wWf2(UFZrAE?8(Ybjzz*9=`ZeM~}v?^x7JhrE#2 z5>`}AHI2|$)ivHb(3>MNzs24S&kTRko~imH&P8#d;u(gc-%{BQMI27;qt;8ElGL91 zKq9@8=KV=`p;piMMfg+XfzAx}lwrOI{&YqiVit3!_*QKaJGD}y00-tPpjGQ4KT!5o z**X{J=5ux&4POj=$a@5bFd^I;juR$x4I8c`zz6yAI7k>p@zKcJLLGb_P3+%UVfggghJO=mquYf;U!e@1^mG5q+ei(~AD#sqHk%AcB+sVcI5zai}x3f2aNKdU`aOgFT~ymIjO zfc~INyc{&NTDHw2cT84@&ZZ*Hu9r?*W(zBYqL*D!j7xnd%FWD3QBTn83tb6GT?tZ? z>w zjgJUK{vI62!V`QFgf&q4;9^-}<{6mcvPr&IzUih#ARXXOQHL-@BumV2!u)yhmN@Vd z?6pYe5q-M61|@T4%;FX)ca_vyNh?+rpg2?houXamMT!N5N{427e`2Z{_)!(4ZS>js zP=VBI!gm0~32VY2IS%eQ?@z4Eq@zp&ssyS_EUGM>N9Pf~AMdGpXQ7TI1pctM%SHJ6 zhNTR!+t-l2d5q)U)GoLzNIn;${F;9A;dKFd1yt%8x)6c57?^AG0rB(l%;&tnybtKC zuS1{sPm9Qe*E~O~?h|@XY=-S6>wzLVx%bU?%Ngxxu?_Yn)&_~f#C{80%L67Rv%OMe zq0Jv;`b0h5bKtKhc{v*ifRkBrAsftmpH0X{N!`$SPMZ%{iH{E+c`S^!cMkR&C89<1 zx-O*o=>ixfN9-q~=If>Nka)L_9mL9eRl|^ErblsCE>zjm-h1laQ0i1NGZKj1iku6b zi?Gw8i+wHIR#2Jc`>E>X6^tm)&+7X?p`Y7g;|#SfnxLWBLw!Pne8>1(L5q|ZS>H=} z-UEBesDi(_bQ`ah&!@lZFtw)g7#l#zprHoz?vz?*8`oxm!J{cQhD%v=^Z$g!ZFH9{ zrYE4I@_B?{MbpCIpm1o|qxK7JT6!}RujtgKk_hfYo9!*DXZX_CFh1akA7z0T4RIYHj&CAe zUvE_12J!~^-tr&93ugvXnjZF4Ccbe!fj1V81(?b>nGHtM5PCUc8%5b(T zIoIG1on>YuF``_uqFW!#2lC)UU+>2Ca4d`+_fxYlOD#^+8;jZURKHcxGvFNseH~Mc zWC8m|UiF=eoQvGLafs+cJs;G$pt8vKb9NZZi?^o;MCy;U7V|^7m4U~EKWdMy`j~7j z>?QUS`kdaPE<5^*^R`#^(mYzl9>#q_uEU?R4Pved)McU+<2)&UM7|&n>ucArpz*2V zU-%F7!@tBo!d|DLPX3Hg%N;}?1^yEP+s_Q}JMrJ^v+@O~y%7e3u?sQg>tE_lMSs38D=aN$8yl2n%R z6uLIO3qJClz8-W}CL;trk19kTRa^LxhCzQ%9TnDNUR!T{Z(HveR`+%M^!-Pv!Kn_q zM47D{f7VC*+jr9H{zB58S;CuYT@+_Xdy(p=XhUjW8a0xsK})K!lJ2LtRh7p&|H_pq zY9QkVKAbh;e0S`-c9Y7EDUo)wo$ zArYfe0chwF_X=;F`hIi4j$7?&hhdW13%It89hgh*C$YS<4v zoC+xB69eX#tZbh9-bJ7ACwz|cI=!oM&%&Qp7YNjj!WZeO8~%PL^8zh;8}5S-_}{{U z=KFOL6H~Euw5<%s{zWsFwG`nlq zdzfcG@t?dsE%9D{l^xh$y*K;^{u~0k41vPng)eFz*Nnw7i|i}5jTOfJ!g_e+Yj5yL zwBOEcSW#L4eKt#U@=S%O0_vl_Z{vEDoj~eRD9KE*6Fy~cb1MySWeHxAY%h4^?D?jw zvlEUBvk#3dFY!lhf_aPJ7)^O2Lbi<_oOA@AuO;1*3(d!ylAWo=sp?FGy1(1xRyGo& z)SJrlQ`OZKq7S(5sUi-iI+ImFV{w)j>&sb0bH;Xxw@ne^7WS7d;rJT2%0- zS_PLq=_IzPk_E;O7{c=4@tM}lEPQ-r`YcEIA6*Z|lZixvIm)rw$+4x)mrdk7?h9|+v% zKZm{p42t_cz+YJbf%_4#F`$lDV8F-)7|<~IHr##l#l5cYN`I`eNMwRs$V7g^dZW5o z`H$0+&ACfsgTmx$^}kW1IveTtvS@(hfWcpeJh5_gbkTy=5?NuYjI!WQ_ymD?(jNXI zHP<%JvX4Fy7S;Jy!4)Fc8&e&2MNdgrN!M0vd%9~mwVGOuF^T^C>g%P7=~*i4VLoPT zXi@72`jq8>`LMmhoZ~!nUDdk6T*R4RN0oKL9=(;|$1#s02&($wueTsb_&WjSE*S@Y z$t|%JTCtFe$0ihm7cN4dqEwV(kmL}k3RL-iVnd zr<5+~Tbt=ta93_9jmp}UH(elvpgzb7kdaSCBbTb%XrqC^($C z?tx*iB@s!6io@IrmG}C4Tj`H_5Zf9#Le$aBPN~28Npt9#3$9tGQ@7~&knMGTAK5j$ zJ>m^|e2w=&opjE!>pe6KRSvTyQB`Fmu49sZ=B;QL(wCyE>7M=|3A{!_QO zW^SmrQnOfe1YriPgyYBq6q^ZyieS{CuNvhoo^os<_afsW15H@~{f8hGAS$X+} znoIP#;n3mF7?86s7F!UDfj@^q=LZ&$SNK`rJ^gggu;_Qc4kpik?;|j8e;dxUmo=1C zvK$I!kA=T+@n0T)XAFOMfNsHqU0C6+n-?GNkdd2QenjoW1gi9+d3_xqPY4|3BIQhT zXX}_pE;X4dRHh3t+cZg6da@ilO!UDld0AdXiWU5aEf!v_qmpZGNxkbR3jBxD;4m0l zzwY<4>?Bv`m7_3hF#m)|FLs#R%IoQ4nbS;GxU=?iZimYR%2~0^G?m_`ek198s^`nc zyWmfiHbG`8$mWi5k!GUkBPailPgKd-#{R-#(t59gF4SZ2C)Pm219QTRRt@!{rBv%_ zHUU%eiARY)@N4BU8s~vKAy~ITlSR;`Kx2=EV%c)pbRAK-SvWRF|0T~I=h@EQHu8y% ztZwm1@m;7FdO&=o97m80TY7{#Q@R-Z+%8ECq+Lh)_Rb|xMsCnpPbd@v{$Tg6p)FgDSR#Fc`W`m5R zqK;r}G~%bAIUUcDn@munyvf`q>L{t~)vOdL6&>KO#J=auLS@d~z;we@Zc=kR+NX1q z$q{Di!-sXTT!MHnrTO~}spr$w?kmb#UQR09}eV5%7tuW%kd};ffqpvkqpP$&ZEy%K9Gyf&#_d` zrs@LbLrmpH_#f&U86l?Qe@iVJ-^e;Iop_i&${e;wcnaX!PzLU>x8gl5rjNs~dKX#x zZfeYToj_?PT-!smzPaWacV6`kse@m=>`- zh;Q;>nhY_S(2UJ3uIJmD9r5+34>(BFI*UdS?A1)SF=oRaVRy9#(`ki2opH^n*g`*? z^XjVIbztm!<-jQ7gNXYYxbM$M^_R4ggz<_ z@coKxqJiO$%nQ*Wwo(>Yeu8;z;7{im+`!-958fLx?73^A2g9GvomfkJbvMs`df!KU zZv0+Toi!P&iN8cPSaww0sd#q5j%Nro?71w6;$Y|bUBn)`s(UK=@=LMC5wwIlVmbDn zp|&6l+qIIDlp2*pE664?@n~#pq;l%D)jI3bxrkby&~c!yO?|=U3V*ujT9JqP(Lvx( zdHn_NZvoEJ1sq8 zn^t{VH$`5kr8Q6-F78Sai+D_+Y-jGIcKqI467rNM5Px8)SWC0 zT#iHa)Uv>6yzrjvrmU~}IS2V1U`PHMn2{Yskuw(5d6ViQ{`=g{qO+I68c~O_pEAaL zk3cXA3a^*C=HO@P~aTQu@;IA3rZT)`Ryn>0Fa? z)Tys-B!{7ev-11E9|*+zgZ&B?SdmC!74Y`{PkD+`tv_Ht)0{z|ao@i6HO$HOn*GHB zJO0B1%v)gR16mB6_X3GVxFs|yB4HQ0;WLllBp2?FCm$wD*r%c59{ZuClCctgKA37^ zNBK5(RUju1a%M+nBS|Xa>zF5=MM-I8!l@UlNY2wAs9Cjco4lsB$1s zHLT!~GjW*8EzR2oANXb3T?%Fa9iU=Uc2EqcOoVSrRes{Y8Fh1zWs4H!D$b2!cf-bd z@D)}6SjhQ*eEt)ggJM0KjwSw+C18>tcDIcgN=cZH{15uOBCjB7 zbArn6EdFUOCV4!Eqeo_KeN8v6_&{T=Gn`T zXIONK9*Ugm6U-|+U_)np3v6hyO8)io{r1_$Ri$+pnf3-;VJ^WystQrf9nmH9{LoUTaKdC8V! zNKr(Zj4qS1tZtx!hvke zuZj)WT?NaynBzMP7Qmlo^x!9H*0_`wX@1m|I<1eWLl!qj?oYgj-YC6=Xnl-ZiZ@g* zO4Mo|oABq@3cbYecVgG{KlrbPb13z>X7BBe@b`$%A@E z{J{^`>vxz>9JsIhePDSDwpaKoEaCA0f8+WLu&H@~&H{r&=M6d(3W1M4JM+cS=s?dv zPjNWf91f%}`?|vPVD$H46Aie!`iu)d#STX{fHs3f*6JRH_nY%|EZ-gnzj zqbku-&fXh>}s8@a)}ML(0D$#LNMDc;RKshA#EdWhGzn3Ii#-SWIAglSzsEfNbl z+zIF1ps<>Vi3}FssuTRjECMD2hrQ*ji?#Ig{RJBu+74{+hnTec#-4h;j-n+579x+^ zWY|6@Sh00);-e920^{?YcJD^^nQExfXWSWXcfv31(@OceS$b zZ-y%Q2G}h-;^wtw`n`Da9t{O`59=nIr*sn2u>DD!MupIDC^8yqPAPtgXIc`PY? zN#jB38tmiC89%~%t7^Lm)MyRixe0#`b(#%yTm;$9GPW4pb%Q=x31RbRu&2eeRV?!7+LMd< zLs|voypKQb!A7cyvDjGGc0bR6;O_N1h;_(w*Yf-9lE+@2`#@lU`3~^cVLbVM1bkd| z2nF1ML9N35W|Z%%e|Xr_K*e!oI2X!+ujJ(nyQJ3jj!~NuWopL&x$z7WhLZSu)Jie^ zAVcpPdtX~!Op=&{e#zc?Cg9&@zXk0d+6ns&avo&`btaVquo{3>s(cNfVwVMbTzfmJ zBAeaVzkkh+HOIbZM{+tK$V$<{t7unM2I`?S{<8|hF`^IDJ{VA{i=xXa!=J8&eaCx3 z49I3FU#pr>AyK?{ktM`vmW9w$Kp_5_JO;ia>e>|t@)sEL@c1~6P_3RLF{(0fdaXmD zq9^4~i0Y*Qfj+lSr~3TDeH?-}v7oMnJ^Kmj+-=$D{b$;% z_ieB7U&lY@eD^JH0e`Z;c?24kg>`3t-4q&GUxz+--OPRA?{)8~;Zws8d$q$+MYuRz z(ltg6P$rh4Yb)vLtU9%yy(pZiuM)kdi?`7g+vBo55Y$*x12I^~bp}APb+l<|2 z!mp+ypQ55m45IHgv&-O(P7pVUAEo*uZW;d6={SMSLi<=f`u%P8i`$HC!nn^h9hmxq z`g~<`kh!Hop!z#hW6k_WxKEZh1IsApknShm(sc*8m**#@61Tz|BrjwNqO zDBQ;%7TYnPx-|6NktZn>8|v&@M_uGoKQdH&r%txXA0xqVk!X(jwf++VTmVug9k}yzyR4zv5H# ziSblq@r@CAzG7q5VT}`avZR2xTWH7j$UDp?jEU>OU15Pl`G|$(UZHCcxF2^M;LmKY zqK|*XU)}<{ch&Kn0<+I|@Sc#z%HvQG$b;}GN25Z(gWfH#gB@cIJo@mtB9LqN{{m6FZ28nM}@J0P>y2S>ir% z-GX86&CVP23&(xq^3(7XsXLiIojLY>74NtiYiIx1N;;Iw>Cqg(eo;|MC5Wo4P?^=m zi3LvM_lfI>cWqZyhe7#(F6JCJbU3_WTS31t_?GkM_)lK_HO`u4%6RO=u6l_q8i)Oa z<0h^Zy^6zy!6A;QSVq2|jwepl>)f?!5)|_i=kkphL$haRP4*}Z!~^Vhafo`B0C9)- zFT_0TAj)MGzND~sLe&tvaF}7ud3or3+#~)K^030n7jjScxybekkNmXi1N|k~?cHm{ zAfQfoF}@lEgO<54HCSjW;On{5WE7cz53%6>Z|qhcc?I<4*-y+S|IT@Sx_;mKk^!;! z!!mG&dL319wN?Rv2iU_ZldYB=z61W6h9BLZxIcsr)0rG%e(yLtTQlD|8TK|JZ9UYg zgz9QrnV41ATS8@W13nG8i~H@VT)e*PaJVf%r}*VD_OILYw96~ggV;5G!t@UzZ$kZw zoIU(L@b{d1Z>TmDG8dR{dWzY;mF(nMb&p+v!*C&H`fmFI;eTBa{IB(Ou zK3QM$vdqVq0uJvG2Wt;DahBdKAEDy)nRSH;A2Horc&V|or}ODz525HS_|xY(rRa&( zX-FR8r{QnyD&HP4x|mSd({a!~_B}x5PNZ}a<@3qN-AwtCs=qDsUNMu-2k(VIV;`MJ z#mu{J!lsLLbsT*fVNCgxLUo^R-34>}j`;inm0kMAIMfNLVnnmQJjYc6UfZmO6Y=KAB;86vBz~QmTH~prrKxK4-3|j?aRP`T===kHD{W$y_Mb~o7&Dd zLRz=t*dg9cd?%)GOB{$LX3oa(U2gFk*k50~LOmiR3VW9fb^6wH+xJJ@sHJCI;}N`x%>vsLG(E)@?lyA(Z5ANs zT(Kvs*)A>@;jRn6Ij(ta`DvBX3(Zr^UxQ$?)y_Bk@Os|GIP@QB?x2nuA;MMl^Sf*E zy?fLIk`1097kBZyi{D-NuKWAy@7Y)SyW`(&r=F)|509`bRzufT^L*`G;9*ZEF~;lZ ztK_&eA&ni_dmFn3!>2ymx?J^H)n|iU&wGcGL&-N&&E%Ao&ycRdw>7_11t8{7SIweg zUDT_{^7E<2`&+Tf@MiOTGw&0a4|H^G#hI^=qLP6Qc=A?EYG6K%_Puc)md$B9isrLL z&PKjM1ACLqlSg(K5hjE(F-6|T%iq_d>XDT9S8B8Le$M@zn*>?nKyYT(_6~@e03}20 z{V;?wBlZ-p@@oA4QjVe6#m(X?bvc{Wqp0SJg|?O+u={&%q~v}Zl@_WlsQ1Q3l8FlD z=n8xKg#14?OZjYu9?QkpUOQmvORD{-s%Oz##8O1^C4J`jcSIo$YkHM_E53Bk{|5B^ H>Zkt?cs2J1 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_178x160x4.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_178x160x4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7779be65a3bd52f64d97fccbb291929256c5c527 GIT binary patch literal 14838 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 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_240x317x4.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_240x317x4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4ac6d90bc9515c5ec44c8cffc78fb8b63a402dde GIT binary patch literal 38158 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 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_320x200x24.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/tiger_320x200x24.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b43c05748af1c288ac393dc9cadf26c04fa84c7a GIT binary patch literal 192054 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%0Acc+N`{KrDAHtqOjwvaDbnO*w!CwNxK`U-(Db{ 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 z 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 vi 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 literal 0 HcmV?d00001 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/woof.bmp b/Arduino/Libraries/MCUFRIEND_kbv/extras/bitmaps/woof.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8c461e2124699d930948b7d56f0e548ed84dfa18 GIT binary patch literal 230456 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 menu. e.g. graphictest_kbv.ino + +5. Most of them will write some text to the Serial window (9600 baud). The BMP examples require you to copy the pictures from the bitmaps/ folder to your microSD (root directory) + +6. This library is only intended for UNO and these specific Shields. It will work on a MEGA2560 but not very fast. + +7. The constructor takes no arguments (because it only works with these shields) + +8. The examples are the standard Adafruit ones. You can see my edits by searching for "kbv" + +9. Any Adafruit sketch should work with the MCUFRIEND_kbv constructor() but should allow extra ID values +An Adafruit constructor(cs, rs, wr, rd, rst) IGNORES any arguments. i.e. it only uses the shield control pins + +MCUFRIEND_kbv inherits all the methods from +the Adafruit_GFX class: https://learn.adafruit.com/adafruit-gfx-graphics-library/overview +and Print class: https://www.arduino.cc/en/Serial/Print + +The only "new" methods are hardware related: +vertScroll(), readGRAM(), readPixel(), setAddrWindow(), pushColors(), readID(), begin() +readReg(), pushCommand(), WriteCmdData() access the controller registers + +10. It currently supports UNO shields with "mcufriend.com" pcbs with controllers: +HX8347-A 240x320 ID=0x8347 #define SUPPORT_8347A *** Untested *** +HX8347-D 240x320 ID=0x4747 #define SUPPORT_8347D +HX8347-G 240x320 ID=0x7575 #define SUPPORT_8347D +HX8347-I 240x320 ID=0x9595 #define SUPPORT_8347D +HX8352-A 240x400 ID=0x5252 #define SUPPORT_8352A +HX8352-B 240x400 ID=0x0065 #define SUPPORT_8352B +HX8357-B 320x480 ID=0x8357 (shares init with 8357-D) +HX8357-C 320x480 ID=0x9090 (ID has changed from 0x8357) +HX8357-D 320x480 ID=0x0099 #define SUPPORT_8357D_GAMMA +HX8367-A 240x320 ID=0x6767 #define SUPPORT_8347D +ILI9163 128x160 ID=0x9163 #define SUPPORT_9163 +ILI9225 176x220 ID=0x9225 #define SUPPORT_9225 +ILI9226 176x220 ID=0x9226 #define SUPPORT_9225 +ILI9302 240x320 ID=0x9302 +ILI9320 240x320 ID=0x9320 +ILI9325 240x320 ID=0x9325 +ILI9326 240x400 ID=0x9326 #define SUPPORT_9326_5420 +ILI9327 240x400 ID=0x9327 +ILI9328 240x320 ID=0x9328 +ILI9329 240x320 ID=0x9329 +ILI9331 240x320 ID=0x9331 +ILI9335 240x320 ID=0x9335 +ILI9338 240x320 ID=0x9338 +ILI9340 240x320 ID=0x9340 +ILI9341 240x320 ID=0x9341 +ILI9342 320x240 ID=0x9342 #define SUPPORT_9342 +ILI9481 320x480 ID=0x9481 +ILI9486 320x480 ID=0x9486 +ILI9487 320x480 ID=0x9487 +ILI9488 320x480 ID=0x9488 (weird 555 display :#define SUPPORT_9488_555) +LGDP4532 240x320 ID=0x4532 #define SUPPORT_4532 +LGDP4535 240x320 ID=0x4535 #define SUPPORT_4535 +NT35310 320x480 ID=0x5310 (hardware must be set for 8-bit parallel) +R61505 240x320 ID=0x1505 works like an ILI9320 +R61505V 240x320 ID=0xB505 +R61505W 240x320 ID=0xC505 +R61509V 240x400 ID=0xB509 #define SUPPORT_B509_7793 +R61520 240x320 ID=0x1520 (no Vertical Scroll) +R61526A 240x320 ID=0x1526 (no Vertical Scroll) configure NVM with sketch +R61580 240x320 ID=0x1580 #define SUPPORT_1580 *** Untested *** +R61581 320x480 ID=0x1581 +RM68090 240x320 ID=0x6809 +RM68130 176x220 ID=0x6813 #define SUPPORT_9225 +RM68140 320x480 ID=0x6814 #define SUPPORT_68140 +S6D0139 240x320 ID=0x0139 #define SUPPORT_0139 (no Band Scroll) +S6D0154 240x320 ID=0x0154 #define SUPPORT_0154 +SPFD5408 240x320 ID=0x5408 +SPFD5420 240x400 ID=0x5420 #define SUPPORT_9326_5420 +SSD1963 800x480 ID=0x1963 +SSD1289 240x320 ID=0x1289 #define SUPPORT_1289 +SSD1297 240x320 ID=0x9797 #define SUPPORT_1289 (unstable readGRAM()) +ST7735 128x160 ID=0x7735 #define SUPPORT_7735 (untested) +ST7781 240x320 ID=0x7783 #define SUPPORT_7781 (no Vertical Scroll) +ST7789V 240x320 ID=0x7789 +ST7793 240x400 ID=0x7793 #define SUPPORT_B509_7793 +ST7796 320x480 ID=0x7796 +UC8230 240x320 ID=0x8230 #define SUPPORT_8230 +UNKNOWN 320x480 ID=0x1511 (scroll directions not correct) +UNKNOWN 240x320 ID=0x1602 readGRAM() does not work +UNKNOWN 240x320 ID=0xAC11 +UNKNOWN 240x320 ID=0x2053 weird controller from BangGood (was ID=0x0000) +UNKNOWN 240x320 ID=0x8031 (no Vertical Scroll) +UNKNOWN 240x320 ID=0x0001 (0x9320 style) + +Most of these controllers are #define SUPPORT_xxxx by default. +You can save Flash memory on a Uno by commenting out the macro(s) in MCUFRIEND_kbv.cpp + +11. It should run on a UNO, MEGA2560, LEONARDO, DUE, ZERO, M0-PRO, +It also runs on NUCLEO-F103 and TEENSY3.2 with Sparkfun Adapter + +12. These Mcufriend-style shields tend to have a resistive TouchScreen on A1, 7, A2, 6 but are not always the same rotation of direction. + The TouchScreen_Calibr_native.ino sketch wiil diagnose Touch Pins, do Calibration, report to Serial Terminal. + The Calibration should work with the TouchScreen.h library from Adafruit. + You can always copy the local TouchScreen_kbv.h library from sketch to the global user libraries folder. + +13. The graphictest_kbv.ino sketch runs the standard Adafruit tests and reports the execution time. + The Scroll tests show each screen rotation, colours, scroll directions, colour inversion. + Vertical scroll is up/down in Portrait modes. Left/right in Landscape + Band Scroll should just move the coloured Band. ILI9320 style will always move the whole screen. + The text "SOFTWARE SCROLL" should move horizontally across the screen or report a readPixel() ERROR. + +14. The scroll_kbv.ino sketch should scroll a window or subwindow for most chips. Not all chips can scroll. + +15. The readpixel_kbv.ino sketch should display memory in each aspect. + +16. The GLUE_Demo_320x240.ino sketch uses a "GLUE" class to display a UTFT sketch on supported mcufriend shields. + It is NOT perfect. Please report any problems. It is designed as a CONVENIENCE for legacy UTFT code. + Please use MCUFRIEND_kbv method()s in new code. + +17. If you do not have a standard Uno Shield, you can add a SPECIAL to the mcufriend_special.h + Edit mcufriend_shield.h: #define USE_SPECIAL + Edit mcufriend_special.h: e.g. #define USE_MEGA_16BIT_SHIELD + If your "special" is write-only, the library can not read the ID. It always returns 0xD3D3 + +18. Please run LCD_ID_readreg.ino to verify your non-standard wiring. Paste the defines to a Forum message. + +19. OPEN-SMART Shields have different wiring to regular Uno Shields: + Edit utility/mcufriend_shield.h: #define USE_SPECIAL + Edit utility/mcufriend_special.h: #define USE_OPENSMART_SHIELD_PINOUT + Edit MCUFRIEND_kbv.cpp: #define SUPPORT_8352B + +20. OPEN-SMART Shields can not read LM75A on a Mega because there are no SDA/SCL pins next on AREF header. + Uno: LM75A on pcb works. Difficult to add external I2C devices when Shield is plugged in. + Uno: All use of SPI bus should use SPI.beginTransaction(), SPI.endTransaction() + Leo: I do not support USE_OPENSMART_SHIELD_PINOUT_LEO + Mega: Old boards do not have SDA/SCL on AREF header. Only external I2C devices on COMMS header + Due: MAX809 Reset chip interferes with 3.3V RST on SPI header. Manual reset for Upload / Run. + +21. BLUEPILL Adapter standard wiring is: + //LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| |SD_SS|SD_DI|SD_DO|SD_SCK| + //STM32 pin |PA7|PA6|PA5|PA4|PA3|PA2|PA1|PA0| |PB0|PB6|PB7|PB8|PB9| |PA15 |PB5 |PB4 |PB3 | **ALT-SPI1** + + Maple core: to use SPI2 for SPI. edit SPI.cpp for SPIClass SPI(2); + STM Core: to use SPI2 for SPI. edit variant.h to use PA15, PB3, PB4, PB5 for SPI_SS etc + + Touchscreen needs XM, YP to be on Analog capable pins. Measure resistance with DMM to determine X, Y + 300R pair is XP, XM. 500R pair is YP, YM. choose XM, YP from PA7, PA6. XP, YM from PB6, PB7 + Run the Calibration sketch to get accurate TS_LEFT, TS_RT, TS_TOP, TS_BOT values. + Ignore the XP, XM, ... values. They mean nothing on a BluePill + + Adafruit_Touchscreen might need: typedef volatile uint32_t RwReg; + + Maple core: use Touchscreen_kbv library + STM Core: regular Touchscreen libraries should be ok. + +CHANGE HISTORY: is now in "mcufriend_history.txt" diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ILI9341_regValues.txt b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ILI9341_regValues.txt new file mode 100644 index 0000000..4ad1bb0 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ILI9341_regValues.txt @@ -0,0 +1,307 @@ + case 0x9341: + _lcd_capable = AUTO_READINC | TWO_PARM_WINDOW | MV_AXIS; + static const uint8_t ILI9341_regValues_kbv[] PROGMEM = { //.kbv MCUFRIEND_kbv + 0x01, 0, // software reset + TFTLCD_DELAY, 150, // 5ms if awake, 125ms if asleep. + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xCF, 3, 0x00, 0xC1, 0x30, //Power Control B [00 81 30] + 0xE8, 3, 0x85, 0x00, 0x78, //Driver Timing A [04 11 7A] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xC0, 1, 0x23, //Power Control 1 [26] + 0xC1, 1, 0x10, //Power Control 2 [00] + 0xC5, 2, 0x3E, 0x28, //VCOM 1 [31 3C] + 0xC7, 1, 0x86, //VCOM 2 [C0] + 0x36, 1, 0x48, //Memory Access [00] + 0xB1, 2, 0x00, 0x18, //Frame Control [00 1B] + 0xB6, 3, 0x08, 0x82, 0x27, //Display Function [0A 82 27 XX] + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x31, 0x2b, 0x0c, 0x0e, 0x08, 0x4e, 0xf1, 0x37, 0x07, 0x10, 0x03, 0x0e, 0x09, 0x00, + 0xE1, 15, 0x00, 0x0e, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0f, 0x0c, 0x31, 0x36, 0x0f, + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; + static const uint8_t ILI9341_regValues_2_6[] PROGMEM = { // LG 2.6" from AN + 0x01, 0, // software reset + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xCF, 3, 0x00, 0xC1, 0x30, //Power Control B [00 81 30] + 0xE8, 3, 0x85, 0x00, 0x78, //Driver Timing A [04 11 7A] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xC0, 1, 0x23, //Power Control 1 [26] + 0xC1, 1, 0x10, //Power Control 2 [00] + 0xC5, 2, 0x2B, 0x2B, //VCOM 1 [31 3C] + 0xC7, 1, 0xC0, //VCOM 2 [C0] + 0x36, 1, 0x48, //Memory Access [00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] +// 0xB6, 3, 0x0A, 0x02, 0x27, //Display Function [0A 82 27 XX] .kbv REV=0 + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x31, 0x2b, 0x0c, 0x0e, 0x08, 0x4e, 0xf1, 0x37, 0x07, 0x10, 0x03, 0x0e, 0x09, 0x00, + 0xE1, 15, 0x00, 0x0e, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0f, 0x0c, 0x31, 0x36, 0x0f, + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; + static const uint8_t ILI9341_regValues_2_0[] PROGMEM = { // BOE 2.0" + 0x01, 0, // software reset + 0xCF, 3, 0x00, 0x99, 0x30, //Power Control B [00 81 30] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xE8, 3, 0x85, 0x10, 0x78, //Driver Timing A [04 11 7A] + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xC0, 1, 0x26, //Power Control 1 [26] + 0xC1, 1, 0x12, //Power Control 2 [00] + 0xC5, 2, 0x2B, 0x2C, //VCOM 1 [31 3C] + 0xC7, 1, 0xC4, //VCOM 2 [C0] + 0x36, 1, 0x08, //Memory Access [00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] +// 0xB6, 3, 0x0A, 0xA2, 0x27, //?? Display Function [0A 82 27 XX] .kbv SS=1 + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x24, 0x21, 0x0a, 0x0e, 0x09, 0x51, 0xa9, 0x44, 0x07, 0x10, 0x03, 0x2c, 0x0b, 0x00, + 0xE1, 15, 0x00, 0x1b, 0x1e, 0x05, 0x11, 0x06, 0x2e, 0x56, 0x3b, 0x08, 0x0f, 0x0c, 0x13, 0x14, 0x0f, + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; + static const uint8_t ILI9341_regValues_2_4[] PROGMEM = { // BOE 2.4" + 0x01, 0, // software reset + TFTLCD_DELAY, 50, // .kbv + 0xCF, 3, 0x00, 0x81, 0x30, //Power Control B [00 81 30] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xE8, 3, 0x85, 0x10, 0x78, //Driver Timing A [04 11 7A] + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] +// 0xB6, 2, 0x0A, 0xA2, 0x27, //Display Function [0A 82 27 XX] .kbv SS=1 + 0xC0, 1, 0x21, //Power Control 1 [26] + 0xC1, 1, 0x11, //Power Control 2 [00] + 0xC5, 2, 0x3F, 0x3C, //VCOM 1 [31 3C] + 0xC7, 1, 0xB5, //VCOM 2 [C0] + 0x36, 1, 0x48, //Memory Access [00] + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x26, 0x24, 0x0b, 0x0e, 0x09, 0x54, 0xa8, 0x46, 0x0c, 0x17, 0x09, 0x0f, 0x07, 0x00, + 0xE1, 15, 0x00, 0x19, 0x1b, 0x04, 0x10, 0x07, 0x2a, 0x47, 0x39, 0x03, 0x06, 0x06, 0x30, 0x38, 0x0f, + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; + static const uint8_t ILI9341_regValues_ada[] PROGMEM = { // Adafruit_TFTLCD only works with EXTC=0 + 0x01, 0, // software reset + TFTLCD_DELAY, 50, + 0x28, 0, //Display Off + 0xC0, 1, 0x23, //Power Control 1 [26] + 0xC1, 1, 0x10, //Power Control 2 [00] + 0xC5, 2, 0x2B, 0x2B, //VCOM 1 [31 3C] + 0xC7, 1, 0xC0, //VCOM 2 [C0] + 0x36, 1, 0x88, //Memory Access [00] + 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B] + 0xB7, 1, 0x07, //Entry Mode [00] + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; + static const uint8_t ILI9341_regValues_ada9341[] PROGMEM = { // Adafruit_ILI9341 + 0xEF, 3, 0x03, 0x80, 0x02, // + 0xCF, 3, 0x00, 0xC1, 0x30, //Power Control B [00 81 30] + 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01] + 0xE8, 3, 0x85, 0x00, 0x78, //Driver Timing A [04 11 7A] + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02] + 0xF7, 1, 0x20, //Pump Ratio [10] + 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00] + 0xC0, 1, 0x23, //Power Control 1 [26] + 0xC1, 1, 0x11, //Power Control 2 [00] + 0xC5, 2, 0x3E, 0x28, //VCOM 1 [31 3C] + 0xC7, 1, 0x86, //VCOM 2 [C0] + 0x36, 1, 0x48, //Memory Access [00] + 0xB1, 2, 0x00, 0x18, //Frame Control [00 1B] + 0xB6, 3, 0x0A, 0x82, 0x27, //?? Display Function [0A 82 27 XX] + 0xF2, 1, 0x00, //Enable 3G [02] + 0x26, 1, 0x01, //Gamma Set [01] + 0xE0, 15, 0x0f, 0x31, 0x2b, 0x0c, 0x0e, 0x08, 0x4e, 0xf1, 0x37, 0x07, 0x10, 0x03, 0x0e, 0x09, 0x00, + 0xE1, 15, 0x00, 0x0e, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0f, 0x0c, 0x31, 0x36, 0x0f, + + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + 0x3A, 1, 0x55, //Pixel Format [66] + }; +// init_table(ILI9341_regValues_kbv, sizeof(ILI9341_regValues_kbv)); //ok for me +// init_table(ILI9341_regValues_2_0, sizeof(ILI9341_regValues_2_0)); //wrong direction + init_table(ILI9341_regValues_2_4, sizeof(ILI9341_regValues_2_4)); //wrong direction +// init_table(ILI9341_regValues_2_6, sizeof(ILI9341_regValues_2_6)); //inverted +// init_table(ILI9341_regValues_ada, sizeof(ILI9341_regValues_ada)); //white screen +// init_table(ILI9341_regValues_ada9341, sizeof(ILI9341_regValues_ada9341)); //ok for me + break; + + case 0x9486: + _lcd_capable = AUTO_READINC | TWO_PARM_WINDOW | MV_AXIS; + static const uint8_t ILI9486_regValues[] PROGMEM = { + 0x01, 0, //Soft Reset + 0x28, 0, //Display Off + 0xC0, 2, 0x0d, 0x0d, //Power Control 1 [0x0E0E] + 0xC1, 2, 0x43, 0x00, //Power Control 2 [0x4300] + 0xC2, 1, 0x00, //Power Control 3 + 0xC5, 4, 0x00, 0x48, 0x00, 0x48, //VCOM Control 1 [0x00400040] + 0xB6, 3, 0x00, 0x22, 0x3B, // Display Function Control .kbv SS=1 + // 0xE0,15, 0x0f,0x31,0x2b,0x0c,0x0e,0x08,0x4e,0xf1,0x37,0x07,0x10,0x03,0x0e,0x09,0x00, + // 0xE1,15, 0x00,0x0e,0x14,0x03,0x11,0x07,0x31,0xC1,0x48,0x08,0x0f,0x0c,0x31,0x36,0x0f, + 0x20, 0, // Display Inversion OFF + 0x36, 1, 0x0A, //Memory Access + 0x3A, 1, 0x55, //Interlace Pixel +// 0x21, 0, //Invert display !!! + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 50, + 0x29, 0, //Display On + }; + init_table(ILI9486_regValues, sizeof(ILI9486_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + + case 0x9488: + _lcd_capable = AUTO_READINC | TWO_PARM_WINDOW | MV_AXIS; + static const uint8_t ILI9488_regValues[] PROGMEM = { + 0x01, 0, //Soft Reset + 0x28, 0, //Display Off + 0xC0, 2, 0x0E, 0x0E, //Power Control 1 [0E 0E] + 0xC1, 1, 0x43, //Power Control 2 [43] + 0xC5, 4, 0x00, 0x22, 0x80, 0x40, //VCOM Control 1 [00 40 00 40] + 0x36, 1, 0x08, //Memory Access [00] + 0x3A, 1, 0x55, //Interlace Pixel [XX] + 0xB1, 2, 0xB0, 0x11, //Frame Rate Control [B0 11] + 0xB6, 3, 0x02, 0x02, 0x3B, //Display Function [02 02 3B] .kbv SS=0 + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + // 0x2C, 0, + }; + static const uint8_t ILI9488_regValues_max[] PROGMEM = { // Atmel MaxTouch + 0x01, 0, //Soft Reset + TFTLCD_DELAY, 50, + 0x28, 0, //Display Off + 0xC0, 2, 0x10, 0x10, //Power Control 1 [0E 0E] + 0xC1, 1, 0x41, //Power Control 2 [43] + 0xC5, 4, 0x00, 0x22, 0x80, 0x40, //VCOM Control 1 [00 40 00 40] + 0x36, 1, 0x68, //Memory Access [00] + 0xB0, 1, 0x00, //Interface [00] + 0xB1, 2, 0xB0, 0x11, //Frame Rate Control [B0 11] + 0xB4, 1, 0x02, //Inversion Control [02] + 0xB7, 1, 0xC6, //Entry Mode [06] + 0x3A, 1, 0x55, //Interlace Pixel Format [XX] + 0xF7, 4, 0xA9, 0x51, 0x2C, 0x82, //Adjustment Control 3 [A9 51 2C 82] + 0x11, 0, //Sleep Out + TFTLCD_DELAY, 150, + 0x29, 0, //Display On + }; +// init_table(ILI9488_regValues, sizeof(ILI9488_regValues)); + init_table(ILI9488_regValues_max, sizeof(ILI9488_regValues_max)); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; +// ################################################################################### + case 0x7789: + case 0x8552: + _lcd_capable = AUTO_READINC | TWO_PARM_WINDOW | MV_AXIS; + static const uint8_t ST7789_regValues[] PROGMEM = { + (0x0011); //exit SLEEP mode + TFTLCD_DELAY, 10, + (0x0036), 1, 0x80, //MADCTL: memory data access control + (0x003A), 1, 0x66, //COLMOD: Interface Pixel format *** I use 262K-colors in 18bit/pixel format when using 8-bit interface to allow 3-bytes per pixel +// (0x003A), 1, 0x0055, //COLMOD: Interface Pixel format *** I use 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel + (0x00B2), 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, //PORCTRK: Porch setting + (0x00B7), 1, 0x35, //GCTRL: Gate Control + (0x00BB), 1, 0x2B, //VCOMS: VCOM setting + (0x00C0), 1, 0x2C, //LCMCTRL: LCM Control + (0x00C2), 2, 0x01, 0xFF, //VDVVRHEN: VDV and VRH Command Enable + (0x00C3), 1, 0x11, //VRHS: VRH Set + (0x00C4), 1, 0x20, //VDVS: VDV Set + (0x00C6), 1, 0x0F, //FRCTRL2: Frame Rate control in normal mode + (0x00D0), 2, 0xA4, 0xA1, //PWCTRL1: Power Control 1 + (0x00E0), 14, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19, //PVGAMCTRL: Positive Voltage Gamma control + (0x00E1), 14, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19, //NVGAMCTRL: Negative Voltage Gamma control + (0x002A), 4, 0x00, 0x00, 0x00, 0xEF, //X address set + (0x002B), 4, 0x00, 0x00, 0x01, 0x3F, //Y address set + TFTLCD_DELAY, 10, + }; + init_table(ST7789_regValues, sizeof(ST7789_regValues)); // + break; + +// #################################################################################### + static const uint16_t ILI9225_regValues[] PROGMEM = { + /* Start Initial Sequence */ + /* Set SS bit and direction output from S528 to S1 */ + ILI9225_POWER_CTRL1, 0x0000, // Set SAP,DSTB,STB + ILI9225_POWER_CTRL2, 0x0000, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x0000, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x0000, // Set GVDD + ILI9225_POWER_CTRL5, 0x0000, // Set VCOMH/VCOML voltage + TFTLCD_DELAY, 40, + + // Power-on sequence + ILI9225_POWER_CTRL2, 0x0018, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x6121, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x006F, // Set GVDD /*007F 0088 */ + ILI9225_POWER_CTRL5, 0x495F, // Set VCOMH/VCOML voltage + ILI9225_POWER_CTRL1, 0x0800, // Set SAP,DSTB,STB + TFTLCD_DELAY, 10, + ILI9225_POWER_CTRL2, 0x103B, // Set APON,PON,AON,VCI1EN,VC + TFTLCD_DELAY, 50, + + ILI9225_DRIVER_OUTPUT_CTRL, 0x011C, // set the display line number and display direction + ILI9225_LCD_AC_DRIVING_CTRL, 0x0100, // set 1 line inversion + ILI9225_ENTRY_MODE, 0x1030, // set GRAM write direction and BGR=1. + ILI9225_DISP_CTRL1, 0x0000, // Display off + ILI9225_BLANK_PERIOD_CTRL1, 0x0808, // set the back porch and front porch + ILI9225_FRAME_CYCLE_CTRL, 0x1100, // set the clocks number per line + ILI9225_INTERFACE_CTRL, 0x0000, // CPU interface + ILI9225_OSC_CTRL, 0x0D01, // Set Osc /*0e01*/ + ILI9225_VCI_RECYCLING, 0x0020, // Set VCI recycling + ILI9225_RAM_ADDR_SET1, 0x0000, // RAM Address + ILI9225_RAM_ADDR_SET2, 0x0000, // RAM Address + + /* Set GRAM area */ + ILI9225_GATE_SCAN_CTRL, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB, + ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000, + ILI9225_PARTIAL_DRIVING_POS1, 0x00DB, + ILI9225_PARTIAL_DRIVING_POS2, 0x0000, + ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF, + ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000, + ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB, + ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000, + + /* Set GAMMA curve */ + ILI9225_GAMMA_CTRL1, 0x0000, + ILI9225_GAMMA_CTRL2, 0x0808, + ILI9225_GAMMA_CTRL3, 0x080A, + ILI9225_GAMMA_CTRL4, 0x000A, + ILI9225_GAMMA_CTRL5, 0x0A08, + ILI9225_GAMMA_CTRL6, 0x0808, + ILI9225_GAMMA_CTRL7, 0x0000, + ILI9225_GAMMA_CTRL8, 0x0A00, + ILI9225_GAMMA_CTRL9, 0x0710, + ILI9225_GAMMA_CTRL10, 0x0710, + + ILI9225_DISP_CTRL1, 0x0012, + TFTLCD_DELAY, 50, + ILI9225_DISP_CTRL1, 0x1017, +}; diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_ilitek.sed b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_ilitek.sed new file mode 100644 index 0000000..a9260bf --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_ilitek.sed @@ -0,0 +1,54 @@ +#n does not work. use nsed -n + +###################################################################### +# nsed -f pagebreak.sed file.txt | nsed -n -f appnote_ilitek.sed + +# parse Ilitek App Note sequence. e.g. +# LCD_ILI9486_CMD(0XF2); +# LCD_ILI9486_INDEX(0x18); +# Delayms(1); // Delay 1ms + +:Ilitek +# //Title line +s/^[1-9].*/\/\/ &/ +# //comment to /* comment */ +s/[/][/]\(.*\)/\/\*\1\*\/ / +s/_CMD_INDEX/_CMD/ +s/_CMD_PAs/_INDEX/ +s/_ Parameter (/_INDEX(/ +/LCD_ILI9..._CMD(/b good +/Delayms(/b good +b print +{ +:good + h + :args + n + s/[/][/]\(.*\)/\/\*\1\*\/ / + s/_CMD_INDEX/_CMD/ + s/_CMD_PAs/_INDEX/ + s/_ Parameter (/_INDEX(/ + # append any data to Hold space + /LCD_ILI9..._INDEX(/{ + H + b args + } + /^$/b args + x + # parse command byte to (0xNN), + s/LCD_ILI9..._CMD(\([^)]+\)/ (\1)/ + # parse data byte to 0xNN, + s/\nLCD_ILI9..._INDEX(//g + # parse delay times + s/Delayms(\(.+\));/ TFTLCD_DELAY8, \1, / + s/)\;/,/g + s/0X/0x/g + s/,;/,/ + p + x + b Ilitek +} +:print +p + +:end \ No newline at end of file diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_novatek.sed b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_novatek.sed new file mode 100644 index 0000000..ab46823 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_novatek.sed @@ -0,0 +1,55 @@ +#n does not work. use nsed -n + +###################################################################### +# nsed -f appnote_novatek.sed inputfile +# produce output in: init_sequence.out +# still requires removing some garbage. +# adding array declaration, inserting argument count on each line. + +# parse Novatek App Note sequence. e.g. +# Lcd_Write_Com(0XF2); +# Lcd_Write_Data(0x18); +# delay(100); + +:Novatek +# trim any leading, trailing whitespace. Line scope comments +s/^[\t ]*// +s/[\t ]*$// +s/[\t ]*[/][/]\(.*\)/ \/\*\1\*\/ / +# block start +/Lcd_Write_Com(/b good +/delay(/b good +b print +{ +:good + h + :args + n + s/^[\t ]*// + s/[\t ]*$// + s/[\t ]*[/][/]\(.*\)/ \/\*\1\*\/ / + # append any data to Hold space + /Lcd_Write_Data(/{ + H + b args + } + /^$/b args + x + # trim ( 0xNN ) to (0xNN) + s/( */(/g + s/ *)/)/g + # parse command byte to (0xNN), + s/Lcd_Write_Com(\([^)]+\)/ (\1)/ + # parse data byte to 0xNN, + s/\nLcd_Write_Data(//g + # parse delay times + s/delay(\(.+\));/ TFTLCD_DELAY8, \1, / + s/) *\;/,/g + s/0X/0x/g + s/,;/,/ + winit_sequence.out + x + b Novatek +} +:print +:end diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_renesas.sed b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_renesas.sed new file mode 100644 index 0000000..dda50e0 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/appnote_renesas.sed @@ -0,0 +1,47 @@ +#n does not work. use nsed -n + +###################################################################### +# parse Renesas App Note sequence. e.g. +# {setc, [107], W, 0x000B0} +# {setc, 0x000D0} +# {setp, 0x00033} +# {time, 0040,ms} + +:Renesas +# //Title line +s/^[1-9].*/\/\/ &/ +# //comment to /* comment */ +s/[/][/]\(.*\)/\/\*\1\*\/ / +/{setc,/b good +/{time,/b good +b print +{ +:good + h + :args + n + s/[/][/]\(.*\)/\/\*\1\*\/ / + # append any data to Hold space + /setp/{ + H + b args + } +# /^$/b args + x + # verbose format + s/, \[[0-9]+\], W, 0x/, 0x/g + # parse command byte to (0xNN), + s/{setc, 0x000\(..\)}/ (0x\1), / + # parse data byte to 0xNN, + # s/\nLCD_ILI9486_INDEX(//g + s/\n{setp, 0x000\(..\)}/0x\1, /g + s/\n{setp, 0x00\(...\)}/0x\1, /g + # parse delay times + s/{time, 0*\(.*\),ms}/ TFTLCD_DELAY8, \1, / + s/)\;/,/g + p + x + b Renesas +} +:print +p diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9341_init.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9341_init.h new file mode 100644 index 0000000..70786e7 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9341_init.h @@ -0,0 +1,138 @@ +/* 1.2 LG 2.6” Initial Code*/ +void ILI9341_LG2.6_Initial(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(120); /* Delay 120 ms*/ +/************** Start Initial Sequence **********//*/ + (0xCB),0x39,0x2C,0x00,0x34,0x02, + (0xCF),0x00,0xC1,0x30, + (0xE8),0x85,0x00,0x78, + (0xEA),0x00,0x00, + (0xED),0x64,0x03,0x12,0x81) + (0xF7),0x20, + (0xC0), /*Power control*/ 0x23, /*VRH[5:0]*/ + (0xC1), /*Power control*/ 0x10, /*SAP[2:0];BT[3:0]*/ + (0xC5), /*VCM control*/ 0x2B,0x2B, +/* (0xC7), /*VCM control2*/ */ +/*LCD_ILI9341_INDEX(0xC0,*/ + (0x36), /* Memory Access Control*/ 0x48, + (0xB1),0x00,0x1B, + (0xB6), /* Display Function Control*/ 0x0A,0x02, + (0xF2), /* 3Gamma Function Disable*/ 0x00, + (0x26), /*Gamma curve selected*/ 0x01, + (0xE0), /*Set Gamma*/ 0x0F,0x31,0x2B,0x0C,0x0E,0x08,0x4E,0xF1,0x37,0x07,0x10,0x03,0x0E,0x09,0x00, + (0xE1), /*Set Gamma*/ 0x00,0x0E,0x14,0x03,0x11,0x07,0x31,0xC1,0x48,0x08,0x0F,0x0C,0x31,0x36,0x0F, + (0x11), /*Exit Sleep*/ + TFTLCD_DELAY8, 120, + (0x29), /*Display on*/ +} + + +/* 2.2 BOE 2.0” Initial Code*/ +void ILI9341_BOE2.0_Initial(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(120); /* Delay 120 ms*/ +/************** Start Initial Sequence **********//*/ + (0xCF),0x00,0x99,0x30, + (0xED),0x64,0x03,0x12,0x81, + (0xE8),0x85,0x10,0x78, + (0xCB),0x39,0x2C,0x00,0x34,0x02, + (0xF7),0x20, + (0xEA),0x00,0x00, + (0xC0), /*Power control*/ 0x26, /*VRH[5:0]*/ + (0xC1), /*Power control*/ 0x12, /*SAP[2:0];BT[3:0]*/ + (0xC5), /*VCM control*/ 0x2B,0x2C, + (0xC7), /*VCM control2*/ 0xC4, + (0x36), /* Memory Access Control*/ 0x08, + (0xB1),0x00,0x1B, + (0xB6), /* Display Function Control*/ 0x0A,0xA2, + (0xF2), /* 3Gamma Function Disable*/ 0x00, + (0x26), /*Gamma curve selected*/ 0x01, + (0xE0), /*Set Gamma*/ 0x0F,0x24,0x21,0x0A,0x0E,0x09,0x51,0xA9,0x44,0x07,0x10,0x03,0x2C,0x0B,0x00, + (0xE1), /*Set Gamma*/ 0x00,0x1B,0x1E,0x05,0x11,0x06,0x2E,0x56,0x3B,0x08,0x0F,0x0C,0x13,0x14,0x0F, + (0x11), /*Exit Sleep*/ + TFTLCD_DELAY8, 120, + (0x29), /*Display on*/ +} + +/* 2.3 BOE 2.4” Initial Code*/ +void ILI9341_BOE2.4_Initial(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(120); /* Delay 120 ms*/ +/************** Start Initial Sequence **********//*/ + (0xCF),0x00,0x81,0x30, + (0xED),0x64,0x03,0x12,0x81, + (0xE8),0x85,0x10,0x78, + (0xCB),0x39,0x2C,0x00,0x34,0x02, + (0xF7),0x20, + (0xEA),0x00,0x00, + (0xB1),0x00,0x1B, + (0xB6), /* Display Function Control*/ 0x0A,0xA2, + (0xC0), /*Power control*/ 0x21, /*VRH[5:0]*/ + (0xC1), /*Power control*/ 0x11, /*SAP[2:0];BT[3:0]*/ + (0xC5), /*VCM control*/ 0x3F,0x3C, + (0xC7), /*VCM control2*/ 0xb5, + (0x36), /* Memory Access Control*/ 0x48, + (0xF2), /* 3Gamma Function Disable*/ 0x00, + (0x26), /*Gamma curve selected*/ 0x01, + (0xE0), /*Set Gamma*/ 0x0F,0x26,0x24,0x0B,0x0E,0x09,0x54,0xA8,0x46,0x0C,0x17,0x09,0x0F,0x07,0x00, + (0xE1), /*Set Gamma*/ 0x00,0x19,0x1B,0x04,0x10,0x07,0x2A,0x47,0x39,0x03,0x06,0x06,0x30,0x38,0x0F, + (0x11), /*Exit Sleep*/ + TFTLCD_DELAY8, 120, + (0x29), /*Display on*/ +} + +/* 3.2 Tianma 2.4” Initial Code*/ +void ILI9341_Tianma2.4_Initial(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(120); /* Delay 120 ms*/ +/************** Start Initial Sequence **********//*/ + (0xCF),0x00,0x81,0x30, + (0xED),0x64,0x03,0x12,0x81, + (0xE8),0x85,0x10,0x7A, + (0xCB),0x39,0x2C,0x00,0x34,0x02, + (0xF7),0x20, + (0xEA),0x00,0x00, + (0xC0), /*Power control*/ 0x21, /*VRH[5:0]*/ + (0xC1), /*Power control*/ 0x11, /*SAP[2:0];BT[3:0]*/ + (0xC5), /*VCM control*/ 0x3F,0x3C, + (0xC7), /*VCM control2*/ 0xa7, + (0x36), /* Memory Access Control*/ 0x48, + (0xB1),0x00,0x1B, + (0xB6), /* Display Function Control*/ 0x0A,0xA2, + (0xF2), /* 3Gamma Function Disable*/ 0x00, + (0x26), /*Gamma curve selected*/ 0x01, + (0xE0), /*Set Gamma*/ 0x0F,0x23,0x1F,0x0B,0x0E,0x08,0x4B,0xA8,0x3B,0x0A,0x14,0x06,0x10,0x09,0x00, + (0xE1), /*Set Gamma*/ 0x00,0x1C,0x20,0x04,0x10,0x08,0x34,0x47,0x44,0x05,0x0B,0x09,0x2F,0x36,0x0F, + (0x11), /*Exit Sleep*/ + TFTLCD_DELAY8, 120, + (0x29), /*Display on*/ +} + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9481_init.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9481_init.h new file mode 100644 index 0000000..038929e --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9481_init.h @@ -0,0 +1,114 @@ +/* 1.2 CPT 2.9 Inch Initial Code*/ +Void ILI9481_CPT_Initial_Code(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(100); /* Delay 100 ms*/ +/************** Start Initial Sequence **********//*/ + (0x11), + TFTLCD_DELAY8, 20, + (0xD0),0x07,0x42,0x1C, + (0xD1),0x,0x02,0x0F, + (0xD2),0x01,0x11, + (0xC0),0x10,0x35,0x,0x02,0x11, + (0xC5), + +LCD_ILI9481_INDEX(0x03); + (0xC8),0x,0x30,0x36,0x45,0x04,0x16,0x37,0x75,0x77,0x54,0x0F,0x, + (0xE4),0xA0, + (0xF0),0x01, + (0xF3),0x02,0x1A) +; + (0x36),0x0A, + (0x2A),0x,0x,0x01,0x3F, + (0x2B),0x,0x,0x01,0xAD, + TFTLCD_DELAY8, 120, + + (0x29), +} + +/* 2.2 PVI 3.5 Inch Initial Code*/ +Void ILI9481_CPT_Initial_Code(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(100); /* Delay 100 ms*/ +/************** Start Initial Sequence **********//*/ + (0x11), + TFTLCD_DELAY8, 20, + (0xD0),0x07,0x41,0x1D, + (0xD1),0x,0x2B,0x1F, + (0xD2),0x01,0x11, + (0xC0),0x,0x3B,0x,0x02,0x11, + + (0xC5),0x03, + (0xC8),0x,0x14,0x33,0x10,0x,0x16,0x44,0x36,0x77,0x,0x0f,0x, + (0xE4),0xA0, + (0xF0),0x01, + (0xF3),0x40,0x0A, + (0x36),0x0A, + TFTLCD_DELAY8, 120, + (0x29), + +/* 3.2. AUO 3.17 Inch Initial Code*/ +Void ILI9481_AUO_Initial_Code(void) +{ +/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; +delayms(1); /* Delay 1ms*/ +LCD_nRESET = 0; +delayms(10); /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; +delayms(100); /* Delay 100 ms*/ +/************** Start Initial Sequence **********//*/ + (0x11), + TFTLCD_DELAY8, 20, + (0xD0),0x07,0x40,0x1D, + (0xD1),0x,0x18,0x13, + (0xD2),0x01,0x11, + (0xC0),0x10,0x3B,0x,0x02,0x11, + + (0xC5),0x03, + (0xC8),0x,0x44,0x06,0x44,0x0A,0x08,0x17,0x33,0x77,0x44,0x08,0x0c, + (0xE4),0xA0, + (0xF0),0x01, + (0x36),0x0A, + TFTLCD_DELAY8, 120, + (0x29), + +/* 4.2. CMO 3.5 Inch Initial Code*/ + (0x01), +DelayX1ms(120); + (0x11), +DelayX1ms(120); +/*Power Setting*/ + (0xD0),0x07,0x41,0x1D, +DelayX1ms(20); +/*Vcom Setting*/ + (0xD1),0x00,0x1C,/*18*/ 0x1F, +/*Power Setting for normal mode*/ + (0xD2),0x01,0x11, + (0xC0), /*Panel Driving Setting*/ 0x00,0x3B,0x00,0x02,0x11, + (0xC6),0x83, + + (0xC8),0x00,0x26,0x21,0x00,0x00,0x1F,0x65,0x23,0x77,0x00,0x0F,0x00, + (0xF0),0x01, +/* (0xE4),*/ +/*LCD_ILI9481_INDEX(0xA0,*/ + (0x36),0x48,/*0x08 _BGR,0x _RGB*/ +/*Set display on*/ + (0x29), + (0xB4),0x11, + (0x2C), + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9486_init.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9486_init.h new file mode 100644 index 0000000..0b402a7 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/ili9486_init.h @@ -0,0 +1,158 @@ +/* 1.2CPT 3.5 Inch Initial Code*/ +Void ILI9486_CPT_Initial_Code(void) +{/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 1, /* Delay 1ms*/ +LCD_nRESET = 0; + TFTLCD_DELAY8, 10, /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 120, /* Delay 120 ms*/ +/************** Start Initial Sequence **********/**/ */ + (0xF2),0x18,0xA3,0x12,0x02,0xB2,0x12,0xFF,0x10,0x00, + (0xF8),0x21,0x04, + (0xF9),0x00,0x08, + (0x36),0x08, + (0xB4),0x00, + (0xC1),0x41, + (0xC5),0x00,0x53, + (0xE0),0x0F,0x1B,0x18,0x0B,0x0E,0x09,0x47,0x94,0x35,0x0A,0x13,0x05,0x08,0x03,0x00, + (0xE1),0x0F,0x3A,0x37,0x0B,0x0C,0x05,0x4A,0x24,0x39,0x07,0x10,0x04,0x27,0x25,0x00, + (0x11), + TFTLCD_DELAY8, 120, + (0x29), +} +Void ILI9486_EnterSleep_Code(void) +{ + (0x28)) + TFTLCD_DELAY8, 10, + (0x10), /* Set_address_mode*/ + TFTLCD_DELAY8, 120, +} +Void ILI9486_ExitSleep_Code(void) +{ + (0x11), /* Set_address_mode*/ + TFTLCD_DELAY8, 120, + (0x29)) +} + +/* 2.2 HSD 3.5 Inch Initial Code*/ +Void ILI9486_HSD_Initial_Code(void) +{/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 1, /* Delay 1ms*/ +LCD_nRESET = 0; + TFTLCD_DELAY8, 10, /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 120, /* Delay 120 ms*/ +/************** Start Initial Sequence **********/**/ */ + (0xF2),0x18,0xA3,0x12,0x02,0xB2,0x12,0xFF,0x10,0x00, + (0xF8),0x21,0x04, + (0xF9),0x00,0x08, + (0x36),0x08, + (0xB4),0x00, + (0xB6),0x02,0x22, + (0xC1),0x41, + (0xC5),0x00,0x18, + (0xE0),0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00, + (0xE1),0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00, + (0x11), + TFTLCD_DELAY8, 120, + (0x29), +} +Void ILI9486_EnterSleep_Code(void) +{ + (0x28)) + TFTLCD_DELAY8, 10, + (0x10), + TFTLCD_DELAY8, 120, +} +Void ILI9486_ExitSleep_Code(void) +{ + (0x11), + TFTLCD_DELAY8, 120, + (0x29)) +} + +/* 3.2 TM 3.2 Inch Initial Code*/ +Void ILI9486_TM_Initial_Code(void) +{/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 1, /* Delay 1ms*/ +LCD_nRESET = 0; + TFTLCD_DELAY8, 10, /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 120, /* Delay 120 ms*/ +/************** Start Initial Sequence **********/**/ */ + (0xF2),0x18,0xA3,0x12,0x02,0xB2,0x12,0xFF,0x10,0x00, + (0xF8),0x21,0x04, + (0xF9),0x00,0x08, + (0x36),0x08, + (0xB4),0x00, + (0xB6),0x02,0x22, + (0xC1),0x41, + (0xC5),0x00,0x55, + (0xE0),0x0F,0x21,0x1C,0x0B,0x0E,0x08,0x49,0x98,0x38,0x09,0x11,0x03,0x14,0x10,0x00, + (0xE1),0x0F,0x2F,0x2B,0x0C,0x0E,0x06,0x47,0x76,0x37,0x07,0x11,0x04,0x23,0x1E,0x00, + (0x11), + TFTLCD_DELAY8, 120, + (0x29), +} +Void ILI9486_EnterSleep_Code(void) +{ + (0x28)) + TFTLCD_DELAY8, 10, + (0x10), + TFTLCD_DELAY8, 120, +} +Void ILI9486_ExitSleep_Code(void) +{ + (0x11), + TFTLCD_DELAY8, 120, + (0x29)) +} + + +/* 4.2 WTK 3.5 Inch Initial Code*/ +Void ILI9486_WTK_Initial_Code(void) +{/* VCI=2.8V*/ +/************** Reset LCD Driver ****************//*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 1, /* Delay 1ms*/ +LCD_nRESET = 0; + TFTLCD_DELAY8, 10, /* Delay 10ms // This delay time is necessary*/ +LCD_nRESET = 1; + TFTLCD_DELAY8, 120, /* Delay 120 ms*/ +/************** Start Initial Sequence **********/**/ */ + (0xF2),0x18,0xA3,0x12,0x02,0xB2,0x12,0xFF,0x10,0x00, + (0xF8),0x21,0x04, + (0xF9),0x00,0x08, + (0x21), + (0x36),0x08, + (0xB4),0x00, + (0xB6),0x02,0x22, + (0xC1),0x41, + (0xC5),0x00,0x53, + (0xE0),0x0F,0x10,0x08,0x05,0x09,0x05,0x37,0x98,0x26,0x07,0x0F,0x02,0x09,0x07,0x00, + (0xE1),0x0F,0x38,0x36,0x0D,0x10,0x08,0x59,0x76,0x48,0x0A,0x16,0x0A,0x37,0x2F,0x00, + (0x11), + TFTLCD_DELAY8, 120, + (0x29), +} +Void ILI9486_EnterSleep_Code(void) +{ + (0x28)) + TFTLCD_DELAY8, 10, + (0x10), + TFTLCD_DELAY8, 120, +} +Void ILI9486_ExitSleep_Code(void) +{ + (0x11), + TFTLCD_DELAY8, 120, + (0x29)) +} + + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_2.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_2.h new file mode 100644 index 0000000..ece28f3 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_2.h @@ -0,0 +1,1729 @@ + +// ################ edits for 5310 ########################## +ret = readReg32(0xD4); +if (ret == 0x5310) //NT35310: [xx 01 53 10] + return 0x5310; + + +case 0x5310: +_lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | INVERT_GS; +static const uint8_t NT35310_regValues[] PROGMEM = { // + 0xED, 2, 0x01, 0xFE, //CMD2UNLOCK +}; +table8_ads = NT35310_regValues, table_size = sizeof(NT35310_regValues); +p16 = (int16_t *) & HEIGHT; +*p16 = 480; +p16 = (int16_t *) & WIDTH; +*p16 = 320; +break; +{ + { + static const uint8_t NT35310_regValues[] PROGMEM = { // + (0xED), 2, 0x01, 0xFE, + (0xEE), 2, 0xDE, 0x21, + (0xF1), 1, 0x01, + (0xDF), 1, 0x10, + /*VCOMvoltage//*/ + (0xC4), 1, 0x8F, /*5f*/ + (0xC6), 4, 0x00, 0xE2, 0xE2, 0xE2, + (0xBF), 1, 0xAA, + (0xB0), 18, 0x0D, 0x00, 0x0D, 0x00, 0x11, 0x00, 0x19, 0x00, 0x21, 0x00, 0x2D, 0x00, 0x3D, 0x00, 0x5D, 0x00, 0x5D, 0x00, + (0xB1), 6, 0x80, 0x00, 0x8B, 0x00, 0x96, 0x00, + (0xB2), 6, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, + (0xB3), 24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + (0xB4), 6, 0x8B, 0x00, 0x96, 0x00, 0xA1, 0x00, + (0xB5), 6, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, + (0xB6), 2, 0x00, 0x00, + (0xB7), 22, 0x00, 0x00, 0x3F, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x8C, 0x00, 0xAC, 0x00, 0xDC, 0x00, 0x70, 0x00, 0x90, 0x00, 0xEB, 0x00, 0xDC, 0x00, + (0xB8), 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + (0xBA), 4, 0x24, 0x00, 0x00, 0x00, + (0xC1), 6, 0x20, 0x00, 0x54, 0x00, 0xFF, 0x00, + (0xC2), 4, 0x0A, 0x00, 0x04, 0x00, + (0xC3), 48, 0x3C, 0x00, 0x3A, 0x00, 0x39, 0x00, 0x37, 0x00, 0x3C, 0x00, 0x36, 0x00, 0x32, 0x00, 0x2F, 0x00, 0x2C, 0x00, 0x29, 0x00, 0x26, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, 0x3C, 0x00, 0x36, 0x00, 0x32, 0x00, 0x2F, 0x00, 0x2C, 0x00, 0x29, 0x00, 0x26, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, + (0xC4), 26, 0x62, 0x00, 0x05, 0x00, 0x84, 0x00, 0xF0, 0x00, 0x18, 0x00, 0xA4, 0x00, 0x18, 0x00, 0x50, 0x00, 0x0C, 0x00, 0x17, 0x00, 0x95, 0x00, 0xF3, 0x00, 0xE6, 0x00, + (0xC5), 10, 0x32, 0x00, 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x88, 0x00, + (0xC6), 6, 0x20, 0x00, 0x17, 0x00, 0x01, 0x00, + (0xC7), 4, 0x00, 0x00, 0x00, 0x00, + (0xC8), 4, 0x00, 0x00, 0x00, 0x00, + (0xC9), 16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + (0xE0), 36, 0x16, 0x00, 0x1C, 0x00, 0x21, 0x00, 0x36, 0x00, 0x46, 0x00, 0x52, 0x00, 0x64, 0x00, 0x7A, 0x00, 0x8B, 0x00, 0x99, 0x00, 0xA8, 0x00, 0xB9, 0x00, 0xC4, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xD9, 0x00, 0xE0, 0x00, 0xF3, 0x00, + (0xE1), 36, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x36, 0x00, 0x45, 0x00, 0x52, 0x00, 0x64, 0x00, 0x7A, 0x00, 0x8B, 0x00, 0x99, 0x00, 0xA8, 0x00, 0xB9, 0x00, 0xC4, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xF3, 0x00, + (0xE2), 36, 0x05, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x34, 0x00, 0x44, 0x00, 0x4F, 0x00, 0x61, 0x00, 0x79, 0x00, 0x88, 0x00, 0x97, 0x00, 0xA6, 0x00, 0xB7, 0x00, 0xC2, 0x00, 0xC7, 0x00, 0xD1, 0x00, 0xD6, 0x00, 0xDD, 0x00, 0xF3, 0x00, + (0xE3), 36, 0x05, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x33, 0x00, 0x44, 0x00, 0x50, 0x00, 0x62, 0x00, 0x78, 0x00, 0x88, 0x00, 0x97, 0x00, 0xA6, 0x00, 0xB7, 0x00, 0xC2, 0x00, 0xC7, 0x00, 0xD1, 0x00, 0xD5, 0x00, 0xDD, 0x00, 0xF3, 0x00, + (0xE4), 36, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x2A, 0x00, 0x3C, 0x00, 0x4B, 0x00, 0x5D, 0x00, 0x74, 0x00, 0x84, 0x00, 0x93, 0x00, 0xA2, 0x00, 0xB3, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCD, 0x00, 0xD3, 0x00, 0xDD, 0x00, 0xF3, 0x00, + (0xE5), 36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x3C, 0x00, 0x4B, 0x00, 0x5D, 0x00, 0x74, 0x00, 0x84, 0x00, 0x93, 0x00, 0xA2, 0x00, 0xB3, 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCD, 0x00, 0xD3, 0x00, 0xDC, 0x00, 0xF3, 0x00, + (0xE6), 32, 0x11, 0x00, 0x34, 0x00, 0x56, 0x00, 0x76, 0x00, 0x77, 0x00, 0x66, 0x00, 0x88, 0x00, 0x99, 0x00, 0xBB, 0x00, 0x99, 0x00, 0x66, 0x00, 0x55, 0x00, 0x55, 0x00, 0x45, 0x00, 0x43, 0x00, 0x44, 0x00, + (0xE7), 32, 0x32, 0x00, 0x55, 0x00, 0x76, 0x00, 0x66, 0x00, 0x67, 0x00, 0x67, 0x00, 0x87, 0x00, 0x99, 0x00, 0xBB, 0x00, 0x99, 0x00, 0x77, 0x00, 0x44, 0x00, 0x56, 0x00, 0x23, 0x00, 0x33, 0x00, 0x45, 0x00, + (0xE8), 32, 0x00, 0x00, 0x99, 0x00, 0x87, 0x00, 0x88, 0x00, 0x77, 0x00, 0x66, 0x00, 0x88, 0x00, 0xAA, 0x00, 0xBB, 0x00, 0x99, 0x00, 0x66, 0x00, 0x55, 0x00, 0x55, 0x00, 0x44, 0x00, 0x44, 0x00, 0x55, 0x00, + (0xE9), 4, 0xAA, 0x00, 0x00, 0x00, + (0x00), 1, 0xAA, + (0xCF), 17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + (0xF0), 5, 0x00, 0x50, 0x00, 0x00, 0x00, + (0xF3), 1, 0x00, + (0xF9), 4, 0x06, 0x10, 0x29, 0x00, + (0x3A), 1, 0x55, /*66*/ + (0x11), 0, + TFTLCD_DELAY8, 100, + (0x29), 0, + (0x35), 1, 0x00, + (0x51), 1, 0xFF, + (0x53), 1, 0x2C, + (0x55), 1, 0x82, + }; + } +} + +// ######################## SPECIAL for Kippert ##################################################### + +//-- Arduino DUE_ELECHOUSE_SHIELD +#define LCD_RST 33 //PC1 +#define LCD_CS 31 //PA7 +#define LCD_RS 22 //PB26 +#define LCD_WR 23 //PA14 +#define LCD_RD 24 //PA15 + +#define LCD_D0 34 //PC2 +#define LCD_D1 35 +#define LCD_D2 36 +#define LCD_D3 37 +#define LCD_D4 38 +#define LCD_D5 39 +#define LCD_D6 40 +#define LCD_D7 41 //PC9 + +// ############### tables generated from Ilitek App Note ############################################################### +{ + { + static const uint8_t ILI9341_LG2.6_Initial[] PROGMEM = { + (0xCB), 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + (0xCF), 3, 0x00, 0xC1, 0x30, + (0xE8), 3, 0x85, 0x00, 0x78, + (0xEA), 2, 0x00, 0x00, + (0xED), 4, 0x64, 0x03, 0x12, 0x81, + (0xF7), 1, 0x20, + (0xC0), 1, /*Power control*/ 0x23, /*VRH[5:0]*/ + (0xC1), 1, /*Power control*/ 0x10, /*SAP[2:0];BT[3:0]*/ + (0xC5), 2, /*VCM control*/ 0x2B, 0x2B, + // (0xC7), 1, /*VCM control2*/ 0xC0, + (0x36), 1, /* Memory Access Control*/ 0x48, + (0xB1), 2, 0x00, 0x1B, + (0xB6), 2, /* Display Function Control*/ 0x0A, 0x02, + (0xF2), 1, /* 3Gamma Function Disable*/ 0x00, + (0x26), 1, /*Gamma curve selected*/ 0x01, + (0xE0), 15, /*Set Gamma*/ 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, + (0xE1), 15, /*Set Gamma*/ 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, + }; + + static const uint8_t ILI9341_BOE2.0_Initial[] PROGMEM = { + (0xCF), 3, 0x00, 0x99, 0x30, + (0xED), 4, 0x64, 0x03, 0x12, 0x81, + (0xE8), 3, 0x85, 0x10, 0x78, + (0xCB), 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + (0xF7), 1, 0x20, + (0xEA), 2, 0x00, 0x00, + (0xC0), 1, /*Power control*/ 0x26, /*VRH[5:0]*/ + (0xC1), 1, /*Power control*/ 0x12, /*SAP[2:0];BT[3:0]*/ + (0xC5), 2, /*VCM control*/ 0x2B, 0x2C, + (0xC7), 1, /*VCM control2*/ 0xC4, + (0x36), 1, /* Memory Access Control*/ 0x08, + (0xB1), 2, 0x00, 0x1B, + (0xB6), 2, /* Display Function Control*/ 0x0A, 0xA2, + (0xF2), 1, /* 3Gamma Function Disable*/ 0x00, + (0x26), 1, /*Gamma curve selected*/ 0x01, + (0xE0), 15, /*Set Gamma*/ 0x0F, 0x24, 0x21, 0x0A, 0x0E, 0x09, 0x51, 0xA9, 0x44, 0x07, 0x10, 0x03, 0x2C, 0x0B, 0x00, + (0xE1), 15, /*Set Gamma*/ 0x00, 0x1B, 0x1E, 0x05, 0x11, 0x06, 0x2E, 0x56, 0x3B, 0x08, 0x0F, 0x0C, 0x13, 0x14, 0x0F, + }; + + static const uint8_t ILI9341_BOE2.4_Initial[] PROGMEM = { + (0xCF), 3, 0x00, 0x81, 0x30, + (0xED), 4, 0x64, 0x03, 0x12, 0x81, + (0xE8), 3, 0x85, 0x10, 0x78, + (0xCB), 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + (0xF7), 1, 0x20, + (0xEA), 2, 0x00, 0x00, + (0xB1), 2, 0x00, 0x1B, + (0xB6), 2, /* Display Function Control*/ 0x0A, 0xA2, + (0xC0), 1, /*Power control*/ 0x21, /*VRH[5:0]*/ + (0xC1), 1, /*Power control*/ 0x11, /*SAP[2:0];BT[3:0]*/ + (0xC5), 2, /*VCM control*/ 0x3F, 0x3C, + (0xC7), 1, /*VCM control2*/ 0xb5, + (0x36), 1, /* Memory Access Control*/ 0x48, + (0xF2), 1, /* 3Gamma Function Disable*/ 0x00, + (0x26), 1, /*Gamma curve selected*/ 0x01, + (0xE0), 15, /*Set Gamma*/ 0x0F, 0x26, 0x24, 0x0B, 0x0E, 0x09, 0x54, 0xA8, 0x46, 0x0C, 0x17, 0x09, 0x0F, 0x07, 0x00, + (0xE1), 15, /*Set Gamma*/ 0x00, 0x19, 0x1B, 0x04, 0x10, 0x07, 0x2A, 0x47, 0x39, 0x03, 0x06, 0x06, 0x30, 0x38, 0x0F, + }; + + static const uint8_t ILI9341_Tianma2.4_Initial[] PROGMEM = { + (0xCF), 3, 0x00, 0x81, 0x30, + (0xED), 4, 0x64, 0x03, 0x12, 0x81, + (0xE8), 3, 0x85, 0x10, 0x7A, + (0xCB), 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + (0xF7), 1, 0x20, + (0xEA), 2, 0x00, 0x00, + (0xC0), 1, /*Power control*/ 0x21, /*VRH[5:0]*/ + (0xC1), 1, /*Power control*/ 0x11, /*SAP[2:0];BT[3:0]*/ + (0xC5), 2, /*VCM control*/ 0x3F, 0x3C, + (0xC7), 1, /*VCM control2*/ 0xa7, + (0x36), 1, /* Memory Access Control*/ 0x48, + (0xB1), 2, 0x00, 0x1B, + (0xB6), 2, /* Display Function Control*/ 0x0A, 0xA2, + (0xF2), 1, /* 3Gamma Function Disable*/ 0x00, + (0x26), 1, /*Gamma curve selected*/ 0x01, + (0xE0), 15, /*Set Gamma*/ 0x0F, 0x23, 0x1F, 0x0B, 0x0E, 0x08, 0x4B, 0xA8, 0x3B, 0x0A, 0x14, 0x06, 0x10, 0x09, 0x00, + (0xE1), 15, /*Set Gamma*/ 0x00, 0x1C, 0x20, 0x04, 0x10, 0x08, 0x34, 0x47, 0x44, 0x05, 0x0B, 0x09, 0x2F, 0x36, 0x0F, + }; + + // table8_ads = ILI9341_LG2.6_Initial, table_size = sizeof(ILI9341_LG2.6_Initial); // + // table8_ads = ILI9341_BOE2.0_Initial, table_size = sizeof(ILI9341_BOE2.0_Initial); // + // table8_ads = ILI9341_BOE2.4_Initial, table_size = sizeof(ILI9341_BOE2.4_Initial); // + // table8_ads = ILI9341_Tianma2.4_Initial, table_size = sizeof(ILI9341_Tianma2.4_Initial); // + } +} + +// ############### R61580 block ############################ +{ + { +#define SUPPORT_1580 +#ifdef SUPPORT_1580 + case 0x1580: + _lcd_capable = 0 | REV_SCREEN | READ_BGR; + static const uint16_t R61580_regValues[] PROGMEM = { + // Synchronization after reset + TFTLCD_DELAY, 2, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + 0x0000, 0x0000, + + // Setup display + 0x00A4, 0x0001, // NVM_4 [0000] CALB=1 + TFTLCD_DELAY, 2, + 0x0060, 0xA700, // Driver_2 [2700] GS=1 + 0x0008, 0x0808, // Display_2 [0808] BP=8, FP=8 + 0x0030, 0x0111, // y control + 0x0031, 0x2410, // y control + 0x0032, 0x0501, // y control + 0x0033, 0x050C, // y control + 0x0034, 0x2211, // y control + 0x0035, 0x0C05, // y control + 0x0036, 0x2105, // y control + 0x0037, 0x1004, // y control + 0x0038, 0x1101, // y control + 0x0039, 0x1122, // y control + 0x0090, 0x0019, // Panel_1 [0111] 80Hz + 0x0010, 0x0530, // Power_1 [0530] + 0x0011, 0x0237, // Power_2 [0237] + 0x0012, 0x01BF, // Power_3 [018F] PSON=1, PON=1 + 0x0013, 0x1300, // Power_4 [0000] VDV=0x13 + TFTLCD_DELAY, 100, + + 0x0001, 0x0100, // DRVOUT_1 [0000] SS=1 + 0x0002, 0x0200, // LCD_DRV [0000] BC0=1 + 0x0003, 0x1030, // ENTRY [0030] BGR=1 + 0x0009, 0x0001, // Displ_3 [0001] + 0x000A, 0x0008, // Displ_4 [0000] FMARKOE=1 + 0x000C, 0x0001, // Ext_1 [0000] RIM=1 + 0x000D, 0xD000, // Frame Marker [0000] ???? + 0x000E, 0x0030, // VCOM_LP [0030] + 0x000F, 0x0000, // EXT_2 [0000] + // 0x0020, 0x0000, + // 0x0021, 0x0000, + 0x0029, 0x0077, // NVM_2 [00FF] VCM=0x77 + // 0x0050, 0x0000, + // 0x0051, 0xD0EF, + // 0x0052, 0x0000, + // 0x0053, 0x013F, + 0x0061, 0x0001, // Base_Image [0000] REV=1 + 0x006A, 0x0000, // Vert_scrl [0000] + 0x0080, 0x0000, // Partial_Image [0000] + 0x0081, 0x0000, // [0000] + 0x0082, 0x005F, // [0000] PTE=0x5F + 0x0093, 0x0701, // Panel_3 [0101] VEQWI=3 + 0x0007, 0x0100, // Display_1 [0000] BASEE=1 + }; + static const uint16_t R61580_DEM240320C[] PROGMEM = { //from DEM 240320C TMH-PW-N + 0x00, 0x0000, + 0x00, 0x0000, + TFTLCD_DELAY, 100, + 0x00, 0x0000, + 0x00, 0x0000, + 0x00, 0x0000, + 0x00, 0x0000, + 0xA4, 0x0001, + TFTLCD_DELAY, 100, + 0x60, 0xA700, + 0x08, 0x0808, + /******************************************/ + //Gamma Setting: + 0x30, 0x0203, + 0x31, 0x080F, + 0x32, 0x0401, + 0x33, 0x050B, + 0x34, 0x3330, + 0x35, 0x0B05, + 0x36, 0x0005, + 0x37, 0x0F08, + 0x38, 0x0302, + 0x39, 0x3033, + /******************************************/ + //Power Setting: + 0x90, 0x0018, //80Hz + 0x10, 0x0530, //BT,AP + 0x11, 0x0237, //DC1,DC0,VC + 0x12, 0x01BF, + 0x13, 0x1000, //VCOM + TFTLCD_DELAY, 200, + /******************************************/ + 0x01, 0x0100, + 0x02, 0x0200, + 0x03, 0x1030, + 0x09, 0x0001, + 0x0A, 0x0008, + 0x0C, 0x0000, + 0x0D, 0xD000, + + 0x0E, 0x0030, + 0x0F, 0x0000, + 0x20, 0x0000, //H Start + 0x21, 0x0000, //V Start + 0x29, 0x002E, + 0x50, 0x0000, + 0x51, 0x00EF, + 0x52, 0x0000, + 0x53, 0x013F, + 0x61, 0x0001, + 0x6A, 0x0000, + 0x80, 0x0000, + 0x81, 0x0000, + 0x82, 0x005F, + 0x93, 0x0701, + /******************************************/ + 0x07, 0x0100, + TFTLCD_DELAY, 100, + }; + init_table16(R61580_DEM240320C, sizeof(R61580_DEM240320C)); +// init_table16(R61580_regValues, sizeof(R61580_regValues)); + break; +#endif + } +} + +//################## SSD1963 ############################################## +{ + { + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_800NEW_regValues[] PROGMEM = { + (0xE2), 3, 0x1E, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x03, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15 + (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8 + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_800ALT_regValues[] PROGMEM = { + (0xE2), 3, 0x23, 0x02, 0x04, //PLL multiplier, set PLL clock to 120M + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x04, 0x93, 0xE0, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x00, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15 + (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8 + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // from UTFTv2.82 initlcd.h + static const uint8_t SSD1963_480_regValues[] PROGMEM = { + (0xE2), 3, 0x23, 0x02, 0x54, //PLL multiplier, set PLL=120M, N=0x36/0x23 for 6.5M/10M crystal + (0xE0), 1, 0x01, // PLL enable + TFTLCD_DELAY8, 10, + (0xE0), 1, 0x03, // + TFTLCD_DELAY8, 10, + 0x01, 0, //Soft Reset + TFTLCD_DELAY8, 100, + (0xE6), 3, 0x01, 0x1F, 0xFF, //PLL setting for PCLK, depends on resolution + (0xB0), 7, 0x20, 0x00, 0x01, 0xDF, 0x01, 0x0F, 0x00, //LCD SPECIFICATION + (0xB4), 8, 0x02, 0x13, 0x00, 0x08, 0x2B, 0x00, 0x02, 0x00, //HSYNC HT=531, HPS=8, HPW=43, LPS=2 + (0xB6), 7, 0x01, 0x20, 0x00, 0x04, 0x0C, 0x00, 0x02, //VSYNC VT=288, VPS=4, VPW=12, FPS=2 + (0xBA), 1, 0x0F, //GPIO[3:0] out 1 + (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output + (0xF0), 1, 0x03, //pixel data interface + TFTLCD_DELAY8, 1, + 0x28, 0, //Display Off + 0x11, 0, //Sleep Out + TFTLCD_DELAY8, 100, + 0x29, 0, //Display On + (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L + (0xD0), 1, 0x0D, + }; + // table8_ads = SSD1963_480_regValues, table_size = sizeof(SSD1963_480_regValues); + // table8_ads = SSD1963_480NEW_regValues, table_size = sizeof(SSD1963_480NEW_regValues); + // table8_ads = SSD1963_800_regValues, table_size = sizeof(SSD1963_800_regValues); + // table8_ads = SSD1963_NHD_50_regValues, table_size = sizeof(SSD1963_NHD_50_regValues); + // table8_ads = SSD1963_NHD_70_regValues, table_size = sizeof(SSD1963_NHD_70_regValues); + table8_ads = SSD1963_800NEW_regValues, table_size = sizeof(SSD1963_800NEW_regValues); + // table8_ads = SSD1963_800ALT_regValues, table_size = sizeof(SSD1963_800ALT_regValues); + + } +} + +//################## ILI9806 ############################################## +#define TFTLCD_DELAY8 0x7F +{ + { +#define SUPPORT_9806 +#ifdef SUPPORT_9806 + case 0x9806: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; + // from ZinggJM + static const uint8_t ILI9806_regValues[] PROGMEM = { + (0xFF), 3, /* EXTC Command Set enable register*/ 0xFF, 0x98, 0x06, + (0xBA), 1, /* SPI Interface Setting*/0xE0, + (0xBC), 21, /* GIP 1*/0x03, 0x0F, 0x63, 0x69, 0x01, 0x01, 0x1B, 0x11, 0x70, 0x73, 0xFF, 0xFF, 0x08, 0x09, 0x05, 0x00, 0xEE, 0xE2, 0x01, 0x00, 0xC1, + (0xBD), 8, /* GIP 2*/0x01, 0x23, 0x45, 0x67, 0x01, 0x23, 0x45, 0x67, + (0xBE), 9, /* GIP 3*/0x00, 0x22, 0x27, 0x6A, 0xBC, 0xD8, 0x92, 0x22, 0x22, + (0xC7), 1, /* Vcom*/0x1E, + (0xED), 3, /* EN_volt_reg*/0x7F, 0x0F, 0x00, + (0xC0), 3, /* Power Control 1*/0xE3, 0x0B, 0x00, + (0xFC), 1, 0x08, + (0xDF), 6, /* Engineering Setting*/0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + (0xF3), 1, /* DVDD Voltage Setting*/0x74, + (0xB4), 3, /* Display Inversion Control*/0x00, 0x00, 0x00, + (0xF7), 1, /* 480x854*/0x81, + (0xB1), 3, /* Frame Rate*/0x00, 0x10, 0x14, + (0xF1), 3, /* Panel Timing Control*/0x29, 0x8A, 0x07, + (0xF2), 4, /*Panel Timing Control*/0x40, 0xD2, 0x50, 0x28, + (0xC1), 4, /* Power Control 2*/0x17, 0x85, 0x85, 0x20, + (0xE0), 16, 0x00, 0x0C, 0x15, 0x0D, 0x0F, 0x0C, 0x07, 0x05, 0x07, 0x0B, 0x10, 0x10, 0x0D, 0x17, 0x0F, 0x00, + (0xE1), 16, 0x00, 0x0D, 0x15, 0x0E, 0x10, 0x0D, 0x08, 0x06, 0x07, 0x0C, 0x11, 0x11, 0x0E, 0x17, 0x0F, 0x00, + (0x35), 1, /*Tearing Effect ON*/0x00, + }; + table8_ads = ILI9806_regValues, table_size = sizeof(ILI9806_regValues); + p16 = (int16_t *) & HEIGHT; + *p16 = 480; + p16 = (int16_t *) & WIDTH; + *p16 = 854; + break; +#endif + } +} + +//################################### UC8230 ############################################ +{ + { + { + ... + if (_lcd_ID == 0x8230) { // UC8230 has strange BGR and READ_BGR behaviour + if (rotation == 1 || rotation == 2) { + val ^= 0x08; // change BGR bit for LANDSCAPE and PORTRAIT_REV + } + } + ... + } +#ifdef SUPPORT_8230 + case 0x8230: //thanks Pappee + _lcd_capable = 0 | REV_SCREEN | INVERT_GS | INVERT_RGB | READ_BGR; + static const uint16_t UC8230_regValues[] PROGMEM = { + //After pin Reset wait at least 100ms + TFTLCD_DELAY, 100, //at least 100ms + 0x0046, 0x0002, //MTP Disable + 0x0010, 0x1590, + 0x0011, 0x0227, + 0x0012, 0x80ff, + 0x0013, 0x9c31, + TFTLCD_DELAY, 10, //at least 10ms + 0x0002, 0x0300, //set N-line = 1 + 0x0003, 0x1030, //set GRAM writing direction & BGR=1 + 0x0060, 0xa700, //GS; gate scan: start position & drive line Q'ty + 0x0061, 0x0001, //REV, NDL, VLE + /*--------------------Gamma control------------------------*/ + 0x0030, 0x0303, + 0x0031, 0x0303, + 0x0032, 0x0303, + 0x0033, 0x0300, + 0x0034, 0x0003, + 0x0035, 0x0303, + 0x0036, 0x1400, + 0x0037, 0x0303, + 0x0038, 0x0303, + 0x0039, 0x0303, + 0x003a, 0x0300, + 0x003b, 0x0003, + 0x003c, 0x0303, + 0x003d, 0x1400, + //-----------------------------------------------------------// + 0x0020, 0x0000, //GRAM horizontal address + 0x0021, 0x0000, //GRAM vertical address + //************** Partial Display control*********************// + 0x0080, 0x0000, + 0x0081, 0x0000, + 0x0082, 0x0000, + 0x0083, 0x0000, + 0x0084, 0x0000, + 0x0085, 0x0000, + //-----------------------------------------------------------// + 0x0092, 0x0200, + 0x0093, 0x0303, + 0x0090, 0x0010, //set clocks/Line + 0x0000, 0x0001, + TFTLCD_DELAY, 200, // Delay 200 ms + 0x0007, 0x0173, //Display on setting + }; + init_table16(UC8230_regValues, sizeof(UC8230_regValues)); + break; +#endif + } +} + +//############################# S6D0144 ############################### +{ + { +#define SUPPORT_0114 +#ifdef SUPPORT_0114 + case 0x0114: + _lcd_capable = REV_SCREEN | INVERT_GS; + static const uint16_t S6D0114_regValues[] PROGMEM = { + + 0x0000, 0x0001, + TFTLCD_DELAY, 300, + 0x00B4, 0x0000, + 0x00B3, 0x0000, + 0x0007, 0x0000, + 0x0012, 0x00B3, + 0x0013, 0x0808, + 0x0014, 0x7DE5, + 0x0010, 0x1A6C, + TFTLCD_DELAY, 900, + 0x0013, 0x081E, + TFTLCD_DELAY, 300, + 0x0001, 0x0114, + 0x0002, 0x0100, + 0x0003, 0x0020, + 0x0008, 0x0202, + 0x000B, 0x0004, + 0x000C, 0x0001, + 0x0030, 0x0303, + 0x0031, 0x0303, + 0x0032, 0x0303, + 0x0033, 0x0000, + 0x0034, 0x0404, + 0x0035, 0x0404, + 0x0036, 0x0404, + 0x0037, 0x0000, + 0x0038, 0x0707, + 0x0040, 0x0000, + 0x0042, 0x9F00, + 0x0043, 0x0000, + 0x0044, 0x7F00, + 0x0045, 0x9F00, + 0x0061, 0x0018, + 0x0069, 0x0000, + 0x0070, 0x0000, + 0x0071, 0x0000, + TFTLCD_DELAY, 500, + 0x0007, 0x0005, + 0x0007, 0x0021, + 0x0007, 0x0023, + TFTLCD_DELAY, 500, + 0x0007, 0x0037, + 0x0021, 0x007F, + 0x0022, 0x0000, + }; + init_table16(S6D0114_regValues, sizeof(S6D0114_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 160; + p16 = (int16_t *) & WIDTH; + *p16 = 128; + break; +#endif + } +} + +//############################# ILI9225 ############################### +{ + { +#define SUPPORT_9225 +#ifdef SUPPORT_9225 +#define ILI9225_DRIVER_OUTPUT_CTRL (0x01u) // Driver Output Control +#define ILI9225_LCD_AC_DRIVING_CTRL (0x02u) // LCD AC Driving Control +#define ILI9225_ENTRY_MODE (0x03u) // Entry Mode +#define ILI9225_DISP_CTRL1 (0x07u) // Display Control 1 +#define ILI9225_BLANK_PERIOD_CTRL1 (0x08u) // Blank Period Control +#define ILI9225_FRAME_CYCLE_CTRL (0x0Bu) // Frame Cycle Control +#define ILI9225_INTERFACE_CTRL (0x0Cu) // Interface Control +#define ILI9225_OSC_CTRL (0x0Fu) // Osc Control +#define ILI9225_POWER_CTRL1 (0x10u) // Power Control 1 +#define ILI9225_POWER_CTRL2 (0x11u) // Power Control 2 +#define ILI9225_POWER_CTRL3 (0x12u) // Power Control 3 +#define ILI9225_POWER_CTRL4 (0x13u) // Power Control 4 +#define ILI9225_POWER_CTRL5 (0x14u) // Power Control 5 +#define ILI9225_VCI_RECYCLING (0x15u) // VCI Recycling +#define ILI9225_RAM_ADDR_SET1 (0x20u) // Horizontal GRAM Address Set +#define ILI9225_RAM_ADDR_SET2 (0x21u) // Vertical GRAM Address Set +#define ILI9225_GRAM_DATA_REG (0x22u) // GRAM Data Register +#define ILI9225_GATE_SCAN_CTRL (0x30u) // Gate Scan Control Register +#define ILI9225_VERTICAL_SCROLL_CTRL1 (0x31u) // Vertical Scroll Control 1 Register +#define ILI9225_VERTICAL_SCROLL_CTRL2 (0x32u) // Vertical Scroll Control 2 Register +#define ILI9225_VERTICAL_SCROLL_CTRL3 (0x33u) // Vertical Scroll Control 3 Register +#define ILI9225_PARTIAL_DRIVING_POS1 (0x34u) // Partial Driving Position 1 Register +#define ILI9225_PARTIAL_DRIVING_POS2 (0x35u) // Partial Driving Position 2 Register +#define ILI9225_HORIZONTAL_WINDOW_ADDR1 (0x36u) // Horizontal Address END Position HEA +#define ILI9225_HORIZONTAL_WINDOW_ADDR2 (0x37u) // Horizontal Address START Position HSA +#define ILI9225_VERTICAL_WINDOW_ADDR1 (0x38u) // Vertical Address END Position VEA +#define ILI9225_VERTICAL_WINDOW_ADDR2 (0x39u) // Vertical Address START Position VSA +#define ILI9225_GAMMA_CTRL1 (0x50u) // Gamma Control 1 +#define ILI9225_GAMMA_CTRL2 (0x51u) // Gamma Control 2 +#define ILI9225_GAMMA_CTRL3 (0x52u) // Gamma Control 3 +#define ILI9225_GAMMA_CTRL4 (0x53u) // Gamma Control 4 +#define ILI9225_GAMMA_CTRL5 (0x54u) // Gamma Control 5 +#define ILI9225_GAMMA_CTRL6 (0x55u) // Gamma Control 6 +#define ILI9225_GAMMA_CTRL7 (0x56u) // Gamma Control 7 +#define ILI9225_GAMMA_CTRL8 (0x57u) // Gamma Control 8 +#define ILI9225_GAMMA_CTRL9 (0x58u) // Gamma Control 9 +#define ILI9225_GAMMA_CTRL10 (0x59u) // Gamma Control 10 + +#define ILI9225C_INVOFF 0x20 +#define ILI9225C_INVON 0x21 + + case 0x9225: + _lcd_capable = REV_SCREEN | INVERT_GS; + static const uint16_t ILI9225_regValues[] PROGMEM = { + /* Start Initial Sequence */ + /* Set SS bit and direction output from S528 to S1 */ + ILI9225_POWER_CTRL1, 0x0000, // Set SAP,DSTB,STB + ILI9225_POWER_CTRL2, 0x0000, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x0000, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x0000, // Set GVDD + ILI9225_POWER_CTRL5, 0x0000, // Set VCOMH/VCOML voltage + TFTLCD_DELAY, 40, + + // Power-on sequence + ILI9225_POWER_CTRL2, 0x0018, // Set APON,PON,AON,VCI1EN,VC + ILI9225_POWER_CTRL3, 0x6121, // Set BT,DC1,DC2,DC3 + ILI9225_POWER_CTRL4, 0x006F, // Set GVDD /*007F 0088 */ + ILI9225_POWER_CTRL5, 0x495F, // Set VCOMH/VCOML voltage + ILI9225_POWER_CTRL1, 0x0800, // Set SAP,DSTB,STB + TFTLCD_DELAY, 10, + ILI9225_POWER_CTRL2, 0x103B, // Set APON,PON,AON,VCI1EN,VC + TFTLCD_DELAY, 50, + + ILI9225_DRIVER_OUTPUT_CTRL, 0x011C, // set the display line number and display direction + ILI9225_LCD_AC_DRIVING_CTRL, 0x0100, // set 1 line inversion + ILI9225_ENTRY_MODE, 0x1030, // set GRAM write direction and BGR=1. + ILI9225_DISP_CTRL1, 0x0000, // Display off + ILI9225_BLANK_PERIOD_CTRL1, 0x0808, // set the back porch and front porch + ILI9225_FRAME_CYCLE_CTRL, 0x1100, // set the clocks number per line + ILI9225_INTERFACE_CTRL, 0x0000, // CPU interface + ILI9225_OSC_CTRL, 0x0D01, // Set Osc /*0e01*/ + ILI9225_VCI_RECYCLING, 0x0020, // Set VCI recycling + ILI9225_RAM_ADDR_SET1, 0x0000, // RAM Address + ILI9225_RAM_ADDR_SET2, 0x0000, // RAM Address + + /* Set GRAM area */ + ILI9225_GATE_SCAN_CTRL, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB, + ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000, + ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000, + ILI9225_PARTIAL_DRIVING_POS1, 0x00DB, + ILI9225_PARTIAL_DRIVING_POS2, 0x0000, + ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF, + ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000, + ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB, + ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000, + + /* Set GAMMA curve */ + ILI9225_GAMMA_CTRL1, 0x0000, + ILI9225_GAMMA_CTRL2, 0x0808, + ILI9225_GAMMA_CTRL3, 0x080A, + ILI9225_GAMMA_CTRL4, 0x000A, + ILI9225_GAMMA_CTRL5, 0x0A08, + ILI9225_GAMMA_CTRL6, 0x0808, + ILI9225_GAMMA_CTRL7, 0x0000, + ILI9225_GAMMA_CTRL8, 0x0A00, + ILI9225_GAMMA_CTRL9, 0x0710, + ILI9225_GAMMA_CTRL10, 0x0710, + + ILI9225_DISP_CTRL1, 0x0012, + TFTLCD_DELAY, 50, + ILI9225_DISP_CTRL1, 0x1017, + }; + init_table16(ILI9225_regValues, sizeof(ILI9225_regValues)); + p16 = (int16_t *) & HEIGHT; + *p16 = 220; + p16 = (int16_t *) & WIDTH; + *p16 = 176; + break; + } +} + +// ############################## ILI9342 ################### +{ + { + case 0x9342: + _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | INVERT_GS | REV_SCREEN; + static const uint8_t ILI9342_regValues_CPT24[] PROGMEM = { //CPT 2.4" + (0xB9), 3, 0xFF, 0x93, 0x42, //[00 00 00] + (0xC0), 2, 0x1D, 0x0A, //[26 09] + (0xC1), 1, 0x02, //[10] + (0xC5), 2, 0x2F, 0x2F, //[31 3C] + (0xC7), 1, 0xC3, //[C0] + (0xB8), 1, 0x0B, //[07] + (0xE0), 15, 0x0F, 0x33, 0x30, 0x0C, 0x0F, 0x08, 0x5D, 0x66, 0x4A, 0x07, 0x13, 0x05, 0x1B, 0x0E, 0x08, + (0xE1), 15, 0x08, 0x0E, 0x11, 0x02, 0x0E, 0x02, 0x24, 0x33, 0x37, 0x03, 0x0A, 0x09, 0x26, 0x33, 0x0F, + }; + static const uint8_t ILI9342_regValues_Tianma23[] PROGMEM = { //Tianma 2.3" + (0xB9), 3, 0xFF, 0x93, 0x42, + (0xC0), 2, 0x1D, 0x0A, + (0xC1), 1, 0x01, + (0xC5), 2, 0x2C, 0x2C, + (0xC7), 1, 0xC6, + (0xB8), 1, 0x09, + (0xE0), 15, 0x0F, 0x26, 0x21, 0x07, 0x0A, 0x03, 0x4E, 0x62, 0x3E, 0x0B, 0x11, 0x00, 0x08, 0x02, 0x00, + (0xE1), 15, 0x00, 0x19, 0x1E, 0x03, 0x0E, 0x03, 0x30, 0x23, 0x41, 0x03, 0x0B, 0x07, 0x2F, 0x36, 0x0F, + }; + static const uint8_t ILI9342_regValues_HSD23[] PROGMEM = { //HSD 2.3" + (0xB9), 3, 0xFF, 0x93, 0x42, + (0xC0), 2, 0x1D, 0x0A, + (0xC1), 1, 0x02, + (0xC5), 2, 0x2F, 0x27, + (0xC7), 1, 0xA4, + (0xB8), 1, 0x0B, + (0xE0), 15, 0x0F, 0x24, 0x21, 0x0C, 0x0F, 0x06, 0x50, 0x75, 0x3F, 0x07, 0x12, 0x05, 0x11, 0x0B, 0x08, + (0xE1), 15, 0x08, 0x1D, 0x20, 0x02, 0x0E, 0x04, 0x31, 0x24, 0x42, 0x03, 0x0B, 0x09, 0x30, 0x36, 0x0F, + }; + table8_ads = ILI9342_regValues_CPT24, table_size = sizeof(ILI9342_regValues_CPT24); // + // table8_ads = ILI9342_regValues_Tianma23, table_size = sizeof(ILI9342_regValues_Tianma23); // + // table8_ads = ILI9342_regValues_HSD23, table_size = sizeof(ILI9342_regValues_HSD23); // + p16 = (int16_t *) & HEIGHT; + *p16 = 240; + p16 = (int16_t *) & WIDTH; + *p16 = 320; + break; + } +} + +// ###################### R61505 init ################################# +{ + { + case 0x1505: //R61505 + _lcd_capable = 0 | REV_SCREEN | READ_LOWHIGH; + static const uint16_t R61505U_regValues[] PROGMEM = { //MCHIP drvTFT001.c + // Setup display + 0x0000, 0x0000, + 0x0007, 0x0001, // DISPCTL1: D = 1 + TFTLCD_DELAY, 5, + 0x0017, 0x0001, // POWCTL6: PSE = 1 + TFTLCD_DELAY, 5, + 0x0010, 0x17b0, // POWCTL1: SAP=1, BT=7, APE=1, AP=7 + 0x0011, 0x0007, // POWCTL2: VC=7 + 0x0012, 0x011a, // POWCTL3: VCMR=1, PON=1, VRH=10 + 0x0013, 0x0f00, // POWCTL4: VDV=15 + 0x0015, 0x0000, // POWCTL5: + 0x0029, 0x0009, // POWCTL7: VCM=9 + 0x00fd, 0x0000, // f.k. + TFTLCD_DELAY, 5, + 0x0012, 0x013a, // POWCTL3: VCMR=1, PSON=1, PON=1, VRH=10 + TFTLCD_DELAY, 50, + 0x0001, 0x0100, // DRVCTL1: SS=1 + 0x0002, 0x0700, // LCDDRV: r/o=1, B/C=1, EOR=1 + + 0x0003, 0x1030, // ENTRYMD: BGR=1, I/D=3 + + 0x0008, 0x0808, // DISPCTL2: FP=8, BP=8 + 0x0009, 0x0000, // DISPCTL3: + 0x000a, 0x0000, // DISPCTL4: + 0x000c, 0x0000, // RGBCTL: + 0x000d, 0x0000, // FRMPOS: FMP=0 + 0x0030, 0x0000, //Gamma + 0x0031, 0x0000, + 0x0032, 0x0000, + 0x0033, 0x0000, + 0x0034, 0x0000, + 0x0035, 0x0000, + 0x0036, 0x0000, + 0x0037, 0x0707, + 0x0038, 0x0707, + 0x0039, 0x0707, + 0x003a, 0x0303, + 0x003b, 0x0303, + 0x003c, 0x0707, + 0x003d, 0x0808, + 0x0050, 0x0000, // + 0x0051, 0x00ef, + 0x0052, 0x0000, + 0x0053, 0x013f, + 0x0060, 0x2700, // DRVCTL2: NL=32 + 0x0061, 0x0001, // BASIMG: REV=1 + 0x006a, 0x0000, // VERTSCRL: + 0x0090, 0x0010, // PANCTL1: DIV100=1 + 0x0092, 0x0000, + 0x0093, 0x0000, + 0x0007, 0x0021, // DISPCTL1: GON=1, D=1 + TFTLCD_DELAY, 1, + 0x0007, 0x0061, // DISPCTL1: VON=1, GON=1, D=1 + TFTLCD_DELAY, 50, + 0x0007, 0x0173, // DISPCTL1: BASEE=1, VON=1, GON=1, DTE=1, D=1 + 0x0020, 0x0000, + 0x0021, 0x0000, + 0x0022, 0x0000, + 0x0030, 0x0707, // GAMMA + 0x0031, 0x0407, + 0x0032, 0x0203, + 0x0033, 0x0303, + 0x0034, 0x0303, + 0x0035, 0x0202, + 0x0036, 0x001f, + 0x0037, 0x0707, + 0x0038, 0x0407, + 0x0039, 0x0203, + 0x003a, 0x0303, + 0x003b, 0x0303, + 0x003c, 0x0202, + 0x003d, 0x001f, + 0x0020, 0x0000, + 0x0021, 0x0000, + }; + init_table16(R61505U_regValues, sizeof(R61505U_regValues)); + break; + } +} + +// ################## for auto-format ######################### +#if 0 +// ################## UNO SPECIAL for Stojanjos ############### +#define USE_STOJANOS +... +#elif defined(__AVR_ATmega328P__) && defined(USE_STOJANOS) // +#warning SPECIAL for USE_STOJANOS +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 4 + +#define BMASK 0x03 //0x0F +#define DMASK 0xFC //0xF0 +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) & BMASK); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( (PINB & BMASK) | (PIND & DMASK) ) +#define setWriteDir() { DDRB |= BMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################ UNO LCD_D2 on A5 ###################################### +#define USE_D2_ON_A5 +... +#elif defined(__AVR_ATmega328P__) && defined(USE_D2_ON_A5) +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 4 + +#define BMASK 0x03 //more intuitive style for mixed Ports +#define CMASK (1<<5) +#define DMASK 0xF8 //does exactly the same as previous +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) & BMASK); PORTC = (PORTC & ~CMASK) | (((x)<<3) & CMASK); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( (PINB & BMASK) | ((PINC & CMASK)>>3) | (PIND & DMASK) ) +#define setWriteDir() { DDRB |= BMASK; DDRC |= CMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRC &= ~CMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################ UNO LCD_D2 on D10 ###################################### +#define USE_D2_ON_D10 +... +#elif defined(__AVR_ATmega328P__) && defined(USE_D2_ON_D10) +#warning USE_D2_ON_D10 +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 4 + +#define BMASK 0x07 //more intuitive style for mixed Ports +#define DMASK 0xF8 //does exactly the same as previous +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) & BMASK); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( (PINB & BMASK) | (PIND & DMASK) ) +#define setWriteDir() { DDRB |= BMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################ UNO LCD_D0 on D10 ###################################### +#define USE_D0_ON_D10 +... +#elif defined(__AVR_ATmega328P__) && defined(USE_D0_ON_D10) +#warning USE_D0_ON_D10 +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 4 + +#define BMASK 0x06 //more intuitive style for mixed Ports +#define DMASK 0xFC //does exactly the same as previous +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) & (1<<1)) | (((x) & (1<<0)) << 2); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( ((PINB & (1<<2)) >> 2) | (PINB & (1<<1)) | (PIND & DMASK) ) +#define setWriteDir() { DDRB |= BMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################### MXxxxx UNO SHIELD on TEENSY #################################################### +#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) // regular UNO shield on a Teensy 3.x +#warning regular UNO shield on a Teensy 3.x + +#if defined(__MK20DX128__) || defined(__MK20DX256__) // Teensy3.0 || 3.2 96MHz +#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#elif defined(__MK64FX512__) // Teensy3.5 120MHz thanks to PeteJohno +#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#elif defined(__MK66FX1M0__) // Teensy3.6 180MHz untested. delays can possibly be reduced. +#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#else +#error unspecified delays +#endif + +#define RD_PORT GPIOD +#define RD_PIN 1 +#define WR_PORT GPIOC +#define WR_PIN 0 +#define CD_PORT GPIOB +#define CD_PIN 0 +#define CS_PORT GPIOB +#define CS_PIN 1 +#define RESET_PORT GPIOB +#define RESET_PIN 3 + +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<13)) +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<7)) + +#define write_8(d) { \ + GPIOA_PCOR = AMASK; GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOA_PSOR = (((d) & (1 << 3)) << 9) \ + | (((d) & (1 << 4)) << 9); \ + GPIOC_PSOR = (((d) & (1 << 1)) << 2); \ + GPIOD_PSOR = (((d) & (1 << 0)) << 3) \ + | (((d) & (1 << 2)) >> 2) \ + | (((d) & (1 << 5)) << 2) \ + | (((d) & (1 << 6)) >> 2) \ + | (((d) & (1 << 7)) >> 5); \ + } +#define read_8() ((((GPIOD_PDIR & (1<<3)) >> 3) \ + | ((GPIOC_PDIR & (1 << 3)) >> 2) \ + | ((GPIOD_PDIR & (1 << 0)) << 2) \ + | ((GPIOA_PDIR & (1 << 12)) >> 9) \ + | ((GPIOA_PDIR & (1 << 13)) >> 9) \ + | ((GPIOD_PDIR & (1 << 7)) >> 2) \ + | ((GPIOD_PDIR & (1 << 4)) << 2) \ + | ((GPIOD_PDIR & (1 << 2)) << 5))) +#define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } +#define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } //PJ adjusted +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } //PJ adjusted +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +//################################### SAM3X ELECHOUSE_DUE_16BIT_SHIELD ON DUE #################################################### +#define USE_ELECHOUSE_DUE_16BIT_SHIELD +... +#elif defined(__SAM3X8E__) && defined(USE_DUE_ELECHOUSE_SHIELD) //ELECHOUSE shield on DUE +#warning USE_ELECHOUSE_DUE_16BIT_SHIELD +#define USES_16BIT_BUS +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 15 //D24 Graham +#define WR_PORT PIOA +#define WR_PIN 14 //D23 +#define CD_PORT PIOB +#define CD_PIN 26 //D22 +#define CS_PORT PIOA +#define CS_PIN 7 //D31 +#define RESET_PORT PIOC +#define RESET_PIN 1 //D33 +// configure macros for data bus +// DB0..DB7 on PIOC2..PIOC9, DB8..DB15 on PIOC12..PIOC19 +// +#define CMASKH (0xFF00<<4) +#define CMASKL (0x00FF<<2) +#define CMASK (CMASKH | CMASKL) +#define write_8(x) { PIOC->PIO_CODR = CMASKL; PIOC->PIO_SODR = (((x)&0x00FF)<<2); } +#define write_16(x) { PIOC->PIO_CODR = CMASK; \ + PIOC->PIO_SODR = (((x)&0x00FF)<<2)|(((x)&0xFF00)<<4); } +#define read_16() (((PIOC->PIO_PDSR & CMASKH)>>4)|((PIOC->PIO_PDSR & CMASKL)>>2) ) +#define read_8() (read_16() & 0xFF) +#define setWriteDir() { PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; } +#define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOC); PIOC->PIO_ODR = CMASK; } +#define write8(x) { write16(x & 0xFF); } +#define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +//################################### SAM3X TIKY ON DUE #################################################### +#define USE_TIKY_ON_DUE +... +#elif defined(__SAM3X8E__) && defined(USE_TIKY_ON_DUE) //TIKY_ON_DUE +#warning USE_TIKY_ON_DUE +#define USES_16BIT_BUS +// configure macros for the control pins +#define RD_PORT PIOD +#define RD_PIN 0 //D25 PD0 +#define WR_PORT PIOA +#define WR_PIN 15 //D24 PA15 +#define CD_PORT PIOA +#define CD_PIN 14 //D23 PA14 +#define CS_PORT PIOB +#define CS_PIN 26 //D22 PB26 +#define RESET_PORT PIOD +#define RESET_PIN 1 //D26 PD1 +// configure macros for data bus +// +#define AMASK ((1<<7)|(1<<19)) //PA7, PA19 +#define CMASK (0x1FF<<1) //PC1-PC9 +#define DMASK ((3<<2)|(1<<6)|(3<<9)) //PD2-PD3, PD6, PD9-PD10 + +#define write_16(x) { PIOA->PIO_CODR = AMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ + PIOD->PIO_SODR = (((x)&(3<<0))<<2); \ + PIOD->PIO_SODR = (((x)&(1<<2))<<4); \ + PIOD->PIO_SODR = (((x)&(1<<3))<<6); \ + PIOA->PIO_SODR = (((x)&(1<<4))<<3); \ + PIOD->PIO_SODR = (((x)&(1<<5))<<5); \ + PIOC->PIO_SODR = (((x)&(0x1FF<<6))>>5); \ + PIOA->PIO_SODR = (((x)&(1<<15))<<4); \ + } + +#define read_16() ( 0\ + |((PIOD->PIO_PDSR & (1<<2))>>2)\ + |((PIOD->PIO_PDSR & (1<<3))>>2)\ + |((PIOD->PIO_PDSR & (1<<6))>>4)\ + |((PIOD->PIO_PDSR & (1<<9))>>6)\ + |((PIOA->PIO_PDSR & (1<<7))>>3)\ + |((PIOD->PIO_PDSR & (1<<10))>>5)\ + |((PIOC->PIO_PDSR & (0x1FF<<1))<<5)\ + |((PIOA->PIO_PDSR & (1<<19)>>4))\ + ) +#define read_8() (read_16() & 0xFF) +#define setWriteDir() {\ + PIOA->PIO_OER = AMASK; PIOA->PIO_PER = AMASK; \ + PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; \ + PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; \ + } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOC)|(1 << ID_PIOD); \ + PIOA->PIO_ODR = AMASK; \ + PIOC->PIO_ODR = CMASK; \ + PIOD->PIO_ODR = DMASK; \ + } +#define write8(x) { write16(x & 0xFF); } +// ILI9486 is slower than ILI9481 +#define write16(x) { write_16(x); WR_ACTIVE; WR_ACTIVE; WR_STROBE; } +#define READ_16(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +//############################## STM32 MY BLUEPILL ########################################### +#define USE_MY_BLUEPILL +... +#elif defined(USE_MY_BLUEPILL) && (defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_NUCLEO_F103C8)) +#warning Uno Shield on BLUEPILL +#define RD_PORT GPIOB +#define RD_PIN 1 +#define WR_PORT GPIOB +#define WR_PIN 0 +#define CD_PORT GPIOA +#define CD_PIN 7 +#define CS_PORT GPIOA +#define CS_PIN 6 +#define RESET_PORT GPIOA +#define RESET_PIN 5 + +// configure macros for the data pins +#define AMASK 0x060F +#define BMASK 0x00C0 +#define write_8(d) { GPIOA->REGS(BSRR) = AMASK << 16; GPIOB->REGS(BSRR) = BMASK << 16; \ + GPIOA->REGS(BSRR) = (((d) & 3) << 9) | (((d) & 0xF0) >> 4); \ + GPIOB->REGS(BSRR) = (((d) & 0x0C) << 4); \ + } +#define read_8() (((GPIOA->REGS(IDR) & (3<<9)) >> 9) | ((GPIOA->REGS(IDR) & (0x0F)) << 4) | ((GPIOB->REGS(IDR) & (3<<6)) >> 4)) +// PA10,PA9 PA3-PA0 PB7,PB6 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFF0); GP_OUT(GPIOA, CRL, 0xFFFF); GP_OUT(GPIOB, CRL, 0xFF000000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFF0); GP_INP(GPIOA, CRL, 0xFFFF); GP_INP(GPIOB, CRL, 0xFF000000); } + +//####################################### STM32L476 ############################ +#elif defined(ARDUINO_NUCLEO_L476RG) // Uno Shield on NUCLEO-L476 +#warning regular Uno Shield on NUCLEO-L476 +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 4 +#define CS_PORT GPIOB +#define CS_PIN 0 +#define RESET_PORT GPIOC +#define RESET_PIN 1 + +#define REGS(x) x +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) +#define GPIO_INIT() { RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOBEN | RCC_AHB2ENR_GPIOCEN; } +// configure macros for the data pins +#define write_8(d) { \ + GPIOA->REGS(BSRR) = 0x0700 << 16; \ + GPIOB->REGS(BSRR) = 0x0438 << 16; \ + GPIOC->REGS(BSRR) = 0x0080 << 16; \ + GPIOA->REGS(BSRR) = ( ((d) & (1<<0)) << 9) \ + | (((d) & (1<<2)) << 8) \ + | (((d) & (1<<7)) << 1); \ + GPIOB->REGS(BSRR) = ( ((d) & (1<<3)) << 0) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) >> 1) \ + | (((d) & (1<<6)) << 4); \ + GPIOC->REGS(BSRR) = ( ((d) & (1<<1)) << 6); \ + } + +#define read_8() ( ( ( (GPIOA->REGS(IDR) & (1<<9)) >> 9) \ + | ((GPIOC->REGS(IDR) & (1<<7)) >> 6) \ + | ((GPIOA->REGS(IDR) & (1<<10)) >> 8) \ + | ((GPIOB->REGS(IDR) & (1<<3)) >> 0) \ + | ((GPIOB->REGS(IDR) & (1<<5)) >> 1) \ + | ((GPIOB->REGS(IDR) & (1<<4)) << 1) \ + | ((GPIOB->REGS(IDR) & (1<<10)) >> 4) \ + | ((GPIOA->REGS(IDR) & (1<<8)) >> 1))) + +// PA10,PA9,PA8 PB10,PB5,PB4,PB3 PC7 +#define setWriteDir() { setReadDir(); \ + GPIOA->MODER |= 0x150000; GPIOB->MODER |= 0x100540; GPIOC->MODER |= 0x4000; } +#define setReadDir() { GPIOA->MODER &= ~0x3F0000; GPIOB->MODER &= ~0x300FC0; GPIOC->MODER &= ~0xC000; } + +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +// #################################### STM32 XINGGJM ####################################### +#define USE_XINGGJM_BLUEPILL +... +#elif defined(USE_XINGGJM_BLUEPILL) && defined(__STM32F1__) // Uno Shield on BluePill +#warning Uno Shield on USE_XINGGJM_BLUEPILL +#define USES_16BIT_BUS +// tidied up for MAPLECORE and ST CORE +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOB +#define RD_PIN 13 +#define WR_PORT GPIOB +#define WR_PIN 10 +#define CD_PORT GPIOB +#define CD_PIN 12 +#define CS_PORT GPIOB +#define CS_PIN 11 +#define RESET_PORT GPIOB +#define RESET_PIN 1 + +// configure macros for the data pins +#define write_16(d) { \ + GPIOA->REGS(BSRR) = (0x81FE) << 16; \ + GPIOB->REGS(BSRR) = (0xC079) << 16; \ + GPIOA->REGS(BSRR) = 0 \ + | (((d) & (1<<3)) << 4) \ + | (((d) & (1<<4)) << 4) \ + | (((d) & (1<<5)) << 2) \ + | (((d) & (1<<6)) << 9) \ + | (((d) & (1<<7)) >> 2) \ + | (((d) & (1<<9)) >> 5) \ + | (((d) & (1<<11)) >> 8) \ + | (((d) & (1<<13)) >> 11) \ + | (((d) & (1<<15)) >> 14); \ + GPIOB->REGS(BSRR) = 0 \ + | (((d) & (1<<0)) << 14) \ + | (((d) & (1<<1)) >> 1) \ + | (((d) & (1<<2)) << 13) \ + | (((d) & (1<<8)) >> 5) \ + | (((d) & (1<<10)) >> 6) \ + | (((d) & (1<<12)) >> 7) \ + | (((d) & (1<<14)) >> 8); \ + } + +#define read_16() (((GPIOB->REGS(IDR) & (1<<14)) >> 14) \ + | ((GPIOB->REGS(IDR) & (1<<0)) << 1) \ + | ((GPIOB->REGS(IDR) & (1<<15)) >> 13) \ + | ((GPIOA->REGS(IDR) & (1<<7)) >> 4) \ + | ((GPIOB->REGS(IDR) & (1<<8)) >> 4) \ + | ((GPIOA->REGS(IDR) & (1<<6)) >> 1) \ + | ((GPIOA->REGS(IDR) & (1<<15)) >> 9) \ + | ((GPIOA->REGS(IDR) & (1<<5)) << 2) \ + | ((GPIOB->REGS(IDR) & (1<<3)) << 5) \ + | ((GPIOA->REGS(IDR) & (1<<4)) << 5) \ + | ((GPIOB->REGS(IDR) & (1<<4)) << 6) \ + | ((GPIOA->REGS(IDR) & (1<<3)) << 8) \ + | ((GPIOB->REGS(IDR) & (1<<5)) << 7) \ + | ((GPIOA->REGS(IDR) & (1<<2)) << 11) \ + | ((GPIOB->REGS(IDR) & (1<<6)) << 8) \ + | ((GPIOA->REGS(IDR) & (1<<1)) << 14))) + +// PA15,PA8 PA7-PA1 PB15,PB14 PB6-PB3,PB0 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xF000000F); GP_OUT(GPIOA, CRL, 0xFFFFFFF0); GP_OUT(GPIOB, CRH, 0xFF000000); GP_OUT(GPIOB, CRL, 0x0FFFF00F); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xF000000F); GP_INP(GPIOA, CRL, 0xFFFFFFF0); GP_INP(GPIOB, CRH, 0xFF000000); GP_INP(GPIOB, CRL, 0x0FFFF00F); } + +#define write8(x) { write16((x) & 0xFF); } +#define write16(x) { write_16(x); WRITE_DELAY; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; READ_DELAY; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// #################################### STM32 XINGGJM ####################################### +#define USE_XINGGJM_BLUEDEV +... +#elif defined(__STM32F1__) && defined(USE_XINGGJM_BLUEDEV) // Uno Shield on Blue Controller board +#warning Uno Shield on USE_XINGGJM_BLUEDEV +#define USES_16BIT_BUS +// be wise to clear all four mode bits properly. +#define GROUP_MODE(port, reg, mask, val) {port->regs->reg = (port->regs->reg & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) + +#define RD_PORT GPIOB +#define RD_PIN 13 +#define WR_PORT GPIOD +#define WR_PIN 5 +#define CD_PORT GPIOD +#define CD_PIN 11 +#define CS_PORT GPIOD +#define CS_PIN 7 +#define RESET_PORT GPIOD +#define RESET_PIN 13 + +// configure macros for the data pins +#define write_16(d) { \ + GPIOD->regs->BSRR = (0xC703) << 16; \ + GPIOE->regs->BSRR = (0xFF80) << 16; \ + GPIOD->regs->BSRR = 0 \ + | (((d) & (3<<0)) << 14) \ + | (((d) & (3<<2)) >> 2) \ + | (((d) & (7<<13)) >> 5); \ + GPIOE->regs->BSRR = 0 \ + | (((d) & (0x1FF<<4)) << 3); \ + } + +#define read_16() (((GPIOD->regs->IDR & (3<<14)) >> 14) \ + | ((GPIOD->regs->IDR & (3<<0)) << 2) \ + | ((GPIOE->regs->IDR & (0x1FF<<7)) >> 3) \ + | ((GPIOD->regs->IDR & (7<<13)) >> 5))) + +// PD15-14,PD10-8 PD1-PD0 PE15-PE8 PE7 +#define setWriteDir() {GP_OUT(GPIOD, CRH, 0xFF000FFF); GP_OUT(GPIOD, CRL, 0x000000FF); GP_OUT(GPIOE, CRH, 0xFFFFFFFF); GP_OUT(GPIOE, CRL, 0xF0000000); } +#define setReadDir() {GP_INP(GPIOD, CRH, 0xFF000FFF); GP_INP(GPIOD, CRL, 0x000000FF); GP_INP(GPIOE, CRH, 0xFFFFFFFF); GP_INP(GPIOE, CRL, 0xF0000000); } + +#define write8(x) { write16(x & 0xFF); } +#define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +#define PIN_HIGH(port, pin) (port)->regs->BSRR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->regs->BSRR = (1<<((pin)+16)) +#define PIN_LOW(port, pin) (port)->regs->ODR &= ~(1<<(pin)) +#define PIN_OUTPUT(port, pin) gpio_set_mode(port, pin, GPIO_OUTPUT_PP) //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) gpio_set_mode(port, pin, GPIO_INPUT_FLOATING) //digital input + +// ############################ STM32 BAART ##################################### +#define USE_BLUEPILL_ADAPTER +... +#elif defined(USE_BLUEPILL_ADAPTER) && defined(__STM32F1__) // Uno Shield on BLUEPILL_ADAPTER +#warning Uno Shield on USE_BLUEPILL_ADAPTER +// tidied up for MAPLECORE and ST CORE +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOB +#define RD_PIN 5 +#define WR_PORT GPIOB +#define WR_PIN 6 +#define CD_PORT GPIOB +#define CD_PIN 7 +#define CS_PORT GPIOB +#define CS_PIN 8 +#define RESET_PORT GPIOB +#define RESET_PIN 9 + +// configure macros for the data pins +// MANOLO8888's wiring scheme is far simpler: +#define write_8(d) { GPIOA->REGS(BSRR) = 0x00FF << 16; GPIOA->REGS(BSRR) = (d) & 0xFF; } +#define read_8() (GPIOA->REGS(IDR) & 0xFF) +// PA7 ..PA0 +#define setWriteDir() {GP_OUT(GPIOA, CRL, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOA, CRL, 0xFFFFFFFF); } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// ######################### STM32 PA8-15 ################### +#define USE_MAGFLIP +... +#elif defined(USE_MAGFLIP) && (defined(__STM32F1__) || defined(STM32F103xB)) // MAPLECORE or STM32CORE +#warning USE_MAGFLIP + +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 2 +#define CS_PORT GPIOA +#define CS_PIN 3 +#define RESET_PORT GPIOB +#define RESET_PIN 9 + +// configure macros for the data pins +#define write_8(d) { GPIOA->REGS(BSRR) = 0xFF00 << 16; GPIOA->REGS(BSRR) = ((d) << 8) & 0xFF00; } +#define read_8() ((GPIOA->REGS(IDR) & 0xFF00) >> 8)) +// PA15..PA8 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFFFFFFFF); } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// #################################### STM32 PIONSCOR ####################################### +#define USE_PIONSCOR_BLUEPILL +... +#elif defined(USE_PIONSCOR_BLUEPILL) && (defined(__STM32F1__) || defined(STM32F103xB)) // MAPLECORE or STM32CORE +#warning SSD1963 on USE_PIONSCOR_BLUEPILL +#define USES_16BIT_BUS +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +// +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 2 +#define CS_PORT GPIOA +#define CS_PIN 3 +#define RESET_PORT GPIOA +#define RESET_PIN 8 + +// configure macros for the data pins DB2 on PA15. All others on PB0-1, PB3-15 +#define BMASK 0xFFFB +#define write_16(d) { \ + GPIOA->REGS(BSRR) = (1<<15) << 16; \ + GPIOB->REGS(BSRR) = (BMASK) << 16; \ + GPIOA->REGS(BSRR) = ((d) & (1<<2)) << 13; \ + GPIOB->REGS(BSRR) = (d) & BMASK; \ + } + +#define read_16() ( ((GPIOA->REGS(IDR) & (1<<15)) >> 13) | (GPIOB->REGS(IDR) & BMASK) ) + +// PA15 PB15-PB8 PB7-PB3,PB1-PB0 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xF0000000); GP_OUT(GPIOB, CRH, 0xFFFFFFFF); GP_OUT(GPIOB, CRL, 0xFFFFF0FF); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xF0000000); GP_INP(GPIOB, CRH, 0xFFFFFFFF); GP_INP(GPIOB, CRL, 0xFFFFF0FF); } + +#define write8(x) { write16((x) & 0xFF); } +#define write16(x) { write_16(x); WRITE_DELAY; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; READ_DELAY; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// ######################### STM32 PB0-PB7 VADIMEL ################### +#define USE_VADIMEL_MAPLEMINI +... +#elif defined(USE_VADIMEL_MAPLEMINI) && (defined(__STM32F1__) || defined(STM32F103xB)) // MAPLECORE or STM32CORE +#warning USE_VADIMEL_MAPLEMINI + +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 2 +#define CS_PORT GPIOA +#define CS_PIN 3 +#define RESET_PORT GPIOA +#define RESET_PIN 8 + +// configure macros for the data pins +#define write_8(d) { GPIOB->REGS(BSRR) = 0x00FF << 16; GPIOB->REGS(BSRR) = ((d)) & 0x00FF; } +#define read_8() ((GPIOB->REGS(IDR) & 0x00FF)) +// PB7..PB0 +#define setWriteDir() {GP_OUT(GPIOB, CRL, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOB, CRL, 0xFFFFFFFF); } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// ######################### STM32 PB8-PB15 RAVI_KANCHAN ################### +#define USE_RAVI_KANCHAN_BLUEPILL +... +#elif defined(USE_RAVI_KANCHAN_BLUEPILL) && (defined(__STM32F1__) || defined(STM32F103xB)) // MAPLECORE or STM32CORE +#warning USE_RAVI_KANCHAN_BLUEPILL + +#if defined(ARDUINO_NUCLEO_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOA +#define RD_PIN 0 +#define WR_PORT GPIOA +#define WR_PIN 1 +#define CD_PORT GPIOA +#define CD_PIN 2 +#define CS_PORT GPIOA +#define CS_PIN 3 +#define RESET_PORT GPIOB +#define RESET_PIN 0 + +// configure macros for the data pins +#define write_8(d) { GPIOB->REGS(BSRR) = 0xFF00 << 16; GPIOB->REGS(BSRR) = ((d) << 8) & 0xFF00; } +#define read_8() ((GPIOB->REGS(IDR) & 0xFF00) >> 8) +// PB15..PB8 +#define setWriteDir() {GP_OUT(GPIOB, CRH, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOB, CRH, 0xFFFFFFFF); } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// ######################### ESP32 on TTGO D1 R32 ################### +#elif defined(ESP32) //regular UNO shield on TTGO D1 R32 (ESP32) +#define LCD_RD 2 //LED +#define LCD_WR 4 +#define LCD_RS 15 //hard-wired to A2 (GPIO35) +#define LCD_CS 33 //hard-wired to A3 (GPIO34) +#define LCD_RST 32 //hard-wired to A4 (GPIO36) + +#define LCD_D0 12 +#define LCD_D1 13 +#define LCD_D2 26 +#define LCD_D3 25 +#define LCD_D4 17 +#define LCD_D5 16 +#define LCD_D6 27 +#define LCD_D7 14 + +#define RD_PORT PORTC +#define RD_PIN LCD_RD +#define WR_PORT PORTC +#define WR_PIN LCD_WR +#define CD_PORT PORTC +#define CD_PIN LCD_RS +#define CS_PORT PORTC +#define CS_PIN LCD_CS +#define RESET_PORT PORTC +#define RESET_PIN LCD_RST + +static inline uint32_t map_8(uint32_t d) +{ + return ( + 0 + | ((d & (1 << 0)) << (LCD_D0 - 0)) + | ((d & (1 << 1)) << (LCD_D1 - 1)) + | ((d & (1 << 2)) << (LCD_D2 - 2)) + | ((d & (1 << 3)) << (LCD_D3 - 3)) + | ((d & (1 << 4)) << (LCD_D4 - 4)) + | ((d & (1 << 5)) << (LCD_D5 - 5)) + | ((d & (1 << 6)) << (LCD_D6 - 6)) + | ((d & (1 << 7)) << (LCD_D7 - 7)) + ); +} + +static inline uint8_t map_32(uint32_t d) +{ + return ( + 0 + | ((d & (1 << LCD_D0)) >> (LCD_D0 - 0)) + | ((d & (1 << LCD_D1)) >> (LCD_D1 - 1)) + | ((d & (1 << LCD_D2)) >> (LCD_D2 - 2)) + | ((d & (1 << LCD_D3)) >> (LCD_D3 - 3)) + | ((d & (1 << LCD_D4)) >> (LCD_D4 - 4)) + | ((d & (1 << LCD_D5)) >> (LCD_D5 - 5)) + | ((d & (1 << LCD_D6)) >> (LCD_D6 - 6)) + | ((d & (1 << LCD_D7)) >> (LCD_D7 - 7)) + ); +} + +static inline void write_8(uint16_t data) +{ + GPIO.out_w1tc = map_8(0xFF); //could define once as DMASK + GPIO.out_w1ts = map_8(data); +} + +static inline uint8_t read_8() +{ + return map_32(GPIO.in); +} +static void setWriteDir() +{ + pinMode(LCD_D0, OUTPUT); + pinMode(LCD_D1, OUTPUT); + pinMode(LCD_D2, OUTPUT); + pinMode(LCD_D3, OUTPUT); + pinMode(LCD_D4, OUTPUT); + pinMode(LCD_D5, OUTPUT); + pinMode(LCD_D6, OUTPUT); + pinMode(LCD_D7, OUTPUT); +} + +static void setReadDir() +{ + pinMode(LCD_D0, INPUT); + pinMode(LCD_D1, INPUT); + pinMode(LCD_D2, INPUT); + pinMode(LCD_D3, INPUT); + pinMode(LCD_D4, INPUT); + pinMode(LCD_D5, INPUT); + pinMode(LCD_D6, INPUT); + pinMode(LCD_D7, INPUT); +} + +#define WRITE_DELAY { } +#define READ_DELAY { } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (digitalWrite(b, LOW)) +#define PIN_HIGH(p, b) (digitalWrite(b, HIGH)) +#define PIN_OUTPUT(p, b) (pinMode(b, OUTPUT)) + +// ######################### ################### diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_3.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_3.h new file mode 100644 index 0000000..c4c6b43 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_3.h @@ -0,0 +1,490 @@ +//################################# SSD1289 SHIELD ####################### +#define SSD1289_JUMPERS 2 //Uno Shield with VERY different pin-out to Mcufriend +//#define USE_SSD1289_SHIELD_UNO +//#define USE_SSD1289_SHIELD_MEGA +//#define USE_SSD1289_SHIELD_DUE + +#elif defined(__AVR_ATmega328P__) && defined(USE_SSD1289_SHIELD_UNO) //on UNO +#warning using SSD1289 Shield for mega328 +#define RD_PORT PORTC +#define RD_PIN 3 +#define WR_PORT PORTC +#define WR_PIN 2 +#define CD_PORT PORTC +#define CD_PIN 1 +#define CS_PORT PORTC +#define CS_PIN 0 +#define RESET_PORT PORTB +#define RESET_PIN 1 //actually SD_CS + +// SSD1289 shield has LCD_D0 on RXD0. Fine for write-only +// For any Read operations, put jumper from D0 to D8, Switch #2 to OFF. +// If using Serial, jumper D1 to A5, Switch #1 to OFF +#if SSD1289_JUMPERS == 0 +#warning no jumpers. Switch #1=ON, #2=ON +#define BMASK 0x00 //0x00 for output, 0x01 for Read + Serial +#define CMASK 0x00 //0x20 for Read + Serial +#define DMASK (~BMASK) +#define write8(x) { PORTD = x; WR_STROBE; } +#define read_8() ( PIND ) +#elif SSD1289_JUMPERS == 1 +#warning jumper D0 to D8. Switch #1=ON, #2=OFF +#define BMASK 0x01 //0x00 for output, 0x01 for Read + Serial +#define CMASK 0x00 //0x20 for Read + Serial +#define DMASK (~BMASK) +#define write8(x) { PORTD = (PORTD & ~DMASK) | (x & DMASK); PORTB = (PORTB & ~BMASK) | (x & BMASK); WR_STROBE; } +#define read_8() ( (PIND & DMASK)|(PINB & BMASK) ) +#elif SSD1289_JUMPERS == 2 +#warning jumper D0 to D8, D1 to A5. Switch #1=OFF, #2=OFF +#define BMASK (1<<0) //0x00 for output, 0x01 for Read + Serial +#define CMASK (1<<5) //0x20 for Read + Serial +#define DMASK (0xFC) +#define write8(x) { PORTC = (PORTC & ~CMASK) | ((x<<4) & CMASK);\ + PORTD = (PORTD & ~DMASK) | (x & DMASK);\ + PORTB = (PORTB & ~BMASK) | (x & BMASK); WR_STROBE; } +#define read_8() ( ((PINC & CMASK)>>4)|(PIND & DMASK)|(PINB & BMASK) ) +#endif +#define setWriteDir() { DDRC |= CMASK; DDRD |= DMASK; DDRB |= BMASK; } +#define setReadDir() { DDRC &= ~CMASK; DDRD &= ~DMASK; DDRB &= ~BMASK; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_SSD1289_SHIELD_MEGA) //on MEGA2560 +#warning using SSD1289 Shield for mega2560 +#define RD_PORT PORTF +#define RD_PIN 3 //A3 +#define WR_PORT PORTF +#define WR_PIN 2 //A2 +#define CD_PORT PORTF +#define CD_PIN 1 //A1 +#define CS_PORT PORTF +#define CS_PIN 0 //A0 +#define RESET_PORT PORTH +#define RESET_PIN 6 //D9 DS_CS, D10=T_CS, D9=SD_CS, D8=n.c. + +// only for SSD1289 data bus on D2..D9 UNTESTED +#if (SSD1289_JUMPERS == 0) //Switch #1=ON, #2=ON +#warning no jumpers Switch #1=ON, #2=ON +#define EMASK 0x3B +#define FMASK 0x00 +#define HMASK 0x18 +#define GMASK 0x20 +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTE &= ~EMASK; \ + PORTE |= (((x) & (1<<0)) << 0); \ + PORTE |= (((x) & (1<<1)) << 0); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ +} + +#define read_8() ( ((PINE & (1<<0)) >> 0)\ + | ((PINE & (1<<1)) >> 0)\ + | ((PINE & (3<<4)) >> 2)\ + | ((PING & (1<<5)) >> 1)\ + | ((PINE & (1<<3)) << 2)\ + | ((PINH & (3<<3)) << 3)\ + ) +#elif (SSD1289_JUMPERS == 1) //jumper D0 to D8. Switch #1=ON, #2=OFF +#warning jumper D0 to D8. Switch #1=ON, #2=OFF +#define EMASK 0x3A +#define FMASK 0x00 +#define HMASK 0x38 +#define GMASK 0x20 +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTE &= ~EMASK; \ + PORTH |= (((x) & (1<<0)) << 5); \ + PORTE |= (((x) & (1<<1)) << 0); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ +} + +#define read_8() ( ((PINH & (1<<5)) >> 5)\ + | ((PINE & (1<<1)) >> 0)\ + | ((PINE & (3<<4)) >> 2)\ + | ((PING & (1<<5)) >> 1)\ + | ((PINE & (1<<3)) << 2)\ + | ((PINH & (3<<3)) << 3)\ + ) +#elif (SSD1289_JUMPERS == 2) //jumper D0 to D8, D1 to A5. Switch #1=OFF, #2=OFF +#warning jumper D0 to D8, D1 to A5. Switch #1=OFF, #2=OFF +#define FMASK 0x20 +#define EMASK 0x38 +#define HMASK 0x38 +#define GMASK 0x20 +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTF &= ~FMASK; PORTE &= ~EMASK; \ + PORTH |= (((x) & (1<<0)) << 5); \ + PORTF |= (((x) & (1<<1)) << 4); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ +} + +#define read_8() ( ((PINH & (1<<5)) >> 5)\ + | ((PINF & (1<<5)) >> 4)\ + | ((PINE & (3<<4)) >> 2)\ + | ((PING & (1<<5)) >> 1)\ + | ((PINE & (1<<3)) << 2)\ + | ((PINH & (3<<3)) << 3)\ + ) +#endif +#define setWriteDir() { DDRH |= HMASK; DDRG |= GMASK; DDRF |= FMASK; DDRE |= EMASK; } +#define setReadDir() { DDRH &= ~HMASK; DDRG &= ~GMASK; DDRF &= ~FMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__SAM3X8E__) && defined(USE_SSD1289_SHIELD_DUE) // on DUE +#warning USE_SSD1289_SHIELD_DUE +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 22 //A3 +#define WR_PORT PIOA +#define WR_PIN 23 //A2 +#define CD_PORT PIOA +#define CD_PIN 24 //A1 +#define CS_PORT PIOA +#define CS_PIN 16 //A0 +#define RESET_PORT PIOC +#define RESET_PIN 21 //D9 Touch CS +// configure macros for data bus +// only for SSD1289 data bus on D2..D9 UNTESTED +#if SSD1289_JUMPERS == 0 +#warning no jumpers Switch #1=ON, #2=ON +#define AMASK (3<<8) +#define BMASK (1<<25) +#define CMASK (0xBC << 21) +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOA->PIO_SODR = (((x) & (1<<0)) << 8); \ + PIOA->PIO_SODR = (((x) & (1<<1)) << 8); \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<3)) << 25); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<5)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ +} + +#define read_8() ( ((PIOA->PIO_PDSR & (1<<8)) >> 8)\ + | ((PIOA->PIO_PDSR & (1<<9)) >> 8)\ + | ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ + | ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#elif SSD1289_JUMPERS == 1 +#warning jumper D0 to D8. Switch #1=ON, #2=OFF +#define AMASK (1<<9) +#define BMASK (1<<25) +#define CMASK (0xBE << 21) +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOC->PIO_SODR = (((x) & (1<<0)) << 22); \ + PIOA->PIO_SODR = (((x) & (1<<1)) << 8); \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<3)) << 25); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<5)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ +} + +#define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ +| ((PIOA->PIO_PDSR & (1<<9)) >> 8)\ +| ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ +| ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ +| ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ +| ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ +| ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ +| ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ +) +#elif SSD1289_JUMPERS == 2 +#warning jumper D0 to D8, D1 to A5. Switch #1=OFF, #2=OFF +#define AMASK (1<<4) +#define BMASK (1<<25) +#define CMASK (0xBE << 21) +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOC->PIO_SODR = (((x) & (1<<0)) << 22); \ + PIOA->PIO_SODR = (((x) & (1<<1)) << 3); \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<3)) << 25); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<5)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ + | ((PIOA->PIO_PDSR & (1<<4)) >> 3)\ + | ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ + | ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#endif +#define setWriteDir() { PIOA->PIO_OER = AMASK; PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC);\ + PIOA->PIO_ODR = AMASK; PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK;\ +} +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +//##################################### USE_FRDM_K20 ################################################### +//#define USE_FRDM_K20 +#elif defined(__MK20DX128__) && defined(USE_FRDM_K20) // Uno Shield on FRDM-K20 +#warning Uno Shield on FRDM-K20 +#define RD_PORT GPIOC +#define RD_PIN 0 +#define WR_PORT GPIOC +#define WR_PIN 1 +#define CD_PORT GPIOD +#define CD_PIN 6 +#define CS_PORT GPIOD +#define CS_PIN 5 +#define RESET_PORT GPIOB +#define RESET_PIN 1 + +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<5)|(1<<2)|(1<<1)) +#define CMASK ((1<<8)|(1<<4)|(1<<3)) +#define DMASK ((1<<4)) + #define write_8(d) { \ + GPIOA_PCOR = AMASK; GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOA_PSOR = (((d) & (1<<0)) << 12) \ + | (((d) & (1<<1)) << 1) \ + | (((d) & (1<<2)) << 3) \ + | (((d) & (1<<5)) >> 4); \ + GPIOC_PSOR = (((d) & (1<<4)) << 4) \ + | (((d) & (3<<6)) >> 3); \ + GPIOD_PSOR = (((d) & (1<<3)) << 1); \ + } + #define read_8() ( (((GPIOA_PDIR & (1<<5)) >> 3) \ + | ((GPIOA_PDIR & (1<<1)) << 4) \ + | ((GPIOA_PDIR & (1<<12)) >> 12) \ + | ((GPIOA_PDIR & (1<<2)) >> 1) \ + | ((GPIOC_PDIR & (1<<8)) >> 4) \ + | ((GPIOC_PDIR & (3<<3)) << 3) \ + | ((GPIOD_PDIR & (1<<4)) >> 1))) + #define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } + #define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } + +#define write8(x) { write_8(x); WR_ACTIVE2; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE4; RD_ACTIVE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +//####################################### D21_XPRO ########################################################### +#elif defined(__SAMD21J18A__) //regular UNO shield on D21_XPRO +#warning regular UNO shield on D21_XPRO +#include "samd21.h" +// configure macros for the control pins +#define RD_PORT PORT->Group[1] +#define RD_PIN 0 +#define WR_PORT PORT->Group[1] +#define WR_PIN 1 +#define CD_PORT PORT->Group[0] +#define CD_PIN 10 +#define CS_PORT PORT->Group[0] +#define CS_PIN 11 +#define RESET_PORT PORT->Group[0] +#define RESET_PIN 8 +// configure macros for data bus +#define AMASK 0x00220000 +#define BMASK 0x0000C0E4 +#define write_8(d) { \ + PORT->Group[0].OUT.reg = (PORT->Group[0].OUT.reg & ~AMASK) \ + | (((d) & (1<<5)) << 16) \ + | (((d) & (1<<7)) << 10); \ + PORT->Group[1].OUT.reg = (PORT->Group[1].OUT.reg & ~BMASK) \ + | (((d) & (3<<0)) << 6) \ + | (((d) & (1<<2)) << 12) \ + | (((d) & (1<<3)) >> 1) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<6)) << 9); \ +} +#define read_8() ( (((PORT->Group[0].IN.reg & (1<<21)) >> 16) \ +| ((PORT->Group[0].IN.reg & (1<<17)) >> 10) \ +| ((PORT->Group[1].IN.reg & (3<<6)) >> 6) \ +| ((PORT->Group[1].IN.reg & (1<<14)) >> 12) \ +| ((PORT->Group[1].IN.reg & (1<<2)) << 1) \ +| ((PORT->Group[1].IN.reg & (1<<5)) >> 1) \ +| ((PORT->Group[1].IN.reg & (1<<15)) >> 9))) +#define setWriteDir() { \ + PORT->Group[0].DIRSET.reg = AMASK; \ + PORT->Group[1].DIRSET.reg = BMASK; \ + PORT->Group[0].WRCONFIG.reg = (AMASK>>16) | (0<<22) | (0<<28) | (1<<30) | (1<<31); \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | (0<<22) | (0<<28) | (1<<30); \ +} +#define setReadDir() { \ + PORT->Group[0].DIRCLR.reg = AMASK; \ + PORT->Group[1].DIRCLR.reg = BMASK; \ + PORT->Group[0].WRCONFIG.reg = (AMASK>>16) | (1<<17) | (0<<28) | (1<<30) | (1<<31); \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | (1<<17) | (0<<28) | (1<<30); \ +} + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) + +//###################################### TEENSY 4 BETA #################################### +#elif defined(__IMXRT1052__)// regular UNO shield on a Teensy 4.x +#warning regular UNO shield on UNKNOWN Teensy 4.0 + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST | A5 +//MXRT pin |4.16|4.17|2.7|2.6|2.5|2.4|4.11|4.10| |1.18|1.19|1.23|1.22|1.17|1.16 + +#if 0 +#elif defined(__IMXRT1052__) +#define WRITE_DELAY { WR_ACTIVE8;WR_ACTIVE8; } +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16; } +#else +#error unspecified delays +#endif + +#define RD_PORT GPIO1 +#define RD_PIN 18 +#define WR_PORT GPIO1 +#define WR_PIN 19 +#define CD_PORT GPIO1 +#define CD_PIN 23 +#define CS_PORT GPIO1 +#define CS_PIN 22 +#define RESET_PORT GPIO1 +#define RESET_PIN 17 + +// configure macros for the data pins +#define DMASK ((1<<16)|(1<<17)|(1<<11)|(1<<10)) +#define BMASK ((1<<7)|(1<<6)|(1<<5)|(1<<4)) + +#define write_8(d) { \ + GPIO4_DR_CLEAR = DMASK; GPIO2_DR_CLEAR = BMASK; \ + GPIO4_DR_SET = (((d) & (1 << 0)) << 10) \ + | (((d) & (1 << 1)) << 10) \ + | (((d) & (1 << 6)) << 11) \ + | (((d) & (1 << 7)) << 9); \ + GPIO2_DR_SET = (((d) & (1 << 2)) << 2) \ + | (((d) & (1 << 3)) << 2) \ + | (((d) & (1 << 4)) << 2) \ + | (((d) & (1 << 5)) << 2); \ + } +#define read_8() ((((GPIO4_PSR & (1 << 10)) >> 10) \ + | ((GPIO4_PSR & (1 << 11)) >> 10) \ + | ((GPIO2_PSR & (1 << 4)) >> 2) \ + | ((GPIO2_PSR & (1 << 5)) >> 2) \ + | ((GPIO2_PSR & (1 << 6)) >> 2) \ + | ((GPIO2_PSR & (1 << 7)) >> 2) \ + | ((GPIO4_PSR & (1 << 17)) >> 11) \ + | ((GPIO4_PSR & (1 << 16)) >> 9))) +#define setWriteDir() {GPIO4_GDIR |= DMASK;GPIO2_GDIR |= BMASK; } +#define setReadDir() {GPIO4_GDIR &= ~DMASK;GPIO2_GDIR &= ~BMASK; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +#define GPIO_INIT() {for (int i = 2; i <= 9; i++) pinMode(i, OUTPUT); for (int i = A0; i <= A4; i++) pinMode(i, OUTPUT);} + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _DR_CLEAR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _DR_SET) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _GDIR) |= (1<<(pin)) + +//####################################### NANO IOT 33 ############################ +#elif defined(__SAMD21G18A__) && defined(ARDUINO_SAMD_NANO_33_IOT) //regular UNO shield on NANO IOT 33 +#warning building for NANO IOT 33 +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST | +//SAMD21 pin |PA6 |PA4 |PA5 |PA7 |PB11|PB10|PA20|PA18| |PA2|PB2|PA11|PA10|PB08| +#define WRITE_DELAY { WR_ACTIVE4; } +#define IDLE_DELAY { WR_IDLE2; } +#define READ_DELAY { RD_ACTIVE8;} +// configure macros for the control pins +#define RD_PORT PORT->Group[0] //PA02 +#define RD_PIN 2 +#define WR_PORT PORT->Group[1] //PB02 +#define WR_PIN 2 +#define CD_PORT PORT->Group[0] //PA11 +#define CD_PIN 11 +#define CS_PORT PORT->Group[0] //PA10 +#define CS_PIN 10 +#define RESET_PORT PORT->Group[1] //PB08 +#define RESET_PIN 8 +// configure macros for data bus +#define AMASK ((15<<4)|(1<<18)|(1<<20)) +#define BMASK (3<<10) // +#define WRMASK ((0<<22) | (1<<28) | (1<<30)) // +#define RDMASK ((1<<17) | (1<<28) | (1<<30)) // +#define write_8(x) { \ + PORT->Group[0].OUTCLR.reg = AMASK; PORT->Group[1].OUTCLR.reg = BMASK; \ + PORT->Group[0].OUTSET.reg = \ + (((x) & (1<<0)) << 18) | (((x) & (1<<1)) << 19) | \ + (((x) & (1<<4)) << 3) | (((x) & (1<<5)) << 0) | \ + (((x) & (1<<6)) >> 2) | (((x) & (1<<7)) >> 1); \ + PORT->Group[1].OUTSET.reg = (((x) & (3<<2)) << 8); \ + } + +#define read_8() ( \ + ((PORT->Group[0].IN.reg & (1<<18)) >> 18)\ + | ((PORT->Group[0].IN.reg & (1<<20)) >> 19)\ + | ((PORT->Group[0].IN.reg & (1<<7)) >> 3)\ + | ((PORT->Group[0].IN.reg & (1<<5)) >> 0)\ + | ((PORT->Group[0].IN.reg & (1<<4)) << 2)\ + | ((PORT->Group[0].IN.reg & (1<<6)) << 1)\ + | ((PORT->Group[1].IN.reg & (3<<10)) >> 8)\ + ) +#define setWriteDir() { \ + PORT->Group[0].DIRSET.reg = AMASK; \ + PORT->Group[0].WRCONFIG.reg = (AMASK & 0xFFFF) | WRMASK; \ + PORT->Group[1].DIRSET.reg = BMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | WRMASK; \ + } +#define setReadDir() { \ + PORT->Group[0].DIRCLR.reg = AMASK; \ + PORT->Group[0].WRCONFIG.reg = (AMASK & 0xFFFF) | RDMASK; \ + PORT->Group[1].DIRCLR.reg = BMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | RDMASK; \ + } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIRSET.reg = (1<<(pin)) + +//################################################################################################################# diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_4.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_4.h new file mode 100644 index 0000000..2965ad4 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/mcufriend_special_4.h @@ -0,0 +1,188 @@ +#define SSD1289_JUMPERS 2 //Uno Shield with VERY different pin-out to Mcufriend +//#define USE_SSD1289_SHIELD_UNO +//#define USE_SSD1289_SHIELD_MEGA +#define USE_SSD1289_SHIELD_DUE //Due only works with JUMPERS==2 + +#if 0 + +//################################# SSD1289 SHIELD ####################### +// SSD1289 shield has LCD_D0 on RXD0. SD_CS=D8, T_IRQ=D9, T_CS=D10 +// This is fine for write-only operations with NO Serial. A4, A5 are available for I2C +// NOTE THAT Serial.end() IS REQUIRED FOR NO JUMPERS +// Read operations, lose I2C (on Uno) but gain Serial, Bootloader etc +// jumper D0 to A4, D1 to A5, Switch #1 to OFF, #2 to OFF +#elif defined(__AVR_ATmega328P__) && defined(USE_SSD1289_SHIELD_UNO) //on UNO +#warning using SSD1289 Shield for mega328 +#define RD_PORT PORTC +#define RD_PIN 3 +#define WR_PORT PORTC +#define WR_PIN 2 +#define CD_PORT PORTC +#define CD_PIN 1 +#define CS_PORT PORTC +#define CS_PIN 0 +#define RESET_PORT PORTB +#define RESET_PIN 1 //D9 actually T_IRQ + +#if SSD1289_JUMPERS == 0 //data bus on D0..D7 +#warning no jumpers. Switch #1=ON, #2=ON +#define BMASK 0x00 //0x00 for output, 0x01 for Read + Serial +#define CMASK 0x00 //0x20 for Read + Serial +#define DMASK 0xFF +#define write8(x) { PORTD = x; WR_STROBE; } +#define read_8() ( 0xAB ) //this shield is WRITE-ONLY +#elif SSD1289_JUMPERS == 2 +#warning jumper D0 to A4, D1 to A5. Switch #1=OFF, #2=OFF +#define BMASK 0x00 //D8 is unused now +#define CMASK ((1<<4)|(1<<5)) //A4, A5 +#define DMASK (0xFC) +#define write8(x) { PORTC = (PORTC & ~CMASK) | ((x<<4) & CMASK);\ + PORTD = (PORTD & ~DMASK) | (x & DMASK); WR_STROBE; } +#define read_8() ( ((PINC & CMASK)>>4)|(PIND & DMASK) ) +#endif +#define setWriteDir() { DDRC |= CMASK; DDRD |= DMASK; DDRB |= BMASK; } +#define setReadDir() { DDRC &= ~CMASK; DDRD &= ~DMASK; DDRB &= ~BMASK; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_SSD1289_SHIELD_MEGA) +#warning using SSD1289 Shield for mega2560 +#define RD_PORT PORTF +#define RD_PIN 3 //A3 +#define WR_PORT PORTF +#define WR_PIN 2 //A2 +#define CD_PORT PORTF +#define CD_PIN 1 //A1 +#define CS_PORT PORTF +#define CS_PIN 0 //A0 +#define RESET_PORT PORTH +#define RESET_PIN 6 //D9 (D10=T_CS, D9=T_IRQ, D8=SD_CS) + +#if (SSD1289_JUMPERS == 0) //data bus on D0..D7 +#warning no jumpers Switch #1=ON, #2=ON +#define EMASK ((1<<0)|(1<<1)|(1<<4)|(1<<5)|(1<<3)) +#define FMASK 0x00 +#define HMASK ((1<<3)|(1<<4)) +#define GMASK (1<<5) +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTF &= ~FMASK; PORTE &= ~EMASK; \ + PORTE |= (((x) & (1<<0)) << 0); \ + PORTE |= (((x) & (1<<1)) << 0); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ +} + +#define read_8() ( 0xBC ) //this shield is WRITE-ONLY + +#elif (SSD1289_JUMPERS == 2) //jumper D0 to A4, D1 to A5. Switch #1=OFF, #2=OFF +#warning jumper D0 to A4, D1 to A5. Switch #1=OFF, #2=OFF +#define EMASK ((1<<4)|(1<<5)|(1<<3)) +#define FMASK ((1<<4)|(1<<5)) +#define HMASK ((1<<3)|(1<<4)) +#define GMASK (1<<5) +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTF &= ~FMASK; PORTE &= ~EMASK; \ + PORTF |= (((x) & (1<<0)) << 4); \ + PORTF |= (((x) & (1<<1)) << 4); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ +} + +#define read_8() ( ((PINF & (1<<4)) >> 4)\ + | ((PINF & (1<<5)) >> 4)\ + | ((PINE & (3<<4)) >> 2)\ + | ((PING & (1<<5)) >> 1)\ + | ((PINE & (1<<3)) << 2)\ + | ((PINH & (3<<3)) << 3)\ + ) +#endif +#define setWriteDir() { DDRH |= HMASK; DDRG |= GMASK; DDRF |= FMASK; DDRE |= EMASK; } +#define setReadDir() { DDRH &= ~HMASK; DDRG &= ~GMASK; DDRF &= ~FMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__SAM3X8E__) && defined(USE_SSD1289_SHIELD_DUE) // on DUE +#warning USE_SSD1289_SHIELD_DUE +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 22 //A3 +#define WR_PORT PIOA +#define WR_PIN 23 //A2 +#define CD_PORT PIOA +#define CD_PIN 24 //A1 +#define CS_PORT PIOA +#define CS_PIN 16 //A0 +#define RESET_PORT PIOC +#define RESET_PIN 21 //D9 Touch_IRQ +// configure macros for data bus +#if SSD1289_JUMPERS == 0 //data bus on D0..D7 +#warning no jumpers Switch #1=ON, #2=ON +#define AMASK ((1<<8)|(1<<9)) //D0, D1 +#define BMASK (1<<25) +#define CMASK ((1<<28)|(1<<26)|(1<<25)|(1<<24)|(1<<23)) +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOA->PIO_SODR = (((x) & (1<<0)) << 8); \ + PIOA->PIO_SODR = (((x) & (1<<1)) << 8); \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<3)) << 25); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<5)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( 0xCD ) //this shield is WRITE-ONLY + +#elif SSD1289_JUMPERS == 2 //jumper D0 to A4, D1 to A5. Switch #1=OFF, #2=OFF +#warning jumper D0 to A4, D1 to A5. Switch #1=OFF, #2=OFF +#define AMASK ((1<<6)|(1<<4)) //A4, A5 +#define BMASK (1<<25) +#define CMASK ((1<<28)|(1<<26)|(1<<25)|(1<<24)|(1<<23)) +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOA->PIO_SODR = (((x) & (1<<0)) << 6); \ + PIOA->PIO_SODR = (((x) & (1<<1)) << 3); \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<3)) << 25); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<5)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( ((PIOA->PIO_PDSR & (1<<6)) >> 6)\ + | ((PIOA->PIO_PDSR & (1<<4)) >> 3)\ + | ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ + | ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#endif +#define setWriteDir() { PIOA->PIO_OER = AMASK; PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC);\ + PIOA->PIO_ODR = AMASK; PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK;\ +} +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/pagebreak.sed b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/pagebreak.sed new file mode 100644 index 0000000..923af2b --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/pagebreak.sed @@ -0,0 +1,3 @@ +# skip the PDF page footers. +/^a-.*/,/^Page.*/d +/^[0-9]+$/,/^.2010.*/d diff --git a/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/r61526_init.h b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/r61526_init.h new file mode 100644 index 0000000..9ead4f7 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/extras/unused/r61526_init.h @@ -0,0 +1,279 @@ +/* 2. HSD 2.2” Gamma 2.2 Initial Code(1/2)*/ +/*R61526 for Hannstar 2.2" Gamma 2.2*/ + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x1B, 0x08, 0x08, + TFTLCD_DELAY8, 25, + (0xC3), 0x01, 0x00, 0x1B, 0x08, 0x08, + TFTLCD_DELAY8, 25, + (0xC4), 0x21, 0x01, 0x200, 0x02, 0x00, +/*Gamma setting start*/ + (0xC8), 0x09, 0x09, 0x0B, 0x0B, 0x0F, 0x00, 0x00, 0x06, 0x15, 0x13, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x0E, 0x1D, 0x0B, 0x11, 0x0C, 0x0C, 0x03, + (0xC9), 0x09, 0x09, 0x0B, 0x0B, 0x0F, 0x00, 0x00, 0x06, 0x15, 0x13, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x0E, 0x1D, 0x0B, 0x11, 0x0C, 0x0C, 0x03, + +/* 2. HSD 2.2” Gamma 2.2 Initial Code(2/2)*/ + (0xCA), 0x09, 0x09, 0x0B, 0x0B, 0x0F, 0x00, 0x00, 0x06, 0x15, 0x13, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x0E, 0x1D, 0x0B, 0x11, 0x0C, 0x0C, 0x03, +/*Gamma setting end*/ +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x35, 0x00, 0x00, + (0xD1), 0x53, 0x7A, 0x10, + (0xD2), 0x03, 0x24, + (0xD4), 0x03, 0x24, + (0xE2), 0x3F, +/*Power setting End*/ +/*Other setting*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 30, + (0x29), +/*End Gamma 2.2 Setting*/ + +/* 2. HSD 2.2” Gamma 2.5 Initial Code(1/2)*/ +/*R61526 for Hannstar 2.2" Gamma 2.5*/ + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x1B, 0x08, 0x08, + TFTLCD_DELAY8, 25, + (0xC3), 0x01, 0x00, 0x1B, 0x08, 0x08, + TFTLCD_DELAY8, 25, + (0xC4), 0x21, 0x01, 0x300, 0x02, 0x00, +/*Gamma setting start*/ + (0xC8), 0x09, 0x09, 0x0B, 0x10, 0x09, 0x01, 0x03, 0x0A, 0x1F, 0x06, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x14, 0x18, 0x0A, 0x11, 0x0C, 0x0C, 0x03, + (0xC9), 0x09, 0x09, 0x0B, 0x10, 0x09, 0x01, 0x03, 0x0A, 0x1F, 0x06, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x14, 0x18, 0x0A, 0x11, 0x0C, 0x0C, 0x03, + +/* 2. HSD 2.2” Gamma 2.5 Initial Code(2/2)*/ + (0xCA), 0x09, 0x09, 0x0B, 0x10, 0x09, 0x01, 0x03, 0x0A, 0x1F, 0x06, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x14, 0x18, 0x0A, 0x11, 0x0C, 0x0C, 0x03, +/*Gamma setting end*/ +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x35, 0x00, 0x00, + (0xD1), 0x54, /*VCM 1B~7F*/ 0x7A, /*VDV 25~7F*/ 0x10, + (0xD2), 0x03, 0x24, + (0xD4), 0x03, 0x24, + (0xE2), 0x3F, +/*Power setting End*/ +/*Other setting*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 30, + (0x29), + + (0xB0), 0x3F, 0x3F, + (0xFE), 0x00, 0x00, 0x00, 0x21, 0xB4, + (0xB3), 0x00, 0x10, + (0xE0), 0x00, 0x40, + TFTLCD_DELAY8, 5 , + (0xB3), 0x00, 0x00, + (0xFE), 0x00, 0x00, 0x00, 0x21, 0x30, + (0xB0), 0x3F, 0x3F, + (0xB3), 0x02, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x03, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x28, 0x08, 0x08, + TFTLCD_DELAY8, 25 , + (0xC3), 0x01, 0x00, 0x28, 0x08, 0x08, + TFTLCD_DELAY8, 25 , + (0xC4), 0x11, 0x01, 0x00, 0x00, + (0xC8), /*Gamma*/ 0x0C, 0x0C, 0x0D, 0x14, 0x18, 0x0E, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x0A, 0x0E, 0x0A, 0x0A, 0x00, +/* 3. LGD 2.6” Gamma 2.2 Initial Code(1/2)*/ + + (0xC9), /*Gamma*/ 0x0C, 0x0C, 0x0D, 0x14, 0x18, 0x0E, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x0A, 0x0E, 0x0A, 0x0A, 0x00, + (0xCA), /*Gamma*/ 0x0C, 0x0C, 0x0D, 0x14, 0x18, 0x0E, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x0A, 0x0E, 0x0A, 0x0A, 0x00, + (0xD0), 0x63, 0x53, 0x82, 0x3F, + (0xD1), 0x6A, 0x64, + (0xD2), 0x03, 0x24, + (0xD4), 0x03, 0x24, + (0xE2), 0x3F, + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x55, + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40 , + (0x29), + (0x2C), +/* 3. LGD 2.6” Gamma 2.2 Initial Code(2/2)*/ + + (0xB0), 0x3F, 0x3F, + (0xFE), 0x00, 0x00, 0x00, 0x21, 0xB4, + (0xB3), 0x00, 0x10, + (0xE0), 0x00, 0x40, + TFTLCD_DELAY8, 5 , + (0xB3), 0x00, 0x00, + (0xFE), 0x00, 0x00, 0x00, 0x21, 0x30, + (0xB0), 0x3F, 0x3F, + (0xB3), 0x02, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x03, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x28, 0x08, 0x08, + TFTLCD_DELAY8, 25 , + (0xC3), 0x01, 0x00, 0x28, 0x08, 0x08, + TFTLCD_DELAY8, 25 , + (0xC4), 0x11, 0x01, 0x00, 0x00, + (0xC8), /*Gamma*/ 0x09, 0x09, 0x0B, 0x13, 0x16, 0x0C, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x09, 0x0D, 0x0C, 0x0C, 0x03, +/* 3. LGD 2.6” Gamma 2.5 Initial Code(1/2)*/ + + (0xC9), /*Gamma*/ 0x09, 0x09, 0x0B, 0x13, 0x16, 0x0C, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x09, 0x0D, 0x0C, 0x0C, 0x03, + (0xCA), /*Gamma*/ 0x09, 0x09, 0x0B, 0x13, 0x16, 0x0C, 0x09, 0x09, 0x03, 0x05, 0x00, 0x03, 0x08, 0x07, 0x0E, 0x15, 0x12, 0x09, 0x0D, 0x0C, 0x0C, 0x03, + (0xD0), 0x63, 0x53, 0x82, 0x3F, + (0xD1), 0x6A, 0x64, + (0xD2), 0x03, 0x24, + (0xD4), 0x03, 0x24, + (0xE2), 0x3F, + (0x35), 0x00, + (0x36), 0x00, + (0x3A), /*16/18 bit*/ 0x55, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40 , + (0x29), + (0x2C), +/* 3. LGD 2.6” Gamma 2.5 Initial Code(2/2)*/ + + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x24, 0x04, 0x04, + TFTLCD_DELAY8, 25, + (0xC4), 0x11, 0x01, 0x00, 0x00, 0x00, +/*Gamma setting start*/ + (0xC8), /*Gamma*/ 0x07, 0x09, 0x0A, 0x11, 0x17, 0x0A, 0x08, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x08, 0x0A, 0x17, 0x11, 0x0A, 0x09, 0x07, 0x00, + (0xC9), /*Gamma*/ 0x07, 0x09, 0x0A, 0x11, 0x17, 0x0A, 0x08, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x08, 0x0A, 0x17, 0x11, 0x0A, 0x09, 0x07, 0x00, + (0xCA), /*Gamma*/ 0x07, 0x09, 0x0A, 0x11, 0x17, 0x0A, 0x08, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x08, 0x0A, 0x17, 0x11, 0x0A, 0x09, 0x07, 0x00, +/* 4. TIAMMA 2.4” Gamma 2.2 Initial Code(1/2)*/ + +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x3A, 0x30, 0x00, + (0xD1), 0x5F, /*VCM 1B~7F*/ 0x78, /*VDV 25~7F*/ 0x10, + (0xD2), 0x03, 0x24, + (0xE2), 0x3F, +/*Power setting End*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40, + (0x29), + (0x2C), +/* 4. TIAMMA 2.4” Gamma 2.2 Initial Code(2/2)*/ + + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x24, 0x04, 0x04, + TFTLCD_DELAY8, 25, + (0xC4), 0x11, 0x01, 0x00, 0x00, 0x00, +/*Gamma setting start*/ + (0xC8), /*Gamma*/ 0x07, 0x09, 0x0A, 0x0C, 0x18, 0x0D, 0x05, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x05, 0x0D, 0x18, 0x0C, 0x0A, 0x09, 0x07, 0x00, + (0xC9), /*Gamma*/ 0x07, 0x09, 0x0A, 0x0C, 0x18, 0x0D, 0x05, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x05, 0x0D, 0x18, 0x0C, 0x0A, 0x09, 0x07, 0x00, + (0xCA), /*Gamma*/ 0x07, 0x09, 0x0A, 0x0C, 0x18, 0x0D, 0x05, 0x04, 0x07, 0x03, 0x00, 0x03, 0x07, 0x04, 0x05, 0x0D, 0x18, 0x0C, 0x0A, 0x09, 0x07, 0x00, +/* 4. TIAMMA 2.4” Gamma 2.5 Initial Code(1/2)*/ + +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x3D, 0x30, 0x00, + (0xD1), 0x5F, /*VCM 1B~7F*/ 0x78, /*VDV 25~7F*/ 0x10, + (0xD2), 0x03, 0x24, + (0xE2), 0x3F, +/*Power setting End*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40, + (0x29), + (0x2C), +/* 4. TIAMMA 2.4” Gamma 2.5 Initial Code(2/2)*/ + + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x1A, /*86Hz*/ 0x04, 0x04, + TFTLCD_DELAY8, 25, + (0xC4), 0x11, 0x01, 0x00, 0x00, 0x00, +/*Gamma setting start*/ + (0xC8), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x07, /*V4*/ 0x14, /*V8*/ 0x20, /*V20*/ 0x02, /*V43*/ 0x09, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x01, /*V63*/ 0x00, 0x01, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x09, /*V55*/ 0x02, /*V43*/ 0x20, /*V20*/ 0x14, /*V8*/ 0x07, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, + (0xC9), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x07, /*V4*/ 0x14, /*V8*/ 0x20, /*V20*/ 0x02, /*V43*/ 0x09, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x01, /*V63*/ 0x00, 0x01, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x09, /*V55*/ 0x02, /*V43*/ 0x20, /*V20*/ 0x14, /*V8*/ 0x07, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, + (0xCA), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x07, /*V4*/ 0x14, /*V8*/ 0x20, /*V20*/ 0x02, /*V43*/ 0x09, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x01, /*V63*/ 0x00, 0x01, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x09, /*V55*/ 0x02, /*V43*/ 0x20, /*V20*/ 0x14, /*V8*/ 0x07, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, +/* 5. BOE 2.0” Gamma 2.2 Initial Code(1/2)*/ + +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x3A, 0x37, 0x00, + (0xD1), 0x41, /*VCM 1B~7F*/ 0x78, /*VDV 25~7F*/ 0x10, + (0xD2), 0x03, 0x22, + (0xE2), 0x3F, +/*Power setting End*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40, + (0x29), + (0x2C), +/* 5. BOE 2.0” Gamma 2.2 Initial Code(2/2)*/ + + (0xB0), 0x3F, 0x3F, + TFTLCD_DELAY8, 5, + (0xB3), 0x02, 0x00, 0x00, 0x00, 0x00, + (0xB4), 0x00, + (0xC0), 0x33, 0x4F, 0x00, 0x10, 0xA2, 0x00, 0x01, 0x00, + (0xC1), 0x01, 0x02, 0x1A, /*86Hz*/ 0x04, 0x04, + TFTLCD_DELAY8, 25, + (0xC4), 0x11, 0x01, 0x00, 0x00, 0x00, +/*Gamma setting start*/ + (0xC8), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x05, /*V4*/ 0x11, /*V8*/ 0x31, /*V20*/ 0x01, /*V43*/ 0x0B, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x05, /*V63*/ 0x00, 0x05, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x0B, /*V55*/ 0x01, /*V43*/ 0x31, /*V20*/ 0x11, /*V8*/ 0x05, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, + (0xC9), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x05, /*V4*/ 0x11, /*V8*/ 0x31, /*V20*/ 0x01, /*V43*/ 0x0B, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x05, /*V63*/ 0x00, 0x05, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x0B, /*V55*/ 0x01, /*V43*/ 0x31, /*V20*/ 0x11, /*V8*/ 0x05, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, + (0xCA), /*GAMMA*/ 0x05, /*V0*/ 0x00, /*V1*/ 0x05, /*V4*/ 0x11, /*V8*/ 0x31, /*V20*/ 0x01, /*V43*/ 0x0B, /*V55*/ 0x00, /*V59*/ 0x01, /*V62*/ 0x05, /*V63*/ 0x00, 0x05, /*V63*/ 0x01, /*V62*/ 0x00, /*V59*/ 0x0B, /*V55*/ 0x01, /*V43*/ 0x31, /*V20*/ 0x11, /*V8*/ 0x05, /*V4*/ 0x00, /*V1*/ 0x05, /*V0*/ 0x00, +/* 5. BOE 2.0” Gamma 2.5 Initial Code(1/2)*/ + +/*Power setting start*/ + (0xD0), 0x33, 0x53, 0x85, 0x3A, 0x37, 0x00, + (0xD1), 0x5B, /*VCM 1B~7F*/ 0x78, /*VDV 25~7F*/ 0x10, + (0xD2), 0x03, 0x22, + (0xE2), 0x3F, +/*Power setting End*/ + (0x35), 0x00, + (0x36), 0x00, + (0x3A), 0x66, /*66->18 bit, 55->16bit.*/ + (0x2A), 0x00, 0x00, 0x00, 0xEF, + (0x2B), 0x00, 0x00, 0x01, 0x3F, + (0x2C), + (0x11), + TFTLCD_DELAY8, 40, + (0x29), + (0x2C), +/* 5. BOE 2.0” Gamma 2.5 Initial Code(2/2)*/ + diff --git a/Arduino/Libraries/MCUFRIEND_kbv/keywords.txt b/Arduino/Libraries/MCUFRIEND_kbv/keywords.txt new file mode 100644 index 0000000..e13ddc1 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/keywords.txt @@ -0,0 +1,67 @@ +####################################### +# Syntax Coloring Map For Mcufriend_kbv +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +MCUFRIEND_kbv KEYWORD1 +#UTFTGLUE KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +#InitLCD KEYWORD2 +#LCD_Write_DATA KEYWORD2 +WriteCmdData KEYWORD2 +begin KEYWORD2 +#clrScr KEYWORD2 +color565 KEYWORD2 +#dispBitmap KEYWORD2 +#drawBitmap KEYWORD2 +drawCircle KEYWORD2 +drawFastHLine KEYWORD2 +drawFastVLine KEYWORD2 +drawLine KEYWORD2 +drawPixel KEYWORD2 +drawRect KEYWORD2 +drawRoundRect KEYWORD2 +fillCircle KEYWORD2 +fillRect KEYWORD2 +fillRoundRect KEYWORD2 +#fillScr KEYWORD2 +fillScreen KEYWORD2 +#getDisplayXSize KEYWORD2 +#getDisplayYSize KEYWORD2 +height KEYWORD2 +invertDisplay KEYWORD2 +#lcdOff KEYWORD2 +#lcdOn KEYWORD2 +#ltoa KEYWORD2 +#print KEYWORD2 +#printNumF KEYWORD2 +#printNumI KEYWORD2 +#println KEYWORD2 +pushColors KEYWORD2 +readGRAM KEYWORD2 +readID KEYWORD2 +readPixel KEYWORD2 +readReg KEYWORD2 +readReg32 KEYWORD2 +reset KEYWORD2 +setAddrWindow KEYWORD2 +#setBackColor KEYWORD2 +#setColor KEYWORD2 +#setContrast KEYWORD2 +setCursor KEYWORD2 +#setFont KEYWORD2 +setRotation KEYWORD2 +#setrgb KEYWORD2 +setTextColor KEYWORD2 +setTextSize KEYWORD2 +#settextcursor KEYWORD2 +vertScroll KEYWORD2 +width KEYWORD2 +#write_data_block KEYWORD2 diff --git a/Arduino/Libraries/MCUFRIEND_kbv/library.properties b/Arduino/Libraries/MCUFRIEND_kbv/library.properties new file mode 100644 index 0000000..8af829b --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/library.properties @@ -0,0 +1,9 @@ +name=MCUFRIEND_kbv +version=2.9.9-Beta +author=David Prentice +maintainer=David Prentice +sentence=TFT Library for 2.4, 2.8, 3.5, 3.6, 3.95 inch mcufriend UNO Shields +paragraph=TFT Library for 2.4, 2.8, 3.5, 3.6, 3.95 inch mcufriend UNO Shields. Must have /RD pin to be readable. +category=Display +url=https://github.com/prenticedavid/MCUFRIEND_kbv +architectures=* diff --git a/Arduino/Libraries/MCUFRIEND_kbv/license.txt b/Arduino/Libraries/MCUFRIEND_kbv/license.txt new file mode 100644 index 0000000..c90cc54 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/license.txt @@ -0,0 +1,85 @@ +/* + * MCUFRIEND_kbv class inherits from Adafruit_GFX class and the Arduino Print class. + * Any use of MCUFRIEND_kbv class and examples is dependent on Adafruit and Arduino licenses + * The license texts are in the accompanying license.txt file + */ + + +ADAFRUIT: Adafruit_GFX library + +Software License Agreement (BSD License) + +Copyright (c) 2012 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- 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. + +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. + +ARDUINO: Print class +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +Software License Agreement (FreeBSD License) + +Copyright (c) 2018 David Prentice (https://github.com/prenticedavid/MCUFRIEND_kbv/) + +All rights reserved. + +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. + +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 OWNER 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. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^End^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_keil.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_keil.h new file mode 100644 index 0000000..09aabfc --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_keil.h @@ -0,0 +1,118 @@ +#ifndef MCUFRIEND_KEIL_H_ +#define MCUFRIEND_KEIL_H_ + +#if defined(USE_SERIAL) +#include "mcufriend_keil_spi.h" +#else +#include "pin_shield_1.h" //shield pin macros e.g. A2_PORT, PIN_OUTPUT() +#include "pin_shield_8.h" //macros for write_8(), read_8(), setWriteDir(), ... + +// control pins as used in MCUFRIEND shields + #define RD_PORT A0_PORT + #define RD_PIN A0_PIN + #define WR_PORT A1_PORT + #define WR_PIN A1_PIN + #define CD_PORT A2_PORT + #define CD_PIN A2_PIN + #define CS_PORT A3_PORT + #define CS_PIN A3_PIN + #define RESET_PORT A4_PORT + #define RESET_PIN A4_PIN + +// general purpose pin macros + #define RD_ACTIVE PIN_LOW(RD_PORT, RD_PIN) + #define RD_IDLE PIN_HIGH(RD_PORT, RD_PIN) + #define RD_OUTPUT PIN_OUTPUT(RD_PORT, RD_PIN) + #define WR_ACTIVE PIN_LOW(WR_PORT, WR_PIN) + #define WR_IDLE PIN_HIGH(WR_PORT, WR_PIN) + #define WR_OUTPUT PIN_OUTPUT(WR_PORT, WR_PIN) + #define CD_COMMAND PIN_LOW(CD_PORT, CD_PIN) + #define CD_DATA PIN_HIGH(CD_PORT, CD_PIN) + #define CD_OUTPUT PIN_OUTPUT(CD_PORT, CD_PIN) + #define CS_ACTIVE PIN_LOW(CS_PORT, CS_PIN) + #define CS_IDLE PIN_HIGH(CS_PORT, CS_PIN) + #define CS_OUTPUT PIN_OUTPUT(CS_PORT, CS_PIN) + #define RESET_ACTIVE PIN_LOW(RESET_PORT, RESET_PIN) + #define RESET_IDLE PIN_HIGH(RESET_PORT, RESET_PIN) + #define RESET_OUTPUT PIN_OUTPUT(RESET_PORT, RESET_PIN) + +#define WR_ACTIVE2 {WR_ACTIVE; WR_ACTIVE;} +#define WR_ACTIVE4 {WR_ACTIVE2; WR_ACTIVE2;} +#define WR_ACTIVE8 {WR_ACTIVE4; WR_ACTIVE4;} +#define RD_ACTIVE2 {RD_ACTIVE; RD_ACTIVE;} +#define RD_ACTIVE4 {RD_ACTIVE2; RD_ACTIVE2;} +#define RD_ACTIVE8 {RD_ACTIVE4; RD_ACTIVE4;} +#define RD_ACTIVE16 {RD_ACTIVE8; RD_ACTIVE8;} +#define WR_IDLE2 {WR_IDLE; WR_IDLE;} +#define WR_IDLE4 {WR_IDLE2; WR_IDLE2;} +#define RD_IDLE2 {RD_IDLE; RD_IDLE;} +#define RD_IDLE4 {RD_IDLE2; RD_IDLE2;} + +// General macros. IOCLR registers are 1 cycle when optimised. +#define WR_STROBE { WR_ACTIVE; WR_IDLE; } //PWLW=TWRL=50ns +#define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns + +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || __TARGET_ARCH_THUMB == 4 // -O2: F411@100MHz = 1.44s +//#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; } +//#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; } +#if 0 +#elif defined(MK20D5) +#warning 50Hz +#define WRITE_DELAY { } //50MHz +#define READ_DELAY { RD_ACTIVE; } +#elif defined(STM32F103xB) +#warning 72MHz +#define WRITE_DELAY { } //72MHz +#define READ_DELAY { RD_ACTIVE; } +#elif defined(STM32L476xx) +#warning 80MHz +#define WRITE_DELAY { WR_ACTIVE2; } //80MHz +#define READ_DELAY { RD_ACTIVE4; } +#elif defined(__SAM3X8E__) +#warning 84MHz +#define WRITE_DELAY { WR_ACTIVE; } //84MHz +#define READ_DELAY { RD_ACTIVE; } +#elif defined(STM32F401xE) +#warning 84MHz +#define WRITE_DELAY { WR_ACTIVE2; } //100MHz +#define READ_DELAY { RD_ACTIVE4; } +#elif defined(STM32F411xE) +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //100MHz +#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE2; } +#elif defined(STM32F446xx) +#warning 180MHz +#define WRITE_DELAY { WR_ACTIVE8; } //180MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;} +#elif defined(STM32F767xx) +#warning 216MHz +#define WRITE_DELAY { WR_ACTIVE8; WR_ACTIVE8; } //216MHz +#define IDLE_DELAY { WR_IDLE4;WR_IDLE4; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16;RD_ACTIVE16;} +#elif defined(STM32H743xx) //STM32H743 GPIO needs testing +#define WRITE_DELAY { WR_ACTIVE8;WR_ACTIVE2; } //F_CPU=400MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16;RD_ACTIVE4;} +#else +#error check specific STM32 +#endif +#elif defined(__ARM_ARCH_6M__) // -O2: F072@48MHz = 5.03s +#define WRITE_DELAY { } +#define READ_DELAY { } +#endif + +#ifndef IDLE_DELAY +#define IDLE_DELAY { WR_IDLE; } +#endif + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } // read 250ns after RD_ACTIVE goes low +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define CTL_INIT() { RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } +#define WriteCmd(x) { CD_COMMAND; write16(x); CD_DATA; } +#define WriteData(x) { write16(x); } + +#endif //!USE_SERIAL +#endif //MCUFRIEND_KEIL_H_ diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_mbed.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_mbed.h new file mode 100644 index 0000000..2d7fae6 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_mbed.h @@ -0,0 +1,100 @@ +#ifndef MCUFRIEND_MBED_H_ +#define MCUFRIEND_MBED_H_ + +#include + +#if defined(USE_SERIAL) +#include "mcufriend_keil_spi.h" +#else + +BusOut digitalL(D0, D1, D2, D3, D4, D5, D6, D7); +BusOut digitalH(D8, D9, D10, D11, D12, D13, NC, NC); +BusOut analog(A0, A1, A2, A3, A4, A5, NC, NC); + +#include "pin_shield_1.h" //shield pin macros e.g. A2_PORT, PIN_OUTPUT() +#include "pin_shield_8.h" //macros for write_8(), read_8(), setWriteDir(), ... + +// control pins as used in MCUFRIEND shields + #define RD_PORT A0_PORT + #define RD_PIN A0_PIN + #define WR_PORT A1_PORT + #define WR_PIN A1_PIN + #define CD_PORT A2_PORT + #define CD_PIN A2_PIN + #define CS_PORT A3_PORT + #define CS_PIN A3_PIN + #define RESET_PORT A4_PORT + #define RESET_PIN A4_PIN + +// general purpose pin macros + #define RD_ACTIVE PIN_LOW(RD_PORT, RD_PIN) + #define RD_IDLE PIN_HIGH(RD_PORT, RD_PIN) + #define RD_OUTPUT PIN_OUTPUT(RD_PORT, RD_PIN) + #define WR_ACTIVE PIN_LOW(WR_PORT, WR_PIN) + #define WR_IDLE PIN_HIGH(WR_PORT, WR_PIN) + #define WR_OUTPUT PIN_OUTPUT(WR_PORT, WR_PIN) + #define CD_COMMAND PIN_LOW(CD_PORT, CD_PIN) + #define CD_DATA PIN_HIGH(CD_PORT, CD_PIN) + #define CD_OUTPUT PIN_OUTPUT(CD_PORT, CD_PIN) + #define CS_ACTIVE PIN_LOW(CS_PORT, CS_PIN) + #define CS_IDLE PIN_HIGH(CS_PORT, CS_PIN) + #define CS_OUTPUT PIN_OUTPUT(CS_PORT, CS_PIN) + #define RESET_ACTIVE PIN_LOW(RESET_PORT, RESET_PIN) + #define RESET_IDLE PIN_HIGH(RESET_PORT, RESET_PIN) + #define RESET_OUTPUT PIN_OUTPUT(RESET_PORT, RESET_PIN) + +#define WR_ACTIVE2 {WR_ACTIVE; WR_ACTIVE;} +#define WR_ACTIVE4 {WR_ACTIVE2; WR_ACTIVE2;} +#define WR_ACTIVE8 {WR_ACTIVE4; WR_ACTIVE4;} +#define RD_ACTIVE2 {RD_ACTIVE; RD_ACTIVE;} +#define RD_ACTIVE4 {RD_ACTIVE2; RD_ACTIVE2;} +#define RD_ACTIVE8 {RD_ACTIVE4; RD_ACTIVE4;} +#define RD_ACTIVE16 {RD_ACTIVE8; RD_ACTIVE8;} +#define WR_IDLE2 {WR_IDLE; WR_IDLE;} +#define WR_IDLE4 {WR_IDLE2; WR_IDLE2;} +#define RD_IDLE2 {RD_IDLE; RD_IDLE;} +#define RD_IDLE4 {RD_IDLE2; RD_IDLE2;} + +#if defined(__MK20DX128__) || defined(___MK20DX256__) // Teensy3.0 || 3.2 96MHz +#define WRITE_DELAY { WR_ACTIVE2; } +#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE; } +#elif defined(__MK64FX512__) || defined(TARGET_M4) // Teensy3.5 120MHz thanks to PeteJohno +#define WRITE_DELAY { WR_ACTIVE4; } +#define READ_DELAY { RD_ACTIVE8; } +#elif defined(__MK66FX1M0__) || defined(TARGET_M4) // Teensy3.6 180MHz untested. delays can possibly be reduced. +#define WRITE_DELAY { WR_ACTIVE8; } +#define READ_DELAY { RD_ACTIVE8; RD_ACTIVE8; } +#elif defined(TARGET_M7) // Nucleo-F767 216MHz untested. delays can possibly be reduced. +#define WRITE_DELAY { WR_ACTIVE8; WR_ACTIVE2; } +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16; RD_ACTIVE16; RD_ACTIVE4; } +#define READ_IDLE { RD_IDLE2;RD_IDLE; } +#else +//#error unspecified delays +//#define WRITE_DELAY { WR_ACTIVE2; } +//#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE; } +#define WRITE_DELAY +#define READ_DELAY +#endif + +#if !defined(IDLE_DELAY) +#define IDLE_DELAY WR_IDLE +#endif +#if !defined(READ_IDLE) +#define READ_IDLE RD_IDLE +#endif + +// General macros. IOCLR registers are 1 cycle when optimised. +#define WR_STROBE { WR_ACTIVE; WR_IDLE; } //PWLW=TWRL=50ns +#define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns +#define write8(d) { write_8(d); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } // STROBEs are defined later +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); READ_IDLE; } // read 250ns after RD_ACTIVE goes low +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define CTL_INIT() { RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } +#define WriteCmd(x) { CD_COMMAND; write16(x); CD_DATA; } +#define WriteData(x) { write16(x); } + +#endif //!USE_SERIAL +#endif //MCUFRIEND_KEIL_H_ diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_serial.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_serial.h new file mode 100644 index 0000000..93720ec --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_serial.h @@ -0,0 +1,243 @@ +#if ARDUINO >= 165 +#include +#endif + +#if 0 +#elif defined(__AVR_ATmega328P__) + +#define SPI_INIT() { DDRB |= (1<<5)|(1<<3)|(1<<2); SPCR = (1<>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { dst = xchg8(0); } +#define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) +#elif defined(__SAMD21G18A__) + +#define SPI_INIT() { SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(6); } + +#define CD_PORT PORT->Group[0] +#define CD_PIN 7 +#define CS_PORT PORT->Group[0] +#define CS_PIN 18 +#define RESET_PORT PORT->Group[0] +#define RESET_PIN 6 +#define RD_IDLE +#define WR_IDLE + + +uint8_t running; +static inline void write8(uint8_t c) +{ + running = 1; + while( SERCOM1->SPI.INTFLAG.bit.DRE == 0) ; + SERCOM1->SPI.DATA.bit.DATA = c; // Writing data into Data register +} + +static inline void flush(void) +{ + if (running) while( SERCOM1->SPI.INTFLAG.bit.TXC == 0) ; + running = 0; +} + +static inline uint8_t xchg8(uint8_t c) +{ +// flush(); + while( SERCOM1->SPI.INTFLAG.bit.RXC != 0) SERCOM1->SPI.DATA.bit.DATA; //eat up + while( SERCOM1->SPI.INTFLAG.bit.DRE == 0) ; + SERCOM1->SPI.DATA.bit.DATA = c; // Writing data into Data register + while( SERCOM1->SPI.INTFLAG.bit.RXC == 0) ; + return SERCOM1->SPI.DATA.bit.DATA; +} + + +#define setWriteDir() { } +#define setReadDir() { } +//#define flush() +//#define write8(x) xchg8(x) +//#define xchg8(x) SPI.transfer(x) +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { dst = xchg8(0); } +#define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) + +#elif defined(__AVR_ATxmega128A1__) //3.49s @ 32MHz -O2 + #define CD_PORT VPORT2 + #define CD_PIN 1 + #define CS_PORT VPORT3 + #define CS_PIN 4 + #define RESET_PORT VPORT2 + #define RESET_PIN 0 +#define SPCRVAL (USART_CLK2X_bm | USART_RXEN_bm | USART_TXEN_bm) +#define SETDDR {VPORT3.DIR |= (1<<4)|(1<<5)|(1<<7); VPORT2.DIR |= 0x03; } +#define SPI_INIT() { PORTCFG.VPCTRLB=PORTCFG_VP3MAP_PORTF_gc | PORTCFG_VP2MAP_PORTC_gc; CS_IDLE; RESET_IDLE; SETDDR; spi_init(); } + +void spi_init(void) +{ + SPIF.CTRL=SPI_ENABLE_bm | SPI_MODE_3_gc | (1<>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { dst = xchg8(0); } +#define READ_16(dst) { dst = xchg8(0); dst = (dst << 8) | xchg8(0); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +#endif + +#define CD_COMMAND {flush(); PIN_LOW(CD_PORT, CD_PIN); } +#define CD_DATA {flush(); PIN_HIGH(CD_PORT, CD_PIN); } +#define CD_OUTPUT PIN_OUTPUT(CD_PORT, CD_PIN) +#define CS_ACTIVE PIN_LOW(CS_PORT, CS_PIN) +#define CS_IDLE {flush(); PIN_HIGH(CS_PORT, CS_PIN); } +#define CS_OUTPUT PIN_OUTPUT(CS_PORT, CS_PIN) +#define RESET_ACTIVE PIN_LOW(RESET_PORT, RESET_PIN) +#define RESET_IDLE PIN_HIGH(RESET_PORT, RESET_PIN) +#define RESET_OUTPUT PIN_OUTPUT(RESET_PORT, RESET_PIN) + +// General macros. IOCLR registers are 1 cycle when optimised. + +#define CTL_INIT() { CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; SPI_INIT(); } +#define WriteCmd(x) { CD_COMMAND; write8(x); } +#define WriteData(x) { CD_DATA; write16(x); } diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_shield.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_shield.h new file mode 100644 index 0000000..a240381 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_shield.h @@ -0,0 +1,1113 @@ +//#define USE_SPECIAL //check for custom drivers + +#define WR_ACTIVE2 {WR_ACTIVE; WR_ACTIVE;} +#define WR_ACTIVE4 {WR_ACTIVE2; WR_ACTIVE2;} +#define WR_ACTIVE8 {WR_ACTIVE4; WR_ACTIVE4;} +#define RD_ACTIVE2 {RD_ACTIVE; RD_ACTIVE;} +#define RD_ACTIVE4 {RD_ACTIVE2; RD_ACTIVE2;} +#define RD_ACTIVE8 {RD_ACTIVE4; RD_ACTIVE4;} +#define RD_ACTIVE16 {RD_ACTIVE8; RD_ACTIVE8;} +#define WR_IDLE2 {WR_IDLE; WR_IDLE;} +#define WR_IDLE4 {WR_IDLE2; WR_IDLE2;} +#define RD_IDLE2 {RD_IDLE; RD_IDLE;} +#define RD_IDLE4 {RD_IDLE2; RD_IDLE2;} + +#if defined(USE_SPECIAL) +#include "mcufriend_special.h" +#if !defined(USE_SPECIAL_FAIL) +#warning WE ARE USING A SPECIAL CUSTOM DRIVER +#endif +#endif +#if !defined(USE_SPECIAL) || defined (USE_SPECIAL_FAIL) + +#if 0 +//################################### UNO ############################## +#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) //regular UNO shield on UNO +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 4 + +#define BMASK 0x03 //more intuitive style for mixed Ports +#define DMASK 0xFC //does exactly the same as previous +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) & BMASK); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( (PINB & BMASK) | (PIND & DMASK) ) +#define setWriteDir() { DDRB |= BMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################### MEGA2560 ############################## +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) //regular UNO shield on MEGA2560 +#define RD_PORT PORTF +#define RD_PIN 0 +#define WR_PORT PORTF +#define WR_PIN 1 +#define CD_PORT PORTF +#define CD_PIN 2 +#define CS_PORT PORTF +#define CS_PIN 3 +#define RESET_PORT PORTF +#define RESET_PIN 4 + +#define EMASK 0x38 +#define GMASK 0x20 +#define HMASK 0x78 +#define write_8(x) { PORTH &= ~HMASK; PORTG &= ~GMASK; PORTE &= ~EMASK; \ + PORTH |= (((x) & (3<<0)) << 5); \ + PORTE |= (((x) & (3<<2)) << 2); \ + PORTG |= (((x) & (1<<4)) << 1); \ + PORTE |= (((x) & (1<<5)) >> 2); \ + PORTH |= (((x) & (3<<6)) >> 3); \ + } + +#define read_8() ( ((PINH & (3<<5)) >> 5)\ + | ((PINE & (3<<4)) >> 2)\ + | ((PING & (1<<5)) >> 1)\ + | ((PINE & (1<<3)) << 2)\ + | ((PINH & (3<<3)) << 3)\ + ) +#define setWriteDir() { DDRH |= HMASK; DDRG |= GMASK; DDRE |= EMASK; } +#define setReadDir() { DDRH &= ~HMASK; DDRG &= ~GMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################### MEGA4809 NANO_EVERY 4808 ############################## +#elif defined(__AVR_ATmega4808__) // Thinary EVERY-4808 with Nano-Shield_Adapter +#warning EVERY-4808 with Nano-Shield_Adapter +#define RD_PORT VPORTD // +#define RD_PIN 0 +#define WR_PORT VPORTD +#define WR_PIN 1 +#define CD_PORT VPORTD +#define CD_PIN 2 +#define CS_PORT VPORTD +#define CS_PIN 3 +#define RESET_PORT VPORTF +#define RESET_PIN 2 + +#define AMASK 0xFF +#define write_8(x) { VPORTA.OUT = ((x) << 6) | ((x) >> 2); } +#define read_8() ( (VPORTA.IN >> 6) | (VPORTA.IN << 2) ) +#define setWriteDir() { VPORTA_DIR |= AMASK; } +#define setReadDir() { VPORTA_DIR &= ~AMASK; } + +//#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } //6.47s no_inline +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=5.43s @20MHz always_inline. (-O1=5.41s, -O3=5.25s) +#define READ_DELAY { RD_ACTIVE4; } //ID=0x7789 +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +//########################## MEGA4809 NANO_EVERY or UNO_WIFI_REV2 ############################## +#elif defined(__AVR_ATmega4809__) && (defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)) +#if defined(ARDUINO_AVR_NANO_EVERY) +#warning EVERY-4809 with Nano-Shield_Adapter using VPORT.OUT and BLD/BST +#define RD_PORT VPORTD // +#define RD_PIN 3 +#define WR_PORT VPORTD +#define WR_PIN 2 +#define CD_PORT VPORTD +#define CD_PIN 1 +#define CS_PORT VPORTD +#define CS_PIN 0 +#define RESET_PORT VPORTF +#define RESET_PIN 2 +#elif defined(ARDUINO_AVR_UNO_WIFI_REV2) +#warning UNO_WIFI_REV2 using VPORT.OUT and BLD/BST +#define RD_PORT VPORTD // +#define RD_PIN 0 +#define WR_PORT VPORTD +#define WR_PIN 1 +#define CD_PORT VPORTD +#define CD_PIN 2 +#define CS_PORT VPORTD +#define CS_PIN 3 +#define RESET_PORT VPORTD +#define RESET_PIN 4 +#endif + +#define AMASK (3<<0) +#define BMASK (5<<0) +#define CMASK (1<<6) +#define EMASK (1<<3) +#define FMASK (3<<4) +static __attribute((always_inline)) +void write_8(uint8_t val) +{ + asm volatile("in __tmp_reg__,0x01" "\n\t" //VPORTA.OUT + "BST %0,2" "\n\t" "BLD __tmp_reg__,0" "\n\t" + "BST %0,7" "\n\t" "BLD __tmp_reg__,1" "\n\t" + "out 0x01,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x05" "\n\t" //VPORTB.OUT + "BST %0,1" "\n\t" "BLD __tmp_reg__,0" "\n\t" + "BST %0,5" "\n\t" "BLD __tmp_reg__,2" "\n\t" + "out 0x05,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x09" "\n\t" //VPORTC.OUT + "BST %0,4" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "out 0x09,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x11" "\n\t" //VPORTE.OUT + "BST %0,0" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "out 0x11,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x15" "\n\t" //VPORTF.OUT + "BST %0,3" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "BST %0,6" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "out 0x15,__tmp_reg__" : : "a" (val)); +} + +#define read_8() ( 0 \ + | ((VPORTA_IN & (1<<0)) << 2)\ + | ((VPORTA_IN & (1<<1)) << 6)\ + | ((VPORTB_IN & (1<<0)) << 1)\ + | ((VPORTB_IN & (1<<2)) << 3)\ + | ((VPORTC_IN & CMASK) >> 2)\ + | ((VPORTE_IN & EMASK) >> 3)\ + | ((VPORTF_IN & (1<<5)) >> 2)\ + | ((VPORTF_IN & (1<<4)) << 2)\ + ) +#define setWriteDir() { VPORTA_DIR |= AMASK; VPORTB_DIR |= BMASK; VPORTC_DIR |= CMASK; VPORTE_DIR |= EMASK; VPORTF_DIR |= FMASK; } +#define setReadDir() { VPORTA_DIR &= ~AMASK; VPORTB_DIR &= ~BMASK; VPORTC_DIR &= ~CMASK; VPORTE_DIR &= ~EMASK; VPORTF_DIR &= ~FMASK; } + +//#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } //6.47s no_inline +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=5.43s @20MHz always_inline. (-O1=5.41s, -O3=5.25s) +#define READ_DELAY { RD_ACTIVE4; } //ID=0x7789 +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +//################################### TEENSY++2.0 ############################## +#elif defined(__AVR_AT90USB1286__) //regular UNO shield on TEENSY++ 2.0 thanks tysonlt + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| +//AVR pin |PD7|PD6|PD5|PD4|PD3|PD2|PE1|PE0| |PF0|PF1|PF2|PF3|PF4| + +#define RD_PORT PORTF +#define RD_PIN 0 +#define WR_PORT PORTF +#define WR_PIN 1 +#define CD_PORT PORTF +#define CD_PIN 2 +#define CS_PORT PORTF +#define CS_PIN 3 +#define RESET_PORT PORTF +#define RESET_PIN 4 + +#define EMASK 0x03 //more intuitive style for mixed Ports +#define DMASK 0xFC //does exactly the same as previous +#define write_8(x) { PORTE = (PORTE & ~EMASK) | ((x) & EMASK); PORTD = (PORTD & ~DMASK) | ((x) & DMASK); } +#define read_8() ( (PINE & EMASK) | (PIND & DMASK) ) +#define setWriteDir() { DDRE |= EMASK; DDRD |= DMASK; } +#define setReadDir() { DDRE &= ~EMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################# ZERO and M0_PRO ############################ +#elif defined(__SAMD21G18A__) //regular UNO shield on ZERO or M0_PRO +#include "sam.h" + // configure macros for the control pins +#define RD_PORT PORT->Group[0] +#define RD_PIN 2 +#define WR_PORT PORT->Group[1] +#define WR_PIN 8 +#define CD_PORT PORT->Group[1] +#define CD_PIN 9 +#define CS_PORT PORT->Group[0] +#define CS_PIN 4 +#define RESET_PORT PORT->Group[0] +#define RESET_PIN 5 + // configure macros for data bus +#define DMASK 0x0030C3C0 + // #define write_8(x) PORT->Group[0].OUT.reg = (PORT->Group[0].OUT.reg & ~DMASK)|(((x) & 0x0F) << 6)|(((x) & 0x30) << 10)|(((x) & 0xC0)<<14) +#if defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAMD_ZERO) // American ZERO +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST | +//SAMD21 pin |PA21|PA20|PA15|PB8 |PB9 |PA14|PA7 |PA6 | |PA2|PB8|PB9 |PA4 |PA5 | +#define write_8(x) {\ + PORT->Group[0].OUTCLR.reg = DMASK;\ + PORT->Group[0].OUTSET.reg = (((x) & 0x0B) << 6)\ + |(((x) & (1<<2)) << 12)\ + |(((x) & (1<<4)) << 4)\ + |(((x) & (1<<5)) << 10)\ + |(((x) & 0xC0) << 14);\ + } +#define read_8() (((PORT->Group[0].IN.reg >> 6) & 0x0B)\ + |((PORT->Group[0].IN.reg >> 12) & (1<<2))\ + |((PORT->Group[0].IN.reg >> 4) & (1<<4))\ + |((PORT->Group[0].IN.reg >> 10) & (1<<5))\ + |((PORT->Group[0].IN.reg >> 14) & 0xC0)) +#else //default to an M0_PRO on v1.6.5 or 1.7.6 +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST | +//SAMD21 pin |PA21|PA20|PA15|PA14|PB9 |PB8 |PA7 |PA6 | |PA2|PB8|PB9 |PA4 |PA5 | +#define write_8(x) {\ + PORT->Group[0].OUTCLR.reg = DMASK;\ + PORT->Group[0].OUTSET.reg = (((x) & 0x0F) << 6)\ + |(((x) & 0x30) << 10)\ + |(((x) & 0xC0) << 14);\ + } +#define read_8() (((PORT->Group[0].IN.reg >> 6) & 0x0F)|((PORT->Group[0].IN.reg >> 10) & 0x30)|((PORT->Group[0].IN.reg >> 14) & 0xC0)) +#endif +#define setWriteDir() { PORT->Group[0].DIRSET.reg = DMASK; \ + PORT->Group[0].WRCONFIG.reg = (DMASK & 0xFFFF) | (0<<22) | (1<<28) | (1<<30); \ + PORT->Group[0].WRCONFIG.reg = (DMASK>>16) | (0<<22) | (1<<28) | (1<<30) | (1<<31); \ + } +#define setReadDir() { PORT->Group[0].DIRCLR.reg = DMASK; \ + PORT->Group[0].WRCONFIG.reg = (DMASK & 0xFFFF) | (1<<17) | (1<<28) | (1<<30); \ + PORT->Group[0].WRCONFIG.reg = (DMASK>>16) | (1<<17) | (1<<28) | (1<<30) | (1<<31); \ + } +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + // Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) + +//####################################### GRAND CENTRAL M4 ############################ +#elif defined(__SAMD51P20A__) //regular UNO shield on GRAND CENTRAL M4 +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| +//SAMD51 pin |PD21|PD20|PC21|PC20|PC19|PC18|PB2|PB18| |PA2|PA5|PB3|PC0|PC1| +#define WRITE_DELAY { WR_ACTIVE4; } +#define IDLE_DELAY { WR_IDLE2; } +#define READ_DELAY { RD_ACTIVE8;} + // configure macros for the control pins +#define RD_PORT PORT->Group[0] +#define RD_PIN 2 +#define WR_PORT PORT->Group[0] +#define WR_PIN 5 +#define CD_PORT PORT->Group[1] +#define CD_PIN 3 +#define CS_PORT PORT->Group[2] +#define CS_PIN 0 +#define RESET_PORT PORT->Group[2] +#define RESET_PIN 1 + // configure macros for data bus +#define BMASK ((1<<18)|(1<<2)) //BMASK has bits in H and L for WRCONFIG +#define CMASK (0x0F << 18) //CMASK only has bits in H +#define DMASK (0x03 << 20) +#define WRMASK ((0<<22) | (1<<28) | (1<<30)) // +#define RDMASK ((1<<17) | (1<<28) | (1<<30)) // +#define write_8(x) { PORT->Group[1].OUTCLR.reg = BMASK; PORT->Group[2].OUTCLR.reg = CMASK; PORT->Group[3].OUTCLR.reg = DMASK; \ + PORT->Group[1].OUTSET.reg = (((x) & (1<<0)) << 18) | (((x) & (1<<1)) << 1); \ + PORT->Group[2].OUTSET.reg = (((x) & (15<<2)) << 16); \ + PORT->Group[3].OUTSET.reg = (((x) & (3<<6)) << 14); \ + } + +#define read_8() ( ((PORT->Group[1].IN.reg & (1<<18)) >> 18)\ + | ((PORT->Group[1].IN.reg & (1<<2)) >> 1)\ + | ((PORT->Group[2].IN.reg & (15<<18)) >> 16)\ + | ((PORT->Group[3].IN.reg & (3<<20)) >> 14)\ + ) +#define setWriteDir() { \ + PORT->Group[1].DIRSET.reg = BMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | WRMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK >> 16) | WRMASK | (1<<31); \ + PORT->Group[2].DIRSET.reg = CMASK; \ + PORT->Group[2].WRCONFIG.reg = (CMASK >> 16) | WRMASK | (1<<31); \ + PORT->Group[3].DIRSET.reg = DMASK; \ + PORT->Group[3].WRCONFIG.reg = (DMASK >> 16) | WRMASK | (1<<31); \ + } +#define setReadDir() { \ + PORT->Group[1].DIRCLR.reg = BMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK & 0xFFFF) | RDMASK; \ + PORT->Group[1].WRCONFIG.reg = (BMASK >> 16) | RDMASK | (1<<31); \ + PORT->Group[2].DIRCLR.reg = CMASK; \ + PORT->Group[2].WRCONFIG.reg = (CMASK >> 16) | RDMASK | (1<<31); \ + PORT->Group[3].DIRCLR.reg = DMASK; \ + PORT->Group[3].WRCONFIG.reg = (DMASK >> 16) | RDMASK | (1<<31); \ + } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + + // Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIRSET.reg = (1<<(pin)) + +//####################################### DUE ############################ +#elif defined(__SAM3X8E__) //regular UNO shield on DUE +#define WRITE_DELAY { WR_ACTIVE; } +#define IDLE_DELAY { WR_IDLE; } +#define READ_DELAY { RD_ACTIVE;} + // configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 16 +#define WR_PORT PIOA +#define WR_PIN 24 +#define CD_PORT PIOA +#define CD_PIN 23 +#define CS_PORT PIOA +#define CS_PIN 22 +#define RESET_PORT PIOA +#define RESET_PIN 6 + // configure macros for data bus +#define BMASK (1<<25) +#define CMASK (0xBF << 21) +#define write_8(x) { PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<0)) << 22) \ + | (((x) & (1<<1)) << 20) \ + | (((x) & (1<<3)) << 25) \ + | (((x) & (1<<4)) << 22) \ + | (((x) & (1<<5)) << 20) \ + | (((x) & (1<<6)) << 18) \ + | (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<21)) >> 20)\ + | ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ + | ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#define setWriteDir() { PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOB)|(1 << ID_PIOC);\ + PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK;\ + } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + + // Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +//################################### LEONARDO ############################## +#elif defined(__AVR_ATmega32U4__) //regular UNO shield on Leonardo +#define RD_PORT PORTF +#define RD_PIN 7 +#define WR_PORT PORTF +#define WR_PIN 6 +#define CD_PORT PORTF +#define CD_PIN 5 +#define CS_PORT PORTF +#define CS_PIN 4 +#define RESET_PORT PORTF +#define RESET_PIN 1 + +#define BMASK (3<<4) +#define CMASK (1<<6) +#define DMASK ((1<<7)|(1<<4)|(3<<0)) +#define EMASK (1<<6) +static inline //hope we use r24 +void write_8(uint8_t x) +{ + PORTB &= ~BMASK; + PORTC &= ~CMASK; + PORTD &= ~DMASK; + PORTE &= ~EMASK; + PORTB |= (((x) & (3 << 0)) << 4); + PORTD |= (((x) & (1 << 2)) >> 1); + PORTD |= (((x) & (1 << 3)) >> 3); + PORTD |= (((x) & (1 << 4)) << 0); + PORTC |= (((x) & (1 << 5)) << 1); + PORTD |= (((x) & (1 << 6)) << 1); + PORTE |= (((x) & (1 << 7)) >> 1); +} + +#define read_8() ( ((PINB & (3<<4)) >> 4)\ +| ((PIND & (1<<1)) << 1)\ +| ((PIND & (1<<0)) << 3)\ +| ((PIND & (1<<4)) >> 0)\ +| ((PINC & (1<<6)) >> 1)\ +| ((PIND & (1<<7)) >> 1)\ +| ((PINE & (1<<6)) << 1)\ +) +#define setWriteDir() { DDRB |= BMASK; DDRC |= CMASK; DDRD |= DMASK; DDRE |= EMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRC &= ~CMASK; DDRD &= ~DMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//################################### UNO SHIELD on BOBUINO ############################## +#elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__) //UNO shield on BOBUINO +#warning regular UNO shield on BOBUINO + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| +//AVR pin |PB3|PB2|PB1|PB0|PD3|PD2|PD6|PD5| |PA7|PA6|PA5|PA4|PA3| + +#define RD_PORT PORTA +#define RD_PIN 7 +#define WR_PORT PORTA +#define WR_PIN 6 +#define CD_PORT PORTA +#define CD_PIN 5 +#define CS_PORT PORTA +#define CS_PIN 4 +#define RESET_PORT PORTA +#define RESET_PIN 3 + +#define BMASK 0x0F // +#define DMASK 0x6C // +#define write_8(x) { PORTB = (PORTB & ~BMASK) | ((x) >> 4); \ + PORTD = (PORTD & ~DMASK) | ((x) & 0x0C) | (((x) & 0x03) << 5); } +#define read_8() ( (PINB << 4) | (PIND & 0x0C) | ((PIND & 0x60) >> 5) ) +#define setWriteDir() { DDRB |= BMASK; DDRD |= DMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRD &= ~DMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +//####################################### TEENSY 4.0 ############################ +#elif defined(__IMXRT1062__) // regular UNO shield on a Teensy 4.x +#warning regular UNO shield on a Teensy 4.0 + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST | A5 +//MXRT pin |7.17|7.10|9.8|9.6|9.5|9.4|7.11|7.16| |6.18|6.19|6.23|6.22|6.17|6.16 + +#if 0 +#elif defined(__IMXRT1062__) +#define WRITE_DELAY { WR_ACTIVE8;WR_ACTIVE8; } +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16; } +#else +#error unspecified delays +#endif + +#define RD_PORT GPIO6 +#define RD_PIN 18 +#define WR_PORT GPIO6 +#define WR_PIN 19 +#define CD_PORT GPIO6 +#define CD_PIN 23 +#define CS_PORT GPIO6 +#define CS_PIN 22 +#define RESET_PORT GPIO6 +#define RESET_PIN 17 + +// configure macros for the data pins +#define GMASK ((1<<17)|(1<<10)|(1<<11)|(1<<16)) +#define IMASK ((1<<8)|(1<<6)|(1<<5)|(1<<4)) + +#define write_8(d) { \ + GPIO7_DR_CLEAR = GMASK; GPIO9_DR_CLEAR = IMASK; \ + GPIO7_DR_SET = (((d) & (1 << 0)) << 16) \ + | (((d) & (1 << 1)) << 10) \ + | (((d) & (1 << 6)) << 4) \ + | (((d) & (1 << 7)) << 10); \ + GPIO9_DR_SET = (((d) & (1 << 2)) << 2) \ + | (((d) & (1 << 3)) << 2) \ + | (((d) & (1 << 4)) << 2) \ + | (((d) & (1 << 5)) << 3); \ + } +#define read_8() ((((GPIO7_PSR & (1 << 16)) >> 16) \ + | ((GPIO7_PSR & (1 << 11)) >> 10) \ + | ((GPIO9_PSR & (1 << 4)) >> 2) \ + | ((GPIO9_PSR & (1 << 5)) >> 2) \ + | ((GPIO9_PSR & (1 << 6)) >> 2) \ + | ((GPIO9_PSR & (1 << 8)) >> 3) \ + | ((GPIO7_PSR & (1 << 10)) >> 4) \ + | ((GPIO7_PSR & (1 << 17)) >> 10))) +#define setWriteDir() {GPIO7_GDIR |= GMASK;GPIO9_GDIR |= IMASK; } +#define setReadDir() {GPIO7_GDIR &= ~GMASK;GPIO9_GDIR &= ~IMASK; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +#define GPIO_INIT() {for (int i = 2; i <= 9; i++) pinMode(i, OUTPUT); for (int i = A0; i <= A4; i++) pinMode(i, OUTPUT);} + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _DR_CLEAR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _DR_SET) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _GDIR) |= (1<<(pin)) + +//####################################### TEENSY 3.x ############################ +#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) // regular UNO shield on a Teensy 3.x +#warning regular UNO shield on a Teensy 3.x + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| +//MK20 pin |PD2|PD4|PD7|PA13|PA12|PD2|PC3|PD3| |PD1|PC0|PB0|PB1|PB3| + +#if defined(__MK20DX128__) || defined(__MK20DX256__) // Teensy3.0 || 3.2 96MHz +#define WRITE_DELAY { WR_ACTIVE2; } +#define IDLE_DELAY { } +#define READ_DELAY { RD_ACTIVE8; RD_ACTIVE; } +#elif defined(__MK64FX512__) // Teensy3.5 120MHz thanks to PeteJohno +#define WRITE_DELAY { WR_ACTIVE4; } +#define IDLE_DELAY { WR_IDLE; } +#define READ_DELAY { RD_ACTIVE8; } +#elif defined(__MK66FX1M0__) // Teensy3.6 180MHz untested. delays can possibly be reduced. +#define WRITE_DELAY { WR_ACTIVE8; } +#define IDLE_DELAY { WR_IDLE2; } +#define READ_DELAY { RD_ACTIVE16; } +#else +#error unspecified delays +#endif + +#define RD_PORT GPIOD +#define RD_PIN 1 +#define WR_PORT GPIOC +#define WR_PIN 0 +#define CD_PORT GPIOB +#define CD_PIN 0 +#define CS_PORT GPIOB +#define CS_PIN 1 +#define RESET_PORT GPIOB +#define RESET_PIN 3 + +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<13)) +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<7)) + +#define write_8(d) { \ + GPIOA_PCOR = AMASK; GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOA_PSOR = (((d) & (1 << 3)) << 9) \ + | (((d) & (1 << 4)) << 9); \ + GPIOC_PSOR = (((d) & (1 << 1)) << 2); \ + GPIOD_PSOR = (((d) & (1 << 0)) << 3) \ + | (((d) & (1 << 2)) >> 2) \ + | (((d) & (1 << 5)) << 2) \ + | (((d) & (1 << 6)) >> 2) \ + | (((d) & (1 << 7)) >> 5); \ + } +#define read_8() ((((GPIOD_PDIR & (1<<3)) >> 3) \ + | ((GPIOC_PDIR & (1 << 3)) >> 2) \ + | ((GPIOD_PDIR & (1 << 0)) << 2) \ + | ((GPIOA_PDIR & (1 << 12)) >> 9) \ + | ((GPIOA_PDIR & (1 << 13)) >> 9) \ + | ((GPIOD_PDIR & (1 << 7)) >> 2) \ + | ((GPIOD_PDIR & (1 << 4)) << 2) \ + | ((GPIOD_PDIR & (1 << 2)) << 5))) +#define setWriteDir() {GPIOA_PDDR |= AMASK;GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } +#define setReadDir() {GPIOA_PDDR &= ~AMASK;GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } //PJ adjusted +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +//#define GPIO_INIT() {SIM_SCGC5 |= 0x3E00;} //PORTA-PORTE +#define GPIO_INIT() {for (int i = 2; i <= 9; i++) pinMode(i, OUTPUT); for (int i = A0; i <= A4; i++) pinMode(i, OUTPUT);} + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +//####################################### STM32 ############################ +// NUCLEO: ARDUINO_NUCLEO_xxxx from ST Core or ARDUINO_STM_NUCLEO_F103RB from MapleCore +// BLUEPILL: ARDUINO_NUCLEO_F103C8 / ARDUINO_BLUEPILL_F103C8 from ST Core or ARDUINO_GENERIC_STM32F103C from MapleCore +// MAPLE_REV3: n/a from ST Core or ARDUINO_MAPLE_REV3 from MapleCore +// ST Core: ARDUINO_ARCH_STM32 +// MapleCore: __STM32F1__ +#elif defined(__STM32F1__) || defined(ARDUINO_ARCH_STM32) //MapleCore or ST Core +#define IS_NUCLEO64 ( defined(ARDUINO_STM_NUCLEO_F103RB) \ + || defined(ARDUINO_NUCLEO_F030R8) || defined(ARDUINO_NUCLEO_F091RC) \ + || defined(ARDUINO_NUCLEO_F103RB) || defined(ARDUINO_NUCLEO_F303RE) \ + || defined(ARDUINO_NUCLEO_F401RE) || defined(ARDUINO_NUCLEO_F411RE) \ + || defined(ARDUINO_NUCLEO_F446RE) || defined(ARDUINO_NUCLEO_L053R8) \ + || defined(ARDUINO_NUCLEO_L152RE) || defined(ARDUINO_NUCLEO_L476RG) \ + || defined(ARDUINO_NUCLEO_F072RB) \ + ) +#define IS_NUCLEO144 ( defined(ARDUINO_NUCLEO_F207ZG) \ + || defined(ARDUINO_NUCLEO_F429ZI) || defined(ARDUINO_NUCLEO_F767ZI) \ + || defined(ARDUINO_NUCLEO_L496ZG) || defined(ARDUINO_NUCLEO_L496ZG_P) \ + || defined(ARDUINO_NUCLEO_H743ZI) \ + ) +// F1xx, F4xx, L4xx have different registers and styles. General Macros +#if defined(__STM32F1__) //weird Maple Core +#define REGS(x) regs->x +#else //regular ST Core +#define REGS(x) x +#endif +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } + +// Family specific Macros. F103 needs ST and Maple compatibility +// note that ILI9320 class of controller has much slower Read cycles +#if 0 +#elif defined(__STM32F1__) || defined(ARDUINO_NUCLEO_F103C8) || defined(ARDUINO_BLUEPILL_F103C8) || defined(ARDUINO_NUCLEO_F103RB) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#if defined(__STM32F1__) //MapleCore crts.o does RCC. not understand regular syntax anyway +#define GPIO_INIT() +#else +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#endif +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } + +// should be easy to add F030, F091, F303, L053, ... +#elif defined(STM32F030x8) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F072xB) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F091xC) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F207xx) +#warning DELAY macros untested yet +#define WRITE_DELAY { WR_ACTIVE8; } //120MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;} +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F303xE) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE8; } //thanks MasterT +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; \ + /* AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1; */ } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) //thanks fpiSTM + +#elif defined(STM32F401xE) +#define WRITE_DELAY { WR_ACTIVE2; } //84MHz +#define READ_DELAY { RD_ACTIVE4; } +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F411xE) +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //100MHz +#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE2; } +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F429xx) +#warning DELAY macros untested yet +#define WRITE_DELAY { WR_ACTIVE8; } //180MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;} +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F446xx) +#define WRITE_DELAY { WR_ACTIVE8; } //180MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;} +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32F767xx) +#warning DELAY macros untested yet +#define WRITE_DELAY { WR_ACTIVE8;WR_ACTIVE2; } //216MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16;RD_ACTIVE4;} +#define GPIO_INIT() { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32H743xx) // thanks MagicianT +#warning STM32H743xx< DELAY macros untested yet +#define WRITE_DELAY { WR_ACTIVE8;WR_ACTIVE2; } //F_CPU=400MHz +#define IDLE_DELAY { WR_IDLE2;WR_IDLE; } +#define READ_DELAY { RD_ACTIVE16;RD_ACTIVE16;RD_ACTIVE4;} +#define GPIO_INIT() { RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN | RCC_AHB4ENR_GPIOCEN | RCC_AHB4ENR_GPIODEN | RCC_AHB4ENR_GPIOEEN | RCC_AHB4ENR_GPIOFEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32L053xx) +#define WRITE_DELAY { } //32MHz M0+ +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32L152xE) +#define WRITE_DELAY { } //32MHz M3 +#define READ_DELAY { RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32L476xx) +#define WRITE_DELAY { WR_ACTIVE2; } //80MHz +#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOBEN | RCC_AHB2ENR_GPIOCEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#elif defined(STM32L496xx) +#warning DELAY macros untested yet +#define WRITE_DELAY { WR_ACTIVE2; } //80MHz +#define READ_DELAY { RD_ACTIVE4; RD_ACTIVE; } +#define GPIO_INIT() { RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOCEN | RCC_AHB2ENR_GPIODEN | RCC_AHB2ENR_GPIOEEN | RCC_AHB2ENR_GPIOFEN; } +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) + +#else +#error unsupported STM32 +#endif + +#if 0 +#elif defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_NUCLEO_F103C8) || defined(ARDUINO_BLUEPILL_F103C8) +#warning Uno Shield on BLUEPILL + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| |SD_SS|SD_DI|SD_DO|SD_SCK| +//STM32 pin |PA7|PA6|PA5|PA4|PA3|PA2|PA1|PA0| |PB0|PB6|PB7|PB8|PB9| |PA15 |PB5 |PB4 |PB3 | **ALT-SPI1** + +#define RD_PORT GPIOB +//#define RD_PIN 5 +#define RD_PIN 0 //hardware mod to Adapter. Allows use of PB5 for SD Card +#define WR_PORT GPIOB +#define WR_PIN 6 +#define CD_PORT GPIOB +#define CD_PIN 7 +#define CS_PORT GPIOB +#define CS_PIN 8 +#define RESET_PORT GPIOB +#define RESET_PIN 9 + +// configure macros for the data pins +#define write_8(d) { GPIOA->REGS(BSRR) = 0x00FF << 16; GPIOA->REGS(BSRR) = (d) & 0xFF; } +#define read_8() (GPIOA->REGS(IDR) & 0xFF) +// PA7 ..PA0 +#define setWriteDir() {GP_OUT(GPIOA, CRL, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOA, CRL, 0xFFFFFFFF); } + +#elif IS_NUCLEO64 // Uno Shield on NUCLEO-64 +#warning Uno Shield on NUCLEO-64 +#define RD_PORT GPIOA //PA0 +#define RD_PIN 0 +#define WR_PORT GPIOA //PA1 +#define WR_PIN 1 +#define CD_PORT GPIOA //PA4 +#define CD_PIN 4 +#define CS_PORT GPIOB //PB0 +#define CS_PIN 0 +#define RESET_PORT GPIOC //PC1 +#define RESET_PIN 1 + +// configure macros for the data pins +#define AMASK ((1<<9)|(1<<10)|(1<<8)) //#0, #2, #7 +#define BMASK ((1<<3)|(1<<5)|(1<<4)|(1<<10)) //#3, #4, #5, #6 +#define CMASK ((1<<7)) //#1 + +#define write_8(d) { \ + GPIOA->REGS(BSRR) = AMASK << 16; \ + GPIOB->REGS(BSRR) = BMASK << 16; \ + GPIOC->REGS(BSRR) = CMASK << 16; \ + GPIOA->REGS(BSRR) = ( ((d) & (1<<0)) << 9) \ + | (((d) & (1<<2)) << 8) \ + | (((d) & (1<<7)) << 1); \ + GPIOB->REGS(BSRR) = ( ((d) & (1<<3)) << 0) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) >> 1) \ + | (((d) & (1<<6)) << 4); \ + GPIOC->REGS(BSRR) = ( ((d) & (1<<1)) << 6); \ + } + +#define read_8() ( ( ( (GPIOA->REGS(IDR) & (1<<9)) >> 9) \ + | ((GPIOC->REGS(IDR) & (1<<7)) >> 6) \ + | ((GPIOA->REGS(IDR) & (1<<10)) >> 8) \ + | ((GPIOB->REGS(IDR) & (1<<3)) >> 0) \ + | ((GPIOB->REGS(IDR) & (1<<5)) >> 1) \ + | ((GPIOB->REGS(IDR) & (1<<4)) << 1) \ + | ((GPIOB->REGS(IDR) & (1<<10)) >> 4) \ + | ((GPIOA->REGS(IDR) & (1<<8)) >> 1))) + + +#if defined(ARDUINO_NUCLEO_F103RB) || defined(ARDUINO_STM_NUCLEO_F103RB) //F103 has unusual GPIO modes +// PA10,PA9,PA8 PB10 PB5,PB4,PB3 PC7 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFF); GP_OUT(GPIOB, CRH, 0xF00); GP_OUT(GPIOB, CRL, 0xFFF000); GP_OUT(GPIOC, CRL, 0xF0000000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFFF); GP_INP(GPIOB, CRH, 0xF00); GP_INP(GPIOB, CRL, 0xFFF000); GP_INP(GPIOC, CRL, 0xF0000000); } +#else //F0xx, F3xx, F4xx, L0xx, L1xx, L4xx use MODER +// PA10,PA9,PA8 PB10,PB5,PB4,PB3 PC7 +#define setWriteDir() { setReadDir(); \ + GPIOA->MODER |= 0x150000; GPIOB->MODER |= 0x100540; GPIOC->MODER |= 0x4000; } +#define setReadDir() { GPIOA->MODER &= ~0x3F0000; GPIOB->MODER &= ~0x300FC0; GPIOC->MODER &= ~0xC000; } +#endif + +#elif IS_NUCLEO144 // Uno Shield on NUCLEO-144 +#warning Uno Shield on NUCLEO-144 +#define RD_PORT GPIOA //PA3 +#define RD_PIN 3 +#define WR_PORT GPIOC //PC0 +#define WR_PIN 0 +#define CD_PORT GPIOC //PC3 +#define CD_PIN 3 +#define CS_PORT GPIOF //PF3 +#define CS_PIN 3 +#define RESET_PORT GPIOF //PF5 +#define RESET_PIN 5 + +// configure macros for the data pins +#define DMASK ((1<<15)) //#1 +#define EMASK ((1<<13)|(1<<11)|(1<<9)) //#3, #5, #6 +#define FMASK ((1<<12)|(1<<15)|(1<<14)|(1<<13)) //#0, #2, #4, #7 + +#define write_8(d) { \ + GPIOD->REGS(BSRR) = DMASK << 16; \ + GPIOE->REGS(BSRR) = EMASK << 16; \ + GPIOF->REGS(BSRR) = FMASK << 16; \ + GPIOD->REGS(BSRR) = ( ((d) & (1<<1)) << 14); \ + GPIOE->REGS(BSRR) = ( ((d) & (1<<3)) << 10) \ + | (((d) & (1<<5)) << 6) \ + | (((d) & (1<<6)) << 3); \ + GPIOF->REGS(BSRR) = ( ((d) & (1<<0)) << 12) \ + | (((d) & (1<<2)) << 13) \ + | (((d) & (1<<4)) << 10) \ + | (((d) & (1<<7)) << 6); \ + } + +#define read_8() ( ( ( (GPIOF->REGS(IDR) & (1<<12)) >> 12) \ + | ((GPIOD->REGS(IDR) & (1<<15)) >> 14) \ + | ((GPIOF->REGS(IDR) & (1<<15)) >> 13) \ + | ((GPIOE->REGS(IDR) & (1<<13)) >> 10) \ + | ((GPIOF->REGS(IDR) & (1<<14)) >> 10) \ + | ((GPIOE->REGS(IDR) & (1<<11)) >> 6) \ + | ((GPIOE->REGS(IDR) & (1<<9)) >> 3) \ + | ((GPIOF->REGS(IDR) & (1<<13)) >> 6))) + + +// PD15 PE13,PE11,PE9 PF15,PF14,PF13,PF12 +#define setWriteDir() { setReadDir(); \ + GPIOD->MODER |= 0x40000000; GPIOE->MODER |= 0x04440000; GPIOF->MODER |= 0x55000000; } +#define setReadDir() { GPIOD->MODER &= ~0xC0000000; GPIOE->MODER &= ~0x0CCC0000; GPIOF->MODER &= ~0xFF000000; } + +#elif defined(ARDUINO_MAPLE_REV3) // Uno Shield on MAPLE_REV3 board +#warning Uno Shield on MAPLE_REV3 board +#define RD_PORT GPIOC +#define RD_PIN 0 +#define WR_PORT GPIOC +#define WR_PIN 1 +#define CD_PORT GPIOC +#define CD_PIN 2 +#define CS_PORT GPIOC +#define CS_PIN 3 +#define RESET_PORT GPIOC +#define RESET_PIN 4 + +// configure macros for the data pins +#define write_8(d) { \ + GPIOA->REGS(BSRR) = 0x0703 << 16; \ + GPIOB->REGS(BSRR) = 0x00E0 << 16; \ + GPIOA->REGS(BSRR) = ( ((d) & (1<<0)) << 10) \ + | (((d) & (1<<2)) >> 2) \ + | (((d) & (1<<3)) >> 2) \ + | (((d) & (1<<6)) << 2) \ + | (((d) & (1<<7)) << 2); \ + GPIOB->REGS(BSRR) = ( ((d) & (1<<1)) << 6) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) << 1); \ + } + +#define read_8() ( ( ( (GPIOA->REGS(IDR) & (1<<10)) >> 10) \ + | ((GPIOB->REGS(IDR) & (1<<7)) >> 6) \ + | ((GPIOA->REGS(IDR) & (1<<0)) << 2) \ + | ((GPIOA->REGS(IDR) & (1<<1)) << 2) \ + | ((GPIOB->REGS(IDR) & (1<<5)) >> 1) \ + | ((GPIOB->REGS(IDR) & (1<<6)) >> 1) \ + | ((GPIOA->REGS(IDR) & (1<<8)) >> 2) \ + | ((GPIOA->REGS(IDR) & (1<<9)) >> 2))) + +// PA10,PA9,PA8 PA1,PA0 PB7,PB6,PB5 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFF); GP_OUT(GPIOA, CRL, 0xFF); GP_OUT(GPIOB, CRL, 0xFFF00000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFFF); GP_INP(GPIOA, CRL, 0xFF); GP_INP(GPIOB, CRL, 0xFFF00000); } + +#else +#error REGS group +#endif + +#ifndef IDLE_DELAY +#define IDLE_DELAY { WR_IDLE; } +#endif + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; IDLE_DELAY; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE2; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +//################################### ESP32 ############################## +#elif defined(ESP32) //regular UNO shield on TTGO D1 R32 (ESP32) +#define LCD_RD 2 //LED +#define LCD_WR 4 +#define LCD_RS 15 //hard-wired to A2 (GPIO35) +#define LCD_CS 33 //hard-wired to A3 (GPIO34) +#define LCD_RST 32 //hard-wired to A4 (GPIO36) + +#define LCD_D0 12 +#define LCD_D1 13 +#define LCD_D2 26 +#define LCD_D3 25 +#define LCD_D4 17 +#define LCD_D5 16 +#define LCD_D6 27 +#define LCD_D7 14 + +#define RD_PORT GPIO.out +#define RD_PIN LCD_RD +#define WR_PORT GPIO.out +#define WR_PIN LCD_WR +#define CD_PORT GPIO.out +#define CD_PIN LCD_RS +#define CS_PORT GPIO.out1.val +#define CS_PIN LCD_CS +#define RESET_PORT GPIO.out1.val +#define RESET_PIN LCD_RST + +static inline uint32_t map_8(uint32_t d) +{ + return ( + 0 + | ((d & (1 << 0)) << (LCD_D0 - 0)) + | ((d & (1 << 1)) << (LCD_D1 - 1)) + | ((d & (1 << 2)) << (LCD_D2 - 2)) + | ((d & (1 << 3)) << (LCD_D3 - 3)) + | ((d & (1 << 4)) << (LCD_D4 - 4)) + | ((d & (1 << 5)) << (LCD_D5 - 5)) + | ((d & (1 << 6)) << (LCD_D6 - 6)) + | ((d & (1 << 7)) << (LCD_D7 - 7)) + ); +} + +static inline uint8_t map_32(uint32_t d) +{ + return ( + 0 + | ((d & (1 << LCD_D0)) >> (LCD_D0 - 0)) + | ((d & (1 << LCD_D1)) >> (LCD_D1 - 1)) + | ((d & (1 << LCD_D2)) >> (LCD_D2 - 2)) + | ((d & (1 << LCD_D3)) >> (LCD_D3 - 3)) + | ((d & (1 << LCD_D4)) >> (LCD_D4 - 4)) + | ((d & (1 << LCD_D5)) >> (LCD_D5 - 5)) + | ((d & (1 << LCD_D6)) >> (LCD_D6 - 6)) + | ((d & (1 << LCD_D7)) >> (LCD_D7 - 7)) + ); +} + +static inline void write_8(uint16_t data) +{ + GPIO.out_w1tc = map_8(0xFF); //could define once as DMASK + GPIO.out_w1ts = map_8(data); +} + +static inline uint8_t read_8() +{ + return map_32(GPIO.in); +} +static void setWriteDir() +{ + pinMode(LCD_D0, OUTPUT); + pinMode(LCD_D1, OUTPUT); + pinMode(LCD_D2, OUTPUT); + pinMode(LCD_D3, OUTPUT); + pinMode(LCD_D4, OUTPUT); + pinMode(LCD_D5, OUTPUT); + pinMode(LCD_D6, OUTPUT); + pinMode(LCD_D7, OUTPUT); +} + +static void setReadDir() +{ + pinMode(LCD_D0, INPUT); + pinMode(LCD_D1, INPUT); + pinMode(LCD_D2, INPUT); + pinMode(LCD_D3, INPUT); + pinMode(LCD_D4, INPUT); + pinMode(LCD_D5, INPUT); + pinMode(LCD_D6, INPUT); + pinMode(LCD_D7, INPUT); +} + +#define WRITE_DELAY { } +#define READ_DELAY { } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (digitalWrite(b, LOW)) +#define PIN_HIGH(p, b) (digitalWrite(b, HIGH)) +#define PIN_OUTPUT(p, b) (pinMode(b, OUTPUT)) + +#else +#error MCU unsupported +#endif // regular UNO shields on Arduino boards + +#endif //!defined(USE_SPECIAL) || defined (USE_SPECIAL_FAIL) + +#define RD_ACTIVE PIN_LOW(RD_PORT, RD_PIN) +#define RD_IDLE PIN_HIGH(RD_PORT, RD_PIN) +#define RD_OUTPUT PIN_OUTPUT(RD_PORT, RD_PIN) +#define WR_ACTIVE PIN_LOW(WR_PORT, WR_PIN) +#define WR_IDLE PIN_HIGH(WR_PORT, WR_PIN) +#define WR_OUTPUT PIN_OUTPUT(WR_PORT, WR_PIN) +#define CD_COMMAND PIN_LOW(CD_PORT, CD_PIN) +#define CD_DATA PIN_HIGH(CD_PORT, CD_PIN) +#define CD_OUTPUT PIN_OUTPUT(CD_PORT, CD_PIN) +#define CS_ACTIVE PIN_LOW(CS_PORT, CS_PIN) +#define CS_IDLE PIN_HIGH(CS_PORT, CS_PIN) +#define CS_OUTPUT PIN_OUTPUT(CS_PORT, CS_PIN) +#define RESET_ACTIVE PIN_LOW(RESET_PORT, RESET_PIN) +#define RESET_IDLE PIN_HIGH(RESET_PORT, RESET_PIN) +#define RESET_OUTPUT PIN_OUTPUT(RESET_PORT, RESET_PIN) + + // General macros. IOCLR registers are 1 cycle when optimised. +#define WR_STROBE { WR_ACTIVE; WR_IDLE; } //PWLW=TWRL=50ns +#define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns, tDDR=100ns + +#if !defined(GPIO_INIT) +#define GPIO_INIT() +#endif +#define CTL_INIT() { GPIO_INIT(); RD_OUTPUT; WR_OUTPUT; CD_OUTPUT; CS_OUTPUT; RESET_OUTPUT; } +#define WriteCmd(x) { CD_COMMAND; write16(x); CD_DATA; } +#define WriteData(x) { write16(x); } diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_special.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_special.h new file mode 100644 index 0000000..fbf9565 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/mcufriend_special.h @@ -0,0 +1,1020 @@ +// only define one "USE_XXX" macro at any time + +//#define USE_MEGA_8BIT_PROTOSHIELD +//#define USE_MEGA_8BIT_SHIELD // 4.7sec Mega2560 Shield +//#define USE_MEGA_8BIT_PORTC_SHIELD // 4.7sec Mega2560 Shield +//#define USE_MEGA_16BIT_SHIELD // 2.14sec Mega2560 Shield +//#define USE_BLD_BST_MEGA32U4 +//#define USE_BLD_BST_MEGA2560 // 12.23sec Uno Shield (17.38s C) +//#define USE_BLD_BST_MEGA4809 // 5.43sec XPRO-Adapter (7.09s C) +//#define USE_DUE_8BIT_PROTOSHIELD +//#define USE_DUE_16BIT_SHIELD //RD on PA15 (D24) +//#define USE_BOBCACHELOT_TEENSY +//#define USE_OPENSMART_SHIELD_PINOUT_UNO +//#define USE_OPENSMART_SHIELD_PINOUT_MEGA +//#define USE_OPENSMART_SHIELD_PINOUT_DUE //thanks Michel53 +//#define USE_ELECHOUSE_DUE_16BIT_SHIELD //Untested yet +//#define USE_MY_BLUEPILL +//#define USE_ADIGITALEU_TEENSY +//#define USE_MIKROELEKTRONIKA +//#define USE_XPRO_MEGA4809 + +/* +HX8347A tWC =100ns tWRH = 35ns tRCFM = 450ns tRC = ? ns +HX8347D tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +HX8347I tWC =100ns tWRH = 15ns tRCFM = 600ns tRC = 160ns +HX8357C tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +ILI9320 tWC =100ns tWRH = 50ns tRCFM = 300ns tRC = 300ns +ILI9341 tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +ILI9481 tWC =100ns tWRH = 30ns tRCFM = 450ns tRC = 450ns +ILI9486 tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns (tWCFM= 286ns on mystery 9486_16) +ILI9486L tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +ILI9488 tWC = 30ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +NT35310 tWC = 40ns tWRH = 19ns tRCFM = 400ns tRC = 160ns +RM68140 tWC = 50ns tWRH = 15ns tRCFM = 450ns tRC = 160ns (tWCFM= 119ns) +SPFD5408 tWC =125ns tWRH = 70ns tRCFM = 450ns tRC = 450ns +SSD1289 tWC =100ns tWRH = 50ns tRCFM =1000ns tRC =1000ns (tWCFM= 238ns) +SSD1963 tWC = 26ns tWRH = 13ns tRCFM = 110ns tRC = 72ns +ST7789V tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +ST7793 tWC = 75ns tWRH = 25ns tRCFM = 450ns tRC = 450ns +ST7796S tWC = 66ns tWRH = 15ns tRCFM = 450ns tRC = 160ns +*/ + +#if 0 + +#elif defined(__AVR_ATxmega128A1__) // Xplained or MIKROE +#if defined(USE_MIKROELEKTRONIKA) // HX8347-D 16.2ns@62MHz 20.9ns@48MHz +#if F_CPU > 46000000 +#error MIKROELEKTRONIKA must be less than 48MHz +#else +#warning MIKROELEKTRONIKA DEV BOARD (48MHz max) +#endif +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE4; } +#define VPMAP10 0x58 // VPORT0=J, 1=F, 2=K, 3=D +#define VPMAP32 0x39 // VPORT0=J, 1=F, 2=K, 3=D +#define RD_PORT VPORT0 //PJ2. +#define RD_PIN 2 +#define WR_PORT VPORT0 +#define WR_PIN 3 +#define CD_PORT VPORT0 +#define CD_PIN 4 +#define CS_PORT VPORT0 +#define CS_PIN 5 +#define RESET_PORT VPORT0 //PJ1 +#define RESET_PIN 1 +#else +#warning Home made shield with Xplained CTL=J1 (PC), DATA=J4 (PF) +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE4; } +#define VPMAP10 0x15 // VPORT0=F, 1=B, 2=C, 3=D +#define VPMAP32 0x32 // VPORT0=F, 1=B, 2=C, 3=D +#define RD_PORT VPORT0 //PF0. +#define RD_PIN 0 +#define WR_PORT VPORT0 +#define WR_PIN 1 +#define CD_PORT VPORT0 +#define CD_PIN 2 +#define CS_PORT VPORT0 +#define CS_PIN 3 +#define RESET_PORT VPORT0 //PK4 +#define RESET_PIN 4 +#endif + +// VPORTs are very fast. CBI, SBI are only one cycle. Hence all those RD_ACTIVEs +// ILI9320 data sheet says tDDR=100ns. We need 218ns to read REGs correctly. +#define write_8(x) { VPORT2.OUT = x; } +#define read_8() ( VPORT2.IN ) +#define setWriteDir() { PORTCFG.VPCTRLA=VPMAP10; PORTCFG.VPCTRLB=VPMAP32; VPORT2.DIR = 0xFF; } +#define setReadDir() { VPORT2.DIR = 0x00; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +//#define READ_8(dst) { RD_STROBE; RD_ACTIVE2; RD_ACTIVE; dst = read_8(); RD_IDLE; } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +#elif defined(__AVR_ATxmega32A4U__) || defined(__AVR_ATxmega128A4U__) // Home made shield with Batsocks module +#warning Home made shield with Batsocks module +#define RD_PORT VPORT1 //PB0. VPORT0=A, 1=B, 2=C, 3=D +#define RD_PIN 0 +#define WR_PORT VPORT1 +#define WR_PIN 1 +#define CD_PORT VPORT1 +#define CD_PIN 2 +#define CS_PORT VPORT1 +#define CS_PIN 3 +#define RESET_PORT PORTE +#define RESET_PIN 0 + +// VPORTs are very fast. CBI, SBI are only one cycle. Hence all those RD_ACTIVEs +// ILI9320 data sheet says tDDR=100ns. We need 218ns to read REGs correctly. +// S6D0154 data sheet says tDDR=250ns. We need ~500ns to read REGs correctly. +// ST7789 data sheet says tRC=450ns. We need ~167ns to read REGs correctly. (10 cycles @ 60MHz ) +// ST7789 says tRC=160ns for ID and tRC=450ns for Frame Memory +// ILI9341 says tRC=160ns for ID and tRC=450ns for Frame Memory. They are FASTER +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE4; } +#define write_8(x) { VPORT2.OUT = x; } +#define read_8() ( VPORT2.IN ) +#define setWriteDir() { PORTCFG.VPCTRLA=0x10; PORTCFG.VPCTRLB=0x32; VPORT2.DIR = 0xFF; } +#define setReadDir() { VPORT2.DIR = 0x00; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +#elif defined(__AVR_ATxmega32E5__) // Xplained E5 F_CPU <= 46MHz +#warning Home made shield with Xplained E5: CTL=J2 (PD), DATA=J0 (PA) +#define CTLPORT VPORT2 //PORTD on J2 +#define DATPORT VPORT0 //PORTA on J3, SW103=hdr +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE4; } +#define RD_PORT CTLPORT +#define RD_PIN 0 +#define WR_PORT CTLPORT +#define WR_PIN 1 +#define CD_PORT CTLPORT +#define CD_PIN 2 +#define CS_PORT CTLPORT +#define CS_PIN 3 +#define RESET_PORT CTLPORT //10k p.u. to 3V3 +#define RESET_PIN 4 + +// VPORTs are very fast. CBI, SBI are only one cycle. Hence all those RD_ACTIVEs +// ILI9320 data sheet says tDDR=100ns. We need 218ns to read REGs correctly. +#define write_8(x) { DATPORT.OUT = x; } +#define read_8() ( DATPORT.IN ) +#define setWriteDir() { DATPORT.DIR = 0xFF; } +#define setReadDir() { DATPORT.DIR = 0x00; } +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +//################################# XPRO-4809 with XPRO-Shield_Adapter ############################ +#elif defined(__AVR_ATmega4809__) && !defined(USE_BLD_BST_MEGA4809) && defined(USE_XPRO_MEGA4809) // XPRO-4809 with XPRO-Shield_Adapter +#warning XPRO-4809 with XPRO-Shield_Adapter using PORT.OUTSET +#define RD_PORT PORTD // +#define RD_PIN 2 +#define WR_PORT PORTD +#define WR_PIN 3 +#define CD_PORT PORTD +#define CD_PIN 4 +#define CS_PORT PORTD +#define CS_PIN 5 +#define RESET_PORT PORTC +#define RESET_PIN 2 + +// PORT.OUTSET is fast but still 2 cycles. Hence all those RD_ACTIVEs +#define AMASK (3<<2) +#define BMASK (3<<2) +#define CMASK (3<<6) +#define EMASK (1<<1) +#define FMASK (1<<6) +#define write_8(x) { \ + PORTA.OUTCLR = AMASK; PORTA.OUTSET = (((x) & (3<<0)) << 2); \ + PORTB.OUTCLR = BMASK; PORTB.OUTSET = (((x) & (1<<2))) | (((x) & (1<<6)) >> 3); \ + PORTC.OUTCLR = CMASK; PORTC.OUTSET = (((x) & (3<<3)) << 3); \ + PORTE.OUTCLR = EMASK; PORTE.OUTSET = (((x) & (1<<7)) >> 6); \ + PORTF.OUTCLR = FMASK; PORTF.OUTSET = (((x) & (1<<5)) << 1); \ + } +#define read_8() ( ((PORTA.IN & AMASK) >> 2)\ +| ((PORTB.IN & (1<<2)) >> 0)\ +| ((PORTB.IN & (1<<3)) << 3)\ +| ((PORTC.IN & CMASK) >> 3)\ +| ((PORTE.IN & EMASK) << 6)\ +| ((PORTF.IN & FMASK) >> 1)\ +) +#define setWriteDir() { PORTA.DIRSET = AMASK; PORTB.DIRSET = BMASK; PORTC.DIRSET = CMASK; PORTE.DIRSET = EMASK; PORTF.DIRSET = FMASK; } +#define setReadDir() { PORTA.DIRCLR = AMASK; PORTB.DIRCLR = BMASK; PORTC.DIRCLR = CMASK; PORTE.DIRCLR = EMASK; PORTF.DIRCLR = FMASK; } + +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=7.09s @20MHz (-O1=8.13s, -O3=6.03s) +#define READ_DELAY { RD_ACTIVE2; } //ID=0x7789 +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUTCLR = (1<<(b)) +#define PIN_HIGH(p, b) (p).OUTSET = (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIRSET = (1<<(b)) + +#elif defined(__AVR_ATmega4809__) && defined(USE_BLD_BST_MEGA4809) && defined(USE_XPRO_MEGA4809) // XPRO-4809 with XPRO-Shield_Adapter +#warning XPRO-4809 with XPRO-Shield_Adapter using VPORT.OUT and BLD/BST +#define RD_PORT VPORTD // +#define RD_PIN 2 +#define WR_PORT VPORTD +#define WR_PIN 3 +#define CD_PORT VPORTD +#define CD_PIN 4 +#define CS_PORT VPORTD +#define CS_PIN 5 +#define RESET_PORT VPORTC +#define RESET_PIN 2 + +#define AMASK (3<<2) +#define BMASK (3<<2) +#define CMASK (3<<6) +#define EMASK (1<<1) +#define FMASK (1<<6) +static __attribute((always_inline)) + void write_8(uint8_t val) +{ + asm volatile("in __tmp_reg__,0x01" "\n\t" //VPORTA.OUT + "BST %0,0" "\n\t" "BLD __tmp_reg__,2" "\n\t" + "BST %0,1" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "out 0x01,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x05" "\n\t" //VPORTB.OUT + "BST %0,2" "\n\t" "BLD __tmp_reg__,2" "\n\t" + "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "out 0x05,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x09" "\n\t" //VPORTC.OUT + "BST %0,3" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "BST %0,4" "\n\t" "BLD __tmp_reg__,7" "\n\t" + "out 0x09,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x11" "\n\t" //VPORTE.OUT + "BST %0,7" "\n\t" "BLD __tmp_reg__,1" "\n\t" + "out 0x11,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x15" "\n\t" //VPORTF.OUT + "BST %0,5" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "out 0x15,__tmp_reg__" : : "a" (val)); +} + +#define read_8() ( ((VPORTA_IN & AMASK) >> 2)\ +| ((VPORTB_IN & (1<<2)) >> 0)\ +| ((VPORTB_IN & (1<<3)) << 3)\ +| ((VPORTC_IN & CMASK) >> 3)\ +| ((VPORTE_IN & EMASK) << 6)\ +| ((VPORTF_IN & FMASK) >> 1)\ +) +#define setWriteDir() { VPORTA_DIR |= AMASK; VPORTB_DIR |= BMASK; VPORTC_DIR |= CMASK; VPORTE_DIR |= EMASK; VPORTF_DIR |= FMASK; } +#define setReadDir() { VPORTA_DIR &= ~AMASK; VPORTB_DIR &= ~BMASK; VPORTC_DIR &= ~CMASK; VPORTE_DIR &= ~EMASK; VPORTF_DIR &= ~FMASK; } + +//#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; } //6.47s no_inline +#define WRITE_DELAY { WR_ACTIVE2; WR_ACTIVE; } //-Os=5.43s @20MHz always_inline. (-O1=5.41s, -O3=5.25s) +#define READ_DELAY { RD_ACTIVE4; } //ID=0x7789 +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p).OUT &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p).OUT |= (1<<(b)) +#define PIN_OUTPUT(p, b) (p).DIR |= (1<<(b)) + +#elif defined(__AVR_ATmega328P__) && defined(USE_OPENSMART_SHIELD_PINOUT_UNO) +#define RD_PORT PORTC +#define RD_PIN 0 +#define WR_PORT PORTC +#define WR_PIN 1 +#define CD_PORT PORTC +#define CD_PIN 2 +#define CS_PORT PORTC +#define CS_PIN 3 +#define RESET_PORT PORTC +#define RESET_PIN 1 // n/a. so mimic WR_PIN + +#define BMASK B00101111 +#define DMASK B11010000 + +#define write_8(x) { \ + PORTD = (PORTD & ~DMASK) | ((x) & DMASK); \ + PORTB = (PORTB & ~BMASK) | ((x) & BMASK);} // STROBEs are defined later + +#define read_8() ((PIND & DMASK) | (PINB & BMASK)) + +#define setWriteDir() { DDRD |= DMASK; DDRB |= BMASK; } +#define setReadDir() { DDRD &= ~DMASK; DDRB &= ~BMASK; } + + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_OPENSMART_SHIELD_PINOUT_MEGA) +#define RD_PORT PORTF +#define RD_PIN 0 +#define WR_PORT PORTF +#define WR_PIN 1 +#define CD_PORT PORTF +#define CD_PIN 2 +#define CS_PORT PORTF +#define CS_PIN 3 +#define RESET_PORT PORTF +#define RESET_PIN 1 // n/a. so mimic WR_PIN + +#define BMASK B10110000 //D13, D11, D10 +#define GMASK 0x20 //D4 +#define HMASK 0x78 //D6, D7, D8, D9 + +#if defined(USE_BLD_BST_MEGA2560) +static __attribute((always_inline)) void write_8(uint8_t val) +{ + asm volatile("lds __tmp_reg__,0x0102" "\n\t" //PORTH + "BST %0,0" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "BST %0,1" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "BST %0,7" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "sts 0x0102,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x05" "\n\t" //PORTB + "BST %0,2" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "BST %0,3" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "BST %0,5" "\n\t" "BLD __tmp_reg__,7" "\n\t" + "out 0x05,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x14" "\n\t" //PORTG + "BST %0,4" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "out 0x14,__tmp_reg__" : : "a" (val)); +} +#else +#define write_8(x) { \ + PORTH = (PORTH&~HMASK)|(((x)&B11000000)>>3)|(((x)&B00000011)<<5); \ + PORTB = (PORTB&~BMASK)|(((x)&B00101100)<<2); \ + PORTG = (PORTG&~GMASK)|(((x)&B00010000)<<1); \ + } +#endif + +#define read_8()(\ + ((PINH & B00011000) << 3) | ((PINB & BMASK) >> 2) | \ + ((PING & GMASK) >> 1) | ((PINH & B01100000) >> 5) ) +#define setWriteDir() { DDRH |= HMASK; DDRB |= BMASK; DDRG |= GMASK; } +#define setReadDir() { DDRH &= ~HMASK; DDRB &= ~BMASK; DDRG &= ~GMASK; } + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__SAM3X8E__) && defined(USE_OPENSMART_SHIELD_PINOUT_DUE) //OPENSMART shield on DUE +#warning USE_OPENSMART_SHIELD_PINOUT on DUE + // configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 16 +#define WR_PORT PIOA +#define WR_PIN 24 +#define CD_PORT PIOA +#define CD_PIN 23 +#define CS_PORT PIOA +#define CS_PIN 22 +#define RESET_PORT PIOA +#define RESET_PIN 24 // n/a. so mimic WR_PIN + // configure macros for data bus +#define BMASK (1<<27) +#define CMASK (0x12F << 21) +#define DMASK (1<<7) +#define write_8(x) { PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ + PIOC->PIO_SODR = (((x) & (1<<0)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<1)) << 20); \ + PIOC->PIO_SODR = (((x) & (1<<2)) << 27); \ + PIOD->PIO_SODR = (((x) & (1<<3)) << 4); \ + PIOC->PIO_SODR = (((x) & (1<<4)) << 22); \ + PIOB->PIO_SODR = (((x) & (1<<5)) << 22); \ + PIOC->PIO_SODR = (((x) & (1<<6)) << 18); \ + PIOC->PIO_SODR = (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<21)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<29)) >> 27)\ + | ((PIOD->PIO_PDSR & (1<<7)) >> 4)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOB->PIO_PDSR & (1<<27)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#define setWriteDir() { PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; PIOD->PIO_OER = DMASK; } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD);\ + PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK; PIOD->PIO_ODR = DMASK;\ + } +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } +//#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE; dst = read_8(); RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + // Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_BLD_BST_MEGA2560) //regular UNO shield on MEGA2560 using BLD/BST +#warning regular UNO shield on MEGA2560 using BLD/BST +#define RD_PORT PORTF +#define RD_PIN 0 +#define WR_PORT PORTF +#define WR_PIN 1 +#define CD_PORT PORTF +#define CD_PIN 2 +#define CS_PORT PORTF +#define CS_PIN 3 +#define RESET_PORT PORTF +#define RESET_PIN 4 + +#define EMASK 0x38 +#define GMASK 0x20 +#define HMASK 0x78 +static __attribute((always_inline)) void write_8(uint8_t val) +{ + asm volatile("lds __tmp_reg__,0x0102" "\n\t" + "BST %0,0" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "BST %0,1" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "BST %0,6" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "BST %0,7" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "sts 0x0102,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x0E" "\n\t" + "BST %0,2" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "BST %0,3" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "BST %0,5" "\n\t" "BLD __tmp_reg__,3" "\n\t" + "out 0x0E,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x14" "\n\t" + "BST %0,4" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "out 0x14,__tmp_reg__" : : "a" (val)); +} + +#define read_8() ( ((PINH & (3<<5)) >> 5)\ +| ((PINE & (3<<4)) >> 2)\ +| ((PING & (1<<5)) >> 1)\ +| ((PINE & (1<<3)) << 2)\ +| ((PINH & (3<<3)) << 3)\ +) +#define setWriteDir() { DDRH |= HMASK; DDRG |= GMASK; DDRE |= EMASK; } +#define setReadDir() { DDRH &= ~HMASK; DDRG &= ~GMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_16BIT_SHIELD) +#warning USE_MEGA_16BIT_SHIELD +#define USES_16BIT_BUS +#define RD_PORT PORTL +#define RD_PIN 6 //PL6 (D43). Graham has PA15 (D24) on Due Shield +#define WR_PORT PORTG +#define WR_PIN 2 //D39 CTE +#define CD_PORT PORTD +#define CD_PIN 7 //D38 CTE +#define CS_PORT PORTG +#define CS_PIN 1 //D40 CTE +#define RESET_PORT PORTG +#define RESET_PIN 0 //D41 CTE + +#define write_8(x) { PORTC = x; } +#define write_16(x) { PORTA = (x) >> 8; PORTC = x; } + +#define read_16() ( (PINA<<8) | (PINC) ) +#define setWriteDir() { DDRC = 0xFF; DDRA = 0xff; } +#define setReadDir() { DDRC = 0x00; DDRA = 0x00; } +//#define write8(x) { write_8(x); WR_STROBE; } +#define write8(x) { write16((x) & 0xFF); } +#define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; } +#define READ_16(dst) { RD_STROBE; dst = read_16(); RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0x00FF; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_8BIT_SHIELD) +#warning USE_MEGA_8BIT_SHIELD for vagos21 +#define RD_PORT PORTL +#define RD_PIN 6 //PL6 (D43). Graham has PA15 (D24) on Due Shield +#define WR_PORT PORTG +#define WR_PIN 2 //D39 CTE +#define CD_PORT PORTD +#define CD_PIN 7 //D38 CTE +#define CS_PORT PORTG +#define CS_PIN 1 //D40 CTE +#define RESET_PORT PORTG +#define RESET_PIN 0 //D41 CTE + +#define write_8(x) { PORTA = x;} + +#define read_8() ( PINA ) +#define setWriteDir() { DDRA = 0xFF; } +#define setReadDir() { DDRA = 0x00; } +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } // HX8357-D is slower +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_8BIT_PORTC_SHIELD) +#warning USE_MEGA_8BIT_PORTC_SHIELD for Mihael54 +#define RD_PORT PORTL +#define RD_PIN 6 //PL6 (D43). Graham has PA15 (D24) on Due Shield +#define WR_PORT PORTG +#define WR_PIN 2 //D39 CTE +#define CD_PORT PORTD +#define CD_PIN 7 //D38 CTE +#define CS_PORT PORTG +#define CS_PIN 1 //D40 CTE +#define RESET_PORT PORTG +#define RESET_PIN 0 //D41 CTE + +#define write_8(x) { PORTC = x;} + +#define read_8() ( PINC ) +#define setWriteDir() { DDRC = 0xFF; } +#define setReadDir() { DDRC = 0x00; } +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; } // HX8357-D is slower +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega2560__) && defined(USE_MEGA_8BIT_PROTOSHIELD) +#warning USE_MEGA_8BIT_PROTOSHIELD +#define RD_PORT PORTF +#define RD_PIN 0 +#define WR_PORT PORTF +#define WR_PIN 1 +#define CD_PORT PORTF +#define CD_PIN 2 +#define CS_PORT PORTF +#define CS_PIN 3 +#define RESET_PORT PORTF +#define RESET_PIN 4 + +#define write_8(x) { PORTA = x;} + +#define read_8() ( PINA ) +#define setWriteDir() { DDRA = 0xFF; } +#define setReadDir() { DDRA = 0x00; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__AVR_ATmega32U4__) && defined(USE_BLD_BST_MEGA32U4) //regular UNO shield on Leonardo using BST/BLD +#warning regular UNO shield on Leonardo using BST/BLD +#define RD_PORT PORTF +#define RD_PIN 7 +#define WR_PORT PORTF +#define WR_PIN 6 +#define CD_PORT PORTF +#define CD_PIN 5 +#define CS_PORT PORTF +#define CS_PIN 4 +#define RESET_PORT PORTF +#define RESET_PIN 1 + +#define BMASK (3<<4) +#define CMASK (1<<6) +#define DMASK ((1<<7)|(1<<4)|(3<<0)) +#define EMASK (1<<6) +static __attribute((always_inline)) void write_8(uint8_t val) +{ + asm volatile("in __tmp_reg__,0x05" "\n\t" + "BST %0,0" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "BST %0,1" "\n\t" "BLD __tmp_reg__,5" "\n\t" + "out 0x05,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x0B" "\n\t" + "BST %0,2" "\n\t" "BLD __tmp_reg__,1" "\n\t" + "BST %0,3" "\n\t" "BLD __tmp_reg__,0" "\n\t" + "BST %0,4" "\n\t" "BLD __tmp_reg__,4" "\n\t" + "BST %0,6" "\n\t" "BLD __tmp_reg__,7" "\n\t" + "out 0x0B,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x08" "\n\t" + "BST %0,5" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "out 0x08,__tmp_reg__" : : "a" (val)); + asm volatile("in __tmp_reg__,0x0E" "\n\t" + "BST %0,7" "\n\t" "BLD __tmp_reg__,6" "\n\t" + "out 0x0E,__tmp_reg__" : : "a" (val)); +} +#define read_8() ( ((PINB & (3<<4)) >> 4)\ +| ((PIND & (1<<1)) << 1)\ +| ((PIND & (1<<0)) << 3)\ +| ((PIND & (1<<4)) >> 0)\ +| ((PINC & (1<<6)) >> 1)\ +| ((PIND & (1<<7)) >> 1)\ +| ((PINE & (1<<6)) << 1)\ +) +#define setWriteDir() { DDRB |= BMASK; DDRC |= CMASK; DDRD |= DMASK; DDRE |= EMASK; } +#define setReadDir() { DDRB &= ~BMASK; DDRC &= ~CMASK; DDRD &= ~DMASK; DDRE &= ~EMASK; } +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; dst = read_8(); RD_IDLE; RD_STROBE; dst = (dst<<8) | read_8(); RD_IDLE; } + +#define PIN_LOW(p, b) (p) &= ~(1<<(b)) +#define PIN_HIGH(p, b) (p) |= (1<<(b)) +#define PIN_OUTPUT(p, b) *(&p-1) |= (1<<(b)) + +#elif defined(__SAM3X8E__) && defined(USE_DUE_8BIT_PROTOSHIELD) //regular UNO shield on DUE +#warning USE_DUE_8BIT_PROTOSHIELD +// configure macros for the control pins + #define RD_PORT PIOA + #define RD_PIN 16 //A0 + #define WR_PORT PIOA + #define WR_PIN 24 //A1 + #define CD_PORT PIOA + #define CD_PIN 23 //A2 + #define CS_PORT PIOA + #define CS_PIN 22 //A3 + #define RESET_PORT PIOA + #define RESET_PIN 6 //A4 +// configure macros for data bus +#define DMASK (0xFF<<0) +#define write_8(x) { PIOD->PIO_CODR = DMASK; PIOD->PIO_SODR = x; } + +#define read_8() ( PIOD->PIO_PDSR & DMASK) + #define setWriteDir() { PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; } + #define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOD); PIOD->PIO_ODR = DMASK;} +#define write8(x) { write_8(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__SAM3X8E__) && defined(USE_DUE_16BIT_SHIELD) //regular CTE shield on DUE +#warning USE_DUE_16BIT_SHIELD +#define USES_16BIT_BUS +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 15 //D24 Graham +#define WR_PORT PIOD +#define WR_PIN 1 //D26 +#define CD_PORT PIOD +#define CD_PIN 0 //D25 +#define CS_PORT PIOD +#define CS_PIN 2 //D27 +#define RESET_PORT PIOD +#define RESET_PIN 3 //D28 +// configure macros for data bus +// DB0..DB7 on PIOC1..PIOC8, DB8..DB15 on PIOC12..PIOC19 +// +#define CMASKH (0xFF00<<4) +#define CMASKL (0x00FF<<1) +#define CMASK (CMASKH | CMASKL) +#define write_8(x) { PIOC->PIO_CODR = CMASKL; PIOC->PIO_SODR = (((x)&0x00FF)<<1); } +#define write_16(x) { PIOC->PIO_CODR = CMASK; \ + PIOC->PIO_SODR = (((x)&0x00FF)<<1)|(((x)&0xFF00)<<4); } +#define read_16() (((PIOC->PIO_PDSR & CMASKH)>>4)|((PIOC->PIO_PDSR & CMASKL)>>1) ) +#define read_8() (read_16() & 0xFF) +#define setWriteDir() { PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; } +#define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOC); PIOC->PIO_ODR = CMASK; } +#define write8(x) { write16(x & 0xFF); } +#define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__SAM3X8E__) && defined(USE_ELECHOUSE_DUE_16BIT_SHIELD) //ELECHOUSE_DUE shield on DUE +#warning USE_ELECHOUSE_DUE_16BIT_SHIELD +#define USES_16BIT_BUS +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 15 //D24 Graham +#define WR_PORT PIOA +#define WR_PIN 14 //D23 +#define CD_PORT PIOB +#define CD_PIN 26 //D22 +#define CS_PORT PIOA +#define CS_PIN 7 //D31 +#define RESET_PORT PIOC +#define RESET_PIN 1 //D33 +// configure macros for data bus +// DB0..DB7 on PIOC2..PIOC9, DB8..DB15 on PIOC12..PIOC19 +// +#define CMASKH (0xFF00<<4) +#define CMASKL (0x00FF<<2) +#define CMASK (CMASKH | CMASKL) +#define write_8(x) { PIOC->PIO_CODR = CMASKL; PIOC->PIO_SODR = (((x)&0x00FF)<<2); } +#define write_16(x) { PIOC->PIO_CODR = CMASK; \ + PIOC->PIO_SODR = (((x)&0x00FF)<<2)|(((x)&0xFF00)<<4); } +#define read_16() (((PIOC->PIO_PDSR & CMASKH)>>4)|((PIOC->PIO_PDSR & CMASKL)>>2) ) +#define read_8() (read_16() & 0xFF) +#define setWriteDir() { PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; } +#define setReadDir() { PMC->PMC_PCER0 = (1 << ID_PIOC); PIOC->PIO_ODR = CMASK; } +#define write8(x) { write16(x & 0xFF); } +#define write16(x) { write_16(x); WR_ACTIVE; WR_STROBE; WR_IDLE; WR_IDLE; } +#define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__SAM3X8E__) && defined(USE_MEGA_16BIT_SHIELD) //regular MEGA shield on DUE +#warning USE_MEGA_16BIT_SHIELD +#define USES_16BIT_BUS +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 20 //D43 +#define WR_PORT PIOC +#define WR_PIN 7 //D39 +#define CD_PORT PIOC +#define CD_PIN 6 //D38 +#define CS_PORT PIOC +#define CS_PIN 8 //D40 +#define RESET_PORT PIOC +#define RESET_PIN 9 //D41 +// configure macros for data bus +// +#define AMASK ((1<<7)|(3<<14)) //PA7, PA14-PA15 +#define BMASK (1<<26) //PB26 +#define CMASK (31<<1) //PC1-PC5 +#define DMASK ((15<<0)|(1<<6)|(3<<9)) //PD0-PD3, PD6, PD9-PD10 + +#define write_16(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ + PIOA->PIO_SODR = (((x)&(1<<6))<<1)|(((x)&(3<<9))<<5); \ + PIOB->PIO_SODR = (((x)&(1<<8))<<18); \ + PIOC->PIO_SODR = (((x)&(1<<0))<<5); \ + PIOC->PIO_SODR = (((x)&(1<<1))<<3); \ + PIOC->PIO_SODR = (((x)&(1<<2))<<1); \ + PIOC->PIO_SODR = (((x)&(1<<3))>>1); \ + PIOC->PIO_SODR = (((x)&(1<<4))>>3); \ + PIOD->PIO_SODR = (((x)&(1<<7))<<2)|(((x)&(1<<5))<<5)|(((x)&(15<<11))>>11)|(((x)&(1<<15))>>9); \ + } + +/* +#define write_16(VL) { PIOA->PIO_CODR = AMASK; PIOC->PIO_CODR = CMASK; PIOD->PIO_CODR = DMASK; \ + REG_PIOA_SODR=((((VL)>>8) & 0x06)<<13) | ((VL & 0x40)<<1);\ + if ((VL)&(1<<8)) REG_PIOB_SODR=(1<<26); else REG_PIOB_CODR=(1<<26);\ + REG_PIOC_SODR=((VL & 0x01)<<5) | ((VL & 0x02)<<3) | ((VL & 0x04)<<1) | ((VL & 0x08)>>1) | ((VL & 0x10)>>3);\ + REG_PIOD_SODR=((((VL)>>8) & 0x78)>>3) | ((((VL)>>8) & 0x80)>>1) | ((VL & 0x20)<<5) | ((VL & 0x80)<<2);\ +} +*/ +#define read_16() ( 0\ + |((PIOC->PIO_PDSR & (1<<5))>>5)\ + |((PIOC->PIO_PDSR & (1<<4))>>3)\ + |((PIOC->PIO_PDSR & (1<<3))>>1)\ + |((PIOC->PIO_PDSR & (1<<2))<<1)\ + |((PIOC->PIO_PDSR & (1<<1))<<3)\ + |((PIOD->PIO_PDSR & (1<<10))>>5)\ + |((PIOA->PIO_PDSR & (1<<7))>>1)\ + |((PIOD->PIO_PDSR & (1<<9))>>2)\ + |((PIOB->PIO_PDSR & (1<<26))>>18)\ + |((PIOA->PIO_PDSR & (3<<14))>>5)\ + |((PIOD->PIO_PDSR & (15<<0))<<11)\ + |((PIOD->PIO_PDSR & (1<<6))<<9)\ + ) +#define read_8() (read_16() & 0xFF) +#define setWriteDir() {\ + PIOA->PIO_OER = AMASK; PIOA->PIO_PER = AMASK; \ + PIOB->PIO_OER = BMASK; PIOB->PIO_PER = BMASK; \ + PIOC->PIO_OER = CMASK; PIOC->PIO_PER = CMASK; \ + PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; \ + } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD); \ + PIOA->PIO_ODR = AMASK; \ + PIOB->PIO_ODR = BMASK; \ + PIOC->PIO_ODR = CMASK; \ + PIOD->PIO_ODR = DMASK; \ + } +#define write8(x) { write16(x & 0xFF); } +// ILI9486 is slower than ILI9481 +#define write16(x) { write_16(x); WR_ACTIVE8; WR_STROBE; WR_IDLE4;} +#define READ_16(dst) { RD_STROBE; RD_ACTIVE4; dst = read_16(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_8(dst) { READ_16(dst); dst &= 0xFF; } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__SAM3X8E__) && defined(USE_MEGA_8BIT_SHIELD) //regular CTE shield on DUE +#warning USE_MEGA_8BIT_SHIELD for peloxp +// configure macros for the control pins +#define RD_PORT PIOA +#define RD_PIN 20 //D43 +#define WR_PORT PIOC +#define WR_PIN 7 //D39 +#define CD_PORT PIOC +#define CD_PIN 6 //D38 +#define CS_PORT PIOC +#define CS_PIN 8 //D40 +#define RESET_PORT PIOC +#define RESET_PIN 9 //D41 +// configure macros for data bus +// +#define AMASK ((3<<14)) //PA14-PA15 D23-D24 +#define BMASK (1<<26) //PB26 D22 +#define DMASK ((15<<0)|(1<<6)) //PD0-PD3, PD6 D25-D28,D29 + +#define write_8(x) { PIOA->PIO_CODR = AMASK; PIOB->PIO_CODR = BMASK; PIOD->PIO_CODR = DMASK; \ + PIOB->PIO_SODR = (((x)&(1<<0))<<26); \ + PIOA->PIO_SODR = (((x)&(3<<1))<<13); \ + PIOD->PIO_SODR = (((x)&(15<<3))>>3); \ + PIOD->PIO_SODR = (((x)&(1<<7))>>1); \ + } + +#define read_8() ( 0\ + |((PIOB->PIO_PDSR & (1<<26))>>26)\ + |((PIOA->PIO_PDSR & (3<<14))>>13)\ + |((PIOD->PIO_PDSR & (15<<0))<<3)\ + |((PIOD->PIO_PDSR & (1<<6))<<1)\ + ) + +#define setWriteDir() {\ + PIOA->PIO_OER = AMASK; PIOA->PIO_PER = AMASK; \ + PIOB->PIO_OER = BMASK; PIOB->PIO_PER = BMASK; \ + PIOD->PIO_OER = DMASK; PIOD->PIO_PER = DMASK; \ + } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOA)|(1 << ID_PIOB)|(1 << ID_PIOC)|(1 << ID_PIOD); \ + PIOA->PIO_ODR = AMASK; \ + PIOB->PIO_ODR = BMASK; \ + PIOD->PIO_ODR = DMASK; \ + } + +// ILI9486 is slower than ILI9481. HX8357-D is slower +#define write8(x) { write_8(x); WR_ACTIVE4; WR_STROBE; WR_IDLE; WR_IDLE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; RD_ACTIVE4; dst = read_8(); RD_IDLE; RD_IDLE; RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) + +#elif defined(__MK20DX256__) && defined(USE_BOBCACHELOT_TEENSY) // special for BOBCACHEALOT_TEENSY +#warning special for BOBCACHEALOT_TEENSY +#define RD_PORT GPIOD +#define RD_PIN 1 +#define WR_PORT GPIOC +#define WR_PIN 0 +#define CD_PORT GPIOB +#define CD_PIN 0 +#define CS_PORT GPIOB +#define CS_PIN 1 +#define RESET_PORT GPIOB +#define RESET_PIN 3 + +// configure macros for the data pins +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)) + + #define write_8(d) { \ + GPIOC_PCOR = CMASK; GPIOD_PCOR = DMASK; \ + GPIOC_PSOR = (((d) & (1<<1)) << 2); \ + GPIOD_PSOR = (d) & DMASK; \ + } + #define read_8() ( (GPIOD_PDIR & DMASK) | (GPIOC_PDIR & (1<<3)) >> 2 ) + #define setWriteDir() {GPIOC_PDDR |= CMASK;GPIOD_PDDR |= DMASK; } + #define setReadDir() {GPIOC_PDDR &= ~CMASK;GPIOD_PDDR &= ~DMASK; } + +#define write8(x) { write_8(x); WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +#elif defined(USE_MY_BLUEPILL) && (defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_BLUEPILL_F103C8)) +#warning Uno Shield on MY BLUEPILL + +//LCD pins |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 | |RD |WR |RS |CS |RST| |SD_SS|SD_DI|SD_DO|SD_SCK| |SDA|SCL| +//STM32 pin |PA3 |PA2 |PA1|PA0|PB7|PB6|PA10|PA9| |PB1|PB0|PA7|PA6|PA5| |PB12 |PB15 |PB14 |PB13 | |PB9|PB8| + +#if defined(ARDUINO_BLUEPILL_F103C8) //regular CMSIS libraries +#define REGS(x) x +#define GPIO_INIT() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_AFIOEN; \ + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;} +#else //weird Maple libraries +#define REGS(x) regs->x +#endif + +#define WRITE_DELAY { } +#define READ_DELAY { RD_ACTIVE; } +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +#define PIN_OUTPUT(port, pin) {\ + if (pin < 8) {GP_OUT(port, CRL, 0xF<<((pin)<<2));} \ + else {GP_OUT(port, CRH, 0xF<<((pin&7)<<2));} \ + } +#define PIN_INPUT(port, pin) { \ + if (pin < 8) { GP_INP(port, CRL, 0xF<<((pin)<<2)); } \ + else { GP_INP(port, CRH, 0xF<<((pin&7)<<2)); } \ + } +#define PIN_HIGH(port, pin) (port)-> REGS(BSRR) = (1<<(pin)) +#define PIN_LOW(port, pin) (port)-> REGS(BSRR) = (1<<((pin)+16)) + +#define RD_PORT GPIOB +#define RD_PIN 1 +#define WR_PORT GPIOB +#define WR_PIN 0 +#define CD_PORT GPIOA +#define CD_PIN 7 +#define CS_PORT GPIOA +#define CS_PIN 6 +#define RESET_PORT GPIOA +#define RESET_PIN 5 + +// configure macros for the data pins +#define AMASK 0x060F +#define BMASK 0x00C0 +#define write_8(d) { GPIOA->REGS(BSRR) = AMASK << 16; GPIOB->REGS(BSRR) = BMASK << 16; \ + GPIOA->REGS(BSRR) = (((d) & 3) << 9) | (((d) & 0xF0) >> 4); \ + GPIOB->REGS(BSRR) = (((d) & 0x0C) << 4); \ + } +#define read_8() (((GPIOA->REGS(IDR) & (3<<9)) >> 9) | ((GPIOA->REGS(IDR) & (0x0F)) << 4) | ((GPIOB->REGS(IDR) & (3<<6)) >> 4)) +// PA10,PA9 PA3-PA0 PB7,PB6 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFF0); GP_OUT(GPIOA, CRL, 0xFFFF); GP_OUT(GPIOB, CRL, 0xFF000000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFF0); GP_INP(GPIOA, CRL, 0xFFFF); GP_INP(GPIOB, CRL, 0xFF000000); } + +#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; } +#define write16(x) { uint8_t h = (x)>>8, l = x; write8(h); write8(l); } +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { uint8_t hi; READ_8(hi); READ_8(dst); dst |= (hi << 8); } + +//####################################### ADIGITALEU_TEENSY ############################ +//UNTESTED +#elif defined(__MK66FX1M0__) && defined(USE_ADIGITALEU_TEENSY) // 16bit on a Teensy 3.6 +#warning "Teensy 3.6 16bit port C & D only (for now)" +// Note: Port usage explained in UTFT Teensy edition ...\libraries\UTFT\hardware\arm\HW_Teensy3.h" + +#define USES_16BIT_BUS + +#define WRITE_DELAY { WR_ACTIVE8; } +#define READ_DELAY { RD_ACTIVE16; } + +#define RD_PORT GPIOA +#define RD_PIN 16 //28 RD +#define WR_PORT GPIOA +#define WR_PIN 5 //25 WR +#define CD_PORT GPIOE +#define CD_PIN 26 //24 RS +#define CS_PORT GPIOA +#define CS_PIN 14 //26 CS +#define RESET_PORT GPIOA +#define RESET_PIN 15 //27 Reset + +#define write_8(d) { GPIOC_PDOR = d; } +#define write_16(d) { GPIOC_PDOR = d; GPIOD_PDOR = (d >> 8);} + +#define read_8() (GPIOC_PDIR) +#define read_16() (GPIOC_PDIR | GPIOD_PDIR << 8) + +#define setWriteDir() {GPIOC_PDDR |= 0xFF; GPIOD_PDDR |= 0xFF; } +#define setReadDir() {GPIOC_PDDR &= ~0xFF; GPIOD_PDDR &= ~0xFF; } + +#define write8(x) {write_8(x); WRITE_DELAY; WR_STROBE } +#define write16(x) {write_16(x); WRITE_DELAY; WR_STROBE } + +#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; } +#define READ_16(dst) { RD_STROBE; READ_DELAY; dst = read_16(); RD_IDLE;} + +//Data: Teensy pins -> D0-D15 : +// Teensy probably initialises some pins for Analog, Timer, Alternate, ... +// so it is probably wise to use pinMode(n, OUTPUT) for all the control and data lines +#define GPIO_INIT() {pinMode(2, OUTPUT); for (int i = 5; i <= 15; i++) pinMode(i, OUTPUT); for (int i = 20; i <= 28; i++) pinMode(i, OUTPUT);} + +#define PASTE(x, y) x ## y + +#define PIN_LOW(port, pin) PASTE(port, _PCOR) = (1<<(pin)) +#define PIN_HIGH(port, pin) PASTE(port, _PSOR) = (1<<(pin)) +#define PIN_OUTPUT(port, pin) PASTE(port, _PDDR) |= (1<<(pin)) + +#else +#define USE_SPECIAL_FAIL +#endif diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_1.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_1.h new file mode 100644 index 0000000..4f45b7f --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_1.h @@ -0,0 +1,1008 @@ +#ifndef PIN_SHIELD_1_H_ +#define PIN_SHIELD_1_H_ + +// just provide macros for the Arduino pins +// i.e. PIN_LOW(), PIN_HIGH(), PIN_OUTPUT(), PIN_INPUT(), PIN_READ() + +#define LPC810 810 +#define LPC812 812 +#define LPC1343 1343 +#define LPC1768 1768 +#define LPC2103 2103 +#define LPC2148 2148 + +#define ISTARGET_NUCLEO64 (0 \ + || defined(TARGET_NUCLEO_F072RB) \ + || defined(TARGET_NUCLEO_F103RB) \ + || defined(TARGET_NUCLEO_F401RE) \ + || defined(TARGET_NUCLEO_F411RE) \ + || defined(TARGET_NUCLEO_F446RE) \ + || defined(TARGET_NUCLEO_L433RC_P) \ + || defined(TARGET_NUCLEO_L476RG) \ + ) + +#define ISTARGET_NUCLEO144 (0 \ + || defined(TARGET_NUCLEO_F767ZI) \ + ) + +//#warning Using pin_SHIELD_1.h + +#if 0 +#elif defined(MY_BLUEPILL) +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) + #if defined(__CC_ARM) + #include + #else + #include + #endif + #define D0_PORT GPIOB + #define D0_PIN 11 + #define D1_PORT GPIOB + #define D1_PIN 10 + #define D2_PORT GPIOB + #define D2_PIN 6 + #define D3_PORT GPIOB + #define D3_PIN 7 + #define D4_PORT GPIOA + #define D4_PIN 0 + #define D5_PORT GPIOA + #define D5_PIN 1 + #define D6_PORT GPIOA + #define D6_PIN 2 + #define D7_PORT GPIOA + #define D7_PIN 3 + #define D8_PORT GPIOA + #define D8_PIN 9 + #define D9_PORT GPIOA + #define D9_PIN 10 + #define D10_PORT GPIOB + #define D10_PIN 12 + #define D11_PORT GPIOB + #define D11_PIN 15 + #define D12_PORT GPIOB + #define D12_PIN 14 + #define D13_PORT GPIOB + #define D13_PIN 13 + #define A0_PORT GPIOB + #define A0_PIN 1 + #define A1_PORT GPIOB + #define A1_PIN 0 + #define A2_PORT GPIOA + #define A2_PIN 7 + #define A3_PORT GPIOA + #define A3_PIN 6 + #define A4_PORT GPIOA + #define A4_PIN 5 + #define A5_PORT GPIOB + #define A5_PIN 4 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +#define PIN_READ(port, pin) (port)->IDR & (1<<(pin)) +#define PIN_MODE4(reg, pin, mode) reg=(reg&~(0xF<<((pin)<<2)))|(mode<<((pin)<<2)) +#define PIN_OUTPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x3); else PIN_MODE4((port)->CRL, pin, 0x3); } //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x4); else PIN_MODE4((port)->CRL, pin, 0x4); } //input + + +#elif defined(BLUEPILL) +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) + #if defined(__CC_ARM) + #include + #else + #include + #endif + #define D0_PORT GPIOA + #define D0_PIN 10 + #define D1_PORT GPIOA + #define D1_PIN 9 + #define D2_PORT GPIOA + #define D2_PIN 2 + #define D3_PORT GPIOA + #define D3_PIN 3 + #define D4_PORT GPIOA + #define D4_PIN 4 + #define D5_PORT GPIOA + #define D5_PIN 5 + #define D6_PORT GPIOA + #define D6_PIN 6 + #define D7_PORT GPIOA + #define D7_PIN 7 + #define D8_PORT GPIOA + #define D8_PIN 0 + #define D9_PORT GPIOA + #define D9_PIN 1 + #define D10_PORT GPIOA + #define D10_PIN 15 + #define D11_PORT GPIOB + #define D11_PIN 5 + #define D12_PORT GPIOB + #define D12_PIN 4 + #define D13_PORT GPIOB + #define D13_PIN 3 + #define A0_PORT GPIOB +// #define A0_PIN 5 //original pcb uses SPI pin + #define A0_PIN 0 //hardware mod to Adapter to PB0. Allows use of PB5 for SD Card + #define A1_PORT GPIOB + #define A1_PIN 6 + #define A2_PORT GPIOB + #define A2_PIN 7 + #define A3_PORT GPIOB + #define A3_PIN 8 + #define A4_PORT GPIOB + #define A4_PIN 9 + #define A5_PORT GPIOB + #define A5_PIN 10 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +#define PIN_READ(port, pin) (port)->IDR & (1<<(pin)) +#define PIN_MODE4(reg, pin, mode) reg=(reg&~(0xF<<((pin)<<2)))|(mode<<((pin)<<2)) +#define PIN_OUTPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x3); else PIN_MODE4((port)->CRL, pin, 0x3); } //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x4); else PIN_MODE4((port)->CRL, pin, 0x4); } //input + + +#elif defined(ITEADMAPLE) +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) + #if defined(__CC_ARM) + #include + #else + #include + #endif + #define D0_PORT GPIOA + #define D0_PIN 3 + #define D1_PORT GPIOA + #define D1_PIN 2 + #define D2_PORT GPIOA + #define D2_PIN 0 + #define D3_PORT GPIOA + #define D3_PIN 1 + #define D4_PORT GPIOB + #define D4_PIN 5 + #define D5_PORT GPIOB + #define D5_PIN 6 + #define D6_PORT GPIOA + #define D6_PIN 8 + #define D7_PORT GPIOA + #define D7_PIN 9 + #define D8_PORT GPIOA + #define D8_PIN 10 + #define D9_PORT GPIOB + #define D9_PIN 7 + #define D10_PORT GPIOA + #define D10_PIN 4 + #define D11_PORT GPIOA + #define D11_PIN 7 + #define D12_PORT GPIOA + #define D12_PIN 6 + #define D13_PORT GPIOA + #define D13_PIN 5 + #define A0_PORT GPIOC + #define A0_PIN 0 + #define A1_PORT GPIOC + #define A1_PIN 1 + #define A2_PORT GPIOC + #define A2_PIN 2 + #define A3_PORT GPIOC + #define A3_PIN 3 + #define A4_PORT GPIOC + #define A4_PIN 4 + #define A5_PORT GPIOC + #define A5_PIN 5 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +#define PIN_READ(port, pin) (port)->IDR & (1<<(pin)) +#define PIN_MODE4(reg, pin, mode) reg=(reg&~(0xF<<((pin)<<2)))|(mode<<((pin)<<2)) +#define PIN_OUTPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x3); else PIN_MODE4((port)->CRL, pin, 0x3); } //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) {if (pin > 7) PIN_MODE4((port)->CRH, (pin&7), 0x4); else PIN_MODE4((port)->CRL, pin, 0x4); } //input + + +#elif defined(NUCLEO144) || ISTARGET_NUCLEO144 +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) +#if __MBED__ +#warning MBED knows everything +#elif defined(STM32F767xx) + #include +#endif + #define D0_PORT GPIOG + #define D0_PIN 9 + #define D1_PORT GPIOG + #define D1_PIN 14 + #define D2_PORT GPIOF + #define D2_PIN 15 + #define D3_PORT GPIOE + #define D3_PIN 13 + #define D4_PORT GPIOF + #define D4_PIN 14 + #define D5_PORT GPIOE + #define D5_PIN 11 + #define D6_PORT GPIOE + #define D6_PIN 9 + #define D7_PORT GPIOF + #define D7_PIN 13 + #define D8_PORT GPIOF + #define D8_PIN 12 + #define D9_PORT GPIOD + #define D9_PIN 15 + #define D10_PORT GPIOD + #define D10_PIN 14 + #define D11_PORT GPIOA + #define D11_PIN 7 + #define D12_PORT GPIOA + #define D12_PIN 6 + #define D13_PORT GPIOA + #define D13_PIN 5 + #define A0_PORT GPIOA + #define A0_PIN 3 + #define A1_PORT GPIOC + #define A1_PIN 0 + #define A2_PORT GPIOC + #define A2_PIN 3 + #define A3_PORT GPIOF + #define A3_PIN 3 + #define A4_PORT GPIOF + #define A4_PIN 5 + #define A5_PORT GPIOF + #define A5_PIN 10 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->ODR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->ODR |= (1<<(pin)) +#define PIN_READ(port, pin) (port)->IDR & (1<<(pin)) +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) +#define PIN_INPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x0) //.kbv check this + +#elif defined(NUCLEO) || ISTARGET_NUCLEO64 +#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1)) +#if __MBED__ +#warning MBED knows everything +#elif defined(STM32F072xB) + #include +#elif defined(STM32F103xB) + #if defined(__CC_ARM) + #include + #else + #include + #endif +#elif defined(STM32L476xx) || defined(STM32L433xx) + #include +#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) + #include +#endif + #define D0_PORT GPIOA + #define D0_PIN 3 + #define D1_PORT GPIOA + #define D1_PIN 2 + #define D2_PORT GPIOA + #define D2_PIN 10 + #define D3_PORT GPIOB + #define D3_PIN 3 + #define D4_PORT GPIOB + #define D4_PIN 5 + #define D5_PORT GPIOB + #define D5_PIN 4 + #define D6_PORT GPIOB + #define D6_PIN 10 + #define D7_PORT GPIOA + #define D7_PIN 8 + #define D8_PORT GPIOA + #define D8_PIN 9 + #define D9_PORT GPIOC + #define D9_PIN 7 + #define D10_PORT GPIOB + #define D10_PIN 6 + #define D11_PORT GPIOA + #define D11_PIN 7 + #define D12_PORT GPIOA + #define D12_PIN 6 + #define D13_PORT GPIOA + #define D13_PIN 5 + #define A0_PORT GPIOA + #define A0_PIN 0 + #define A1_PORT GPIOA + #define A1_PIN 1 + #define A2_PORT GPIOA + #define A2_PIN 4 + #define A3_PORT GPIOB + #define A3_PIN 0 + #define A4_PORT GPIOC + #define A4_PIN 1 + #define A5_PORT GPIOC + #define A5_PIN 0 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->BSRR = (1<<((pin)+16)) +#define PIN_HIGH(port, pin) (port)->BSRR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->ODR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->ODR |= (1<<(pin)) +#define PIN_READ(port, pin) (port)->IDR & (1<<(pin)) +#if defined(STM32F103xB) + #warning STM32F103xB ****************************** +#define PIN_MODE4(reg, pin, mode) reg=(reg&~(0xF<<((pin)<<2)))|(mode<<((pin)<<2)) +#define PIN_OUTPUT(port, pin) PIN_MODE4((port)->CRL, pin, 0x3) //50MHz push-pull only 0-7 +#define PIN_INPUT(port, pin) PIN_MODE4((port)->CRL, pin, 0x4) //digital input +#else +#define PIN_OUTPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x1) +#define PIN_INPUT(port, pin) PIN_MODE2((port)->MODER, pin, 0x0) //.kbv check this +#endif + +#elif __TARGET_PROCESSOR == LPC1768 + #include +// configure macros for the control pins + #define D0_PORT LPC_GPIO0 + #define D0_PIN 3 + #define D1_PORT LPC_GPIO0 + #define D1_PIN 2 + #define D2_PORT LPC_GPIO0 + #define D2_PIN 24 //p16 + #define D3_PORT LPC_GPIO0 + #define D3_PIN 23 //p15 + #define D4_PORT LPC_GPIO0 + #define D4_PIN 16 //p14 + #define D5_PORT LPC_GPIO0 + #define D5_PIN 15 //p13 + #define D6_PORT LPC_GPIO0 + #define D6_PIN 17 //p12 + #define D7_PORT LPC_GPIO0 + #define D7_PIN 18 //p11 + #define D8_PORT LPC_GPIO0 + #define D8_PIN 1 //p10 + #define D9_PORT LPC_GPIO0 + #define D9_PIN 0 //p9 + #define D10_PORT LPC_GPIO0 + #define D10_PIN 6 //p8 + #define D11_PORT LPC_GPIO0 + #define D11_PIN 9 //p5 + #define D12_PORT LPC_GPIO0 + #define D12_PIN 8 //p6 miso + #define D13_PORT LPC_GPIO0 + #define D13_PIN 7 //p7 + #define A0_PORT LPC_GPIO0 + #define A0_PIN 25 //p17 + #define A1_PORT LPC_GPIO0 + #define A1_PIN 26 //p18 + #define A2_PORT LPC_GPIO1 + #define A2_PIN 30 //p19 + #define A3_PORT LPC_GPIO1 + #define A3_PIN 31 //p20 + #define A4_PORT LPC_GPIO0 + #define A4_PIN 10 //p28 + #define A5_PORT LPC_GP100 + #define A5_PIN 11 //p27 +// Shield Control macros +#define PIN_LOW(port, pin) (port)->FIOCLR = (1u<<(pin)) +#define PIN_HIGH(port, pin) (port)->FIOSET = (1u<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->FIODIR |= (1u<<(pin)) +#define PIN_INPUT(port, pin) (port)->FIODIR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->FIOPIN & (1u<<(pin)) + +#elif (defined(MK20D7) && defined(TEENSY)) || defined(TARGET_TEENSY3_1) +#if __MBED__ +#warning MBED knows everything +#else + #include +#endif + #define D0_PORT PTB + #define D0_PIN 16 + #define D1_PORT PTB + #define D1_PIN 17 + #define D2_PORT PTD + #define D2_PIN 0 + #define D3_PORT PTA + #define D3_PIN 12 + #define D4_PORT PTA + #define D4_PIN 13 + #define D5_PORT PTD + #define D5_PIN 7 + #define D6_PORT PTD + #define D6_PIN 4 + #define D7_PORT PTD + #define D7_PIN 2 + #define D8_PORT PTD + #define D8_PIN 3 + #define D9_PORT PTC + #define D9_PIN 3 + #define D10_PORT PTC + #define D10_PIN 4 + #define D11_PORT PTC + #define D11_PIN 6 + #define D12_PORT PTC + #define D12_PIN 7 + #define D13_PORT PTC + #define D13_PIN 5 + #define A0_PORT PTD + #define A0_PIN 1 + #define A1_PORT PTC + #define A1_PIN 0 + #define A2_PORT PTB + #define A2_PIN 0 + #define A3_PORT PTB + #define A3_PIN 1 + #define A4_PORT PTB + #define A4_PIN 3 + #define A5_PORT PTB + #define A5_PIN 2 +// Shield Control macros. Deliberately avoid the IOSET registers +#define PIN_LOW(port, pin) (port)->PCOR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PSOR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->PDOR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->PDOR |= (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PDDR |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PDDR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PDIR & (1u<<(pin)) + + +#elif defined(MKL25Z4) || defined(TARGET_KL25Z) + #include + #define D0_PORT PTA + #define D0_PIN 1 + #define D1_PORT PTA + #define D1_PIN 2 + #define D2_PORT PTD + #define D2_PIN 4 + #define D3_PORT PTA + #define D3_PIN 12 + #define D4_PORT PTA + #define D4_PIN 4 + #define D5_PORT PTA + #define D5_PIN 5 + #define D6_PORT PTC + #define D6_PIN 8 + #define D7_PORT PTC + #define D7_PIN 9 + #define D8_PORT PTA + #define D8_PIN 13 + #define D9_PORT PTD + #define D9_PIN 5 + #define D10_PORT PTD + #define D10_PIN 0 + #define D11_PORT PTD + #define D11_PIN 2 + #define D12_PORT PTD + #define D12_PIN 3 + #define D13_PORT PTD + #define D13_PIN 1 + #define A0_PORT PTB + #define A0_PIN 0 + #define A1_PORT PTB + #define A1_PIN 1 + #define A2_PORT PTB + #define A2_PIN 2 + #define A3_PORT PTB + #define A3_PIN 3 + #define A4_PORT PTC + #define A4_PIN 2 + #define A5_PORT PTC + #define A5_PIN 1 +// Shield Control macros. Deliberately avoid the IOSET registers +#define PIN_LOW(port, pin) (port)->PCOR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PSOR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->PDOR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->PDOR |= (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PDDR |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PDDR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PDIR & (1u<<(pin)) + +#elif defined(MKL26Z4) + #include + #define D0_PORT PTA + #define D0_PIN 1 + #define D1_PORT PTA + #define D1_PIN 2 + #define D2_PORT PTD + #define D2_PIN 3 //PTD4 on KL25 + #define D3_PORT PTA + #define D3_PIN 12 + #define D4_PORT PTA + #define D4_PIN 4 + #define D5_PORT PTA + #define D5_PIN 5 + #define D6_PORT PTC + #define D6_PIN 8 + #define D7_PORT PTC + #define D7_PIN 9 + #define D8_PORT PTA + #define D8_PIN 13 + #define D9_PORT PTD + #define D9_PIN 2 //PTD5 on KL25 + #define D10_PORT PTD + #define D10_PIN 4 //PTD0 + #define D11_PORT PTD + #define D11_PIN 6 //PTD2 + #define D12_PORT PTD + #define D12_PIN 7 //PTD3 + #define D13_PORT PTD + #define D13_PIN 5 //PTD1 + #define A0_PORT PTB + #define A0_PIN 0 + #define A1_PORT PTB + #define A1_PIN 1 + #define A2_PORT PTB + #define A2_PIN 2 + #define A3_PORT PTB + #define A3_PIN 3 + #define A4_PORT PTC + #define A4_PIN 2 + #define A5_PORT PTC + #define A5_PIN 1 +// Shield Control macros. Deliberately avoid the IOSET registers +#define PIN_LOW(port, pin) (port)->PCOR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PSOR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->PDOR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->PDOR |= (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PDDR |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PDDR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PDIR & (1u<<(pin)) + +#elif defined(MKL05Z4) || defined(TARGET_KL05Z) + #include + #define D0_PORT PTB + #define D0_PIN 2 + #define D1_PORT PTB + #define D1_PIN 1 + #define D2_PORT PTA + #define D2_PIN 11 + #define D3_PORT PTB + #define D3_PIN 5 + #define D4_PORT PTA + #define D4_PIN 10 + #define D5_PORT PTA + #define D5_PIN 12 + #define D6_PORT PTB + #define D6_PIN 6 + #define D7_PORT PTB + #define D7_PIN 7 + #define D8_PORT PTB + #define D8_PIN 13 + #define D9_PORT PTB + #define D9_PIN 5 + #define D10_PORT PTA + #define D10_PIN 0 + #define D11_PORT PTA + #define D11_PIN 2 + #define D12_PORT PTA + #define D12_PIN 3 + #define D13_PORT PTB + #define D13_PIN 1 + #define A0_PORT PTB + #define A0_PIN 8 + #define A1_PORT PTB + #define A1_PIN 9 + #define A2_PORT PTA + #define A2_PIN 8 + #define A3_PORT PTA + #define A3_PIN 0 + #define A4_PORT PTA + #define A4_PIN 9 + #define A5_PORT PTB + #define A5_PIN 13 +// Shield Control macros +//#define PIN_LOW(port, pin) (port)->PCOR = (1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->PSOR = (1<<(pin)) +#define PIN_LOW(port, pin) (port)->PDOR &= ~(1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PDOR |= (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PDDR |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PDDR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PDIR & (1u<<(pin)) + +#elif defined(MK20D5) || defined(TARGET_K20D50M) + #include + #define D0_PORT PTE + #define D0_PIN 1 + #define D1_PORT PTE + #define D1_PIN 0 + #define D2_PORT PTA + #define D2_PIN 5 + #define D3_PORT PTD + #define D3_PIN 4 + #define D4_PORT PTC + #define D4_PIN 8 + #define D5_PORT PTA + #define D5_PIN 1 + #define D6_PORT PTC + #define D6_PIN 3 + #define D7_PORT PTC + #define D7_PIN 4 + #define D8_PORT PTA + #define D8_PIN 12 + #define D9_PORT PTA + #define D9_PIN 2 + #define D10_PORT PTC + #define D10_PIN 2 + #define D11_PORT PTD + #define D11_PIN 2 + #define D12_PORT PTD + #define D12_PIN 3 + #define D13_PORT PTD + #define D13_PIN 1 + #define A0_PORT PTC + #define A0_PIN 0 + #define A1_PORT PTC + #define A1_PIN 1 + #define A2_PORT PTD + #define A2_PIN 6 + #define A3_PORT PTD + #define A3_PIN 5 + #define A4_PORT PTB + #define A4_PIN 1 + #define A5_PORT PTB + #define A5_PIN 0 +// Shield Control macros. Deliberately avoid the IOSET registers +#define PIN_LOW(port, pin) (port)->PCOR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PSOR = (1<<(pin)) +//#define PIN_LOW(port, pin) (port)->PDOR &= ~(1<<(pin)) +//#define PIN_HIGH(port, pin) (port)->PDOR |= (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PDDR |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PDDR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PDIR & (1u<<(pin)) + + +#elif defined(ZERO) + #include +// configure macros for the data pins +#if defined(D21_XPRO) + #define D0_PORT PORT->Group[1] + #define D0_PIN 9 + #define D1_PORT PORT->Group[1] + #define D1_PIN 8 + #define D2_PORT PORT->Group[1] + #define D2_PIN 14 + #define D3_PORT PORT->Group[1] + #define D3_PIN 2 + #define D4_PORT PORT->Group[1] + #define D4_PIN 5 + #define D5_PORT PORT->Group[0] + #define D5_PIN 21 + #define D6_PORT PORT->Group[1] + #define D6_PIN 15 + #define D7_PORT PORT->Group[0] + #define D7_PIN 17 + #define D8_PORT PORT->Group[1] + #define D8_PIN 6 + #define D9_PORT PORT->Group[1] + #define D9_PIN 7 + #define D10_PORT PORT->Group[0] + #define D10_PIN 5 + #define D11_PORT PORT->Group[0] + #define D11_PIN 6 + #define D12_PORT PORT->Group[0] + #define D12_PIN 4 + #define D13_PORT PORT->Group[0] + #define D13_PIN 7 + #define A0_PORT PORT->Group[1] + #define A0_PIN 0 + #define A1_PORT PORT->Group[1] + #define A1_PIN 1 + #define A2_PORT PORT->Group[0] + #define A2_PIN 10 + #define A3_PORT PORT->Group[0] + #define A3_PIN 11 + #define A4_PORT PORT->Group[0] + #define A4_PIN 8 + #define A5_PORT PORT->Group[0] + #define A5_PIN 9 +#elif defined(M0_PRO) + #define D0_PORT PORT->Group[0] + #define D0_PIN 11 + #define D1_PORT PORT->Group[0] + #define D1_PIN 10 + //M0 and Zero physical PA08 and PA14 are swapped + #define D2_PORT PORT->Group[0] //PA08 (Zero-D4) + #define D2_PIN 8 + #define D3_PORT PORT->Group[0] + #define D3_PIN 9 + #define D4_PORT PORT->Group[0] //PA14 (Zero-D2) + #define D4_PIN 14 + #define D5_PORT PORT->Group[0] + #define D5_PIN 15 + #define D6_PORT PORT->Group[0] + #define D6_PIN 20 + #define D7_PORT PORT->Group[0] + #define D7_PIN 21 + #define D8_PORT PORT->Group[0] + #define D8_PIN 6 + #define D9_PORT PORT->Group[0] + #define D9_PIN 7 + #define D10_PORT PORT->Group[0] + #define D10_PIN 18 + #define D11_PORT PORT->Group[0] + #define D11_PIN 16 + #define D12_PORT PORT->Group[0] + #define D12_PIN 19 + #define D13_PORT PORT->Group[0] + #define D13_PIN 17 + //M0 and Zero Arduino digital pin numbering is DIFFERENT + #define D16_PORT PORT->Group[0] //PA22 (SDA) (Zero-D20) + #define D16_PIN 22 + #define D17_PORT PORT->Group[0] //PA23 (SCL) (Zero-D21) + #define D17_PIN 23 + #define D18_PORT PORT->Group[0] //PA12 (MISO) (Zero-D22) + #define D18_PIN 12 + #define D20_PORT PORT->Group[1] //PB11 (SCK) (Zero-D24) + #define D20_PIN 11 + #define D21_PORT PORT->Group[1] //PB10 (MOSI) (Zero-D23) + #define D21_PIN 10 + #define A0_PORT PORT->Group[0] //PA02(M0-D24) (Zero-D14) + #define A0_PIN 2 + #define A1_PORT PORT->Group[1] //PB08 + #define A1_PIN 8 + #define A2_PORT PORT->Group[1] //PB09 + #define A2_PIN 9 + #define A3_PORT PORT->Group[0] //PA04 + #define A3_PIN 4 + #define A4_PORT PORT->Group[0] //PA05 + #define A4_PIN 5 + #define A5_PORT PORT->Group[1] //PB02 + #define A5_PIN 2 + +#endif +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port).DIR.reg &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port).IN.reg & (1u<<(pin)) + + +//####################################### DUE ############################ +#elif defined(__SAM3X8E__) + #include + #define D0_PORT PIOA + #define D0_PIN 8 + #define D1_PORT PIOA + #define D1_PIN 9 + #define D2_PORT PIOB + #define D2_PIN 25 + #define D3_PORT PIOC + #define D3_PIN 28 + #define D4_PORT PIOC //also PA29 + #define D4_PIN 26 + #define D5_PORT PIOC + #define D5_PIN 25 + #define D6_PORT PIOC + #define D6_PIN 24 + #define D7_PORT PIOC + #define D7_PIN 23 + #define D8_PORT PIOC + #define D8_PIN 22 + #define D9_PORT PIOC + #define D9_PIN 21 + #define D10_PORT PIOC //also PA28 + #define D10_PIN 29 + #define D11_PORT PIOD + #define D11_PIN 7 + #define D12_PORT PIOD + #define D12_PIN 8 + #define D13_PORT PIOB + #define D13_PIN 27 + #define A0_PORT PIOA + #define A0_PIN 16 + #define A1_PORT PIOA + #define A1_PIN 24 + #define A2_PORT PIOA + #define A2_PIN 23 + #define A3_PORT PIOA + #define A3_PIN 22 + #define A4_PORT PIOA + #define A4_PIN 6 + #define A5_PORT PIOA + #define A5_PIN 4 +// Shield Control macros. +#define PIN_LOW(port, pin) (port)->PIO_CODR = (1<<(pin)) +#define PIN_HIGH(port, pin) (port)->PIO_SODR = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port)->PIO_OER = (1<<(pin)) +#define PIN_INPUT(port, pin) (port)->PIO_ODR &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port)->PIO_PDSR & (1u<<(pin)) + + +#elif defined(__AVR_ATxmegaA4U__) + #include + // PD6, PD7 is used for USB. I could have used PORTA for bus, PORTC for MSPI, SPI and remap + #define D0_PORT PORTE + #define D0_PIN 2 + #define D1_PORT PORTE + #define D1_PIN 3 + #define D2_PORT PORTC + #define D2_PIN 2 + #define D3_PORT PORTC + #define D3_PIN 3 + #define D4_PORT PORTC + #define D4_PIN 4 + #define D5_PORT PORTC + #define D5_PIN 5 + #define D6_PORT PORTC + #define D6_PIN 6 + #define D7_PORT PORTC + #define D7_PIN 7 + #define D8_PORT PORTC + #define D8_PIN 0 + #define D9_PORT PORTC + #define D9_PIN 1 + #define D10_PORT PORTD + #define D10_PIN 0 + #define D11_PORT PORTD + #define D11_PIN 3 + #define D12_PORT PORTD + #define D12_PIN 2 + #define D13_PORT PORTD + #define D13_PIN 1 + #define A0_PORT PORTB + #define A0_PIN 0 + #define A1_PORT PORTB + #define A1_PIN 1 + #define A2_PORT PORTB + #define A2_PIN 2 + #define A3_PORT PORTB + #define A3_PIN 3 + #define A4_PORT PORTE + #define A4_PIN 0 + #define A5_PORT PORTE + #define A5_PIN 1 +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port).DIR.reg &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port).IN.reg & (1u<<(pin)) + + +#elif defined(__AVR_ATmega4809__) && defined(ARDUINO_AVR_NANO_EVERY) //NANO-EVERY +#warning using NANO-EVERY + #include + #define D0_PORT PORTC + #define D0_PIN 5 + #define D1_PORT PORTC + #define D1_PIN 4 + #define D2_PORT PORTA + #define D2_PIN 0 + #define D3_PORT PORTF + #define D3_PIN 5 + #define D4_PORT PORTC + #define D4_PIN 6 + #define D5_PORT PORTB + #define D5_PIN 2 + #define D6_PORT PORTF + #define D6_PIN 4 + #define D7_PORT PORTA + #define D7_PIN 1 + #define D8_PORT PORTE + #define D8_PIN 3 + #define D9_PORT PORTB + #define D9_PIN 0 + #define D10_PORT PORTB //PB1 + #define D10_PIN 1 + #define D11_PORT PORTE + #define D11_PIN 0 + #define D12_PORT PORTE + #define D12_PIN 1 + #define D13_PORT PORTE + #define D13_PIN 2 + #define A0_PORT PORTD + #define A0_PIN 3 + #define A1_PORT PORTD + #define A1_PIN 2 + #define A2_PORT PORTD + #define A2_PIN 1 + #define A3_PORT PORTD + #define A3_PIN 0 + #define A4_PORT PORTF + #define A4_PIN 2 + #define A5_PORT PORTF + #define A5_PIN 3 + #define A6_PORT PORTD + #define A6_PIN 5 + #define A7_PORT PORTD + #define A7_PIN 4 +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port).DIR.reg &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port).IN.reg & (1u<<(pin)) + + +#elif defined(__AVR_ATmega4809__) //XPRO_4809 with XPRO_SHIELD_ADAPTER +#warning using XPRO_4809 with XPRO_SHIELD_ADAPTER + #include + #define D0_PORT PORTA + #define D0_PIN 1 + #define D1_PORT PORTA + #define D1_PIN 0 + #define D2_PORT PORTB + #define D2_PIN 2 + #define D3_PORT PORTC + #define D3_PIN 6 + #define D4_PORT PORTC + #define D4_PIN 7 + #define D5_PORT PORTF + #define D5_PIN 6 + #define D6_PORT PORTB + #define D6_PIN 3 + #define D7_PORT PORTE + #define D7_PIN 1 + #define D8_PORT PORTA + #define D8_PIN 2 + #define D9_PORT PORTA + #define D9_PIN 3 + #define D10_PORT PORTA + #define D10_PIN 7 + #define D11_PORT PORTA //PC5 + #define D11_PIN 4 + #define D12_PORT PORTA + #define D12_PIN 5 + #define D13_PORT PORTA + #define D13_PIN 6 + #define A0_PORT PORTD + #define A0_PIN 2 + #define A1_PORT PORTD + #define A1_PIN 3 + #define A2_PORT PORTD + #define A2_PIN 4 + #define A3_PORT PORTD + #define A3_PIN 5 + #define A4_PORT PORTC + #define A4_PIN 2 + #define A5_PORT PORTC + #define A5_PIN 3 +// Shield Control macros. +#define PIN_LOW(port, pin) (port).OUTCLR.reg = (1<<(pin)) +#define PIN_HIGH(port, pin) (port).OUTSET.reg = (1<<(pin)) +#define PIN_OUTPUT(port, pin) (port).DIR.reg |= (1<<(pin)) +#define PIN_INPUT(port, pin) (port).DIR.reg &= ~(1u<<(pin)) +#define PIN_READ(port, pin) (port).IN.reg & (1u<<(pin)) + + +#elif defined(__AVR_ATtiny1634__) + #include + // + #define D0_PORT PORTA //PA7 + #define D0_PIN 7 + #define D1_PORT PORTB //PB0 + #define D1_PIN 0 + #define D2_PORT PORTC //PC2 + #define D2_PIN 2 + #define D3_PORT PORTA //PA3 + #define D3_PIN 3 + #define D4_PORT PORTA //PA4 + #define D4_PIN 4 + #define D5_PORT PORTC //PC4 + #define D5_PIN 4 + #define D6_PORT PORTA //PA1 + #define D6_PIN 1 + #define D7_PORT PORTA //PA0 + #define D7_PIN 0 + #define D8_PORT PORTA //PA2 + #define D8_PIN 2 + #define D9_PORT PORTC //PC5 + #define D9_PIN 5 + #define D10_PORT PORTA //PA6 + #define D10_PIN 6 + #define D11_PORT PORTB //PB2 + #define D11_PIN 2 + #define D12_PORT PORTB //PB1 + #define D12_PIN 1 + #define D13_PORT PORTC //PC1 + #define D13_PIN 1 + #define A0_PORT PORTB //PB3 + #define A0_PIN 3 + #define A1_PORT PORTC //PC0 + #define A1_PIN 0 + #define A2_PORT PORTA //PA5 + #define A2_PIN 5 + #define A3_PORT PORTB //PB2 + #define A3_PIN 2 + #define A4_PORT PORTB //PB1 + #define A4_PIN 1 + #define A5_PORT PORTC //PC1 + #define A5_PIN 1 +#else +#error MCU unselected +#endif // MCUs + +#endif //PIN_SHIELD_1_H +#if 0 +#if defined(M0_PRO) +#endif +#if defined(D21_XPRO) +#endif +#endif diff --git a/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_8.h b/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_8.h new file mode 100644 index 0000000..8680341 --- /dev/null +++ b/Arduino/Libraries/MCUFRIEND_kbv/utility/pin_shield_8.h @@ -0,0 +1,474 @@ +#ifndef PIN_SHIELD_8_H_ +#define PIN_SHIELD_8_H_ + +// just provide macros for the 8-bit data bus +// i.e. write_8(), read_8(), setWriteDir(), setReadDir() + + +#define LPC810 810 +#define LPC812 812 +#define LPC1343 1343 +#define LPC1768 1768 +#define LPC2103 2103 +#define LPC2148 2148 + +#define ISTARGET_NUCLEO64 (0 \ + || defined(TARGET_NUCLEO_F072RB) \ + || defined(TARGET_NUCLEO_F103RB) \ + || defined(TARGET_NUCLEO_F401RE) \ + || defined(TARGET_NUCLEO_F411RE) \ + || defined(TARGET_NUCLEO_F446RE) \ + || defined(TARGET_NUCLEO_L433RC_P) \ + || defined(TARGET_NUCLEO_L476RG) \ + ) + +#define ISTARGET_NUCLEO144 (0 \ + || defined(TARGET_NUCLEO_F767ZI) \ + ) + +//#warning Using pin_SHIELD_8.h + +#if 0 + +#elif defined(MY_BLUEPILL) // Uno Shield on BLUEPILL_ADAPTER +#warning Uno Shield on MY_BLUEPILL_ADAPTER + +// configure macros for the data pins +#define AMASK 0x060F +#define BMASK 0x00C0 +#define write_8(d) { GPIOA->BSRR = AMASK << 16; GPIOB->BSRR = BMASK << 16; \ + GPIOA->BSRR = (((d) & 3) << 9) | (((d) & 0xF0) >> 4); \ + GPIOB->BSRR = (((d) & 0x0C) << 4); \ + } +#define read_8() (((GPIOA->IDR & (3<<9)) >> 9) | ((GPIOA->IDR & (0x0F)) << 4) | ((GPIOB->IDR & (3<<6)) >> 4)) + +#define GROUP_MODE(port, reg, mask, val) {port->reg = (port->reg & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +// PA10,PA9 PA3-PA0 PB7,PB6 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFF0); GP_OUT(GPIOA, CRL, 0xFFFF); GP_OUT(GPIOB, CRL, 0xFF000000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFF0); GP_INP(GPIOA, CRL, 0xFFFF); GP_INP(GPIOB, CRL, 0xFF000000); } + +#elif defined(BLUEPILL) // Uno Shield on BLUEPILL_ADAPTER +#warning Uno Shield on BLUEPILL_ADAPTER + +// configure macros for the data pins +#define write_8(d) { GPIOA->BSRR = 0x00FF << 16; GPIOA->BSRR = (d) & 0xFF; } +#define read_8() (GPIOA->IDR & 0xFF) + +#define GROUP_MODE(port, reg, mask, val) {port->reg = (port->reg & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +// PA7 ..PA0 +#define setWriteDir() {GP_OUT(GPIOA, CRL, 0xFFFFFFFF); } +#define setReadDir() {GP_INP(GPIOA, CRL, 0xFFFFFFFF); } + +#elif defined(ITEADMAPLE) // Uno Shield on MAPLE_REV3 board +#warning Uno Shield on MAPLE_REV3 board + +#define REGS(x) x +#define GROUP_MODE(port, reg, mask, val) {port->REGS(reg) = (port->REGS(reg) & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) + + // configure macros for the data pins +#define write_8(d) { \ + GPIOA->REGS(BSRR) = 0x0703 << 16; \ + GPIOB->REGS(BSRR) = 0x00E0 << 16; \ + GPIOA->REGS(BSRR) = ( ((d) & (1<<0)) << 10) \ + | (((d) & (1<<2)) >> 2) \ + | (((d) & (1<<3)) >> 2) \ + | (((d) & (1<<6)) << 2) \ + | (((d) & (1<<7)) << 2); \ + GPIOB->REGS(BSRR) = ( ((d) & (1<<1)) << 6) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) << 1); \ + } + +#define read_8() ( ( ( (GPIOA->REGS(IDR) & (1<<10)) >> 10) \ + | ((GPIOB->REGS(IDR) & (1<<7)) >> 6) \ + | ((GPIOA->REGS(IDR) & (1<<0)) << 2) \ + | ((GPIOA->REGS(IDR) & (1<<1)) << 2) \ + | ((GPIOB->REGS(IDR) & (1<<5)) >> 1) \ + | ((GPIOB->REGS(IDR) & (1<<6)) >> 1) \ + | ((GPIOA->REGS(IDR) & (1<<8)) >> 2) \ + | ((GPIOA->REGS(IDR) & (1<<9)) >> 2))) + +// PA10,PA9,PA8 PA1,PA0 PB7,PB6,PB5 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFF); GP_OUT(GPIOA, CRL, 0xFF); GP_OUT(GPIOB, CRL, 0xFFF00000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFFF); GP_INP(GPIOA, CRL, 0xFF); GP_INP(GPIOB, CRL, 0xFFF00000); } + +#elif defined(NUCLEO144) || ISTARGET_NUCLEO144 +#if __MBED__ +#warning MBED knows everything +#elif defined(STM32F767xx) + #include +#endif + +#define REGS(x) x +// configure macros for the data pins +#define DMASK ((1<<15)) //#1 +#define EMASK ((1<<13)|(1<<11)|(1<<9)) //#3, #5, #6 +#define FMASK ((1<<12)|(1<<15)|(1<<14)|(1<<13)) //#0, #2, #4, #7 + +#define write_8(d) { \ + GPIOD->REGS(BSRR) = DMASK << 16; \ + GPIOE->REGS(BSRR) = EMASK << 16; \ + GPIOF->REGS(BSRR) = FMASK << 16; \ + GPIOD->REGS(BSRR) = ( ((d) & (1<<1)) << 14); \ + GPIOE->REGS(BSRR) = ( ((d) & (1<<3)) << 10) \ + | (((d) & (1<<5)) << 6) \ + | (((d) & (1<<6)) << 3); \ + GPIOF->REGS(BSRR) = ( ((d) & (1<<0)) << 12) \ + | (((d) & (1<<2)) << 13) \ + | (((d) & (1<<4)) << 10) \ + | (((d) & (1<<7)) << 6); \ + } + +#define read_8() ( ( ( (GPIOF->REGS(IDR) & (1<<12)) >> 12) \ + | ((GPIOD->REGS(IDR) & (1<<15)) >> 14) \ + | ((GPIOF->REGS(IDR) & (1<<15)) >> 13) \ + | ((GPIOE->REGS(IDR) & (1<<13)) >> 10) \ + | ((GPIOF->REGS(IDR) & (1<<14)) >> 10) \ + | ((GPIOE->REGS(IDR) & (1<<11)) >> 6) \ + | ((GPIOE->REGS(IDR) & (1<<9)) >> 3) \ + | ((GPIOF->REGS(IDR) & (1<<13)) >> 6))) + + +// PD15 PE13,PE11,PE9 PF15,PF14,PF13,PF12 +#define setWriteDir() { setReadDir(); \ + GPIOD->MODER |= 0x40000000; GPIOE->MODER |= 0x04440000; GPIOF->MODER |= 0x55000000; } +#define setReadDir() { GPIOD->MODER &= ~0xC0000000; GPIOE->MODER &= ~0x0CCC0000; GPIOF->MODER &= ~0xFF000000; } + + +#elif defined(NUCLEO) || ISTARGET_NUCLEO64 +#if __MBED__ +#warning MBED knows everything +#elif defined(STM32F072xB) + #include +#elif defined(STM32F103xB) + #if defined(__CC_ARM) + #include + #else + #include + #endif +#elif defined(STM32L476xx) || defined(STM32L433xx) + #include +#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) + #include +#endif +// configure macros for the data pins. -00=10.06, -O1=7.85, -O1t=7.21, -O2=7.87, -O3=7.45, -O3t=7.03 + #define write_8(d) { \ + GPIOA->BSRR = 0x0700 << 16; \ + GPIOB->BSRR = 0x0438 << 16; \ + GPIOC->BSRR = 0x0080 << 16; \ + GPIOA->BSRR = (((d) & (1<<0)) << 9) \ + | (((d) & (1<<2)) << 8) \ + | (((d) & (1<<7)) << 1); \ + GPIOB->BSRR = (((d) & (1<<3)) << 0) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<5)) >> 1) \ + | (((d) & (1<<6)) << 4); \ + GPIOC->BSRR = (((d) & (1<<1)) << 6); \ + } + #define read_8() ( (((GPIOA->IDR & (1<<9)) >> 9) \ + | ((GPIOC->IDR & (1<<7)) >> 6) \ + | ((GPIOA->IDR & (1<<10)) >> 8) \ + | ((GPIOB->IDR & (1<<3)) >> 0) \ + | ((GPIOB->IDR & (1<<5)) >> 1) \ + | ((GPIOB->IDR & (1<<4)) << 1) \ + | ((GPIOB->IDR & (1<<10)) >> 4) \ + | ((GPIOA->IDR & (1<<8)) >> 1))) +// be wise to clear both MODER bits properly. +#if defined(STM32F103xB) +#define GROUP_MODE(port, reg, mask, val) {port->reg = (port->reg & ~(mask)) | ((mask)&(val)); } +#define GP_OUT(port, reg, mask) GROUP_MODE(port, reg, mask, 0x33333333) +#define GP_INP(port, reg, mask) GROUP_MODE(port, reg, mask, 0x44444444) +// PA10,PA9,PA8 PB10 PB5,PB4,PB3 PC7 +#define setWriteDir() {GP_OUT(GPIOA, CRH, 0xFFF); GP_OUT(GPIOB, CRH, 0xF00); GP_OUT(GPIOB, CRL, 0xFFF000); GP_OUT(GPIOC, CRL, 0xF0000000); } +#define setReadDir() {GP_INP(GPIOA, CRH, 0xFFF); GP_INP(GPIOB, CRH, 0xF00); GP_INP(GPIOB, CRL, 0xFFF000); GP_INP(GPIOC, CRL, 0xF0000000); } +#else + #define setWriteDir() { setReadDir(); \ + GPIOA->MODER |= 0x150000; GPIOB->MODER |= 0x100540; GPIOC->MODER |= 0x4000; } + #define setReadDir() { GPIOA->MODER &= ~0x3F0000; GPIOB->MODER &= ~0x300FC0; GPIOC->MODER &= ~0xC000; } +#endif + + +#elif __TARGET_PROCESSOR == LPC1768 + #include +// configure macros for the data pins + #define write_8(d) { \ + LPC_GPIO0->FIOPIN = (LPC_GPIO0->FIOPIN & ~0x01878003) \ + | (((d) & (1<<0)) << 1) \ + | (((d) & (1<<1)) >> 1) \ + | (((d) & (1<<2)) << 22) \ + | (((d) & (1<<3)) << 20) \ + | (((d) & (1<<4)) << 12) \ + | (((d) & (1<<5)) << 10) \ + | (((d) & (1<<6)) << 11) \ + | (((d) & (1<<7)) << 11); \ + } + #define read_8() ( (((LPC_GPIO0->FIOPIN & (1<<1)) >> 1) \ + | ((LPC_GPIO0->FIOPIN & (1<<0)) << 1) \ + | ((LPC_GPIO0->FIOPIN & (1<<24)) >> 22) \ + | ((LPC_GPIO0->FIOPIN & (1<<23)) >> 20) \ + | ((LPC_GPIO0->FIOPIN & (1<<16)) >> 12) \ + | ((LPC_GPIO0->FIOPIN & (1<<15)) >> 10) \ + | ((LPC_GPIO0->FIOPIN & (1<<17)) >> 11) \ + | ((LPC_GPIO0->FIOPIN & (1<<18)) >> 11))) + #define setWriteDir() {LPC_GPIO0->FIODIR |= 0x01878003; } + #define setReadDir() {LPC_GPIO0->FIODIR &= ~0x01878003; } + + +#elif defined(MKL25Z4) || defined(TARGET_KL25Z) + #include +// configure macros for the data pins +#if 1 +#define AMASK ((1<<13)|(1<<12)|(1<<5)|(1<<4)) +#define CMASK ((1<<9)|(1<<8)) +#define DMASK ((1<<5)|(1<<4)) + #define write_8(d) { \ + PTA->PCOR = AMASK; PTC->PCOR = CMASK; PTD->PCOR = DMASK; \ + PTA->PSOR = (((d) & (1<<0)) << 13) \ + | (((d) & (1<<3)) << 9) \ + | (((d) & (1<<4)) >> 0) \ + | (((d) & (1<<5)) >> 0); \ + PTC->PSOR = (((d) & (1<<6)) << 2) \ + | (((d) & (1<<7)) << 2); \ + PTD->PSOR = (((d) & (1<<1)) << 4) \ + | (((d) & (1<<2)) << 2); \ + } + #define read_8() ( (((PTA->PDIR & (1<<13)) >> 13) \ + | ((PTA->PDIR & (1<<12)) >> 9) \ + | ((PTA->PDIR & (3<<4)) >> 0) \ + | ((PTC->PDIR & (3<<8)) >> 2) \ + | ((PTD->PDIR & (1<<4)) >> 2) \ + | ((PTD->PDIR & (1<<5)) >> 4))) + #define setWriteDir() {PTA->PDDR |= AMASK;PTC->PDDR |= CMASK;PTD->PDDR |= DMASK; } + #define setReadDir() {PTA->PDDR &= ~AMASK;PTC->PDDR &= ~CMASK;PTD->PDDR &= ~DMASK; } +#else + #define write_8(d) { \ + PTA->PDOR = (PTA->PDOR & ~0x3030) \ + | (((d) & (1<<0)) << 13) \ + | (((d) & (1<<3)) << 9) \ + | (((d) & (3<<4)) << 0); \ + PTC->PDOR = (PTC->PDOR & ~0x0300) \ + | (((d) & (3<<6)) << 2); \ + PTD->PDOR = (PTD->PDOR & ~0x0030) \ + | (((d) & (1<<1)) << 4) \ + | (((d) & (1<<2)) << 2); \ + } + #define read_8() ( (((PTA->PDIR & (1<<13)) >> 13) \ + | ((PTA->PDIR & (1<<12)) >> 9) \ + | ((PTA->PDIR & (3<<4)) >> 0) \ + | ((PTC->PDIR & (3<<8)) >> 2) \ + | ((PTD->PDIR & (1<<4)) >> 2) \ + | ((PTD->PDIR & (1<<5)) >> 4))) + #define setWriteDir() {PTA->PDDR |= 0x3030;PTC->PDDR |= 0x0300;PTD->PDDR |= 0x0030; } + #define setReadDir() {PTA->PDDR &= ~0x3030;PTC->PDDR &= ~0x0300;PTD->PDDR &= ~0x0030; } +#endif + +#elif defined(MKL26Z4) + #include +// configure macros for the data pins +#define AMASK ((1<<13)|(1<<12)|(1<<5)|(1<<4)) +#define CMASK ((1<<9)|(1<<8)) +#define DMASK ((1<<3)|(1<<2)) //PTD5, PTD4 on KL25Z + #define write_8(d) { \ + PTA->PCOR = AMASK; PTC->PCOR = CMASK; PTD->PCOR = DMASK; \ + PTA->PSOR = (((d) & (1<<0)) << 13) \ + | (((d) & (1<<3)) << 9) \ + | (((d) & (1<<4)) >> 0) \ + | (((d) & (1<<5)) >> 0); \ + PTC->PSOR = (((d) & (1<<6)) << 2) \ + | (((d) & (1<<7)) << 2); \ + PTD->PSOR = (((d) & (1<<1)) << 1) \ + | (((d) & (1<<2)) << 1); \ + } + #define read_8() ( (((PTA->PDIR & (1<<13)) >> 13) \ + | ((PTA->PDIR & (1<<12)) >> 9) \ + | ((PTA->PDIR & (3<<4)) >> 0) \ + | ((PTC->PDIR & (3<<8)) >> 2) \ + | ((PTD->PDIR & (1<<3)) >> 1) \ + | ((PTD->PDIR & (1<<2)) >> 1))) + #define setWriteDir() {PTA->PDDR |= AMASK;PTC->PDDR |= CMASK;PTD->PDDR |= DMASK; } + #define setReadDir() {PTA->PDDR &= ~AMASK;PTC->PDDR &= ~CMASK;PTD->PDDR &= ~DMASK; } + +#elif defined(MKL05Z4) || defined(TARGET_KL05Z) + #include +// configure macros for the data pins + #define write_8(d) { \ + PTA->PDOR = (PTA->PDOR & ~0x1C00) \ + | (((d) & (1<<2)) << 9) \ + | (((d) & (1<<4)) << 6) \ + | (((d) & (1<<5)) << 7); \ + PTB->PDOR = (PTB->PDOR & ~0x0CE0) \ + | (((d) & (3<<0)) << 10) \ + | (((d) & (1<<3)) << 2) \ + | (((d) & (3<<6)) << 0); \ + } + #define read_8() ( (((PTA->PDIR & (1<<11)) >> 9) \ + | ((PTA->PDIR & (1<<10)) >> 6) \ + | ((PTA->PDIR & (1<<12)) >> 7) \ + | ((PTB->PDIR & (3<<10)) >> 10) \ + | ((PTB->PDIR & (1<<5)) >> 2) \ + | ((PTB->PDIR & (3<<6)) >> 0))) + #define setWriteDir() { PTA->PDDR |= 0x1C00; PTB->PDDR |= 0x0CE0; } + #define setReadDir() { PTA->PDDR &= ~0x1C00; PTB->PDDR &= ~0x0CE0; } + + +#elif (defined(MK20D7) && defined(TEENSY)) || defined(TARGET_TEENSY3_1) +#if __MBED__ +#warning MBED knows everything +#else + #include +#endif +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<13)) +#define CMASK ((1<<3)) +#define DMASK ((1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<7)) + + #define write_8(d) { \ + PTA->PCOR = AMASK; PTC->PCOR = CMASK; PTD->PCOR = DMASK; \ + PTA->PSOR = (((d) & (1<<3)) << 9) \ + | (((d) & (1<<4)) << 9); \ + PTC->PSOR = (((d) & (1<<1)) << 2); \ + PTD->PSOR = (((d) & (1<<0)) << 3) \ + | (((d) & (1<<2)) >> 2) \ + | (((d) & (1<<5)) << 2) \ + | (((d) & (1<<6)) >> 2) \ + | (((d) & (1<<7)) >> 5); \ + } + #define read_8() ( (((PTD->PDIR & (1<<3)) >> 3) \ + | ((PTC->PDIR & (1<<3)) >> 2) \ + | ((PTD->PDIR & (1<<0)) << 2) \ + | ((PTA->PDIR & (1<<12)) >> 9) \ + | ((PTA->PDIR & (1<<13)) >> 9) \ + | ((PTD->PDIR & (1<<7)) >> 2) \ + | ((PTD->PDIR & (1<<4)) << 2) \ + | ((PTD->PDIR & (1<<2)) << 5))) + #define setWriteDir() {PTA->PDDR |= AMASK;PTC->PDDR |= CMASK;PTD->PDDR |= DMASK; } + #define setReadDir() {PTA->PDDR &= ~AMASK;PTC->PDDR &= ~CMASK;PTD->PDDR &= ~DMASK; } + +#elif defined(MK20D5) || defined(TARGET_K20D50M) + #include +// configure macros for the data pins +#define AMASK ((1<<12)|(1<<5)|(1<<2)|(1<<1)) +#define CMASK ((1<<8)|(1<<4)|(1<<3)) +#define DMASK ((1<<4)) + #define write_8(d) { \ + PTA->PCOR = AMASK; PTC->PCOR = CMASK; PTD->PCOR = DMASK; \ + PTA->PSOR = (((d) & (1<<0)) << 12) \ + | (((d) & (1<<1)) << 1) \ + | (((d) & (1<<2)) << 3) \ + | (((d) & (1<<5)) >> 4); \ + PTC->PSOR = (((d) & (1<<4)) << 4) \ + | (((d) & (3<<6)) >> 3); \ + PTD->PSOR = (((d) & (1<<3)) << 1); \ + } + #define read_8() ( (((PTA->PDIR & (1<<5)) >> 3) \ + | ((PTA->PDIR & (1<<1)) << 4) \ + | ((PTA->PDIR & (1<<12)) >> 12) \ + | ((PTA->PDIR & (1<<2)) >> 1) \ + | ((PTC->PDIR & (1<<8)) >> 4) \ + | ((PTC->PDIR & (3<<3)) << 3) \ + | ((PTD->PDIR & (1<<4)) >> 1))) + #define setWriteDir() {PTA->PDDR |= AMASK;PTC->PDDR |= CMASK;PTD->PDDR |= DMASK; } + #define setReadDir() {PTA->PDDR &= ~AMASK;PTC->PDDR &= ~CMASK;PTD->PDDR &= ~DMASK; } + +#elif defined(ZERO) + #include + + #ifndef PORTA + #define PORTA PORT->Group[0] + #define PORTB PORT->Group[1] + #endif +// configure macros for the data pins +#if defined(D21_XPRO) + #define AMASK 0x00220000 + #define BMASK 0x0000C0E4 + #define write_8(d) { \ + PORTA.OUT.reg = (PORTA.OUT.reg & ~AMASK) \ + | (((d) & (1<<5)) << 16) \ + | (((d) & (1<<7)) << 10); \ + PORTB.OUT.reg = (PORTB.OUT.reg & ~BMASK) \ + | (((d) & (3<<0)) << 6) \ + | (((d) & (1<<2)) << 12) \ + | (((d) & (1<<3)) >> 1) \ + | (((d) & (1<<4)) << 1) \ + | (((d) & (1<<6)) << 9); \ + } + #define read_8() ( (((PORTA.IN.reg & (1<<21)) >> 16) \ + | ((PORTA.IN.reg & (1<<17)) >> 10) \ + | ((PORTB.IN.reg & (3<<6)) >> 6) \ + | ((PORTB.IN.reg & (1<<14)) >> 12) \ + | ((PORTB.IN.reg & (1<<2)) << 1) \ + | ((PORTB.IN.reg & (1<<5)) >> 1) \ + | ((PORTB.IN.reg & (1<<15)) >> 9))) + #define setWriteDir() { \ + PORTA.DIRSET.reg = AMASK; \ + PORTB.DIRSET.reg = BMASK; \ + PORTA.WRCONFIG.reg = (AMASK>>16) | (0<<22) | (0<<28) | (1<<30) | (1<<31); \ + PORTB.WRCONFIG.reg = (BMASK & 0xFFFF) | (0<<22) | (0<<28) | (1<<30); \ + } + #define setReadDir() { \ + PORTA.DIRCLR.reg = AMASK; \ + PORTB.DIRCLR.reg = BMASK; \ + PORTA.WRCONFIG.reg = (AMASK>>16) | (1<<17) | (0<<28) | (1<<30) | (1<<31); \ + PORTB.WRCONFIG.reg = (BMASK & 0xFFFF) | (1<<17) | (0<<28) | (1<<30); \ + } +#else + #define DMASK 0x0030C3C0 + #define write_8(x) {PORTA.OUTCLR.reg = (DMASK); \ + PORTA.OUTSET.reg = (((x) & 0x0F) << 6) \ + | (((x) & 0x30) << 10) \ + | (((x) & 0xC0)<<14); } + #define read_8() (((PORTA.IN.reg >> 6) & 0x0F) \ + | ((PORTA.IN.reg >> 10) & 0x30) \ + | ((PORTA.IN.reg >> 14) & 0xC0)) + #define setWriteDir() { PORTA.DIRSET.reg = DMASK; \ + PORTA.WRCONFIG.reg = (DMASK & 0xFFFF) | (0<<22) | (1<<28) | (1<<30); \ + PORTA.WRCONFIG.reg = (DMASK>>16) | (0<<22) | (1<<28) | (1<<30) | (1<<31); \ + } + #define setReadDir() { PORTA.DIRCLR.reg = DMASK; \ + PORTA.WRCONFIG.reg = (DMASK & 0xFFFF) | (1<<17) | (1<<28) | (1<<30); \ + PORTA.WRCONFIG.reg = (DMASK>>16) | (1<<17) | (1<<28) | (1<<30) | (1<<31); \ + } +#endif + +//####################################### DUE ############################ +#elif defined(__SAM3X8E__) //regular UNO shield on DUE + // configure macros for data bus +#define BMASK (1<<25) +#define CMASK (0xBF << 21) +#define write_8(x) { PIOB->PIO_CODR = BMASK; PIOC->PIO_CODR = CMASK; \ + PIOB->PIO_SODR = (((x) & (1<<2)) << 23); \ + PIOC->PIO_SODR = (((x) & (1<<0)) << 22) \ + | (((x) & (1<<1)) << 20) \ + | (((x) & (1<<3)) << 25) \ + | (((x) & (1<<4)) << 22) \ + | (((x) & (1<<5)) << 20) \ + | (((x) & (1<<6)) << 18) \ + | (((x) & (1<<7)) << 16); \ + } + +#define read_8() ( ((PIOC->PIO_PDSR & (1<<22)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<21)) >> 20)\ + | ((PIOB->PIO_PDSR & (1<<25)) >> 23)\ + | ((PIOC->PIO_PDSR & (1<<28)) >> 25)\ + | ((PIOC->PIO_PDSR & (1<<26)) >> 22)\ + | ((PIOC->PIO_PDSR & (1<<25)) >> 20)\ + | ((PIOC->PIO_PDSR & (1<<24)) >> 18)\ + | ((PIOC->PIO_PDSR & (1<<23)) >> 16)\ + ) +#define setWriteDir() { PIOB->PIO_OER = BMASK; PIOC->PIO_OER = CMASK; } +#define setReadDir() { \ + PMC->PMC_PCER0 = (1 << ID_PIOB)|(1 << ID_PIOC);\ + PIOB->PIO_ODR = BMASK; PIOC->PIO_ODR = CMASK;\ + } + +#else +#error MCU unselected +#endif // MCUs + +#endif //PIN_SHIELD_8_H diff --git a/Readme.md b/Readme.md index f807834..c39a050 100644 --- a/Readme.md +++ b/Readme.md @@ -7,6 +7,7 @@ - With LCDKeypad (found on a chinese seller website) - With TFT 2.4" Shield (https://www.amazon.fr/gp/product/B0798N3JWD/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1) - With TM1638 display (https://www.amazon.fr/gp/product/B0797PLVTX/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1) + - With TFT 3.2" OpenSmart Shield (only on Assetto Corsa Competizione) 2 parts : @@ -20,6 +21,7 @@ - Clone this repo on your server or download release - Copy Keypad folder in Arduino/Libraries in your Arduino libraries folder in your computer (only for LCDKeypad dashboard) +- Copy MCUFRIEND_kbv folder in Arduino/Libraries in your Arduino libraries folder in your computer (only for TFT 3.2" dashboard) - Upload specific .ino file in your Arduino (tested with Uno R3) - Launch AC - Launch your server in Server\AC_Arduino\Bin (after compiling with vs2019 or vs2017 community edition)