Merge pull request #50 from prenticedavid/tidy_sketches

Tidy sketches
This commit is contained in:
prenticedavid
2018-05-15 14:58:15 +01:00
committed by GitHub
22 changed files with 2804 additions and 1058 deletions

View File

@@ -1,4 +1,4 @@
#define SUPPORT_0139 //not working +238 bytes
//#define SUPPORT_0139 //S6D0139 +280 bytes
#define SUPPORT_0154 //S6D0154 +320 bytes
//#define SUPPORT_1289 //costs about 408 bytes
//#define SUPPORT_1580 //R61580 Untested
@@ -8,15 +8,15 @@
#define SUPPORT_68140 //RM68140 +52 bytes defaults to PIXFMT=0x55
#define SUPPORT_7781 //ST7781 +172 bytes
//#define SUPPORT_8230 //UC8230 +118 bytes
//#define SUPPORT_8347D //HX8347-D, HX8347-G, HX8347-I +520 bytes, 0.27s
//#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_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226
//#define SUPPORT_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226 +380 bytes
//#define SUPPORT_9326_5420 //ILI9326, SPFD5420 +246 bytes
//#define SUPPORT_9342 //costs +114 bytes
//#define SUPPORT_9806
//#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
@@ -54,17 +54,10 @@
#define USING_16BIT_BUS 0
#endif
#if defined USE_GFX_KBV
MCUFRIEND_kbv::MCUFRIEND_kbv():Adafruit_GFX(240, 320)
{
// we can not access GPIO pins until AHB has been enabled.
}
#else
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.
}
#endif
static uint8_t done_reset, is8347, is555;
static uint16_t color565_to_555(uint16_t color) {

View File

@@ -1,3 +1,9 @@
/*
* 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_ 298
@@ -13,13 +19,8 @@
class MCUFRIEND_kbv : public Adafruit_GFX {
public:
#if defined USE_GFX_KBV
MCUFRIEND_kbv();
#elif defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_GENERIC_STM32F103V) || defined(ARDUINO_MAPLE_REV3) || defined(ARDUINO_MAPLE_MINI) || defined(ESP32)
// 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
#else
MCUFRIEND_kbv(int CS=A3, int RS=A2, int WR=A1, int RD=A0, int RST=A4);
#endif
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
@@ -52,4 +53,25 @@ class MCUFRIEND_kbv : public Adafruit_GFX {
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

View File

@@ -0,0 +1,66 @@
#include <Adafruit_GFX.h> // Core graphics library
#include <MCUFRIEND_kbv.h> // Hardware-specific library
MCUFRIEND_kbv tft;
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSerif12pt7b.h>
#include <FreeDefaultFonts.h>
#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();
if (ID == 0xD3) ID = 0x9481;
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);
}

View File

@@ -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 <UTFTGLUE.h> //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 : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,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);
}

View File

@@ -1,9 +1,6 @@
// UTFT_Demo_320x240 (C)2012 uCtronics
// web: http://www.uctronics.com
// UTFT_Demo_320x240 is derived from
// UTFT_Demo_320x240 (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
// to fit for our 3.2 inch TFT LCD shield for Arduino/Maple/Chipkit
// 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.
@@ -11,30 +8,39 @@
// This demo was made for modules with a screen resolution
// of 320x240 pixels.
//
// This program requires the UTFT library (8bit mode)
// and the code is compatible with both UNO and Mega board.
// No code modification required.
// This program requires the UTFT library.
//
// if I want to use a GLUE class that implements the UTFT API
// with the Adafruit classes, I MUST include those headers
// because the Arduino Java does not look at nested includes !
//################################################
// GLUE class that implements the UTFT API
// replace UTFT include and constructor statements
// remove UTFT font declaration e.g. SmallFont
//################################################
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h> // class methods are in here
UTFTGLUE myGLCD(0x0154,A2,A1,A3,A4,A0);
#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args
// Declare which fonts we will be using
#if !defined(SmallFont)
extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref
#endif
//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 : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,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(5)); //.kbv Due does not like A0
pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0
digitalWrite(A0, HIGH);
randomSeed(analogRead(0));
// Setup the LCD
myGLCD.InitLCD();
@@ -60,7 +66,7 @@ void loop()
myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(255,255,0);
myGLCD.print("<http://electronics.henningkarlsen.com>", CENTER, 227);
myGLCD.print("<http://www.RinkyDinkElectronics.com/>", CENTER, 227);
myGLCD.setColor(0, 0, 255);
myGLCD.drawRect(0, 14, 319, 225);
@@ -244,7 +250,7 @@ void loop()
delay(2000);
myGLCD.setColor(0,0,0);
myGLCD.fillRect(1,15,318,225);
myGLCD.fillRect(1,15,318,224);
// Draw some random circles
for (int i=0; i<100; i++)
@@ -333,4 +339,3 @@ void loop()
delay (10000);
}

View File

@@ -1,5 +1,6 @@
// UTFT_Demo_400x240 (C)2012 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
// 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.
@@ -10,27 +11,36 @@
// This program requires the UTFT library.
//
//#include <Adafruit_GFX.h>
//#include <Adafruit_TFTLCD.h>
#include <MCUFRIEND_kbv.h>
#include <UTFTGLUE.h>
//UTFTGLUE myGLCD; // use for default shield
UTFTGLUE myGLCD(0x9327,A2,A1,A3,A4,A0);
extern uint8_t SmallFont[];
//################################################
// GLUE class that implements the UTFT API
// replace UTFT include and constructor statements
// remove UTFT font declaration e.g. SmallFont
//################################################
/*
#include <UTFT.h>
#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args
// Declare which fonts we will be using
#if !defined(SmallFont)
extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref
#endif
//extern uint8_t SmallFont[];
// Set the pins to the correct ones for your development shield
// ------------------------------------------------------------
// Arduino Uno / 2009:
// -------------------
// Standard Arduino Uno/2009 shield : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,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(5)); //.kbv Due does not like A0
pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0
digitalWrite(A0, HIGH);
randomSeed(analogRead(0));
// Setup the LCD
myGLCD.InitLCD();
@@ -56,7 +66,7 @@ void loop()
myGLCD.print("*** Universal Color TFT Display Library ***", CENTER, 1);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(255,255,0);
myGLCD.print("< http://electronics.henningkarlsen.com >", CENTER, 227);
myGLCD.print("< http://www.RinkyDinkElectronics.com/ >", CENTER, 227);
myGLCD.setColor(0, 0, 255);
myGLCD.drawRect(0, 14, 399, 225);
@@ -331,4 +341,3 @@ void loop()
delay (10000);
}

View File

@@ -1,5 +1,6 @@
// UTFT_Demo_480x320 (C)2013 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
// 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.
@@ -10,20 +11,36 @@
// This program requires the UTFT library.
//
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0);
//################################################
// GLUE class that implements the UTFT API
// replace UTFT include and constructor statements
// remove UTFT font declaration e.g. SmallFont
//################################################
#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args
// Declare which fonts we will be using
#if !defined(SmallFont)
extern uint8_t SmallFont[]; //.kbv GLUE defines as GFXFont ref
#endif
//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 : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,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(5)); //.kbv Due does not like A0
pinMode(A0, OUTPUT); //.kbv mcufriend have RD on A0
digitalWrite(A0, HIGH);
randomSeed(analogRead(0));
// Setup the LCD
myGLCD.InitLCD();
@@ -49,7 +66,7 @@ void loop()
myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
myGLCD.setBackColor(64, 64, 64);
myGLCD.setColor(255,255,0);
myGLCD.print("<http://electronics.henningkarlsen.com>", CENTER, 307);
myGLCD.print("<http://www.RinkyDinkElectronics.com/>", CENTER, 307);
myGLCD.setColor(0, 0, 255);
myGLCD.drawRect(0, 14, 479, 305);
@@ -322,4 +339,3 @@ void loop()
delay (10000);
}

View File

@@ -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");
}

View File

@@ -1,455 +0,0 @@
// .kbv: previous sketch wasted too much SRAM with const strings
// .kbv: replace all UTFT print const strings with F(string)
// .kbv: correct UTFTGLUE settextcursor() for String print
// https://forum.arduino.cc/index.php?topic=473885.msg3245748#msg3245748
// file attached 03 May 2017 21:15 BST
// TouchScreen_Calibr_kbv for MCUFRIEND UNO Display Shields
// adapted by David Prentice
// for Adafruit's <TouchScreen.h> Resistive Touch Screen Library
// from Henning Karlsen's original program. Many Thanks.
// UTouch_Calibration (C)2013-2014 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program can be used to calibrate the touchscreen
// of the display modules.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin
// numbers in the setup.
//
// Instructions will be given on the display.
//#define TOUCH_ORIENTATION LANDSCAPE
#define TOUCH_ORIENTATION PORTRAIT
#define TITLE "TouchScreen.h Calibration"
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h> //we are using UTFT display methods
UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0);
// MCUFRIEND UNO shield shares pins with the TFT. Due does NOT work
//int XP = 6, XM = A2, YP = A1, YM = 7; //most common configuration (dead Due)
int XP = 7, XM = A1, YP = A2, YM = 6; //most common configuration (WHITE Due)
//#include "TouchScreen_kbv.h" //Local Library
//TouchScreen_kbv myTouch(XP, YP, XM, YM, 300);
#include <TouchScreen.h> //Global Library
TouchScreen myTouch(XP, YP, XM, YM, 300);
TSPoint tp; //Touchscreen_due branch uses Point
void readResistiveTouch(void)
{
tp = myTouch.getPoint();
pinMode(YP, OUTPUT); //restore shared pins
pinMode(XM, OUTPUT);
}
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 > 180; // .kbv was >20 && < 1000
if (state == oldstate) count++;
else count = 0;
oldstate = state;
delay(5);
}
return oldstate;
}
void showpoint(void)
{
Serial.print("\r\nx="); Serial.print(tp.x);
Serial.print(" y="); Serial.print(tp.y);
Serial.print(" z="); Serial.print(tp.z);
}
// ************************************
// DO NOT EDIT ANYTHING BELOW THIS LINE
// ************************************
// Declare which fonts we will be using
#if defined(SmallFont) //.kbv new GLUE defines FreeSmallFont
#undef SmallFont //.kbv lose it
#define SmallFont NULL //.kbv use System Font
#else
extern uint8_t SmallFont[]; //.kbv
#endif
uint32_t cx, cy;
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 buf[13];
void showpins(int A, int D, int value, const char *msg)
{
char buf[40];
sprintf(buf, "%s (A%d, D%d) = %d", msg, A - A0, D, value);
Serial.println(buf);
}
boolean diagnose_pins()
{
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:-");
int idx = Values[0] < Values[1];
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];
// myTouch = TouchScreen_kbv(XP, YP, XM, YM, 300); //Local library
myTouch = TouchScreen(XP, YP, XM, YM, 300); //Global library
return true;
}
Serial.println("BROKEN TOUCHSCREEN");
return false;
}
void setup()
{
Serial.begin(9600);
Serial.println(TITLE);
bool ret = true;
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega2560__)
ret = diagnose_pins();
#else
Serial.println("Only AVR can diagnose Touch Pins");
Serial.println("Other targets use default Pins");
char buf[40];
sprintf(buf, "Touch Pin Wiring XP=%d XM=A%d YP=A%d YM=%d",
XP, XM - A0, YP - A0, YM);
Serial.println(buf);
#endif
digitalWrite(A0, HIGH);
pinMode(A0, OUTPUT);
myGLCD.InitLCD(TOUCH_ORIENTATION);
myGLCD.clrScr();
myGLCD.setFont(SmallFont);
dispx = myGLCD.getDisplayXSize();
dispy = myGLCD.getDisplayYSize();
text_y_center = (dispy / 2) - 6;
if (ret == false) {
myGLCD.print(F("BROKEN TOUCHSCREEN"), CENTER, dispy / 2);
while (1);
}
}
void drawCrossHair(int x, int y)
{
myGLCD.drawRect(x - 10, y - 10, x + 10, y + 10);
myGLCD.drawLine(x - 5, y, x + 5, y);
myGLCD.drawLine(x, y - 5, x, y + 5);
}
void readCoordinates()
{
int iter = 5000;
int failcount = 0;
int cnt = 0;
uint32_t tx = 0;
uint32_t ty = 0;
boolean OK = false;
while (OK == false)
{
myGLCD.setColor(255, 255, 255);
myGLCD.print(F("* PRESS *"), CENTER, text_y_center);
while (ISPRESSED() == false) {}
myGLCD.print(F("* HOLD! *"), CENTER, text_y_center);
cnt = 0;
iter = 400;
do
{
readResistiveTouch();
// showpoint(tp);
if (tp.z > 20 && tp.z < 1000)
{
tx += tp.x;
ty += tp.y;
cnt++;
}
else
failcount++;
} while ((cnt < iter) && (failcount < 10000));
if (cnt >= iter)
{
OK = true;
}
else
{
tx = 0;
ty = 0;
cnt = 0;
}
if (failcount >= 10000)
fail();
}
cx = tx / iter;
cy = ty / iter;
}
void calibrate(int x, int y, int i)
{
myGLCD.setColor(255, 255, 255);
drawCrossHair(x, y);
myGLCD.setBackColor(255, 0, 0);
readCoordinates();
myGLCD.setColor(255, 255, 255);
myGLCD.print(F("* RELEASE *"), CENTER, text_y_center);
myGLCD.setColor(80, 80, 80);
drawCrossHair(x, y);
rx[i] = cx;
ry[i] = cy;
Serial.print("\r\ncx="); Serial.print(cx);
Serial.print(" cy="); Serial.print(cy);
while (ISPRESSED() == true) {}
}
void waitForTouch()
{
while (ISPRESSED() == true) {}
while (ISPRESSED() == false) {}
while (ISPRESSED() == true) {}
}
void toHex(uint32_t num)
{
buf[0] = '0';
buf[1] = 'x';
buf[10] = 'U';
buf[11] = 'L';
buf[12] = 0;
for (int zz = 9; zz > 1; zz--)
{
if ((num & 0xF) > 9)
buf[zz] = (num & 0xF) + 55;
else
buf[zz] = (num & 0xF) + 48;
num = num >> 4;
}
}
void startup()
{
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print(TITLE, CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print(F("#define NUMSAMPLES 3 in Library"), LEFT, 18);
myGLCD.print(F("Use a stylus or something"), LEFT, 30);
myGLCD.print(F("similar to touch as close"), LEFT, 42);
myGLCD.print(F("to the center of the"), LEFT, 54);
myGLCD.print(F("highlighted crosshair as"), LEFT, 66);
myGLCD.print(F("possible. Keep as still as"), LEFT, 78);
myGLCD.print(F("possible and keep holding"), LEFT, 90);
myGLCD.print(F("until the highlight is"), LEFT, 102);
myGLCD.print(F("removed. Repeat for all"), LEFT, 114);
myGLCD.print(F("crosshairs in sequence."), LEFT, 126);
myGLCD.print(F("Touch screen to continue"), CENTER, 162);
waitForTouch();
}
void showNumI(char *msg, uint32_t val, int x, int y)
{
myGLCD.print(msg, x, y);
myGLCD.printNumI(val, x + 50, y);
}
void done()
{
uint16_t TS_LEFT, TS_RT, TS_TOP, TS_BOT, TS_WID, TS_HT, TS_SWAP;
int16_t tmp;
char buf[60];
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print(TITLE, CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print(F("To use the new calibration"), LEFT, 30);
myGLCD.print(F("settings you must map the values"), LEFT, 42);
myGLCD.print(F("from Point p = ts.getPoint() e.g. "), LEFT, 54);
myGLCD.print(F("x = map(p.x, LEFT, RT, 0, tft.width());"), LEFT, 66);
myGLCD.print(F("y = map(p.y, TOP, BOT, 0, tft.height());"), LEFT, 78);
myGLCD.print(F("swap p.x and p.y if diff ORIENTATION"), LEFT, 90);
//.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);
int y = 120;
Serial.println("");
sprintf(buf, "Sketch is %s %d x %d",
TOUCH_ORIENTATION ? "LANDSCAPE" : "PORTRAIT", TS_WID, TS_HT);
myGLCD.print(buf, 0, y);
Serial.println(buf);
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, "PORTRAIT CALIBRATION %d x %d", TS_WID, TS_HT);
myGLCD.print(buf, 0, y += 24);
Serial.println(buf);
sprintf(buf, "x = map(p.x, LEFT=%d, RT=%d, 0, %d)", TS_LEFT, TS_RT, TS_WID);
myGLCD.print(buf, 0, y += 12);
Serial.println(buf);
sprintf(buf, "y = map(p.y, TOP=%d, BOT=%d, 0, %d)", TS_TOP, TS_BOT, TS_HT);
myGLCD.print(buf, 0, y += 12);
Serial.println(buf);
sprintf(buf, "Touch Pin Wiring XP=%d XM=A%d YP=A%d YM=%d",
XP, XM - A0, YP - A0, YM);
myGLCD.print(buf, 0, y += 24);
Serial.println(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;
sprintf(buf, "LANDSCAPE CALIBRATION %d x %d", TS_WID, TS_HT);
myGLCD.print(buf, 0, y += 24);
Serial.println(buf);
sprintf(buf, "x = map(p.y, LEFT=%d, RT=%d, 0, %d)", TS_LEFT, TS_RT, TS_WID);
myGLCD.print(buf, 0, y += 12);
Serial.println(buf);
sprintf(buf, "y = map(p.x, TOP=%d, BOT=%d, 0, %d)", TS_TOP, TS_BOT, TS_HT);
myGLCD.print(buf, 0, y += 12);
Serial.println(buf);
}
void fail()
{
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print(F("Touch Calibration FAILED"), CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print(F("Unable to read the position"), LEFT, 30);
myGLCD.print(F("of the press. This is a"), LEFT, 42);
myGLCD.print(F("hardware issue and can"), LEFT, 54);
myGLCD.print(F("not be corrected in"), LEFT, 66);
myGLCD.print(F("software."), LEFT, 78);
myGLCD.print(F("check XP, XM pins with a multimeter"), LEFT, 102);
myGLCD.print(F("check YP, YM pins with a multimeter"), LEFT, 114);
myGLCD.print(F("should be about 300 ohms"), LEFT, 126);
while (true) {};
}
void loop()
{
startup();
delay(100);
myGLCD.clrScr();
myGLCD.setColor(80, 80, 80);
drawCrossHair(dispx - 11, 10);
drawCrossHair(dispx / 2, 10);
drawCrossHair(10, 10);
drawCrossHair(dispx - 11, dispy / 2);
drawCrossHair(10, dispy / 2);
drawCrossHair(dispx - 11, dispy - 11);
drawCrossHair(dispx / 2, dispy - 11);
drawCrossHair(10, dispy - 11);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.print(F("***********"), CENTER, text_y_center - 12);
myGLCD.print(F("***********"), CENTER, text_y_center + 12);
calibrate(10, 10, 0);
calibrate(10, dispy / 2, 1);
calibrate(10, dispy - 11, 2);
calibrate(dispx / 2, 10, 3);
calibrate(dispx / 2, dispy - 11, 4);
calibrate(dispx - 11, 10, 5);
calibrate(dispx - 11, dispy / 2, 6);
calibrate(dispx - 11, dispy - 11, 7);
cals = (long(dispx - 1) << 12) + (dispy - 1);
if (TOUCH_ORIENTATION == PORTRAIT) swapxy = rx[2] - rx[0];
else swapxy = ry[2] - ry[0];
swapxy = (swapxy < -500 || swapxy > 500);
if ((TOUCH_ORIENTATION == PORTRAIT) ^ (swapxy != 0)) {
clx = (rx[0] + rx[1] + rx[2]) / 3;
crx = (rx[5] + rx[6] + rx[7]) / 3;
cty = (ry[0] + ry[3] + ry[5]) / 3;
cby = (ry[2] + ry[4] + ry[7]) / 3;
} else {
clx = (ry[0] + ry[1] + ry[2]) / 3;
crx = (ry[5] + ry[6] + ry[7]) / 3;
cty = (rx[0] + rx[3] + rx[5]) / 3;
cby = (rx[2] + rx[4] + rx[7]) / 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);
done();
while (true) {}
}

View File

@@ -2,57 +2,25 @@
// different mcufriend shields have Touchscreen on different pins
// and rotation.
// Run the UTouch_calibr_kbv sketch for calibration of your shield
// Run the TouchScreen_Calibr_native sketch for calibration of your shield
#include <Adafruit_GFX.h> // Core graphics library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
//Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway.
#include <TouchScreen.h>
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
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;
// These are the pins for some typical shields!
// S6D0154: YP=A1, XM=A2, YM=7, XP=6
// ST7783 : YP=A2, XM=A1, YM=6, XP=7
// ILI9320: YP=A2, XM=A3, YM=8, XP=9
// ILI9325: YP=A1, XM=A2, YM=7, XP=6
// ILI9325BG: YP=A2, XM=A1, YM=6, XP=7
// ILI9341: YP=A2, XM=A1, YM=7, XP=6
// ILI9488: YP=A1, XM=A2, YM=7, XP=6
// R65109V: YP=A2, XM=A1, YM=6, XP=7
// most mcufriend shields use these pins and Portrait mode:
uint8_t YP = A1; // must be an analog pin, use "An" notation!
uint8_t XM = A2; // must be an analog pin, use "An" notation!
uint8_t YM = 7; // can be a digital pin
uint8_t XP = 6; // can be a digital pin
uint8_t SwapXY = 0;
uint16_t TS_LEFT = 920;
uint16_t TS_RT = 150;
uint16_t TS_TOP = 940;
uint16_t TS_BOT = 120;
char *name = "Unknown controller";
// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
TSPoint tp;
#define MINPRESSURE 20
#define MINPRESSURE 200
#define MAXPRESSURE 1000
#define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;}
int16_t BOXSIZE;
int16_t PENRADIUS = 3;
uint16_t identifier, oldcolor, currentcolor;
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:
@@ -67,17 +35,19 @@ uint8_t Orientation = 0; //PORTRAIT
void show_Serial(void)
{
Serial.print(F("Found "));
Serial.print(name);
Serial.println(F(" LCD driver"));
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(identifier, HEX);
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.print("Wiring is: ");
Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT");
Serial.println("Wiring is always PORTRAIT");
Serial.println("YP=" + String(YP) + " XM=" + String(XM));
Serial.println("YM=" + String(YM) + " XP=" + String(XP));
}
@@ -85,23 +55,18 @@ void show_Serial(void)
void show_tft(void)
{
tft.setCursor(0, 0);
tft.setTextSize(2);
tft.print(F("Found "));
tft.print(name);
tft.println(F(" LCD"));
tft.setTextSize(1);
tft.print(F("ID=0x"));
tft.println(identifier, HEX);
tft.println(ID, HEX);
tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height()));
tft.println("Calibration is: ");
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.print("\nWiring is: ");
if (SwapXY) {
tft.setTextColor(CYAN);
tft.setTextSize(2);
}
tft.println(SwapXY ? "SWAPXY" : "PORTRAIT");
tft.println("\nWiring is: ");
tft.println("YP=" + String(YP) + " XM=" + String(XM));
tft.println("YM=" + String(YM) + " XP=" + String(XP));
tft.setTextSize(2);
@@ -115,8 +80,6 @@ void show_tft(void)
tp = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
pinMode(XP, OUTPUT);
pinMode(YM, 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);
@@ -128,80 +91,11 @@ void show_tft(void)
void setup(void)
{
uint16_t tmp;
Serial.begin(9600);
tft.reset();
identifier = tft.readID();
// if (identifier == 0) identifier = 0x9341;
if (0) {
} else if (identifier == 0x0154) {
name = "S6D0154";
TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208;
} else if (identifier == 0x5408) { //thanks gazialankus
name = "SPFD5408";
TS_LEFT = 150; TS_RT = 960; TS_TOP = 155; TS_BOT = 925;
SwapXY = 1;
} else if (identifier == 0x7783) {
name = "ST7781";
TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153;
SwapXY = 1;
} else if (identifier == 0x7789) {
name = "ST7789V";
YP = A2; XM = A1; YM = 7; XP = 6;
TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919;
} else if (identifier == 0x9320) {
name = "ILI9320";
YP = A3; XM = A2; YM = 9; XP = 8;
TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134;
} else if (identifier == 0x9325) {
name = "ILI9325";
TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904;
} else if (identifier == 0x9325) {
name = "ILI9325 Green Dog";
TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130;
} else if (identifier == 0x9327) {
name = "ILI9327";
TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79;
SwapXY = 1;
} else if (identifier == 0x9329) {
name = "ILI9329";
TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131;
SwapXY = 1;
} else if (identifier == 0x9341) {
name = "ILI9341 BLUE";
TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150;
SwapXY = 0;
} else if (identifier == 0) {
name = "ILI9341 DealExtreme";
TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135;
SwapXY = 1;
} else if (identifier == 0 || identifier == 0x9341) {
name = "ILI9341";
TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908;
SwapXY = 1;
} else if (identifier == 0x9486) {
name = "ILI9486";
TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158;
} else if (identifier == 0x9488) {
name = "ILI9488";
TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158;
} else if (identifier == 0xB509) {
name = "R61509V";
TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975;
SwapXY = 1;
} else {
name = "unknown";
}
switch (Orientation) { // adjust for different aspects
case 0: break; //no change, calibrated for PORTRAIT
case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break;
case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break;
case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break;
}
ID = tft.readID();
tft.begin(ID);
Serial.begin(9600);
ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values.
tft.begin(identifier);
show_Serial();
tft.setRotation(Orientation);
tft.fillScreen(BLACK);
@@ -230,22 +124,34 @@ void loop()
// if sharing pins, you'll need to fix the directions of the touchscreen pins
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
pinMode(XP, OUTPUT);
pinMode(YM, OUTPUT);
// digitalWrite(XM, HIGH);
// digitalWrite(YP, HIGH);
// we have some minimum pressure we consider 'valid'
// pressure of 0 means no pressing!
if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) {
// is controller wired for Landscape ? or are we oriented in Landscape?
if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y);
// scale from 0->1023 to tft.width i.e. left = 0, rt = width
// 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
xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width());
ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height());
//
// 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.y, 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
@@ -285,6 +191,8 @@ void loop()
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);

View File

@@ -1,376 +0,0 @@
// TouchScreen_Calibr_kbv for MCUFRIEND UNO Display Shields
// adapted by David Prentice
// for Adafruit's <TouchScreen.h> Resistive Touch Screen Library
// from Henning Karlsen's original program. Many Thanks.
// UTouch_Calibration (C)2013-2014 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program can be used to calibrate the touchscreen
// of the display modules.
// This program requires the UTFT library and a touch
// screen module that is compatible with UTFT.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin
// numbers in the setup.
//
// Instructions will be given on the display.
#define TOUCH_ORIENTATION PORTRAIT
#define USE_UTOUCH 0
#if !(USE_UTOUCH)
#define TITLE "TouchScreen.h Calibration"
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h> //we are using UTFT display methods
UTFTGLUE myGLCD(0x9341, A2, A1, A3, A4, A0);
#include <TouchScreen.h>
// MCUFRIEND UNO shield shares pins with the TFT. Due does NOT work
#define YP A1 //A3 for ILI9320
#define YM 7 //9
#define XM A2
#define XP 6 //8
TouchScreen myTouch(XP, YP, XM, YM, 300);
TSPoint tp; //Touchscreen_due branch uses Point
void readResistiveTouch(void)
{
tp = myTouch.getPoint();
pinMode(YP, OUTPUT); //restore shared pins
pinMode(XM, OUTPUT);
digitalWrite(YP, HIGH);
digitalWrite(XM, HIGH);
}
bool ISPRESSED(void)
{
readResistiveTouch();
return tp.z > 20 && tp.z < 1000;
}
void showpoint(void)
{
Serial.print("\r\nx="); Serial.print(tp.x);
Serial.print(" y="); Serial.print(tp.y);
Serial.print(" z="); Serial.print(tp.z);
}
#else
#define TITLE "UTouch.h Calibration"
#include <SPI.h>
#include <UTFT.h>
#include <UTouch.h>
UTFT myGLCD(ILI9486, 38, 39, 40, 41);
UTouch myTouch( 6, 5, 4, 3, 2);
#define ISPRESSED() myTouch.dataAvailable()
extern void fail();
#endif
// ************************************
// DO NOT EDIT ANYTHING BELOW THIS LINE
// ************************************
// Declare which fonts we will be using
extern uint8_t SmallFont[];
uint32_t cx, cy;
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 buf[13];
void setup()
{
Serial.begin(9600);
Serial.println("UTouch_Calibr_kbv");
digitalWrite(A0, HIGH);
pinMode(A0, OUTPUT);
myGLCD.InitLCD(TOUCH_ORIENTATION);
myGLCD.clrScr();
myGLCD.setFont(SmallFont);
#if (USE_UTOUCH)
myTouch.InitTouch(TOUCH_ORIENTATION);
#endif
dispx = myGLCD.getDisplayXSize();
dispy = myGLCD.getDisplayYSize();
text_y_center = (dispy / 2) - 6;
}
void drawCrossHair(int x, int y)
{
myGLCD.drawRect(x - 10, y - 10, x + 10, y + 10);
myGLCD.drawLine(x - 5, y, x + 5, y);
myGLCD.drawLine(x, y - 5, x, y + 5);
}
void readCoordinates()
{
int iter = 5000;
int failcount = 0;
int cnt = 0;
uint32_t tx = 0;
uint32_t ty = 0;
boolean OK = false;
while (OK == false)
{
myGLCD.setColor(255, 255, 255);
myGLCD.print("* PRESS *", CENTER, text_y_center);
while (ISPRESSED() == false) {}
myGLCD.print("* HOLD! *", CENTER, text_y_center);
#if (USE_UTOUCH)
while ((ISPRESSED() == true) && (cnt < iter) && (failcount < 10000))
{
myTouch.calibrateRead();
if (!((myTouch.TP_X == 65535) || (myTouch.TP_Y == 65535)))
{
tx += myTouch.TP_X;
ty += myTouch.TP_Y;
cnt++;
}
else
failcount++;
}
#else
cnt = 0;
iter = 400;
do
{
readResistiveTouch();
// showpoint(tp);
if (tp.z > 20 && tp.z < 1000)
{
tx += tp.x;
ty += tp.y;
cnt++;
}
else
failcount++;
} while ((cnt < iter) && (failcount < 10000));
#endif
if (cnt >= iter)
{
OK = true;
}
else
{
tx = 0;
ty = 0;
cnt = 0;
}
if (failcount >= 10000)
fail();
}
cx = tx / iter;
cy = ty / iter;
}
void calibrate(int x, int y, int i)
{
myGLCD.setColor(255, 255, 255);
drawCrossHair(x, y);
myGLCD.setBackColor(255, 0, 0);
readCoordinates();
myGLCD.setColor(255, 255, 255);
myGLCD.print("* RELEASE *", CENTER, text_y_center);
myGLCD.setColor(80, 80, 80);
drawCrossHair(x, y);
rx[i] = cx;
ry[i] = cy;
Serial.print("\r\ncx="); Serial.print(cx);
Serial.print(" cy="); Serial.print(cy);
while (ISPRESSED() == true) {}
}
void waitForTouch()
{
while (ISPRESSED() == true) {}
while (ISPRESSED() == false) {}
while (ISPRESSED() == true) {}
}
void toHex(uint32_t num)
{
buf[0] = '0';
buf[1] = 'x';
buf[10] = 'U';
buf[11] = 'L';
buf[12] = 0;
for (int zz = 9; zz > 1; zz--)
{
if ((num & 0xF) > 9)
buf[zz] = (num & 0xF) + 55;
else
buf[zz] = (num & 0xF) + 48;
num = num >> 4;
}
}
void startup()
{
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print(TITLE, CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print("Use a stylus or something", LEFT, 30);
myGLCD.print("similar to touch as close", LEFT, 42);
myGLCD.print("to the center of the", LEFT, 54);
myGLCD.print("highlighted crosshair as", LEFT, 66);
myGLCD.print("possible. Keep as still as", LEFT, 78);
myGLCD.print("possible and keep holding", LEFT, 90);
myGLCD.print("until the highlight is", LEFT, 102);
myGLCD.print("removed. Repeat for all", LEFT, 114);
myGLCD.print("crosshairs in sequence.", LEFT, 126);
myGLCD.print("Touch screen to continue", CENTER, 162);
waitForTouch();
myGLCD.clrScr();
}
void showNumI(char *msg, uint32_t val, int x, int y)
{
myGLCD.print(msg, x, y);
myGLCD.printNumI(val, x + 50, y);
}
void done()
{
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print(TITLE, CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
#if (USE_UTOUCH)
myGLCD.print("To use the new calibration", LEFT, 30);
myGLCD.print("settings you must edit the", LEFT, 42);
myGLCD.setColor(160, 160, 255);
myGLCD.print("UTouchCD.h", LEFT, 54);
myGLCD.setColor(255, 255, 255);
myGLCD.print("file and change", 88, 54);
myGLCD.print("the following values. The", LEFT, 66);
myGLCD.print("values are located right", LEFT, 78);
myGLCD.print("below the opening comment.", LEFT, 90);
myGLCD.print("CAL_X", LEFT, 110);
myGLCD.print("CAL_Y", LEFT, 122);
myGLCD.print("CAL_S", LEFT, 134);
toHex(calx);
myGLCD.print(buf, 75, 110);
toHex(caly);
myGLCD.print(buf, 75, 122);
toHex(cals);
myGLCD.print(buf, 75, 134);
#else
myGLCD.print("To use the new calibration", LEFT, 30);
myGLCD.print("settings you must map the values", LEFT, 42);
myGLCD.print("from Point p = ts.getPoint() e.g. ", LEFT, 54);
myGLCD.print("x = map(p.x, LEFT, RT, 0, tft.width());", LEFT, 66);
myGLCD.print("y = map(p.y, TOP, BOT, 0, tft.height());", LEFT, 78);
myGLCD.print("swap p.x and p.y if diff ORIENTATION", LEFT, 90);
#endif
//.kbv show human values
showNumI("LEFT ", (calx >> 14) & 0x3FFF, 0, 186);
showNumI("RT ", (calx) & 0x3FFF, 100, 186);
myGLCD.printNumF(px, 2, 200, 186);
showNumI("TOP ", (caly >> 14) & 0x3FFF, 0, 198);
showNumI("BOT ", (caly) & 0x3FFF, 100, 198);
myGLCD.printNumF(py, 2, 200, 198);
showNumI("WID ", (cals >> 12) & 0xFFF, 0, 210);
showNumI("HT ", (cals) & 0xFFF, 100, 210);
myGLCD.print("Touch Controller is ", 0, 222);
myGLCD.print((cals >> 31) ? "LANDSCAPE" : "PORTRAIT", 170, 222);
}
void fail()
{
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx - 1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx - 1, 14);
myGLCD.print("Touch Calibration FAILED", CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print("Unable to read the position", LEFT, 30);
myGLCD.print("of the press. This is a", LEFT, 42);
myGLCD.print("hardware issue and can", 88, 54);
myGLCD.print("not be corrected in", LEFT, 66);
myGLCD.print("software.", LEFT, 78);
while (true) {};
}
void loop()
{
startup();
myGLCD.setColor(80, 80, 80);
drawCrossHair(dispx - 11, 10);
drawCrossHair(dispx / 2, 10);
drawCrossHair(10, 10);
drawCrossHair(dispx - 11, dispy / 2);
drawCrossHair(10, dispy / 2);
drawCrossHair(dispx - 11, dispy - 11);
drawCrossHair(dispx / 2, dispy - 11);
drawCrossHair(10, dispy - 11);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.print("***********", CENTER, text_y_center - 12);
myGLCD.print("***********", CENTER, text_y_center + 12);
calibrate(10, 10, 0);
calibrate(10, dispy / 2, 1);
calibrate(10, dispy - 11, 2);
calibrate(dispx / 2, 10, 3);
calibrate(dispx / 2, dispy - 11, 4);
calibrate(dispx - 11, 10, 5);
calibrate(dispx - 11, dispy / 2, 6);
calibrate(dispx - 11, dispy - 11, 7);
cals = (long(dispx - 1) << 12) + (dispy - 1);
if (TOUCH_ORIENTATION == PORTRAIT) swapxy = rx[2] - rx[0];
else swapxy = ry[2] - ry[0];
swapxy = (swapxy < -500 || swapxy > 500);
if ((TOUCH_ORIENTATION == PORTRAIT) ^ (swapxy != 0)) {
clx = (rx[0] + rx[1] + rx[2]) / 3;
crx = (rx[5] + rx[6] + rx[7]) / 3;
cty = (ry[0] + ry[3] + ry[5]) / 3;
cby = (ry[2] + ry[4] + ry[7]) / 3;
} else {
clx = (ry[0] + ry[1] + ry[2]) / 3;
crx = (ry[5] + ry[6] + ry[7]) / 3;
cty = (rx[0] + rx[3] + rx[5]) / 3;
cby = (rx[2] + rx[4] + rx[7]) / 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);
done();
while (true) {}
}

View File

@@ -0,0 +1,116 @@
/* an alternative approach. swap the #if 1 / 0 values to try it
*
*/
#if 0
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#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

View File

@@ -0,0 +1,84 @@
#if 1
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#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

View File

@@ -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 <avr/pgmspace.h>
//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 <avr/pgmspace.h>
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)
};

