├── Arduino_ST7789_Fast.cpp ├── Arduino_ST7789_Fast.h ├── LICENSE ├── README.md ├── README.txt ├── examples ├── ST7789_AdafruitBenchmark │ └── ST7789_AdafruitBenchmark.ino ├── ST7789_AmigaBall │ ├── ST7789_AmigaBall.ino │ └── ball.h ├── ST7789_BMPviaSerial │ └── ST7789_BMPviaSerial.ino ├── ST7789_BigScroll │ └── ST7789_BigScroll.ino ├── ST7789_Bitmap │ ├── ST7789_Bitmap.ino │ └── bitmap.h ├── ST7789_ControllerModes │ └── ST7789_ControllerModes.ino ├── ST7789_HelloWorld │ └── ST7789_HelloWorld.ino ├── ST7789_Navi_switch │ └── ST7789_Navi_switch.ino ├── ST7789_Numeric_display │ └── ST7789_Numeric_display.ino ├── ST7789_Rotation │ └── ST7789_Rotation.ino ├── ST7789_Scroll │ └── ST7789_Scroll.ino ├── ST7789_Watch_2bit │ ├── ST7789_Watch_2bit.ino │ ├── rtc.h │ ├── sansmains.h │ ├── smartq02.h │ ├── smartq04.h │ ├── smartq07.h │ ├── smartq08.h │ └── smartq09.h ├── ST7789_power_consumption │ └── ST7789_power_consumption.ino └── ST7789_terminal │ └── ST7789_terminal.ino ├── keywords.txt └── library.properties /Arduino_ST7789_Fast.cpp: -------------------------------------------------------------------------------- 1 | // Fast ST7789 IPS 240x240 SPI display library 2 | // (c) 2019-20 by Pawel A. Hernik 3 | 4 | #include "Arduino_ST7789_Fast.h" 5 | #include 6 | #include "pins_arduino.h" 7 | #include "wiring_private.h" 8 | #include 9 | 10 | // ----------------------------------------- 11 | // ST7789 commands 12 | 13 | #define ST7789_NOP 0x00 14 | #define ST7789_SWRESET 0x01 15 | 16 | #define ST7789_SLPIN 0x10 // sleep on 17 | #define ST7789_SLPOUT 0x11 // sleep off 18 | #define ST7789_PTLON 0x12 // partial on 19 | #define ST7789_NORON 0x13 // partial off 20 | #define ST7789_INVOFF 0x20 // invert off 21 | #define ST7789_INVON 0x21 // invert on 22 | #define ST7789_DISPOFF 0x28 // display off 23 | #define ST7789_DISPON 0x29 // display on 24 | #define ST7789_IDMOFF 0x38 // idle off 25 | #define ST7789_IDMON 0x39 // idle on 26 | 27 | #define ST7789_CASET 0x2A 28 | #define ST7789_RASET 0x2B 29 | #define ST7789_RAMWR 0x2C 30 | #define ST7789_RAMRD 0x2E 31 | 32 | #define ST7789_COLMOD 0x3A 33 | #define ST7789_MADCTL 0x36 34 | 35 | #define ST7789_PTLAR 0x30 // partial start/end 36 | #define ST7789_VSCRDEF 0x33 // SETSCROLLAREA 37 | #define ST7789_VSCRSADD 0x37 38 | 39 | #define ST7789_WRDISBV 0x51 40 | #define ST7789_WRCTRLD 0x53 41 | #define ST7789_WRCACE 0x55 42 | #define ST7789_WRCABCMB 0x5e 43 | 44 | #define ST7789_POWSAVE 0xbc 45 | #define ST7789_DLPOFFSAVE 0xbd 46 | 47 | // bits in MADCTL 48 | #define ST7789_MADCTL_MY 0x80 49 | #define ST7789_MADCTL_MX 0x40 50 | #define ST7789_MADCTL_MV 0x20 51 | #define ST7789_MADCTL_ML 0x10 52 | #define ST7789_MADCTL_RGB 0x00 53 | 54 | #define ST7789_240x240_XSTART 0 55 | #define ST7789_240x240_YSTART 0 56 | 57 | #define ST_CMD_DELAY 0x80 58 | 59 | // Initialization commands for ST7789 240x240 1.3" IPS 60 | // taken from Adafruit 61 | static const uint8_t PROGMEM init_240x240[] = { 62 | 9, // 9 commands in list: 63 | ST7789_SWRESET, ST_CMD_DELAY, // 1: Software reset, no args, w/delay 64 | 150, // 150 ms delay 65 | ST7789_SLPOUT , ST_CMD_DELAY, // 2: Out of sleep mode, no args, w/delay 66 | 255, // 255 = 500 ms delay 67 | ST7789_COLMOD , 1+ST_CMD_DELAY, // 3: Set color mode, 1 arg + delay: 68 | 0x55, // 16-bit color 69 | 10, // 10 ms delay 70 | ST7789_MADCTL , 1, // 4: Memory access ctrl (directions), 1 arg: 71 | 0x00, // Row addr/col addr, bottom to top refresh 72 | ST7789_CASET , 4, // 5: Column addr set, 4 args, no delay: 73 | 0x00, ST7789_240x240_XSTART, // XSTART = 0 74 | (ST7789_TFTWIDTH+ST7789_240x240_XSTART) >> 8, 75 | (ST7789_TFTWIDTH+ST7789_240x240_XSTART) & 0xFF, // XEND = 240 76 | ST7789_RASET , 4, // 6: Row addr set, 4 args, no delay: 77 | 0x00, ST7789_240x240_YSTART, // YSTART = 0 78 | (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) >> 8, 79 | (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) & 0xFF, // YEND = 240 80 | ST7789_INVON , ST_CMD_DELAY, // 7: Inversion ON 81 | 10, 82 | ST7789_NORON , ST_CMD_DELAY, // 8: Normal display on, no args, w/delay 83 | 10, // 10 ms delay 84 | ST7789_DISPON , ST_CMD_DELAY, // 9: Main screen turn on, no args, w/delay 85 | 20 86 | }; 87 | // ----------------------------------------- 88 | 89 | #ifdef COMPATIBILITY_MODE 90 | static SPISettings spiSettings; 91 | #define SPI_START SPI.beginTransaction(spiSettings) 92 | #define SPI_END SPI.endTransaction() 93 | #else 94 | #define SPI_START 95 | #define SPI_END 96 | #endif 97 | 98 | // macros for fast DC and CS state changes 99 | #ifdef COMPATIBILITY_MODE 100 | #define DC_DATA digitalWrite(dcPin, HIGH) 101 | #define DC_COMMAND digitalWrite(dcPin, LOW) 102 | #define CS_IDLE digitalWrite(csPin, HIGH) 103 | #define CS_ACTIVE digitalWrite(csPin, LOW) 104 | #else 105 | #define DC_DATA *dcPort |= dcMask 106 | #define DC_COMMAND *dcPort &= ~dcMask 107 | #define CS_IDLE *csPort |= csMask 108 | #define CS_ACTIVE *csPort &= ~csMask 109 | #endif 110 | 111 | // if CS always connected to the ground then don't do anything for better performance 112 | #ifdef CS_ALWAYS_LOW 113 | #define CS_IDLE 114 | #define CS_ACTIVE 115 | #endif 116 | 117 | // ---------------------------------------------------------- 118 | // speed test results: 119 | // in AVR best performance mode -> about 6.9 Mbps 120 | // in compatibility mode (SPI.transfer(c)) -> about 4 Mbps 121 | inline void Arduino_ST7789::writeSPI(uint8_t c) 122 | { 123 | #ifdef COMPATIBILITY_MODE 124 | SPI.transfer(c); 125 | #else 126 | SPDR = c; 127 | /* 128 | asm volatile("nop"); // 8 NOPs seem to be enough for 16MHz AVR @ DIV2 to avoid using while loop 129 | asm volatile("nop"); 130 | asm volatile("nop"); 131 | asm volatile("nop"); 132 | asm volatile("nop"); 133 | asm volatile("nop"); 134 | asm volatile("nop"); 135 | asm volatile("nop"); 136 | */ 137 | asm volatile("rjmp .+0\n"); 138 | asm volatile("rjmp .+0\n"); 139 | asm volatile("rjmp .+0\n"); 140 | asm volatile("rjmp .+0\n"); 141 | //while(!(SPSR & _BV(SPIF))) ; 142 | #endif 143 | } 144 | 145 | // ---------------------------------------------------------- 146 | // fast method to send multiple 16-bit values via SPI 147 | inline void Arduino_ST7789::writeMulti(uint16_t color, uint16_t num) 148 | { 149 | #ifdef COMPATIBILITY_MODE 150 | while(num--) { SPI.transfer(color>>8); SPI.transfer(color); } 151 | #else 152 | asm volatile 153 | ( 154 | "next:\n" 155 | "out %[spdr],%[hi]\n" 156 | "rjmp .+0\n" // wait 8*2+1 = 17 cycles 157 | "rjmp .+0\n" 158 | "rjmp .+0\n" 159 | "rjmp .+0\n" 160 | "rjmp .+0\n" 161 | "rjmp .+0\n" 162 | "rjmp .+0\n" 163 | "rjmp .+0\n" 164 | "nop\n" 165 | "out %[spdr],%[lo]\n" 166 | "rjmp .+0\n" // wait 6*2+1 = 13 cycles + sbiw + brne 167 | "rjmp .+0\n" 168 | "rjmp .+0\n" 169 | "rjmp .+0\n" 170 | "rjmp .+0\n" 171 | "rjmp .+0\n" 172 | "nop\n" 173 | "sbiw %[num],1\n" 174 | "brne next\n" 175 | : [num] "+w" (num) 176 | : [spdr] "I" (_SFR_IO_ADDR(SPDR)), [lo] "r" ((uint8_t)color), [hi] "r" ((uint8_t)(color>>8)) 177 | ); 178 | #endif 179 | } 180 | // ---------------------------------------------------------- 181 | // fast method to send multiple 16-bit values from RAM via SPI 182 | inline void Arduino_ST7789::copyMulti(uint8_t *img, uint16_t num) 183 | { 184 | #ifdef COMPATIBILITY_MODE 185 | while(num--) { SPI.transfer(*(img+1)); SPI.transfer(*(img+0)); img+=2; } 186 | #else 187 | uint8_t lo,hi; 188 | asm volatile 189 | ( 190 | "nextCopy:\n" 191 | "ld %[hi],%a[img]+\n" 192 | "ld %[lo],%a[img]+\n" 193 | "out %[spdr],%[lo]\n" 194 | "rjmp .+0\n" // wait 8*2+1 = 17 cycles 195 | "rjmp .+0\n" 196 | "rjmp .+0\n" 197 | "rjmp .+0\n" 198 | "rjmp .+0\n" 199 | "rjmp .+0\n" 200 | "rjmp .+0\n" 201 | "rjmp .+0\n" 202 | "nop\n" 203 | "out %[spdr],%[hi]\n" 204 | "rjmp .+0\n" // wait 4*2+1 = 9 cycles + sbiw + brne + ld*2 205 | "rjmp .+0\n" 206 | "rjmp .+0\n" 207 | "rjmp .+0\n" 208 | "nop\n" 209 | "sbiw %[num],1\n" 210 | "brne nextCopy\n" 211 | : [num] "+w" (num) 212 | : [spdr] "I" (_SFR_IO_ADDR(SPDR)), [img] "e" (img), [lo] "r" (lo), [hi] "r" (hi) 213 | ); 214 | #endif 215 | } 216 | // ---------------------------------------------------------- 217 | Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t cs) : Adafruit_GFX(ST7789_TFTWIDTH, ST7789_TFTHEIGHT) 218 | { 219 | csPin = cs; 220 | dcPin = dc; 221 | rstPin = rst; 222 | } 223 | 224 | // ---------------------------------------------------------- 225 | void Arduino_ST7789::init(uint16_t width, uint16_t height) 226 | { 227 | commonST7789Init(NULL); 228 | 229 | if(width==240 && height==240) { 230 | _colstart = 0; 231 | _rowstart = 80; 232 | } else { 233 | _colstart = 0; 234 | _rowstart = 0; 235 | } 236 | _ystart = _xstart = 0; 237 | _width = width; 238 | _height = height; 239 | 240 | displayInit(init_240x240); 241 | setRotation(2); 242 | } 243 | 244 | // ---------------------------------------------------------- 245 | void Arduino_ST7789::writeCmd(uint8_t c) 246 | { 247 | DC_COMMAND; 248 | CS_ACTIVE; 249 | SPI_START; 250 | 251 | writeSPI(c); 252 | 253 | CS_IDLE; 254 | SPI_END; 255 | } 256 | 257 | // ---------------------------------------------------------- 258 | void Arduino_ST7789::writeData(uint8_t d8) 259 | { 260 | DC_DATA; 261 | CS_ACTIVE; 262 | SPI_START; 263 | 264 | writeSPI(d8); 265 | 266 | CS_IDLE; 267 | SPI_END; 268 | } 269 | 270 | // ---------------------------------------------------------- 271 | void Arduino_ST7789::writeData16(uint16_t d16) 272 | { 273 | DC_DATA; 274 | CS_ACTIVE; 275 | SPI_START; 276 | 277 | writeMulti(d16,1); 278 | 279 | CS_IDLE; 280 | SPI_END; 281 | } 282 | 283 | // ---------------------------------------------------------- 284 | void Arduino_ST7789::displayInit(const uint8_t *addr) 285 | { 286 | uint8_t numCommands, numArgs; 287 | uint16_t ms; 288 | numCommands = pgm_read_byte(addr++); 289 | while(numCommands--) { 290 | writeCmd(pgm_read_byte(addr++)); 291 | numArgs = pgm_read_byte(addr++); 292 | ms = numArgs & ST_CMD_DELAY; 293 | numArgs &= ~ST_CMD_DELAY; 294 | while(numArgs--) writeData(pgm_read_byte(addr++)); 295 | 296 | if(ms) { 297 | ms = pgm_read_byte(addr++); 298 | if(ms==255) ms=500; 299 | delay(ms); 300 | } 301 | } 302 | } 303 | 304 | // ---------------------------------------------------------- 305 | // Initialization code common to all ST7789 displays 306 | void Arduino_ST7789::commonST7789Init(const uint8_t *cmdList) 307 | { 308 | pinMode(dcPin, OUTPUT); 309 | #ifndef CS_ALWAYS_LOW 310 | pinMode(csPin, OUTPUT); 311 | #endif 312 | 313 | #ifndef COMPATIBILITY_MODE 314 | dcPort = portOutputRegister(digitalPinToPort(dcPin)); 315 | dcMask = digitalPinToBitMask(dcPin); 316 | #ifndef CS_ALWAYS_LOW 317 | csPort = portOutputRegister(digitalPinToPort(csPin)); 318 | csMask = digitalPinToBitMask(csPin); 319 | #endif 320 | #endif 321 | 322 | // on AVR ST7789 works correctly in MODE2 and MODE3 but for STM32 only MODE3 seems to be working 323 | SPI.begin(); 324 | #ifdef COMPATIBILITY_MODE 325 | spiSettings = SPISettings(16000000, MSBFIRST, SPI_MODE3); // 8000000 gives max speed on AVR 16MHz 326 | #else 327 | SPI.setClockDivider(SPI_CLOCK_DIV2); 328 | SPI.setDataMode(SPI_MODE3); 329 | #endif 330 | 331 | CS_ACTIVE; 332 | if(rstPin != -1) { 333 | pinMode(rstPin, OUTPUT); 334 | digitalWrite(rstPin, HIGH); 335 | delay(50); 336 | digitalWrite(rstPin, LOW); 337 | delay(50); 338 | digitalWrite(rstPin, HIGH); 339 | delay(50); 340 | } 341 | 342 | if(cmdList) displayInit(cmdList); 343 | } 344 | 345 | // ---------------------------------------------------------- 346 | void Arduino_ST7789::setRotation(uint8_t m) 347 | { 348 | writeCmd(ST7789_MADCTL); 349 | rotation = m & 3; 350 | switch (rotation) { 351 | case 0: 352 | writeData(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB); 353 | _xstart = _colstart; 354 | _ystart = _rowstart; 355 | break; 356 | case 1: 357 | writeData(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB); 358 | _ystart = _colstart; 359 | _xstart = _rowstart; 360 | break; 361 | case 2: 362 | writeData(ST7789_MADCTL_RGB); 363 | _xstart = 0; 364 | _ystart = 0; 365 | break; 366 | case 3: 367 | writeData(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB); 368 | _xstart = 0; 369 | _ystart = 0; 370 | break; 371 | } 372 | } 373 | 374 | // ---------------------------------------------------------- 375 | void Arduino_ST7789::setAddrWindow(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye) 376 | { 377 | xs+=_xstart; xe+=_xstart; 378 | ys+=_ystart; ye+=_ystart; 379 | 380 | CS_ACTIVE; 381 | SPI_START; 382 | 383 | DC_COMMAND; writeSPI(ST7789_CASET); 384 | DC_DATA; 385 | writeSPI(xs >> 8); writeSPI(xs); 386 | writeSPI(xe >> 8); writeSPI(xe); 387 | 388 | DC_COMMAND; writeSPI(ST7789_RASET); 389 | DC_DATA; 390 | writeSPI(ys >> 8); writeSPI(ys); 391 | writeSPI(ye >> 8); writeSPI(ye); 392 | 393 | DC_COMMAND; writeSPI(ST7789_RAMWR); 394 | 395 | DC_DATA; 396 | // no CS_IDLE + SPI_END, DC_DATA to save memory 397 | } 398 | 399 | // ---------------------------------------------------------- 400 | void Arduino_ST7789::pushColor(uint16_t color) 401 | { 402 | SPI_START; 403 | //DC_DATA; 404 | CS_ACTIVE; 405 | 406 | writeSPI(color>>8); writeSPI(color); 407 | 408 | CS_IDLE; 409 | SPI_END; 410 | } 411 | 412 | // ---------------------------------------------------------- 413 | void Arduino_ST7789::drawPixel(int16_t x, int16_t y, uint16_t color) 414 | { 415 | if(x<0 ||x>=_width || y<0 || y>=_height) return; 416 | setAddrWindow(x,y,x+1,y+1); 417 | 418 | writeSPI(color>>8); writeSPI(color); 419 | /* 420 | asm volatile 421 | ( 422 | "out %[spdr],%[hi]\n" 423 | "rjmp .+0\n" // wait 8*2+1 = 17 cycles 424 | "rjmp .+0\n" 425 | "rjmp .+0\n" 426 | "rjmp .+0\n" 427 | "rjmp .+0\n" 428 | "rjmp .+0\n" 429 | "rjmp .+0\n" 430 | "rjmp .+0\n" 431 | "nop\n" 432 | "out %[spdr],%[lo]\n" 433 | //"rjmp .+0\n" // wait 6*2+1 = 13 cycles + sbiw + brne 434 | //"rjmp .+0\n" 435 | //"rjmp .+0\n" 436 | //"rjmp .+0\n" 437 | //"nop\n" 438 | : 439 | : [spdr] "I" (_SFR_IO_ADDR(SPDR)), [lo] "r" ((uint8_t)color), [hi] "r" ((uint8_t)(color>>8)) 440 | ); 441 | */ 442 | CS_IDLE; 443 | SPI_END; 444 | } 445 | 446 | // ---------------------------------------------------------- 447 | void Arduino_ST7789::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) 448 | { 449 | if(x>=_width || y>=_height || h<=0) return; 450 | if(y+h-1>=_height) h=_height-y; 451 | setAddrWindow(x, y, x, y+h-1); 452 | 453 | writeMulti(color,h); 454 | 455 | CS_IDLE; 456 | SPI_END; 457 | } 458 | 459 | // ---------------------------------------------------------- 460 | void Arduino_ST7789::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) 461 | { 462 | if(x>=_width || y>=_height || w<=0) return; 463 | if(x+w-1>=_width) w=_width-x; 464 | setAddrWindow(x, y, x+w-1, y); 465 | 466 | writeMulti(color,w); 467 | 468 | CS_IDLE; 469 | SPI_END; 470 | } 471 | 472 | // ---------------------------------------------------------- 473 | void Arduino_ST7789::fillScreen(uint16_t color) 474 | { 475 | fillRect(0, 0, _width, _height, color); 476 | } 477 | 478 | // ---------------------------------------------------------- 479 | void Arduino_ST7789::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) 480 | { 481 | if(x>=_width || y>=_height || w<=0 || h<=0) return; 482 | if(x+w-1>=_width) w=_width -x; 483 | if(y+h-1>=_height) h=_height-y; 484 | setAddrWindow(x, y, x+w-1, y+h-1); 485 | 486 | writeMulti(color,w*h); 487 | 488 | CS_IDLE; 489 | SPI_END; 490 | } 491 | 492 | // ---------------------------------------------------------- 493 | // draws image from RAM 494 | void Arduino_ST7789::drawImage(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t *img16) 495 | { 496 | // all protections should be on the application side 497 | if(w<=0 || h<=0) return; // left for compatibility 498 | //if(x>=_width || y>=_height || w<=0 || h<=0) return; 499 | //if(x+w-1>=_width) w=_width -x; 500 | //if(y+h-1>=_height) h=_height-y; 501 | setAddrWindow(x, y, x+w-1, y+h-1); 502 | 503 | copyMulti((uint8_t *)img16, w*h); 504 | 505 | CS_IDLE; 506 | SPI_END; 507 | } 508 | 509 | // ---------------------------------------------------------- 510 | // draws image from flash (PROGMEM) 511 | void Arduino_ST7789::drawImageF(int16_t x, int16_t y, int16_t w, int16_t h, const uint16_t *img16) 512 | { 513 | if(x>=_width || y>=_height || w<=0 || h<=0) return; 514 | setAddrWindow(x, y, x+w-1, y+h-1); 515 | 516 | uint32_t num = (uint32_t)w*h; 517 | uint16_t num16 = num>>3; 518 | uint8_t *img = (uint8_t *)img16; 519 | while(num16--) { 520 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 521 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 522 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 523 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 524 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 525 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 526 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 527 | writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; 528 | } 529 | uint8_t num8 = num & 0x7; 530 | while(num8--) { writeSPI(pgm_read_byte(img+1)); writeSPI(pgm_read_byte(img+0)); img+=2; } 531 | 532 | CS_IDLE; 533 | SPI_END; 534 | } 535 | 536 | // ---------------------------------------------------------- 537 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color 538 | uint16_t Arduino_ST7789::Color565(uint8_t r, uint8_t g, uint8_t b) 539 | { 540 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); 541 | } 542 | 543 | // ---------------------------------------------------------- 544 | void Arduino_ST7789::invertDisplay(boolean mode) 545 | { 546 | writeCmd(!mode ? ST7789_INVON : ST7789_INVOFF); // modes inverted? 547 | } 548 | 549 | // ---------------------------------------------------------- 550 | void Arduino_ST7789::partialDisplay(boolean mode) 551 | { 552 | writeCmd(mode ? ST7789_PTLON : ST7789_NORON); 553 | } 554 | 555 | // ---------------------------------------------------------- 556 | void Arduino_ST7789::sleepDisplay(boolean mode) 557 | { 558 | writeCmd(mode ? ST7789_SLPIN : ST7789_SLPOUT); 559 | delay(5); 560 | } 561 | 562 | // ---------------------------------------------------------- 563 | void Arduino_ST7789::enableDisplay(boolean mode) 564 | { 565 | writeCmd(mode ? ST7789_DISPON : ST7789_DISPOFF); 566 | } 567 | 568 | // ---------------------------------------------------------- 569 | void Arduino_ST7789::idleDisplay(boolean mode) 570 | { 571 | writeCmd(mode ? ST7789_IDMON : ST7789_IDMOFF); 572 | } 573 | 574 | // ---------------------------------------------------------- 575 | void Arduino_ST7789::resetDisplay() 576 | { 577 | writeCmd(ST7789_SWRESET); 578 | delay(5); 579 | } 580 | 581 | // ---------------------------------------------------------- 582 | void Arduino_ST7789::setScrollArea(uint16_t tfa, uint16_t bfa) 583 | { 584 | uint16_t vsa = 320-tfa-bfa; // ST7789 320x240 VRAM 585 | writeCmd(ST7789_VSCRDEF); 586 | writeData16(tfa); 587 | writeData16(vsa); 588 | writeData16(bfa); 589 | } 590 | 591 | // ---------------------------------------------------------- 592 | void Arduino_ST7789::setScroll(uint16_t vsp) 593 | { 594 | writeCmd(ST7789_VSCRSADD); 595 | writeData16(vsp); 596 | } 597 | 598 | // ---------------------------------------------------------- 599 | void Arduino_ST7789::setPartArea(uint16_t sr, uint16_t er) 600 | { 601 | writeCmd(ST7789_PTLAR); 602 | writeData16(sr); 603 | writeData16(er); 604 | } 605 | 606 | // ---------------------------------------------------------- 607 | // doesn't work 608 | void Arduino_ST7789::setBrightness(uint8_t br) 609 | { 610 | //writeCmd(ST7789_WRCACE); 611 | //writeData(0xb1); // 80,90,b0, or 00,01,02,03 612 | //writeCmd(ST7789_WRCABCMB); 613 | //writeData(120); 614 | 615 | //BCTRL=0x20, dd=0x08, bl=0x04 616 | int val = 0x04; 617 | writeCmd(ST7789_WRCTRLD); 618 | writeData(val); 619 | writeCmd(ST7789_WRDISBV); 620 | writeData(br); 621 | } 622 | 623 | // ---------------------------------------------------------- 624 | // 0 - off 625 | // 1 - idle 626 | // 2 - normal 627 | // 4 - display off 628 | void Arduino_ST7789::powerSave(uint8_t mode) 629 | { 630 | if(mode==0) { 631 | writeCmd(ST7789_POWSAVE); 632 | writeData(0xec|3); 633 | writeCmd(ST7789_DLPOFFSAVE); 634 | writeData(0xff); 635 | return; 636 | } 637 | int is = (mode&1) ? 0 : 1; 638 | int ns = (mode&2) ? 0 : 2; 639 | writeCmd(ST7789_POWSAVE); 640 | writeData(0xec|ns|is); 641 | if(mode&4) { 642 | writeCmd(ST7789_DLPOFFSAVE); 643 | writeData(0xfe); 644 | } 645 | } 646 | 647 | // ------------------------------------------------ 648 | // Input a value 0 to 511 (85*6) to get a color value. 649 | // The colours are a transition R - Y - G - C - B - M - R. 650 | void Arduino_ST7789::rgbWheel(int idx, uint8_t *_r, uint8_t *_g, uint8_t *_b) 651 | { 652 | idx &= 0x1ff; 653 | if(idx < 85) { // R->Y 654 | *_r = 255; *_g = idx * 3; *_b = 0; 655 | return; 656 | } else if(idx < 85*2) { // Y->G 657 | idx -= 85*1; 658 | *_r = 255 - idx * 3; *_g = 255; *_b = 0; 659 | return; 660 | } else if(idx < 85*3) { // G->C 661 | idx -= 85*2; 662 | *_r = 0; *_g = 255; *_b = idx * 3; 663 | return; 664 | } else if(idx < 85*4) { // C->B 665 | idx -= 85*3; 666 | *_r = 0; *_g = 255 - idx * 3; *_b = 255; 667 | return; 668 | } else if(idx < 85*5) { // B->M 669 | idx -= 85*4; 670 | *_r = idx * 3; *_g = 0; *_b = 255; 671 | return; 672 | } else { // M->R 673 | idx -= 85*5; 674 | *_r = 255; *_g = 0; *_b = 255 - idx * 3; 675 | return; 676 | } 677 | } 678 | 679 | uint16_t Arduino_ST7789::rgbWheel(int idx) 680 | { 681 | uint8_t r,g,b; 682 | rgbWheel(idx, &r,&g,&b); 683 | return RGBto565(r,g,b); 684 | } 685 | 686 | // ------------------------------------------------ -------------------------------------------------------------------------------- /Arduino_ST7789_Fast.h: -------------------------------------------------------------------------------- 1 | // Fast ST7789 IPS 240x240 SPI display library 2 | // (c) 2019-20 by Pawel A. Hernik 3 | 4 | #ifndef _ST7789_FAST_H_ 5 | #define _ST7789_FAST_H_ 6 | 7 | // ------------------------------ 8 | // remove "define COMPATIBILITY_MODE" for best performance on 16MHz AVR Arduinos 9 | // if defined - the library should work on all Arduino compatible boards 10 | //#define COMPATIBILITY_MODE 11 | 12 | // define for LCD boards where CS pin is internally connected to the ground 13 | #define CS_ALWAYS_LOW 14 | // ------------------------------ 15 | 16 | #include "Arduino.h" 17 | #include "Print.h" 18 | #include 19 | #include 20 | 21 | #define ST7789_TFTWIDTH 240 22 | #define ST7789_TFTHEIGHT 240 23 | 24 | // Color definitions 25 | 26 | #define RGBto565(r,g,b) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | ((b) >> 3)) 27 | #define RGBIto565(r,g,b,i) ((((((r)*(i))/255) & 0xF8) << 8) | ((((g)*(i)/255) & 0xFC) << 3) | ((((b)*(i)/255) & 0xFC) >> 3)) 28 | 29 | #define BLACK 0x0000 30 | #define BLUE 0x001F 31 | #define RED 0xF800 32 | #define GREEN 0x07E0 33 | #define CYAN 0x07FF 34 | #define MAGENTA 0xF81F 35 | #define YELLOW 0xFFE0 36 | #define WHITE 0xFFFF 37 | 38 | #define GREY RGBto565(128,128,128) 39 | #define LGREY RGBto565(160,160,160) 40 | #define DGREY RGBto565( 80, 80, 80) 41 | 42 | #define LBLUE RGBto565(100,100,255) 43 | #define DBLUE RGBto565( 0, 0,128) 44 | 45 | class Arduino_ST7789 : public Adafruit_GFX { 46 | 47 | public: 48 | Arduino_ST7789(int8_t DC, int8_t RST, int8_t CS = -1); 49 | 50 | void init(uint16_t width, uint16_t height); 51 | void begin() { init(ST7789_TFTWIDTH,ST7789_TFTHEIGHT); } 52 | void init() { init(ST7789_TFTWIDTH,ST7789_TFTHEIGHT); } 53 | void setAddrWindow(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye); 54 | void pushColor(uint16_t color); 55 | void fillScreen(uint16_t color=BLACK); 56 | void clearScreen() { fillScreen(BLACK); } 57 | void cls() { fillScreen(BLACK); } 58 | void drawPixel(int16_t x, int16_t y, uint16_t color); 59 | void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); 60 | void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); 61 | void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); 62 | void drawImage(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t *img); 63 | void drawImageF(int16_t x, int16_t y, int16_t w, int16_t h, const uint16_t *img16); 64 | void drawImageF(int16_t x, int16_t y, const uint16_t *img16) { drawImageF(x,y,pgm_read_word(img16),pgm_read_word(img16+1),img16+3); } 65 | void setRotation(uint8_t r); 66 | void invertDisplay(boolean mode); 67 | void partialDisplay(boolean mode); 68 | void sleepDisplay(boolean mode); 69 | void enableDisplay(boolean mode); 70 | void idleDisplay(boolean mode); 71 | void resetDisplay(); 72 | void setScrollArea(uint16_t tfa, uint16_t bfa); 73 | void setScroll(uint16_t vsp); 74 | void setPartArea(uint16_t sr, uint16_t er); 75 | void setBrightness(uint8_t br); 76 | void powerSave(uint8_t mode); 77 | 78 | uint16_t Color565(uint8_t r, uint8_t g, uint8_t b); 79 | uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { return Color565(r, g, b); } 80 | void rgbWheel(int idx, uint8_t *_r, uint8_t *_g, uint8_t *_b); 81 | uint16_t rgbWheel(int idx); 82 | 83 | protected: 84 | uint8_t _colstart, _rowstart, _xstart, _ystart; 85 | 86 | void displayInit(const uint8_t *addr); 87 | void writeSPI(uint8_t); 88 | void writeMulti(uint16_t color, uint16_t num); 89 | void copyMulti(uint8_t *img, uint16_t num); 90 | void writeCmd(uint8_t c); 91 | void writeData(uint8_t d8); 92 | void writeData16(uint16_t d16); 93 | void commonST7789Init(const uint8_t *cmdList); 94 | 95 | private: 96 | int8_t csPin, dcPin, rstPin; 97 | uint8_t csMask, dcMask; 98 | volatile uint8_t *csPort, *dcPort; 99 | 100 | }; 101 | 102 | #endif 103 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino_ST7789_Fast 2 | 3 | ### This library is obsolete. Use newer version available here: ### 4 | ## https://github.com/cbm80amiga/ST7789_AVR ## 5 | 6 | 7 | Fast SPI library for the ST7789 240x240 IPS display 8 | 9 | Significantly optimized for 16MHz **AVR Arduino boards** (2.5-5x faster than other libraries). 10 | 11 | Achieved 6.9Mbps SPI transfer rate (at DIV2/16MHz clock) 12 | 13 | In compatiliblity mode it **could** work with other MCUs, but I didn't test it. For STM32 (BluePill) there is separate optimized version here: https://github.com/cbm80amiga/Arduino_ST7789_STM 14 | 15 | YouTube video: 16 | 17 | https://youtu.be/GciLKcWQZK4 18 | 19 | YouTube playlist with all videos related to ST7789: 20 | 21 | https://www.youtube.com/playlist?list=PLxb1losWErZ7thUyB05phRR3DoiYN_kcD 22 | 23 | ## Recent optimizations 24 | 25 | After recent optimizations (more AVR assembler) all fill and copy operations work with max speed of about 7.1Mbps for 16MHz Arduino and the library flash memory usage is reduced by about 800-900 bytes 26 | 27 | ## Configuration 28 | 29 | Use "define COMPATIBILITY_MODE" - then the library should work on all Arduino compatible boards 30 | 31 | Remove above for the best performance on 16MHz AVR 32 | 33 | Use "#define CS_ALWAYS_LOW" for LCD boards where CS pin is internally connected to the ground, it gives better performance 34 | 35 | Tested with **Arduino IDE 1.6.5 and Adafruit_GFX 1.5.6** 36 | 37 | ## Extra Features 38 | - invertDisplay() 39 | - sleepDisplay() 40 | - enableDisplay() 41 | - idleDisplay() - saves power by limiting colors to 3 bit mode (8 colors) 42 | - resetDisplay() - software reset 43 | - partialDisplay() and setPartArea() - limiting display area for power saving 44 | - setScrollArea() and setScroll() - smooth vertical scrolling 45 | - fast drawImage() from RAM 46 | - fast drawImage() from flash (PROGMEM) 47 | 48 | ## Connections: 49 | 50 | |LCD pin|LCD pin name|Arduino| 51 | |--|--|--| 52 | |#01| GND| GND| 53 | |#02| VCC |VCC (3.3V only!)| 54 | |#03| SCL |D13/SCK| 55 | |#04| SDA|D11/MOSI| 56 | |#05| RES|D8 or any digital| 57 | |#06| DC|D7 or any digital| 58 | |#07| BLK | NC| 59 | 60 | 61 | If you find it useful and want to buy me a coffee or a beer: 62 | 63 | https://www.paypal.me/cbm80amiga 64 | -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- 1 | This is fast SPI library for the ST7789 IPS 240x240 SPI display. 2 | 3 | Optimized for the best performance for 16MHz AVR Arduino boards. 4 | Requires Adafruit_GFX library for Arduino. 5 | -------------------------------------------------------------------------------- /examples/ST7789_AdafruitBenchmark/ST7789_AdafruitBenchmark.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019-20 Pawel A. Hernik 3 | 4 | /* 5 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 6 | 7 | #01 GND -> GND 8 | #02 VCC -> VCC (3.3V only!) 9 | #03 SCL -> D13/SCK 10 | #04 SDA -> D11/MOSI 11 | #05 RES -> D8 or any digital 12 | #06 DC -> D7 or any digital 13 | #07 BLK -> NC 14 | */ 15 | 16 | #define SCR_WD 240 17 | #define SCR_HT 240 18 | #include 19 | #include 20 | 21 | #if (__STM32F1__) // bluepill 22 | #define TFT_DC PA1 23 | #define TFT_RST PA0 24 | //#include 25 | #else 26 | #define TFT_DC 7 27 | #define TFT_RST 8 28 | #include 29 | //#include 30 | #endif 31 | 32 | Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); 33 | 34 | // ------------------------------------------------ 35 | unsigned long FillScreenTest() 36 | { 37 | unsigned long start = millis(); 38 | for(int i=0;i<5;i++) { 39 | tft.fillScreen(RED); 40 | tft.fillScreen(GREEN); 41 | tft.fillScreen(BLUE); 42 | tft.fillScreen(YELLOW); 43 | } 44 | return millis()-start; 45 | } 46 | 47 | // ------------------------------------------------ 48 | unsigned long ClearScreenTest() 49 | { 50 | unsigned long start = millis(); 51 | for(int i=0;i<5*4;i++) 52 | tft.fillScreen(BLACK); 53 | return millis()-start; 54 | } 55 | 56 | // ------------------------------------------------ 57 | const uint16_t imgF[] PROGMEM = {0xF800,0xF840,0xF8A0,0xF900,0xF960,0xF9C0,0xFA20,0xFA80,0xFAE0,0xFB40,0xFBA0,0xFC00,0xFC60,0xFCC0,0xFD20,0xFD80,0xFDE0,0xFE40,0xFEA0,0xFF00,0xFF60,0xFFC0,0xFFE0,0xEFE0,0xE7E0,0xD7E0,0xCFE0,0xBFE0,0xB7E0,0xA7E0,0x9FE0,0x8FE0,0x87E0,0x77E0,0x6FE0,0x5FE0,0x57E0,0x47E0,0x3FE0,0x2FE0,0x27E0,0x17E0,0xFE0,0x7E0,0x7E1,0x7E3,0x7E4,0x7E6,0x7E7,0x7E9,0x7EA,0x7EC,0x7ED,0x7EF,0x7F0,0x7F2,0x7F3,0x7F5,0x7F6,0x7F8,0x7F9,0x7FB,0x7FC,0x7FE,0x7FF,0x79F,0x73F,0x6DF,0x67F,0x61F,0x5BF,0x55F,0x4FF,0x49F,0x43F,0x3DF,0x37F,0x31F,0x2BF,0x25F,0x1FF,0x19F,0x13F,0xDF,0x7F,0x1F,0x81F,0x101F,0x201F,0x281F,0x381F,0x401F,0x501F,0x581F,0x681F,0x701F,0x801F,0x881F,0x981F,0xA01F,0xB01F,0xB81F,0xC81F,0xD01F,0xE01F,0xE81F,0xF81F,0xF81F,0xF81D,0xF81C,0xF81A,0xF819,0xF817,0xF816,0xF814,0xF813,0xF811,0xF810,0xF80E,0xF80D,0xF80B,0xF80A,0xF808,0xF807,0xF805,0xF804,0xF802,0xF801, 58 | 0xF800,0xF840,0xF8A0,0xF900,0xF960,0xF9C0,0xFA20,0xFA80,0xFAE0,0xFB40,0xFBA0,0xFC00,0xFC60,0xFCC0,0xFD20,0xFD80,0xFDE0,0xFE40,0xFEA0,0xFF00,0xFF60,0xFFC0,0xFFE0,0xEFE0,0xE7E0,0xD7E0,0xCFE0,0xBFE0,0xB7E0,0xA7E0,0x9FE0,0x8FE0,0x87E0,0x77E0,0x6FE0,0x5FE0,0x57E0,0x47E0,0x3FE0,0x2FE0,0x27E0,0x17E0,0xFE0,0x7E0,0x7E1,0x7E3,0x7E4,0x7E6,0x7E7,0x7E9,0x7EA,0x7EC,0x7ED,0x7EF,0x7F0,0x7F2,0x7F3,0x7F5,0x7F6,0x7F8,0x7F9,0x7FB,0x7FC,0x7FE,0x7FF,0x79F,0x73F,0x6DF,0x67F,0x61F,0x5BF,0x55F,0x4FF,0x49F,0x43F,0x3DF,0x37F,0x31F,0x2BF,0x25F,0x1FF,0x19F,0x13F,0xDF,0x7F,0x1F,0x81F,0x101F,0x201F,0x281F,0x381F,0x401F,0x501F,0x581F,0x681F,0x701F,0x801F,0x881F,0x981F,0xA01F,0xB01F,0xB81F,0xC81F,0xD01F,0xE01F,0xE81F,0xF81F,0xF81F,0xF81D,0xF81C,0xF81A,0xF819,0xF817,0xF816,0xF814,0xF813,0xF811,0xF810,0xF80E,0xF80D,0xF80B,0xF80A,0xF808,0xF807,0xF805,0xF804,0xF802,0xF801}; 59 | uint16_t img[SCR_WD+16]; 60 | unsigned long DrawImageTest() 61 | { 62 | for(int i=0;i>2)+i)&0xf)); 65 | return millis()-start; 66 | } 67 | 68 | // ------------------------------------------------ 69 | unsigned long DrawImageFTest() 70 | { 71 | unsigned long start = millis(); 72 | for(int i=0;i<5*4;i++) for(int y=0;y>2)+i)&0xf)); 73 | return millis()-start; 74 | } 75 | // ------------------------------------------------ 76 | // original Adafruit 77 | unsigned long orig[14]={ 5872, 5872, 1468292,394696,2938532,132952,121996,4068208,925276,1319512, 1278096,1930524,602080,4649200 }; 78 | // pre 18.09.2020 Fast 79 | //unsigned long orig[14]={2645,3577,661616,114064,579036,56216,49500,1830864,222936,259340,175460,903348,138264,1853300}; 80 | 81 | unsigned long res[14]; 82 | void result(int i) 83 | { 84 | Serial.print(res[i]); 85 | if(res[i]<1000000) Serial.print("\t"); 86 | Serial.print("\t\t\t"); 87 | Serial.print(100*orig[i]/res[i]); 88 | Serial.println("%"); 89 | } 90 | 91 | void setup(void) 92 | { 93 | Serial.begin(9600); 94 | Serial.println(F("IPS 240x240 ST7789")); 95 | //tft.reset(); 96 | //tft.init(SCR_WD, SCR_HT); 97 | tft.begin(); 98 | tft.fillScreen(BLACK); 99 | tft.setCursor(0, 0); 100 | tft.setTextColor(WHITE); tft.setTextSize(2); 101 | tft.println("IPS 240x240 ST7789"); 102 | tft.println("Library Benchmark"); 103 | tft.println("starts in 3s ..."); 104 | delay(3000); 105 | 106 | Serial.println(F("Benchmark Time (microseconds)")); 107 | 108 | res[0]=FillScreenTest(); 109 | Serial.print(F("FillScreen Mbps ")); 110 | Serial.println(String(res[0])+"ms "+String(1000*20.0/res[0])+"fps "+String(20.0*SCR_WD*SCR_HT*16/res[0]/1000.0)+" Mbps\t"+100*orig[0]/res[0]+"%"); 111 | //for(int i=0;i<100;i++) tft.fillRect(i,i,SCR_WD-i*2,SCR_HT-i*2,tft.rgbWheel(i*10)); delay(1000); 112 | 113 | res[1]=ClearScreenTest(); 114 | Serial.print(F("ClearScreen Mbps ")); 115 | Serial.println(String(res[1])+"ms "+String(1000*20.0/res[1])+"fps "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%"); 116 | 117 | res[1]=DrawImageTest(); 118 | Serial.print(F("DrawImage Mbps ")); 119 | Serial.println(String(res[1])+"ms "+String(1000*20.0/res[1])+"fps "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%"); 120 | 121 | res[1]=DrawImageFTest(); 122 | Serial.print(F("DrawImageF Mbps ")); 123 | Serial.println(String(res[1])+"ms "+String(1000*20.0/res[1])+"fps "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%"); 124 | 125 | res[2]=testFillScreen(); 126 | Serial.print(F("Screen fill ")); 127 | result(2); 128 | delay(500); 129 | 130 | res[3]=testText(); 131 | Serial.print(F("Text ")); 132 | result(3); 133 | delay(3000); 134 | 135 | res[4]=testLines(CYAN); 136 | Serial.print(F("Lines ")); 137 | result(4); 138 | delay(500); 139 | 140 | res[5]=testFastLines(RED, BLUE); 141 | Serial.print(F("Horiz/Vert Lines ")); 142 | result(5); 143 | delay(500); 144 | 145 | res[6]=testRects(GREEN); 146 | Serial.print(F("Rectangles (outline) ")); 147 | result(6); 148 | delay(500); 149 | 150 | res[7]=testFilledRects(YELLOW, MAGENTA); 151 | Serial.print(F("Rectangles (filled) ")); 152 | result(7); 153 | delay(500); 154 | 155 | res[8]=testFilledCircles(10, MAGENTA); 156 | Serial.print(F("Circles (filled) ")); 157 | result(8); 158 | 159 | res[9]=testCircles(10, WHITE); 160 | Serial.print(F("Circles (outline) ")); 161 | result(9); 162 | delay(500); 163 | 164 | res[10]=testTriangles(); 165 | Serial.print(F("Triangles (outline) ")); 166 | result(10); 167 | delay(500); 168 | 169 | res[11]=testFilledTriangles(); 170 | Serial.print(F("Triangles (filled) ")); 171 | result(11); 172 | delay(500); 173 | 174 | res[12]=testRoundRects(); 175 | Serial.print(F("Rounded rects (outline) ")); 176 | result(12); 177 | delay(500); 178 | 179 | res[13]=testFilledRoundRects(); 180 | Serial.print(F("Rounded rects (filled) ")); 181 | result(13); 182 | delay(500); 183 | 184 | Serial.println(F("Done!")); 185 | Serial.println(F("Results:")); 186 | for(int i=0;i<14;i++) { Serial.print(res[i]); Serial.print(","); } 187 | Serial.println(); 188 | 189 | int c1=YELLOW, c2=WHITE; 190 | tft.fillScreen(BLACK); 191 | tft.setCursor(0, 0); 192 | tft.setTextSize(2); 193 | tft.setTextColor(CYAN); 194 | tft.println("RESULTS:"); 195 | 196 | tft.setTextSize(1); 197 | tft.println(); 198 | tft.setTextColor(GREEN); 199 | tft.println(F("Benchmark Time (us)")); 200 | tft.setTextColor(c1); tft.print(F("FillScreen Mbps ")); 201 | tft.setTextColor(c2); tft.println(String(res[0])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[0]/1000.0)+" Mbps"); 202 | //tft.setTextColor(c1); tft.print(F("ClearScreen Mbps ")); 203 | //tft.setTextColor(c2); tft.print(String(res[1])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps"); 204 | tft.setTextColor(c1); tft.print(F("DrawImageF Mbps ")); 205 | tft.setTextColor(c2); tft.println(String(res[1])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps"); 206 | 207 | tft.setTextColor(c1); tft.print(F("Screen fill ")); 208 | tft.setTextColor(c2); tft.println(res[3]); 209 | tft.setTextColor(c1); tft.print(F("Text ")); 210 | tft.setTextColor(c2); tft.println(res[4]); 211 | tft.setTextColor(c1); tft.print(F("Lines ")); 212 | tft.setTextColor(c2); tft.println(res[5]); 213 | tft.setTextColor(c1); tft.print(F("Horiz/Vert Lines ")); 214 | tft.setTextColor(c2); tft.println(res[6]); 215 | tft.setTextColor(c1); tft.print(F("Rectangles (outline) ")); 216 | tft.setTextColor(c2); tft.println(res[8]); 217 | tft.setTextColor(c1); tft.print(F("Rectangles (filled) ")); 218 | tft.setTextColor(c2); tft.println(res[9]); 219 | tft.setTextColor(c1); tft.print(F("Circles (filled) ")); 220 | tft.setTextColor(c2); tft.println(res[10]); 221 | tft.setTextColor(c1); tft.print(F("Circles (outline) ")); 222 | tft.setTextColor(c2); tft.println(res[11]); 223 | tft.setTextColor(c1); tft.print(F("Triangles (outline) ")); 224 | tft.setTextColor(c2); tft.println(res[12]); 225 | tft.setTextColor(c1); tft.print(F("Triangles (filled) ")); 226 | tft.setTextColor(c2); tft.println(res[13]); 227 | tft.setTextColor(c1); tft.print(F("Rounded rects (outline) ")); 228 | tft.setTextColor(c2); tft.println(res[14]); 229 | tft.setTextColor(c1); tft.print(F("Rounded rects (filled) ")); 230 | tft.setTextColor(c2); tft.println(res[15]); 231 | tft.setTextColor(RED); tft.println(F("Done!")); 232 | } 233 | 234 | /* 235 | Optimizations from 18.9.2020 236 | 237 | -- IPS 240x240 ST7789, back to old setAddrWindow() with writeSPI, flash: 28,550 238 | Benchmark Time (microseconds) 239 | FillScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 240 | ClearScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 241 | DrawImage Mbps 2740ms 7.30fps 6.73 Mbps 214% 242 | DrawImageF Mbps 3579ms 5.59fps 5.15 Mbps 164% 243 | Screen fill 652528 225% 244 | Text 109748 359% 245 | Lines 572992 512% 246 | Horiz/Vert Lines 54696 243% 247 | Rectangles (outline) 47916 254% 248 | Rectangles (filled) 1805552 225% 249 | Circles (filled) 208212 444% 250 | Circles (outline) 255744 515% 251 | Triangles (outline) 173468 736% 252 | Triangles (filled) 880160 219% 253 | Rounded rects (outline) 135920 442% 254 | Rounded rects (filled) 1819660 255% 255 | Done! 256 | Results: 257 | 2609,3579,652528,109748,572992,54696,47916,1805552,208212,255744,173468,880160,135920,1819660, 258 | 259 | 260 | -- IPS 240x240 ST7789 + back to old drawPixel, flash: 28,456 261 | Benchmark Time (microseconds) 262 | FillScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 263 | ClearScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 264 | DrawImage Mbps 2750ms 7.27fps 6.70 Mbps 213% 265 | DrawImageF Mbps 3588ms 5.57fps 5.14 Mbps 163% 266 | Screen fill 652540 225% 267 | Text 114004 346% 268 | Lines 609216 482% 269 | Horiz/Vert Lines 54884 242% 270 | Rectangles (outline) 48216 253% 271 | Rectangles (filled) 1805640 225% 272 | Circles (filled) 213896 432% 273 | Circles (outline) 272036 485% 274 | Triangles (outline) 184020 694% 275 | Triangles (filled) 885728 217% 276 | Rounded rects (outline) 142432 422% 277 | Rounded rects (filled) 1821976 255% 278 | Done! 279 | Results: 280 | 2609,3588,652540,114004,609216,54884,48216,1805640,213896,272036,184020,885728,142432,1821976, 281 | 282 | 283 | -- IPS 240x240 ST7789 - all previous + no _x/ystart in setAddrWindow(), flash: 28,462 284 | Benchmark Time (microseconds) 285 | FillScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 286 | ClearScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 287 | DrawImage Mbps 2749ms 7.28fps 6.70 Mbps 213% 288 | DrawImageF Mbps 3588ms 5.57fps 5.14 Mbps 163% 289 | Screen fill 652536 225% 290 | Text 115248 342% 291 | Lines 622492 472% 292 | Horiz/Vert Lines 54876 242% 293 | Rectangles (outline) 48216 253% 294 | Rectangles (filled) 1805608 225% 295 | Circles (filled) 213896 432% 296 | Circles (outline) 278020 474% 297 | Triangles (outline) 187872 680% 298 | Triangles (filled) 885744 217% 299 | Rounded rects (outline) 144708 416% 300 | Rounded rects (filled) 1821980 255% 301 | Done! 302 | Results: 303 | 2609,3588,652536,115248,622492,54876,48216,1805608,213896,278020,187872,885744,144708,1821980, 304 | 305 | -- IPS 240x240 ST7789 optimized write and copy, flash 28,506 306 | Benchmark Time (microseconds) 307 | FillScreen Mbps 2609ms 7.67fps 7.06 Mbps 225% 308 | ClearScreen Mbps 2608ms 7.67fps 7.07 Mbps 225% 309 | DrawImage Mbps 2751ms 7.27fps 6.70 Mbps 213% 310 | DrawImageF Mbps 3592ms 5.57fps 5.13 Mbps 163% 311 | Screen fill 652552 225% 312 | Text 117240 336% (---) 313 | Lines 639400 459% (---) 314 | Horiz/Vert Lines 54968 241% 315 | Rectangles (outline) 48364 252% 316 | Rectangles (filled) 1805680 225% 317 | Circles (filled) 216544 427% 318 | Circles (outline) 285624 461% 319 | Triangles (outline) 192788 662% 320 | Triangles (filled) 888328 217% 321 | Rounded rects (outline) 147748 407% (---) 322 | Rounded rects (filled) 1823064 255% 323 | Done! 324 | Results: 325 | 2609,3592,652552,117240,639400,54968,48364,1805680,216544,285624,192788,888328,147748,1823064, 326 | 327 | -- IPS 240x240 ST7789 Fast original before 18.9.20 changes, flash: 29,356 bytes 328 | Benchmark Time (microseconds) 329 | FillScreen Mbps 2645ms 7.56fps 6.97 Mbps 222% 330 | ClearScreen Mbps 2645ms 7.56fps 6.97 Mbps 222% 331 | DrawImage Mbps 3026ms 6.61fps 6.09 Mbps 194% 332 | DrawImageF Mbps 3577ms 5.59fps 5.15 Mbps 164% 333 | Screen fill 661616 221% 334 | Text 114064 346% 335 | Lines 579036 507% 336 | Horiz/Vert Lines 56216 236% 337 | Rectangles (outline) 49500 246% 338 | Rectangles (filled) 1830864 222% 339 | Circles (filled) 222936 415% 340 | Circles (outline) 259340 508% 341 | Triangles (outline) 175460 728% 342 | Triangles (filled) 903348 213% 343 | Rounded rects (outline) 138264 435% 344 | Rounded rects (filled) 1853300 250% 345 | Done! 346 | Results: 347 | 2645,3577,661616,114064,579036,56216,49500,1830864,222936,259340,175460,903348,138264,1853300, 348 | 349 | -- IPS 240x240 ST7789 in COMPATIBILITY mode 350 | Benchmark Time (microseconds) 351 | FillScreen Mbps 5361ms 3.73fps 3.44 Mbps 109% 352 | ClearScreen Mbps 5362ms 3.73fps 3.44 Mbps 109% 353 | DrawImage Mbps 5665ms 3.53fps 3.25 Mbps 103% 354 | DrawImageF Mbps 5706ms 3.51fps 3.23 Mbps 102% 355 | Screen fill 1340716 109% 356 | Text 244268 161% 357 | Lines 1652188 177% 358 | Horiz/Vert Lines 114840 115% 359 | Rectangles (outline) 101892 119% 360 | Rectangles (filled) 3711592 109% 361 | Circles (filled) 487852 189% 362 | Circles (outline) 741392 177% 363 | Triangles (outline) 494348 258% 364 | Triangles (filled) 1614292 119% 365 | Rounded rects (outline) 363292 165% 366 | Rounded rects (filled) 3761392 123% 367 | Done! 368 | Results: 369 | 5361,5706,1340716,244268,1652188,114840,101892,3711592,487852,741392,494348,1614292,363292,3761392, 370 | 371 | */ 372 | 373 | /* 374 | IPS ST7789 original: 375 | Benchmark Time (microseconds) 376 | FillScreen 5872ms 3.41fps 377 | ClearScreen 5872ms 3.41fps 378 | Screen fill 1468292 379 | Text 394696 380 | Lines 2938532 381 | Horiz/Vert Lines 132952 382 | Rectangles (outline) 121996 383 | Rectangles (filled) 4068208 384 | Circles (filled) 925276 385 | Circles (outline) 1319512 386 | Triangles (outline) 1278096 387 | Triangles (filled) 1930524 388 | Rounded rects (outline) 602080 389 | Rounded rects (filled) 4649200 390 | Done! 391 | 392 | 393 | IPS 240x240 ST7789 optimized - FINAL 394 | Benchmark Time (microseconds) 395 | FillScreen 2645ms 7.56fps 396 | ClearScreen 2645ms 7.56fps 397 | Screen fill 661488 398 | Text 108816 399 | Lines 563888 400 | Horiz/Vert Lines 56192 401 | Rectangles (outline) 49128 402 | Rectangles (filled) 1830804 403 | Circles (filled) 270728 404 | Circles (outline) 250940 405 | Triangles (outline) 245104 406 | Triangles (filled) 897880 407 | Rounded rects (outline) 135416 408 | Rounded rects (filled) 2030816 409 | Done! 410 | 411 | Fill speed: 412 | 240*240*2 = 115 200b *20 *8bit/2.645 ->6.9Mbps (!) 413 | 414 | 415 | IPS 240x240 ST7789 416 | Benchmark Time (microseconds) 417 | FillScreen Mbps 2645ms 7.56fps 6.97 Mbps 222% 418 | ClearScreen Mbps 2645ms 7.56fps 6.97 Mbps 222% 419 | Screen fill 661624 221% 420 | Text 109496 360% 421 | Lines 563888 521% 422 | Horiz/Vert Lines 56216 236% 423 | Rectangles (outline) 49168 248% 424 | Rectangles (filled) 1830880 222% 425 | Circles (filled) 271772 340% 426 | Circles (outline) 251000 525% 427 | Triangles (outline) 245104 521% 428 | Triangles (filled) 898632 214% 429 | Rounded rects (outline) 135368 444% 430 | Rounded rects (filled) 2031308 228% 431 | Done! 432 | 433 | */ 434 | // ------------------------------------------------ 435 | 436 | void loop(void) 437 | { 438 | } 439 | 440 | // ------------------------------------------------ 441 | 442 | unsigned long testFillScreen() { 443 | unsigned long start = micros(); 444 | tft.fillScreen(BLACK); 445 | tft.fillScreen(RED); 446 | tft.fillScreen(GREEN); 447 | tft.fillScreen(BLUE); 448 | tft.fillScreen(BLACK); 449 | return micros() - start; 450 | } 451 | 452 | // ------------------------------------------------ 453 | unsigned long testText() { 454 | tft.fillScreen(BLACK); 455 | unsigned long start = micros(); 456 | tft.setCursor(0, 0); 457 | tft.setTextColor(WHITE); tft.setTextSize(1); 458 | tft.println("Hello World!"); 459 | tft.setTextColor(YELLOW); tft.setTextSize(2); 460 | tft.println(1234.56); 461 | tft.setTextColor(RED); tft.setTextSize(3); 462 | tft.println(0xDEADBEEF, HEX); 463 | tft.println(); 464 | tft.setTextColor(GREEN); 465 | tft.setTextSize(5); 466 | tft.println("Groop"); 467 | tft.setTextSize(2); 468 | tft.println("I implore thee,"); 469 | tft.setTextSize(1); 470 | tft.println("my foonting turlingdromes."); 471 | tft.println("And hooptiously drangle me"); 472 | tft.println("with crinkly bindlewurdles,"); 473 | tft.println("Or I will rend thee"); 474 | tft.println("in the gobberwarts"); 475 | tft.println("with my blurglecruncheon,"); 476 | tft.println("see if I don't!"); 477 | return micros() - start; 478 | } 479 | 480 | // ------------------------------------------------ 481 | unsigned long testLines(uint16_t color) { 482 | unsigned long start, t; 483 | int x1, y1, x2, y2, 484 | w = tft.width(), 485 | h = tft.height(); 486 | 487 | tft.fillScreen(BLACK); 488 | 489 | x1 = y1 = 0; 490 | y2 = h - 1; 491 | start = micros(); 492 | for(x2=0; x20; i-=6) { 573 | i2 = i / 2; 574 | start = micros(); 575 | tft.fillRect(cx-i2, cy-i2, i, i, color1); 576 | t += micros() - start; 577 | // Outlines are not included in timing results 578 | tft.drawRect(cx-i2, cy-i2, i, i, color2); 579 | } 580 | 581 | return t; 582 | } 583 | 584 | // ------------------------------------------------ 585 | unsigned long testFilledCircles(uint8_t radius, uint16_t color) { 586 | unsigned long start; 587 | int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; 588 | 589 | tft.fillScreen(BLACK); 590 | start = micros(); 591 | for(x=radius; x10; i-=5) { 648 | start = micros(); 649 | tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, 650 | tft.color565(0, i, i)); 651 | t += micros() - start; 652 | tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, 653 | tft.color565(i, i, 0)); 654 | } 655 | 656 | return t; 657 | } 658 | 659 | // ------------------------------------------------ 660 | unsigned long testRoundRects() { 661 | unsigned long start; 662 | int w, i, i2, 663 | cx = tft.width() / 2 - 1, 664 | cy = tft.height() / 2 - 1; 665 | 666 | tft.fillScreen(BLACK); 667 | w = min(tft.width(), tft.height()); 668 | start = micros(); 669 | for(i=0; i20; i-=6) { 687 | i2 = i / 2; 688 | tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); 689 | } 690 | 691 | return micros() - start; 692 | } 693 | // ------------------------------------------------ 694 | 695 | -------------------------------------------------------------------------------- /examples/ST7789_AmigaBall/ST7789_AmigaBall.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // Amiga Boing Ball Demo 3 | // (c) 2019-20 Pawel A. Hernik 4 | // YT video: https://youtu.be/KwtkfmglT-c 5 | 6 | /* 7 | ILI9341 240x320 2.2" LCD pinout (header at the top, from left): 8 | #1 MISO -> NC 9 | #2 LED -> 3.3V 10 | #3 SCK -> SCL/D13/PA5 11 | #4 SDI -> MOSI/D11/PA7 12 | #5 DC -> D8/PA1 or any digital 13 | #6 RESET -> D9/PA0 or any digital 14 | #7 CS -> D10/PA2 or any digital 15 | #8 GND -> GND 16 | #9 VCC -> 3.3V 17 | */ 18 | 19 | /* 20 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 21 | 22 | #01 GND -> GND 23 | #02 VCC -> VCC (3.3V only!) 24 | #03 SCL -> D13/PA5/SCK 25 | #04 SDA -> D11/PA7/MOSI 26 | #05 RES -> D9 /PA0 or any digital 27 | #06 DC -> D10/PA1 or any digital 28 | #07 BLK -> NC 29 | */ 30 | 31 | #include 32 | #include 33 | #if (__STM32F1__) // bluepill 34 | #define TFT_DC PA1 35 | #define TFT_RST PA0 36 | #define BUTTON PB9 37 | //#include 38 | #else 39 | #define TFT_DC 7 40 | #define TFT_RST 8 41 | #define BUTTON 3 42 | #include 43 | #endif 44 | 45 | #define SCR_WD 240 46 | #define SCR_HT 240 47 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 48 | 49 | #include "ball.h" 50 | 51 | uint16_t palette[16]; 52 | uint16_t line[SCR_WD]; 53 | uint16_t bgCol = RGBto565(160,160,160); 54 | uint16_t bgColS = RGBto565(100,100,100); 55 | uint16_t lineCol = RGBto565(150,40,150); 56 | uint16_t lineColS = RGBto565(90,20,90); 57 | 58 | #define LINE_YS 20 59 | #define LINE_XS1 30 60 | #define LINE_XS2 6 61 | 62 | #define BALL_WD 64 63 | #define BALL_HT 64 64 | #define BALL_SWD 240 65 | #define BALL_SHT 180 66 | 67 | #define SP 20 68 | 69 | #define SHADOW 20 70 | //#define SHADOW 0 71 | 72 | // AVR stats: 73 | // with shadow - 60-61ms/17fps 74 | // without shadow - 55-56ms/18fps 75 | 76 | void drawBall(int x, int y) 77 | { 78 | int i,j,ii; 79 | for(j=0;jLINE_YS) for(i=0;i<10;i++) line[LINE_XS1+i*SP]=lineCol; 90 | } 91 | for(i=BALL_WD-2;i>=0;i-=2) { 92 | v = pgm_read_byte(--img); 93 | if(v>>4) { 94 | line[x+i+0] = palette[v>>4]; 95 | #if SHADOW>0 96 | ii=x+i+0+SHADOW; 97 | if(ii0 103 | ii=x+i+1+SHADOW; 104 | if(ii=BALL_SWD-BALL_WD) { x=BALL_SWD-BALL_WD; xd=-xd; animd=-animd; } 155 | if(y<0) { y=0; yd=-yd; } 156 | if(y>=BALL_SHT-BALL_HT) { y=BALL_SHT-BALL_HT; yd=-yd; } 157 | //ms=millis()-ms; Serial.println(ms); 158 | } 159 | 160 | -------------------------------------------------------------------------------- /examples/ST7789_AmigaBall/ball.h: -------------------------------------------------------------------------------- 1 | // Generated by bmp2src by Pawel A. Hernik 2 | // Generated from: ball.bmp 3 | // Dimensions : 64x64x4 (16 colors) 4 | // Size : 2048 [0x0800] bytes 5 | 6 | 7 | const unsigned char ball[2048+16*2+6] PROGMEM = { 8 | 64,0,64,0,4,0, // width,height,bits 9 | 0x10,0x84, // c000->130,130,130 10 | 0x00,0xf8, // c001->255, 0, 0 11 | 0x00,0xf8, // c002->255, 0, 0 12 | 0x00,0xf8, // c003->255, 0, 0 13 | 0x00,0xf8, // c004->255, 0, 0 14 | 0x00,0xf8, // c005->255, 0, 0 15 | 0x00,0xf8, // c006->255, 0, 0 16 | 0x00,0xf8, // c007->255, 0, 0 17 | 0xff,0xff, // c008->255,255,255 18 | 0xff,0xff, // c009->255,255,255 19 | 0xff,0xff, // c010->255,255,255 20 | 0xff,0xff, // c011->255,255,255 21 | 0xff,0xff, // c012->255,255,255 22 | 0xff,0xff, // c013->255,255,255 23 | 0xff,0xff, // c014->255,255,255 24 | 0xff,0xff, // c015->255,255,255 25 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 26 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 27 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 28 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 29 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x1e,0xed,0xdc, 30 | 0xcc,0xbb,0xbc,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 31 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x87,0x76,0xcc,0xbb,0xaa, 32 | 0x99,0x88,0x87,0x7e,0xe1,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 33 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x87,0x65,0x54,0x43,0xa9,0x88, 34 | 0x87,0x76,0x65,0x55,0x4b,0xaa,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 35 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x87,0x65,0x54,0x43,0x32,0x11,0x77, 36 | 0x66,0x55,0x54,0x43,0x21,0x87,0x65,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 37 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x87,0x66,0x54,0x43,0x32,0x11,0xee,0xd6, 38 | 0x55,0x54,0x43,0x32,0x1e,0xed,0x55,0x42,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 39 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x76,0x55,0x43,0x32,0x11,0x1e,0xed,0xdc, 40 | 0xc4,0x43,0x32,0x11,0xee,0xdc,0xcc,0x32,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 41 | 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xed,0x65,0x44,0x33,0x21,0x1e,0xed,0xdc,0xcc, 42 | 0xbb,0xa3,0x21,0x1e,0xed,0xcc,0xcb,0xa2,0xec,0x93,0x00,0x00,0x00,0x00,0x00,0x00, 43 | 0x00,0x00,0x00,0x00,0x00,0x03,0x1e,0xdd,0xc4,0x43,0x22,0x11,0xee,0xdd,0xcc,0xbb, 44 | 0xaa,0xa9,0x11,0xee,0xdd,0xcc,0xba,0x98,0x75,0x48,0x30,0x00,0x00,0x00,0x00,0x00, 45 | 0x00,0x00,0x00,0x00,0x00,0x31,0xed,0xcc,0xbb,0xa2,0x21,0x1e,0xed,0xdc,0xcb,0xba, 46 | 0xaa,0x98,0x87,0x7d,0xdc,0xcc,0xba,0x98,0x76,0x43,0xe2,0x00,0x00,0x00,0x00,0x00, 47 | 0x00,0x00,0x00,0x00,0x04,0x1e,0xdc,0xcb,0xaa,0x98,0x1e,0xee,0xdd,0xcc,0xbb,0xaa, 48 | 0xa9,0x88,0x77,0x66,0xcc,0xcb,0xaa,0x98,0x76,0x53,0x1d,0x80,0x00,0x00,0x00,0x00, 49 | 0x00,0x00,0x00,0x00,0x42,0xed,0xcc,0xba,0xa9,0x88,0x77,0xed,0xdc,0xcb,0xba,0xaa, 50 | 0x98,0x87,0x76,0x66,0x5c,0xbb,0xa9,0x98,0x76,0x54,0x2e,0xb6,0x00,0x00,0x00,0x00, 51 | 0x00,0x00,0x00,0x00,0x21,0xdd,0xcb,0xba,0x99,0x88,0x77,0x66,0xcc,0xbb,0xaa,0xa9, 52 | 0x88,0x87,0x76,0x65,0x55,0x4a,0xa9,0x98,0x76,0x54,0x31,0xda,0x00,0x00,0x00,0x00, 53 | 0x00,0x00,0x00,0x03,0x1e,0xdc,0xbb,0xa9,0x98,0x87,0x76,0x65,0x54,0xbb,0xaa,0x98, 54 | 0x88,0x77,0x66,0x55,0x54,0x43,0x32,0x88,0x76,0x54,0x32,0xec,0x90,0x00,0x00,0x00, 55 | 0x00,0x00,0x00,0x31,0xed,0xcb,0xba,0xa9,0x88,0x77,0x66,0x55,0x44,0x4a,0xa9,0x98, 56 | 0x87,0x76,0x66,0x55,0x54,0x33,0x22,0x17,0x66,0x54,0x32,0x1d,0xa7,0x00,0x00,0x00, 57 | 0x00,0x00,0x00,0x2e,0xdc,0xcb,0xaa,0x98,0x87,0x76,0x65,0x55,0x44,0x33,0x29,0x88, 58 | 0x77,0x76,0x65,0x55,0x44,0x33,0x21,0x1e,0xd6,0x54,0x32,0x1d,0xb9,0x00,0x00,0x00, 59 | 0x00,0x00,0x0a,0x87,0xdc,0xbb,0xa9,0x88,0x77,0x66,0x65,0x54,0x43,0x33,0x21,0x18, 60 | 0x77,0x66,0x55,0x54,0x43,0x32,0x21,0x1e,0xdc,0xc4,0x32,0x1d,0xca,0x70,0x00,0x00, 61 | 0x00,0x00,0xc9,0x76,0x54,0xba,0xa9,0x88,0x77,0x66,0x55,0x44,0x33,0x32,0x11,0x1e, 62 | 0x76,0x66,0x55,0x54,0x43,0x32,0x21,0x1e,0xdc,0xcb,0xa2,0x1e,0xcb,0x94,0x00,0x00, 63 | 0x00,0x00,0xa8,0x76,0x54,0x3a,0x98,0x87,0x76,0x65,0x54,0x44,0x33,0x22,0x11,0xee, 64 | 0xed,0xd5,0x55,0x44,0x33,0x22,0x11,0xed,0xdc,0xcb,0xa9,0x87,0xdb,0xa6,0x00,0x00, 65 | 0x00,0x00,0x97,0x65,0x44,0x32,0x98,0x77,0x66,0x55,0x54,0x43,0x32,0x21,0x11,0xee, 66 | 0xdd,0xcc,0x55,0x44,0x33,0x22,0x11,0xed,0xdc,0xbb,0xa9,0x87,0x6c,0xa8,0x00,0x00, 67 | 0x00,0x0a,0x87,0x65,0x43,0x32,0x11,0xe7,0x66,0x55,0x44,0x33,0x32,0x11,0x1e,0xed, 68 | 0xdd,0xcc,0xcb,0x43,0x32,0x22,0x11,0xed,0xdc,0xbb,0xa9,0x87,0x65,0x42,0x50,0x00, 69 | 0x00,0x0a,0x86,0x55,0x43,0x21,0x1e,0xed,0x65,0x55,0x44,0x33,0x22,0x11,0xee,0xed, 70 | 0xdc,0xcc,0xbb,0xba,0x32,0x21,0x1e,0xdd,0xcc,0xbb,0xa9,0x87,0x65,0x42,0xe0,0x00, 71 | 0x00,0x09,0x76,0x54,0x33,0x21,0x1e,0xed,0xdc,0x54,0x43,0x33,0x21,0x11,0xee,0xdd, 72 | 0xdc,0xcc,0xbb,0xaa,0x99,0x21,0x1e,0xdd,0xcc,0xba,0xa9,0x87,0x65,0x43,0x10,0x00, 73 | 0x00,0xb8,0x76,0x54,0x32,0x21,0xee,0xdd,0xcc,0xb4,0x43,0x32,0x21,0x1e,0xee,0xdd, 74 | 0xcc,0xcb,0xbb,0xaa,0x99,0x88,0xee,0xdd,0xcc,0xba,0xa9,0x87,0x65,0x43,0x1c,0x00, 75 | 0x00,0xa8,0x65,0x44,0x32,0x11,0xee,0xdd,0xcc,0xbb,0xa3,0x22,0x11,0x1e,0xed,0xdd, 76 | 0xcc,0xcb,0xba,0xa9,0x99,0x88,0x7d,0xdc,0xcb,0xba,0xa9,0x87,0x65,0x43,0x1d,0x00, 77 | 0x00,0x97,0x65,0x43,0x32,0x1e,0xed,0xdc,0xcb,0xbb,0xaa,0x98,0x11,0xee,0xdd,0xdc, 78 | 0xcc,0xbb,0xaa,0xa9,0x98,0x88,0x76,0x65,0xcb,0xba,0x99,0x87,0x65,0x43,0x2d,0x00, 79 | 0x00,0x97,0x65,0x43,0x21,0x1e,0xed,0xdc,0xcb,0xba,0xa9,0x98,0x87,0xee,0xdd,0xcc, 80 | 0xcc,0xbb,0xaa,0x99,0x98,0x87,0x76,0x65,0x5b,0xba,0x99,0x87,0x65,0x43,0x2d,0x00, 81 | 0x00,0x17,0x65,0x43,0x21,0x1e,0xdd,0xcc,0xbb,0xba,0xa9,0x88,0x87,0x76,0xdd,0xcc, 82 | 0xcb,0xba,0xaa,0x99,0x88,0x87,0x66,0x55,0x44,0x3a,0x99,0x87,0x65,0x43,0x2e,0x00, 83 | 0x00,0x1e,0x54,0x43,0x21,0xee,0xdd,0xcc,0xbb,0xaa,0x99,0x88,0x77,0x76,0xdc,0xcc, 84 | 0xcb,0xba,0xa9,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x28,0x87,0x65,0x43,0x2e,0x00, 85 | 0x00,0x1d,0xcb,0x33,0x21,0xee,0xdd,0xcc,0xbb,0xaa,0x98,0x88,0x77,0x66,0x65,0x5c, 86 | 0xbb,0xaa,0xa9,0x98,0x88,0x76,0x66,0x55,0x44,0x32,0x21,0x17,0x65,0x43,0x2e,0x00, 87 | 0x00,0x1d,0xcb,0xa9,0x11,0xed,0xdc,0xcb,0xba,0xa9,0x98,0x87,0x77,0x66,0x55,0x54, 88 | 0xbb,0xaa,0x99,0x98,0x87,0x76,0x65,0x54,0x43,0x32,0x21,0xed,0xd5,0x43,0x2e,0x00, 89 | 0x00,0x1d,0xcb,0xa9,0x81,0xed,0xdc,0xcb,0xba,0xa9,0x88,0x87,0x76,0x66,0x55,0x54, 90 | 0x43,0xaa,0x99,0x88,0x87,0x66,0x65,0x54,0x43,0x32,0x21,0xed,0xdc,0xb3,0x2e,0x00, 91 | 0x00,0x1d,0xcb,0xa9,0x87,0x76,0xdc,0xbb,0xaa,0xa9,0x88,0x77,0x76,0x65,0x55,0x44, 92 | 0x43,0x32,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0xed,0xcc,0xba,0x9e,0x00, 93 | 0x00,0x1d,0xcb,0xa9,0x87,0x76,0x55,0xbb,0xaa,0x99,0x88,0x77,0x66,0x65,0x55,0x44, 94 | 0x33,0x32,0x21,0x88,0x76,0x66,0x55,0x44,0x33,0x22,0x11,0xed,0xcb,0xba,0x86,0x00, 95 | 0x00,0x1d,0xcb,0xa9,0x87,0x66,0x55,0x4b,0xaa,0x98,0x87,0x77,0x66,0x55,0x54,0x44, 96 | 0x33,0x22,0x21,0x1e,0x76,0x65,0x54,0x44,0x33,0x22,0x1e,0xdd,0xcb,0xa9,0x86,0x00, 97 | 0x00,0x1d,0xcb,0xa9,0x87,0x66,0x54,0x43,0x39,0x98,0x87,0x76,0x66,0x55,0x54,0x43, 98 | 0x33,0x22,0x11,0x1e,0xdd,0x65,0x54,0x43,0x32,0x21,0x1e,0xdd,0xcb,0xa9,0x86,0x00, 99 | 0x00,0x2d,0xcb,0xa8,0x87,0x66,0x54,0x43,0x32,0x18,0x77,0x76,0x65,0x55,0x44,0x33, 100 | 0x32,0x22,0x11,0xee,0xdd,0xcc,0x44,0x43,0x32,0x21,0x1e,0xdc,0xcb,0xa9,0x86,0x00, 101 | 0x00,0x2e,0xcb,0xa8,0x87,0x65,0x54,0x43,0x32,0x11,0x77,0x66,0x65,0x55,0x44,0x33, 102 | 0x22,0x21,0x11,0xed,0xdd,0xcc,0xb4,0x33,0x22,0x11,0xed,0xdc,0xbb,0xa9,0x75,0x00, 103 | 0x00,0x3e,0xcb,0xa8,0x87,0x65,0x54,0x33,0x22,0x11,0xee,0x66,0x55,0x54,0x43,0x33, 104 | 0x22,0x11,0x1e,0xed,0xdc,0xcb,0xbb,0xa3,0x22,0x11,0xed,0xcc,0xba,0x98,0x74,0x00, 105 | 0x00,0x0e,0xcb,0xa8,0x87,0x65,0x54,0x33,0x21,0x1e,0xed,0xdd,0xc5,0x54,0x43,0x32, 106 | 0x22,0x11,0xee,0xdd,0xcc,0xcb,0xba,0xa9,0x91,0x1e,0xdd,0xcc,0xba,0x98,0x60,0x00, 107 | 0x00,0x08,0x6b,0xa9,0x87,0x65,0x44,0x33,0x21,0x1e,0xed,0xdc,0xcc,0x44,0x33,0x32, 108 | 0x21,0x11,0xed,0xdd,0xcc,0xbb,0xba,0xa9,0x98,0x8e,0xdd,0xcb,0xaa,0x98,0x60,0x00, 109 | 0x00,0x0a,0x64,0x39,0x87,0x65,0x44,0x32,0x21,0xee,0xdd,0xdc,0xcc,0xbb,0x33,0x22, 110 | 0x21,0x1e,0xed,0xdc,0xcc,0xbb,0xaa,0x99,0x88,0x76,0x6c,0xcb,0xa9,0x87,0x50,0x00, 111 | 0x00,0x00,0x75,0x32,0x87,0x65,0x44,0x32,0x11,0xee,0xdd,0xcc,0xcb,0xba,0xa2,0x22, 112 | 0x11,0xee,0xdd,0xcc,0xcb,0xba,0xaa,0x99,0x88,0x76,0x65,0x4b,0xa9,0x86,0x00,0x00, 113 | 0x00,0x00,0x85,0x42,0x1e,0x65,0x43,0x32,0x11,0xee,0xdd,0xcc,0xcb,0xba,0xa9,0x91, 114 | 0x11,0xed,0xdd,0xcc,0xbb,0xba,0xa9,0x98,0x87,0x66,0x55,0x43,0x98,0x75,0x00,0x00, 115 | 0x00,0x00,0xc6,0x43,0x1e,0xdc,0xb3,0x32,0x1e,0xed,0xdc,0xcc,0xbb,0xaa,0x99,0x98, 116 | 0x8e,0xed,0xdc,0xcc,0xbb,0xaa,0x99,0x88,0x77,0x65,0x54,0x33,0x21,0x63,0x00,0x00, 117 | 0x00,0x00,0x08,0x53,0x1e,0xdc,0xba,0x32,0x1e,0xed,0xdc,0xcc,0xba,0xaa,0x99,0x88, 118 | 0x77,0x66,0xcc,0xcb,0xba,0xa9,0x99,0x88,0x76,0x65,0x44,0x32,0x1e,0xc0,0x00,0x00, 119 | 0x00,0x00,0x00,0x64,0x2e,0xdc,0xba,0x98,0x1e,0xdd,0xcc,0xcb,0xba,0xa9,0x98,0x88, 120 | 0x76,0x66,0x5c,0xbb,0xaa,0xa9,0x98,0x87,0x66,0x55,0x43,0x32,0x1d,0x00,0x00,0x00, 121 | 0x00,0x00,0x00,0x85,0x21,0xdc,0xba,0x98,0x87,0xdd,0xcc,0xcb,0xaa,0x99,0x98,0x87, 122 | 0x76,0x65,0x54,0x4b,0xaa,0x99,0x88,0x77,0x65,0x54,0x43,0x21,0xec,0x00,0x00,0x00, 123 | 0x00,0x00,0x00,0x06,0x31,0xdc,0xba,0x98,0x77,0x65,0xcc,0xbb,0xaa,0x99,0x88,0x77, 124 | 0x66,0x55,0x44,0x43,0x39,0x98,0x87,0x76,0x65,0x44,0x32,0x1e,0xc0,0x00,0x00,0x00, 125 | 0x00,0x00,0x00,0x00,0x52,0xec,0xba,0x98,0x77,0x65,0x55,0xba,0xa9,0x98,0x87,0x76, 126 | 0x65,0x55,0x44,0x33,0x22,0x88,0x77,0x66,0x54,0x43,0x21,0x1d,0x00,0x00,0x00,0x00, 127 | 0x00,0x00,0x00,0x00,0x14,0x1d,0xba,0x98,0x76,0x65,0x54,0x43,0x99,0x98,0x87,0x66, 128 | 0x55,0x54,0x43,0x32,0x21,0x11,0x76,0x65,0x54,0x33,0x21,0xdb,0x00,0x00,0x00,0x00, 129 | 0x00,0x00,0x00,0x00,0x0e,0x9e,0xca,0x98,0x76,0x55,0x54,0x33,0x29,0x88,0x76,0x65, 130 | 0x55,0x44,0x33,0x22,0x11,0x1e,0xdd,0x55,0x43,0x32,0x1d,0xc0,0x00,0x00,0x00,0x00, 131 | 0x00,0x00,0x00,0x00,0x00,0xd8,0xcb,0x98,0x76,0x55,0x43,0x32,0x21,0x17,0x66,0x55, 132 | 0x54,0x43,0x32,0x21,0x1e,0xed,0xdc,0xcb,0x33,0x21,0xdc,0x00,0x00,0x00,0x00,0x00, 133 | 0x00,0x00,0x00,0x00,0x00,0x0c,0x74,0xa8,0x75,0x55,0x43,0x22,0x11,0xed,0xd5,0x55, 134 | 0x44,0x33,0x22,0x11,0xee,0xdd,0xcb,0xba,0x99,0x1d,0xc0,0x00,0x00,0x00,0x00,0x00, 135 | 0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x31,0xdc,0x54,0x33,0x21,0x1e,0xdd,0xcc,0xb4, 136 | 0x33,0x32,0x21,0x1e,0xdd,0xcc,0xbb,0xa9,0x98,0x64,0x00,0x00,0x00,0x00,0x00,0x00, 137 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0xdc,0xc4,0x32,0x11,0xed,0xdc,0xcb,0xba, 138 | 0x32,0x21,0x11,0xed,0xdc,0xcb,0xaa,0x98,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 139 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xdc,0xba,0x21,0x1e,0xdc,0xcb,0xba,0xaa, 140 | 0x99,0x11,0xed,0xdc,0xcb,0xba,0x99,0x86,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 141 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0xa9,0x87,0xdd,0xcb,0xba,0xaa,0x99, 142 | 0x88,0x76,0xdc,0xcb,0xba,0xa9,0x87,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 143 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x55,0x44,0xaa,0xa9,0x98,0x87, 144 | 0x76,0x65,0x54,0xba,0x99,0x87,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 145 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0xe1,0x18,0x87,0x76,0x66, 146 | 0x55,0x44,0x33,0x21,0x86,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 147 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0xa4,0x44,0x33, 148 | 0x32,0x22,0x1e,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 149 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a, 150 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 151 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 152 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 153 | }; 154 | -------------------------------------------------------------------------------- /examples/ST7789_BMPviaSerial/ST7789_BMPviaSerial.ino: -------------------------------------------------------------------------------- 1 | // Photo slideshow via serial port 2 | // ST7789 & RRE library example 3 | // (c) 2019 Pawel A. Hernik 4 | // YT video: https://youtu.be/vQY5ILjSZBc 5 | 6 | /* 7 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 8 | 9 | #01 GND -> GND 10 | #02 VCC -> VCC (3.3V only!) 11 | #03 SCL -> D13/SCK 12 | #04 SDA -> D11/MOSI 13 | #05 RES -> D8 or any digital 14 | #06 DC -> D7 or any digital 15 | #07 BLK -> NC 16 | */ 17 | 18 | #define TFT_DC 7 19 | #define TFT_RST 8 20 | #define SCR_WD 240 21 | #define SCR_HT 240 // 320 - to allow access to full 240x320 frame buffer 22 | #include 23 | #include 24 | #include 25 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 26 | 27 | void setup() 28 | { 29 | Serial.begin(115200); 30 | lcd.init(SCR_WD, SCR_HT); 31 | lcd.fillScreen(BLACK); 32 | lcd.drawRect(0,0,240,240,RED); 33 | lcd.setTextColor(WHITE); 34 | lcd.setTextSize(2); 35 | lcd.setCursor(24,110); 36 | lcd.println("WAITING FOR DATA"); 37 | lcd.setTextColor(BLACK,WHITE); 38 | } 39 | 40 | int cnt=0; 41 | int i=0,j=239; 42 | uint8_t r,g,b,c; 43 | int header=54; 44 | unsigned long ms; 45 | char buf[30]; 46 | 47 | void loop() 48 | { 49 | while(Serial.available()) { 50 | c = Serial.read(); 51 | if(header>0) { 52 | header--; 53 | if(header==0) ms=millis(); 54 | continue; 55 | } 56 | if(cnt==0) 57 | b = c; 58 | else if(cnt==1) 59 | g = c; 60 | else if(cnt==2) { 61 | r = c; 62 | cnt=-1; 63 | lcd.drawPixel(i,j,RGBto565(r,g,b)); 64 | i++; 65 | if(i>=240) { 66 | i=0; j--; 67 | if(j<0) { 68 | j=239; 69 | header=54; 70 | snprintf(buf,30," Time: %d s ",(millis()-ms)/1000); 71 | lcd.setCursor(50,200); 72 | lcd.println(buf); 73 | } 74 | } 75 | } 76 | cnt++; 77 | } 78 | } 79 | 80 | -------------------------------------------------------------------------------- /examples/ST7789_BigScroll/ST7789_BigScroll.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019 Pawel A. Hernik 3 | 4 | // requires RRE Font library: 5 | // https://github.com/cbm80amiga/RREFont 6 | 7 | /* 8 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 9 | 10 | #01 GND -> GND 11 | #02 VCC -> VCC (3.3V only!) 12 | #03 SCL -> D13/SCK 13 | #04 SDA -> D11/MOSI 14 | #05 RES -> D8 or any digital 15 | #06 DC -> D7 or any digital 16 | #07 BLK -> NC 17 | */ 18 | 19 | #define TFT_DC 7 20 | #define TFT_RST 8 21 | #define SCR_WD 240 22 | #define SCR_HT 320 // 320 - to access to full 240x320 frame buffer 23 | #include 24 | #include 25 | #include 26 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 27 | 28 | #include "RREFont.h" 29 | #include "rre_times_98v.h" 30 | #include "rre_tahoma_65v.h" 31 | 32 | RRE_Font *rFont = &rre_Times98v; 33 | //RRE_Font *rFont = &rre_tahoma_65v; 34 | 35 | uint16_t bg = 0x0000, fg = 0xffff; 36 | int maxy = 320; // internal ST7789 fb is 240x320 37 | int screenWd = 240, screenHt = 240; 38 | int spacing = 1; 39 | int sx = 1, sy = 1; 40 | int scrollStep = 2; 41 | int scrollDelay = 10; 42 | int cnt = 0; 43 | int ycnt = 0, yscr = 0; 44 | int offsY = 30; 45 | unsigned long ms; 46 | 47 | 48 | int scrollCharRRE(unsigned char c) 49 | { 50 | if(cfirstCh || c>rFont->lastCh) return 0; 51 | uint16_t recIdx = pgm_read_word(&(rFont->offs[c-rFont->firstCh])); 52 | uint16_t recNum = pgm_read_word(&(rFont->offs[c-rFont->firstCh+1]))-recIdx; 53 | int chWd = recNum>0 ? pgm_read_byte(rFont->rects + (recNum-1+recIdx)*3)+1 : 0; 54 | //Serial.println(String(char(c))+": "+chWd); 55 | spacing = (c==' ') ? rFont->wd/3 : 4; 56 | int idx = recIdx*3; 57 | for(int col = 0; col=maxy) yscr-=maxy; 61 | lcd.setScroll(yscr); 62 | ycnt=yscr+240; 63 | if(ycnt>=maxy) ycnt-=maxy; 64 | //Serial.println(String("ycnt=")+ycnt); 65 | int scrHOffs = screenHt-1; 66 | int scrWOffs = screenWd-1; 67 | int lineY = scrHOffs-(screenHt-sx-ycnt); 68 | int wd; 69 | if(col>=chWd) { // draw empty column (spacing) 70 | wd = sy*rFont->ht; 71 | lcd.fillRect(scrWOffs-offsY-wd, lineY, wd, sx, bg); 72 | while(millis()-msrects+idx+0); 76 | int ybg = 0; 77 | //yf = pgm_read_byte(font_Rects+idx+1); Serial.print("yf="); Serial.println(yf); 78 | while(xf==col) { // draw all lines for current column 79 | yf = pgm_read_byte(rFont->rects+idx+1); 80 | hf = pgm_read_byte(rFont->rects+idx+2); 81 | if(yf>0) { // bg line top 82 | wd = (yf-ybg)*sy; 83 | lcd.fillRect(scrWOffs-(offsY+ybg*sy)-wd, lineY, wd, sx, bg); 84 | } 85 | ybg = yf+hf; 86 | wd = hf*sy; 87 | lcd.fillRect(scrWOffs-(offsY+yf*sy)-wd, lineY, wd, sx, fg); 88 | idx+=3; 89 | xf = pgm_read_byte(rFont->rects+idx+0); 90 | } 91 | //Serial.println("ys = "+String(ys)+" "+String(charHt)); 92 | 93 | if(ybght-1) { // last bg line 94 | wd = (rFont->ht-ybg)*sy; 95 | lcd.fillRect(scrWOffs-(offsY+ybg*sy)-wd, lineY, wd, sx, bg); 96 | } 97 | while(millis()-msht*sy)/2; 124 | //scrollString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-!?.: "); 125 | scrollString("This is an example of super-smooth scrolling with ordinary Arduino, ST7789 240x240 IPS LCD library and large 97x98 RRE font ... "); 126 | } 127 | 128 | -------------------------------------------------------------------------------- /examples/ST7789_Bitmap/ST7789_Bitmap.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019 Pawel A. Hernik 3 | 4 | /* 5 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 6 | 7 | #01 GND -> GND 8 | #02 VCC -> VCC (3.3V only!) 9 | #03 SCL -> D13/SCK 10 | #04 SDA -> D11/MOSI 11 | #05 RES -> D8 or any digital 12 | #06 DC -> D7 or any digital 13 | #07 BLK -> NC 14 | */ 15 | 16 | #define TFT_DC 7 17 | #define TFT_RST 8 18 | #define SCR_WD 240 19 | #define SCR_HT 240 // 320 - to allow access to full 240x320 frame buffer 20 | #include 21 | #include 22 | #include 23 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 24 | 25 | #include "bitmap.h" 26 | 27 | uint16_t colorBar[50]; 28 | 29 | void setup(void) 30 | { 31 | Serial.begin(9600); 32 | lcd.init(SCR_WD, SCR_HT); 33 | lcd.fillScreen(BLACK); 34 | 35 | int i,j; 36 | for(j=0;j<7;j++) 37 | for(i=0;i<7;i++) 38 | lcd.drawImageF(i*34,j*34,32,32,mario); 39 | delay(4000); 40 | 41 | for(i=0;i<25;i++) { 42 | colorBar[i] = RGBto565(i*256/25,0,i*256/25); 43 | colorBar[i+25] = RGBto565((24-i)*255/25,0,(24-i)*255/25); 44 | } 45 | for(i=0;i<240;i++) { 46 | lcd.drawImage(i,0,1,50,colorBar); 47 | lcd.drawImage(i,240-50,1,50,colorBar); 48 | } 49 | for(i=50;i<240-50;i++) { 50 | lcd.drawImage(0,i,50,1,colorBar); 51 | lcd.drawImage(240-50,i,50,1,colorBar); 52 | } 53 | delay(4000); 54 | } 55 | 56 | void loop() 57 | { 58 | lcd.drawImageF(random(0,240-32),random(0,240-32),32,32,mario); 59 | } 60 | 61 | -------------------------------------------------------------------------------- /examples/ST7789_Bitmap/bitmap.h: -------------------------------------------------------------------------------- 1 | // Generated by bmp2src by Pawel A. Hernik 2 | // Generated from: mario24b.bmp 3 | // Dimensions : 32x32x16 (65536 colors) 4 | // Size : 2048 [0x0800] bytes 5 | 6 | const uint16_t mario[] PROGMEM = { 7 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x8430,0x4208,0x18a2, 8 | 0x1861,0x18e3,0x6b4d,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 9 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9cf3,0x528a,0x2080,0xa1e1,0xf2c1, 10 | 0xd261,0xb221,0x38a0,0x6b4d,0xa514,0x9cf3,0x738e,0x7bcf,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 11 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9cf3,0x39e7,0x5100,0xf2c1,0xfae2,0xa349, 12 | 0xe69a,0xdd33,0x92a7,0x18a2,0x8c71,0x2965,0x39e7,0x3186,0x3186,0x632c,0x9cf3,0xa514,0xa514,0xa514,0xa514,0xa514, 13 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x52aa,0x40c0,0xf2c2,0xfac2,0xd241,0xde9a, 14 | 0xf246,0xf225,0xc513,0x3060,0x1082,0x6b6d,0x8430,0x8430,0xbdd7,0x4a49,0x39e7,0xa514,0xa514,0xa514,0xa514,0xa514, 15 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x8c51,0x1840,0xe281,0xfaa2,0xfa82,0xda21,0xd618, 16 | 0xec0e,0xac2f,0x8a06,0x80e1,0x88e1,0x80c1,0x60c2,0x3985,0xffdf,0xffdf,0x2124,0x8c71,0xa514,0xa514,0xa514,0xa514, 17 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x39c7,0x8941,0xfa41,0xfa41,0xf221,0xe1e1,0x69a5, 18 | 0x9163,0xd981,0xf181,0xe161,0x88c1,0x4860,0x2020,0x0800,0xad55,0xdefb,0x4a49,0x7bef,0xa514,0xa514,0xa514,0xa514, 19 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x94b2,0x1040,0xe9e1,0xf1e1,0xf1e1,0xb141,0x78a1,0xd921, 20 | 0xe941,0xd941,0x8983,0x62a7,0x0000,0x0000,0x4228,0xd6ba,0xc638,0xef5d,0x10a2,0x9492,0xa514,0xa514,0xa514,0xa514, 21 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x6b6d,0x68a0,0xf1a1,0xf1a1,0x9901,0xa0a1,0xd901,0xd901, 22 | 0x9963,0xa42b,0xfeb1,0x5a86,0x39a4,0xe71c,0xffff,0xf7be,0xffdf,0x632c,0x4208,0xa514,0xa514,0xa514,0xa514,0xa514, 23 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x52aa,0x1061,0xb101,0xf161,0xa901,0x7081,0xa0c1,0x91c4,0xac2a, 24 | 0x5a66,0xfed1,0xfed2,0x2943,0x3163,0x5aa8,0x5aeb,0xad75,0x94b2,0x1082,0x9cd3,0xa514,0xa514,0xa514,0xa514,0xa514, 25 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x6b6d,0x4860,0xc901,0xe941,0xe141,0x40a0,0x7307,0xddef,0xfed2,0xfed2, 26 | 0x1081,0xcd8e,0xf691,0xbd0d,0xfed1,0xfe90,0xedee,0x39a5,0x18c3,0x4a69,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 27 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x4208,0xa8a1,0xd0e1,0xb0e1,0x6880,0x6101,0x4962,0xddef,0xfed2,0xfed2, 28 | 0x8ba9,0xddcf,0xfeb1,0xfed2,0xfed2,0xfeb1,0xfe4f,0x8368,0x52aa,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 29 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x4a69,0x7080,0x6225,0xcd4d,0xc52d,0x4942,0x48c0,0x30a1,0xf670,0x8369, 30 | 0xd58e,0xfed2,0xfed2,0xfed2,0xfeb1,0xfe90,0xfe4f,0x7b28,0x738e,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 31 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9492,0x1082,0xf62f,0xedce,0xa46b,0xbd0d,0x38e1,0x6266,0xfe90,0x28a1, 32 | 0x1840,0x3963,0x6286,0xd58e,0xfe90,0xfe4f,0xac6b,0x18c2,0x94b2,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 33 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x3165,0xfe4f,0xfe4f,0xac8b,0xddcf,0xee30,0xf691,0xfe91,0x7285, 34 | 0x2040,0x3880,0x4080,0x2860,0x30e1,0x1881,0x0000,0x7bcf,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 35 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x528a,0x9c0a,0xf62f,0xc52d,0xfeb1,0xfed2,0xfed2,0xfed2,0xfe70, 36 | 0x51e4,0x2860,0x2860,0x3880,0x2860,0x1020,0x3186,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 37 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9cf3,0x31a6,0x41c4,0x7328,0x6aa6,0x7b28,0xfed2,0xfed2,0xfed1, 38 | 0x82a6,0x5060,0x3061,0x49c4,0x5080,0x1061,0x8c71,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 39 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9cf3,0x4228,0x0000,0x2020,0x1820,0x4a05,0xe5ef,0xfe4f, 40 | 0x9b68,0x78c1,0x93e9,0x79c4,0x3040,0x6b6d,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 41 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x9cf3,0x7bef,0x20e3,0x7881,0xd0e1,0xe921,0xf141,0x5880,0x40a2,0x5aca, 42 | 0x7b28,0x7245,0x28c4,0x0841,0x4a69,0xa514,0x8430,0x39e7,0x31a6,0x5aeb,0x9cf3,0xa514,0xa514,0xa514,0xa514,0xa514, 43 | 0xa514,0xa514,0xa514,0xa514,0xa514,0x9492,0x2104,0x4228,0x59c6,0x8881,0xe101,0xb0e1,0x7080,0xc101,0xa8e1,0x0a33, 44 | 0x09d0,0xa102,0x88c1,0x014b,0x0862,0x4208,0x1061,0x5961,0x6181,0x28a0,0x3186,0x9492,0xa514,0xa514,0xa514,0xa514, 45 | 0xa514,0xa514,0xa514,0xa514,0x9cf3,0x4208,0x630c,0xe73c,0xffff,0xd6ba,0x5124,0x5060,0xd0c1,0xe101,0xa8e1,0x0a12, 46 | 0x1a2f,0x3a4a,0x09f1,0x0a55,0x4aca,0x2920,0x4100,0x8201,0x8a02,0x8202,0x10a2,0x2945,0xa514,0xa514,0xa514,0xa514, 47 | 0xa514,0xa514,0xa514,0xa514,0x52aa,0x8430,0xe73c,0xffff,0xffff,0xf7be,0x5acb,0xa8c1,0xd0a1,0xe101,0x60e4,0x09af, 48 | 0xd62a,0xfec5,0x42a9,0x0a55,0x324a,0x8382,0x5121,0x81c1,0x81e1,0x79c1,0x73ae,0x1082,0xa514,0xa514,0xa514,0xa514, 49 | 0xa514,0xa514,0xa514,0xa514,0x2124,0xdedb,0x7bcf,0xa534,0xffff,0xffdf,0xa534,0x30a5,0x68a3,0x48c5,0x09f1,0x09af, 50 | 0xcd84,0xf644,0x3a69,0x0a55,0x09f1,0x2962,0x5120,0x79c1,0x81c1,0x5961,0x7bcf,0x31a6,0xa514,0xa514,0xa514,0xa514, 51 | 0xa514,0xa514,0xa514,0xa514,0x2945,0xef7d,0xef5d,0x73ae,0xffff,0xef5d,0xd69a,0x012b,0x0a34,0x0a55,0x0a55,0x0a55, 52 | 0x11cc,0x2a09,0x0a33,0x0a55,0x0a55,0x0041,0x6961,0x7181,0x79c1,0x7b4b,0x18e3,0x738e,0xa514,0xa514,0xa514,0xa514, 53 | 0xa514,0xa514,0xa514,0xa514,0x39e7,0xc618,0xffdf,0xf7be,0xe71c,0x528a,0x630c,0x00c9,0x01f3,0x0a34,0x0a54,0x0a55, 54 | 0x0a55,0x0a55,0x0a55,0x0a55,0x09ae,0x1840,0x6140,0x6940,0x5121,0x5acb,0x3186,0xa514,0xa514,0xa514,0xa514,0xa514, 55 | 0xa514,0xa514,0xa514,0xa514,0x8c71,0x2104,0x94b2,0xdefb,0xd69a,0x4a49,0x4900,0x48e0,0x0085,0x0190,0x01f3,0x01f3, 56 | 0x0214,0x0214,0x0214,0x0a12,0x0042,0x2060,0x6141,0x6140,0x730b,0x10a2,0x8c51,0xa514,0xa514,0xa514,0xa514,0xa514, 57 | 0xa514,0xa514,0xa514,0xa514,0xa514,0x94b2,0x528a,0x0861,0x3144,0x5120,0x6140,0x40c0,0x5100,0x012b,0x01f3,0x01f3, 58 | 0x01f3,0x01f2,0x014c,0x0062,0x630c,0x4a49,0x0020,0x0020,0x10a2,0x2965,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 59 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x8c71,0x39c7,0x6a46,0x79a1,0x7181,0x5100,0x4900,0x0841,0x0042,0x0063, 60 | 0x0042,0x10a2,0x4228,0x8c71,0xa514,0xa514,0x9cf3,0x9cf3,0x7bef,0x9cd3,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 61 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x5aeb,0x8430,0x5941,0x79a1,0x79a1,0x6981,0x4900,0x4228,0x9cf3,0x94b2, 62 | 0x9cd3,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 63 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x4a49,0x94b2,0x6981,0x81c1,0x81c1,0x79a1,0x1860,0x6b6d,0xa514,0xa514, 64 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 65 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x4a49,0x8410,0x71c1,0x8a02,0x8201,0x71a1,0x2124,0xa514,0xa514,0xa514, 66 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 67 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x8410,0x18e3,0x4101,0x8a22,0x8a22,0x30c0,0x4a69,0xa514,0xa514,0xa514, 68 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 69 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x94b2,0x4208,0x1061,0x1082,0x4a49,0x9cf3,0xa514,0xa514,0xa514, 70 | 0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514, 71 | }; 72 | 73 | -------------------------------------------------------------------------------- /examples/ST7789_ControllerModes/ST7789_ControllerModes.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019 Pawel A. Hernik 3 | 4 | // requires RRE Font library: 5 | // https://github.com/cbm80amiga/RREFont 6 | 7 | /* 8 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 9 | 10 | #01 GND -> GND 11 | #02 VCC -> VCC (3.3V only!) 12 | #03 SCL -> D13/SCK 13 | #04 SDA -> D11/MOSI 14 | #05 RES -> D8 or any digital 15 | #06 DC -> D7 or any digital 16 | #07 BLK -> NC 17 | */ 18 | 19 | #define TFT_DC 7 20 | #define TFT_RST 8 21 | #define SCR_WD 240 22 | #define SCR_HT 240 // 320 - to allow access to full 240x320 frame buffer 23 | #include 24 | #include 25 | #include 26 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 27 | 28 | #include "RREFont.h" 29 | #include "rre_chicago_20x24.h" 30 | 31 | RREFont font; 32 | 33 | // needed for RREFont library initialization, define your fillRect 34 | void customRect(int x, int y, int w, int h, int c) { return lcd.fillRect(x, y, w, h, c); } 35 | 36 | void setup() 37 | { 38 | Serial.begin(9600); 39 | lcd.init(SCR_WD, SCR_HT); 40 | font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values 41 | font.setFont(&rre_chicago_20x24); 42 | font.setScale(1,2); font.setSpacing(3); 43 | font.setColor(WHITE); 44 | } 45 | 46 | void rainbow() 47 | { 48 | for(int i=0;i<240;i+=4) { 49 | uint8_t r,g,b; 50 | lcd.rgbWheel(i*512L/240,&r,&g,&b); 51 | lcd.fillRect(0,i,240,4,RGBto565(r,g,b)); 52 | } 53 | } 54 | 55 | void loop() 56 | { 57 | lcd.fillScreen(RGBto565(120,60,30)); 58 | font.printStr(ALIGN_CENTER,95,"ST7789 modes"); 59 | delay(2000); 60 | 61 | lcd.powerSave(7); 62 | /* 63 | rainbow(); delay(2000); 64 | lcd.setBrightness(0); delay(2000); 65 | lcd.setBrightness(128); delay(2000); 66 | lcd.setBrightness(255); delay(2000); 67 | */ 68 | rainbow(); 69 | font.setColor(BLACK); 70 | font.printStr(ALIGN_CENTER,95,"Idle mode OFF"); 71 | lcd.idleDisplay(false); delay(2000); 72 | rainbow(); 73 | font.printStr(ALIGN_CENTER,95,"Idle mode ON"); 74 | lcd.idleDisplay(true); delay(4000); 75 | rainbow(); 76 | font.printStr(ALIGN_CENTER,95,"Idle mode OFF"); 77 | lcd.idleDisplay(false); delay(2000); 78 | 79 | rainbow(); 80 | font.setColor(WHITE,BLACK); 81 | lcd.fillRect(30,87,240-60,60,BLACK); 82 | font.printStr(ALIGN_CENTER,95,"Invert OFF"); 83 | lcd.invertDisplay(false); delay(2000); 84 | font.printStr(ALIGN_CENTER,95," Invert ON "); 85 | lcd.invertDisplay(true); delay(4000); 86 | font.printStr(ALIGN_CENTER,95,"Invert OFF"); 87 | lcd.invertDisplay(false); delay(2000); 88 | 89 | font.setColor(WHITE); 90 | lcd.fillScreen(RGBto565(180,0,180)); 91 | font.printStr(ALIGN_CENTER,95,"Sleep mode in 2s"); 92 | delay(2000); 93 | //lcd.enableDisplay(false); 94 | lcd.sleepDisplay(true); delay(4000); 95 | lcd.sleepDisplay(false); 96 | //lcd.enableDisplay(true); 97 | 98 | lcd.fillScreen(RGBto565(180,0,180)); 99 | font.printStr(ALIGN_CENTER,95,"Display on/off"); 100 | delay(2000); 101 | lcd.enableDisplay(false); delay(4000); 102 | lcd.enableDisplay(true); delay(1000); 103 | 104 | lcd.fillScreen(RGBto565(180,0,180)); 105 | font.printStr(ALIGN_CENTER,95,"Partial display"); 106 | font.setColor(YELLOW); 107 | font.printStr(ALIGN_CENTER,6,"Top"); 108 | font.printStr(ALIGN_CENTER,240-50,"Bottom"); 109 | font.setColor(WHITE); 110 | delay(2000); 111 | lcd.setPartArea(60*1, 60*3); lcd.partialDisplay(true); delay(4000); 112 | lcd.setPartArea(60*3, 60*1); lcd.partialDisplay(true); delay(4000); 113 | lcd.partialDisplay(false); 114 | delay(1000); 115 | 116 | lcd.fillScreen(RGBto565(180,0,0)); 117 | font.printStr(ALIGN_CENTER,95,"Sw reset ..."); 118 | delay(2000); 119 | lcd.resetDisplay(); delay(2000); 120 | lcd.init(SCR_WD, SCR_HT); 121 | lcd.fillScreen(RGBto565(0,0,180)); 122 | font.printStr(0,0,"After reset"); delay(2000); 123 | } 124 | 125 | -------------------------------------------------------------------------------- /examples/ST7789_HelloWorld/ST7789_HelloWorld.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019 Pawel A. Hernik 3 | 4 | /* 5 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 6 | 7 | #01 GND -> GND 8 | #02 VCC -> VCC (3.3V only!) 9 | #03 SCL -> D13/SCK 10 | #04 SDA -> D11/MOSI 11 | #05 RES -> D8 or any digital 12 | #06 DC -> D7 or any digital 13 | #07 BLK -> NC 14 | */ 15 | 16 | //#define TFT_CS 6 17 | #define TFT_DC 7 18 | #define TFT_RST 8 19 | #define SCR_WD 240 20 | #define SCR_HT 240 // 320 - to allow access to full 240x320 frame buffer 21 | #include 22 | #include 23 | #include 24 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 25 | //Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST, TFT_CS); 26 | 27 | void setup(void) 28 | { 29 | Serial.begin(9600); 30 | lcd.init(SCR_WD, SCR_HT); 31 | lcd.fillScreen(BLACK); 32 | lcd.setCursor(0, 0); 33 | lcd.setTextColor(WHITE,BLUE); 34 | lcd.setTextSize(3); 35 | lcd.println("HELLO WORLD"); 36 | } 37 | 38 | void loop() 39 | { 40 | } 41 | 42 | -------------------------------------------------------------------------------- /examples/ST7789_Navi_switch/ST7789_Navi_switch.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // 5-way navi switch example 3 | // (c) 2019 Pawel A. Hernik 4 | // https://youtu.be/EO7pfz1KjJM 5 | 6 | /* 7 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 8 | 9 | #01 GND -> GND 10 | #02 VCC -> VCC (3.3V only!) 11 | #03 SCL -> PA5/SCK 12 | #04 SDA -> PA7/MOSI 13 | #05 RES -> PA0 or any digital 14 | #06 DC -> PA1 or any digital 15 | #07 BLK -> NC 16 | */ 17 | 18 | 19 | #include 20 | #include 21 | #if (__STM32F1__) // bluepill 22 | #define TFT_DC PA1 23 | #define TFT_RST PA0 24 | #define NAVI_UP PB15 25 | #define NAVI_DOWN PB14 26 | #define NAVI_LEFT PB13 27 | #define NAVI_RIGHT PB12 28 | #define NAVI_MID PB10 29 | #define NAVI_SET PB9 30 | #define NAVI_RST PB8 31 | //#include 32 | #else 33 | #define TFT_DC 10 34 | #define TFT_RST 9 35 | #define NAVI_UP 2 36 | #define NAVI_DOWN 3 37 | #define NAVI_LEFT 4 38 | #define NAVI_RIGHT 5 39 | #define NAVI_MID 6 40 | #define NAVI_SET 7 41 | #define NAVI_RST 8 42 | #include 43 | #endif 44 | 45 | #define SCR_WD 240 46 | #define SCR_HT 240 47 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 48 | 49 | 50 | void setup() 51 | { 52 | Serial.begin(9600); 53 | pinMode(NAVI_UP, INPUT_PULLUP); 54 | pinMode(NAVI_DOWN, INPUT_PULLUP); 55 | pinMode(NAVI_LEFT, INPUT_PULLUP); 56 | pinMode(NAVI_RIGHT, INPUT_PULLUP); 57 | pinMode(NAVI_MID, INPUT_PULLUP); 58 | pinMode(NAVI_SET, INPUT_PULLUP); 59 | pinMode(NAVI_RST, INPUT_PULLUP); 60 | lcd.init(); 61 | lcd.fillScreen(); 62 | 63 | } 64 | 65 | void loop() 66 | { 67 | int wd=240,ht=240,rec=50,trih=40,triw=50; 68 | int wd2=wd/2,ht2=ht/2,rec2=rec/2; 69 | 70 | uint16_t c = digitalRead(NAVI_UP) ? RED : GREEN; 71 | lcd.fillTriangle(wd2,0, wd2-triw,trih, wd2+50,trih, c); 72 | lcd.fillRect(wd2-rec2,trih, rec,rec, c); 73 | 74 | c = digitalRead(NAVI_DOWN) ? RED : GREEN; 75 | lcd.fillTriangle(wd2,ht-0, wd2-triw,ht-trih, wd2+triw,ht-trih, c); 76 | lcd.fillRect(wd2-rec2,ht-trih-rec, rec,rec, c); 77 | 78 | c = digitalRead(NAVI_LEFT) ? RED : GREEN; 79 | lcd.fillTriangle(0,ht2, trih,ht2-triw, trih,ht2+triw, c); 80 | lcd.fillRect(trih,ht2-rec2, rec,rec, c); 81 | 82 | c = digitalRead(NAVI_RIGHT) ? RED : GREEN; 83 | lcd.fillTriangle(wd-0,ht2, wd-trih,ht2-triw, wd-triw,ht2+triw, c); 84 | lcd.fillRect(wd-trih-rec,ht2-rec2, rec,rec, c); 85 | 86 | c = digitalRead(NAVI_MID) ? RED : GREEN; 87 | lcd.fillRect(wd2-rec2,ht2-rec2, rec,rec, c); 88 | 89 | c = digitalRead(NAVI_SET) ? RED : GREEN; 90 | lcd.fillRect(0,ht-20, 40,20, c); 91 | 92 | c = digitalRead(NAVI_RST) ? RED : GREEN; 93 | lcd.fillRect(wd-40,ht-20, 40,20, c); 94 | } 95 | -------------------------------------------------------------------------------- /examples/ST7789_Numeric_display/ST7789_Numeric_display.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // Numeric display - RREFont vs PropFont 3 | // (c) 2020 Pawel A. Hernik 4 | // YouTube videos: 5 | // https://youtu.be/OOvzmHcou4E 6 | // https://youtu.be/-F7EWPt0yIo 7 | 8 | /* 9 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 10 | 11 | #01 GND -> GND 12 | #02 VCC -> VCC (3.3V only!) 13 | #03 SCL -> D13/PA5/SCK 14 | #04 SDA -> D11/PA7/MOSI 15 | #05 RES -> D9 /PA0 or any digital 16 | #06 DC -> D10/PA1 or any digital 17 | #07 BLK -> NC 18 | */ 19 | 20 | #include 21 | #include 22 | #if (__STM32F1__) // bluepill 23 | #define TFT_DC PA1 24 | #define TFT_RST PA0 25 | //#include 26 | #else 27 | #define TFT_DC 10 28 | #define TFT_RST 9 29 | #include 30 | #endif 31 | 32 | #define SCR_WD 240 33 | #define SCR_HT 240 34 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 35 | 36 | // define what kind of fonts should be used 37 | #define USE_RRE_FONTS 1 38 | 39 | #if USE_RRE_FONTS==1 40 | 41 | #include "RREFont.h" 42 | #include "rre_term_10x16.h" 43 | #include "rre_bold13x20.h" 44 | #include "rre_bold13x20v.h" 45 | #include "rre_bold13x20no.h" 46 | 47 | RREFont font; 48 | // needed for RREFont library initialization, define your fillRect 49 | void customRect(int x, int y, int w, int h, int c) { return lcd.fillRect(x, y, w, h, c); } 50 | 51 | #else 52 | 53 | #include "PropFont.h" 54 | #include "bold13x20digtop_font.h" 55 | #include "term9x14_font.h" 56 | 57 | PropFont font; 58 | // needed for PropFont library initialization, define your drawPixel and fillRect 59 | void customPixel(int x, int y, int c) { lcd.drawPixel(x, y, c); } 60 | void customRect(int x, int y, int w, int h, int c) { lcd.fillRect(x, y, w, h, c); } 61 | #endif 62 | 63 | //----------------------------------------------------------------------------- 64 | 65 | unsigned long ms = 0; 66 | 67 | void setup() 68 | { 69 | Serial.begin(9600); 70 | lcd.init(SCR_WD, SCR_HT); 71 | #if USE_RRE_FONTS==1 72 | font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values 73 | #else 74 | font.init(customPixel, customRect, SCR_WD, SCR_HT); // custom drawPixel and fillRect function and screen width and height values 75 | #endif 76 | } 77 | 78 | const uint16_t lnCol = RGBto565(255,150,255); 79 | const uint16_t ln2Col = RGBto565(180,180,180); 80 | const uint16_t labCol = RGBto565(250,250,250); 81 | const uint16_t v1Col = RGBto565(100,250,100); 82 | const uint16_t v2Col = RGBto565(255,250,100); 83 | const uint16_t v3Col = RGBto565(120,255,255); 84 | const uint16_t v4Col = RGBto565(255,120,120); 85 | const uint16_t v5Col = RGBto565(150,150,255); 86 | //const uint16_t v5Col = RGBto565(250,150,250); 87 | int mode=0,lastMode=-1; 88 | 89 | void setBigNumFont() 90 | { 91 | #if USE_RRE_FONTS==1 92 | font.setFont(&rre_Bold13x20v); 93 | //font.setFont(&rre_Bold13x20); // regular RRE rendered with rectangles 94 | //font.setFont(&rre_Bold13x20no); // like above but no overlapping 95 | #else 96 | font.setFont(Bold13x20); 97 | #endif 98 | font.setSpacing(1); 99 | font.setScale(1,2); 100 | font.setDigitMinWd(16); 101 | } 102 | 103 | void setInfoFont() 104 | { 105 | #if USE_RRE_FONTS==1 106 | font.setFont(&rre_term_10x16); 107 | #else 108 | font.setFont(Term9x14); 109 | #endif 110 | } 111 | 112 | void drawField(int x, int y, int w, int h, char *label, uint16_t col=lnCol) 113 | { 114 | lcd.drawRect(x,y+7,w,h-7,col); 115 | setInfoFont(); 116 | font.setScale(1); 117 | font.setColor(labCol,BLACK); 118 | int wl = font.strWidth(label); 119 | font.printStr(x+(w-wl)/2,y,label); 120 | } 121 | 122 | void showVal(float v, int x, int y, int w, int p, uint16_t col) 123 | { 124 | setBigNumFont(); 125 | font.setColor(col,BLACK); 126 | char txt[10]; 127 | dtostrf(v,w,p,txt); 128 | font.printStr(x,y,txt); 129 | } 130 | 131 | void constData() 132 | { 133 | drawField( 0, 0,120-5,80-2," Temp "); 134 | drawField(120+5, 0,120-5,80-2," Time "); 135 | drawField( 0, 81,120-5,80-2," Pressure "); 136 | drawField(120+5, 81,120-5,80-2," Altitude "); 137 | drawField( 0,162,240,80-2," Big Number ",ln2Col); 138 | setBigNumFont(); 139 | int wv=font.strWidth("88.8"); 140 | font.setColor(v1Col); font.printStr(18+wv,0+24,"'$"); 141 | wv=font.strWidth("999999999.99"); 142 | font.setColor(v5Col); font.printStr(22+wv,162+25,"'"); 143 | wv=font.strWidth("888.8"); 144 | int wv2=font.strWidth("888"); 145 | setInfoFont(); 146 | font.setScale(1,2); 147 | font.setColor(v4Col); font.printStr(21+120+wv+2,82+22+14,"m"); 148 | font.setColor(v2Col); font.printStr(32+120+wv2+3,24+12,"ms"); 149 | } 150 | 151 | float v1,v3,v4,v5; 152 | int tm = 0; 153 | 154 | void varData() 155 | { 156 | //v1=88.8; v3=8888.8; v4=888.8; v5=8888888.88; 157 | // PropFont optimizing: noopt=350ms, ff=317ms, 0+ff=298ms, +f0=290ms +0f=277ms 158 | showVal(v1, 18,0+24, 4,1, v1Col); 159 | showVal(tm, 32+120,0+24, 3,0, v2Col); 160 | showVal(v3, 14,82+24, 6,1, v3Col); 161 | showVal(v4, 21+120,82+24, 5,1, v4Col); 162 | showVal(v5, 22,162+25, 12,2, v5Col); 163 | v1+=1.1; if(v1>99.0) v1=0; 164 | v3+=10.1; if(v3>9999.0) v3=0; 165 | v4+=3.3; if(v4>999.0) v4=0; 166 | v5+=941340.32; if(v5>=999999999.99) v5=0; 167 | } 168 | 169 | void loop() 170 | { 171 | if(mode!=lastMode) { 172 | lastMode=mode; 173 | lcd.fillScreen(BLACK); 174 | constData(); 175 | } 176 | ms = millis(); 177 | varData(); 178 | tm = millis()-ms; 179 | Serial.println(tm); 180 | } 181 | 182 | -------------------------------------------------------------------------------- /examples/ST7789_Rotation/ST7789_Rotation.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019-20 Pawel A. Hernik 3 | 4 | /* 5 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 6 | 7 | #01 GND -> GND 8 | #02 VCC -> VCC (3.3V only!) 9 | #03 SCL -> D13/SCK 10 | #04 SDA -> D11/MOSI 11 | #05 RES -> D8 or any digital 12 | #06 DC -> D7 or any digital 13 | #07 BLK -> NC 14 | */ 15 | 16 | #define SCR_WD 240 17 | #define SCR_HT 240 18 | #include 19 | #include 20 | 21 | #if (__STM32F1__) // bluepill 22 | #define TFT_DC PA1 23 | #define TFT_RST PA0 24 | //#include 25 | #else 26 | #define TFT_DC 7 27 | #define TFT_RST 8 28 | #include 29 | //#include 30 | #endif 31 | 32 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 33 | 34 | void setup() 35 | { 36 | Serial.begin(9600); 37 | lcd.init(); 38 | } 39 | 40 | void loop(void) 41 | { 42 | for(uint8_t rot = 0; rot < 4; rot++) { 43 | testText(rot); 44 | delay(2000); 45 | } 46 | } 47 | 48 | unsigned long testText(int rot) 49 | { 50 | lcd.setRotation(rot); 51 | lcd.fillScreen(BLACK); 52 | lcd.setCursor(0, 0); 53 | lcd.setTextColor(BLUE); 54 | lcd.setTextSize(1); 55 | lcd.println("Hello World!"); 56 | lcd.setTextColor(WHITE); 57 | lcd.print("Rotation = "); 58 | lcd.println(rot); 59 | lcd.setTextColor(YELLOW); 60 | lcd.setTextSize(2); 61 | lcd.println(1234.56); 62 | lcd.setTextColor(RED); 63 | lcd.setTextSize(3); 64 | lcd.println(0xDEAD, HEX); 65 | lcd.println(); 66 | lcd.setTextColor(GREEN); 67 | lcd.setTextSize(4); 68 | lcd.println("Hello"); 69 | } 70 | 71 | 72 | -------------------------------------------------------------------------------- /examples/ST7789_Scroll/ST7789_Scroll.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // (c) 2019 Pawel A. Hernik 3 | 4 | // requires RRE Font library: 5 | // https://github.com/cbm80amiga/RREFont 6 | 7 | /* 8 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 9 | 10 | #01 GND -> GND 11 | #02 VCC -> VCC (3.3V only!) 12 | #03 SCL -> D13/SCK 13 | #04 SDA -> D11/MOSI 14 | #05 RES -> D8 or any digital 15 | #06 DC -> D7 or any digital 16 | #07 BLK -> NC 17 | */ 18 | 19 | #define TFT_DC 7 20 | #define TFT_RST 8 21 | #define SCR_WD 240 22 | #define SCR_HT 320 // 320 - to access to full 240x320 frame buffer 23 | #include 24 | #include 25 | #include 26 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 27 | 28 | #include "RREFont.h" 29 | #include "rre_chicago_20x24.h" 30 | 31 | RREFont font; 32 | 33 | // needed for RREFont library initialization, define your fillRect 34 | void customRect(int x, int y, int w, int h, int c) { return lcd.fillRect(x, y, w, h, c); } 35 | 36 | void setup() 37 | { 38 | Serial.begin(9600); 39 | lcd.init(SCR_WD, SCR_HT); 40 | font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values 41 | 42 | for(int i=0;i<256;i+=16) { 43 | uint8_t r,g,b; 44 | lcd.rgbWheel(i*512L/256,&r,&g,&b); 45 | lcd.fillRect(0,i,240,16,RGBto565(r,g,b)); 46 | } 47 | 48 | font.setFont(&rre_chicago_20x24); font.setSpacing(2); 49 | font.setScale(2); 50 | font.setColor(BLACK); 51 | font.printStr(ALIGN_CENTER,60+2,"SCROLL"); font.printStr(ALIGN_CENTER,140+2,"DEMO"); 52 | font.setColor(WHITE); 53 | font.printStr(ALIGN_CENTER,60,"SCROLL"); font.printStr(ALIGN_CENTER,140,"DEMO"); 54 | font.setScale(1); 55 | delay(2000); 56 | } 57 | 58 | int bgCols[] = {6,8,10,12,14,12,10,8}; 59 | char *scrollTxt[] = {"","This","is","an example","of","super-smooth","scrolling","with regular", 60 | "AVR Arduino,","ST7789","240x240 IPS LCD","library","and","RRE Fonts",""}; 61 | 62 | int c=0,t=0; 63 | int maxy=320; // internal ST7789 fb is 240x320 64 | unsigned long ms; 65 | 66 | void loop() 67 | { 68 | // full screen scrolling 69 | lcd.setScrollArea(0,0); 70 | font.setSpacing(2); 71 | for(int l=0;l<3;l++) 72 | for(int i=0;i=maxy) y-=maxy; 77 | if((i%32)==0) { 78 | lcd.fillRect(0,y,240,32,RGBto565(0,0,bgCols[c]<<4)); 79 | font.printStr(ALIGN_CENTER,y+5,scrollTxt[t]); 80 | if(++c>=sizeof(bgCols)/sizeof(bgCols[0])) c=0; 81 | if(++t>=sizeof(scrollTxt)/sizeof(scrollTxt[0])) t=0; 82 | //Serial.println(millis()-ms); // less than 25ms per line 83 | } 84 | while(millis()-ms<25); 85 | } 86 | 87 | // scrolling with fixed top area 88 | lcd.fillRect(0,0,240,6,RGBto565(220,0,220)); 89 | lcd.fillRect(0,6,240,64-12,RGBto565(180,0,180)); 90 | lcd.fillRect(0,64-6,240,6,RGBto565(140,0,140)); 91 | font.setScale(1,2); font.setSpacing(3); 92 | font.setColor(YELLOW); 93 | font.printStr(ALIGN_CENTER,4*2,"Fixed Top Area"); 94 | font.setColor(WHITE); 95 | font.setScale(1); font.setSpacing(3); 96 | lcd.setScrollArea(64, 0); 97 | for(int l=0;l<3;l++) 98 | for(int i=64;i=maxy) {y-=maxy; y+=64;} 103 | if((i%32)==0) { 104 | lcd.fillRect(0,y,240,32,RGBto565(0,0,bgCols[c]<<4)); 105 | font.printStr(ALIGN_CENTER,y+5,scrollTxt[t]); 106 | if(++c>=sizeof(bgCols)/sizeof(bgCols[0])) c=0; 107 | if(++t>=sizeof(scrollTxt)/sizeof(scrollTxt[0])) t=0; 108 | } 109 | while(millis()-ms<25); 110 | } 111 | } 112 | 113 | -------------------------------------------------------------------------------- /examples/ST7789_Watch_2bit/ST7789_Watch_2bit.ino: -------------------------------------------------------------------------------- 1 | // ST7789 library example 2 | // Analog watch/clock, AVR + DS1307/DS3231 RTC module 3 | // (c) 2020 Pawel A. Hernik 4 | // YT videos: 5 | // https://youtu.be/jFGDFuLhdMc 6 | // https://youtu.be/35Z0enhEYqM 7 | // https://youtu.be/Xr-dxPhePhY 8 | 9 | /* 10 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 11 | 12 | #01 GND -> GND 13 | #02 VCC -> VCC (3.3V only!) 14 | #03 SCL -> D13/PA5/SCK 15 | #04 SDA -> D11/PA7/MOSI 16 | #05 RES -> D9 /PA0 or any digital 17 | #06 DC -> D10/PA1 or any digital 18 | #07 BLK -> NC 19 | */ 20 | 21 | #include 22 | #include 23 | #if (__STM32F1__) // bluepill 24 | #define TFT_DC PA1 25 | #define TFT_RST PA0 26 | #define BUTTON PB9 27 | //#include 28 | #else 29 | #define TFT_DC 7 30 | #define TFT_RST 8 31 | #define BUTTON 3 32 | #include 33 | #endif 34 | 35 | #define SCR_WD 240 36 | #define SCR_HT 240 37 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 38 | 39 | //#include "sansmains.h" 40 | //#include "smartq02.h" 41 | //#include "smartq04.h" 42 | //#include "smartq09.h" 43 | //#include "smartq07.h" 44 | #include "smartq08.h" 45 | const unsigned char *clockface = dial2bit; 46 | 47 | //#include "small4x6_font.h" 48 | 49 | struct RTCData { 50 | int hour,minute,second; 51 | int year,month,day,dayOfWeek; 52 | }; 53 | 54 | RTCData cur; 55 | 56 | #define USEHW 1 57 | #include 58 | #include "rtc.h" 59 | 60 | uint8_t txt2num(const char* p) 61 | { 62 | return 10*(*p-'0') + *(p+1)-'0'; 63 | } 64 | 65 | // configuration 66 | 67 | const uint16_t cx = SCR_WD/2, cy = SCR_HT/2; // clock center 68 | const uint16_t selHandCol1 = RGBto565(250,250,0); 69 | const uint16_t selHandCol2 = RGBto565(180,180,0); 70 | const uint16_t mHandCol1 = RGBto565(220,220,220); 71 | const uint16_t mHandCol2 = RGBto565(150,150,150); 72 | const uint16_t hHandCol1 = RGBto565(220,220,220); 73 | const uint16_t hHandCol2 = RGBto565(150,150,150); 74 | const uint16_t sHandCol1 = RGBto565(250,80,80); 75 | const uint16_t sHandCol2 = RGBto565(200,0,0); 76 | int hHandL = 25*2, hHandW = 3*2; 77 | int mHandL = 36*2, mHandW = 3*2; 78 | int sHandL = 44*2, sHandW = 2*2; 79 | 80 | 81 | int sDeg,mDeg,hDeg; 82 | int sDegOld,mDegOld,hDegOld; 83 | unsigned long styleTime, ms; 84 | uint8_t hh = txt2num(__TIME__+0); 85 | uint8_t mm = txt2num(__TIME__+3); 86 | uint8_t ss = txt2num(__TIME__+6); 87 | uint8_t start = 1; 88 | int setMode = 0; 89 | 90 | // ---------------------------------------------------------------- 91 | 92 | uint16_t palette[4]; 93 | uint16_t line[SCR_WD+4]; 94 | 95 | void imgLineH(int x, int y, int w) 96 | { 97 | uint8_t v,*img = (uint8_t*)clockface+4*2+6+y*SCR_WD/4+x/4; 98 | int ww = (x&3)?w+4:w; 99 | for(int i=0;i>6)&3]; 102 | line[i+1] = palette[(v>>4)&3]; 103 | line[i+2] = palette[(v>>2)&3]; 104 | line[i+3] = palette[v&3]; 105 | } 106 | lcd.drawImage(x,y,w,1,line+(x&3)); 107 | } 108 | 109 | void imgRect(int x, int y, int w, int h) 110 | { 111 | for(int i=y;iy2) { swap(y1,y2); swap(x1,x2); } 124 | if (y1>y3) { swap(y1,y3); swap(x1,x3); } 125 | if (y2>y3) { swap(y2,y3); swap(x2,x3); } 126 | 127 | t1x=t2x=x1; y=y1; // Starting points 128 | 129 | dx1 = x2 - x1; if(dx1<0) { dx1=-dx1; signx1=-1; } else signx1=1; 130 | dy1 = y2 - y1; 131 | 132 | dx2 = x3 - x1; if(dx2<0) { dx2=-dx2; signx2=-1; } else signx2=1; 133 | dy2 = y3 - y1; 134 | 135 | if (dy1 > dx1) { swap(dx1,dy1); changed1 = true; } 136 | if (dy2 > dx2) { swap(dy2,dx2); changed2 = true; } 137 | 138 | e2 = dx2>>1; 139 | if(y1==y2) goto next; // Flat top, just process the second half 140 | e1 = dx1>>1; 141 | 142 | for (uint16_t i = 0; i < dx1;) { 143 | t1xp=0; t2xp=0; 144 | if(t1x= dx1) { 151 | e1 -= dx1; 152 | if (changed1) t1xp=signx1;//t1x += signx1; 153 | else goto next1; 154 | } 155 | if (changed1) break; 156 | else t1x += signx1; 157 | } 158 | // Move line 159 | next1: 160 | // process second line until y value is about to change 161 | while (1) { 162 | e2 += dy2; 163 | while (e2 >= dx2) { 164 | e2 -= dx2; 165 | if (changed2) t2xp=signx2;//t2x += signx2; 166 | else goto next2; 167 | } 168 | if (changed2) break; 169 | else t2x += signx2; 170 | } 171 | next2: 172 | if(minx>t1x) minx=t1x; if(minx>t2x) minx=t2x; 173 | if(maxx dx1) { swap(dy1,dx1); changed1 = true; } else changed1=false; 194 | 195 | e1 = dx1>>1; 196 | 197 | for (uint16_t i = 0; i<=dx1; i++) { 198 | t1xp=0; t2xp=0; 199 | if(t1x= dx1) { 205 | e1 -= dx1; 206 | if (changed1) { t1xp=signx1; break; }//t1x += signx1; 207 | else goto next3; 208 | } 209 | if (changed1) break; 210 | else t1x += signx1; 211 | if(i= dx2) { 218 | e2 -= dx2; 219 | if(changed2) t2xp=signx2; 220 | else goto next4; 221 | } 222 | if (changed2) break; 223 | else t2x += signx2; 224 | } 225 | next4: 226 | if(minx>t1x) minx=t1x; if(minx>t2x) minx=t2x; 227 | if(maxxy3) return; 237 | } 238 | } 239 | 240 | // ------------------------------------------------ 241 | #define MAXSIN 255 242 | const uint8_t sinTab[91] PROGMEM = { 243 | 0,4,8,13,17,22,26,31,35,39,44,48,53,57,61,65,70,74,78,83,87,91,95,99,103,107,111,115,119,123, 244 | 127,131,135,138,142,146,149,153,156,160,163,167,170,173,177,180,183,186,189,192,195,198,200,203,206,208,211,213,216,218, 245 | 220,223,225,227,229,231,232,234,236,238,239,241,242,243,245,246,247,248,249,250,251,251,252,253,253,254,254,254,254,254, 246 | 255 247 | }; 248 | 249 | int fastSin(int i) 250 | { 251 | while(i<0) i+=360; 252 | while(i>=360) i-=360; 253 | if(i<90) return(pgm_read_byte(&sinTab[i])); else 254 | if(i<180) return(pgm_read_byte(&sinTab[180-i])); else 255 | if(i<270) return(-pgm_read_byte(&sinTab[i-180])); else 256 | return(-pgm_read_byte(&sinTab[360-i])); 257 | } 258 | 259 | int fastCos(int i) 260 | { 261 | return fastSin(i+90); 262 | } 263 | 264 | // ------------------------------------------------ 265 | 266 | int px[8],py[8]; 267 | 268 | void drawHand(int deg, int w, int l, int col1=0, int col2=0) 269 | { 270 | int i,num = 4; 271 | px[0]= 0, py[0]= l; 272 | px[1]=-w-1, py[1]= 0; 273 | px[2]= w+1, py[2]= 0; 274 | px[3]= 0, py[3]=-15; 275 | int x[5],y[5]; 276 | int cc = fastCos(deg+180); 277 | int ss = fastSin(deg+180); 278 | for(i=0;i0?MAXSIN/2:-MAXSIN/2))/MAXSIN; 282 | y[i] = cy + (y[i]+(y[i]>0?MAXSIN/2:-MAXSIN/2))/MAXSIN; 283 | } 284 | imgTriangle(x[0],y[0], x[1],y[1], x[3],y[3], col2); 285 | imgTriangle(x[2],y[2], x[3],y[3], x[0],y[0], col1); 286 | } 287 | 288 | void drawHandS(int deg, int w, int l, int col1=0, int col2=0) 289 | { 290 | int i,num = 8; 291 | px[0]=-w+3, py[0]= l; 292 | px[1]=-w+3, py[1]=-20; 293 | px[2]= w-3, py[2]= l; 294 | px[3]= w-3, py[3]=-20; 295 | px[4]=-w+1, py[4]=-40; 296 | px[5]=-w+1, py[5]=-15; 297 | px[6]= w-1, py[6]=-40; 298 | px[7]= w-1, py[7]=-15; 299 | int x[8],y[8]; 300 | int cc = fastCos(deg+180); 301 | int ss = fastSin(deg+180); 302 | for(i=0;i0?MAXSIN/2:-MAXSIN/2))/MAXSIN; 306 | y[i] = cy + (y[i]+(y[i]>0?MAXSIN/2:-MAXSIN/2))/MAXSIN; 307 | } 308 | imgTriangle(x[0],y[0], x[1],y[1], x[3],y[3], col1); 309 | imgTriangle(x[2],y[2], x[3],y[3], x[0],y[0], col1); 310 | imgTriangle(x[4],y[4], x[5],y[5], x[7],y[7], col1); 311 | imgTriangle(x[6],y[6], x[7],y[7], x[4],y[4], col1); 312 | } 313 | 314 | void clockUpdate() 315 | { 316 | if(millis()-ms<1000 && !start) return; 317 | ms = millis(); 318 | if(setMode==0) { 319 | //getRTCDateTime(&cur); 320 | if(1) { 321 | if(++cur.second>59) { 322 | cur.second = 0; 323 | if(++cur.minute>59) { 324 | cur.minute = 0; 325 | if(++cur.hour>11) { 326 | cur.hour = 0; 327 | } 328 | } 329 | } 330 | } 331 | ss = cur.second; 332 | mm = cur.minute; 333 | hh = cur.hour; 334 | } 335 | 336 | sDeg = ss*6; 337 | 338 | if(ss==0 || start) { 339 | start = 0; 340 | mDeg = mm*6+sDeg/60; 341 | hDeg = hh*30+mDeg/12; 342 | drawHand(hDegOld,hHandW,hHandL); 343 | drawHand(mDegOld,mHandW,mHandL); 344 | mDegOld = mDeg; 345 | hDegOld = hDeg; 346 | } 347 | 348 | drawHandS(sDegOld,sHandW,sHandL); 349 | if(setMode==1) 350 | drawHand(hDeg,hHandW,hHandL,selHandCol1,selHandCol2); 351 | else 352 | drawHand(hDeg,hHandW,hHandL,hHandCol1,hHandCol2); 353 | if(setMode==2) 354 | drawHand(mDeg,mHandW,mHandL,selHandCol1,selHandCol2); 355 | else 356 | drawHand(mDeg,mHandW,mHandL,mHandCol1,mHandCol2); 357 | if(setMode==0) 358 | drawHandS(sDeg,sHandW,sHandL,sHandCol1,sHandCol2); 359 | sDegOld = sDeg; 360 | 361 | lcd.fillCircle(cx,cy, 4, RGBto565(40,40,40)); 362 | /* 363 | lcd.setTextSize(3); lcd.setTextColor(WHITE,BLACK); 364 | lcd.setCursor(0,0); 365 | lcd.print(hh); lcd.print(":"); lcd.print(mm); lcd.print(":"); lcd.print(ss); 366 | lcd.setCursor(0,30); 367 | lcd.print(cur.day); lcd.print("."); lcd.print(cur.month); lcd.print("."); lcd.print(cur.year+2000); 368 | */ 369 | } 370 | 371 | // -------------------------------------------------------------------------- 372 | int stateOld = HIGH; 373 | long btDebounce = 30; 374 | long btDoubleClick = 600; 375 | long btLongClick = 700; 376 | long btLongerClick = 2000; 377 | long btTime = 0, btTime2 = 0; 378 | int clickCnt = 1; 379 | 380 | // 0=idle, 1,2,3=click, -1,-2=longclick 381 | int checkButton() 382 | { 383 | int state = digitalRead(BUTTON); 384 | if( state == LOW && stateOld == HIGH ) { btTime = millis(); stateOld = state; return 0; } // button just pressed 385 | if( state == HIGH && stateOld == LOW ) { // button just released 386 | stateOld = state; 387 | if( millis()-btTime >= btDebounce && millis()-btTime < btLongClick ) { 388 | if( millis()-btTime2= btLongerClick ) { stateOld = state; return -2; } 394 | if( state == LOW && millis()-btTime >= btLongClick ) { stateOld = state; return -1; } 395 | return 0; 396 | } 397 | // -------------------------------------------------------------------------- 398 | const char *months[] = {"???", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 399 | const char *delim = " :"; 400 | char bld[40]; 401 | 402 | uint8_t str2month(const char * d) 403 | { 404 | uint8_t i = 13; 405 | while((--i) && strcmp(months[i], d)); 406 | return i; 407 | } 408 | 409 | void setBuildTime() 410 | { 411 | // Timestamp format: "Mar 3 2019 12:34:56" 412 | snprintf(bld,40,"%s %s\n", __DATE__, __TIME__); 413 | char *token = strtok(bld, delim); 414 | while(token) { 415 | int m = str2month((const char*)token); 416 | if(m>0) { 417 | cur.month = m; 418 | token = strtok(NULL, delim); cur.day = atoi(token); 419 | token = strtok(NULL, delim); cur.year = atoi(token) - 1970; 420 | token = strtok(NULL, delim); cur.hour = atoi(token); 421 | token = strtok(NULL, delim); cur.minute = atoi(token); 422 | token = strtok(NULL, delim); cur.second = atoi(token); 423 | } 424 | token = strtok(NULL, delim); 425 | } 426 | //snprintf(bld,40,"Build: %02d-%02d-%02d %02d:%02d:%02d\n",mt.year+1970,mt.month,mt.day,mt.hour,mt.minute,mt.second); Serial.println(bld); 427 | setRTCTime(&cur); 428 | } 429 | 430 | //----------------------------------------------------------------------------- 431 | 432 | void setup() 433 | { 434 | Serial.begin(9600); 435 | pinMode(BUTTON, INPUT_PULLUP); 436 | Wire.begin(); 437 | Wire.setClock(400000); // faster 438 | lcd.init(SCR_WD, SCR_HT); 439 | //getRTCDateTime(&cur); 440 | if(cur.year+2000<2020) setBuildTime(); // <2020 - invalid year 441 | uint16_t *pal = (uint16_t*)clockface+3; 442 | for(int i=0;i<4;i++) palette[i]=pgm_read_word(pal++); 443 | imgRect(0,0,SCR_WD,SCR_HT); 444 | ms = millis(); 445 | } 446 | 447 | void loop() 448 | { 449 | /* 450 | int st = checkButton(); 451 | if(st<0 && setMode==0) setMode=1; 452 | if(setMode>0) { 453 | if(st>0) { start=1; if(++setMode>2) setMode=0; } 454 | if(setMode==1 && st<0) { if(++hh>23) hh=0; start=1; delay(600); } 455 | if(setMode==2 && st<0) { if(++mm>59) mm=0; start=1; delay(200); } 456 | cur.hour = hh; 457 | cur.minute = mm; 458 | setRTCTime(&cur); 459 | }*/ 460 | clockUpdate(); 461 | } 462 | 463 | -------------------------------------------------------------------------------- /examples/ST7789_Watch_2bit/rtc.h: -------------------------------------------------------------------------------- 1 | int BCD2DEC(int x) { return ((x)>>4)*10+((x)&0xf); } 2 | int DEC2BCD(int x) { return (((x)/10)<<4)+((x)%10); } 3 | 4 | #if USEHW==1 5 | #define I2CStart(x) Wire.beginTransmission(x) 6 | #define I2CStop() Wire.endTransmission() 7 | #define I2CWrite(x) Wire.write(x) 8 | #define I2CRead() Wire.read() 9 | #define I2CReadLast() Wire.read() 10 | #define I2CReq(x,y) Wire.requestFrom(x,y) 11 | #define I2CReady while(!Wire.available()) {}; 12 | #else 13 | #define I2CStart(x) i2c_start((x<<1) | I2C_WRITE) 14 | #define I2CStop() i2c_stop() 15 | #define I2CWrite(x) i2c_write(x) 16 | #define I2CRead() i2c_read(false) 17 | #define I2CReadLast() i2c_read(true) 18 | #define I2CReq(x,y) i2c_rep_start((x<<1) | I2C_READ) 19 | #define I2CReady 20 | #endif 21 | 22 | #define DS1307_I2C_ADDRESS 0x68 // same for DS3231 23 | #define DS1307_TIME 0x00 24 | #define DS1307_DOW 0x03 25 | #define DS1307_DATE 0x04 26 | #define DS1307_MEM 0x08 27 | 28 | #define DS3231_I2C_ADDRESS 0x68 29 | #define DS3231_CONTROL 0x0e 30 | #define DS3231_STATUS 0x0f 31 | #define DS3231_TEMP 0x11 32 | 33 | /* 34 | void setRTCDateTime(struct RTCData *data) 35 | { 36 | I2CStart(DS1307_I2C_ADDRESS); 37 | I2CWrite(DS1307_TIME); 38 | I2CWrite(DEC2BCD(data->second)); 39 | I2CWrite(DEC2BCD(data->minute)); 40 | I2CWrite(DEC2BCD(data->hour)); 41 | I2CWrite(DEC2BCD(data->dayOfWeek)); 42 | I2CWrite(DEC2BCD(data->day)); 43 | I2CWrite(DEC2BCD(data->month)); 44 | I2CWrite(DEC2BCD(data->year)); // year 00..99 45 | I2CStop(); 46 | } 47 | */ 48 | 49 | void setRTCTime(struct RTCData *data) 50 | { 51 | I2CStart(DS1307_I2C_ADDRESS); 52 | I2CWrite(DS1307_TIME); 53 | I2CWrite(DEC2BCD(data->second)); 54 | I2CWrite(DEC2BCD(data->minute)); 55 | I2CWrite(DEC2BCD(data->hour)); 56 | I2CStop(); 57 | } 58 | 59 | void getRTCDateTime(struct RTCData *data) 60 | { 61 | I2CStart(DS1307_I2C_ADDRESS); 62 | I2CWrite(DS1307_TIME); 63 | I2CStop(); 64 | 65 | I2CReq(DS1307_I2C_ADDRESS, 7); 66 | I2CReady; 67 | 68 | data->second = BCD2DEC(I2CRead() & 0x7f); 69 | data->minute = BCD2DEC(I2CRead() & 0x7f); 70 | data->hour = BCD2DEC(I2CRead() & 0x3f); 71 | data->dayOfWeek = I2CRead() & 0x07; 72 | data->day = BCD2DEC(I2CRead() & 0x3f); 73 | data->month = BCD2DEC(I2CRead() & 0x3f); 74 | data->year = BCD2DEC(I2CReadLast() & 0xff); 75 | 76 | I2CStop(); 77 | #if DEBUG_RTC==1 78 | //Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(second); 79 | //Serial.print(day); Serial.print("-"); Serial.print(month); Serial.print("-"); Serial.println(year); 80 | //Serial.println(dayOfWeek); 81 | #endif 82 | } 83 | 84 | float getDS3231Temp() 85 | { 86 | I2CStart(DS3231_I2C_ADDRESS); 87 | I2CWrite(DS3231_TEMP); 88 | I2CStop(); 89 | I2CReq(DS1307_I2C_ADDRESS, 2); 90 | I2CReady; 91 | int msb = I2CRead()<<2; 92 | int lsb = I2CRead()>>6; 93 | I2CStop(); 94 | return (msb | lsb)/4.0; 95 | } 96 | 97 | void writeRTCReg(byte addr, byte val) 98 | { 99 | I2CStart(DS3231_I2C_ADDRESS); 100 | I2CWrite(addr); 101 | I2CWrite(val); 102 | I2CStop(); 103 | } 104 | 105 | // for DS1307 only 106 | void writeRTCMem(byte addr, byte val) 107 | { 108 | if(addr>56) return; 109 | I2CStart(DS1307_I2C_ADDRESS); 110 | I2CWrite(DS1307_MEM + addr); 111 | I2CWrite(val); 112 | I2CStop(); 113 | } 114 | 115 | byte readRTCMem(byte addr) 116 | { 117 | if(addr>56) return 0; 118 | I2CStart(DS1307_I2C_ADDRESS); 119 | I2CWrite(DS1307_MEM + addr); 120 | I2CStop(); 121 | I2CReq(DS1307_I2C_ADDRESS, 1); 122 | I2CReady; 123 | byte v = I2CReadLast(); 124 | I2CStop(); 125 | return v; 126 | } 127 | 128 | -------------------------------------------------------------------------------- /examples/ST7789_Watch_2bit/smartq02.h: -------------------------------------------------------------------------------- 1 | // Generated by bmp2src by Pawel A. Hernik 2 | // Generated from: smartq02-2b.bmp 3 | // Dimensions : 240x240x2 (4 colors) 4 | // Size : 14400 [0x3840] bytes 5 | 6 | const unsigned char dial2bit[14400+4*2+6] PROGMEM = { 7 | 240,0,240,0,2,0, // width,height,bits 8 | 0x3c,0xe7, // c000->230,229,227 9 | 0x73,0xee, // c001->233,205,155 10 | 0x4f,0xc5, // c002->193,169,120 11 | 0x41,0x08, // c003-> 9, 9, 8 12 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 13 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xaa,0xaa,0xaa,0xaa, 14 | 0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 15 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 16 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 17 | 0xff,0xff,0xff,0xff,0xff,0xea,0xaa,0xaa,0x65,0x55,0x55,0x99,0xaa,0xaa,0xab,0xff, 18 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 19 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 20 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 21 | 0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xff,0xff,0xff,0xff, 22 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 23 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 24 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa,0x95,0x55,0x55,0x55, 25 | 0x56,0x66,0x66,0x55,0x55,0x55,0x55,0x5a,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 26 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 27 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 28 | 0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0x95,0x55,0x55,0x6a,0xaa,0xaa,0xaa,0xaa,0xaa, 29 | 0xaa,0xa9,0x95,0x55,0x56,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 30 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 31 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 32 | 0xff,0xaa,0x95,0x55,0x59,0xaa,0xaa,0xaa,0x9a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x99, 33 | 0x55,0x5a,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 34 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 35 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0xa5,0x55,0x5a, 36 | 0xaa,0xaa,0x9a,0xa6,0xa9,0x80,0x0a,0x66,0xaa,0xaa,0xaa,0xaa,0xa9,0x55,0x5a,0xab, 37 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 38 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 39 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xa5,0x55,0x6a,0xaa,0xaa,0xa9,0xa9,0x59, 40 | 0x66,0x40,0x01,0x99,0x99,0x69,0xa6,0xaa,0xaa,0xa9,0x55,0x6a,0xaf,0xff,0xff,0xff, 41 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 42 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 43 | 0xff,0xff,0xff,0xaa,0x55,0x5a,0xaa,0xaa,0xaa,0x66,0x54,0x26,0x55,0x40,0x01,0x55, 44 | 0x54,0x96,0x6a,0x6a,0xaa,0xaa,0xa9,0x55,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 45 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 46 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0x95, 47 | 0x5a,0xaa,0xaa,0xa9,0x56,0x65,0x66,0xa5,0x55,0x40,0x01,0x55,0x5a,0x95,0x95,0x95, 48 | 0xaa,0xaa,0xaa,0x95,0x56,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 49 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 50 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xa9,0x55,0xaa,0xaa,0xa9,0x96, 51 | 0x25,0x55,0x56,0xa5,0x59,0x40,0x01,0x96,0x5a,0x95,0x56,0x50,0x96,0x6a,0xaa,0xaa, 52 | 0x96,0x6a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 53 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 54 | 0xff,0xff,0xff,0xff,0xff,0xea,0x55,0x6a,0xaa,0xa9,0x95,0x96,0xa5,0x56,0x55,0x55, 55 | 0x95,0x7f,0xfd,0x55,0x55,0x55,0x95,0x5a,0x99,0x99,0xaa,0xaa,0xa9,0x56,0xab,0xff, 56 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 57 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 58 | 0xfe,0xa5,0x56,0xaa,0xaa,0x45,0x99,0x56,0xa5,0x65,0x99,0x99,0xa6,0xa6,0xaa,0xaa, 59 | 0x99,0x99,0x55,0x9a,0x95,0x66,0x52,0xaa,0xaa,0xa5,0x9a,0xbf,0xff,0xff,0xff,0xff, 60 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 61 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0x55,0xaa,0xa9, 62 | 0x99,0x49,0x55,0x56,0x56,0x66,0x65,0x55,0x10,0x00,0x00,0x04,0x55,0x5a,0xa6,0x55, 63 | 0x56,0x55,0x92,0xaa,0xaa,0xaa,0x55,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 64 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 65 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xa5,0x5a,0xaa,0xaa,0x95,0xa9,0x59,0x99, 66 | 0x9a,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0xaa,0x65,0x59,0x6a,0x59, 67 | 0xaa,0xaa,0xa9,0x9a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 68 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 69 | 0xff,0xff,0xff,0xea,0x55,0xaa,0xaa,0x95,0x65,0xa9,0x96,0x69,0x50,0x00,0x00,0x00, 70 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x6a,0x95,0x6a,0x55,0x9a,0xaa,0xaa,0x55, 71 | 0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 72 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xa5, 73 | 0x5a,0xaa,0xa5,0x66,0x56,0x66,0x69,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 74 | 0x00,0x00,0x00,0x00,0x01,0x6a,0x99,0x99,0x99,0x5a,0xaa,0xa9,0x9a,0xbf,0xff,0xff, 75 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 76 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x55,0xaa,0xaa,0x82,0x55, 77 | 0x65,0x9a,0x50,0x00,0x00,0x00,0x00,0x00,0xbf,0x8b,0xff,0xef,0xc0,0x00,0x00,0x00, 78 | 0x00,0x05,0xa9,0x55,0x56,0x4a,0xaa,0xaa,0x56,0xaf,0xff,0xff,0xff,0xff,0xff,0xff, 79 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 80 | 0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0x5a,0xaa,0xa9,0x6a,0x59,0x9a,0x94,0x00,0x00, 81 | 0x00,0x00,0x00,0x00,0xbf,0x03,0xcf,0x4f,0x40,0x00,0x00,0x00,0x00,0x00,0x16,0xa9, 82 | 0x99,0xa9,0x9a,0xaa,0xa5,0x6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 83 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 84 | 0xff,0xfe,0x95,0xaa,0xaa,0x66,0x6e,0x56,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 85 | 0x2e,0x03,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x95,0xb9,0xaa,0xaa, 86 | 0xaa,0x5a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 87 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0x56,0xaa, 88 | 0x69,0x65,0x56,0x6a,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x0b,0x0b, 89 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa9,0x99,0x59,0xa9,0xaa,0xa5,0xab,0xff, 90 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 91 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0x6a,0xa4,0x29,0x96,0x66,0x94, 92 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0b,0x0b,0x00,0x00,0x00,0x00, 93 | 0x00,0x00,0x00,0x00,0x16,0x95,0x96,0x64,0x2a,0xa9,0x9a,0xff,0xff,0xff,0xff,0xff, 94 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 95 | 0xff,0xff,0xff,0xff,0xfa,0x95,0xaa,0x90,0x05,0x59,0x69,0x00,0x00,0x00,0x00,0x00, 96 | 0x00,0x00,0x00,0x00,0x0f,0x0a,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 97 | 0x00,0x6a,0x59,0x90,0x2a,0xaa,0x66,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 98 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 99 | 0xe9,0x5a,0xaa,0xa0,0x09,0x9a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 100 | 0x0b,0x08,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xa5,0x40, 101 | 0x2a,0xaa,0xa6,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 102 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xa5,0x6a,0xa9,0xa8, 103 | 0x0a,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x8c,0x0b,0x0b, 104 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x40,0x2a,0xaa,0xaa,0x6a, 105 | 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 106 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x9a,0xaa,0xa6,0x5a,0x2e,0x90,0x00,0x00, 107 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x98,0x0b,0x0b,0x00,0x00,0x00,0x00, 108 | 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xb8,0xa6,0xaa,0xaa,0x96,0xaf,0xff,0xff,0xff, 109 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 110 | 0xff,0xff,0xff,0xe9,0x5a,0xaa,0x66,0x5b,0xf9,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 111 | 0x00,0x00,0x00,0x00,0x03,0xa8,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 112 | 0x00,0x00,0x01,0xaf,0xd5,0x9a,0xaa,0xa9,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 113 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5, 114 | 0xaa,0xa9,0x99,0x66,0xa4,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 115 | 0x02,0xe0,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 116 | 0xa5,0x66,0xaa,0xaa,0x5a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 117 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x96,0xaa,0x92,0x56,0x6a, 118 | 0x40,0x06,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xf0,0x0b,0x0b, 119 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa9,0x99,0x8a,0xaa, 120 | 0xa6,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 121 | 0xff,0xff,0xff,0xff,0xff,0xff,0xea,0x5a,0xaa,0x42,0x59,0xa4,0x00,0x0b,0xe0,0x00, 122 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xe0,0x0b,0x0b,0x00,0x00,0x00,0x00, 123 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x66,0x42,0xaa,0xa6,0xab,0xff,0xff, 124 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 125 | 0xff,0xff,0xa5,0xaa,0xa9,0xbe,0x66,0x90,0x00,0xb8,0xb0,0x00,0x00,0x00,0x00,0x00, 126 | 0x00,0x00,0x00,0x00,0x00,0xe0,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 127 | 0x00,0x00,0x08,0x00,0x06,0x99,0xbe,0xaa,0xaa,0x6a,0xff,0xff,0xff,0xff,0xff,0xff, 128 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x99,0xaa, 129 | 0xa6,0x6a,0x69,0x00,0x02,0xf8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 130 | 0x00,0xf0,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x80, 131 | 0x00,0xa9,0xaa,0x6a,0xaa,0x9a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 132 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x5a,0xaa,0x66,0x59,0xa4,0x00, 133 | 0x68,0x38,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0b,0x0b, 134 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x1a,0xa6,0x66, 135 | 0xaa,0xa6,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 136 | 0xff,0xff,0xff,0xff,0xff,0xe9,0xaa,0xa9,0x99,0x9a,0x80,0x02,0xf4,0x28,0x0f,0x00, 137 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x0b,0x0b,0x00,0x00,0x00,0x00, 138 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x02,0xa5,0xaa,0xaa,0xa9,0xab,0xff, 139 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 140 | 0xff,0xa6,0xaa,0xa6,0x66,0x69,0x00,0x0b,0xf8,0x0c,0x03,0x80,0x00,0x00,0x00,0x00, 141 | 0x00,0x00,0x00,0x00,0x02,0xb8,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 142 | 0x00,0x00,0x3c,0x00,0x00,0x00,0x6a,0x56,0x6a,0xaa,0x6a,0xff,0xff,0xff,0xff,0xff, 143 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x9a,0xaa,0x59, 144 | 0x59,0xa4,0x00,0x00,0x7c,0x08,0x02,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 145 | 0x03,0x38,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00, 146 | 0x00,0x00,0x1a,0x99,0xa6,0xaa,0x9a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 147 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x6a,0xaa,0x09,0xaa,0x90,0x00,0x00, 148 | 0x0f,0x0a,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x3c,0x0b,0x0b, 149 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x06,0xa6, 150 | 0x50,0xaa,0xa9,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 151 | 0xff,0xff,0xff,0xff,0xe9,0xaa,0xa6,0xa9,0x99,0x00,0x00,0x00,0x03,0xc2,0x00,0xb0, 152 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x2c,0x0b,0x0b,0x00,0x00,0x00,0x00, 153 | 0x00,0x00,0x00,0x00,0x00,0x02,0xc0,0x00,0x00,0x00,0x00,0xa9,0xaa,0xaa,0xaa,0x6b, 154 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 155 | 0xa6,0xaa,0xaa,0xba,0xa4,0x00,0x00,0x00,0x00,0xe3,0x00,0x38,0x00,0x00,0x00,0x00, 156 | 0x00,0x00,0x00,0x00,0x09,0x2e,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 157 | 0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x2a,0x6f,0xaa,0xaa,0x6a,0xff,0xff,0xff,0xff, 158 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x9a,0xaa,0x99,0xa9, 159 | 0x90,0x00,0x00,0x00,0x00,0xba,0x80,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 160 | 0x08,0x0e,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00, 161 | 0x00,0x00,0x00,0x06,0xa9,0xaa,0xaa,0x9a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 162 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x6a,0xaa,0x99,0x9a,0x40,0x00,0x00,0x00, 163 | 0x00,0x2e,0x80,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0f,0x0b,0x0b, 164 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x01, 165 | 0xa6,0x66,0xaa,0xa6,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 166 | 0xff,0xff,0xff,0xea,0xaa,0xa6,0x66,0x69,0x00,0x00,0x00,0x00,0x00,0x0b,0xc0,0x03, 167 | 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x0f,0x0b,0x0b,0x00,0x00,0x00,0x00, 168 | 0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x5a,0xaa,0xa9, 169 | 0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe6, 170 | 0xaa,0xaa,0x66,0xa4,0x00,0x00,0x00,0x00,0x00,0x02,0xe0,0x02,0xc0,0x00,0x00,0x00, 171 | 0x00,0x00,0x00,0x00,0x28,0x0b,0x8b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 172 | 0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0xa6,0x6a,0xaa,0x6b,0xff,0xff,0xff, 173 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0xaa,0xa6,0x69,0x90, 174 | 0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 175 | 0x38,0x0f,0x8f,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 176 | 0x00,0x00,0x00,0x00,0x06,0xa6,0xaa,0xaa,0x9a,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 177 | 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa,0xaa,0x19,0x9a,0x40,0x00,0x00,0x00,0x00, 178 | 0x00,0x00,0x3e,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x2f,0xff,0xef, 179 | 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, 180 | 0x01,0xa6,0x60,0xaa,0xa6,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 181 | 0xff,0xff,0xfa,0x9a,0xaa,0x2a,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00, 182 | 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 183 | 0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x68,0xaa, 184 | 0xa9,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,0xaa, 185 | 0xaa,0xf9,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0xc0,0x2e,0x00,0x00,0x00, 186 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 187 | 0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x9f,0xaa,0xa9,0x6b,0xff,0xff, 188 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0x99,0xaa,0x90,0x00, 189 | 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xf0,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 190 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00, 191 | 0x00,0x00,0x00,0x00,0x00,0x06,0xaa,0xaa,0xaa,0xaa,0xff,0xff,0xff,0xff,0xff,0xff, 192 | 0xff,0xff,0xff,0xff,0xff,0xff,0xa6,0xaa,0xa6,0x9a,0x40,0x00,0x00,0x00,0x00,0x00, 193 | 0x00,0x00,0x08,0xb8,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x5a,0xaa,0x54, 194 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 195 | 0x00,0x01,0xaa,0x66,0xaa,0x6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 196 | 0xff,0xfe,0xaa,0xaa,0x99,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x2e, 197 | 0x02,0xc0,0x00,0x00,0x00,0x00,0x01,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x40,0x00,0x00, 198 | 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x6a, 199 | 0xaa,0x96,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x6a,0xaa, 200 | 0x66,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x80,0xf8,0x00,0x00, 201 | 0x00,0x06,0xaa,0xaa,0x95,0x55,0x55,0x55,0xaa,0xaa,0x90,0x00,0x00,0x00,0x00,0x00, 202 | 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x99,0xaa,0xa9,0xaf,0xff, 203 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xaa,0xa6,0x9a,0xa0,0x00,0x00, 204 | 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0xe0,0xf8,0x00,0x00,0x02,0xaa,0xa5,0x55, 205 | 0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0x80,0x00,0x00,0x00,0x02,0xc0,0x00,0x00,0x00, 206 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x96,0xaa,0xa9,0xaf,0xff,0xff,0xff,0xff,0xff, 207 | 0xff,0xff,0xff,0xff,0xff,0xea,0xaa,0xaa,0x66,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 208 | 0x00,0x00,0x03,0x00,0xfa,0x80,0x00,0x00,0xaa,0xa5,0x55,0x55,0xaa,0xaa,0xaa,0xaa, 209 | 0x55,0x55,0x5a,0xaa,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 210 | 0x00,0x00,0x02,0xa9,0x6a,0xaa,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 211 | 0xff,0xa9,0xaa,0x4a,0x6a,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80, 212 | 0xbe,0x00,0x00,0x1a,0xa9,0x65,0x5a,0xa9,0x55,0x55,0x55,0x55,0xaa,0xa5,0x55,0x6a, 213 | 0xa4,0x00,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa5, 214 | 0x92,0xaa,0x6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9a,0xaa,0x49, 215 | 0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xc0,0xb4,0x00,0x02,0xaa, 216 | 0x55,0x5a,0xa5,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xa9,0x55,0xaa,0x80,0x00,0x7e, 217 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x62,0xaa,0x96,0xff, 218 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa,0xaa,0xfa,0xa4,0x00,0x00,0x00, 219 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x6a,0x99,0x5a,0xa5,0x55,0x55, 220 | 0x11,0x14,0x55,0x55,0x55,0x55,0x6a,0xa5,0x56,0xa9,0x00,0x07,0x00,0x00,0x00,0x00, 221 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x6f,0xaa,0xa6,0xbf,0xff,0xff,0xff,0xff, 222 | 0xff,0xff,0xff,0xff,0xfa,0x6a,0xaa,0xa6,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 223 | 0x00,0x00,0x00,0xf8,0x00,0x06,0xaa,0x55,0xa9,0x55,0x55,0x55,0x55,0x44,0x11,0x45, 224 | 0x55,0x55,0x55,0xaa,0x95,0x6a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 225 | 0x00,0x00,0x00,0x0a,0x9a,0x6a,0xa5,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 226 | 0xfa,0xaa,0xa6,0x6a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 227 | 0x00,0x2a,0x95,0x6a,0x95,0x55,0x55,0x11,0x11,0x11,0x11,0x14,0x55,0x55,0x55,0x5a, 228 | 0xa9,0x56,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06, 229 | 0xa5,0xaa,0xa9,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,0xaa,0xa9,0x9a, 230 | 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xa9,0x96,0xa5, 231 | 0x55,0x55,0x55,0x55,0x11,0x00,0x04,0x45,0x15,0x55,0x55,0x55,0x6a,0xa5,0x6a,0x80, 232 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa9,0x9a,0xaa,0x6b, 233 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xa6,0xaa,0x00,0x00,0x00,0x00, 234 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x99,0x6a,0x55,0x55,0x55,0x55,0x11, 235 | 0x11,0x11,0x11,0x11,0x55,0x55,0x55,0x55,0x56,0xa9,0x5a,0xa4,0x00,0x00,0x00,0x00, 236 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x6a,0xaa,0x5a,0xff,0xff,0xff,0xff, 237 | 0xff,0xff,0xff,0xff,0xaa,0xaa,0x9a,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 238 | 0x00,0x00,0x00,0x00,0xa9,0x96,0xa9,0x55,0x55,0x55,0x55,0x55,0x55,0x10,0x44,0x55, 239 | 0x55,0x55,0x55,0x55,0x55,0x6a,0x95,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 240 | 0x00,0x00,0x00,0x00,0x29,0x96,0xaa,0x9a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 241 | 0xa6,0xa6,0xa6,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06, 242 | 0xa6,0x6a,0x55,0x55,0x55,0x55,0x55,0x51,0x11,0x11,0x15,0x15,0x55,0x55,0x55,0x55, 243 | 0x55,0x5a,0xa9,0x5a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 244 | 0x1a,0x59,0x9a,0x96,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x6a,0x90,0x6a,0xa0, 245 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x66,0xa9,0x55,0x55, 246 | 0x55,0x55,0x55,0x55,0x10,0x00,0x00,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0xaa,0x96, 247 | 0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x95,0x0a,0xa5, 248 | 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xaa,0x80,0x2a,0x90,0x00,0x00,0x00,0x00, 249 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x9a,0x95,0x55,0x55,0x55,0x55,0x54,0x44, 250 | 0x04,0x44,0x45,0x14,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xa5,0x6a,0x00,0x00,0x00, 251 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x90,0x0a,0xa5,0xaf,0xff,0xff,0xff, 252 | 0xff,0xff,0xff,0xf9,0xaa,0x80,0x2a,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 253 | 0x00,0x00,0x06,0xa6,0x6a,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x51,0x10,0x04,0x45, 254 | 0x55,0x55,0x55,0x55,0x55,0x55,0x56,0xaa,0x5a,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 255 | 0x00,0x00,0x00,0x00,0x01,0xa0,0x0a,0xa9,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xea, 256 | 0xaa,0xa8,0x2a,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x9a, 257 | 0xa5,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x00,0x00,0x01,0x11,0x55,0x55,0x55,0x55, 258 | 0x55,0x55,0x55,0xaa,0x96,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 259 | 0x00,0xa8,0x2e,0xa9,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0xe6,0xaa,0xae,0xa9,0x00, 260 | 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa9,0x9a,0xa5,0x55,0x55,0x55, 261 | 0x55,0x55,0x55,0x15,0x51,0x00,0x40,0x44,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x66, 262 | 0xa9,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x6a,0xba,0xaa, 263 | 0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xe8,0x02,0xf0,0x00,0x00,0x00, 264 | 0x00,0x00,0x00,0x00,0x00,0x02,0xa9,0xa9,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x51, 265 | 0x00,0x00,0x01,0x11,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0x5a,0x80,0x00, 266 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x90,0x2b,0xa6,0xaa,0x5a,0xff,0xff,0xff, 267 | 0xff,0xff,0xff,0x9a,0xaa,0x9a,0xa4,0x02,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 268 | 0x00,0x0a,0x99,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x44,0x44,0x10,0x01,0x11, 269 | 0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xa6,0xa0,0x00,0x00,0x00,0x00,0x00, 270 | 0x00,0x00,0x00,0xbf,0xe0,0x1a,0x55,0xaa,0x96,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa, 271 | 0xa9,0xaa,0xa0,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x9a,0xa5, 272 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x44,0x41,0x11,0x11,0x55,0x55,0x55,0x55, 273 | 0x55,0x55,0x55,0x56,0x6a,0xa5,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xe0, 274 | 0xb4,0x0a,0x56,0xaa,0x96,0xbf,0xff,0xff,0xff,0xff,0xfe,0x6a,0xaa,0x9a,0x90,0x1c, 275 | 0x01,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x6a,0x95,0x55,0x55,0x55,0x55, 276 | 0x55,0x55,0x55,0x51,0x11,0x00,0x01,0x15,0x55,0x55,0x55,0x55,0x15,0x55,0x55,0x55, 277 | 0x56,0xaa,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x01,0xb8,0x02,0x95,0x5a, 278 | 0xa5,0xbf,0xff,0xff,0xff,0xff,0xfa,0xaa,0xa9,0xaa,0x40,0x3f,0x40,0xb0,0x00,0x00, 279 | 0x00,0x00,0x00,0x00,0x02,0xa9,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15, 280 | 0x44,0x44,0x51,0x45,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x55,0x59,0xaa,0x5a,0x80, 281 | 0x00,0x00,0x00,0x00,0x00,0x02,0xf4,0x0b,0xfc,0x02,0xa5,0xaa,0xa5,0xaf,0xff,0xff, 282 | 0xff,0xff,0xf9,0xaa,0xaa,0x6a,0x40,0xbf,0xf9,0x2c,0x00,0x00,0x00,0x00,0x00,0x00, 283 | 0x0a,0xa6,0xa6,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x11,0x41,0x26,0x55, 284 | 0x55,0x55,0x55,0x56,0xe5,0x55,0x55,0x55,0x55,0x6a,0xa6,0xa0,0x40,0x00,0x00,0x00, 285 | 0x00,0x2f,0x80,0xbe,0x00,0x00,0x99,0x5a,0xa9,0x6f,0xff,0xff,0xff,0xff,0xea,0xaa, 286 | 0x86,0xa9,0x00,0x11,0xbf,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x9a,0x99,0x55, 287 | 0x55,0x55,0x55,0x55,0x40,0x01,0x55,0x40,0x14,0x44,0x16,0x55,0x55,0x55,0x55,0x59, 288 | 0x55,0x55,0x55,0x95,0x56,0x5a,0xa5,0xa4,0x00,0x00,0x00,0x00,0x01,0xf8,0x06,0xe0, 289 | 0x00,0x00,0xa5,0x52,0xa9,0x6b,0xff,0xff,0xff,0xff,0xea,0xaa,0x4a,0xa9,0x00,0x00, 290 | 0x02,0xbf,0xe0,0x00,0x00,0x00,0x00,0x00,0x6a,0x6a,0xa5,0x55,0x55,0x55,0x55,0x55, 291 | 0x5a,0x56,0x55,0x5a,0x64,0x44,0x16,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x55,0x55, 292 | 0x55,0x66,0xa9,0x69,0x00,0x00,0x00,0x00,0x0b,0xc0,0x2f,0x40,0x00,0x00,0x29,0x42, 293 | 0xaa,0x6b,0xff,0xff,0xff,0xff,0xe9,0xaa,0xae,0xa8,0x00,0x00,0x00,0x0a,0xfe,0x00, 294 | 0x00,0x00,0x00,0x00,0xaa,0xa9,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0x99,0x55,0x65, 295 | 0x50,0x54,0x59,0x45,0x55,0x95,0x55,0x55,0x55,0x55,0x55,0x59,0x65,0x59,0xaa,0x6a, 296 | 0x00,0x00,0x00,0x00,0xbd,0x02,0xf8,0x00,0x00,0x00,0x19,0x6e,0xaa,0x5b,0xff,0xff, 297 | 0xff,0xff,0xaa,0xaa,0xaa,0xa4,0x00,0x00,0x00,0x00,0x2f,0xf8,0x00,0x00,0x00,0x02, 298 | 0xa6,0xaa,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x15,0x45,0x95,0x29,0x40, 299 | 0x56,0x55,0x05,0x65,0x15,0x55,0x55,0x55,0x55,0x95,0xaa,0x9a,0x81,0x00,0x00,0x0b, 300 | 0xe0,0x1f,0x80,0x00,0x00,0x00,0x19,0x6a,0x6a,0x5a,0xff,0xff,0xff,0xff,0xaa,0xaa, 301 | 0xaa,0xa0,0x00,0x00,0x00,0x00,0x02,0xaf,0xe0,0x00,0x01,0x0a,0x9a,0xa5,0x55,0x55, 302 | 0x55,0x55,0x55,0x55,0x95,0x95,0x55,0x55,0x95,0x94,0x69,0x6a,0x59,0x55,0x95,0x64, 303 | 0x15,0x55,0x55,0x95,0x95,0x56,0x6a,0xa6,0xa0,0x00,0x00,0x7e,0x01,0xbc,0x00,0x00, 304 | 0x00,0x00,0x0a,0x56,0xaa,0x96,0xff,0xff,0xff,0xff,0xaa,0xa9,0x9a,0x90,0x00,0x00, 305 | 0x00,0x00,0x00,0x82,0xbf,0x90,0x00,0x1a,0xaa,0xa6,0x55,0x55,0x55,0x55,0x55,0x55, 306 | 0x55,0x95,0x55,0xa6,0x96,0x60,0x61,0xaa,0x6a,0x96,0xa9,0x16,0x55,0x55,0x55,0x55, 307 | 0x56,0x65,0x6a,0xa9,0xa4,0x00,0x02,0xf0,0x0b,0xd0,0x00,0x00,0x00,0x00,0x06,0x65, 308 | 0x6a,0x96,0xbf,0xff,0xff,0xfe,0xaa,0xaa,0xaa,0x80,0x00,0x00,0x00,0x00,0x00,0x28, 309 | 0x0a,0xff,0x80,0x2a,0x6a,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x54,0x55,0xa5, 310 | 0x9a,0x61,0x96,0x9a,0x66,0xa6,0x65,0x29,0x95,0x55,0x55,0x59,0x65,0x59,0x9a,0xa9, 311 | 0xa8,0x05,0xef,0x80,0xbe,0x00,0x00,0x00,0x00,0x00,0x02,0x55,0xaa,0x96,0xbf,0xff, 312 | 0xff,0xfe,0xaa,0xaa,0x6a,0x40,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x2f,0x00,0xaa, 313 | 0xaa,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x56,0x99,0xa1,0x86,0x5a, 314 | 0x56,0x55,0x55,0x65,0x95,0x55,0x55,0x55,0x56,0x66,0x5a,0xaa,0x6a,0x00,0xb8,0x0b, 315 | 0xe0,0x00,0x00,0x00,0x00,0x00,0x01,0x95,0x5a,0xa5,0xbf,0xff,0xff,0xfa,0xaa,0xaa, 316 | 0xaa,0x40,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x0d,0x01,0xa9,0xa9,0x95,0x55,0x55, 317 | 0x55,0x55,0x55,0x55,0x65,0x59,0x95,0x55,0xa4,0x96,0x4a,0x56,0x59,0x59,0x55,0x94, 318 | 0x95,0x55,0x55,0x55,0x95,0x99,0xa6,0xaa,0x9a,0x40,0x70,0x6f,0x00,0x00,0x00,0x00, 319 | 0x00,0x00,0x01,0x95,0x6a,0xa5,0xaf,0xff,0xff,0xfa,0xaa,0xa9,0xaa,0x00,0x00,0x00, 320 | 0x00,0x00,0x00,0x00,0xa0,0x00,0x02,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 321 | 0x65,0x56,0x55,0x55,0xa5,0xaa,0x1a,0x55,0x21,0x59,0x54,0x94,0x95,0x55,0x55,0x55, 322 | 0x59,0x66,0x66,0xaa,0x9a,0x80,0x2e,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, 323 | 0x66,0xa9,0xaf,0xff,0xff,0xfa,0xaa,0xaa,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 324 | 0x28,0x00,0x0a,0xa6,0xa6,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x06,0x55,0x55, 325 | 0x90,0xa8,0x0a,0x65,0x95,0x51,0x04,0x94,0x59,0x55,0x55,0x59,0x59,0x9a,0x6a,0x6a, 326 | 0xa6,0xa0,0x0b,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x5a,0xa9,0x6f,0xff, 327 | 0xff,0xea,0xaa,0x8a,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xe1,0x1a,0x9a, 328 | 0xa5,0x59,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x56,0x95,0xa4,0x1a,0xab, 329 | 0x66,0xa0,0xa6,0x56,0xa5,0x59,0x65,0x55,0x66,0x66,0x99,0xaa,0xa5,0xa4,0x03,0x00, 330 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x52,0xa9,0x6b,0xff,0xff,0xea,0xaa,0x8a, 331 | 0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xc0,0x2a,0xaa,0x99,0x55,0x55,0x55, 332 | 0x55,0x55,0x55,0x5b,0xbf,0xf5,0x55,0x57,0x54,0xa0,0x4a,0x69,0x69,0x6f,0x9a,0x5a, 333 | 0x95,0x55,0x55,0x56,0x56,0x9a,0x6a,0x9a,0xa9,0xa8,0x01,0x00,0x00,0x00,0x00,0x00, 334 | 0x00,0x00,0x00,0x19,0x52,0xa9,0x6b,0xff,0xff,0xea,0xaa,0xba,0xa4,0x00,0x00,0x00, 335 | 0x00,0x00,0x00,0x00,0x02,0x40,0x6a,0x6a,0x95,0x65,0x55,0x55,0x55,0x55,0x55,0x55, 336 | 0x55,0x55,0x55,0x55,0x44,0x40,0x04,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x56,0x55, 337 | 0x66,0x66,0xa9,0xaa,0xa9,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19, 338 | 0x6a,0xaa,0x5b,0xff,0xff,0xea,0xaa,0xaa,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 339 | 0x00,0x00,0xaa,0xaa,0x59,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x51, 340 | 0x10,0x10,0x40,0x45,0x55,0x55,0x55,0x55,0x55,0x65,0x65,0x65,0x99,0xa9,0xa6,0x9a, 341 | 0xaa,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x6a,0xaa,0x5b,0xff, 342 | 0xff,0xaa,0xaa,0xaa,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa9,0xa9, 343 | 0x95,0x95,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x44,0x04,0x55, 344 | 0x55,0x55,0x55,0x55,0x55,0x56,0x59,0x99,0x5a,0x66,0xaa,0xaa,0xaa,0x5a,0x41,0x00, 345 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x56,0x6a,0x5a,0xff,0xff,0xaa,0xaa,0xaa, 346 | 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xaa,0xa9,0x59,0x55,0x55,0x65, 347 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x51,0x10,0x45,0x55,0x55,0x55,0x55,0x55, 348 | 0x55,0x55,0x66,0x69,0x99,0xaa,0x6a,0x69,0xaa,0x96,0x80,0x00,0x00,0x00,0x00,0x00, 349 | 0x00,0x00,0x00,0x06,0x55,0xaa,0x96,0xff,0xff,0xaa,0xaa,0xaa,0x90,0x40,0x00,0x00, 350 | 0x00,0x00,0x00,0x00,0x00,0x06,0x9a,0xa9,0x95,0x65,0x95,0x55,0x55,0x55,0x55,0x55, 351 | 0x55,0x55,0x55,0x55,0x55,0x10,0x01,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x96,0x66, 352 | 0x6a,0x9a,0xa6,0xaa,0x6a,0x96,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 353 | 0x55,0x5a,0x96,0xff,0xff,0xaa,0xaa,0xaa,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 354 | 0x01,0x0a,0xaa,0xa5,0x65,0x55,0x56,0x55,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 355 | 0x11,0x10,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x56,0x66,0xa6,0x9a,0xa6,0xaa,0x9a, 356 | 0xaa,0xa5,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x55,0xaa,0x96,0xbf, 357 | 0xfe,0xaa,0xaa,0xaa,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x6a,0xa6, 358 | 0x55,0x96,0x55,0x55,0x55,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x45,0x55, 359 | 0x55,0x55,0x55,0x55,0x55,0x55,0x9a,0x6a,0xa6,0x99,0xa9,0xa6,0x6a,0xa5,0xa0,0x40, 360 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x65,0x5a,0x96,0xbf,0xfe,0xaa,0xaa,0xaa, 361 | 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x2a,0xaa,0x99,0x99,0x55,0x59,0x59, 362 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x55,0x55,0x55,0x55,0x55,0x55, 363 | 0x96,0x65,0x66,0xa9,0x99,0xaa,0x66,0xaa,0x9a,0xa9,0x68,0x00,0x00,0x00,0x00,0x00, 364 | 0x00,0x00,0x00,0x41,0x95,0x66,0x95,0xbf,0xfe,0xaa,0xaa,0xaa,0x01,0x00,0x00,0x00, 365 | 0x00,0x00,0x00,0x00,0x00,0x2a,0x6a,0x99,0x95,0x99,0x55,0x55,0x95,0x95,0x55,0x55, 366 | 0x55,0x55,0x55,0x55,0x51,0x44,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x9a,0x9a, 367 | 0xa9,0xa9,0xaa,0x66,0x66,0xa9,0x68,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 368 | 0x65,0x5a,0xa5,0xbf,0xfe,0xaa,0xa6,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 369 | 0x04,0x6a,0xaa,0x99,0x66,0x55,0x99,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 370 | 0x55,0x10,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x96,0x99,0xaa,0x9a,0x6a,0x6a,0xa9, 371 | 0xa6,0xa9,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95,0x56,0xa5,0xbf, 372 | 0xfa,0xaa,0xa2,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x99, 373 | 0x99,0x65,0x56,0x56,0x66,0x56,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x40,0x04,0x55, 374 | 0x55,0x55,0x55,0x55,0x56,0x6a,0x66,0xa9,0xa9,0x9a,0x99,0x9a,0x9a,0xaa,0x5a,0x04, 375 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x0a,0xa5,0xaf,0xfa,0xaa,0xaa,0xa9, 376 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xa9,0xaa,0x6a,0x56,0x59,0x95,0x65, 377 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x55,0x55,0x55,0x55,0x55, 378 | 0x65,0x99,0xa6,0x6a,0xa6,0x9a,0x9a,0xa6,0x66,0xaa,0x5a,0x00,0x00,0x00,0x00,0x00, 379 | 0x00,0x00,0x00,0x00,0x55,0xaa,0xa5,0x6f,0xfa,0xaa,0xae,0xa9,0x04,0x00,0x00,0x00, 380 | 0x00,0x00,0x00,0x00,0x01,0xaa,0xaa,0xa5,0x99,0x95,0x65,0x95,0x96,0x65,0x55,0x55, 381 | 0x55,0x55,0x55,0x55,0x55,0x50,0x45,0x55,0x55,0x55,0x95,0x55,0x59,0x9a,0x6a,0x9a, 382 | 0xa9,0xa6,0x69,0x99,0x99,0xaa,0x56,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 383 | 0x55,0xb9,0xa9,0x6f,0xfa,0xaa,0xaa,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 384 | 0x42,0xaa,0xaa,0x69,0x99,0x59,0x96,0x59,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 385 | 0x51,0x00,0x04,0x55,0x55,0x55,0x59,0x65,0x66,0xa6,0xa6,0x6a,0x6a,0x66,0x9a,0x9a, 386 | 0x69,0xaa,0x96,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x25,0x56,0xa9,0x6f, 387 | 0xfa,0xaa,0xaa,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xaa,0xa9,0x99, 388 | 0xa6,0x56,0x66,0x65,0x95,0x95,0x65,0x65,0x55,0x55,0x55,0x55,0x55,0x10,0x01,0x55, 389 | 0x55,0x55,0x55,0x56,0x5a,0x69,0x9a,0xa6,0xa9,0x99,0xa6,0x66,0x65,0x6a,0x96,0x81, 390 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0xa9,0x6f,0xfa,0xaa,0xaa,0xa8, 391 | 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xaa,0xaa,0xa6,0x66,0x66,0x59,0x66, 392 | 0x59,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x51,0x00,0x11,0x55,0x45,0x55,0x96,0x96, 393 | 0x96,0x9a,0xa6,0x5a,0x6a,0x65,0xa5,0xa5,0x99,0x6a,0x96,0x80,0x00,0x00,0x00,0x00, 394 | 0x00,0x00,0x00,0x00,0x19,0x56,0xa9,0x6b,0xea,0xaa,0xaa,0xa4,0x00,0x00,0x00,0x00, 395 | 0x00,0x00,0x00,0x00,0x06,0xaa,0xa6,0x9a,0x66,0x66,0x69,0x9a,0x66,0x65,0x95,0x95, 396 | 0x95,0x55,0x55,0x55,0x55,0x51,0x05,0x55,0x55,0x55,0x55,0x69,0xaa,0xa6,0xa6,0xaa, 397 | 0xa6,0x99,0x59,0x99,0x96,0x56,0xa5,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 398 | 0x15,0x55,0x69,0x6b,0xea,0xaa,0xaa,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 399 | 0x0a,0xaa,0xaa,0x66,0x69,0xa9,0xa9,0xa9,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 400 | 0x55,0x50,0x55,0x55,0x55,0x55,0x6a,0x6a,0xa5,0xa6,0x69,0x96,0x9a,0x96,0x65,0x96, 401 | 0x59,0x9a,0xa5,0xa0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x19,0x56,0xa9,0x5b, 402 | 0xea,0xaa,0xaa,0xa4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xaa,0xa6,0x69, 403 | 0xa9,0xa6,0x66,0x69,0x99,0x96,0x55,0x96,0x55,0x55,0x55,0x55,0x55,0x40,0x45,0x55, 404 | 0x55,0x55,0x56,0x6a,0x6a,0x6a,0x99,0xa9,0x69,0x99,0x59,0x99,0x65,0x56,0xa5,0xa0, 405 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x69,0x5b,0xea,0xaa,0xaa,0xa0, 406 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0a,0xaa,0xaa,0xa6,0x66,0xa6,0x99,0xa6, 407 | 0xa9,0x59,0x59,0x55,0x59,0x55,0x55,0x55,0x54,0x40,0x15,0x55,0x55,0x55,0x9a,0xaa, 408 | 0xaa,0x69,0x9a,0x65,0xa6,0x96,0x59,0x59,0x96,0x56,0xa5,0xa0,0x10,0x00,0x00,0x00, 409 | 0x00,0x00,0x00,0x00,0x09,0x55,0xa9,0x5b,0xea,0xaa,0xaa,0xa0,0x00,0x00,0x00,0x00, 410 | 0x00,0x00,0x00,0x00,0x1a,0xaa,0xa9,0x99,0xaa,0x6a,0x6a,0x6a,0x66,0x59,0x56,0x59, 411 | 0x95,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x66,0xa6,0x96,0x9a,0x56,0x65, 412 | 0x65,0x95,0x95,0x65,0x55,0x99,0xa5,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 413 | 0x05,0x55,0x6a,0x5b,0xea,0xaa,0x2a,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 414 | 0x2a,0xaa,0xaa,0xaa,0x66,0x66,0x99,0xa6,0xa6,0x69,0x65,0x65,0x59,0x55,0x55,0x55, 415 | 0x55,0x50,0x55,0x55,0x55,0x55,0x69,0xaa,0xaa,0x5a,0x66,0x65,0x99,0x65,0x56,0x56, 416 | 0x65,0x55,0xa9,0x64,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x06,0x50,0xaa,0x5b, 417 | 0xea,0xaa,0x2a,0xa0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0xaa,0x9a,0x99, 418 | 0xa9,0xa9,0xaa,0xaa,0x66,0x69,0x96,0x65,0x95,0x95,0x55,0x55,0x55,0x54,0x55,0x55, 419 | 0x56,0x59,0x99,0xaa,0xa6,0x96,0x56,0x56,0x5a,0x69,0x55,0x65,0x55,0x56,0x69,0x68, 420 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x58,0x9a,0x5b,0xea,0xaa,0xea,0xa0, 421 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x2a,0xaa,0xaa,0x6a,0x9a,0x6a,0x66,0x9a, 422 | 0xa9,0xa5,0xa5,0x9a,0x59,0x55,0x55,0x55,0x55,0x40,0x55,0x55,0x96,0x66,0x59,0xa6, 423 | 0xa6,0x96,0x59,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0xa9,0x68,0x10,0x00,0x00,0x00, 424 | 0x00,0x00,0x00,0x00,0x05,0x5b,0xaa,0x5b,0xea,0xaa,0xaa,0x90,0x10,0x00,0x00,0x00, 425 | 0x00,0x00,0x00,0x00,0x2a,0xaa,0x9a,0x99,0xa9,0xa6,0xa9,0xaa,0x99,0xaa,0x9a,0x9a, 426 | 0x6a,0x65,0x65,0x55,0x55,0x54,0x15,0x55,0x66,0xa9,0xa6,0x69,0xa9,0x95,0x95,0x99, 427 | 0x59,0x65,0x55,0x55,0x55,0x55,0x69,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 428 | 0x05,0x5a,0x9a,0x5a,0xea,0xaa,0xaa,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 429 | 0x2a,0xaa,0xa9,0xaa,0x9a,0x66,0x6a,0x9a,0xa6,0xa6,0xa6,0x99,0xaa,0x56,0x55,0x55, 430 | 0x55,0x50,0x55,0x55,0x6a,0xaa,0x56,0x5a,0x65,0x95,0x95,0x55,0x55,0x55,0x55,0x55, 431 | 0x55,0x55,0x69,0x58,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x6a,0x56, 432 | 0xaa,0xaa,0xaa,0x90,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x2a,0xaa,0xaa,0x99, 433 | 0xa6,0xaa,0xaa,0xaa,0x99,0x9a,0x66,0x6a,0x69,0x96,0x95,0x55,0x55,0x50,0x55,0x55, 434 | 0x9a,0xa9,0xa5,0xa5,0x99,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x58, 435 | 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x05,0x55,0x5a,0x5a,0xaa,0xaa,0xaa,0x90, 436 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x6a,0xaa,0xa6,0xaa,0xa6,0x66,0x9a,0xaa, 437 | 0xa6,0xa6,0x9a,0x69,0xa6,0x9a,0x55,0x65,0x55,0x55,0x55,0x56,0x6a,0xaa,0x65,0x59, 438 | 0x99,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x69,0x59,0x00,0x00,0x00,0x00, 439 | 0x00,0x00,0x00,0x10,0x05,0x55,0x6a,0x56,0xaa,0xaa,0xaa,0x90,0xb4,0x00,0x00,0x00, 440 | 0x00,0x00,0x07,0x84,0x6a,0xaa,0x6a,0x99,0x9a,0xa9,0xaa,0x6a,0x6a,0x99,0xaa,0xaa, 441 | 0xaa,0x6a,0x65,0x96,0x55,0x55,0x55,0x56,0xaa,0xa9,0x55,0x55,0x55,0x55,0x55,0x55, 442 | 0x55,0x55,0x51,0x45,0x45,0x15,0x59,0x59,0x12,0x80,0x00,0x00,0x00,0x00,0x00,0x0a, 443 | 0x01,0x55,0x5a,0x56,0xaa,0xaa,0xaa,0x90,0xbf,0x90,0x00,0x00,0x00,0x06,0xbf,0x84, 444 | 0xaa,0xaa,0xaa,0x6a,0x99,0x9a,0x9a,0xaa,0xa6,0xaa,0x9a,0x69,0xa9,0xaa,0x66,0x59, 445 | 0x55,0x50,0x55,0xa9,0x99,0xa6,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x55, 446 | 0x55,0x55,0x59,0x59,0x12,0xea,0xaa,0xaa,0xaa,0xaa,0xaa,0xbe,0x05,0x55,0x66,0x56, 447 | 0xaa,0xaa,0xaa,0x80,0xa4,0xaf,0xa0,0x00,0x1a,0xff,0xff,0x84,0xaa,0xaa,0xa6,0x99, 448 | 0xa6,0xa6,0x6a,0xaa,0x6a,0x99,0xaa,0xaa,0xaa,0x6a,0xaa,0x9a,0x65,0x55,0x56,0xaa, 449 | 0x95,0x65,0x55,0x55,0x55,0x54,0x55,0x54,0x55,0x55,0x44,0x55,0x55,0x45,0x56,0x5a, 450 | 0x12,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x01,0x55,0x5a,0x56,0xaa,0xa0,0x0a,0x80, 451 | 0x00,0x00,0xaa,0xab,0xff,0xe8,0x02,0x40,0xaa,0xaa,0x6a,0x6a,0x69,0xaa,0xa6,0x69, 452 | 0xa6,0x6a,0x69,0xa9,0xa9,0xa9,0x9a,0xaa,0x95,0x55,0x59,0xa5,0x55,0x55,0x55,0x15, 453 | 0x55,0x55,0x51,0x45,0x51,0x55,0x55,0x51,0x51,0x55,0x59,0x5a,0x16,0x80,0x00,0x00, 454 | 0x00,0x00,0x00,0x0a,0x05,0x40,0x2a,0x56,0xaa,0xa0,0x0a,0x80,0x65,0x02,0xaf,0xff, 455 | 0xe4,0x00,0x00,0x04,0xaa,0xaa,0xa9,0xa6,0xa6,0x66,0x6a,0xaa,0x9a,0xa6,0x9a,0xa9, 456 | 0xaa,0x6a,0xa6,0xaa,0x99,0x94,0x69,0x55,0x54,0x55,0x45,0x54,0x55,0x55,0x15,0x55, 457 | 0x15,0x45,0x14,0x55,0x55,0x51,0x56,0x5a,0x16,0x90,0x00,0x00,0x00,0x00,0x00,0x5a, 458 | 0x01,0x40,0x2a,0x56,0xaa,0xa0,0x2a,0x80,0xba,0xbf,0xfe,0x80,0x2a,0xa0,0x02,0x50, 459 | 0xaa,0xaa,0x6a,0x69,0x9a,0x9a,0x9a,0x6a,0x66,0x6a,0x69,0xa6,0xa9,0xa9,0xaa,0x6a, 460 | 0x65,0xa5,0x15,0x55,0x15,0x55,0x15,0x15,0x55,0x54,0x51,0x45,0x51,0x55,0x51,0x45, 461 | 0x51,0x15,0x56,0x5a,0x16,0xfa,0xaa,0xaa,0xaa,0xaa,0xaa,0xbe,0x01,0x40,0xaa,0x56, 462 | 0xaa,0xa0,0xaa,0x80,0xbf,0xfa,0x00,0x00,0x00,0x2a,0xab,0x94,0xaa,0xaa,0xa9,0x9a, 463 | 0x99,0xa6,0x6a,0xa6,0x9a,0x9a,0xa9,0xaa,0x6a,0x6a,0x9a,0x6a,0x95,0x51,0x44,0x15, 464 | 0x54,0x45,0x54,0x51,0x45,0x45,0x15,0x55,0x15,0x45,0x14,0x54,0x55,0x51,0x56,0x5a, 465 | 0x16,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x01,0x42,0xaa,0x56,0xaa,0xaa,0xaa,0x80, 466 | 0xbe,0x00,0x00,0x04,0x00,0x00,0x2f,0x94,0xaa,0xaa,0x6a,0x69,0x9a,0x69,0x9a,0x6a, 467 | 0x66,0x69,0x69,0xa5,0xa9,0xa9,0x9a,0x6a,0x55,0x45,0x55,0x11,0x11,0x15,0x45,0x11, 468 | 0x55,0x55,0x54,0x51,0x51,0x15,0x51,0x45,0x51,0x15,0x56,0x5a,0x16,0xc0,0x00,0x00, 469 | 0x00,0x00,0x00,0x0a,0x05,0x4a,0xaa,0x56,0xaa,0xaa,0xaa,0x80,0xa0,0x00,0x00,0x00, 470 | 0x00,0x00,0x02,0x94,0xaa,0xaa,0x9a,0x6a,0xa9,0x9a,0xa6,0xa6,0xa6,0x9a,0xa9,0xa9, 471 | 0x99,0x99,0x96,0x59,0x55,0x55,0x55,0x51,0x10,0x04,0x04,0x11,0x55,0x55,0x11,0x55, 472 | 0x15,0x55,0x14,0x55,0x15,0x54,0x56,0x5a,0x12,0x80,0x00,0x00,0x00,0x00,0x00,0x5a, 473 | 0x01,0x6a,0xaa,0x56,0xaa,0xaf,0xfe,0x90,0xb5,0x00,0x00,0x00,0x00,0x00,0x03,0x94, 474 | 0xaa,0xaa,0x69,0xa9,0x9a,0x99,0xaa,0x6a,0x5a,0x59,0x59,0xa5,0x69,0x66,0x55,0x55, 475 | 0x51,0x55,0x55,0x54,0x40,0x44,0x10,0x10,0x55,0x54,0x54,0x51,0x51,0x45,0x51,0x45, 476 | 0x51,0x15,0x56,0x5a,0x16,0xea,0xaa,0xaa,0xaa,0xaa,0xaa,0xbe,0x05,0x7f,0xfa,0x56, 477 | 0xaa,0xaa,0xaa,0x80,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xaa,0xaa,0xaa,0x6a, 478 | 0x99,0x99,0x9a,0x69,0xa6,0x59,0x99,0xa9,0x99,0x96,0x55,0x55,0x50,0x59,0x96,0x55, 479 | 0x45,0x10,0x04,0x11,0x11,0x44,0x51,0x55,0x14,0x55,0x14,0x51,0x55,0x44,0x59,0x59, 480 | 0x12,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x01,0x55,0x56,0x56,0xaa,0xaa,0xaa,0x90, 481 | 0xba,0xaa,0xaa,0xaa,0xaa,0xaa,0xab,0x84,0x6a,0xaa,0x69,0x69,0x99,0x99,0x9a,0x69, 482 | 0x96,0x56,0x59,0x65,0x56,0x55,0x55,0x55,0x55,0x56,0x59,0x55,0x51,0x10,0x10,0x10, 483 | 0x44,0x14,0x44,0x41,0x51,0x45,0x51,0x55,0x51,0x55,0x55,0x59,0x12,0x80,0x00,0x00, 484 | 0x00,0x00,0x00,0x0a,0x05,0x55,0x5a,0x56,0xaa,0xaa,0xaa,0x90,0x60,0x00,0x00,0x00, 485 | 0x00,0x00,0x02,0x44,0x6a,0xaa,0xaa,0x9a,0x95,0x96,0x59,0x99,0x99,0x99,0x5a,0x65, 486 | 0x59,0x55,0x55,0x55,0x55,0x56,0x65,0x55,0x45,0x44,0x14,0x41,0x11,0x14,0x40,0x51, 487 | 0x11,0x14,0x44,0x45,0x55,0x14,0x59,0x59,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 488 | 0x01,0x55,0x66,0x56,0xaa,0xaa,0x9a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 489 | 0x6a,0xaa,0x66,0x59,0x99,0x99,0x9a,0x69,0x95,0x96,0x55,0x65,0x55,0x55,0x55,0x51, 490 | 0x55,0x59,0x55,0x65,0x54,0x51,0x50,0x41,0x11,0x10,0x44,0x10,0x41,0x05,0x11,0x45, 491 | 0x54,0x55,0x55,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x05,0x55,0x5a,0x56, 492 | 0xaa,0xaa,0xaa,0x90,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x2a,0xaa,0x69,0x99, 493 | 0x95,0x65,0x99,0x9a,0x96,0x65,0x96,0x59,0x55,0x55,0x55,0x44,0x55,0x55,0x56,0x55, 494 | 0x55,0x44,0x54,0x44,0x11,0x10,0x41,0x11,0x11,0x10,0x10,0x45,0x44,0x44,0x59,0x58, 495 | 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x66,0x5a,0xea,0xaa,0xaa,0x90, 496 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x2a,0xaa,0x9a,0x59,0x96,0x59,0x56,0x59, 497 | 0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x59,0x99,0x56,0x51,0x51,0x45,0x55, 498 | 0x51,0x51,0x44,0x01,0x11,0x14,0x41,0x11,0x14,0x55,0x59,0x58,0x10,0x00,0x00,0x00, 499 | 0x00,0x00,0x00,0x04,0x05,0x55,0x5a,0x56,0xea,0xaa,0x6a,0x90,0x10,0x00,0x00,0x00, 500 | 0x00,0x00,0x00,0x00,0x2a,0xaa,0x66,0x55,0x55,0x65,0x99,0x99,0x95,0x99,0x55,0x55, 501 | 0x55,0x55,0x54,0x45,0x55,0x55,0x55,0x65,0x55,0x45,0x51,0x11,0x44,0x51,0x40,0x44, 502 | 0x40,0x00,0x11,0x05,0x44,0x04,0x59,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 503 | 0x05,0x55,0x66,0x57,0xea,0xaa,0x2a,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 504 | 0x2a,0x6a,0x99,0x59,0x96,0x65,0x56,0x59,0x65,0x55,0x55,0x55,0x55,0x55,0x04,0x05, 505 | 0x55,0x55,0x56,0x55,0x55,0x55,0x15,0x45,0x55,0x45,0x11,0x00,0x44,0x50,0x41,0x11, 506 | 0x01,0x45,0x59,0x68,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x50,0x9a,0x57, 507 | 0xea,0xaa,0xaa,0xa0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0xaa,0x99,0x96, 508 | 0x65,0x59,0x99,0x65,0x95,0x55,0x55,0x55,0x55,0x55,0x41,0x45,0x55,0x96,0x65,0x55, 509 | 0x55,0x55,0x54,0x55,0x51,0x55,0x44,0x44,0x44,0x10,0x41,0x04,0x44,0x11,0x55,0x64, 510 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x5a,0x9a,0x5b,0xea,0xaa,0xea,0xa0, 511 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1a,0x6a,0x96,0x59,0x95,0x95,0x55,0x96, 512 | 0x59,0x55,0x55,0x55,0x55,0x54,0x10,0x55,0x55,0x59,0x55,0x55,0x55,0x55,0x51,0x45, 513 | 0x55,0x45,0x44,0x44,0x44,0x41,0x01,0x10,0x11,0x11,0x55,0x64,0x40,0x00,0x00,0x00, 514 | 0x00,0x00,0x00,0x04,0x05,0x5b,0x99,0x5b,0xea,0xaa,0x9a,0xa0,0x10,0x00,0x00,0x00, 515 | 0x00,0x00,0x00,0x00,0x0a,0xaa,0x99,0x65,0x59,0x55,0x96,0x55,0x95,0x55,0x55,0x55, 516 | 0x55,0x15,0x45,0x15,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x55,0x45,0x55,0x55,0x11, 517 | 0x44,0x40,0x40,0x11,0x10,0x45,0x65,0x60,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 518 | 0x05,0x55,0x59,0x5b,0xea,0xaa,0xaa,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 519 | 0x0a,0x9a,0x99,0x96,0x65,0x59,0x55,0x65,0x55,0x55,0x55,0x55,0x54,0x41,0x51,0x55, 520 | 0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x54,0x55,0x54,0x54,0x45,0x11,0x44,0x04,0x45, 521 | 0x01,0x11,0x65,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x15,0x55,0x65,0x5b, 522 | 0xea,0xaa,0xa6,0xa4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x6a,0xa5,0x65, 523 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x10,0x15,0x55,0x55,0x55,0x55,0x55, 524 | 0x55,0x55,0x55,0x55,0x14,0x55,0x54,0x51,0x11,0x44,0x44,0x44,0x44,0x45,0x65,0xa0, 525 | 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x59,0x5b,0xea,0xaa,0xaa,0xa4, 526 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0a,0xaa,0x96,0x59,0x99,0x55,0x55,0x55, 527 | 0x55,0x55,0x55,0x55,0x45,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x65,0x55,0x55, 528 | 0x55,0x54,0x51,0x55,0x55,0x11,0x11,0x11,0x04,0x45,0x55,0x90,0x00,0x00,0x00,0x00, 529 | 0x00,0x00,0x00,0x10,0x15,0x55,0x69,0x5b,0xfa,0xaa,0x9a,0xa8,0x04,0x00,0x00,0x00, 530 | 0x00,0x00,0x00,0x00,0x06,0x9a,0xa5,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x51, 531 | 0x41,0x41,0x15,0x55,0x55,0x55,0x59,0x66,0x55,0x55,0x95,0x55,0x55,0x45,0x54,0x44, 532 | 0x45,0x51,0x11,0x44,0x44,0x45,0x55,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 533 | 0x15,0x55,0x69,0x6b,0xfa,0xaa,0xa6,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 534 | 0x42,0xa6,0xa5,0x59,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x50,0x54,0x15,0x55, 535 | 0x55,0x99,0x95,0x95,0x59,0x55,0x55,0x55,0x55,0x55,0x45,0x55,0x55,0x14,0x51,0x11, 536 | 0x11,0x15,0x95,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x15,0x55,0x95,0x5f, 537 | 0xfa,0xaa,0xa9,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x9a,0xa5,0x95, 538 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x14,0x05,0x55,0x55,0x55,0x55,0x65,0x55, 539 | 0x95,0x55,0x65,0x55,0x55,0x44,0x54,0x51,0x14,0x54,0x45,0x45,0x44,0x45,0x56,0x80, 540 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x65,0x6f,0xfa,0x6a,0xaa,0xa8, 541 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xa6,0xa9,0x59,0x55,0x55,0x55,0x55, 542 | 0x55,0x55,0x55,0x40,0x04,0x05,0x55,0x55,0x56,0x65,0x56,0x66,0x55,0x99,0x55,0x55, 543 | 0x55,0x55,0x45,0x55,0x55,0x45,0x55,0x51,0x11,0x55,0x56,0x44,0x00,0x00,0x00,0x00, 544 | 0x00,0x00,0x00,0x10,0x15,0x55,0x95,0x6f,0xfa,0xaa,0x92,0xa9,0x01,0x00,0x00,0x00, 545 | 0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x11, 546 | 0x11,0x45,0x55,0x55,0x55,0x59,0x99,0x55,0x59,0x55,0x95,0x55,0x55,0x55,0x14,0x54, 547 | 0x51,0x54,0x45,0x44,0x45,0x16,0x56,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 548 | 0x55,0x45,0x65,0x6f,0xfa,0xaa,0xa2,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 549 | 0x10,0xa6,0xa9,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x40,0x10,0x51,0x55,0x55, 550 | 0x55,0x55,0x55,0x55,0x55,0x99,0x56,0x56,0x55,0x55,0x55,0x55,0x55,0x11,0x55,0x55, 551 | 0x51,0x55,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x49,0xa5,0x6f, 552 | 0xfe,0xaa,0xae,0xaa,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0xa9,0x55, 553 | 0x55,0x55,0x55,0x55,0x55,0x55,0x44,0x10,0x45,0x15,0x55,0x55,0x55,0x55,0x55,0x95, 554 | 0x66,0x55,0x55,0x55,0x55,0x55,0x15,0x51,0x51,0x55,0x14,0x45,0x14,0x59,0x59,0x04, 555 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xb9,0xa5,0x7f,0xfe,0x9a,0xaa,0xaa, 556 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x2a,0x6a,0x55,0x55,0x55,0x55,0x55, 557 | 0x55,0x54,0x41,0x51,0x11,0x45,0x55,0x55,0x65,0x55,0x55,0x59,0x95,0x55,0x99,0x65, 558 | 0x55,0x55,0x54,0x55,0x55,0x11,0x55,0x55,0x55,0x59,0x68,0x00,0x00,0x00,0x00,0x00, 559 | 0x00,0x00,0x00,0x41,0x55,0x69,0x95,0xbf,0xfe,0xaa,0xa6,0x9a,0x40,0x40,0x00,0x00, 560 | 0x00,0x00,0x00,0x00,0x04,0x29,0x6a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x10,0x04, 561 | 0x04,0x55,0x55,0x55,0x56,0x69,0x66,0x65,0x55,0x95,0x55,0x59,0x55,0x55,0x55,0x55, 562 | 0x11,0x54,0x55,0x15,0x45,0x55,0x68,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 563 | 0x55,0x55,0x95,0xbf,0xfe,0xaa,0xa9,0xaa,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 564 | 0x01,0x0a,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x04,0x05,0x51,0x55,0x55,0x55, 565 | 0x55,0x56,0x55,0x55,0x55,0x56,0x66,0x55,0x95,0x55,0x55,0x55,0x55,0x15,0x51,0x51, 566 | 0x55,0x65,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x55,0x56,0x95,0xbf, 567 | 0xff,0xaa,0xaa,0x66,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x0a,0x5a,0x95, 568 | 0x55,0x55,0x55,0x55,0x45,0x51,0x10,0x11,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x59, 569 | 0x65,0x65,0x55,0x95,0x55,0x55,0x55,0x54,0x51,0x45,0x54,0x55,0x15,0x55,0xa0,0x10, 570 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x56,0x95,0xbf,0xff,0xa6,0xaa,0x6a, 571 | 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x46,0x96,0x95,0x55,0x55,0x55,0x55, 572 | 0x45,0x44,0x44,0x41,0x55,0x55,0x55,0x55,0x56,0x55,0x99,0x95,0x56,0x59,0x99,0x59, 573 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x91,0x00,0x00,0x00,0x00,0x00, 574 | 0x00,0x00,0x04,0x01,0x55,0x59,0x56,0xff,0xff,0xaa,0xa9,0xa6,0x90,0x10,0x00,0x00, 575 | 0x00,0x00,0x00,0x02,0xf9,0x42,0x96,0xa5,0x55,0x55,0x55,0x54,0x44,0x54,0x11,0x11, 576 | 0x15,0x55,0x55,0x55,0x55,0x59,0x55,0x56,0x65,0x55,0x56,0x55,0x55,0x55,0x55,0x51, 577 | 0x44,0x45,0x11,0x45,0x56,0x56,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 578 | 0x55,0x56,0x56,0xff,0xff,0xaa,0xaa,0x5a,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x1b, 579 | 0xe8,0x51,0xa5,0xa5,0x55,0x55,0x55,0x51,0x10,0x11,0x04,0x45,0x15,0x55,0x55,0x55, 580 | 0x59,0x55,0x96,0x55,0x55,0x99,0x95,0x65,0x55,0x95,0x55,0x55,0x55,0x55,0x55,0x54, 581 | 0x56,0x56,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x55,0x5a,0x56,0xff, 582 | 0xff,0xe6,0xaa,0xa9,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x09,0x10,0xa5,0xa5, 583 | 0x55,0x55,0x55,0x15,0x11,0x04,0x41,0x51,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59, 584 | 0x99,0x55,0x56,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x51,0x45,0x59,0x5a,0x04,0xa0, 585 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x59,0x5a,0xff,0xff,0xe9,0xaa,0x56, 586 | 0xa4,0x04,0x00,0x00,0x00,0x00,0x0b,0xe0,0x0a,0x50,0x69,0x65,0x55,0x55,0x55,0x14, 587 | 0x00,0x01,0x10,0x55,0x55,0x55,0x55,0x55,0x56,0x59,0x99,0x95,0x56,0x59,0x95,0x55, 588 | 0x55,0x55,0x65,0x55,0x15,0x54,0x55,0x55,0x59,0x59,0x10,0xe0,0x00,0x00,0x00,0x00, 589 | 0x00,0x00,0x10,0x15,0x51,0x59,0x5b,0xff,0xff,0xea,0xaa,0x4a,0xa8,0x00,0x00,0x00, 590 | 0x00,0x00,0x7e,0x00,0x2f,0x94,0x29,0x59,0x55,0x55,0x55,0x41,0x10,0x00,0x51,0x15, 591 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x65,0x95,0x55,0x55,0x65,0x65,0x55,0x55, 592 | 0x55,0x55,0x14,0x55,0x65,0x68,0x12,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15, 593 | 0x42,0x69,0x5b,0xff,0xff,0xea,0x6a,0xaa,0xa8,0x01,0x00,0x00,0x00,0x06,0xe0,0x01, 594 | 0xfe,0xd5,0x1a,0x59,0x55,0x55,0x54,0x40,0x40,0x10,0x15,0x55,0x55,0x55,0x55,0x55, 595 | 0x65,0x99,0x99,0x55,0x56,0x59,0x55,0x56,0x56,0x55,0x55,0x55,0x55,0x45,0x55,0x55, 596 | 0xa5,0x64,0x42,0x6f,0x80,0x00,0x00,0x00,0x00,0x00,0x10,0x15,0x6a,0x69,0x5b,0xff, 597 | 0xff,0xf9,0xaa,0xb9,0xa9,0x00,0x00,0x00,0x00,0x2f,0x40,0x0b,0xd0,0xa5,0x0a,0x56, 598 | 0x55,0x55,0x45,0x14,0x01,0x01,0x05,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x99, 599 | 0x99,0x55,0x65,0x55,0x55,0x59,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0xa0,0x10,0x02, 600 | 0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x6a,0x65,0x6f,0xff,0xff,0xfa,0xaa,0xa6, 601 | 0xa9,0x00,0x00,0x00,0x02,0xf8,0x00,0xbe,0x02,0xf8,0x42,0x96,0x95,0x55,0x44,0x40, 602 | 0x04,0x01,0x11,0x55,0x55,0x55,0x55,0x55,0x56,0x66,0x66,0x55,0x55,0x55,0x55,0x95, 603 | 0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x56,0x81,0x00,0x00,0x3e,0x00,0x00,0x00, 604 | 0x00,0x00,0x40,0x55,0x55,0xa5,0x6f,0xff,0xff,0xfa,0x6a,0x99,0x9a,0x41,0x00,0x00, 605 | 0x1f,0x80,0x0b,0xe0,0x1b,0xe8,0x41,0x95,0x95,0x55,0x55,0x04,0x00,0x44,0x44,0x55, 606 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x55,0x56,0x55,0x65,0x65,0x55, 607 | 0x55,0x55,0x55,0x5a,0x56,0x40,0x80,0x10,0x0b,0xe0,0x00,0x00,0x00,0x00,0x00,0x55, 608 | 0x56,0x65,0x6f,0xff,0xff,0xfe,0x9a,0xa9,0xa6,0x40,0x04,0x01,0xbc,0x00,0x6e,0x00, 609 | 0xbd,0x00,0x10,0xa5,0x65,0x45,0x10,0x51,0x00,0x10,0x15,0x55,0x55,0x55,0x55,0x55, 610 | 0x99,0x65,0x59,0x65,0x95,0x55,0x65,0x55,0x59,0x55,0x55,0x55,0x55,0x55,0x56,0x69, 611 | 0x5a,0x04,0xb8,0x00,0x00,0xbe,0x00,0x00,0x00,0x01,0x01,0x55,0x55,0x95,0xbf,0xff, 612 | 0xff,0xfe,0x9a,0xa6,0x5a,0x80,0x40,0x0b,0xe0,0x02,0xf4,0x0b,0xe0,0x00,0x10,0x29, 613 | 0x59,0x54,0x44,0x04,0x10,0x41,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55, 614 | 0x55,0x59,0x55,0x95,0x65,0x56,0x55,0x55,0x55,0x55,0x55,0x65,0x68,0x10,0x0f,0x90, 615 | 0x00,0x0b,0x80,0x00,0x00,0x00,0x01,0x55,0x56,0x95,0xbf,0xff,0xff,0xfe,0xaa,0xa9, 616 | 0x99,0x90,0x10,0xbe,0x00,0x2f,0x80,0xbe,0x00,0x00,0x04,0x19,0x59,0x51,0x44,0x44, 617 | 0x41,0x14,0x51,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59, 618 | 0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x95,0x64,0x10,0x02,0xfe,0x00,0x00,0xf8,0x00, 619 | 0x00,0x04,0x05,0x55,0x59,0x95,0xbf,0xff,0xff,0xff,0x9a,0xa9,0x99,0xa0,0x2f,0xe0, 620 | 0x02,0xf8,0x06,0xe0,0x00,0x00,0x60,0x0a,0x56,0x55,0x11,0x00,0x44,0x01,0x55,0x55, 621 | 0x55,0x55,0x55,0x55,0x59,0x55,0x96,0x66,0x55,0x55,0x95,0x56,0x59,0x65,0x55,0x55, 622 | 0x55,0x55,0x66,0x95,0xa0,0x40,0x00,0x7f,0xe8,0x00,0x2f,0x80,0x00,0x00,0x05,0x55, 623 | 0x56,0x56,0xff,0xff,0xff,0xff,0xa6,0xaa,0x59,0xa4,0x1f,0x80,0x1b,0xc0,0x2f,0x40, 624 | 0x00,0x0b,0x80,0x42,0x95,0x95,0x11,0x11,0x11,0x44,0x55,0x55,0x55,0x55,0x55,0x55, 625 | 0x55,0x95,0x55,0x55,0x55,0x59,0x59,0x95,0x55,0x55,0x55,0x95,0x55,0x55,0x9a,0x56, 626 | 0x80,0x40,0x00,0x09,0xbe,0x80,0x02,0xf4,0x01,0x10,0x15,0x55,0x5a,0x56,0xff,0xff, 627 | 0xff,0xff,0xe6,0xaa,0x56,0x64,0x0a,0x14,0xbe,0x02,0xf8,0x00,0x00,0xbe,0x00,0x00, 628 | 0xa5,0x65,0x51,0x14,0x04,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 629 | 0x65,0x95,0x55,0x55,0x59,0x55,0x59,0x55,0x55,0x56,0x69,0x5a,0x01,0x00,0x00,0x02, 630 | 0x8a,0xf9,0x00,0x2e,0x40,0x00,0x15,0x51,0x59,0x5b,0xff,0xff,0xff,0xff,0xe9,0xaa, 631 | 0x49,0xa9,0x02,0x5b,0xe0,0x2f,0x80,0x00,0x2b,0xf0,0x00,0x10,0x69,0x59,0x51,0x15, 632 | 0x15,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x66,0x56,0x55,0x55,0x65,0x65, 633 | 0x55,0x55,0x65,0x55,0x65,0x59,0xa5,0x69,0x00,0x00,0x00,0x00,0xa0,0x2f,0xa0,0x0b, 634 | 0xe6,0x80,0x15,0x42,0x69,0x5b,0xff,0xff,0xff,0xff,0xe9,0x6a,0xa9,0x69,0x02,0xfe, 635 | 0x01,0xbc,0x00,0x02,0xeb,0x80,0x00,0x00,0x19,0x56,0x54,0x51,0x11,0x55,0x55,0x55, 636 | 0x55,0x55,0x55,0x55,0x55,0x66,0x55,0x65,0x55,0x66,0x55,0x56,0x55,0x56,0x55,0x55, 637 | 0x55,0x66,0x95,0x64,0x04,0x00,0x00,0x00,0x0e,0x02,0xfe,0x00,0xbf,0x80,0x55,0x6a, 638 | 0x65,0x6b,0xff,0xff,0xff,0xff,0xf9,0x6a,0xb9,0x5a,0x41,0xf8,0x5b,0xe0,0x00,0x6a, 639 | 0x7e,0x00,0x00,0x01,0x0a,0x55,0x95,0x14,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x56, 640 | 0x65,0x55,0x55,0x55,0x99,0x55,0x59,0x55,0x55,0x99,0x55,0x55,0x99,0xaa,0x55,0xa0, 641 | 0x00,0x00,0x00,0x00,0x02,0x80,0x0b,0xe9,0x6e,0x00,0x55,0x6e,0x65,0x6f,0xff,0xff, 642 | 0xff,0xff,0xfa,0x5a,0xa6,0x66,0x40,0xb5,0xbe,0x00,0x0a,0x92,0xf0,0x00,0x00,0x00, 643 | 0x42,0x95,0x65,0x51,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x96,0x59, 644 | 0x55,0x59,0x55,0x95,0x65,0x55,0x95,0x59,0x55,0xa9,0x56,0x80,0x40,0x00,0x00,0x00, 645 | 0x00,0xa0,0x00,0xbf,0xac,0x01,0x55,0x55,0x65,0x6f,0xff,0xff,0xff,0xff,0xfe,0x5a, 646 | 0xa5,0x59,0x90,0x2f,0xe0,0x00,0xa8,0x0b,0xc0,0x00,0x00,0x00,0x00,0xa5,0x59,0x55, 647 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x65,0x55, 648 | 0x56,0x55,0x56,0x55,0x9a,0xa5,0x5a,0x01,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0b, 649 | 0xf8,0x05,0x55,0x56,0x95,0xbf,0xff,0xff,0xff,0xff,0xfe,0x96,0xa9,0x95,0x90,0x1f, 650 | 0x80,0x2a,0x00,0x2e,0x00,0x00,0x00,0x00,0x10,0x29,0x56,0x54,0x55,0x55,0x55,0x55, 651 | 0x55,0x55,0x55,0x55,0x55,0x66,0x55,0x59,0x55,0x96,0x55,0x55,0x65,0x95,0x55,0x59, 652 | 0x6a,0x95,0x68,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x00,0xe0,0x05,0x55,0x55, 653 | 0x95,0xbf,0xff,0xff,0xff,0xff,0xff,0x96,0xa9,0x59,0xa4,0x0b,0x46,0xe0,0x01,0xf8, 654 | 0x00,0x00,0x00,0x00,0x01,0x0a,0x55,0x95,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55, 655 | 0x95,0x55,0x66,0x55,0x95,0x55,0x55,0x59,0x95,0x59,0x59,0x96,0xaa,0x55,0xa0,0x10, 656 | 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x10,0x80,0x15,0x55,0x5a,0x56,0xff,0xff,0xff, 657 | 0xff,0xff,0xff,0xa5,0xaa,0x55,0x64,0x02,0xbe,0x00,0x0b,0xc0,0x00,0x00,0x00,0x00, 658 | 0x00,0x02,0xa5,0x69,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x96,0x55,0x59, 659 | 0x55,0x55,0x55,0x95,0x55,0x55,0x95,0x66,0xa9,0x56,0x80,0x40,0x00,0x00,0x00,0x00, 660 | 0x00,0x00,0x1a,0x00,0x00,0x15,0x55,0x56,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xe5, 661 | 0xaa,0x54,0x19,0x02,0xe0,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xa9,0x5a, 662 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x59, 663 | 0x56,0x55,0x59,0x9a,0xa5,0x6a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x84, 664 | 0x00,0x54,0x15,0x69,0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,0x6a,0x50,0x26,0x00, 665 | 0x80,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x56,0x95,0x55,0x55,0x55, 666 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x99,0x96,0x55,0x55,0x59,0x65,0xaa, 667 | 0x55,0xa4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0x00,0x50,0x01,0x69, 668 | 0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0x6a,0x40,0x2a,0x40,0x00,0x4b,0xc0,0x00, 669 | 0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x95,0x69,0x55,0x55,0x55,0x55,0x55,0x55,0x56, 670 | 0x56,0x56,0x55,0x55,0x65,0x55,0x55,0x55,0x65,0x65,0x9a,0xa9,0x56,0x90,0x00,0x00, 671 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x50,0x0a,0xa5,0x6f,0xff,0xff,0xff, 672 | 0xff,0xff,0xff,0xfa,0x5a,0x80,0x29,0x90,0x04,0x2e,0x00,0x00,0x00,0x00,0x00,0x00, 673 | 0x00,0x00,0x40,0xa9,0x5a,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x66, 674 | 0x59,0x65,0x55,0x55,0x56,0x56,0x6a,0x95,0x5a,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 675 | 0x00,0x00,0x00,0x00,0x11,0x68,0x2a,0x95,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 676 | 0x56,0xba,0xf9,0x90,0x1a,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x2a, 677 | 0x56,0xa5,0x55,0x55,0x55,0x55,0x55,0x65,0x96,0x59,0x65,0x55,0x55,0x55,0x65,0x66, 678 | 0x65,0x9a,0xaa,0x55,0xa8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 679 | 0x05,0x6f,0xae,0x95,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x96,0xaf,0x95,0x54, 680 | 0x0b,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xa5,0x6a,0x55,0x55, 681 | 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x56,0x6a,0xa5,0x56, 682 | 0x90,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x15,0x56,0xfa,0x56, 683 | 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0xaa,0x55,0x65,0x03,0x80,0x00,0x00, 684 | 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0xaa,0x5a,0xa6,0x55,0x55,0x55,0x55,0x55, 685 | 0x55,0x65,0x55,0x59,0x99,0x59,0x95,0x66,0x66,0xaa,0x95,0x6a,0x00,0x40,0x00,0x00, 686 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0xaa,0x56,0xff,0xff,0xff,0xff, 687 | 0xff,0xff,0xff,0xff,0xa5,0xaa,0x55,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 688 | 0x00,0x00,0x00,0x10,0x1a,0xa5,0xaa,0x65,0x55,0x55,0x55,0x65,0x99,0x55,0x65,0x95, 689 | 0x55,0x95,0x56,0x55,0xaa,0xa9,0x56,0xa4,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 690 | 0x00,0x00,0x01,0x00,0x55,0x55,0x59,0x5a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 691 | 0xe5,0x6a,0x55,0x56,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05, 692 | 0x02,0xaa,0x6a,0xaa,0x55,0x56,0x65,0x55,0x55,0x96,0x55,0x59,0x55,0x59,0x65,0xaa, 693 | 0xaa,0x95,0x5a,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 694 | 0x55,0x55,0xa9,0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0x5a,0x95,0x55, 695 | 0x50,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xe1,0x40,0x2a,0xa9,0xaa, 696 | 0xa9,0x95,0x55,0x99,0x59,0x55,0x56,0x55,0x65,0x95,0x9a,0xaa,0xa9,0x55,0xa9,0x01, 697 | 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x01,0x55,0x55,0x65,0x6f, 698 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x5a,0x95,0x55,0x90,0x00,0x00,0x00, 699 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xae,0x04,0x06,0xaa,0xaa,0xaa,0xaa,0x65,0x55, 700 | 0x95,0x96,0x65,0x65,0x96,0x6a,0xaa,0xaa,0x95,0x6a,0x90,0x10,0x00,0x00,0x00,0x00, 701 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x55,0x56,0x95,0x6f,0xff,0xff,0xff,0xff, 702 | 0xff,0xff,0xff,0xff,0xfe,0x56,0xa5,0x55,0x54,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 703 | 0x00,0x00,0x1e,0x0f,0x91,0x00,0x6a,0xaa,0xaa,0xaa,0xaa,0xaa,0x66,0x65,0x59,0x99, 704 | 0xaa,0xaa,0xaa,0xa5,0x56,0xa9,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 705 | 0x00,0x00,0x40,0x15,0x55,0x56,0x95,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 706 | 0xff,0x95,0xa5,0x05,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x2f, 707 | 0x80,0x40,0x06,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa9,0x55, 708 | 0xaa,0x90,0x04,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 709 | 0x40,0x5a,0x56,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0xa9,0xa9, 710 | 0x55,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x2c,0x00,0x01,0x00,0x2a, 711 | 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x55,0x6a,0xa8,0x00,0x10,0xa0, 712 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x55,0x6a,0x69,0x56,0xff, 713 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0x6a,0xb9,0x55,0x50,0x04,0x00, 714 | 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x78,0x00,0xa0,0x10,0x01,0xaa,0xaa,0xaa,0xaa, 715 | 0xaa,0xaa,0xaa,0xaa,0xa6,0x66,0xaa,0xaa,0x40,0x11,0x00,0x34,0x00,0x00,0x00,0x00, 716 | 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x6e,0x69,0x5b,0xff,0xff,0xff,0xff,0xff, 717 | 0xff,0xff,0xff,0xff,0xff,0xf9,0x5a,0x65,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 718 | 0x00,0x02,0xc0,0xf0,0x00,0xc0,0x00,0x40,0x06,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa6, 719 | 0xaa,0xaa,0xaa,0x90,0x00,0x40,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 720 | 0x00,0x10,0x05,0x55,0x55,0xa5,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 721 | 0xff,0xfa,0x56,0x95,0x55,0x64,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x03,0x82,0xd0, 722 | 0x02,0x80,0x00,0x01,0x00,0x06,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x90,0x00, 723 | 0x44,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55, 724 | 0x56,0x95,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x56,0xa9, 725 | 0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x03,0x80,0x0b,0x40,0x00,0x00, 726 | 0x04,0x00,0x06,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x90,0x00,0x11,0x00,0x00,0x00,0x0b, 727 | 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0x55,0x5a,0x55,0xbf,0xff, 728 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0xa5,0x55,0x56,0x40,0x00, 729 | 0x00,0x00,0x00,0x00,0x00,0x1e,0x0b,0x00,0x2f,0x00,0x00,0x00,0x00,0x10,0x00,0x00, 730 | 0x16,0xaa,0xaa,0x94,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00, 731 | 0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x55,0x66,0x56,0xff,0xff,0xff,0xff,0xff,0xff, 732 | 0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0x6a,0x55,0x55,0x50,0x00,0x00,0x00,0x00,0x00, 733 | 0x00,0x3c,0x1e,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 734 | 0x01,0x11,0x00,0x00,0x00,0x00,0x00,0x02,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 735 | 0x10,0x05,0x55,0x55,0x69,0x5a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 736 | 0xff,0xff,0xe9,0x5a,0x55,0x55,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x2c,0x00, 737 | 0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x14,0x44,0x11,0x04,0x40,0x00,0x00,0x00, 738 | 0x00,0x00,0x00,0x02,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x55,0x55, 739 | 0xa5,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0x56, 740 | 0x95,0x05,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xb8,0x02,0xb8,0x00,0x00,0x00, 741 | 0x00,0x00,0x00,0x00,0x40,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 742 | 0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0x50,0x56,0x95,0x6f,0xff,0xff, 743 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x56,0xa6,0x25,0x55,0x40, 744 | 0x00,0x00,0x00,0x00,0x02,0xc0,0xe0,0x0a,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 745 | 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x80,0x00,0x00, 746 | 0x00,0x00,0x00,0x00,0x01,0x55,0x5a,0x9a,0x55,0xbf,0xff,0xff,0xff,0xff,0xff,0xff, 747 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0xaa,0xe5,0x56,0x50,0x00,0x00,0x00,0x00, 748 | 0x03,0x82,0xd0,0x08,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x80,0x20,0x00, 749 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0xc0,0x00,0x00,0x00,0x00,0x00,0x10, 750 | 0x05,0x55,0x5b,0x99,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 751 | 0xff,0xff,0xff,0xa5,0x6a,0x95,0x55,0x64,0x00,0x00,0x00,0x00,0x0b,0x07,0x80,0x31, 752 | 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0xb0,0x00,0x00,0x00,0x00,0x00, 753 | 0x00,0x00,0x00,0x00,0x20,0xf0,0x00,0x00,0x00,0x00,0x01,0x00,0x15,0x55,0x56,0x69, 754 | 0x5a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9, 755 | 0x5a,0x95,0x55,0x95,0x00,0x00,0x00,0x00,0x1e,0x0b,0x00,0xa2,0xc0,0x00,0x00,0x00, 756 | 0x00,0x00,0x00,0x00,0x0e,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 757 | 0x28,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x55,0xa5,0x6b,0xff,0xff,0xff, 758 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x56,0xa5,0x55,0x59, 759 | 0x40,0x00,0x00,0x00,0x3c,0x2e,0x02,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 760 | 0x0e,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x2e,0x00,0x00, 761 | 0x00,0x00,0x04,0x01,0x55,0x55,0x66,0x95,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 762 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x95,0xa6,0x55,0x56,0x50,0x00,0x00,0x00, 763 | 0xb4,0x2c,0x02,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0xb0,0x00, 764 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x40,0x00,0x00,0x00,0x40,0x05, 765 | 0x55,0x55,0x5a,0x56,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 766 | 0xff,0xff,0xff,0xff,0xa5,0x6a,0x55,0x55,0x94,0x00,0x00,0x00,0xe0,0xb4,0x0c,0x0e, 767 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0xb8,0x00,0x00,0x00,0x00,0x00, 768 | 0x00,0x00,0x00,0x00,0x02,0x03,0xc0,0x00,0x00,0x04,0x00,0x15,0x55,0x56,0x69,0x5a, 769 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 770 | 0xe9,0x5a,0x95,0x05,0x65,0x00,0x00,0x02,0xc0,0xe0,0x24,0x2e,0x00,0x00,0x00,0x00, 771 | 0x00,0x00,0x00,0x00,0x0e,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 772 | 0x02,0x40,0xe0,0x00,0x00,0x00,0x00,0x55,0x50,0x55,0xa5,0x5b,0xff,0xff,0xff,0xff, 773 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0x56,0xa5,0x09, 774 | 0x59,0x90,0x00,0x0b,0x82,0xc0,0xa0,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 775 | 0x0e,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xb8,0x00, 776 | 0x00,0x40,0x05,0x55,0x52,0x5a,0x95,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 777 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x55,0xaa,0xf9,0x56,0x54,0x00,0x7f, 778 | 0x07,0x81,0x80,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0xb8,0x00, 779 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x2e,0x00,0x00,0x00,0x19,0x55, 780 | 0x6f,0x9a,0x55,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 781 | 0xff,0xff,0xff,0xff,0xff,0x95,0x6a,0xa5,0x55,0xa9,0x00,0x0b,0x9f,0x03,0x00,0xb0, 782 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0xac,0x00,0x00,0x00,0x00,0x00, 783 | 0x00,0x00,0x00,0x00,0x00,0xa0,0x0f,0x40,0x04,0x00,0x55,0x55,0x5a,0xa9,0x56,0xff, 784 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 785 | 0xff,0xe9,0x5a,0xa5,0x59,0x56,0x40,0x00,0xbe,0x0a,0x00,0xe0,0x00,0x00,0x00,0x00, 786 | 0x00,0x00,0x00,0x00,0x0e,0x02,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 787 | 0x00,0x20,0x03,0xd0,0x40,0x01,0x55,0x55,0x56,0xa5,0x6b,0xff,0xff,0xff,0xff,0xff, 788 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x56,0xa9, 789 | 0x95,0x9a,0x64,0x00,0x2e,0x28,0x02,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 790 | 0x0e,0x02,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x02,0xf8, 791 | 0x00,0x16,0x55,0x55,0x66,0x95,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 792 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x95,0xaa,0x65,0x55,0x99,0x00, 793 | 0x02,0xf4,0x02,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x2e,0x00, 794 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x02,0xe0,0x00,0x65,0x55,0x56, 795 | 0x6a,0x56,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 796 | 0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0x6a,0x99,0x55,0x6a,0x90,0x00,0xb4,0x07,0x80, 797 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x0e,0x00,0x00,0x00,0x00,0x00, 798 | 0x00,0x00,0x00,0x00,0x00,0x0a,0x01,0x00,0x05,0x55,0x55,0x59,0xa5,0x5a,0xff,0xff, 799 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 800 | 0xff,0xff,0xe9,0x5a,0xaa,0x42,0x59,0xa5,0x00,0x01,0x0f,0x00,0x00,0x00,0x00,0x00, 801 | 0x00,0x00,0x00,0x00,0x0e,0x02,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 802 | 0x00,0x0b,0xc0,0x00,0x56,0x55,0x41,0x5a,0x95,0x6b,0xff,0xff,0xff,0xff,0xff,0xff, 803 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x55, 804 | 0xaa,0xaa,0x56,0xaa,0x40,0x00,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 805 | 0x0e,0x02,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x80,0x01, 806 | 0x65,0x55,0xae,0x6a,0x55,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 807 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0x6a,0xae,0x59,0x9a, 808 | 0xa4,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x0f,0x00, 809 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x95,0x55,0x79,0xa9, 810 | 0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 811 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,0x5a,0xaa,0x65,0x65,0xaa,0x40,0x02,0x00, 812 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x02,0x0b,0x00,0x00,0x00,0x00,0x00, 813 | 0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x59,0x55,0x56,0x6a,0x95,0x6b,0xff,0xff,0xff, 814 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 815 | 0xff,0xff,0xff,0xfa,0x56,0xaa,0x99,0x98,0x2a,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 816 | 0x00,0x00,0x00,0x00,0x0e,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 817 | 0x10,0x00,0x15,0x90,0x95,0x55,0x6a,0x55,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 818 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 819 | 0xa5,0x6a,0xaa,0x54,0x2a,0xa9,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 820 | 0x0e,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x59,0x40, 821 | 0xa5,0x66,0xa9,0x56,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 822 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe9,0x5a,0xaa,0xa0, 823 | 0xae,0xaa,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x0b,0x80, 824 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x65,0xa0,0xa5,0x5a,0x95,0x6b, 825 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 826 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0x56,0xaa,0xaa,0xaa,0x9a,0xaa,0x40, 827 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x08,0x03,0x80,0x00,0x00,0x00,0x00, 828 | 0x00,0x00,0x10,0x00,0x01,0x56,0x55,0x6a,0xaa,0xaa,0x55,0xaf,0xff,0xff,0xff,0xff, 829 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 830 | 0xff,0xff,0xff,0xff,0xff,0xa5,0x6a,0xbe,0xb9,0xa6,0x6a,0xa4,0x00,0x00,0x00,0x00, 831 | 0x00,0x00,0x00,0x00,0x0e,0x08,0x03,0x80,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00, 832 | 0x15,0x99,0x95,0x6e,0xba,0xa5,0x5a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 833 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 834 | 0xff,0xea,0x56,0xab,0xea,0x6a,0xaa,0xaa,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 835 | 0x0e,0x08,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x69,0x65,0x55,0x9b, 836 | 0xea,0x55,0x6b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 837 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x99,0xaa, 838 | 0xea,0xa6,0x6a,0xaa,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0c,0x03,0xc4, 839 | 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x5a,0x96,0x55,0x55,0x5a,0xa9,0x56,0xaf,0xff, 840 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 841 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0x9a,0xaa,0xaa,0x92,0xaa, 842 | 0xaa,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x2c,0x03,0xc0,0x00,0x00,0x00,0x00, 843 | 0x00,0x00,0x16,0xa6,0x65,0x45,0x66,0xaa,0x95,0x5a,0xff,0xff,0xff,0xff,0xff,0xff, 844 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 845 | 0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xa6,0xaa,0xaa,0x92,0x9a,0x6a,0xaa,0x90,0x00, 846 | 0x00,0x00,0x00,0x01,0x2f,0xbe,0x0b,0xe0,0x44,0x00,0x00,0x00,0x00,0x05,0xaa,0x99, 847 | 0x55,0x89,0x5a,0xa9,0x55,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 848 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 849 | 0xff,0xff,0xfe,0xa9,0x9a,0xaa,0xbe,0xaa,0xaa,0xaa,0xaa,0x90,0x00,0x00,0x00,0x00, 850 | 0x2a,0xaa,0x0a,0xa0,0x00,0x00,0x00,0x00,0x05,0xaa,0x99,0x99,0x95,0xbe,0xaa,0x95, 851 | 0x5a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 852 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea, 853 | 0xa6,0xaa,0xae,0xaa,0xaa,0xaa,0xaa,0xaa,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 854 | 0x00,0x00,0x00,0x05,0xaa,0xaa,0x66,0x55,0x59,0xaa,0xaa,0x55,0xab,0xff,0xff,0xff, 855 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 856 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa,0x6a,0xaa,0xaa, 857 | 0xaa,0x5a,0xaa,0xaa,0xaa,0xa5,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x56,0xaa, 858 | 0xaa,0x99,0x95,0x66,0x66,0xaa,0xa5,0x5a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 859 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 860 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0xaa,0xaa,0xaa,0xaa,0x8a,0xaa,0xaa, 861 | 0xaa,0xaa,0xaa,0xa9,0x55,0x40,0x04,0x55,0x55,0xaa,0xaa,0xaa,0xa6,0x66,0x52,0x99, 862 | 0xaa,0xaa,0x55,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 863 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 864 | 0xff,0xff,0xff,0xff,0xfe,0xaa,0x9a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 865 | 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x69,0x95,0xaa,0xaa,0xaa,0x95,0x5a,0xbf, 866 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 867 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 868 | 0xff,0xea,0xaa,0xaa,0xaa,0xba,0xaa,0xaa,0x6a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 869 | 0xaa,0xaa,0xa9,0xa5,0x95,0x9a,0xae,0xaa,0xa9,0x55,0xab,0xff,0xff,0xff,0xff,0xff, 870 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 871 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xaa,0xaa, 872 | 0xaa,0xaa,0xaa,0xaa,0x2a,0xaa,0xaa,0xaa,0xaa,0x80,0xaa,0xaa,0xaa,0xa6,0x66,0x60, 873 | 0xaa,0xaa,0xaa,0xaa,0x95,0x6a,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 874 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 875 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0xaa,0xaa,0xaa,0xaa,0xaa, 876 | 0xba,0xaa,0xa9,0x6a,0xaa,0x80,0xaa,0xaa,0xa5,0xaa,0xaa,0xab,0xaa,0xaa,0xaa,0x99, 877 | 0x56,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 878 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 879 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xaa,0xaa,0xea,0xaa,0xaa,0x2a, 880 | 0xaa,0x80,0xaa,0xaa,0xa8,0xaa,0xaa,0xab,0xaa,0xaa,0xa9,0x65,0xaa,0xff,0xff,0xff, 881 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 882 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 883 | 0xff,0xff,0xff,0xfe,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xab,0xea,0xaa,0xaa,0xaa,0xaa, 884 | 0xab,0xea,0xaa,0xaa,0xaa,0xaa,0x66,0x6a,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 885 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 886 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 887 | 0xea,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xea,0xaa,0xaa,0xaa,0xaa,0xab,0xaa,0xaa,0xaa, 888 | 0xa9,0x99,0x9a,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 889 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 890 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa, 891 | 0xaa,0xaa,0xaa,0xaa,0xaa,0xbf,0xfe,0xaa,0xaa,0xaa,0xaa,0xaa,0x6a,0xaa,0xaa,0xff, 892 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 893 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 894 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 895 | 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa9,0xaa,0x9a,0xaa,0xff,0xff,0xff,0xff,0xff,0xff, 896 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 897 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 898 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 899 | 0xaa,0xaa,0xaa,0xaa,0xaa,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 900 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 901 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 902 | 0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, 903 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 904 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 905 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 906 | 0xff,0xfa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaf,0xff,0xff,0xff,0xff,0xff, 907 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 908 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 909 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb, 910 | 0xaa,0xaa,0xaa,0xaa,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 911 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 912 | }; 913 | -------------------------------------------------------------------------------- /examples/ST7789_power_consumption/ST7789_power_consumption.ino: -------------------------------------------------------------------------------- 1 | // ST7789 Power Consumption Tests 2 | // (C)2021 Pawel A. Hernik 3 | // requires RRE Font library: 4 | // https://github.com/cbm80amiga/RREFont 5 | // YouTube video: https://youtu.be/M-fKkN0bKA0 6 | 7 | /* 8 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 9 | 10 | #01 GND -> GND 11 | #02 VCC -> VCC (3.3V only!) 12 | #03 SCL -> PA5/SCK 13 | #04 SDA -> PA7/MOSI 14 | #05 RES -> PA0 or any digital 15 | #06 DC -> PA1 or any digital 16 | #07 BLK -> NC 17 | */ 18 | 19 | #include 20 | #include 21 | #define TFT_DC 10 22 | #define TFT_RST 9 23 | #define TFT_BL 8 24 | 25 | #define SCR_WD 240 26 | #define SCR_HT 240 27 | #include 28 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 29 | 30 | #include "RREFont.h" 31 | #include "rre_chicago_20x24.h" 32 | 33 | 34 | RREFont font; 35 | 36 | // needed for RREFont library initialization, define your fillRect 37 | void customRect(int x, int y, int w, int h, int c) { return lcd.fillRect(x, y, w, h, c); } 38 | 39 | void rainbow() 40 | { 41 | for(int i=0;i<240;i+=4) { 42 | uint8_t r,g,b; 43 | lcd.rgbWheel(i*512L/240,&r,&g,&b); 44 | lcd.fillRect(0,i,240,4,RGBto565(r,g,b)); 45 | } 46 | } 47 | 48 | #include 49 | #include 50 | #include 51 | 52 | enum wdt_time { 53 | SLEEP_15MS, 54 | SLEEP_30MS, 55 | SLEEP_60MS, 56 | SLEEP_120MS, 57 | SLEEP_250MS, 58 | SLEEP_500MS, 59 | SLEEP_1S, 60 | SLEEP_2S, 61 | SLEEP_4S, 62 | SLEEP_8S, 63 | SLEEP_FOREVER 64 | }; 65 | 66 | ISR(WDT_vect) { wdt_disable(); } 67 | 68 | void powerDown(uint8_t per) 69 | { 70 | ADCSRA &= ~(1 << ADEN); // turn off ADC 71 | if(per != SLEEP_FOREVER) { // use watchdog timer 72 | wdt_enable(per); 73 | WDTCSR |= (1 << WDIE); 74 | } 75 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); // most power saving 76 | cli(); 77 | sleep_enable(); 78 | sleep_bod_disable(); 79 | sei(); 80 | sleep_cpu(); 81 | // ... sleeping here 82 | sleep_disable(); 83 | ADCSRA |= (1 << ADEN); // turn on ADC 84 | } 85 | 86 | void wait(int t=SLEEP_4S) 87 | { 88 | // force D13/SPI-SCK LED off and deep sleep for 4s 89 | SPI.end(); 90 | pinMode(13, OUTPUT); digitalWrite(13, LOW); 91 | powerDown(t); 92 | //SPI.begin(); 93 | //SPI.setClockDivider(SPI_CLOCK_DIV2); 94 | //SPI.setDataMode(SPI_MODE3); 95 | lcd.init(SCR_WD, SCR_HT); 96 | } 97 | 98 | void setup() 99 | { 100 | Serial.begin(9600); 101 | lcd.init(); 102 | font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values 103 | font.setFont(&rre_chicago_20x24); 104 | font.setScale(1,2); font.setSpacing(3); 105 | //font.setCR(1); 106 | font.setColor(WHITE); 107 | pinMode(TFT_BL, OUTPUT); 108 | digitalWrite(TFT_BL, HIGH); 109 | } 110 | 111 | void loop() 112 | { 113 | lcd.fillScreen(RGBto565(120,60,30)); 114 | font.printStr(ALIGN_CENTER,40,"Power"); 115 | font.printStr(ALIGN_CENTER,40+60,"consumption"); 116 | font.printStr(ALIGN_CENTER,40+120,"tests ..."); 117 | delay(2000); 118 | 119 | rainbow(); 120 | font.setColor(BLACK); 121 | font.printStr(ALIGN_CENTER,65,"Regular"); 122 | font.printStr(ALIGN_CENTER,65+60,"no saving"); 123 | SPI.end(); 124 | pinMode(13, OUTPUT); digitalWrite(13, LOW); 125 | delay(4000); 126 | lcd.init(SCR_WD, SCR_HT); 127 | 128 | rainbow(); 129 | font.setColor(BLACK); 130 | font.printStr(ALIGN_CENTER,40,"AVR deep sleep"); 131 | font.printStr(ALIGN_CENTER,40+60,"1. BL ON "); 132 | font.printStr(ALIGN_CENTER,40+120,"2. BL OFF"); 133 | wait(); 134 | digitalWrite(TFT_BL, LOW); 135 | wait(); 136 | digitalWrite(TFT_BL, HIGH); 137 | 138 | lcd.fillScreen(WHITE); 139 | wait(); 140 | lcd.fillScreen(BLACK); 141 | wait(); 142 | lcd.fillScreen(RED); 143 | wait(); 144 | lcd.fillScreen(GREEN); 145 | wait(); 146 | lcd.fillScreen(BLUE); 147 | wait(); 148 | 149 | rainbow(); 150 | font.setColor(BLACK); 151 | font.printStr(ALIGN_CENTER,95,"Idle mode OFF"); 152 | lcd.idleDisplay(false); 153 | wait(); 154 | 155 | rainbow(); 156 | font.printStr(ALIGN_CENTER,95,"Idle mode ON"); 157 | lcd.idleDisplay(true); 158 | wait(); 159 | lcd.idleDisplay(false); 160 | 161 | rainbow(); 162 | font.setColor(WHITE,BLACK); 163 | lcd.fillRect(30,87,240-60,60,BLACK); 164 | font.printStr(ALIGN_CENTER,95,"Invert OFF"); 165 | lcd.invertDisplay(false); 166 | wait(); 167 | font.printStr(ALIGN_CENTER,95," Invert ON "); 168 | lcd.invertDisplay(true); 169 | wait(); 170 | lcd.invertDisplay(false); 171 | 172 | font.setColor(WHITE); 173 | lcd.fillScreen(RGBto565(180,0,180)); 174 | font.printStr(ALIGN_CENTER,40,"Sleep mode in 2s"); 175 | font.printStr(ALIGN_CENTER,40+60,"1. BL ON "); 176 | font.printStr(ALIGN_CENTER,40+120,"2. BL OFF"); 177 | wait(SLEEP_2S); 178 | //lcd.enableDisplay(false); 179 | lcd.sleepDisplay(true); 180 | wait(); 181 | lcd.sleepDisplay(true); 182 | digitalWrite(TFT_BL, LOW); 183 | wait(); 184 | digitalWrite(TFT_BL, HIGH); 185 | lcd.sleepDisplay(false); 186 | //lcd.enableDisplay(true); 187 | 188 | lcd.fillScreen(RGBto565(180,0,180)); 189 | font.printStr(6,10,"Display disable"); 190 | font.printStr(6,10+60,"1. BL ON"); 191 | font.printStr(6,10+120,"2. BL OFF"); 192 | font.printStr(6,10+180,"3. BL OFF + Sleep"); 193 | wait(SLEEP_2S); 194 | 195 | lcd.enableDisplay(false); // display disable, BL ON 196 | wait(); 197 | 198 | lcd.enableDisplay(false); 199 | digitalWrite(TFT_BL, LOW); // display disable, BL OFF 200 | wait(); 201 | lcd.enableDisplay(false); 202 | lcd.sleepDisplay(true); 203 | digitalWrite(TFT_BL, LOW); // display disable, sleep, BL OFF 204 | wait(); 205 | lcd.sleepDisplay(false); 206 | lcd.enableDisplay(true); 207 | digitalWrite(TFT_BL, HIGH); 208 | 209 | lcd.fillScreen(RGBto565(180,0,180)); 210 | font.printStr(ALIGN_CENTER,95,"Partial display"); 211 | font.setColor(YELLOW); 212 | font.printStr(ALIGN_CENTER,6,"Top"); 213 | font.printStr(ALIGN_CENTER,240-50,"Bottom"); 214 | font.setColor(WHITE); 215 | wait(SLEEP_2S); 216 | 217 | lcd.setPartArea(60*1, 60*3); lcd.partialDisplay(true); 218 | wait(); 219 | 220 | lcd.setPartArea(60*3, 60*1); lcd.partialDisplay(true); 221 | wait(); 222 | lcd.partialDisplay(false); 223 | } 224 | 225 | -------------------------------------------------------------------------------- /examples/ST7789_terminal/ST7789_terminal.ino: -------------------------------------------------------------------------------- 1 | // Serial terminal display (VT100) 2 | // 30x15 screen with 8x16 font 3 | // ST7789 & RRE library example 4 | // (c) 2019 Pawel A. Hernik 5 | // YT video: https://youtu.be/Z4PMT5wUhMw 6 | // Use case: https://youtu.be/a1vxOkcO5Fw 7 | 8 | /* 9 | ST7789 240x240 IPS (without CS pin) connections (only 6 wires required): 10 | 11 | #01 GND -> GND 12 | #02 VCC -> VCC (3.3V only!) 13 | #03 SCL -> D13/SCK 14 | #04 SDA -> D11/MOSI 15 | #05 RES -> D8 or any digital 16 | #06 DC -> D7 or any digital 17 | #07 BLK -> NC 18 | */ 19 | 20 | #define TFT_DC 7 21 | #define TFT_RST 8 22 | #define SCR_WD 240 23 | #define SCR_HT 320 // 320 - to allow access to full 240x320 frame buffer 24 | #include 25 | #include 26 | #include 27 | Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); 28 | 29 | #include "RREFont.h" 30 | #include "rre_fjg_8x16.h" 31 | 32 | RREFont font; 33 | 34 | // needed for RREFont library initialization, define your fillRect 35 | void customRect(int x, int y, int w, int h, int c) { return lcd.fillRect(x, y, w, h, c); } 36 | 37 | int maxy = 320; // internal ST7789 fb is 240x320 38 | int xp = 0, yp = 240; 39 | int ys = 0; 40 | uint16_t bg = BLACK, fg = WHITE; 41 | int screenWd = 240, screenHt = 240; 42 | int charWd, charHt; 43 | int wrap = 0; // 1 - for wrapping long lines (>30 characters) 44 | int sx = 1, sy = 1; 45 | 46 | int escMode = 0; 47 | int nVals = 0; 48 | int vals[10]={0}; 49 | 50 | uint16_t c0 = RGBto565(20,20,20); 51 | uint16_t c1 = RGBto565(40,40,40); 52 | 53 | void scrollScreen() 54 | { 55 | xp = 0; 56 | ys += charHt*sy; 57 | if(ys>=maxy) ys-=maxy; 58 | yp = ys+screenHt; 59 | if(yp>=maxy) yp-=maxy; 60 | lcd.fillRect(0, yp, screenWd, charHt*sy, ((yp/charHt)&1) ? c1 : c0); 61 | lcd.setScroll(ys); 62 | } 63 | 64 | void printString(char *str) 65 | { 66 | while(*str) printTermChar(*str++); 67 | } 68 | 69 | void printTermChar(char c) 70 | { 71 | static const uint16_t colors[] = { 72 | 0x0000, // 0-black 73 | 0xf800, // 1-red 74 | 0x07e0, // 2-green 75 | 0xffe0, // 3-yellow 76 | 0x001f, // 4-blue 77 | 0xf81f, // 5-magenta 78 | 0x07ff, // 6-cyan 79 | 0xffff // 7-white 80 | }; 81 | 82 | if(c==0x1b) { escMode=1; return; } 83 | if(escMode==1) { 84 | if(c=='[') { escMode=2; nVals=0; } else escMode=0; 85 | return; 86 | } 87 | if(escMode==2) { 88 | if(isdigit(c)) 89 | vals[nVals] = vals[nVals]*10+(c-'0'); 90 | else if(c==';') 91 | nVals++; 92 | else if(c=='m') { 93 | escMode=0; 94 | nVals++; 95 | for(int i=0;i=30 && v<38){ // fg colors 109 | fg = colors[v-30]; 110 | if(bg==BLACK) font.setColor(fg); else font.setColor(fg, bg); 111 | } else if(v>=40 && v<48){ 112 | bg = colors[v-40]; 113 | if(bg==BLACK) font.setColor(fg); else font.setColor(fg, bg); 114 | } else if(v>=90 && v<98){ // fg colors 115 | fg = colors[v-90]; 116 | if(bg==BLACK) font.setColor(fg); else font.setColor(fg, bg); 117 | } else if(v>=100 && v<108){ 118 | bg = colors[v-100]; 119 | if(bg==BLACK) font.setColor(fg); else font.setColor(fg, bg); 120 | } 121 | } 122 | vals[0]=vals[1]=vals[2]=vals[3]=0; 123 | nVals=0; 124 | } else { 125 | escMode=0; 126 | vals[0]=vals[1]=vals[2]=vals[3]=0; 127 | nVals=0; 128 | } 129 | return; 130 | } 131 | if(c==10) { scrollScreen(); return; } // LF 132 | if(c==13) { xp=0; return; } // CR 133 | if(c==8) { // BS 134 | if(xp>0) xp-=charWd*sx; 135 | lcd.fillRect(xp, yp, charWd*sx, charHt*sy, BLACK); 136 | return; 137 | } 138 | if(xp=screenWd && wrap) scrollScreen(); // 8900us 141 | } 142 | 143 | void testVT100() 144 | { 145 | printString("\e[0;32;40mGreen on black\n"); 146 | printString("\e[0;37;45mWhite on magenta\n"); 147 | printString("\e[0;30;46mBlack on cyan\n"); 148 | printString("\e[0;33;44mYellow on blue\n"); 149 | printString("\e[0;31;47mRed on white\n"); 150 | printString("\e[0mRegular\n"); 151 | printString("\e[1mText in bold\e[0m\n"); 152 | printString("\e[7mInverse\e[0m\n"); 153 | printString("ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}\n"); 154 | printString("abcdefghijklmnopqrstuvwxyz:;()\n"); 155 | printString("01234567890,.'!|?/*_=+-#%$^&\n"); 156 | if(charHt*sy<24) { 157 | printString("\e[1m"); 158 | printString("ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}\n"); 159 | printString("abcdefghijklmnopqrstuvwxyz:;()\n"); 160 | printString("01234567890,.'!|?/*_=+-#%$^&\n"); 161 | printString("\e[0m"); 162 | } 163 | //delay(2000); 164 | } 165 | 166 | void setup() 167 | { 168 | //Serial.begin(9600); // perfect 169 | //Serial.begin(19200); // perfect 170 | Serial.begin(28800); // almost ok 171 | lcd.init(SCR_WD, SCR_HT); 172 | lcd.fillScreen(BLACK); 173 | font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values 174 | font.setFont(&rre_fjg_8x16); 175 | charWd = font.getWidth(); 176 | charHt = font.getHeight(); 177 | font.setColor(WHITE); 178 | font.setCharMinWd(8); 179 | lcd.setScrollArea(0,0); 180 | //testVT100(); 181 | printString("\e[0;44m *** Terminal Init *** \e[0m\n"); 182 | } 183 | 184 | unsigned long us; 185 | 186 | void loop() 187 | { 188 | while(Serial.available()) { 189 | //us = micros(); 190 | printTermChar(Serial.read()); 191 | //Serial.println(micros()-us); 192 | } 193 | } 194 | 195 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | Arduino_ST7789 KEYWORD3 2 | 3 | init KEYWORD2 4 | invertDisplay KEYWORD2 5 | partialDisplay KEYWORD2 6 | sleepDisplay KEYWORD2 7 | enableDisplay KEYWORD2 8 | idleDisplay KEYWORD2 9 | resetDisplay KEYWORD2 10 | setScrollArea KEYWORD2 11 | setScroll KEYWORD2 12 | setPartArea KEYWORD2 13 | powerSave KEYWORD2 14 | rgbWheel KEYWORD2 15 | RGBto565 KEYWORD2 16 | drawImage KEYWORD2 17 | drawImageF KEYWORD2 18 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=Fast ST7789 Library 2 | version=1.0.4 3 | author=Pawel A. Hernik 4 | maintainer=Pawel A. Hernik 5 | sentence=Fast SPI library for the ST7789 IPS display. 6 | paragraph=Fast SPI library for the ST7789 IPS display. 7 | category=Display 8 | url=https://github.com/cbm80amiga/Arduino_ST7789_Fast 9 | architectures=* 10 | --------------------------------------------------------------------------------