summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanley Huang <stanleyhuangyc@gmail.com>2013-06-10 13:21:09 +0800
committerStanley Huang <stanleyhuangyc@gmail.com>2013-06-10 13:21:09 +0800
commit47c6ff979fea8051c02fb38fe99c0021880a4ed8 (patch)
treee8ff3fc5e616e4b0a26faba64c904d7d18c75037
parentf6082dee6e41054bec5b8d97e848517cbebbb3ad (diff)
download2021-arduino-obd-47c6ff979fea8051c02fb38fe99c0021880a4ed8.tar.gz
2021-arduino-obd-47c6ff979fea8051c02fb38fe99c0021880a4ed8.tar.bz2
2021-arduino-obd-47c6ff979fea8051c02fb38fe99c0021880a4ed8.zip
update MultiLCD library
-rw-r--r--libraries/MultiLCD/ILI9325D.cpp503
-rw-r--r--libraries/MultiLCD/LCD4Bit_mod.cpp14
-rw-r--r--libraries/MultiLCD/LCD4Bit_mod.h5
-rw-r--r--libraries/MultiLCD/MultiLCD.cpp517
-rw-r--r--libraries/MultiLCD/MultiLCD.h122
-rw-r--r--libraries/MultiLCD/PCD8544.cpp66
-rw-r--r--libraries/MultiLCD/PCD8544.h29
-rw-r--r--libraries/MultiLCD/README.txt9
-rw-r--r--libraries/MultiLCD/SSD1306.cpp273
-rw-r--r--libraries/MultiLCD/SSD1306.h119
-rw-r--r--libraries/MultiLCD/ZtLib.cpp14
-rw-r--r--libraries/MultiLCD/ZtLib.h15
-rw-r--r--libraries/MultiLCD/examples/lcdhello/images.h80
-rw-r--r--libraries/MultiLCD/examples/lcdhello/lcdhello.ino66
-rw-r--r--libraries/MultiLCD/fonts.cpp331
15 files changed, 1918 insertions, 245 deletions
diff --git a/libraries/MultiLCD/ILI9325D.cpp b/libraries/MultiLCD/ILI9325D.cpp
new file mode 100644
index 0000000..8234982
--- /dev/null
+++ b/libraries/MultiLCD/ILI9325D.cpp
@@ -0,0 +1,503 @@
+#include <Arduino.h>
+#include "MultiLCD.h"
+
+/**********************************************
+Define zone
+**********************************************/
+
+#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__)
+
+#define RS 59
+#define WR 58
+#define CS 57
+#define RST 56
+
+#define T_CLK 55
+#define T_CS 60
+#define T_DIN 54
+#define T_DOUT 8
+#define T_IRQ 9
+
+#define X_CONST 240
+#define Y_CONST 320
+
+#define PREC_TOUCH_CONST 10
+
+#define PixSizeX 13.78
+#define PixOffsX 411
+
+#define PixSizeY 11.01
+#define PixOffsY 378
+
+#define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set
+#define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set
+#define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set
+#define WINDOW_YADDR_END 0x0053 // Vertical End Address Set
+#define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set
+#define GRAM_YADDR 0x0021 // GRAM Vertical Address Set
+#define GRAMWR 0x0022 // memory write
+
+/* LCD color */
+#define White 0xFFFF
+#define Black 0x0000
+#define Blue 0x001F
+#define Blue2 0x051F
+#define Red 0xF800
+#define Magenta 0xF81F
+#define Green 0x07E0
+#define Cyan 0x7FFF
+#define Yellow 0xFFE0
+
+/**********************************************
+Standard C functions zone
+**********************************************/
+void LCD_ILI9325D::Enable() { digitalWrite(CS,LOW); }
+void LCD_ILI9325D::Disable() { digitalWrite(CS,HIGH); }
+
+void LCD_ILI9325D::SetCommandMode()
+{
+ digitalWrite(CS,HIGH);
+ digitalWrite(RS, LOW);
+ digitalWrite(CS,LOW);
+}
+
+void LCD_ILI9325D::SetDataMode()
+{
+ digitalWrite(CS,HIGH);
+ digitalWrite(RS, HIGH);
+ digitalWrite(CS,LOW);
+}
+
+void LCD_ILI9325D::WriteData(byte l, byte h)
+{
+ if (h != lastData) {
+ PORTE = (h & 0x3) | ((h & 0xC) << 2) | ((h & 0x20) >> 2);
+ PORTG = (h & 0x10) << 1;
+ PORTH = (h & 0xC0) >> 3;
+ lastData = h;
+ }
+
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+
+ if (l != lastData) {
+ PORTE = (l & 0x3) | ((l & 0xC) << 2) | ((l & 0x20) >> 2);
+ PORTG = (l & 0x10) << 1;
+ PORTH = (l & 0xC0) >> 3;
+ lastData = l;
+ }
+
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+}
+
+void LCD_ILI9325D::WriteData(uint16_t c)
+{
+ byte value = *((unsigned char*)&c + 1);
+ if (value != lastData) {
+ PORTE = (value & 0x3) | ((value & 0xC) << 2) | ((value & 0x20) >> 2);
+ PORTG = (value & 0x10) << 1;
+ PORTH = (value & 0xC0) >> 3;
+ lastData = value;
+ }
+
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+
+ value = (unsigned char)c;
+ if (value != lastData) {
+ PORTE = (value & 0x3) | ((value & 0xC) << 2) | ((value & 0x20) >> 2);
+ PORTG = (value & 0x10) << 1;
+ PORTH = (value & 0xC0) >> 3;
+ lastData = value;
+ }
+
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+}
+
+void LCD_ILI9325D::WriteCommandData(uint16_t cmd,uint16_t dat)
+{
+ SetCommandMode();
+ WriteData(cmd);
+ SetDataMode();
+ WriteData(dat);
+}
+
+void LCD_ILI9325D::begin()
+{
+ pinMode(RS,OUTPUT);
+ pinMode(WR,OUTPUT);
+ pinMode(CS,OUTPUT);
+ pinMode(RST,OUTPUT);
+
+ //DDRD = 0xFF;
+ for(int a=0;a < 8;a++)
+ {
+ pinMode(a,OUTPUT);
+ }
+
+ digitalWrite(RST,HIGH);
+ delay(1);
+ digitalWrite(RST,LOW);
+ delay(1);
+
+ digitalWrite(RST,HIGH);
+ digitalWrite(CS,HIGH);
+ digitalWrite(WR,HIGH);
+ delay(50);
+
+ PORTE = 0;
+ PORTG = 0;
+ PORTH = 0;
+ lastData = 0;
+
+ WriteCommandData(0x0001,0x0100);
+ WriteCommandData(0x0002,0x0700);
+ WriteCommandData(0x0003,0x1030);
+ WriteCommandData(0x0004,0x0000);
+ WriteCommandData(0x0008,0x0207);
+ WriteCommandData(0x0009,0x0000);
+ WriteCommandData(0x000A,0x0000);
+ WriteCommandData(0x000C,0x0000);
+ WriteCommandData(0x000D,0x0000);
+ WriteCommandData(0x000F,0x0000);
+ //power on sequence VGHVGL
+ WriteCommandData(0x0010,0x0000);
+ WriteCommandData(0x0011,0x0007);
+ WriteCommandData(0x0012,0x0000);
+ WriteCommandData(0x0013,0x0000);
+ //vgh
+ WriteCommandData(0x0010,0x1290);
+ WriteCommandData(0x0011,0x0227);
+ //delays(100);
+ //vregiout
+ WriteCommandData(0x0012,0x001d); //0x001b
+ //delays(100);
+ //vom amplitude
+ WriteCommandData(0x0013,0x1500);
+ //delays(100);
+ //vom H
+ WriteCommandData(0x0029,0x0018);
+ WriteCommandData(0x002B,0x000D);
+
+ //gamma
+ WriteCommandData(0x0030,0x0004);
+ WriteCommandData(0x0031,0x0307);
+ WriteCommandData(0x0032,0x0002);// 0006
+ WriteCommandData(0x0035,0x0206);
+ WriteCommandData(0x0036,0x0408);
+ WriteCommandData(0x0037,0x0507);
+ WriteCommandData(0x0038,0x0204);//0200
+ WriteCommandData(0x0039,0x0707);
+ WriteCommandData(0x003C,0x0405);// 0504
+ WriteCommandData(0x003D,0x0F02);
+ //ram
+ WriteCommandData(0x0050,0x0000);
+ WriteCommandData(0x0051,0x00EF);
+ WriteCommandData(0x0052,0x0000);
+ WriteCommandData(0x0053,0x013F);
+ WriteCommandData(0x0060,0xA700);
+ WriteCommandData(0x0061,0x0001);
+ WriteCommandData(0x006A,0x0000);
+ //
+ WriteCommandData(0x0080,0x0000);
+ WriteCommandData(0x0081,0x0000);
+ WriteCommandData(0x0082,0x0000);
+ WriteCommandData(0x0083,0x0000);
+ WriteCommandData(0x0084,0x0000);
+ WriteCommandData(0x0085,0x0000);
+ //
+ WriteCommandData(0x0090,0x0010);
+ WriteCommandData(0x0092,0x0600);
+ WriteCommandData(0x0093,0x0003);
+ WriteCommandData(0x0095,0x0110);
+ WriteCommandData(0x0097,0x0000);
+ WriteCommandData(0x0098,0x0000);
+ WriteCommandData(0x0007,0x0133);
+ Disable();
+
+ m_color[0] = 0;
+ m_color[1] = 0xffff;
+ clear();
+}
+
+void LCD_ILI9325D::SetXY(uint16_t x0,uint16_t x1,uint16_t y0,uint16_t y1)
+{
+ WriteCommandData(WINDOW_XADDR_START,x0);
+ WriteCommandData(WINDOW_XADDR_END,x1);
+ WriteCommandData(WINDOW_YADDR_START,y0);
+ WriteCommandData(WINDOW_YADDR_END,y1);
+ WriteCommandData(GRAM_XADDR,x0);
+ WriteCommandData(GRAM_YADDR,y0);
+ SetCommandMode();
+ WriteData(0x0022);//LCD_WriteCMD(GRAMWR);
+ SetDataMode();
+}
+
+/*
+void Pant(uint16_t color)
+{
+ int i,j;
+ SetXY(0,239,0,319);
+
+ for(i=0;i<320;i++)
+ {
+ for (j=0;j<240;j++)
+ {
+ WriteData(color);
+ }
+
+ }
+}
+*/
+
+void LCD_ILI9325D::clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
+{
+ unsigned long count = (unsigned long)width * height;
+ SetXY(y, y + height - 1, x, x + width - 1);
+
+ digitalWrite(RS,HIGH);//LCD_RS=0;
+ digitalWrite(CS,LOW);//LCD_CS =0;
+ PORTE = 0;
+ PORTG = 0;
+ PORTH = 0;
+ lastData = 0;
+ while (count--) {
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+ digitalWrite(WR,LOW);//LCD_WR=0;
+ digitalWrite(WR,HIGH);//LCD_WR=1;
+ }
+ digitalWrite(CS,HIGH);//LCD_CS =0;
+ m_x = x;
+ m_y = y;
+}
+
+size_t LCD_ILI9325D::write(uint8_t c)
+{
+ if (c == '\n') {
+ m_x += 8;
+ return 0;
+ } else if (c == '\r') {
+ SetXY(m_x, m_x + 7, m_y, 319);
+ uint16_t count = (320 - m_y) * 8;
+ for (uint16_t i=0; i < count; i++) {
+ WriteData(0, 0);
+ }
+ m_y = 0;
+ return 0;
+ } else if (c < ' ') {
+ return 0;
+ }
+
+ if (m_font == FONT_SIZE_SMALL) {
+ byte pgm_buffer[6] = {0};
+ if (c > 0x20 && c < 0x7f) {
+ memcpy_P(pgm_buffer, &font5x8[c - 0x21], 5);
+ }
+
+ SetXY(m_x, m_x + 7, m_y, m_y + 5);
+ for (byte i = 0; i < 5; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++) {
+ WriteData(m_color[d & 1]);
+ d >>= 1;
+ }
+ }
+
+ m_y += 6;
+ if (m_y >= 320) {
+ m_x += 8;
+ m_y = 0;
+ if (m_x >= 240) {
+ m_x = 0;
+ }
+ }
+ } else {
+ byte pgm_buffer[16];
+ if (c > 0x20 && c < 0x7f) {
+ memcpy_P(pgm_buffer, &font8x16_terminal[c - 0x21], 16);
+ } else {
+ memset(pgm_buffer, 0, sizeof(pgm_buffer));
+ }
+
+ SetXY(m_x, m_x + 15, m_y, m_y + 7);
+ for (byte i = 0; i < 16; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++) {
+ WriteData(m_color[d & 1]);
+ d >>= 1;
+ }
+ }
+
+ m_y += 9;
+ if (m_y >= 320) {
+ m_x += 8;
+ m_y = 0;
+ if (m_x >= 240) {
+ m_x = 0;
+ }
+ }
+ }
+}
+
+void LCD_ILI9325D::writeDigit(byte n)
+{
+ if (m_font == FONT_SIZE_SMALL) {
+ /*
+ byte pgm_buffer[16] = {0};
+ if (n >= 0 && n <= 9) {
+ memcpy_P(pgm_buffer, &font5x8[n + '0' - 0x21], 5);
+ }
+
+ SetXY(m_x, m_x + 7, m_y, m_y + 5);
+ for (byte i = 0; i < 5; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ }
+ m_y += 6;
+ */
+ byte pgm_buffer[8];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(pgm_buffer, &digits8x8[n], 8);
+ } else {
+ memset(pgm_buffer, 0, 8);
+ }
+
+ SetXY(m_x, m_x + 7, m_y, m_y + 7);
+ for (byte i = 0; i < 8; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ }
+ m_y += 8;
+ } else if (m_font == FONT_SIZE_MEDIUM) {
+ byte pgm_buffer[16];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(pgm_buffer, &font8x16_terminal[n + '0' - 0x21], 16);
+ } else {
+ return;
+ }
+ SetXY(m_x, m_x + 15, m_y, m_y + 7);
+ for (byte i = 0; i < 16; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ }
+ m_y += 9;
+ } else if (m_font == FONT_SIZE_LARGE) {
+ byte pgm_buffer[32];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(pgm_buffer, &digits16x16[n], sizeof(pgm_buffer));
+ } else {
+ memset(pgm_buffer, 0, sizeof(pgm_buffer));
+ }
+
+ SetXY(m_x, m_x + 15, m_y, m_y + 15);
+ for (byte i = 0; i < 16; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (byte j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ d = pgm_buffer[i + 16];
+ for (byte j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ }
+ m_y += 16;
+ } else if (m_font == FONT_SIZE_XLARGE) {
+ byte pgm_buffer[48];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(pgm_buffer, &digits16x24[n], sizeof(pgm_buffer));
+ } else {
+ memset(pgm_buffer, 0, sizeof(pgm_buffer));
+ }
+ SetXY(m_x, m_x + 23, m_y, m_y + 15);
+ for (int i = 0; i < 48; i++) {
+ unsigned char d = pgm_buffer[i];
+ for (int j = 0; j < 8; j++, d >>= 1) {
+ WriteData(m_color[d & 1]);
+ }
+ }
+ m_y += 18;
+ }
+}
+
+void LCD_ILI9325D::draw(const PROGMEM byte* buffer, uint16_t x, uint16_t y, uint16_t width, uint16_t height)
+{
+ uint16_t pixels = (uint16_t)width * height;
+ SetXY(y, y + height - 1, x, x + width - 1);
+ do {
+ WriteData(pgm_read_byte_near(buffer++), pgm_read_byte_near(buffer++));
+ } while (--pixels);
+}
+
+void LCD_ILI9325D::draw2x(const PROGMEM byte* buffer, uint16_t x, uint16_t y, byte width, byte height)
+{
+ char buf[240];
+ uint16_t pixels = (uint16_t)width * height;
+ SetXY(y, y + height * 2 - 1, x, x + width * 2- 1);
+ for (byte i = 0; i < width; i++) {
+ memcpy_P(buf, buffer + (uint16_t)i * height * 2, height * 2);
+ for (byte j = 0; j < height * 2; j += 2) {
+ WriteData(buf[j], buf[j + 1]);
+ WriteData(buf[j], buf[j + 1]);
+ }
+ for (byte j = 0; j < height * 2; j += 2) {
+ WriteData(buf[j], buf[j + 1]);
+ WriteData(buf[j], buf[j + 1]);
+ }
+ }
+}
+
+void LCD_ILI9325D::draw4bpp(const PROGMEM byte* buffer, uint16_t x, uint16_t y, uint16_t width, uint16_t height)
+{
+ uint16_t count = (uint16_t)width * height / 2;
+ SetXY(y, y + height - 1, x, x + width - 1);
+ do {
+ byte d = pgm_read_byte_near(buffer++);
+ byte dl = d & 0xf;
+ byte rg = (dl << 3) | (dl > 1) | 0x8;
+ byte gb = (dl << 7) | (dl << 1) | 0x61;
+ WriteData(rg, gb);
+ dl = d >> 4;
+ rg = (dl << 3) | (dl > 1) | 0x8;
+ gb = (dl << 7) | (dl << 1) | 0x61;
+ WriteData(rg, gb);
+ } while (--count);
+}
+
+/*
+void Print16x24(int x, int y, uint16_t color, const char* data)
+{
+ SetXY(x, x + 23, y, y + 15);
+ for (int i = 0; i < 48; i++) {
+ unsigned char d = data[i];
+ for (int j = 0; j < 8; j++) {
+ WriteData((d & 1 ) ? color : 0);
+ d >>= 1;
+ }
+ }
+}
+
+void Print8x16(int x, int y, uint16_t color, const char* data)
+{
+ SetXY(x, x + 7, y, y + 15);
+ for (int i = 0; i < 16; i++) {
+ unsigned char d = *data;
+ for (int j = 0; j < 8; j++) {
+ WriteData((d & 1 ) ? color : 0);
+ d >>= 1;
+ }
+ data++;
+ }
+
+}
+*/
+
+#endif
diff --git a/libraries/MultiLCD/LCD4Bit_mod.cpp b/libraries/MultiLCD/LCD4Bit_mod.cpp
index c100c19..5072818 100644
--- a/libraries/MultiLCD/LCD4Bit_mod.cpp
+++ b/libraries/MultiLCD/LCD4Bit_mod.cpp
@@ -89,7 +89,7 @@ void LCD4Bit_mod::commandWrite(byte value)
//print the given character at the current cursor position. overwrites, doesn't insert.
-void LCD4Bit_mod::write(byte c)
+size_t LCD4Bit_mod::write(uint8_t c)
{
//set the RS and RW pins to show we're writing data
digitalWrite(RS, HIGH);
@@ -97,18 +97,8 @@ void LCD4Bit_mod::write(byte c)
//let pushByte worry about the intricacies of Enable, nibble order.
pushByte(c);
-}
-
-//print the given string to the LCD at the current cursor position. overwrites, doesn't insert.
-//While I don't understand why this was named printIn (PRINT IN?) in the original LiquidCrystal library, I've preserved it here to maintain the interchangeability of the two libraries.
-void LCD4Bit_mod::print(const char* msg)
-{
- byte i; //fancy int. avoids compiler warning when comparing i with strlen()'s uint8_t
- byte l = strlen(msg);
- for (i=0; i < l; i++){
- if (msg[i] >= 20) write(msg[i]);
- }
+ return 1;
}
diff --git a/libraries/MultiLCD/LCD4Bit_mod.h b/libraries/MultiLCD/LCD4Bit_mod.h
index 7cd5115..1d223b1 100644
--- a/libraries/MultiLCD/LCD4Bit_mod.h
+++ b/libraries/MultiLCD/LCD4Bit_mod.h
@@ -3,7 +3,7 @@
#include <inttypes.h>
-class LCD4Bit_mod {
+class LCD4Bit_mod : public Print {
public:
LCD4Bit_mod(byte num_lines = 2):USING_RW(false),RS(8),RW(11),Enable(9)
{
@@ -15,8 +15,7 @@ public:
}
void commandWrite(byte value);
void begin();
- void write(byte value);
- void print(const char* string);
+ size_t write(uint8_t c);
void clear();
//non-core---------------
void setCursor(byte x, byte line);
diff --git a/libraries/MultiLCD/MultiLCD.cpp b/libraries/MultiLCD/MultiLCD.cpp
index cff82c2..4cf3dd5 100644
--- a/libraries/MultiLCD/MultiLCD.cpp
+++ b/libraries/MultiLCD/MultiLCD.cpp
@@ -1,182 +1,405 @@
+/*************************************************************************
+* Arduino Text Display Library for Multiple LCDs
+* Distributed under GPL v2.0
+* Copyright (c) 2013 Stanley Huang <stanleyhuangyc@live.com>
+* All rights reserved.
+*************************************************************************/
+
#include <Arduino.h>
+#include <Wire.h>
#include "MultiLCD.h"
-const PROGMEM unsigned char font16x16[][32] = {
-{0x00,0xE0,0xF8,0xFC,0xFE,0x1E,0x07,0x07,0x07,0x07,0x1E,0xFE,0xFC,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x3F,0x3F,0x7C,0x70,0x70,0x70,0x70,0x7C,0x3F,0x1F,0x1F,0x07,0x00},/*0*/
-{0x00,0x00,0x00,0x06,0x07,0x07,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*1*/
-{0x00,0x38,0x3C,0x3E,0x3E,0x0F,0x07,0x07,0x07,0xCF,0xFF,0xFE,0xFE,0x38,0x00,0x00,0x00,0x40,0x40,0x60,0x70,0x78,0x7C,0x7E,0x7F,0x77,0x73,0x71,0x70,0x70,0x00,0x00},/*2*/
-{0x00,0x18,0x1C,0x1E,0x1E,0x0F,0xC7,0xC7,0xE7,0xFF,0xFE,0xBE,0x9C,0x00,0x00,0x00,0x00,0x0C,0x1C,0x3C,0x3C,0x78,0x70,0x70,0x70,0x79,0x7F,0x3F,0x1F,0x0F,0x00,0x00},/*3*/
-{0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x1E,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x7F,0x7F,0x7F,0x7F,0x06,0x06,0x00},/*4*/
-{0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xE7,0xE7,0xE7,0xE7,0xC7,0x87,0x00,0x00,0x00,0x00,0x38,0x78,0x71,0x70,0x70,0x70,0x70,0x70,0x39,0x3F,0x3F,0x1F,0x0F,0x00},/*5*/
-{0x00,0x80,0xE0,0xF0,0xF8,0xFC,0x7F,0x7F,0x6F,0x67,0xE1,0xE1,0xC0,0x80,0x00,0x00,0x00,0x0F,0x1F,0x3F,0x3F,0x78,0x70,0x70,0x70,0x70,0x78,0x3F,0x3F,0x1F,0x0F,0x00},/*6*/
-{0x00,0x07,0x07,0x07,0x07,0x07,0xC7,0xE7,0xF7,0xFF,0x7F,0x3F,0x1F,0x07,0x03,0x01,0x00,0x20,0x38,0x7C,0x7E,0x3F,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*7*/
-{0x00,0x00,0x00,0x1C,0xBE,0xFE,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFE,0xBE,0x1C,0x00,0x00,0x00,0x0E,0x3F,0x3F,0x7F,0x71,0x60,0x60,0x60,0x71,0x7F,0x3F,0x3F,0x0F,0x00},/*8*/
-{0x00,0x78,0xFC,0xFE,0xFE,0x8F,0x07,0x07,0x07,0x07,0x8F,0xFE,0xFE,0xFC,0xF8,0x00,0x00,0x00,0x00,0x01,0x43,0x43,0x73,0x7B,0x7F,0x7F,0x1F,0x0F,0x07,0x03,0x00,0x00},/*9*/
-};
-
-// The 7-bit ASCII character set...
-const PROGMEM unsigned char font5x8[][5] = {
- { 0x00, 0x00, 0x00, 0x00, 0x00 }, // 20 space
- { 0x00, 0x00, 0x5f, 0x00, 0x00 }, // 21 !
- { 0x00, 0x07, 0x00, 0x07, 0x00 }, // 22 "
- { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // 23 #
- { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // 24 $
- { 0x23, 0x13, 0x08, 0x64, 0x62 }, // 25 %
- { 0x36, 0x49, 0x55, 0x22, 0x50 }, // 26 &
- { 0x00, 0x05, 0x03, 0x00, 0x00 }, // 27 '
- { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // 28 (
- { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // 29 )
- { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // 2a *
- { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // 2b +
- { 0x00, 0x50, 0x30, 0x00, 0x00 }, // 2c ,
- { 0x08, 0x08, 0x08, 0x08, 0x08 }, // 2d -
- { 0x00, 0x60, 0x60, 0x00, 0x00 }, // 2e .
- { 0x20, 0x10, 0x08, 0x04, 0x02 }, // 2f /
- { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 30 0
- { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 31 1
- { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 32 2
- { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 33 3
- { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 34 4
- { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 35 5
- { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 36 6
- { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 37 7
- { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 38 8
- { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 39 9
- { 0x00, 0x36, 0x36, 0x00, 0x00 }, // 3a :
- { 0x00, 0x56, 0x36, 0x00, 0x00 }, // 3b ;
- { 0x08, 0x14, 0x22, 0x41, 0x00 }, // 3c <
- { 0x14, 0x14, 0x14, 0x14, 0x14 }, // 3d =
- { 0x00, 0x41, 0x22, 0x14, 0x08 }, // 3e >
- { 0x02, 0x01, 0x51, 0x09, 0x06 }, // 3f ?
- { 0x32, 0x49, 0x79, 0x41, 0x3e }, // 40 @
- { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // 41 A
- { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // 42 B
- { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // 43 C
- { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // 44 D
- { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // 45 E
- { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // 46 F
- { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // 47 G
- { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // 48 H
- { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // 49 I
- { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // 4a J
- { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // 4b K
- { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // 4c L
- { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // 4d M
- { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // 4e N
- { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // 4f O
- { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // 50 P
- { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // 51 Q
- { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // 52 R
- { 0x46, 0x49, 0x49, 0x49, 0x31 }, // 53 S
- { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // 54 T
- { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // 55 U
- { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // 56 V
- { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // 57 W
- { 0x63, 0x14, 0x08, 0x14, 0x63 }, // 58 X
- { 0x07, 0x08, 0x70, 0x08, 0x07 }, // 59 Y
- { 0x61, 0x51, 0x49, 0x45, 0x43 }, // 5a Z
- { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // 5b [
- { 0x02, 0x04, 0x08, 0x10, 0x20 }, // 5c backslash
- { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // 5d ]
- { 0x04, 0x02, 0x01, 0x02, 0x04 }, // 5e ^
- { 0x40, 0x40, 0x40, 0x40, 0x40 }, // 5f _
- { 0x00, 0x01, 0x02, 0x04, 0x00 }, // 60 `
- { 0x20, 0x54, 0x54, 0x54, 0x78 }, // 61 a
- { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // 62 b
- { 0x38, 0x44, 0x44, 0x44, 0x20 }, // 63 c
- { 0x38, 0x44, 0x44, 0x48, 0x7f }, // 64 d
- { 0x38, 0x54, 0x54, 0x54, 0x18 }, // 65 e
- { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // 66 f
- { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // 67 g
- { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // 68 h
- { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // 69 i
- { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // 6a j
- { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // 6b k
- { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // 6c l
- { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // 6d m
- { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // 6e n
- { 0x38, 0x44, 0x44, 0x44, 0x38 }, // 6f o
- { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // 70 p
- { 0x08, 0x14, 0x14, 0x18, 0x7c }, // 71 q
- { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // 72 r
- { 0x48, 0x54, 0x54, 0x54, 0x20 }, // 73 s
- { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // 74 t
- { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // 75 u
- { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // 76 v
- { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // 77 w
- { 0x44, 0x28, 0x10, 0x28, 0x44 }, // 78 x
- { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // 79 y
- { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // 7a z
- { 0x00, 0x08, 0x36, 0x41, 0x00 }, // 7b {
- { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // 7c |
- { 0x00, 0x41, 0x36, 0x08, 0x00 }, // 7d }
- { 0x10, 0x08, 0x08, 0x10, 0x08 }, // 7e ~
- { 0x00, 0x00, 0x00, 0x00, 0x00 } // 7f
-};
-
-void LCD_OLED::write(char c)
-{
- char s[2] = {c};
- ScI2cMxDisplay8x16Str(OLED_ADDRESS, m_line, m_column, s);
- m_column += 8;
- if (m_column >= 128) {
- m_column = 0;
- m_line += 2;
+void LCD_Common::printInt(unsigned int value, char padding)
+{
+ unsigned int den = 10000;
+ for (byte i = 5; i > 0; i--, den /= 10) {
+ byte v = (byte)(value / den);
+ value -= v * den;
+ if (v == 0 && padding) {
+ if (padding >= i) {
+ writeDigit(-1);
+ }
+ continue;
+ }
+ padding = 0;
+ writeDigit(v);
}
}
-void LCD_OLED::print(const char* s)
+void LCD_Common::printLong(unsigned long value, char padding)
{
- ScI2cMxDisplay8x16Str(OLED_ADDRESS, m_line, m_column, s);
- m_column += (strlen(s) << 3);
- m_line += (m_column >> 7) << 1;
- m_column %= 0x7f;
+ unsigned long den = 1000000000;
+ for (byte i = 10; i > 0; i--, den /= 10) {
+ byte v = (byte)(value / den);
+ value -= v * den;
+ if (v == 0 && padding) {
+ if (padding >= i) {
+ writeDigit(-1);
+ }
+ continue;
+ }
+ padding = 0;
+ writeDigit(v);
+ }
+}
+
+void LCD_ZTOLED::setCursor(byte column, byte line)
+{
+ m_column = column;
+ m_page = line;
+ ScI2cMxSetLocation(OLED_ADDRESS, m_page, m_column);
+ delay(1);
}
-void LCD_OLED::printLarge(const char* s)
+size_t LCD_ZTOLED::write(uint8_t c)
{
- delay(5);
- while (*s) {
- if (*s >= '0' && *s <= '9') {
- char data[32];
- memcpy_P(data, font16x16[*s - '0'], 32);
- ScI2cMxDisplayDot16x16(OLED_ADDRESS, m_line, m_column, data);
+ if (m_font == FONT_SIZE_SMALL) {
+ if (c <= 0x20 || c >= 0x7f) {
+ ScI2cMxFillArea(OLED_ADDRESS, m_column, m_column + 5, m_page, m_page, 0);
} else {
- ScI2cMxFillArea(OLED_ADDRESS, m_line, m_line + 1, m_column, m_column + 16, 0);
+ setCursor(m_column, m_page);
+ ScI2cMxDisplayDot(OLED_ADDRESS, font5x8[c - 0x21], 5);
}
- m_column += 16;
+ m_column += 6;
+ } else {
+ char s[2] = {c};
+ ScI2cMxDisplay8x16Str(OLED_ADDRESS, m_page, m_column, s);
+ m_column += 8;
if (m_column >= 128) {
m_column = 0;
- m_line += 2;
+ m_page += 2;
+ }
+ }
+ return 1;
+}
+
+/*
+void LCD_ZTOLED::print(const char* s)
+{
+ ScI2cMxDisplay8x16Str(OLED_ADDRESS, m_page, m_column, s);
+ m_column += (strlen(s) << 3);
+ m_page += (m_column >> 7) << 1;
+ m_column %= 0x7f;
+}
+*/
+
+void LCD_ZTOLED::writeDigit(byte n)
+{
+ if (n > 9) return;
+
+ if (m_font == FONT_SIZE_SMALL) {
+ setCursor(m_column, m_page);
+ ScI2cMxDisplayDot(OLED_ADDRESS, font5x8[n + ('0' - 0x21)], 5);
+ m_column += 6;
+ } else if (m_font == FONT_SIZE_MEDIUM) {
+ ScI2cMxDisplayDot(OLED_ADDRESS, digits8x8[n], 8);
+ m_column += 8;
+ } else if (m_font == FONT_SIZE_LARGE) {
+ write('0' + n);
+ } else {
+ unsigned char data[32];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(data, digits16x16[n], 32);
+ } else {
+ memset(data, 0, sizeof(data));
}
- s++;
+ ScI2cMxDisplayDot16x16(OLED_ADDRESS, m_page, m_column, data);
+ m_column += 16;
}
}
-void LCD_OLED::clear()
+void LCD_ZTOLED::clear()
{
ScI2cMxFillArea(OLED_ADDRESS, 0, 7, 0, 127, 0);
delay(10);
setCursor(0, 0);
}
-void LCD_OLED::begin()
+void LCD_ZTOLED::begin()
{
I2cInit();
ScI2cMxReset(OLED_ADDRESS);
delay(10);
}
-void LCD_PCD8544::printLarge(const char* s)
+void LCD_PCD8544::writeDigit(byte n)
+{
+ if (m_font == FONT_SIZE_SMALL) {
+ write(n >= 0 && n <= 9 ? '0' + n : ' ');
+ } else if (m_font == FONT_SIZE_MEDIUM) {
+ unsigned char data[8];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(data, digits8x8[n], 8);
+ } else {
+ memset(data, 0, sizeof(data));
+ }
+ draw8x8(data);
+ } else {
+ unsigned char data[32];
+ if (n >= 0 && n <= 9) {
+ memcpy_P(data, digits16x16[n], 32);
+ } else {
+ memset(data, 0, sizeof(data));
+ }
+ draw16x16(data);
+ //column += 16;
+ }
+}
+
+
+void LCD_PCD8544::draw(const unsigned char *data, unsigned char x, unsigned char y, unsigned char width, unsigned char height)
{
- while (*s) {
- if (*s >= '0' && *s <= '9') {
- unsigned char data[32];
- memcpy_P(data, font16x16[*s - '0'], 32);
- drawBitmap(data, 16, 16);
+ height >>= 3;
+ for (unsigned char y = 0; y < height; y++) {
+ setCursor(x, y);
+ for (unsigned char x = 0; x < width; x++) {
+ send(PCD8544_DATA, data[y * width + x]);
+ }
+ }
+}
+
+void LCD_SSD1306::setCursor(byte column, byte line)
+{
+ m_col = column;
+ m_row = line;
+ ssd1306_command(0xB0 + m_row);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+}
+
+size_t LCD_SSD1306::write(uint8_t c)
+{
+ if (m_font == FONT_SIZE_SMALL) {
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ if (c > 0x20 && c < 0x7f) {
+ c -= 0x21;
+ for (byte i = 0; i < 5; i++) {
+ Wire.write(pgm_read_byte_near(&font5x8[c][i]));
+ }
+ Wire.write(0);
+ } else {
+ for (byte i = 0; i < 6; i++) {
+ Wire.write(0);
+ }
+ }
+ Wire.endTransmission();
+ m_col += 8;
+ } else {
+ if (c > 0x20 && c < 0x7f) {
+ c -= 0x21;
+
+ ssd1306_command(0xB0 + m_row);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i <= 14; i += 2) {
+ Wire.write(pgm_read_byte_near(&font8x16_terminal[c][i]));
+ }
+ Wire.endTransmission();
+
+ ssd1306_command(0xB0 + m_row + 1);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 1; i <= 15; i += 2) {
+ Wire.write(pgm_read_byte_near(&font8x16_terminal[c][i]));
+ }
+ Wire.endTransmission();
} else {
- column = (column + 16) % 84;
+ ssd1306_command(0xB0 + m_row);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i < 8; i ++) {
+ Wire.write(0);
+ }
+ Wire.endTransmission();
+
+ ssd1306_command(0xB0 + m_row + 1);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i < 8; i ++) {
+ Wire.write(0);
+ }
+ Wire.endTransmission();
+ }
+ m_col += 9;
+ }
+ return 1;
+}
+
+void LCD_SSD1306::writeDigit(byte n)
+{
+ if (n > 9) return;
+
+ uint8_t twbrbackup = TWBR;
+ TWBR = 18; // upgrade to 400KHz!
+ if (m_font == FONT_SIZE_SMALL) {
+ n += '0' - 0x21;
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i < 5; i++) {
+ Wire.write(pgm_read_byte_near(&font5x8[n][i]));
+ }
+ Wire.write(0);
+ Wire.endTransmission();
+ m_col += 6;
+ } else if (m_font == FONT_SIZE_MEDIUM) {
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i < 8; i++) {
+ Wire.write(pgm_read_byte_near(&digits8x8[n][i]));
+ }
+ Wire.endTransmission();
+ m_col += 8;
+ } else if (m_font == FONT_SIZE_LARGE) {
+ n += '0' - 0x21;
+ ssd1306_command(0xB0 + m_row);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 0; i <= 14; i += 2) {
+ Wire.write(pgm_read_byte_near(&font8x16_terminal[n][i]));
+ }
+ Wire.endTransmission();
+
+ ssd1306_command(0xB0 + m_row + 1);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte i = 1; i <= 15; i += 2) {
+ Wire.write(pgm_read_byte_near(&font8x16_terminal[n][i]));
+ }
+ Wire.endTransmission();
+ m_col += 9;
+ } else if (m_font == FONT_SIZE_XLARGE) {
+ byte i;
+ ssd1306_command(0xB0 + m_row);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (i = 0; i < 16; i ++) {
+ Wire.write(pgm_read_byte_near(&digits16x16[n][i]));
+ }
+ Wire.endTransmission();
+
+ ssd1306_command(0xB0 + m_row + 1);//set page address
+ ssd1306_command(m_col & 0xf);//set lower column address
+ ssd1306_command(0x10 | (m_col >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (; i < 32; i ++) {
+ Wire.write(pgm_read_byte_near(&digits16x16[n][i]));
+ }
+ Wire.endTransmission();
+ m_col += 16;
+ }
+ TWBR = twbrbackup;
+}
+
+void LCD_SSD1306::draw(const PROGMEM byte* buffer, byte x, byte y, byte width, byte height)
+{
+ ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
+ ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+
+ // save I2C bitrate
+ uint8_t twbrbackup = TWBR;
+ TWBR = 18; // upgrade to 400KHz!
+
+ const PROGMEM byte *p = buffer;
+ height >>= 3;
+ width >>= 3;
+ y >>= 3;
+ for (byte i = 0; i < height; i++) {
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + i + y);//set page address
+ ssd1306_command(x & 0xf);//set lower column address
+ ssd1306_command(0x10 | (x >> 4));//set higher column address
+
+ for(byte j = 0; j < 8; j++){
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte k = 0; k < width; k++, p++) {
+ Wire.write(pgm_read_byte_near(p));
+ }
+ Wire.endTransmission();
+ }
+ }
+ TWBR = twbrbackup;
+}
+
+void LCD_SSD1306::clearLine(byte line)
+{
+ ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
+ ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+
+ // save I2C bitrate
+ uint8_t twbrbackup = TWBR;
+ TWBR = 18; // upgrade to 400KHz!
+
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + line);//set page address
+ ssd1306_command(0);//set lower column address
+ ssd1306_command(0x10);//set higher column address
+
+ for(byte j = 0; j < 8; j++){
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte k = 0; k < 16; k++) {
+ Wire.write(0);
+ }
+ Wire.endTransmission();
+ }
+
+ TWBR = twbrbackup;
+}
+
+void LCD_SSD1306::clear(byte x, byte y, byte width, byte height)
+{
+ ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
+ ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+
+ // save I2C bitrate
+ uint8_t twbrbackup = TWBR;
+ TWBR = 18; // upgrade to 400KHz!
+
+ height >>= 3;
+ width >>= 3;
+ y >>= 3;
+ for (byte i = 0; i < height; i++) {
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + i + y);//set page address
+ ssd1306_command(x & 0xf);//set lower column address
+ ssd1306_command(0x10 | (x >> 4));//set higher column address
+
+ for(byte j = 0; j < 8; j++){
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte k = 0; k < width; k++) {
+ Wire.write(0);
+ }
+ Wire.endTransmission();
}
- s++;
}
+ TWBR = twbrbackup;
}
diff --git a/libraries/MultiLCD/MultiLCD.h b/libraries/MultiLCD/MultiLCD.h
index 5a8f7e3..0b761ce 100644
--- a/libraries/MultiLCD/MultiLCD.h
+++ b/libraries/MultiLCD/MultiLCD.h
@@ -1,15 +1,41 @@
-extern const PROGMEM unsigned char font16x32[][32];
-extern const PROGMEM unsigned char font5x8[][5];
+/*************************************************************************
+* Arduino Text Display Library for Multiple LCDs
+* Distributed under GPL v2.0
+* Copyright (c) 2013 Stanley Huang <stanleyhuangyc@live.com>
+* All rights reserved.
+*************************************************************************/
+
+typedef enum {
+ FONT_SIZE_SMALL = 0,
+ FONT_SIZE_MEDIUM,
+ FONT_SIZE_LARGE,
+ FONT_SIZE_XLARGE
+} FONT_SIZE;
+extern const PROGMEM unsigned char font5x8[][5];
+extern const PROGMEM unsigned char digits8x8[][8] ;
+extern const PROGMEM unsigned char digits16x16[][32];
+extern const PROGMEM unsigned char digits16x24[][48];
+extern const PROGMEM unsigned char font8x16_doslike[][16];
+extern const PROGMEM unsigned char font8x16_terminal[][16];
#include "PCD8544.h"
class LCD_Common
{
public:
+ LCD_Common():m_font(0) {}
+ void setFont(FONT_SIZE size) { m_font = size; }
virtual void backlight(bool on) {}
virtual byte getLines() = 0;
virtual byte getCols() = 0;
virtual void changeLine() {}
+ virtual void clearLine(byte line) {}
+ void draw(const PROGMEM byte* buffer, byte x, byte y, byte width, byte height) {}
+ void printInt(uint16_t value, char padding = -1);
+ void printLong(unsigned long value, char padding = -1);
+protected:
+ virtual void writeDigit(byte n) {}
+ byte m_font;
};
class LCD_PCD8544 : public LCD_Common, public PCD8544
@@ -17,7 +43,6 @@ class LCD_PCD8544 : public LCD_Common, public PCD8544
public:
byte getLines() { return 6; }
byte getCols() { return 14; }
- void printLarge(const char* s);
void backlight(bool on)
{
pinMode(7, OUTPUT);
@@ -28,30 +53,34 @@ public:
setCursor(0, line);
for (byte i = 14; i > 0; i--) write(' ');
}
+ void changeLine()
+ {
+ column = 0;
+ line ++;
+ }
+ void draw(const PROGMEM byte* buffer, byte x, byte y, byte width, byte height);
+private:
+ void writeDigit(byte n);
};
#include "ZtLib.h"
#define OLED_ADDRESS 0x27
-class LCD_OLED : public LCD_Common, public ZtLib
+class LCD_ZTOLED : public LCD_Common, public ZtLib, public Print
{
public:
byte getLines() { return 4; }
byte getCols() { return 16; }
- void setCursor(byte column, byte line)
- {
- m_column = column << 3;
- m_line = line << 1;
- }
+ void setCursor(byte column, byte line);
void changeLine()
{
m_column = 0;
- m_line += 2;
+ m_page += 2;
}
- void write(char c);
- void print(const char* s);
- void printLarge(const char* s);
+ size_t write(uint8_t c);
+ //void print(const char* s);
+ void writeDigit(byte n);
void clear();
void begin();
void backlight(bool on) {}
@@ -62,7 +91,7 @@ public:
}
private:
unsigned char m_column;
- unsigned char m_line;
+ unsigned char m_page;
};
#include "LCD4Bit_mod.h"
@@ -71,9 +100,9 @@ class LCD_1602 : public LCD_Common, public LCD4Bit_mod
public:
byte getLines() { return 2; }
byte getCols() { return 16; }
- void printLarge(const char* s)
+ void writeDigit(byte n)
{
- print(s);
+ write(n >= 0 && n <= 9 ? '0' + n : ' ');
}
void clearLine(byte line)
{
@@ -82,3 +111,64 @@ public:
}
};
+#include "SSD1306.h"
+
+class LCD_SSD1306 : public LCD_Common, public SSD1306, public Print
+{
+public:
+ void setCursor(byte column, byte line);
+ void draw(const PROGMEM byte* buffer, byte x, byte y, byte width, byte height);
+ size_t write(uint8_t c);
+ void clear(byte x = 0, byte y = 0, byte width = 128, byte height = 64);
+ void clearLine(byte line);
+ byte getLines() { return 21; }
+ byte getCols() { return 8; }
+private:
+ void writeDigit(byte n);
+ byte m_col;
+ byte m_row;
+};
+
+class LCD_ILI9325D : public LCD_Common, public Print
+{
+public:
+ LCD_ILI9325D():m_lineHeight(10) {}
+ void setCursor(uint16_t column, uint16_t line)
+ {
+ m_y = column;
+ m_x = line * m_lineHeight;
+ }
+ void setColor(uint16_t textColor, uint16_t bgColor = 0)
+ {
+ m_color[0] = bgColor;
+ m_color[1] = textColor;
+ }
+ void begin();
+ void clear(uint16_t x = 0, uint16_t y = 0, uint16_t width = 320, uint16_t height = 240);
+ void draw(const PROGMEM byte* buffer, uint16_t x, uint16_t y, uint16_t width, uint16_t height);
+ void draw2x(const PROGMEM byte* buffer, uint16_t x, uint16_t y, byte width, byte height);
+ void draw4bpp(const PROGMEM byte* buffer, uint16_t x, uint16_t y, uint16_t width, uint16_t height);
+ size_t write(uint8_t);
+ void clearLine(byte line)
+ {
+ clear(0, line * m_lineHeight, 320, 8);
+ }
+ void setLineHeight(byte lineHeight) { m_lineHeight = lineHeight; }
+ byte getLines() { return 53; }
+ byte getCols() { return 30; }
+private:
+ void writeDigit(byte n);
+ void SetXY(uint16_t x0,uint16_t x1,uint16_t y0,uint16_t y1);
+ void WriteData(uint16_t c);
+ void WriteData(byte l, byte h);
+ void WriteCommandData(uint16_t cmd,uint16_t dat);
+ void Enable();
+ void Disable();
+ void SetCommandMode();
+ void SetDataMode();
+ int m_x;
+ int m_y;
+ uint16_t m_color[2];
+ byte m_lineHeight;
+ byte lastData;
+};
diff --git a/libraries/MultiLCD/PCD8544.cpp b/libraries/MultiLCD/PCD8544.cpp
index a54bfc8..9bd62c5 100644
--- a/libraries/MultiLCD/PCD8544.cpp
+++ b/libraries/MultiLCD/PCD8544.cpp
@@ -28,10 +28,6 @@
#include <Arduino.h>
#include <avr/pgmspace.h>
-
-#define PCD8544_CMD LOW
-#define PCD8544_DATA HIGH
-
extern const PROGMEM unsigned char font5x8[][5];
/*
@@ -50,11 +46,8 @@ PCD8544::PCD8544(unsigned char sclk, unsigned char sdin,
{}
-void PCD8544::begin(unsigned char width, unsigned char height, unsigned char model)
+void PCD8544::begin(unsigned char model)
{
- this->width = width;
- this->height = height;
-
this->column = 0;
this->line = 0;
@@ -114,7 +107,7 @@ void PCD8544::clear()
{
this->setCursor(0, 0);
- for (unsigned short i = 0; i < this->width * (this->height/8); i++) {
+ for (unsigned short i = 0; i < PCD8544_WIDTH * (PCD8544_HEIGHT/8); i++) {
this->send(PCD8544_DATA, 0x00);
}
@@ -126,7 +119,7 @@ void PCD8544::clearLine()
{
this->setCursor(0, this->line);
- for (unsigned char i = 0; i < this->width; i++) {
+ for (unsigned char i = 0; i < PCD8544_WIDTH; i++) {
this->send(PCD8544_DATA, 0x00);
}
@@ -166,11 +159,18 @@ void PCD8544::home()
void PCD8544::setCursor(unsigned char column, unsigned char line)
{
- this->column = (column * 6 % this->width);
- this->line = (line % (this->height/9 + 1));
+ if (column > PCD8544_WIDTH) {
+ column = 0;
+ line++;
+ }
+ if (line > PCD8544_HEIGHT / 8)
+ line = 0;
+
+ this->column = column;
+ this->line = line;
- this->send(PCD8544_CMD, 0x80 | this->column);
- this->send(PCD8544_CMD, 0x40 | this->line);
+ this->send(PCD8544_CMD, 0x80 | column);
+ this->send(PCD8544_CMD, 0x40 | line);
}
@@ -227,10 +227,10 @@ size_t PCD8544::write(uint8_t chr)
this->send(PCD8544_DATA, 0x00);
// Update the cursor position...
- this->column = (this->column + 6) % this->width;
+ this->column = (this->column + 6) % PCD8544_WIDTH;
if (this->column == 0) {
- this->line = (this->line + 1) % (this->height/9 + 1);
+ this->line = (this->line + 1) % (PCD8544_HEIGHT/9 + 1);
}
#if ARDUINO >= 100
@@ -238,29 +238,31 @@ size_t PCD8544::write(uint8_t chr)
#endif
}
+void PCD8544::draw8x8(const unsigned char *data)
+{
+ // Output one column at a time...
+ for (unsigned char i = 0; i < 8; i++) {
+ this->send(PCD8544_DATA, data[i]);
+ }
+ this->setCursor(column + 8, line);
+}
-void PCD8544::drawBitmap(const unsigned char *data, unsigned char columns, unsigned char lines)
+void PCD8544::draw16x16(const unsigned char *data)
{
unsigned char scolumn = this->column;
unsigned char sline = this->line;
-
- // The bitmap will be clipped at the right/bottom edge of the display...
- unsigned char mx = (scolumn + columns > this->width) ? (this->width - scolumn) : columns;
- unsigned char my = (sline + lines > this->height/8) ? (this->height/8 - sline) : lines;
-
- for (unsigned char y = 0; y < my; y++) {
- this->setCursor(scolumn, sline + y);
-
- for (unsigned char x = 0; x < mx; x++) {
- this->send(PCD8544_DATA, data[y * columns + x]);
- }
+ // Output one column at a time...
+ for (unsigned char i = 0; i < 16; i++) {
+ this->send(PCD8544_DATA, data[i]);
}
-
- // Leave the cursor in a consistent position...
- this->setCursor(scolumn + columns, sline);
+ this->setCursor(scolumn, sline + 1);
+ for (unsigned char i = 0; i < 16; i++) {
+ this->send(PCD8544_DATA, data[i + 16]);
+ }
+ // Update the cursor position...
+ this->setCursor(scolumn + 16, sline);
}
-
void PCD8544::drawColumn(unsigned char lines, unsigned char value)
{
unsigned char scolumn = this->column;
diff --git a/libraries/MultiLCD/PCD8544.h b/libraries/MultiLCD/PCD8544.h
index c6e8d43..c96bc7e 100644
--- a/libraries/MultiLCD/PCD8544.h
+++ b/libraries/MultiLCD/PCD8544.h
@@ -33,11 +33,15 @@
#include <Arduino.h>
#endif
-
// Chip variants supported...
#define CHIP_PCD8544 0
#define CHIP_ST7576 1
+#define PCD8544_WIDTH 84
+#define PCD8544_HEIGHT 48
+
+#define PCD8544_CMD LOW
+#define PCD8544_DATA HIGH
class PCD8544: public Print {
public:
@@ -49,7 +53,7 @@ class PCD8544: public Print {
unsigned char sce = 5); /* enable (display pin 5) */
// Display initialization (dimensions in pixels)...
- void begin(unsigned char width=84, unsigned char height=48, unsigned char model=CHIP_PCD8544);
+ void begin(unsigned char model=CHIP_PCD8544);
void stop();
// Erase everything on the display...
@@ -82,21 +86,18 @@ class PCD8544: public Print {
virtual size_t write(uint8_t chr);
#endif
- // Draw a bitmap at the current cursor position...
- void drawBitmap(const unsigned char *data, unsigned char columns, unsigned char lines);
-
// Draw a chart element at the current cursor position...
void drawColumn(unsigned char lines, unsigned char value);
- void changeLine()
- {
- column = 0;
- line ++;
- }
+ void draw8x8(const unsigned char *data);
+ void draw16x16(const unsigned char *data);
+
protected:
// Current cursor position...
unsigned char column;
unsigned char line;
+ // Send a command or data to the display...
+ void send(unsigned char type, unsigned char data);
private:
unsigned char pin_sclk;
@@ -105,16 +106,8 @@ class PCD8544: public Print {
unsigned char pin_reset;
unsigned char pin_sce;
- // The size of the display, in pixels...
- unsigned char width;
- unsigned char height;
-
-
// User-defined glyphs (below the ASCII space character)...
const unsigned char *custom[' '];
-
- // Send a command or data to the display...
- void send(unsigned char type, unsigned char data);
};
diff --git a/libraries/MultiLCD/README.txt b/libraries/MultiLCD/README.txt
new file mode 100644
index 0000000..e94646e
--- /dev/null
+++ b/libraries/MultiLCD/README.txt
@@ -0,0 +1,9 @@
+This is the source code for the Arduino OBD-II data logger, which displays (on a 128x64 OLED display module) and records (to a SD card) a selected set of OBD-II data. For hardware configuration and wiring guide, please refer to:
+http://obd.arduinodev.com
+
+The recorded data is stored in CSV format and the file can be illustrated into a graphic chart by a free service at:
+http://obd.arduinodev.com/view.html
+
+To open the project file (obdlogger.cbp), please download CodeBlocks Arduino Edition (http://www.arduinodev.com/codeblocks).
+
+The source code is distributed under GPL license.
diff --git a/libraries/MultiLCD/SSD1306.cpp b/libraries/MultiLCD/SSD1306.cpp
new file mode 100644
index 0000000..7f7b8e8
--- /dev/null
+++ b/libraries/MultiLCD/SSD1306.cpp
@@ -0,0 +1,273 @@
+#include <avr/pgmspace.h>
+#include <util/delay.h>
+#include <stdlib.h>
+#include <Wire.h>
+#include "SSD1306.h"
+
+SSD1306::SSD1306(int8_t SCLK, int8_t DC, int8_t RST, int8_t CS) {
+ cs = CS;
+ rst = RST;
+ dc = DC;
+ sclk = SCLK;
+}
+
+// initializer for I2C - we only indicate the reset pin!
+ SSD1306::SSD1306(int8_t reset) {
+ sclk = dc = cs = -1;
+ rst = reset;
+}
+
+
+void SSD1306::begin(uint8_t vccstate, uint8_t i2caddr) {
+ _i2caddr = i2caddr;
+
+
+ // set pin directions
+ // I2C Init
+ Wire.begin(); // Is this the right place for this?
+
+ // Setup reset pin direction (used by both SPI and I2C)
+ pinMode(rst, OUTPUT);
+ digitalWrite(rst, HIGH);
+ // VDD (3.3V) goes high at start, lets just chill for a ms
+ delay(1);
+ // bring reset low
+ digitalWrite(rst, LOW);
+ // wait 10ms
+ delay(10);
+ // bring out of reset
+ digitalWrite(rst, HIGH);
+ // turn on VCC (9V?)
+ #if defined SSD1306_128_32
+ // Init sequence for 128x32 OLED module
+ ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
+ ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
+ ssd1306_command(0x80); // the suggested ratio 0x80
+ ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
+ ssd1306_command(0x1F);
+ ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
+ ssd1306_command(0x0); // no offset
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+ ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x10); }
+ else
+ { ssd1306_command(0x14); }
+ ssd1306_command(SSD1306_MEMORYMODE); // 0x20
+ ssd1306_command(0x00); // 0x0 act like ks0108
+ ssd1306_command(SSD1306_SEGREMAP | 0x1);
+ ssd1306_command(SSD1306_COMSCANDEC);
+ ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
+ ssd1306_command(0x02);
+ ssd1306_command(SSD1306_SETCONTRAST); // 0x81
+ ssd1306_command(0x8F);
+ ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x22); }
+ else
+ { ssd1306_command(0xF1); }
+ ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
+ ssd1306_command(0x40);
+ ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
+ ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
+ #endif
+
+ #if defined SSD1306_128_64
+ // Init sequence for 128x64 OLED module
+ ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
+ ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
+ ssd1306_command(0x80); // the suggested ratio 0x80
+ ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
+ ssd1306_command(0x3F);
+ ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
+ ssd1306_command(0x0); // no offset
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+ ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x10); }
+ else
+ { ssd1306_command(0x14); }
+ ssd1306_command(SSD1306_MEMORYMODE); // 0x20
+ ssd1306_command(0x00); // 0x0 act like ks0108
+ ssd1306_command(SSD1306_SEGREMAP | 0x1);
+ ssd1306_command(SSD1306_COMSCANDEC);
+ ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
+ ssd1306_command(0x12);
+ ssd1306_command(SSD1306_SETCONTRAST); // 0x81
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x9F); }
+ else
+ { ssd1306_command(0xCF); }
+ ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
+ if (vccstate == SSD1306_EXTERNALVCC)
+ { ssd1306_command(0x22); }
+ else
+ { ssd1306_command(0xF1); }
+ ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
+ ssd1306_command(0x40);
+ ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
+ ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
+ #endif
+
+ ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel
+
+ // clear screen
+ delay(5);
+
+ ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
+ ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
+ ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
+
+ for (byte i = 0; i < SSD1306_LCDHEIGHT / 8; i++) {
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + i);//set page address
+ ssd1306_command(0);//set lower column address
+ ssd1306_command(0x10);//set higher column address
+
+ for(byte j = 0; j < 8; j++){
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte k = 0; k < SSD1306_LCDWIDTH / 8; k++) {
+ Wire.write(0);
+ }
+ Wire.endTransmission();
+ }
+ }
+}
+
+
+void SSD1306::invertDisplay(uint8_t i) {
+ if (i) {
+ ssd1306_command(SSD1306_INVERTDISPLAY);
+ } else {
+ ssd1306_command(SSD1306_NORMALDISPLAY);
+ }
+}
+
+void SSD1306::ssd1306_command(uint8_t c) {
+ // I2C
+ uint8_t control = 0x00; // Co = 0, D/C = 0
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(control);
+ Wire.write(c);
+ Wire.endTransmission();
+}
+
+// startscrollright
+// Activate a right handed scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void SSD1306::startscrollright(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_RIGHT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(0XFF);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrollleft
+// Activate a right handed scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void SSD1306::startscrollleft(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_LEFT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(0XFF);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrolldiagright
+// Activate a diagonal scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA);
+ ssd1306_command(0X00);
+ ssd1306_command(SSD1306_LCDHEIGHT);
+ ssd1306_command(SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+// startscrolldiagleft
+// Activate a diagonal scroll for rows start through stop
+// Hint, the display is 16 rows tall. To scroll the whole display, run:
+// display.scrollright(0x00, 0x0F)
+void SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){
+ ssd1306_command(SSD1306_SET_VERTICAL_SCROLL_AREA);
+ ssd1306_command(0X00);
+ ssd1306_command(SSD1306_LCDHEIGHT);
+ ssd1306_command(SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL);
+ ssd1306_command(0X00);
+ ssd1306_command(start);
+ ssd1306_command(0X00);
+ ssd1306_command(stop);
+ ssd1306_command(0X01);
+ ssd1306_command(SSD1306_ACTIVATE_SCROLL);
+}
+
+void SSD1306::stopscroll(void){
+ ssd1306_command(SSD1306_DEACTIVATE_SCROLL);
+}
+
+void SSD1306::ssd1306_data(uint8_t c) {
+ // I2C
+ uint8_t control = 0x40; // Co = 0, D/C = 1
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(control);
+ Wire.write(c);
+ Wire.endTransmission();
+}
+
+void SSD1306::fill(unsigned char dat)
+{
+ unsigned char i,j;
+
+ ssd1306_command(0x00);//set lower column address
+ ssd1306_command(0x10);//set higher column address
+ ssd1306_command(0xB0);//set page address
+
+ uint8_t twbrbackup = TWBR;
+ TWBR = 18; // upgrade to 400KHz!
+ for (byte i=0; i<(SSD1306_LCDHEIGHT/8); i++)
+ {
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + i);//set page address
+ ssd1306_command(0);//set lower column address
+ ssd1306_command(0x10);//set higher column address
+
+ for(byte j = 0; j < 8; j++){
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ for (byte k = 0; k < 16; k++) {
+ Wire.write(dat);
+ }
+ Wire.endTransmission();
+ }
+ }
+ TWBR = twbrbackup;
+}
+
+void SSD1306::draw8x8(byte* buffer, uint8_t x, uint8_t y)
+{
+ // send a bunch of data in one xmission
+ ssd1306_command(0xB0 + y);//set page address
+ ssd1306_command(x & 0xf);//set lower column address
+ ssd1306_command(0x10 | (x >> 4));//set higher column address
+
+ Wire.beginTransmission(_i2caddr);
+ Wire.write(0x40);
+ Wire.write(buffer, 8);
+ Wire.endTransmission();
+}
diff --git a/libraries/MultiLCD/SSD1306.h b/libraries/MultiLCD/SSD1306.h
new file mode 100644
index 0000000..aaa3534
--- /dev/null
+++ b/libraries/MultiLCD/SSD1306.h
@@ -0,0 +1,119 @@
+#if ARDUINO >= 100
+ #include "Arduino.h"
+#else
+ #include "WProgram.h"
+#endif
+
+#define BLACK 0
+#define WHITE 1
+
+#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
+// Address for 128x32 is 0x3C
+// Address for 128x32 is 0x3D (default) or 0x3C (if SA0 is grounded)
+
+/*=========================================================================
+ SSD1306 Displays
+ -----------------------------------------------------------------------
+ The driver is used in multiple displays (128x64, 128x32, etc.).
+ Select the appropriate display below to create an appropriately
+ sized framebuffer, etc.
+
+ SSD1306_128_64 128x64 pixel display
+
+ SSD1306_128_32 128x32 pixel display
+
+ You also need to set the LCDWIDTH and LCDHEIGHT defines to an
+ appropriate size
+
+ -----------------------------------------------------------------------*/
+ #define SSD1306_128_64
+// #define SSD1306_128_32
+/*=========================================================================*/
+
+#if defined SSD1306_128_64 && defined SSD1306_128_32
+ #error "Only one SSD1306 display can be specified at once in SSD1306.h"
+#endif
+#if !defined SSD1306_128_64 && !defined SSD1306_128_32
+ #error "At least one SSD1306 display must be specified in SSD1306.h"
+#endif
+
+#if defined SSD1306_128_64
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 64
+#endif
+#if defined SSD1306_128_32
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 32
+#endif
+
+#define SSD1306_SETCONTRAST 0x81
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_DISPLAYALLON 0xA5
+#define SSD1306_NORMALDISPLAY 0xA6
+#define SSD1306_INVERTDISPLAY 0xA7
+#define SSD1306_DISPLAYOFF 0xAE
+#define SSD1306_DISPLAYON 0xAF
+
+#define SSD1306_SETDISPLAYOFFSET 0xD3
+#define SSD1306_SETCOMPINS 0xDA
+
+#define SSD1306_SETVCOMDETECT 0xDB
+
+#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
+#define SSD1306_SETPRECHARGE 0xD9
+
+#define SSD1306_SETMULTIPLEX 0xA8
+
+#define SSD1306_SETLOWCOLUMN 0x00
+#define SSD1306_SETHIGHCOLUMN 0x10
+
+#define SSD1306_SETSTARTLINE 0x40
+
+#define SSD1306_MEMORYMODE 0x20
+
+#define SSD1306_COMSCANINC 0xC0
+#define SSD1306_COMSCANDEC 0xC8
+
+#define SSD1306_SEGREMAP 0xA0
+
+#define SSD1306_CHARGEPUMP 0x8D
+
+#define SSD1306_EXTERNALVCC 0x1
+#define SSD1306_SWITCHCAPVCC 0x2
+
+// Scrolling #defines
+#define SSD1306_ACTIVATE_SCROLL 0x2F
+#define SSD1306_DEACTIVATE_SCROLL 0x2E
+#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
+#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
+#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
+#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
+#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
+
+class SSD1306 {
+public:
+ SSD1306(int8_t SCLK, int8_t DC, int8_t RST, int8_t CS);
+ SSD1306(int8_t RST = 4);
+
+ void begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = SSD1306_I2C_ADDRESS);
+ void ssd1306_command(uint8_t c);
+ void ssd1306_data(uint8_t c);
+
+ void invertDisplay(uint8_t i);
+ void draw8x8(byte* buffer, byte x, byte y);
+
+ void startscrollright(uint8_t start, uint8_t stop);
+ void startscrollleft(uint8_t start, uint8_t stop);
+
+ void startscrolldiagright(uint8_t start, uint8_t stop);
+ void startscrolldiagleft(uint8_t start, uint8_t stop);
+ void stopscroll(void);
+
+ void fill(unsigned char dat);
+ void clearBuffer();
+
+protected:
+ uint8_t _i2caddr;
+private:
+ int8_t sclk, dc, rst, cs;
+};
diff --git a/libraries/MultiLCD/ZtLib.cpp b/libraries/MultiLCD/ZtLib.cpp
index f8b55df..ecda4c4 100644
--- a/libraries/MultiLCD/ZtLib.cpp
+++ b/libraries/MultiLCD/ZtLib.cpp
@@ -8,10 +8,8 @@
Version:V1.1
*/
+#include <Arduino.h>
extern "C" {
- #include <stdlib.h>
- #include <string.h>
- #include <inttypes.h>
#include "../Wire/utility/twi.h"
}
@@ -522,7 +520,7 @@ int ZtLib::ScI2cMxSetLocation(uint8_t addr, uint8_t page,uint8_t column)
* 3 .. data send, NACK received
* 4 .. other twi error (lost bus arbitration, bus error, ..)
*/
-void ZtLib::ScI2cMxDisplayDot16x16(uint8_t addr, uint8_t page, uint8_t column, const char *str)
+void ZtLib::ScI2cMxDisplayDot16x16(uint8_t addr, uint8_t page, uint8_t column, unsigned char *str)
{
uint8_t buff[17];
buff[0] = REG_DAT;
@@ -539,6 +537,14 @@ void ZtLib::ScI2cMxDisplayDot16x16(uint8_t addr, uint8_t page, uint8_t column, c
}
twi_writeTo(addr, buff, 17, 1, 1);
}
+
+void ZtLib::ScI2cMxDisplayDot(uint8_t addr, const PROGMEM uint8_t* buffer, uint8_t len)
+{
+ uint8_t buff[9] = {REG_DAT};
+ memcpy_P(buff + 1, buffer, len);
+ twi_writeTo(addr, buff, 9, 1, 1);
+}
+
/*
* Function ScI2cMxDisplayArea
* Desc Set ZT.SC-I2CMx Display Area
diff --git a/libraries/MultiLCD/ZtLib.h b/libraries/MultiLCD/ZtLib.h
index b93ccc1..dd7dd5a 100644
--- a/libraries/MultiLCD/ZtLib.h
+++ b/libraries/MultiLCD/ZtLib.h
@@ -1,10 +1,10 @@
/*
ZtLib.cpp - ZT module Drive Library for Wiring & Arduino
Copyright (c) 2012 Alvin Li(Kozig/www.kozig.com). All right reserved.
- This library is free software;
+ This library is free software;
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Version:V1.1
*/
@@ -26,8 +26,8 @@
#define DOT_BIT4 (1<<3)
#define DISP_0BIT (0)
-#define DISP_1BIT (1)
-#define DISP_2BIT (2)
+#define DISP_1BIT (1)
+#define DISP_2BIT (2)
#define DISP_3BIT (3)
#define DISP_4BIT (4)
#define DISP_AUTO (5)
@@ -89,7 +89,7 @@
class ZtLib
{
private:
-
+
public:
void I2cInit(void);
// Module ZT.SEG8B4A036A FUNCTION
@@ -102,7 +102,7 @@ class ZtLib
int Seg8b4a036aSetBrightness(uint8_t, uint8_t, uint8_t);
int Seg8b4a036aSetAddress(uint8_t);
int Seg8b4a036aDisplayBuff(uint8_t,uint8_t *);
-// Module ZT.SC-I2CMx
+// Module ZT.SC-I2CMx
int ScI2cMxReadState(uint8_t);
int ScI2cMxReadVersion(uint8_t, uint8_t *);
int ScI2cMxSetAddress(uint8_t);
@@ -116,7 +116,8 @@ class ZtLib
int ScI2cMxDeactivateScroll(uint8_t);
int ScI2cMxReset(uint8_t);
int ScI2cMxSetLocation(uint8_t, uint8_t, uint8_t);
- void ScI2cMxDisplayDot16x16(uint8_t, uint8_t, uint8_t, const char *);
+ void ScI2cMxDisplayDot(uint8_t, const PROGMEM uint8_t* buffer, uint8_t len);
+ void ScI2cMxDisplayDot16x16(uint8_t, uint8_t, uint8_t, unsigned char *);
void ScI2cMxDisplayArea(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, const char *);
};
diff --git a/libraries/MultiLCD/examples/lcdhello/images.h b/libraries/MultiLCD/examples/lcdhello/images.h
new file mode 100644
index 0000000..4a84691
--- /dev/null
+++ b/libraries/MultiLCD/examples/lcdhello/images.h
@@ -0,0 +1,80 @@
+const unsigned char PROGMEM frame0[78][58 * 2] = {
+{0xe3,0x20,0xec,0x5a,0xcb,0x5a,0x6a,0x4a,0x28,0x42,0xc7,0x39,0x86,0x31,0x25,0x29,0x04,0x21,0xa3,0x18,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x18,0xe3,0x20,0x04,0x21,0x65,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0x8a,0x52,0xaa,0x5a,0xc4,0x18},
+{0xec,0x5a,0x8d,0x73,0xab,0x52,0x49,0x4a,0x29,0x42,0x07,0x42,0xa7,0x31,0x86,0x31,0x66,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x44,0x29,0x45,0x21,0x45,0x29,0x66,0x29,0xa6,0x39,0xc7,0x39,0x07,0x42,0x29,0x42,0x89,0x52,0x6d,0x6b,0xcb,0x5a},
+{0x2c,0x6b,0xcb,0x5a,0xe7,0x39,0x86,0x31,0x65,0x29,0x25,0x21,0x04,0x21,0xc3,0x18,0xa2,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0xa2,0x10,0xc3,0x18,0x04,0x21,0x25,0x29,0x86,0x31,0xa7,0x39,0xaa,0x5a,0xec,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x85,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0xaa,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcb,0x5a},
+{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a},
+{0x2c,0x63,0xab,0x52,0xc7,0x39,0x66,0x31,0x65,0x29,0x04,0x21,0xe3,0x18,0xa3,0x10,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a},
+{0x2d,0x63,0xcb,0x5a,0xc7,0x39,0xa6,0x39,0x66,0x29,0x24,0x29,0x04,0x19,0xc3,0x18,0x83,0x10,0x61,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x61,0x10,0xa3,0x10,0xc3,0x18,0x04,0x19,0x44,0x29,0x66,0x29,0xc7,0x39,0xcb,0x52,0xcb,0x5a},
+{0x0c,0x63,0x6e,0x73,0xaa,0x52,0x49,0x4a,0x28,0x4a,0xe8,0x41,0xc7,0x39,0x86,0x31,0x65,0x31,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x65,0x31,0x86,0x31,0xe7,0x39,0xe8,0x41,0x49,0x4a,0x8a,0x52,0x6d,0x73,0xcc,0x5a},
+{0xe4,0x18,0xeb,0x62,0xcb,0x5a,0x69,0x52,0x09,0x42,0xc7,0x39,0x86,0x29,0x44,0x29,0x04,0x19,0xc2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x45,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0xaa,0x5a,0xcb,0x52,0xc3,0x18},
+};
diff --git a/libraries/MultiLCD/examples/lcdhello/lcdhello.ino b/libraries/MultiLCD/examples/lcdhello/lcdhello.ino
index 55f07e5..cbfbc9b 100644
--- a/libraries/MultiLCD/examples/lcdhello/lcdhello.ino
+++ b/libraries/MultiLCD/examples/lcdhello/lcdhello.ino
@@ -1,20 +1,74 @@
+/*************************************************************************
+* Demo sketch of Arduino Text Display Library for Multiple LCDs
+* Distributed under GPL v2.0
+* Copyright (c) 2013 Stanley Huang <stanleyhuangyc@live.com>
+* All rights reserved.
+*************************************************************************/
+
#include <Arduino.h>
#include <Wire.h>
#include <MultiLCD.h>
-//LCD_OLED lcd; /* for I2C OLED module */
+LCD_SSD1306 lcd; /* for SSD1306 OLED module */
//LCD_PCD8544 lcd; /* for LCD4884 shield or Nokia 5100 screen module */
-LCD_1602 lcd; /* for LCD1602 shield */
+//LCD_1602 lcd; /* for LCD1602 shield */
+//LCD_ZTOLED lcd; /* for ZT OLED module */
+//LCD_ILI9325D lcd; /* for Itead 2.8" TFT shield */
+
+static const PROGMEM uint8_t smile[48 * 48 / 8] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xFC,0xFC,0xFE,0xFE,0x7E,0x7F,0x7F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F,0x7F,0x7E,0xFE,0xFE,0xFC,0xFC,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0xC0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFE,0xFC,0xF0,0xC0,0x00,
+0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x1F,0x1F,0x1F,0x3F,0x1F,0x1F,0x02,0x00,0x00,0x00,0x00,0x06,0x1F,0x1F,0x1F,0x3F,0x1F,0x1F,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
+0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x30,0xF8,0xF8,0xF8,0xF8,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xF8,0xFC,0xF8,0x30,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
+0x00,0x03,0x0F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFC,0xF8,0xF0,0xE1,0xC7,0x87,0x0F,0x1F,0x3F,0x3F,0x3E,0x7E,0x7C,0x7C,0x7C,0x78,0x78,0x7C,0x7C,0x7C,0x7E,0x3E,0x3F,0x3F,0x1F,0x0F,0x87,0xC7,0xE1,0xF0,0xF8,0xFC,0xFF,0xFF,0xFF,0x7F,0x3F,0x0F,0x03,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x1F,0x3F,0x3F,0x7F,0x7F,0x7E,0xFE,0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE,0xFE,0x7E,0x7F,0x7F,0x3F,0x3F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+#include "images.h"
void setup()
{
lcd.begin();
- lcd.setCursor(0, 0);
- lcd.print("Hello, World");
- lcd.setCursor(0, 1);
- lcd.printLarge("12345");
}
void loop()
{
+ //lcd.draw2x(frame0[0], 0, 124, 78, 58);
+ //lcd.draw2x(frame0[0], 164, 124, 78, 58);
+ //lcd.draw2x(frame0[0], 0, 0, 78, 58);
+ //lcd.draw2x(frame0[0], 164, 0, 78, 58);
+ lcd.clear();
+ lcd.draw(smile, 40, 0, 48, 48);
+ lcd.setCursor(0, 6);
+ lcd.setFont(FONT_SIZE_MEDIUM);
+ lcd.print("Microduino+BLE");
+
+ delay(3000);
+
+ lcd.clear();
+ lcd.setCursor(0, 0);
+ lcd.setFont(FONT_SIZE_SMALL);
+ lcd.print("Hello, world!");
+
+ lcd.setCursor(0, 1);
+ lcd.setFont(FONT_SIZE_MEDIUM);
+ lcd.print("Hello, world!");
+
+ lcd.setCursor(0, 3);
+ lcd.setFont(FONT_SIZE_SMALL);
+ lcd.printLong(12345678);
+
+ lcd.setCursor(64, 3);
+ lcd.setFont(FONT_SIZE_MEDIUM);
+ lcd.printLong(12345678);
+
+ lcd.setCursor(0, 4);
+ lcd.setFont(FONT_SIZE_LARGE);
+ lcd.printLong(12345678);
+
+ lcd.setCursor(0, 6);
+ lcd.setFont(FONT_SIZE_XLARGE);
+ lcd.printLong(12345678);
+
+ delay(3000);
}
diff --git a/libraries/MultiLCD/fonts.cpp b/libraries/MultiLCD/fonts.cpp
new file mode 100644
index 0000000..fa7f979
--- /dev/null
+++ b/libraries/MultiLCD/fonts.cpp
@@ -0,0 +1,331 @@
+#include <Arduino.h>
+#include "MultiLCD.h"
+
+const PROGMEM unsigned char digits16x24[][48] = {
+{0x00,0x00,0x00,0xF0,0xFF,0x0F,0xFC,0xFF,0x3F,0xFE,0xFF,0x7F,0xFE,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x00,0xE0,0x07,0x00,0xE0,0x07,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7F,0xFE,0xFF,0x7F,0xFC,0xFF,0x3F,0xF0,0xFF,0x0F},/*"0",0*/
+{0x00,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x78,0x00,0x00,0xF8,0x00,0x00,0xFC,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",0*/
+{0x00,0x00,0x00,0xF8,0x00,0xE0,0xFC,0x00,0xF8,0xFE,0x00,0xFE,0xFE,0x80,0xFF,0xFF,0xC0,0xFF,0x07,0xF0,0xFF,0x07,0xFC,0xFF,0x07,0xFF,0xEF,0xFF,0xFF,0xE3,0xFF,0xFF,0xE1,0xFE,0x7F,0xE0,0xFE,0x3F,0xE0,0xFC,0x0F,0xE0,0xF0,0x03,0x00,0x00,0x00,0x00},/*"2",2*/
+{0x00,0x00,0x00,0xF8,0x80,0x1F,0xFE,0x80,0x3F,0xFE,0x80,0x7F,0xFF,0x80,0x7F,0xFF,0x80,0xFF,0xFF,0x9C,0xFF,0xFF,0x9C,0xFF,0x07,0x1C,0xE0,0x07,0x3E,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7F,0xFE,0xF7,0x7F,0xFC,0xF7,0x3F,0xF0,0xE3,0x1F},/*"3",3*/
+{0x00,0xF0,0x0F,0x00,0xFE,0x0F,0x80,0xFF,0x0F,0xE0,0xFF,0x0F,0xFC,0xBF,0x0F,0xFF,0x87,0x0F,0xFF,0x81,0x0F,0x3F,0x80,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x0F,0x00,0x80,0x0F},/*"4",4*/
+{0x00,0x00,0x00,0xFF,0xC7,0x0F,0xFF,0xC7,0x3F,0xFF,0xC7,0x7F,0xFF,0xC7,0x7F,0xFF,0xC7,0xFF,0xFF,0xC7,0xFF,0x87,0x01,0xE0,0xC7,0x01,0xE0,0xC7,0x01,0xE0,0xC7,0xFF,0xFF,0xC7,0xFF,0xFF,0xC7,0xFF,0x7F,0x87,0xFF,0x7F,0x87,0xFF,0x3F,0x07,0xFE,0x1F},/*"5",5*/
+{0x00,0x00,0x00,0xF0,0xFF,0x0F,0xFC,0xFF,0x3F,0xFE,0xFF,0x7F,0xFE,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x06,0xE0,0x07,0x07,0xE0,0x07,0x07,0xE0,0x3F,0xFF,0xFF,0x3F,0xFF,0xFF,0x3E,0xFF,0x7F,0x3E,0xFE,0x7F,0x3C,0xFE,0x3F,0x38,0xF8,0x1F},/*"6",6*/
+{0x00,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0xC0,0x07,0x00,0xF8,0x07,0x00,0xFF,0x07,0xE0,0xFF,0x07,0xFE,0xFF,0xC7,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0x07,0xFF,0xFF,0x00,0xFF,0x0F,0x00,0xFF,0x01,0x00,0x1F,0x00,0x00,0x00,0x00,0x00},/*"7",1*/
+{0x00,0x00,0x00,0xF0,0xE3,0x1F,0xFC,0xF7,0x3F,0xFE,0xFF,0x7F,0xFE,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x1C,0xE0,0x07,0x1C,0xE0,0x07,0x1C,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7F,0xFE,0xF7,0x7F,0xFC,0xF7,0x3F,0xF0,0xE3,0x1F},/*"8",8*/
+{0x00,0x00,0x00,0xF8,0x1F,0x1C,0xFC,0x7F,0x3C,0xFE,0x7F,0x7C,0xFE,0xFF,0x7C,0xFF,0xFF,0xFC,0xFF,0xFF,0xFC,0x07,0xE0,0xE0,0x07,0xE0,0xE0,0x07,0x60,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7F,0xFE,0xFF,0x7F,0xFC,0xFF,0x3F,0xF0,0xFF,0x0F},/*"9",9*/
+};
+
+const PROGMEM unsigned char digits16x16[][32] = {
+{0x00,0xE0,0xF8,0xFC,0xFE,0x1E,0x07,0x07,0x07,0x07,0x1E,0xFE,0xFC,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x3F,0x3F,0x7C,0x70,0x70,0x70,0x70,0x7C,0x3F,0x1F,0x1F,0x07,0x00},/*0*/
+{0x00,0x00,0x00,0x06,0x07,0x07,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*1*/
+{0x00,0x38,0x3C,0x3E,0x3E,0x0F,0x07,0x07,0x07,0xCF,0xFF,0xFE,0xFE,0x38,0x00,0x00,0x00,0x40,0x40,0x60,0x70,0x78,0x7C,0x7E,0x7F,0x77,0x73,0x71,0x70,0x70,0x00,0x00},/*2*/
+{0x00,0x18,0x1C,0x1E,0x1E,0x0F,0xC7,0xC7,0xE7,0xFF,0xFE,0xBE,0x9C,0x00,0x00,0x00,0x00,0x0C,0x1C,0x3C,0x3C,0x78,0x70,0x70,0x70,0x79,0x7F,0x3F,0x1F,0x0F,0x00,0x00},/*3*/
+{0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x1E,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x7F,0x7F,0x7F,0x7F,0x06,0x06,0x00},/*4*/
+{0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xE7,0xE7,0xE7,0xE7,0xC7,0x87,0x00,0x00,0x00,0x00,0x38,0x78,0x71,0x70,0x70,0x70,0x70,0x70,0x39,0x3F,0x3F,0x1F,0x0F,0x00},/*5*/
+{0x00,0x80,0xE0,0xF0,0xF8,0xFC,0x7F,0x7F,0x6F,0x67,0xE1,0xE1,0xC0,0x80,0x00,0x00,0x00,0x0F,0x1F,0x3F,0x3F,0x78,0x70,0x70,0x70,0x70,0x78,0x3F,0x3F,0x1F,0x0F,0x00},/*6*/
+{0x00,0x07,0x07,0x07,0x07,0x07,0xC7,0xE7,0xF7,0xFF,0x7F,0x3F,0x1F,0x07,0x03,0x01,0x00,0x20,0x38,0x7C,0x7E,0x3F,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*7*/
+{0x00,0x00,0x00,0x1C,0xBE,0xFE,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFE,0xBE,0x1C,0x00,0x00,0x00,0x0E,0x3F,0x3F,0x7F,0x71,0x60,0x60,0x60,0x71,0x7F,0x3F,0x3F,0x0F,0x00},/*8*/
+{0x00,0x78,0xFC,0xFE,0xFE,0x8F,0x07,0x07,0x07,0x07,0x8F,0xFE,0xFE,0xFC,0xF8,0x00,0x00,0x00,0x00,0x01,0x43,0x43,0x73,0x7B,0x7F,0x7F,0x1F,0x0F,0x07,0x03,0x00,0x00},/*9*/
+};
+
+const PROGMEM unsigned char digits8x8[][8] = {
+{0x3C,0x7E,0x83,0x81,0x81,0x7E,0x3C,0x00},/*"0",0*/
+{0x84,0x84,0x82,0xFF,0xFF,0x80,0x80,0x00},/*"1",1*/
+{0x84,0xC6,0xE1,0xA1,0xB1,0x9F,0x8E,0x00},/*"2",2*/
+{0x42,0xC3,0x81,0x89,0x89,0xFF,0x76,0x00},/*"3",3*/
+{0x20,0x38,0x24,0x22,0xFF,0xFF,0x20,0x00},/*"4",4*/
+{0x5F,0xDF,0x99,0x89,0x89,0xF9,0x70,0x00},/*"5",5*/
+{0x3C,0x7E,0x89,0x89,0x89,0xFB,0x72,0x00},/*"6",6*/
+{0x01,0x01,0xE1,0xF9,0x1D,0x07,0x01,0x00},/*"7",7*/
+{0x6E,0xFF,0x89,0x89,0x99,0xFF,0x76,0x00},/*"8",8*/
+{0x4E,0xDF,0x91,0x91,0x91,0x7F,0x3E,0x00},/*"9",9*/
+};
+
+// The 7-bit ASCII character set...
+const PROGMEM unsigned char font5x8[][5] = {
+ { 0x00, 0x00, 0x5f, 0x00, 0x00 }, // 21 !
+ { 0x00, 0x07, 0x00, 0x07, 0x00 }, // 22 "
+ { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // 23 #
+ { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // 24 $
+ { 0x23, 0x13, 0x08, 0x64, 0x62 }, // 25 %
+ { 0x36, 0x49, 0x55, 0x22, 0x50 }, // 26 &
+ { 0x00, 0x05, 0x03, 0x00, 0x00 }, // 27 '
+ { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // 28 (
+ { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // 29 )
+ { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // 2a *
+ { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // 2b +
+ { 0x00, 0x50, 0x30, 0x00, 0x00 }, // 2c ,
+ { 0x08, 0x08, 0x08, 0x08, 0x08 }, // 2d -
+ { 0x00, 0x60, 0x60, 0x00, 0x00 }, // 2e .
+ { 0x20, 0x10, 0x08, 0x04, 0x02 }, // 2f /
+ { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 30 0
+ { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 31 1
+ { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 32 2
+ { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 33 3
+ { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 34 4
+ { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 35 5
+ { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 36 6
+ { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 37 7
+ { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 38 8
+ { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 39 9
+ { 0x00, 0x36, 0x36, 0x00, 0x00 }, // 3a :
+ { 0x00, 0x56, 0x36, 0x00, 0x00 }, // 3b ;
+ { 0x08, 0x14, 0x22, 0x41, 0x00 }, // 3c <
+ { 0x14, 0x14, 0x14, 0x14, 0x14 }, // 3d =
+ { 0x00, 0x41, 0x22, 0x14, 0x08 }, // 3e >
+ { 0x02, 0x01, 0x51, 0x09, 0x06 }, // 3f ?
+ { 0x32, 0x49, 0x79, 0x41, 0x3e }, // 40 @
+ { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // 41 A
+ { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // 42 B
+ { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // 43 C
+ { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // 44 D
+ { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // 45 E
+ { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // 46 F
+ { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // 47 G
+ { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // 48 H
+ { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // 49 I
+ { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // 4a J
+ { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // 4b K
+ { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // 4c L
+ { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // 4d M
+ { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // 4e N
+ { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // 4f O
+ { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // 50 P
+ { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // 51 Q
+ { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // 52 R
+ { 0x46, 0x49, 0x49, 0x49, 0x31 }, // 53 S
+ { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // 54 T
+ { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // 55 U
+ { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // 56 V
+ { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // 57 W
+ { 0x63, 0x14, 0x08, 0x14, 0x63 }, // 58 X
+ { 0x07, 0x08, 0x70, 0x08, 0x07 }, // 59 Y
+ { 0x61, 0x51, 0x49, 0x45, 0x43 }, // 5a Z
+ { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // 5b [
+ { 0x02, 0x04, 0x08, 0x10, 0x20 }, // 5c backslash
+ { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // 5d ]
+ { 0x04, 0x02, 0x01, 0x02, 0x04 }, // 5e ^
+ { 0x40, 0x40, 0x40, 0x40, 0x40 }, // 5f _
+ { 0x00, 0x01, 0x02, 0x04, 0x00 }, // 60 `
+ { 0x20, 0x54, 0x54, 0x54, 0x78 }, // 61 a
+ { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // 62 b
+ { 0x38, 0x44, 0x44, 0x44, 0x20 }, // 63 c
+ { 0x38, 0x44, 0x44, 0x48, 0x7f }, // 64 d
+ { 0x38, 0x54, 0x54, 0x54, 0x18 }, // 65 e
+ { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // 66 f
+ { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // 67 g
+ { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // 68 h
+ { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // 69 i
+ { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // 6a j
+ { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // 6b k
+ { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // 6c l
+ { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // 6d m
+ { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // 6e n
+ { 0x38, 0x44, 0x44, 0x44, 0x38 }, // 6f o
+ { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // 70 p
+ { 0x08, 0x14, 0x14, 0x18, 0x7c }, // 71 q
+ { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // 72 r
+ { 0x48, 0x54, 0x54, 0x54, 0x20 }, // 73 s
+ { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // 74 t
+ { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // 75 u
+ { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // 76 v
+ { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // 77 w
+ { 0x44, 0x28, 0x10, 0x28, 0x44 }, // 78 x
+ { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // 79 y
+ { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // 7a z
+ { 0x00, 0x08, 0x36, 0x41, 0x00 }, // 7b {
+ { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // 7c |
+ { 0x00, 0x41, 0x36, 0x08, 0x00 }, // 7d }
+ { 0x10, 0x08, 0x08, 0x10, 0x08 }, // 7e ~
+};
+
+const PROGMEM unsigned char font8x16_doslike[][16] = {
+{0x00,0x00,0x00,0x00,0x78,0x00,0xFC,0x09,0xFC,0x09,0x78,0x00,0x00,0x00,0x00,0x00},/*"!*/
+{0x00,0x00,0x0E,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00},/*""*/
+{0x20,0x02,0xF8,0x1F,0xF8,0x1F,0x20,0x02,0x20,0x02,0xF8,0x1F,0xF8,0x1F,0x20,0x02},/*"#*/
+{0x00,0x00,0x38,0x06,0x7C,0x0C,0x44,0x08,0xFF,0x3F,0x47,0x38,0xCC,0x0F,0x98,0x07},/*"$*/
+{0x10,0x08,0x38,0x0C,0x28,0x06,0x38,0x03,0x90,0x05,0xC0,0x0E,0x60,0x0A,0x30,0x0E},/*"%*/
+{0x80,0x07,0xD8,0x0F,0x7C,0x08,0x64,0x08,0xE4,0x08,0xBC,0x07,0x18,0x0F,0x80,0x09},/*"&*/
+{0x00,0x00,0x10,0x00,0x1C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'*/
+{0x00,0x00,0x00,0x00,0xF0,0x03,0xF8,0x07,0x0C,0x0C,0x04,0x08,0x00,0x00,0x00,0x00},/*"(*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00},/*")*/
+{0x80,0x00,0xA0,0x02,0xE0,0x03,0xC0,0x01,0xC0,0x01,0xE0,0x03,0xA0,0x02,0x80,0x00},/*"**/
+{0x80,0x00,0x80,0x00,0x80,0x00,0xE0,0x03,0xE0,0x03,0x80,0x00,0x80,0x00,0x80,0x00},/*"+0*/
+{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00},/*",*/
+{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00},/*"-*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*".*/
+{0x00,0x08,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00},/*"/*/
+{0xF0,0x03,0xF8,0x07,0x0C,0x0C,0xC4,0x08,0xC4,0x08,0x0C,0x0C,0xF8,0x07,0xF0,0x03},/*"0*/
+{0x00,0x00,0x10,0x08,0x18,0x08,0xFC,0x0F,0xFC,0x0F,0x00,0x08,0x00,0x08,0x00,0x00},/*"1*/
+{0x08,0x0E,0x0C,0x0F,0x84,0x09,0xC4,0x08,0x64,0x08,0x3C,0x0C,0x18,0x0C,0x00,0x00},/*"2*/
+{0x08,0x04,0x0C,0x0C,0x04,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00},/*"3*/
+{0xC0,0x01,0xE0,0x01,0x30,0x01,0x18,0x09,0xFC,0x0F,0xFC,0x0F,0x00,0x09,0x00,0x00},/*"4*/
+{0x7C,0x04,0x7C,0x0C,0x44,0x08,0x44,0x08,0x44,0x08,0xC4,0x0F,0x84,0x07,0x00,0x00},/*"5*/
+{0xF0,0x07,0xF8,0x0F,0x4C,0x08,0x44,0x08,0x44,0x08,0xC4,0x0F,0x80,0x07,0x00,0x00},/*"6*/
+{0x0C,0x00,0x0C,0x00,0x84,0x0F,0xC4,0x0F,0x64,0x00,0x3C,0x00,0x1C,0x00,0x00,0x00},/*"7*/
+{0xB8,0x07,0xFC,0x0F,0x44,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00},/*"8*/
+{0x38,0x00,0x7C,0x08,0x44,0x08,0x44,0x08,0x44,0x0C,0xFC,0x07,0xF8,0x03,0x00,0x00},/*"9*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x30,0x06,0x00,0x00,0x00,0x00,0x00,0x00},/*":*/
+{0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x1C,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
+{0x00,0x00,0x80,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x08,0x08,0x00,0x00},/*"<",28*/
+{0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x00,0x00},/*"=",29*/
+{0x00,0x00,0x00,0x00,0x08,0x08,0x18,0x0C,0x30,0x06,0x60,0x03,0xC0,0x01,0x80,0x00},/*">",30*/
+{0x08,0x00,0x0C,0x00,0x04,0x00,0x84,0x0D,0xC4,0x0D,0x7C,0x00,0x38,0x00,0x00,0x00},/*"?",31*/
+{0xF8,0x07,0xFC,0x0F,0x04,0x08,0x84,0x09,0xC4,0x09,0xFC,0x09,0xF8,0x00,0x00,0x00},/*"@",32*/
+{0xE0,0x0F,0xF0,0x0F,0x98,0x00,0x8C,0x00,0x98,0x00,0xF0,0x0F,0xE0,0x0F,0x00,0x00},/*"A",33*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00},/*"B",34*/
+{0xF0,0x03,0xF8,0x07,0x0C,0x0C,0x04,0x08,0x04,0x08,0x0C,0x0C,0x18,0x06,0x00,0x00},/*"C",35*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08,0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00},/*"D",36*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x44,0x08,0xE4,0x08,0x0C,0x0C,0x0C,0x0C,0x00,0x00},/*"E",37*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x44,0x08,0xE4,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00},/*"F",38*/
+{0xF0,0x03,0xF8,0x07,0x0C,0x0C,0x04,0x08,0x84,0x08,0x8C,0x07,0x98,0x0F,0x00,0x00},/*"G",39*/
+{0xFC,0x0F,0xFC,0x0F,0x40,0x00,0x40,0x00,0x40,0x00,0xFC,0x0F,0xFC,0x0F,0x00,0x00},/*"H",40*/
+{0x00,0x00,0x04,0x08,0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08,0x04,0x08,0x00,0x00},/*"I",41*/
+{0x00,0x06,0x00,0x0E,0x00,0x08,0x04,0x08,0xFC,0x0F,0xFC,0x07,0x04,0x00,0x00,0x00},/*"J",42*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0xE0,0x00,0xB0,0x01,0x1C,0x0F,0x0C,0x0E,0x00,0x00},/*"K",43*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08,0x00,0x08,0x00,0x0C,0x00,0x0C,0x00,0x00},/*"L",44*/
+{0xFC,0x0F,0xFC,0x0F,0x30,0x00,0xE0,0x00,0xE0,0x00,0x30,0x00,0xFC,0x0F,0xFC,0x0F},/*"M",45*/
+{0xFC,0x0F,0xFC,0x0F,0x30,0x00,0x60,0x00,0xC0,0x00,0xFC,0x0F,0xFC,0x0F,0x00,0x00},/*"N",46*/
+{0xF8,0x07,0xFC,0x0F,0x04,0x08,0x04,0x08,0x04,0x08,0xFC,0x0F,0xF8,0x07,0x00,0x00},/*"O",47*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x84,0x08,0x84,0x00,0xFC,0x00,0x78,0x00,0x00,0x00},/*"P",48*/
+{0xF8,0x07,0xFC,0x0F,0x04,0x08,0x04,0x0C,0x04,0x18,0xFC,0x3F,0xF8,0x27,0x00,0x00},/*"Q",49*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x44,0x00,0xC4,0x00,0xFC,0x0F,0x38,0x0F,0x00,0x00},/*"R",50*/
+{0x18,0x04,0x3C,0x0C,0x64,0x08,0x44,0x08,0xC4,0x08,0x8C,0x0F,0x08,0x07,0x00,0x00},/*"S",51*/
+{0x0C,0x00,0x0C,0x00,0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08,0x0C,0x00,0x0C,0x00},/*"T",52*/
+{0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x08,0x00,0x08,0xFC,0x0F,0xFC,0x07,0x00,0x00},/*"U",53*/
+{0xFC,0x01,0xFC,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x06,0xFC,0x03,0xFC,0x01},/*"V",54*/
+{0xFC,0x03,0xFC,0x0F,0x00,0x0E,0x80,0x03,0x80,0x03,0x00,0x0E,0xFC,0x0F,0xFC,0x03},/*"W",55*/
+{0x0C,0x0C,0x1C,0x0E,0x30,0x03,0xE0,0x01,0xE0,0x01,0x30,0x03,0x1C,0x0E,0x0C,0x0C},/*"X",56*/
+{0x1C,0x00,0x3C,0x00,0x60,0x08,0xC0,0x0F,0xC0,0x0F,0x60,0x08,0x3C,0x00,0x1C,0x00},/*"Y",57*/
+{0x0C,0x0E,0x0C,0x0F,0x84,0x09,0xC4,0x08,0x64,0x08,0x34,0x08,0x1C,0x0C,0x0C,0x0C},/*"Z",58*/
+{0x00,0x00,0x00,0x00,0xFC,0x0F,0xFC,0x0F,0x04,0x08,0x04,0x08,0x00,0x00,0x00,0x00},/*"[",59*/
+{0x00,0x08,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00},/*"/",60*/
+{0x00,0x00,0x00,0x00,0x04,0x08,0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x00,0x00,0x00,0x00},/*"]",61*/
+{0x00,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x10,0x00},/*"^",62*/
+{0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20},/*"_",63*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x08,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x07,0xA0,0x0F,0xA0,0x08,0xA0,0x08,0xE0,0x07,0xC0,0x0F,0x00,0x08,0x00,0x00},/*"a",65*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x07,0x20,0x08,0x60,0x08,0xC0,0x0F,0x80,0x07,0x00,0x00},/*"b",66*/
+{0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08,0x20,0x08,0x60,0x0C,0x40,0x04,0x00,0x00},/*"c",67*/
+{0x80,0x07,0xC0,0x0F,0x60,0x08,0x24,0x08,0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x00},/*"d",68*/
+{0xC0,0x07,0xE0,0x0F,0x20,0x09,0x20,0x09,0x20,0x09,0xE0,0x0D,0xC0,0x05,0x00,0x00},/*"e",69*/
+{0x00,0x00,0x40,0x08,0xF8,0x0F,0xFC,0x0F,0x44,0x08,0x4C,0x00,0x08,0x00,0x00,0x00},/*"f",70*/
+{0xC0,0x27,0xE0,0x6F,0x20,0x48,0x20,0x48,0xC0,0x7F,0xE0,0x3F,0x20,0x00,0x00,0x00},/*"g",71*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x40,0x00,0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00},/*"h",72*/
+{0x00,0x00,0x00,0x00,0x20,0x08,0xEC,0x0F,0xEC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00},/*"i",73*/
+{0x00,0x00,0x00,0x20,0x00,0x60,0x00,0x40,0x20,0x40,0xEC,0x7F,0xEC,0x3F,0x00,0x00},/*"j",74*/
+{0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x80,0x01,0xC0,0x03,0x60,0x0E,0x20,0x0C,0x00,0x00},/*"k",75*/
+{0x00,0x00,0x00,0x00,0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00},/*"l",76*/
+{0xE0,0x0F,0xE0,0x0F,0x60,0x00,0xC0,0x07,0xC0,0x07,0x60,0x00,0xE0,0x0F,0xC0,0x0F},/*"m",77*/
+{0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x20,0x00,0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00},/*"n",78*/
+{0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08,0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00},/*"o",79*/
+{0x20,0x40,0xE0,0x7F,0xC0,0x7F,0x20,0x48,0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00},/*"p",80*/
+{0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x48,0xC0,0x7F,0xE0,0x7F,0x20,0x40,0x00,0x00},/*"q",81*/
+{0x20,0x08,0xE0,0x0F,0xC0,0x0F,0x60,0x08,0x20,0x00,0x60,0x00,0x40,0x00,0x00,0x00},/*"r",82*/
+{0xC0,0x04,0xE0,0x0D,0x20,0x09,0x20,0x09,0x20,0x09,0x60,0x0F,0x40,0x06,0x00,0x00},/*"s",83*/
+{0x20,0x00,0x20,0x00,0xF8,0x07,0xFC,0x0F,0x20,0x08,0x20,0x0C,0x00,0x04,0x00,0x00},/*"t",84*/
+{0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08,0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00},/*"u",85*/
+{0xE0,0x01,0xE0,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x06,0xE0,0x03,0xE0,0x01},/*"v",86*/
+{0xE0,0x07,0xE0,0x0F,0x00,0x0C,0x00,0x07,0x00,0x07,0x00,0x0C,0xE0,0x0F,0xE0,0x07},/*"w",87*/
+{0x20,0x08,0x60,0x0C,0xC0,0x06,0x80,0x03,0x80,0x03,0xC0,0x06,0x60,0x0C,0x20,0x08},/*"x",88*/
+{0xE0,0x47,0xE0,0x4F,0x00,0x48,0x00,0x48,0x00,0x68,0xE0,0x3F,0xE0,0x1F,0x00,0x00},/*"y",89*/
+{0x60,0x0C,0x60,0x0E,0x20,0x0B,0xA0,0x09,0xE0,0x08,0x60,0x0C,0x20,0x0C,0x00,0x00},/*"z",90*/
+{0x00,0x00,0x40,0x00,0x40,0x00,0xF8,0x07,0xBC,0x0F,0x04,0x08,0x04,0x08,0x00,0x00},/*"{",91*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x7C,0x1F,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x00,0x00,0x04,0x08,0x04,0x08,0xBC,0x0F,0xF8,0x07,0x40,0x00,0x40,0x00,0x00,0x00},/*"}",93*/
+};
+
+const PROGMEM unsigned char font8x16_terminal[][16] = {
+{0x00,0x00,0x00,0x00,0x7C,0x00,0xFE,0x1B,0xFE,0x1B,0x7C,0x00,0x00,0x00,0x00,0x00},/*"!",0*/
+{0x00,0x00,0x0E,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x00,0x00},/*""",1*/
+{0x20,0x01,0xFC,0x0F,0xFC,0x0F,0x20,0x01,0x20,0x01,0xFC,0x0F,0xFC,0x0F,0x20,0x01},/*"#",2*/
+{0x38,0x06,0x7C,0x0C,0x44,0x08,0xFF,0x3F,0xFF,0x3F,0x84,0x08,0x8C,0x0F,0x18,0x07},/*"$",3*/
+{0x1C,0x18,0x14,0x1E,0x9C,0x07,0xE0,0x01,0x78,0x1C,0x1E,0x14,0x06,0x1C,0x00,0x00},/*"%",4*/
+{0xBC,0x1F,0xFE,0x10,0x42,0x10,0xC2,0x10,0xFE,0x1F,0x3C,0x0F,0x80,0x19,0x80,0x10},/*"&",5*/
+{0x00,0x00,0x00,0x00,0x10,0x00,0x1E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",6*/
+{0x00,0x00,0x00,0x00,0xF0,0x07,0xFC,0x1F,0x0E,0x38,0x02,0x20,0x00,0x00,0x00,0x00},/*"(",7*/
+{0x00,0x00,0x00,0x00,0x02,0x20,0x0E,0x38,0xFC,0x1F,0xF0,0x07,0x00,0x00,0x00,0x00},/*")",8*/
+{0x80,0x00,0xA0,0x02,0xE0,0x03,0xC0,0x01,0xC0,0x01,0xE0,0x03,0xA0,0x02,0x80,0x00},/*"*",9*/
+{0x80,0x00,0x80,0x00,0x80,0x00,0xE0,0x03,0xE0,0x03,0x80,0x00,0x80,0x00,0x80,0x00},/*"+",10*/
+{0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x78,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00},/*",",11*/
+{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00},/*"-",12*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00},/*".",13*/
+{0x00,0x18,0x00,0x1E,0x80,0x07,0xE0,0x01,0x78,0x00,0x1E,0x00,0x06,0x00,0x00,0x00},/*"/",14*/
+{0xF8,0x07,0xFC,0x0F,0x06,0x18,0xC2,0x10,0xC2,0x10,0x06,0x18,0xFC,0x0F,0xF8,0x07},/*"0",15*/
+{0x00,0x00,0x08,0x10,0x0C,0x10,0xFE,0x1F,0xFE,0x1F,0x00,0x10,0x00,0x10,0x00,0x00},/*"1",16*/
+{0x04,0x1C,0x06,0x1E,0x02,0x13,0x82,0x11,0xC2,0x10,0x62,0x10,0x3E,0x18,0x1C,0x18},/*"2",17*/
+{0x04,0x08,0x06,0x18,0x02,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0xFE,0x1F,0xBC,0x0F},/*"3",18*/
+{0xC0,0x01,0xE0,0x01,0x30,0x01,0x18,0x01,0x0C,0x11,0xFE,0x1F,0xFE,0x1F,0x00,0x11},/*"4",19*/
+{0x7E,0x08,0x7E,0x18,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0xC2,0x1F,0x82,0x0F},/*"5",20*/
+{0xF8,0x0F,0xFC,0x1F,0x46,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0xC0,0x1F,0x80,0x0F},/*"6",21*/
+{0x06,0x00,0x06,0x00,0x02,0x00,0x02,0x1F,0xC2,0x1F,0xF2,0x00,0x3E,0x00,0x0E,0x00},/*"7",22*/
+{0xBC,0x0F,0xFE,0x1F,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0xFE,0x1F,0xBC,0x0F},/*"8",23*/
+{0x3C,0x00,0x7E,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x18,0xFE,0x0F,0xFC,0x07},/*"9",24*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x3C,0x60,0x1C,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
+{0x80,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x0C,0x18,0x04,0x10,0x00,0x00},/*"<",28*/
+{0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02},/*"=",29*/
+{0x04,0x10,0x0C,0x18,0x18,0x0C,0x30,0x06,0x60,0x03,0xC0,0x01,0x80,0x00,0x00,0x00},/*">",30*/
+{0x04,0x00,0x06,0x00,0x02,0x00,0x82,0x1B,0xC2,0x1B,0x62,0x00,0x3E,0x00,0x1C,0x00},/*"?",31*/
+{0xFC,0x0F,0xFE,0x1F,0x02,0x10,0x82,0x11,0xC2,0x13,0xE2,0x13,0xFE,0x13,0xFC,0x03},/*"@",32*/
+{0xF0,0x1F,0xF8,0x1F,0x0C,0x01,0x06,0x01,0x06,0x01,0x0C,0x01,0xF8,0x1F,0xF0,0x1F},/*"A",33*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x42,0x10,0x42,0x10,0x42,0x10,0xFE,0x1F,0xBC,0x0F},/*"B",34*/
+{0xF8,0x07,0xFC,0x0F,0x06,0x18,0x02,0x10,0x02,0x10,0x02,0x10,0x06,0x18,0x0C,0x0C},/*"C",35*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x02,0x10,0x02,0x10,0x06,0x18,0xFC,0x0F,0xF8,0x07},/*"D",36*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x42,0x10,0x42,0x10,0xE2,0x10,0x06,0x18,0x06,0x18},/*"E",37*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x42,0x10,0x42,0x00,0xE2,0x00,0x06,0x00,0x06,0x00},/*"F",38*/
+{0xF8,0x07,0xFC,0x0F,0x06,0x18,0x02,0x10,0x82,0x10,0x82,0x10,0x86,0x0F,0x8C,0x1F},/*"G",39*/
+{0xFE,0x1F,0xFE,0x1F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x1F,0xFE,0x1F},/*"H",40*/
+{0x00,0x00,0x02,0x10,0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x02,0x10,0x02,0x10,0x00,0x00},/*"I",41*/
+{0x00,0x0C,0x00,0x1C,0x00,0x10,0x00,0x10,0x02,0x10,0xFE,0x1F,0xFE,0x0F,0x02,0x00},/*"J",42*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0xE0,0x00,0xB0,0x01,0x18,0x03,0x0E,0x1E,0x06,0x1C},/*"K",43*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x02,0x10,0x00,0x10,0x00,0x10,0x00,0x18,0x00,0x18},/*"L",44*/
+{0xFE,0x1F,0xFE,0x1F,0x18,0x00,0xF0,0x00,0xF0,0x00,0x18,0x00,0xFE,0x1F,0xFE,0x1F},/*"M",45*/
+{0xFE,0x1F,0xFE,0x1F,0x38,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0xFE,0x1F,0xFE,0x1F},/*"N",46*/
+{0xFC,0x0F,0xFE,0x1F,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0xFE,0x1F,0xFC,0x0F},/*"O",47*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x42,0x10,0x42,0x00,0x42,0x00,0x7E,0x00,0x3C,0x00},/*"P",48*/
+{0xFC,0x0F,0xFE,0x1F,0x02,0x10,0x02,0x1C,0x02,0x38,0x02,0x70,0xFE,0x5F,0xFC,0x0F},/*"Q",49*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x42,0x00,0x42,0x00,0xC2,0x00,0xFE,0x1F,0x3C,0x1F},/*"R",50*/
+{0x1C,0x0C,0x3E,0x1C,0x62,0x10,0x42,0x10,0x42,0x10,0xC2,0x10,0x8E,0x1F,0x0C,0x0F},/*"S",51*/
+{0x06,0x00,0x06,0x00,0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x02,0x10,0x06,0x00,0x06,0x00},/*"T",52*/
+{0xFE,0x0F,0xFE,0x1F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xFE,0x1F,0xFE,0x0F},/*"U",53*/
+{0xFE,0x03,0xFE,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x0C,0xFE,0x07,0xFE,0x03},/*"V",54*/
+{0xFE,0x07,0xFE,0x1F,0x00,0x1C,0xC0,0x07,0xC0,0x07,0x00,0x1C,0xFE,0x1F,0xFE,0x07},/*"W",55*/
+{0x0E,0x1C,0x1E,0x1E,0x30,0x03,0xE0,0x01,0xE0,0x01,0x30,0x03,0x1E,0x1E,0x0E,0x1C},/*"X",56*/
+{0x1E,0x00,0x3E,0x00,0x60,0x10,0xC0,0x1F,0xC0,0x1F,0x60,0x10,0x3E,0x00,0x1E,0x00},/*"Y",57*/
+{0x06,0x1E,0x06,0x1F,0x82,0x11,0xC2,0x10,0x62,0x10,0x32,0x10,0x1E,0x18,0x0E,0x18},/*"Z",58*/
+{0x00,0x00,0x00,0x00,0xFE,0x1F,0xFE,0x1F,0x02,0x10,0x02,0x10,0x00,0x00,0x00,0x00},/*"[",59*/
+{0x00,0x18,0x00,0x1E,0x80,0x07,0xE0,0x01,0x78,0x00,0x1E,0x00,0x06,0x00,0x00,0x00},/*"/",60*/
+{0x00,0x00,0x00,0x00,0x02,0x10,0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x00,0x00,0x00,0x00},/*"]",61*/
+{0x20,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x20,0x00,0x00,0x00},/*"^",62*/
+{0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"_",63*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x78,0x00,0x40,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x0E,0x20,0x1F,0x20,0x11,0x20,0x11,0x20,0x11,0xE0,0x0F,0xC0,0x1F,0x00,0x10},/*"a",65*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x0F,0x20,0x10,0x20,0x10,0x60,0x10,0xC0,0x1F,0x80,0x0F},/*"b",66*/
+{0xC0,0x0F,0xE0,0x1F,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x60,0x18,0x40,0x08},/*"c",67*/
+{0x80,0x0F,0xC0,0x1F,0x60,0x10,0x20,0x10,0x22,0x10,0xFE,0x0F,0xFE,0x1F,0x00,0x10},/*"d",68*/
+{0xC0,0x0F,0xE0,0x1F,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0xE0,0x19,0xC0,0x09},/*"e",69*/
+{0x00,0x00,0x20,0x10,0xFC,0x1F,0xFE,0x1F,0x22,0x10,0x22,0x00,0x06,0x00,0x04,0x00},/*"f",70*/
+{0xC0,0x4F,0xE0,0xDF,0x20,0x90,0x20,0x90,0x20,0x90,0xC0,0xFF,0xE0,0x7F,0x20,0x00},/*"g",71*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x40,0x00,0x20,0x00,0x20,0x00,0xE0,0x1F,0xC0,0x1F},/*"h",72*/
+{0x00,0x00,0x20,0x10,0x20,0x10,0xEC,0x1F,0xEC,0x1F,0x00,0x10,0x00,0x10,0x00,0x00},/*"i",73*/
+{0x00,0x60,0x00,0xC0,0x20,0x80,0x20,0x80,0xEC,0xFF,0xEC,0x7F,0x00,0x00,0x00,0x00},/*"j",74*/
+{0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x80,0x01,0x80,0x03,0xC0,0x06,0x60,0x1C,0x20,0x18},/*"k",75*/
+{0x00,0x00,0x02,0x10,0x02,0x10,0xFE,0x1F,0xFE,0x1F,0x00,0x10,0x00,0x10,0x00,0x00},/*"l",76*/
+{0xE0,0x1F,0xE0,0x1F,0x60,0x00,0xC0,0x0F,0xC0,0x0F,0x60,0x00,0xE0,0x1F,0xC0,0x1F},/*"m",77*/
+{0x20,0x00,0xE0,0x1F,0xC0,0x1F,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x1F,0xC0,0x1F},/*"n",78*/
+{0xC0,0x0F,0xE0,0x1F,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xE0,0x1F,0xC0,0x0F},/*"o",79*/
+{0x20,0x80,0xE0,0xFF,0xC0,0xFF,0x20,0x90,0x20,0x10,0x20,0x10,0xE0,0x1F,0xC0,0x0F},/*"p",80*/
+{0xC0,0x0F,0xE0,0x1F,0x20,0x10,0x20,0x10,0x20,0x90,0xC0,0xFF,0xE0,0xFF,0x20,0x80},/*"q",81*/
+{0x20,0x10,0xE0,0x1F,0xC0,0x1F,0x60,0x10,0x20,0x00,0x20,0x00,0x60,0x00,0x40,0x00},/*"r",82*/
+{0xC0,0x08,0xE0,0x19,0x20,0x11,0x20,0x11,0x20,0x13,0x20,0x12,0x60,0x1E,0x40,0x0C},/*"s",83*/
+{0x20,0x00,0x20,0x00,0xFC,0x0F,0xFE,0x1F,0x20,0x10,0x20,0x18,0x00,0x08,0x00,0x00},/*"t",84*/
+{0xE0,0x0F,0xE0,0x1F,0x00,0x10,0x00,0x10,0x00,0x10,0xE0,0x0F,0xE0,0x1F,0x00,0x10},/*"u",85*/
+{0xE0,0x03,0xE0,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x0C,0xE0,0x07,0xE0,0x03},/*"v",86*/
+{0xE0,0x0F,0xE0,0x1F,0x00,0x18,0x00,0x0F,0x00,0x0F,0x00,0x18,0xE0,0x1F,0xE0,0x0F},/*"w",87*/
+{0x20,0x10,0x60,0x18,0xC0,0x0C,0x80,0x07,0x80,0x07,0xC0,0x0C,0x60,0x18,0x20,0x10},/*"x",88*/
+{0xE0,0x8F,0xE0,0x9F,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0xD0,0xE0,0x7F,0xE0,0x3F},/*"y",89*/
+{0x60,0x18,0x60,0x1C,0x20,0x16,0x20,0x13,0xA0,0x11,0xE0,0x10,0x60,0x18,0x20,0x18},/*"z",90*/
+{0x00,0x00,0x00,0x00,0x80,0x00,0xFC,0x1F,0x7E,0x3F,0x02,0x20,0x02,0x20,0x00,0x00},/*"{",91*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x7C,0x3E,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x00,0x00,0x02,0x20,0x02,0x20,0x7E,0x3F,0xFC,0x1F,0x80,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
+};