View File

@@ -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,
};

View File

@@ -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
}

View File

@@ -17,6 +17,14 @@
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
@@ -60,7 +68,7 @@ R61580 240x320 ID=0x1580 #define SUPPORT_1580 *** Untested ***
R61581 320x480 ID=0x1581
RM68090 240x320 ID=0x6809
RM68140 320x480 ID=0x6814 #define SUPPORT_68140
S6D0139 240x320 ID=0x0139 #define SUPPORT_0139 *** Untested ***
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
@@ -109,4 +117,9 @@ It also runs on NUCLEO-F103 and TEENSY3.2 with Sparkfun Adapter
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 mcufriend_shield.h: #define USE_SPECIAL
Edit mcufriend_special.h: #define USE_OPENSMART_SHIELD_PINOUT
Edit MCUFRIEND_kbv.cpp: #define SUPPORT_8352B
CHANGE HISTORY: is now in "mcufriend_history.txt"

85
license.txt Normal file
View File

@@ -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^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -41,7 +41,7 @@
#define RD_STROBE RD_IDLE, RD_ACTIVE, RD_ACTIVE, RD_ACTIVE //PWLR=TRDL=150ns
#if defined(TEENSY) || defined(__ARM_ARCH_7EM__) // -O2: F411@100MHz = 1.44s
#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; WR_ACTIVE; }
#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; }
#elif defined(__ARM_ARCH_7M__) // -O2: F103@72MHz = 2.68s
#define WRITE_DELAY { }
@@ -51,9 +51,9 @@
#define READ_DELAY { }
#endif
#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; }
#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; WR_IDLE; }
#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; } // read 250ns after RD_ACTIVE goes low
#define READ_8(dst) { RD_STROBE; READ_DELAY; dst = read_8(); RD_IDLE; 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; }

View File

@@ -345,7 +345,8 @@ void write_8(uint8_t x)
|| 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_L053R8) || defined(ARDUINO_NUCLEO_L476RG) \
|| defined(ARDUINO_NUCLEO_F446RE) || defined(ARDUINO_NUCLEO_L053R8) \
|| defined(ARDUINO_NUCLEO_L152RE) || defined(ARDUINO_NUCLEO_L476RG) \
)
// F1xx, F4xx, L4xx have different registers and styles. General Macros
#if defined(__STM32F1__) //weird Maple Core
@@ -402,13 +403,19 @@ void write_8(uint8_t x)
#elif defined(STM32F401xE)
#define WRITE_DELAY { WR_ACTIVE; WR_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; }
#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_ACTIVE; WR_ACTIVE; WR_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; }
#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(STM32F446xx)
#define WRITE_DELAY { 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; }
#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)
@@ -418,9 +425,15 @@ void write_8(uint8_t x)
#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 { }
#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_ACTIVE; WR_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; }
#define READ_DELAY { RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; RD_ACTIVE; 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)
@@ -543,9 +556,9 @@ void write_8(uint8_t x)
#error REGS group
#endif
#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; }
#define write8(x) { write_8(x); WRITE_DELAY; WR_STROBE; WR_IDLE; }
#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_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); }
//################################### ESP32 ##############################

View File

@@ -182,7 +182,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(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG)
#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F446RE)
#define PIN_MODE2(reg, pin, mode) reg=(reg&~(0x3<<((pin)<<1)))|(mode<<((pin)<<1))
#if __MBED__
#warning MBED knows everything
@@ -196,7 +196,7 @@
#endif
#elif defined(STM32L476xx)
#include <STM32L4XX.h>
#elif defined(STM32F401xE) || defined(STM32F411xE)
#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx)
#include <STM32F4XX.h>
#endif
#define D0_PORT GPIOA

View File

@@ -83,7 +83,7 @@
#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(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG)
#elif defined(NUCLEO) || defined(TARGET_NUCLEO_F072RB) || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L476RG) || defined(TARGET_NUCLEO_F446RE)
#if __MBED__
#warning MBED knows everything
#elif defined(STM32F072xB)
@@ -96,7 +96,7 @@
#endif
#elif defined(STM32L476xx)
#include <STM32L4XX.h>
#elif defined(STM32F401xE) || defined(STM32F411xE)
#elif defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx)
#include <STM32F4XX.h>
#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