From 381fc9caf327bd6297a0db274ba2a62ece5141ac Mon Sep 17 00:00:00 2001 From: Stanley Huang Date: Wed, 4 Jun 2014 22:19:47 +1000 Subject: Update MultiLCD library Inheriting modified UTFT library Added support for SSD1289 --- libraries/MultiLCD/ILI9325D.cpp | 25 +- libraries/MultiLCD/ILI9341.cpp | 6 +- libraries/MultiLCD/MultiLCD.cpp | 394 +--------------- libraries/MultiLCD/MultiLCD.h | 150 +++--- libraries/MultiLCD/PCD8544.cpp | 316 ------------- libraries/MultiLCD/PCD8544.h | 117 ----- libraries/MultiLCD/SH1106.cpp | 401 ---------------- libraries/MultiLCD/SSD1289.cpp | 393 ++++++++++++++++ libraries/MultiLCD/SSD1306.cpp | 273 ----------- libraries/MultiLCD/SSD1306.h | 112 ----- libraries/MultiLCD/UTFT.cpp | 985 +++++++++++++++++++++++++++++++++++++++ libraries/MultiLCD/UTFT.h | 275 +++++++++++ libraries/MultiLCD/fonts.cpp | 352 -------------- libraries/MultiLCD/fonts.h | 331 +++++++++++++ libraries/MultiLCD/memorysaver.h | 45 ++ 15 files changed, 2133 insertions(+), 2042 deletions(-) delete mode 100644 libraries/MultiLCD/PCD8544.cpp delete mode 100644 libraries/MultiLCD/PCD8544.h delete mode 100644 libraries/MultiLCD/SH1106.cpp create mode 100644 libraries/MultiLCD/SSD1289.cpp delete mode 100644 libraries/MultiLCD/SSD1306.cpp delete mode 100644 libraries/MultiLCD/SSD1306.h create mode 100644 libraries/MultiLCD/UTFT.cpp create mode 100644 libraries/MultiLCD/UTFT.h delete mode 100644 libraries/MultiLCD/fonts.cpp create mode 100644 libraries/MultiLCD/fonts.h create mode 100644 libraries/MultiLCD/memorysaver.h (limited to 'libraries/MultiLCD') diff --git a/libraries/MultiLCD/ILI9325D.cpp b/libraries/MultiLCD/ILI9325D.cpp index 5163193..ac4cfcf 100644 --- a/libraries/MultiLCD/ILI9325D.cpp +++ b/libraries/MultiLCD/ILI9325D.cpp @@ -428,13 +428,34 @@ void LCD_ILI9325D::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t hei m_y += width; } -void LCD_ILI9325D::draw2x(const PROGMEM byte* buffer, byte width, byte height) +void LCD_ILI9325D::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY) +{ + byte rows = height >> 3; + if (scaleY == 0) scaleY = scaleX; + setXY(m_x, m_x + height - 1, m_y, m_y + width - 1); + uint16_t i = width - 1; + do { + for (byte n = 0; n < scaleX; n++) { + for (uint8_t h = 0; h < rows; h++) { + byte d = pgm_read_byte_far(buffer + i + width * h); + for (byte j = 0; j < 8; j++, d >>= 1) { + for (byte m = 0; m < scaleY; m++) { + WriteData(m_color[d & 1]); + } + } + } + } + } while (i--); + m_y += width * scaleX; +} + +void LCD_ILI9325D::draw4bpp(const PROGMEM byte* buffer, uint16_t width, uint16_t height) { char buf[240]; setXY(m_x, m_x + height * 2 - 1, m_y, m_y + width * 2- 1); uint16_t i = width - 1; do { - memcpy_P(buf, buffer + (uint16_t)i * height * 2, height * 2); + memcpy_P(buf, buffer + 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]); diff --git a/libraries/MultiLCD/ILI9341.cpp b/libraries/MultiLCD/ILI9341.cpp index 5c6df57..32b2356 100644 --- a/libraries/MultiLCD/ILI9341.cpp +++ b/libraries/MultiLCD/ILI9341.cpp @@ -241,8 +241,8 @@ void LCD_ILI9341::begin (void) clear(); backlight(true); - setTextColor(0xffff); - SetBGColor(0); + setColor(0xffff); + setBackColor(0); } uint8_t LCD_ILI9341::readID(void) @@ -487,7 +487,7 @@ void LCD_ILI9341::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t heig m_x += width; } -void LCD_ILI9341::draw2x(const PROGMEM byte* buffer, byte width, byte height) +void LCD_ILI9341::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte ScaleY) { byte rows = height >> 3; setXY(m_y, m_y + height * 2 - 1, m_x, m_x + width * 2 - 1); diff --git a/libraries/MultiLCD/MultiLCD.cpp b/libraries/MultiLCD/MultiLCD.cpp index 33c753b..d55874f 100644 --- a/libraries/MultiLCD/MultiLCD.cpp +++ b/libraries/MultiLCD/MultiLCD.cpp @@ -7,7 +7,9 @@ #include #include +#include #include "MultiLCD.h" +#include "fonts.h" void LCD_Common::printInt(uint16_t value, int8_t padding) { @@ -44,395 +46,3 @@ void LCD_Common::printLong(uint32_t value, int8_t padding) writeDigit(v); } } - -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 width, unsigned char height) -{ - height >>= 3; - unsigned char x = column; - unsigned char y = line << 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) -{ - uint8_t twbrbackup = TWBR; - TWBR = 18; // upgrade to 400KHz! - if (c == '\n') { - setCursor(0, m_row + ((m_font == FONT_SIZE_SMALL) ? 1 : 2)); - return 1; - } else if (c == '\r') { - m_col = 0; - return 1; - } -#ifndef MEMORY_SAVING - if (m_font == FONT_SIZE_SMALL) { -#endif - Wire.beginTransmission(_i2caddr); - Wire.write(0x40); - if (c > 0x20 && c < 0x7f) { - c -= 0x21; - for (byte i = 0; i < 5; i++) { - byte d = pgm_read_byte(&font5x8[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.write(0); - } else { - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 11 : 6; i > 0; i--) { - Wire.write(0); - } - } - Wire.endTransmission(); - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 11 : 6; - if (m_col >= 128) { - m_col = 0; - m_row ++; - } -#ifndef MEMORY_SAVING - } 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) { - byte d = pgm_read_byte(&font8x16_terminal[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - 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) { - byte d = pgm_read_byte(&font8x16_terminal[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 16 : 8; i > 0; 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 16 : 8; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 17 : 9; - if (m_col >= 128) { - m_col = 0; - m_row += 2; - } - } -#endif - TWBR = twbrbackup; - return 1; -} - -void LCD_SSD1306::writeDigit(byte n) -{ - uint8_t twbrbackup = TWBR; - TWBR = 18; // upgrade to 400KHz! - if (m_font == FONT_SIZE_SMALL) { - Wire.beginTransmission(_i2caddr); - Wire.write(0x40); - if (n <= 9) { - n += '0' - 0x21; - for (byte i = 0; i < 5; i++) { - Wire.write(pgm_read_byte(&font5x8[n][i])); - } - Wire.write(0); - } else { - for (byte i = 0; i < 6; i++) { - Wire.write(0); - } - } - Wire.endTransmission(); - m_col += 6; - } else if (m_font == FONT_SIZE_MEDIUM) { - write(n <= 9 ? ('0' + n) : ' '); - } else if (m_font == FONT_SIZE_LARGE) { - if (n <= 9) { - 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 ++) { - byte d = pgm_read_byte(&digits16x16[n][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - 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 ++) { - byte d = pgm_read_byte(&digits16x16[n][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 30 : 16; - } else if (m_font == FONT_SIZE_XLARGE) { - if (n <= 9) { - 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 ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - 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 = 0; i < 16; i ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3 + 1]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - - ssd1306_command(0xB0 + m_row + 2);//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 ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3 + 2]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; 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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - - ssd1306_command(0xB0 + m_row + 2);//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 = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 30 : 16; - } - TWBR = twbrbackup; -} - -void LCD_SSD1306::draw(const PROGMEM byte* buffer, 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; - for (byte i = 0; i < height; i++) { - // send a bunch of data in one xmission - ssd1306_command(0xB0 + i + m_row);//set page address - ssd1306_command(m_col & 0xf);//set lower column address - ssd1306_command(0x10 | (m_col >> 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(p)); - } - Wire.endTransmission(); - } - } - TWBR = twbrbackup; - m_col += width; -} - -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(); - } - } - - setCursor(0, 0); - TWBR = twbrbackup; -} diff --git a/libraries/MultiLCD/MultiLCD.h b/libraries/MultiLCD/MultiLCD.h index 6e36301..f58cad2 100644 --- a/libraries/MultiLCD/MultiLCD.h +++ b/libraries/MultiLCD/MultiLCD.h @@ -4,9 +4,14 @@ * Copyright (c) 2013 Stanley Huang * All rights reserved. *************************************************************************/ +#include -#if !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega644P__) && !defined(__SAM3X8E__) -//#define MEMORY_SAVING +#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168P__) +#define MEMORY_SAVING +#endif + +#ifdef __arm__ +#define PROGMEM #endif typedef enum { @@ -39,16 +44,16 @@ 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(FONT_SIZE_SMALL),m_flags(0) {} - void setFont(FONT_SIZE size) { m_font = size; } + void setFontSize(FONT_SIZE size) { m_font = size; } void setFlags(byte flags) { m_flags = flags; } virtual void backlight(bool on) {} - virtual void draw(const PROGMEM byte* buffer, byte width, byte height) {} + virtual void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height) {} + virtual void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY = 0) {} + virtual void draw4bpp(const PROGMEM byte* buffer, uint16_t width, uint16_t height) {} void printInt(uint16_t value, int8_t padding = -1); void printLong(uint32_t value, int8_t padding = -1); protected: @@ -69,63 +74,6 @@ public: size_t write(uint8_t c) { return 0; } }; -class LCD_PCD8544 : public LCD_Common, public PCD8544 -{ -public: - byte getLines() { return 6; } - byte getCols() { return 14; } - void backlight(bool on) - { - pinMode(7, OUTPUT); - digitalWrite(7, on ? HIGH : LOW); - } - void clearLine(byte line) - { - setCursor(0, line); - for (byte i = 14; i > 0; i--) write(' '); - } - void draw(const PROGMEM byte* buffer, byte width, byte height); -private: - void writeDigit(byte n); -}; - -#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 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_SH1106 : public LCD_Common, public Print -{ -public: - void begin(); - void setCursor(byte column, byte line); - void draw(const PROGMEM byte* buffer, 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 WriteCommand(unsigned char ins); - void WriteData(unsigned char dat); - void writeDigit(byte n); - byte m_col; - byte m_row; -}; - #define TFT_LINE_HEIGHT 8 class LCD_ILI9325D : public LCD_Common, public Print @@ -142,27 +90,27 @@ public: m_y = x; m_x = y; } - void setTextColor(uint16_t color) + void setColor(uint16_t color) { m_color[1] = color; } - void setTextColor(uint8_t R, uint8_t G, uint8_t B) + void setColor(uint8_t R, uint8_t G, uint8_t B) { m_color[1] = ((uint16_t)R << 11) | ((uint16_t)G << 5) | B; } - void SetBGColor(uint16_t color) + void setBackColor(uint16_t color) { m_color[0] = color; } - void SetBGColor(uint8_t R, uint8_t G, uint8_t B) + void setBackColor(uint8_t R, uint8_t G, uint8_t B) { m_color[0] = ((uint16_t)R << 11) | ((uint16_t)G << 5) | B; } 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 width, uint16_t height); - void draw2x(const PROGMEM byte* buffer, byte width, byte height); - void draw4bpp(const PROGMEM byte* buffer, uint16_t x, uint16_t y, uint16_t width, uint16_t height); + void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY = 0); + void draw4bpp(const PROGMEM byte* buffer, uint16_t width, uint16_t height); size_t write(uint8_t); void clearLine(byte line) { @@ -201,23 +149,23 @@ public: m_x = x; m_y = y; } - void setTextColor(uint16_t color) + void setColor(uint16_t color) { m_color[1][0] = color & 0xff; m_color[1][1] = color >> 8; } - void setTextColor(uint8_t R, uint8_t G, uint8_t B) + void setColor(uint8_t R, uint8_t G, uint8_t B) { uint16_t color = ((uint16_t)R << 11) | ((uint16_t)G << 5) | B; m_color[1][0] = color & 0xff; m_color[1][1] = color >> 8; } - void SetBGColor(uint16_t color) + void setBackColor(uint16_t color) { m_color[0][0] = color & 0xff; m_color[0][1] = color >> 8; } - void SetBGColor(uint8_t R, uint8_t G, uint8_t B) + void setBackColor(uint8_t R, uint8_t G, uint8_t B) { uint16_t color = ((uint16_t)R << 11) | ((uint16_t)G << 5) | B; m_color[0][0] = color & 0xff; @@ -234,7 +182,7 @@ public: size_t write(uint8_t); void backlight(bool on); void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height); - void draw2x(const PROGMEM byte* buffer, byte width, byte height); + void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY = 0); private: void setXY(uint16_t x0, uint16_t x1, uint16_t y0, uint16_t y1); void sendPixelData(byte d); @@ -252,3 +200,57 @@ private: uint16_t m_x; uint16_t m_y; }; + +class LCD_SSD1289 : public UTFT, public LCD_Common +{ +public: + LCD_SSD1289() + { + m_font = FONT_SIZE_MEDIUM; + disp_x_size = 239; + disp_y_size = 319; + display_transfer_mode = 16; + display_model = ITDB32S; + __p1 = 38; + __p2 = 39; + __p3 = 40; + __p4 = 41; + __p5 = 0; + + P_RS = portOutputRegister(digitalPinToPort(38)); + B_RS = digitalPinToBitMask(38); + P_WR = portOutputRegister(digitalPinToPort(39)); + B_WR = digitalPinToBitMask(39); + P_CS = portOutputRegister(digitalPinToPort(40)); + B_CS = digitalPinToBitMask(40); + P_RST = portOutputRegister(digitalPinToPort(41)); + B_RST = digitalPinToBitMask(41); + } + void setCursor(uint16_t column, uint8_t line) + { + m_x = column; + m_y = (uint16_t)line * TFT_LINE_HEIGHT; + } + void setXY(uint16_t x, uint16_t y) + { + m_x = x; + m_y = y; + } + void begin(); + void clear(); + void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height); + void draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY = 0); + void draw4bpp(const PROGMEM byte* buffer, uint16_t width, uint16_t height); + size_t write(uint8_t); + void clearLine(byte line) + { + //clear(0, line * TFT_LINE_HEIGHT, 320, 8); + } +private: + void setXY(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + void writeDigit(byte n); + void clearPixels(uint16_t pixels); + void Enable(); + void Disable(); +}; + diff --git a/libraries/MultiLCD/PCD8544.cpp b/libraries/MultiLCD/PCD8544.cpp deleted file mode 100644 index 6b339fe..0000000 --- a/libraries/MultiLCD/PCD8544.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/* - * PCD8544 - Interface with Philips PCD8544 (or compatible) LCDs. - * - * Copyright (c) 2010 Carlos Rodrigues - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#include "PCD8544.h" - -#include -#include - -extern const PROGMEM unsigned char font5x8[][5]; - -/* - * If this was a ".h", it would get added to sketches when using - * the "Sketch -> Import Library..." menu on the Arduino IDE... - */ - -PCD8544::PCD8544(unsigned char sclk, unsigned char sdin, - unsigned char dc, unsigned char reset, - unsigned char sce): - pin_sclk(sclk), - pin_sdin(sdin), - pin_dc(dc), - pin_reset(reset), - pin_sce(sce) -{} - - -void PCD8544::begin(unsigned char model) -{ - this->column = 0; - this->line = 0; - - // Sanitize the custom glyphs... - memset(this->custom, 0, sizeof(this->custom)); - - // All pins are outputs (these displays cannot be read)... - pinMode(this->pin_sclk, OUTPUT); - pinMode(this->pin_sdin, OUTPUT); - pinMode(this->pin_dc, OUTPUT); - pinMode(this->pin_reset, OUTPUT); - pinMode(this->pin_sce, OUTPUT); - - // Reset the controller state... - digitalWrite(this->pin_reset, HIGH); - digitalWrite(this->pin_sce, HIGH); - digitalWrite(this->pin_reset, LOW); - delay(100); - digitalWrite(this->pin_reset, HIGH); - - // Set the LCD parameters... - this->send(PCD8544_CMD, 0x21); // extended instruction set control (H=1) - this->send(PCD8544_CMD, 0x13); // bias system (1:48) - - if (model == CHIP_ST7576) { - this->send(PCD8544_CMD, 0xe0); // higher Vop, too faint at default - this->send(PCD8544_CMD, 0x05); // partial display mode - } else { - this->send(PCD8544_CMD, 0xc2); // default Vop (3.06 + 66 * 0.06 = 7V) - } - - this->send(PCD8544_CMD, 0x20); // extended instruction set control (H=0) - this->send(PCD8544_CMD, 0x09); // all display segments on - - // Clear RAM contents... - this->clear(); - - // Activate LCD... - this->send(PCD8544_CMD, 0x08); // display blank - this->send(PCD8544_CMD, 0x0c); // normal mode (0x0d = inverse mode) - delay(100); - - // Place the cursor at the origin... - this->send(PCD8544_CMD, 0x80); - this->send(PCD8544_CMD, 0x40); -} - - -void PCD8544::stop() -{ - this->clear(); - this->setPower(false); -} - - -void PCD8544::clear() -{ - this->setCursor(0, 0); - - for (unsigned short i = 0; i < PCD8544_WIDTH * (PCD8544_HEIGHT/8); i++) { - this->send(PCD8544_DATA, 0x00); - } - - this->setCursor(0, 0); -} - - -void PCD8544::clearLine() -{ - this->setCursor(0, this->line); - - for (unsigned char i = 0; i < PCD8544_WIDTH; i++) { - this->send(PCD8544_DATA, 0x00); - } - - this->setCursor(0, this->line); -} - - -void PCD8544::setPower(bool on) -{ - this->send(PCD8544_CMD, on ? 0x20 : 0x24); -} - - -inline void PCD8544::display() -{ - this->setPower(true); -} - - -inline void PCD8544::noDisplay() -{ - this->setPower(false); -} - - -void PCD8544::setInverse(bool inverse) -{ - this->send(PCD8544_CMD, inverse ? 0x0d : 0x0c); -} - - -void PCD8544::home() -{ - this->setCursor(0, this->line); -} - - -void PCD8544::setCursor(unsigned char column, unsigned char line) -{ - 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 | column); - this->send(PCD8544_CMD, 0x40 | line); -} - - -void PCD8544::createChar(unsigned char chr, const unsigned char *glyph) -{ - // ASCII 0-31 only... - if (chr >= ' ') { - return; - } - - this->custom[chr] = glyph; -} - - -size_t PCD8544::write(uint8_t chr) -{ - // ASCII 7-bit only... - if (chr >= 0x7f) { - return 0; - } - - if (chr == '\n') { - column = 0; - line = (line + 1) % (PCD8544_HEIGHT/9 + 1); - return 0; - } else if (chr == '\r') { - column = 0; - return 0; - } - - const unsigned char *glyph; - unsigned char pgm_buffer[5]; - - if (chr >= ' ') { - // Regular ASCII characters are kept in flash to save RAM... - memcpy_P(pgm_buffer, &font5x8[chr - ' '], sizeof(pgm_buffer)); - glyph = pgm_buffer; - } else { - // Custom glyphs, on the other hand, are stored in RAM... - if (custom[chr]) { - glyph = custom[chr]; - } else { - // Default to a space character if unset... - memcpy_P(pgm_buffer, &font5x8[0], sizeof(pgm_buffer)); - glyph = pgm_buffer; - } - } - - // Output one column at a time... - for (unsigned char i = 0; i < 5; i++) { - this->send(PCD8544_DATA, glyph[i]); - } - - // One column between characters... - this->send(PCD8544_DATA, 0x00); - - // Update the cursor position... - this->column = (this->column + 6) % PCD8544_WIDTH; - - if (this->column == 0) { - this->line = (this->line + 1) % (PCD8544_HEIGHT/9 + 1); - } - -#if ARDUINO >= 100 - return 1; -#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::draw16x16(const unsigned char *data) -{ - unsigned char scolumn = this->column; - unsigned char sline = this->line; - // Output one column at a time... - for (unsigned char i = 0; i < 16; i++) { - this->send(PCD8544_DATA, data[i]); - } - 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; - unsigned char sline = this->line; - - // Keep "value" within range... - if (value > lines*8) { - value = lines*8; - } - - // Find the line where "value" resides... - unsigned char mark = (lines*8 - 1 - value)/8; - - // Clear the lines above the mark... - for (unsigned char line = 0; line < mark; line++) { - this->setCursor(scolumn, sline + line); - this->send(PCD8544_DATA, 0x00); - } - - // Compute the byte to draw at the "mark" line... - unsigned char b = 0xff; - for (unsigned char i = 0; i < lines*8 - mark*8 - value; i++) { - b <<= 1; - } - - this->setCursor(scolumn, sline + mark); - this->send(PCD8544_DATA, b); - - // Fill the lines below the mark... - for (unsigned char line = mark + 1; line < lines; line++) { - this->setCursor(scolumn, sline + line); - this->send(PCD8544_DATA, 0xff); - } - - // Leave the cursor in a consistent position... - this->setCursor(scolumn + 1, sline); -} - - -void PCD8544::send(unsigned char type, unsigned char data) -{ - digitalWrite(this->pin_dc, type); - - digitalWrite(this->pin_sce, LOW); - shiftOut(this->pin_sdin, this->pin_sclk, MSBFIRST, data); - digitalWrite(this->pin_sce, HIGH); -} - - -/* vim: set expandtab ts=4 sw=4: */ diff --git a/libraries/MultiLCD/PCD8544.h b/libraries/MultiLCD/PCD8544.h deleted file mode 100644 index c96bc7e..0000000 --- a/libraries/MultiLCD/PCD8544.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * PCD8544 - Interface with Philips PCD8544 (or compatible) LCDs. - * - * Copyright (c) 2010 Carlos Rodrigues - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#ifndef PCD8544_H -#define PCD8544_H - - -#if ARDUINO < 100 -#include -#else -#include -#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: - // All the pins can be changed from the default values... - PCD8544(unsigned char sclk = 2, /* clock (display pin 2) */ - unsigned char sdin = 3, /* data-in (display pin 3) */ - unsigned char dc = 4, /* data select (display pin 4) */ - unsigned char reset = 6, /* reset (display pin 8) */ - unsigned char sce = 5); /* enable (display pin 5) */ - - // Display initialization (dimensions in pixels)... - void begin(unsigned char model=CHIP_PCD8544); - void stop(); - - // Erase everything on the display... - void clear(); - void clearLine(); // ...or just the current line - - // Control the display's power state... - void setPower(bool on); - - // For compatibility with the LiquidCrystal library... - void display(); - void noDisplay(); - - // Activate white-on-black mode (whole display)... - void setInverse(bool inverse); - - // Place the cursor at the start of the current line... - void home(); - - // Place the cursor at position (column, line)... - void setCursor(unsigned char column, unsigned char line); - - // Assign a user-defined glyph (5x8) to an ASCII character (0-31)... - void createChar(unsigned char chr, const unsigned char *glyph); - - // Write an ASCII character at the current cursor position (7-bit)... -#if ARDUINO < 100 - virtual void write(uint8_t chr); -#else - virtual size_t write(uint8_t chr); -#endif - - // Draw a chart element at the current cursor position... - void drawColumn(unsigned char lines, unsigned char value); - - 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; - unsigned char pin_sdin; - unsigned char pin_dc; - unsigned char pin_reset; - unsigned char pin_sce; - - // User-defined glyphs (below the ASCII space character)... - const unsigned char *custom[' ']; -}; - - -#endif /* PCD8544_H */ - - -/* vim: set expandtab ts=4 sw=4: */ diff --git a/libraries/MultiLCD/SH1106.cpp b/libraries/MultiLCD/SH1106.cpp deleted file mode 100644 index 0496342..0000000 --- a/libraries/MultiLCD/SH1106.cpp +++ /dev/null @@ -1,401 +0,0 @@ -#include -#include -#include "MultiLCD.h" - -#define I2C_ADDR 0x78 >> 1 - -void LCD_SH1106::WriteCommand(unsigned char ins) -{ - Wire.beginTransmission(I2C_ADDR);//0x78 >> 1 - Wire.write(0x00);//0x00 - Wire.write(ins); - Wire.endTransmission(); -} - -void LCD_SH1106::WriteData(unsigned char dat) -{ - Wire.beginTransmission(I2C_ADDR);//0x78 >> 1 - Wire.write(0x40);//0x40 - Wire.write(dat); - Wire.endTransmission(); -} - -void LCD_SH1106::setCursor(unsigned char x, unsigned char y) -{ - m_col = x + 2; - m_row = y; - WriteCommand(0xb0 + m_row); - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address -} - -void LCD_SH1106::clear(byte x, byte y, byte width, byte height) -{ - WriteCommand(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0 - WriteCommand(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0 - WriteCommand(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 - WriteCommand(0xB0 + i + y);//set page address - WriteCommand((x + 2) & 0xf);//set lower column address - WriteCommand(0x10 | (x >> 4));//set higher column address - - for(byte j = 0; j < 8; j++){ - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte k = 0; k < width; k++) { - Wire.write(0); - } - Wire.endTransmission(); - } - } - - setCursor(0, 0); - TWBR = twbrbackup; -} - -size_t LCD_SH1106::write(uint8_t c) -{ - if (c == '\n') { - setCursor(0, m_row + ((m_font == FONT_SIZE_SMALL) ? 1 : 2)); - return 1; - } else if (c == '\r') { - m_col = 0; - return 1; - } - - uint8_t twbrbackup = TWBR; - TWBR = 18; // upgrade to 400KHz! -#ifndef MEMORY_SAVING - if (m_font == FONT_SIZE_SMALL) { -#endif - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - if (c > 0x20 && c < 0x7f) { - c -= 0x21; - for (byte i = 0; i < 5; i++) { - byte d = pgm_read_byte(&font5x8[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.write(0); - } else { - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 11 : 6; i > 0; i--) { - Wire.write(0); - } - } - Wire.endTransmission(); - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 11 : 6; - if (m_col >= 128) { - m_col = 0; - m_row ++; - } -#ifndef MEMORY_SAVING - } else { - if (c > 0x20 && c < 0x7f) { - c -= 0x21; - - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = 0; i <= 14; i += 2) { - byte d = pgm_read_byte(&font8x16_terminal[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = 1; i <= 15; i += 2) { - byte d = pgm_read_byte(&font8x16_terminal[c][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 16 : 8; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 16 : 8; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 17 : 9; - if (m_col >= 128) { - m_col = 0; - m_row += 2; - } - } -#endif - TWBR = twbrbackup; - return 1; -} - -void LCD_SH1106::writeDigit(byte n) -{ - uint8_t twbrbackup = TWBR; - TWBR = 18; // upgrade to 400KHz! - - if (m_font == FONT_SIZE_SMALL) { - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - if (n <= 9) { - n += '0' - 0x21; - for (byte i = 0; i < 5; i++) { - Wire.write(pgm_read_byte(&font5x8[n][i])); - } - Wire.write(0); - } else { - for (byte i = 0; i < 6; i++) { - Wire.write(0); - } - } - Wire.endTransmission(); - m_col += 6; - } else if (m_font == FONT_SIZE_MEDIUM) { - write(n <= 9 ? ('0' + n) : ' '); -#ifndef MEMORY_SAVING - } else if (m_font == FONT_SIZE_LARGE) { - if (n <= 9) { - byte i; - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (i = 0; i < 16; i ++) { - byte d = pgm_read_byte(&digits16x16[n][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (; i < 32; i ++) { - byte d = pgm_read_byte(&digits16x16[n][i]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 30 : 16; -#endif - } else { - if (n <= 9) { - byte i; - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (i = 0; i < 16; i ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (i = 0; i < 16; i ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3 + 1]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 2);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (i = 0; i < 16; i ++) { - byte d = pgm_read_byte(&digits16x24[n][i * 3 + 2]); - Wire.write(d); - if (m_flags & FLAG_PIXEL_DOUBLE_H) Wire.write(d); - } - Wire.endTransmission(); - } else { - WriteCommand(0xB0 + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 1);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - - WriteCommand(0xB0 + m_row + 2);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte i = (m_flags & FLAG_PIXEL_DOUBLE_H) ? 32 : 16; i > 0; i--) { - Wire.write(0); - } - Wire.endTransmission(); - } - m_col += (m_flags & FLAG_PIXEL_DOUBLE_H) ? 30 : 16; - } - TWBR = twbrbackup; -} - -void LCD_SH1106::draw(const PROGMEM byte* buffer, byte width, byte height) -{ - uint8_t twbrbackup = TWBR; - TWBR = 18; // upgrade to 400KHz! - - WriteCommand(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0 - WriteCommand(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0 - WriteCommand(SSD1306_SETSTARTLINE | 0x0); // line #0 - - const PROGMEM byte *p = buffer; - height >>= 3; - width >>= 3; - for (byte i = 0; i < height; i++) { - // send a bunch of data in one xmission - WriteCommand(0xB0 + i + m_row);//set page address - WriteCommand(m_col & 0xf);//set lower column address - WriteCommand(0x10 | (m_col >> 4));//set higher column address - - for(byte j = 0; j < 8; j++){ - Wire.beginTransmission(I2C_ADDR); - Wire.write(0x40); - for (byte k = 0; k < width; k++, p++) { - Wire.write(pgm_read_byte(p)); - } - Wire.endTransmission(); - } - } - TWBR = twbrbackup; - m_col += width; -} - -void LCD_SH1106::begin() -{ - Wire.begin(); - - WriteCommand(0xAE); /*display off*/ - - WriteCommand(0x02); /*set lower column address*/ - WriteCommand(0x10); /*set higher column address*/ - - WriteCommand(0x40); /*set display start line*/ - - WriteCommand(0xB0); /*set page address*/ - - WriteCommand(0x81); /*contract control*/ - WriteCommand(0x80); /*128*/ - - WriteCommand(0xA1); /*set segment remap*/ - - WriteCommand(0xA6); /*normal / reverse*/ - - WriteCommand(0xA8); /*multiplex ratio*/ - WriteCommand(0x3F); /*duty = 1/32*/ - - WriteCommand(0xad); /*set charge pump enable*/ - WriteCommand(0x8b); /*external VCC */ - - WriteCommand(0x30); /*0X30---0X33 set VPP 9V liangdu!!!!*/ - - WriteCommand(0xC8); /*Com scan direction*/ - - WriteCommand(0xD3); /*set display offset*/ - WriteCommand(0x00); /* 0x20 */ - - WriteCommand(0xD5); /*set osc division*/ - WriteCommand(0x80); - - WriteCommand(0xD9); /*set pre-charge period*/ - WriteCommand(0x1f); /*0x22*/ - - WriteCommand(0xDA); /*set COM pins*/ - WriteCommand(0x12); - - WriteCommand(0xdb); /*set vcomh*/ - WriteCommand(0x40); - - WriteCommand(0xAF); /*display ON*/ - - clear(); -} diff --git a/libraries/MultiLCD/SSD1289.cpp b/libraries/MultiLCD/SSD1289.cpp new file mode 100644 index 0000000..6552237 --- /dev/null +++ b/libraries/MultiLCD/SSD1289.cpp @@ -0,0 +1,393 @@ +/************************************************************************* +* Arduino Text Display Library for Multiple LCDs +* Distributed under GPL v2.0 +* Copyright (c) 2013 Stanley Huang +* All rights reserved. +*************************************************************************/ + +#include +#include "MultiLCD.h" + +/********************************************** +Define zone +**********************************************/ + +#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_SSD1289::begin() +{ + delay(50); + pinMode(__p1,OUTPUT); + pinMode(__p2,OUTPUT); + pinMode(__p3,OUTPUT); + if (__p4 != NOTINUSE) + pinMode(__p4,OUTPUT); + if ((display_transfer_mode==LATCHED_16) or ((display_transfer_mode==1) and (display_serial_mode==SERIAL_5PIN))) + pinMode(__p5,OUTPUT); + if (display_transfer_mode!=1) + _set_direction_registers(display_transfer_mode); + + _hw_special_init(); + + sbi(P_RST, B_RST); + delay(5); + cbi(P_RST, B_RST); + delay(15); + sbi(P_RST, B_RST); + delay(15); + + setColor(0xffff); + setBackColor(0); + _transparent = false; + + cbi(P_CS, B_CS); + + LCD_Write_COM_DATA(0x00,0x0001); + LCD_Write_COM_DATA(0x03,0xA8A4); + LCD_Write_COM_DATA(0x0C,0x0000); + LCD_Write_COM_DATA(0x0D,0x080C); + LCD_Write_COM_DATA(0x0E,0x2B00); + LCD_Write_COM_DATA(0x1E,0x00B7); + LCD_Write_COM_DATA(0x01,0x2B3F); + LCD_Write_COM_DATA(0x02,0x0600); + LCD_Write_COM_DATA(0x10,0x0000); + LCD_Write_COM_DATA(0x11,0x6070); + LCD_Write_COM_DATA(0x05,0x0000); + LCD_Write_COM_DATA(0x06,0x0000); + LCD_Write_COM_DATA(0x16,0xEF1C); + LCD_Write_COM_DATA(0x17,0x0003); + LCD_Write_COM_DATA(0x07,0x0233); + LCD_Write_COM_DATA(0x0B,0x0000); + LCD_Write_COM_DATA(0x0F,0x0000); + LCD_Write_COM_DATA(0x41,0x0000); + LCD_Write_COM_DATA(0x42,0x0000); + LCD_Write_COM_DATA(0x48,0x0000); + LCD_Write_COM_DATA(0x49,0x013F); + LCD_Write_COM_DATA(0x4A,0x0000); + LCD_Write_COM_DATA(0x4B,0x0000); + LCD_Write_COM_DATA(0x44,0xEF00); + LCD_Write_COM_DATA(0x45,0x0000); + LCD_Write_COM_DATA(0x46,0x013F); + LCD_Write_COM_DATA(0x30,0x0707); + LCD_Write_COM_DATA(0x31,0x0204); + LCD_Write_COM_DATA(0x32,0x0204); + LCD_Write_COM_DATA(0x33,0x0502); + LCD_Write_COM_DATA(0x34,0x0507); + LCD_Write_COM_DATA(0x35,0x0204); + LCD_Write_COM_DATA(0x36,0x0204); + LCD_Write_COM_DATA(0x37,0x0502); + LCD_Write_COM_DATA(0x3A,0x0302); + LCD_Write_COM_DATA(0x3B,0x0302); + LCD_Write_COM_DATA(0x23,0x0000); + LCD_Write_COM_DATA(0x24,0x0000); + LCD_Write_COM_DATA(0x25,0x8000); + LCD_Write_COM_DATA(0x4f,0x0000); + LCD_Write_COM_DATA(0x4e,0x0000); + LCD_Write_COM(0x22); + + sbi (P_CS, B_CS); + + clear(); +} + +void LCD_SSD1289::setXY(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + swap(word, x1, y1); + swap(word, x2, y2) + y1=disp_y_size-y1; + y2=disp_y_size-y2; + swap(word, y1, y2) + // begin hardware specific code + LCD_Write_COM_DATA(0x44,(x2<<8)+x1); + LCD_Write_COM_DATA(0x45,y1); + LCD_Write_COM_DATA(0x46,y2); + LCD_Write_COM_DATA(0x4e,x1); + LCD_Write_COM_DATA(0x4f,y1); + LCD_Write_COM(0x22); +} + +void LCD_SSD1289::Enable() +{ + cbi(P_CS, B_CS); +} +void LCD_SSD1289::Disable() +{ + sbi(P_CS, B_CS); +} + +void LCD_SSD1289::clearPixels(uint16_t pixels) +{ + do { + setPixel(bch, bcl); + } while(--pixels); +} + +void LCD_SSD1289::clear() +{ + m_x = 0; + m_y = 0; + clrScr(); +} + +size_t LCD_SSD1289::write(uint8_t c) +{ + if (c == '\n') { + m_x += (m_font + 1) << 3; + return 0; + } else if (c == '\r') { + m_y = 0; + return 0; + } + if (m_x >= 320) return 0; + Enable(); + if (m_font == FONT_SIZE_SMALL) { + setXY(m_x, m_y, m_x + 4, m_y + 7); + if (c > 0x20 && c < 0x7f) { + byte i = 4; + do { + unsigned char d = pgm_read_byte(&font5x8[c - 0x21][i]); + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + } while(i--); + } else { + clearPixels(5 * 8); + } + m_x += 6; + } else { + setXY(m_x, m_y, m_x + 7, m_y + 15); + if (c > 0x20 && c < 0x7f) { + byte pgm_buffer[16]; + memcpy_P(pgm_buffer, &font8x16_terminal[c - 0x21], 16); + for (byte i = 0; i < 16; i += 2) { + unsigned char d = pgm_buffer[14 - i]; + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + d = pgm_buffer[15 - i]; + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + } + } else { + clearPixels(16 * 8); + } + m_x += 9; + } + Disable(); +} + +void LCD_SSD1289::writeDigit(byte n) +{ + Enable(); + if (m_font == FONT_SIZE_SMALL) { + setXY(m_x, m_y, m_x + 7, m_y + 7); + if (n <= 9) { + byte pgm_buffer[8]; + memcpy_P(pgm_buffer, &digits8x8[n], 8); + byte i = 7; + do { + unsigned char d = pgm_buffer[i]; + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + } while (i--); + + } else { + clearPixels(8 * 8); + } + m_x += 8; + } else if (m_font == FONT_SIZE_MEDIUM) { + write(n <= 9 ? ('0' + n) : ' '); + } else if (m_font == FONT_SIZE_LARGE) { + setXY(m_x, m_y, m_x + 15, m_y + 15); + if (n <= 9) { + byte pgm_buffer[32]; + memcpy_P(pgm_buffer, &digits16x16[n], sizeof(pgm_buffer)); + for (byte i = 0; i < 16; i++) { + unsigned char d = pgm_buffer[15 - i]; + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + d = pgm_buffer[31 - i]; + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + } + } else { + clearPixels(16 * 16); + } + m_x += 16; + } else if (m_font == FONT_SIZE_XLARGE) { + setXY(m_x, m_y, m_x + 15, m_y + 23); + if (n <= 9) { + byte pgm_buffer[48]; + memcpy_P(pgm_buffer, &digits16x24[n], sizeof(pgm_buffer)); + for (int i = 0; i < 48; i += 3) { + unsigned char d = pgm_buffer[45 - i]; + for (int j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + d = pgm_buffer[46 - i]; + for (int j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + d = pgm_buffer[47 - i]; + for (int j = 0; j < 8; j++, d >>= 1) { + if (d & 1) + setPixel(fch, fcl); + else + setPixel(bch, bcl); + } + } + } else { + clearPixels(16 * 24); + } + m_x += 18; + } + Disable(); +} + +void LCD_SSD1289::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height) +{ + byte rows = height >> 3; + Enable(); + setXY(m_x, m_y, m_x + width - 1, m_y + height - 1); + for (int16_t i = width - 1; i >= 0; i--) { + for (uint8_t h = 0; h < rows; h++) { +#ifndef __arm__ + byte d = pgm_read_byte(buffer + i + width * h); +#else + byte d = buffer[i + width * h]; +#endif + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) { + setPixel(fch, fcl); + } else { + setPixel(bch, bcl); + } + } + } + } + Disable(); + m_x += width; +} + +void LCD_SSD1289::draw(const PROGMEM byte* buffer, uint16_t width, uint16_t height, byte scaleX, byte scaleY) +{ + byte rows = height >> 3; + if (scaleY == 0) scaleY = scaleX; + Enable(); + setXY(m_x, m_y, m_x + width * scaleX - 1, m_y + height * scaleY - 1); + for (int16_t i = width - 1; i >= 0; i--) { + for (byte n = 0; n < scaleX; n++) { + for (uint8_t h = 0; h < rows; h++) { +#ifndef __arm__ + byte d = pgm_read_byte(buffer + i + width * h); +#else + byte d = buffer[i + width * h]; +#endif + for (byte j = 0; j < 8; j++, d >>= 1) { + if (d & 1) { + for (byte m = 0; m < scaleY; m++) { + setPixel(fch, fcl); + } + } else { + for (byte m = 0; m < scaleY; m++) { + setPixel(bch, bcl); + } + } + } + } + } + } + Disable(); + m_x += width * scaleX; +} + +void LCD_SSD1289::draw4bpp(const PROGMEM byte* buffer, uint16_t width, uint16_t height) +{ + char buf[240]; + Enable(); + setXY(m_x, m_y, m_x + width * 2 - 1, m_y + height * 2 - 1); + uint16_t i = width - 1; + do { + memcpy_P(buf, buffer + i * height * 2, height * 2); + for (byte j = 0; j < height * 2; j += 2) { + setPixel(buf[j + 1], buf[j]); + setPixel(buf[j + 1], buf[j]); + } + for (byte j = 0; j < height * 2; j += 2) { + setPixel(buf[j + 1], buf[j]); + setPixel(buf[j + 1], buf[j]); + } + } while (i--); + Disable(); + m_x += width * 2; +} diff --git a/libraries/MultiLCD/SSD1306.cpp b/libraries/MultiLCD/SSD1306.cpp deleted file mode 100644 index 7b1c4f6..0000000 --- a/libraries/MultiLCD/SSD1306.cpp +++ /dev/null @@ -1,273 +0,0 @@ -#include -//#include -#include -#include -#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 deleted file mode 100644 index ae7f339..0000000 --- a/libraries/MultiLCD/SSD1306.h +++ /dev/null @@ -1,112 +0,0 @@ -#include "Arduino.h" - -#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/UTFT.cpp b/libraries/MultiLCD/UTFT.cpp new file mode 100644 index 0000000..59710e9 --- /dev/null +++ b/libraries/MultiLCD/UTFT.cpp @@ -0,0 +1,985 @@ +/* + UTFT.cpp - Arduino/chipKit library support for Color TFT LCD Boards + Copyright (C)2010-2014 Henning Karlsen. All right reserved + + This library is the continuation of my ITDB02_Graph, ITDB02_Graph16 + and RGB_GLCD libraries for Arduino and chipKit. As the number of + supported display modules and controllers started to increase I felt + it was time to make a single, universal library as it will be much + easier to maintain in the future. + + Basic functionality of this library was origianlly based on the + demo-code provided by ITead studio (for the ITDB02 modules) and + NKC Electronics (for the RGB GLCD module/shield). + + This library supports a number of 8bit, 16bit and serial graphic + displays, and will work with both Arduino and chipKit boards. For a + full list of tested display modules and controllers, see the + document UTFT_Supported_display_modules_&_controllers.pdf. + + When using 8bit and 16bit display modules there are some + requirements you must adhere to. These requirements can be found + in the document UTFT_Requirements.pdf. + There are no special requirements when using serial displays. + + You can always find the latest version of the library at + http://electronics.henningkarlsen.com/ + + If you make any modifications or improvements to the code, I would + appreciate that you share the code with me so that I might include + it in the next release. I can be contacted through + http://electronics.henningkarlsen.com/contact.php. + + This library is free software; you can redistribute it and/or + modify it under the terms of the CC BY-NC-SA 3.0 license. + Please see the included documents for further information. + + Commercial use of this library requires you to buy a license that + will allow commercial use. This includes using the library, + modified or not, as a tool to sell products. + + The license applies to all part of the library including the + examples and tools supplied with the library. +*/ + +#include "UTFT.h" +#include + +// Include hardware-specific functions for the correct MCU +#if defined(__AVR__) + #include + #include "hardware/avr/HW_AVR.h" + #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #include "hardware/avr/HW_ATmega1280.h" + #elif defined(__AVR_ATmega328P__) + #include "hardware/avr/HW_ATmega328P.h" + #elif defined(__AVR_ATmega32U4__) + #include "hardware/avr/HW_ATmega32U4.h" + #elif defined(__AVR_ATmega168__) + #error "ATmega168 MCUs are not supported because they have too little flash memory!" + #elif defined(__AVR_ATmega1284P__) + #include "hardware/avr/HW_ATmega1284P.h" + #else + #error "Unsupported AVR MCU!" + #endif +#elif defined(__PIC32MX__) + #include "hardware/pic32/HW_PIC32.h" + #if defined(__32MX320F128H__) + #pragma message("Compiling for chipKIT UNO32 (PIC32MX320F128H)") + #include "hardware/pic32/HW_PIC32MX320F128H.h" + #elif defined(__32MX340F512H__) + #pragma message("Compiling for chipKIT uC32 (PIC32MX340F512H)") + #include "hardware/pic32/HW_PIC32MX340F512H.h" + #elif defined(__32MX795F512L__) + #pragma message("Compiling for chipKIT MAX32 (PIC32MX795F512L)") + #include "hardware/pic32/HW_PIC32MX795F512L.h" + #else + #error "Unsupported PIC32 MCU!" + #endif +#elif defined(__arm__) + #include "hardware/arm/HW_ARM.h" + #if defined(__SAM3X8E__) + #pragma message("Compiling for Arduino Due (AT91SAM3X8E)...") + #include "hardware/arm/HW_SAM3X8E.h" + #elif defined(__MK20DX128__) || defined(__MK20DX256__) + #pragma message("Compiling for Teensy 3.x (MK20DX128VLH7 / MK20DX256VLH7)...") + #include "hardware/arm/HW_MX20DX256.h" + #else + #error "Unsupported ARM MCU!" + #endif +#endif +#include "memorysaver.h" + +UTFT::UTFT() +{ +} + +UTFT::UTFT(byte model, int RS, int WR, int CS, int RST, int SER) +{ + word dsx[] = {239, 239, 239, 239, 239, 239, 175, 175, 239, 127, 127, 239, 271, 479, 239, 239, 239, 239, 239, 239, 479, 319, 239, 175, 127, 239, 239, 319, 319, 799, 127}; + word dsy[] = {319, 399, 319, 319, 319, 319, 219, 219, 399, 159, 127, 319, 479, 799, 319, 319, 319, 319, 319, 319, 799, 479, 319, 219, 159, 319, 319, 479, 479, 479, 159}; + byte dtm[] = {16, 16, 16, 8, 8, 16, 8, SERIAL_4PIN, 16, SERIAL_5PIN, SERIAL_5PIN, 16, 16, 16, 8, 16, LATCHED_16, 8, 16, 8, 16, 16, 16, 8, SERIAL_5PIN, SERIAL_5PIN, SERIAL_4PIN, 16, 16, 16, SERIAL_5PIN}; + + disp_x_size = dsx[model]; + disp_y_size = dsy[model]; + display_transfer_mode = dtm[model]; + display_model = model; + + __p1 = RS; + __p2 = WR; + __p3 = CS; + __p4 = RST; + __p5 = SER; + + if (display_transfer_mode == SERIAL_4PIN) + { + display_transfer_mode=1; + display_serial_mode=SERIAL_4PIN; + } + if (display_transfer_mode == SERIAL_5PIN) + { + display_transfer_mode=1; + display_serial_mode=SERIAL_5PIN; + } + + if (display_transfer_mode!=1) + { + P_RS = portOutputRegister(digitalPinToPort(RS)); + B_RS = digitalPinToBitMask(RS); + P_WR = portOutputRegister(digitalPinToPort(WR)); + B_WR = digitalPinToBitMask(WR); + P_CS = portOutputRegister(digitalPinToPort(CS)); + B_CS = digitalPinToBitMask(CS); + P_RST = portOutputRegister(digitalPinToPort(RST)); + B_RST = digitalPinToBitMask(RST); + if (display_transfer_mode==LATCHED_16) + { + P_ALE = portOutputRegister(digitalPinToPort(SER)); + B_ALE = digitalPinToBitMask(SER); + cbi(P_ALE, B_ALE); + pinMode(8,OUTPUT); + digitalWrite(8, LOW); + } + } + else + { + P_SDA = portOutputRegister(digitalPinToPort(RS)); + B_SDA = digitalPinToBitMask(RS); + P_SCL = portOutputRegister(digitalPinToPort(WR)); + B_SCL = digitalPinToBitMask(WR); + P_CS = portOutputRegister(digitalPinToPort(CS)); + B_CS = digitalPinToBitMask(CS); + if (RST != NOTINUSE) + { + P_RST = portOutputRegister(digitalPinToPort(RST)); + B_RST = digitalPinToBitMask(RST); + } + if (display_serial_mode!=SERIAL_4PIN) + { + P_RS = portOutputRegister(digitalPinToPort(SER)); + B_RS = digitalPinToBitMask(SER); + } + } +} + +void UTFT::LCD_Write_COM(char VL) +{ + if (display_transfer_mode!=1) + { + cbi(P_RS, B_RS); + LCD_Writ_Bus(0x00,VL,display_transfer_mode); + } + else + LCD_Writ_Bus(0x00,VL,display_transfer_mode); +} + +void UTFT::LCD_Write_DATA(char VH,char VL) +{ + if (display_transfer_mode!=1) + { + sbi(P_RS, B_RS); + LCD_Writ_Bus(VH,VL,display_transfer_mode); + } + else + { + LCD_Writ_Bus(0x01,VH,display_transfer_mode); + LCD_Writ_Bus(0x01,VL,display_transfer_mode); + } +} + +void UTFT::LCD_Write_DATA(char VL) +{ + if (display_transfer_mode!=1) + { + sbi(P_RS, B_RS); + LCD_Writ_Bus(0x00,VL,display_transfer_mode); + } + else + LCD_Writ_Bus(0x01,VL,display_transfer_mode); +} + +void UTFT::LCD_Write_COM_DATA(char com1,int dat1) +{ + LCD_Write_COM(com1); + LCD_Write_DATA(dat1>>8,dat1); +} + +void UTFT::InitLCD() +{ + pinMode(__p1,OUTPUT); + pinMode(__p2,OUTPUT); + pinMode(__p3,OUTPUT); + if (__p4 != NOTINUSE) + pinMode(__p4,OUTPUT); + if ((display_transfer_mode==LATCHED_16) or ((display_transfer_mode==1) and (display_serial_mode==SERIAL_5PIN))) + pinMode(__p5,OUTPUT); + if (display_transfer_mode!=1) + _set_direction_registers(display_transfer_mode); + + _hw_special_init(); + + sbi(P_RST, B_RST); + delay(5); + cbi(P_RST, B_RST); + delay(15); + sbi(P_RST, B_RST); + delay(15); + + cbi(P_CS, B_CS); + + switch(display_model) + { +#ifndef DISABLE_HX8347A + #include "tft_drivers/hx8347a/initlcd.h" +#endif +#ifndef DISABLE_ILI9327 + #include "tft_drivers/ili9327/initlcd.h" +#endif +#ifndef DISABLE_SSD1289 + #include "tft_drivers/ssd1289/initlcd.h" +#endif +#ifndef DISABLE_ILI9325C + #include "tft_drivers/ili9325c/initlcd.h" +#endif +#ifndef DISABLE_ILI9325D + #include "tft_drivers/ili9325d/default/initlcd.h" +#endif +#ifndef DISABLE_ILI9325D_ALT + #include "tft_drivers/ili9325d/alt/initlcd.h" +#endif +#ifndef DISABLE_HX8340B_8 + #include "tft_drivers/hx8340b/8/initlcd.h" +#endif +#ifndef DISABLE_HX8340B_S + #include "tft_drivers/hx8340b/s/initlcd.h" +#endif +#ifndef DISABLE_ST7735 + #include "tft_drivers/st7735/initlcd.h" +#endif +#ifndef DISABLE_PCF8833 + #include "tft_drivers/pcf8833/initlcd.h" +#endif +#ifndef DISABLE_S1D19122 + #include "tft_drivers/s1d19122/initlcd.h" +#endif +#ifndef DISABLE_HX8352A + #include "tft_drivers/hx8352a/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_480 + #include "tft_drivers/ssd1963/480/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_800 + #include "tft_drivers/ssd1963/800/initlcd.h" +#endif +#ifndef DISABLE_SSD1963_800_ALT + #include "tft_drivers/ssd1963/800alt/initlcd.h" +#endif +#ifndef DISABLE_S6D1121 + #include "tft_drivers/s6d1121/initlcd.h" +#endif +#ifndef DISABLE_ILI9320 + #include "tft_drivers/ili9320/initlcd.h" +#endif +#ifndef DISABLE_ILI9481 + #include "tft_drivers/ili9481/initlcd.h" +#endif +#ifndef DISABLE_S6D0164 + #include "tft_drivers/s6d0164/initlcd.h" +#endif +#ifndef DISABLE_ST7735S + #include "tft_drivers/st7735s/initlcd.h" +#endif +#ifndef DISABLE_ILI9341_S4P + #include "tft_drivers/ili9341/s4p/initlcd.h" +#endif +#ifndef DISABLE_ILI9341_S5P + #include "tft_drivers/ili9341/s5p/initlcd.h" +#endif +#ifndef DISABLE_R61581 + #include "tft_drivers/r61581/initlcd.h" +#endif +#ifndef DISABLE_ILI9486 + #include "tft_drivers/ili9486/initlcd.h" +#endif +#ifndef DISABLE_CPLD + #include "tft_drivers/cpld/initlcd.h" +#endif +#ifndef DISABLE_HX8353C + #include "tft_drivers/hx8353c/initlcd.h" +#endif + } + + sbi (P_CS, B_CS); + + setColor(0xffff); + setBackColor(0); + cfont.font=0; + _transparent = false; +} + +void UTFT::setXY(word x1, word y1, word x2, word y2) +{ + swap(word, x1, y1); + swap(word, x2, y2) + y1=disp_y_size-y1; + y2=disp_y_size-y2; + swap(word, y1, y2) + + switch(display_model) + { +#ifndef DISABLE_HX8347A + #include "tft_drivers/hx8347a/setxy.h" +#endif +#ifndef DISABLE_HX8352A + #include "tft_drivers/hx8352a/setxy.h" +#endif +#ifndef DISABLE_ILI9327 + #include "tft_drivers/ili9327/setxy.h" +#endif +#ifndef DISABLE_SSD1289 + #include "tft_drivers/ssd1289/setxy.h" +#endif +#ifndef DISABLE_ILI9325C + #include "tft_drivers/ili9325c/setxy.h" +#endif +#ifndef DISABLE_ILI9325D + #include "tft_drivers/ili9325d/default/setxy.h" +#endif +#ifndef DISABLE_ILI9325D_ALT + #include "tft_drivers/ili9325d/alt/setxy.h" +#endif +#ifndef DISABLE_HX8340B_8 + #include "tft_drivers/hx8340b/8/setxy.h" +#endif +#ifndef DISABLE_HX8340B_S + #include "tft_drivers/hx8340b/s/setxy.h" +#endif +#ifndef DISABLE_ST7735 + #include "tft_drivers/st7735/setxy.h" +#endif +#ifndef DISABLE_S1D19122 + #include "tft_drivers/s1d19122/setxy.h" +#endif +#ifndef DISABLE_PCF8833 + #include "tft_drivers/pcf8833/setxy.h" +#endif +#ifndef DISABLE_SSD1963_480 + #include "tft_drivers/ssd1963/480/setxy.h" +#endif +#ifndef DISABLE_SSD1963_800 + #include "tft_drivers/ssd1963/800/setxy.h" +#endif +#ifndef DISABLE_SSD1963_800_ALT + #include "tft_drivers/ssd1963/800alt/setxy.h" +#endif +#ifndef DISABLE_S6D1121 + #include "tft_drivers/s6d1121/setxy.h" +#endif +#ifndef DISABLE_ILI9320 + #include "tft_drivers/ili9320/setxy.h" +#endif +#ifndef DISABLE_ILI9481 + #include "tft_drivers/ili9481/setxy.h" +#endif +#ifndef DISABLE_S6D0164 + #include "tft_drivers/s6d0164/setxy.h" +#endif +#ifndef DISABLE_ST7735S + #include "tft_drivers/st7735s/setxy.h" +#endif +#ifndef DISABLE_ILI9341_S4P + #include "tft_drivers/ili9341/s4p/setxy.h" +#endif +#ifndef DISABLE_ILI9341_S5P + #include "tft_drivers/ili9341/s5p/setxy.h" +#endif +#ifndef DISABLE_R61581 + #include "tft_drivers/r61581/setxy.h" +#endif +#ifndef DISABLE_ILI9486 + #include "tft_drivers/ili9486/setxy.h" +#endif +#ifndef DISABLE_CPLD + #include "tft_drivers/cpld/setxy.h" +#endif +#ifndef DISABLE_HX8353C + #include "tft_drivers/hx8353c/setxy.h" +#endif + } +} + +void UTFT::clrXY() +{ + setXY(0,0,disp_y_size,disp_x_size); +} + +void UTFT::drawRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + + drawHLine(x1, y1, x2-x1); + drawHLine(x1, y2, x2-x1); + drawVLine(x1, y1, y2-y1); + drawVLine(x2, y1, y2-y1); +} + +void UTFT::drawRoundRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + if ((x2-x1)>4 && (y2-y1)>4) + { + drawPixel(x1+1,y1+1); + drawPixel(x2-1,y1+1); + drawPixel(x1+1,y2-1); + drawPixel(x2-1,y2-1); + drawHLine(x1+2, y1, x2-x1-4); + drawHLine(x1+2, y2, x2-x1-4); + drawVLine(x1, y1+2, y2-y1-4); + drawVLine(x2, y1+2, y2-y1-4); + } +} + +void UTFT::fillRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + if (display_transfer_mode==16) + { + cbi(P_CS, B_CS); + setXY(x1, y1, x2, y2); + sbi(P_RS, B_RS); + _fast_fill_16(fch,fcl,((long(x2-x1)+1)*(long(y2-y1)+1))); + sbi(P_CS, B_CS); + } + else if ((display_transfer_mode==8) and (fch==fcl)) + { + cbi(P_CS, B_CS); + setXY(x1, y1, x2, y2); + sbi(P_RS, B_RS); + _fast_fill_8(fch,((long(x2-x1)+1)*(long(y2-y1)+1))); + sbi(P_CS, B_CS); + } + else + { + + for (int i=0; i<((x2-x1)/2)+1; i++) + { + drawVLine(x1+i, y1, y2-y1); + drawVLine(x2-i, y1, y2-y1); + } + } +} + +void UTFT::fillRoundRect(int x1, int y1, int x2, int y2) +{ + if (x1>x2) + { + swap(int, x1, x2); + } + if (y1>y2) + { + swap(int, y1, y2); + } + + if ((x2-x1)>4 && (y2-y1)>4) + { + for (int i=0; i<((y2-y1)/2)+1; i++) + { + switch(i) + { + case 0: + drawHLine(x1+2, y1+i, x2-x1-4); + drawHLine(x1+2, y2-i, x2-x1-4); + break; + case 1: + drawHLine(x1+1, y1+i, x2-x1-2); + drawHLine(x1+1, y2-i, x2-x1-2); + break; + default: + drawHLine(x1, y1+i, x2-x1); + drawHLine(x1, y2-i, x2-x1); + } + } + } +} + +void UTFT::drawCircle(int x, int y, int radius) +{ + int f = 1 - radius; + int ddF_x = 1; + int ddF_y = -2 * radius; + int x1 = 0; + int y1 = radius; + + cbi(P_CS, B_CS); + setXY(x, y + radius, x, y + radius); + LCD_Write_DATA(fch,fcl); + setXY(x, y - radius, x, y - radius); + LCD_Write_DATA(fch,fcl); + setXY(x + radius, y, x + radius, y); + LCD_Write_DATA(fch,fcl); + setXY(x - radius, y, x - radius, y); + LCD_Write_DATA(fch,fcl); + + while(x1 < y1) + { + if(f >= 0) + { + y1--; + ddF_y += 2; + f += ddF_y; + } + x1++; + ddF_x += 2; + f += ddF_x; + setXY(x + x1, y + y1, x + x1, y + y1); + LCD_Write_DATA(fch,fcl); + setXY(x - x1, y + y1, x - x1, y + y1); + LCD_Write_DATA(fch,fcl); + setXY(x + x1, y - y1, x + x1, y - y1); + LCD_Write_DATA(fch,fcl); + setXY(x - x1, y - y1, x - x1, y - y1); + LCD_Write_DATA(fch,fcl); + setXY(x + y1, y + x1, x + y1, y + x1); + LCD_Write_DATA(fch,fcl); + setXY(x - y1, y + x1, x - y1, y + x1); + LCD_Write_DATA(fch,fcl); + setXY(x + y1, y - x1, x + y1, y - x1); + LCD_Write_DATA(fch,fcl); + setXY(x - y1, y - x1, x - y1, y - x1); + LCD_Write_DATA(fch,fcl); + } + sbi(P_CS, B_CS); + clrXY(); +} + +void UTFT::fillCircle(int x, int y, int radius) +{ + for(int y1=-radius; y1<=0; y1++) + for(int x1=-radius; x1<=0; x1++) + if(x1*x1+y1*y1 <= radius*radius) + { + drawHLine(x+x1, y+y1, 2*(-x1)); + drawHLine(x+x1, y-y1, 2*(-x1)); + break; + } +} + +void UTFT::clrScr() +{ + long i; + + cbi(P_CS, B_CS); + clrXY(); + if (display_transfer_mode!=1) + sbi(P_RS, B_RS); + if (display_transfer_mode==16) + _fast_fill_16(0,0,((disp_x_size+1)*(disp_y_size+1))); + else if (display_transfer_mode==8) + _fast_fill_8(0,((disp_x_size+1)*(disp_y_size+1))); + else + { + for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++) + { + if (display_transfer_mode!=1) + LCD_Writ_Bus(0,0,display_transfer_mode); + else + { + LCD_Writ_Bus(1,0,display_transfer_mode); + LCD_Writ_Bus(1,0,display_transfer_mode); + } + } + } + sbi(P_CS, B_CS); +} + +void UTFT::fillScr(byte r, byte g, byte b) +{ + word color = ((r&248)<<8 | (g&252)<<3 | (b&248)>>3); + fillScr(color); +} + +void UTFT::fillScr(word color) +{ + long i; + char ch, cl; + + ch=byte(color>>8); + cl=byte(color & 0xFF); + + cbi(P_CS, B_CS); + clrXY(); + if (display_transfer_mode!=1) + sbi(P_RS, B_RS); + if (display_transfer_mode==16) + _fast_fill_16(ch,cl,((disp_x_size+1)*(disp_y_size+1))); + else if ((display_transfer_mode==8) and (ch==cl)) + _fast_fill_8(ch,((disp_x_size+1)*(disp_y_size+1))); + else + { + for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++) + { + if (display_transfer_mode!=1) + LCD_Writ_Bus(ch,cl,display_transfer_mode); + else + { + LCD_Writ_Bus(1,ch,display_transfer_mode); + LCD_Writ_Bus(1,cl,display_transfer_mode); + } + } + } + sbi(P_CS, B_CS); +} + +void UTFT::setColor(byte r, byte g, byte b) +{ + fch=((r&248)|g>>5); + fcl=((g&28)<<3|b>>3); +} + +void UTFT::setColor(word color) +{ + fch=byte(color>>8); + fcl=byte(color & 0xFF); +} + +word UTFT::getColor() +{ + return (fch<<8) | fcl; +} + +void UTFT::setBackColor(byte r, byte g, byte b) +{ + bch=((r&248)|g>>5); + bcl=((g&28)<<3|b>>3); + _transparent=false; +} + +void UTFT::setBackColor(word color) +{ + bch=byte(color>>8); + bcl=byte(color & 0xFF); + _transparent=false; +} + +word UTFT::getBackColor() +{ + return (bch<<8) | bcl; +} + +void UTFT::setPixel(word color) +{ + LCD_Write_DATA((color>>8),(color&0xFF)); // rrrrrggggggbbbbb +} + +void UTFT::setPixel(char ch, char cl) +{ + LCD_Write_DATA(ch,cl); // rrrrrggggggbbbbb +} + +void UTFT::drawPixel(int x, int y) +{ + cbi(P_CS, B_CS); + setXY(x, y, x, y); + setPixel(fch, fcl); + sbi(P_CS, B_CS); + //clrXY(); +} + +void UTFT::drawLine(int x1, int y1, int x2, int y2) +{ + if (y1==y2) + drawHLine(x1, y1, x2-x1); + else if (x1==x2) + drawVLine(x1, y1, y2-y1); + else + { + unsigned int dx = (x2 > x1 ? x2 - x1 : x1 - x2); + short xstep = x2 > x1 ? 1 : -1; + unsigned int dy = (y2 > y1 ? y2 - y1 : y1 - y2); + short ystep = y2 > y1 ? 1 : -1; + int col = x1, row = y1; + + cbi(P_CS, B_CS); + if (dx < dy) + { + int t = - (dy >> 1); + while (true) + { + setXY (col, row, col, row); + LCD_Write_DATA (fch, fcl); + if (row == y2) + return; + row += ystep; + t += dx; + if (t >= 0) + { + col += xstep; + t -= dy; + } + } + } + else + { + int t = - (dx >> 1); + while (true) + { + setXY (col, row, col, row); + LCD_Write_DATA (fch, fcl); + if (col == x2) + return; + col += xstep; + t += dy; + if (t >= 0) + { + row += ystep; + t -= dx; + } + } + } + sbi(P_CS, B_CS); + } + clrXY(); +} + +void UTFT::drawHLine(int x, int y, int l) +{ + if (l<0) + { + l = -l; + x -= l; + } + cbi(P_CS, B_CS); + setXY(x, y, x+l, y); + if (display_transfer_mode == 16) + { + sbi(P_RS, B_RS); + _fast_fill_16(fch,fcl,l); + } + else if ((display_transfer_mode==8) and (fch==fcl)) + { + sbi(P_RS, B_RS); + _fast_fill_8(fch,l); + } + else + { + for (int i=0; i=0; zz--) + { + ch=pgm_read_byte(&cfont.font[temp+zz]); + for(i=0;i<8;i++) + { + if((ch&(1<=0; tx--) + { + col=pgm_read_word(&data[(ty*sx)+tx]); + LCD_Write_DATA(col>>8,col & 0xff); + } + } + sbi(P_CS, B_CS); + } + else + { + cbi(P_CS, B_CS); + for (ty=0; ty=0; tx--) + { + col=pgm_read_word(&data[(ty*sx)+tx]); + for (tsx=0; tsx>8,col & 0xff); + } + } + } + sbi(P_CS, B_CS); + } + clrXY(); +} + +void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy) +{ + unsigned int col; + int tx, ty, newx, newy; + double radian; + radian=deg*0.0175; + + if (deg==0) + drawBitmap(x, y, sx, sy, data); + else + { + cbi(P_CS, B_CS); + for (ty=0; ty>8,col & 0xff); + } + sbi(P_CS, B_CS); + } + clrXY(); +} diff --git a/libraries/MultiLCD/UTFT.h b/libraries/MultiLCD/UTFT.h new file mode 100644 index 0000000..6e0c8cb --- /dev/null +++ b/libraries/MultiLCD/UTFT.h @@ -0,0 +1,275 @@ +/* + UTFT.h - Arduino/chipKit library support for Color TFT LCD Boards + Copyright (C)2010-2014 Henning Karlsen. All right reserved + + This library is the continuation of my ITDB02_Graph, ITDB02_Graph16 + and RGB_GLCD libraries for Arduino and chipKit. As the number of + supported display modules and controllers started to increase I felt + it was time to make a single, universal library as it will be much + easier to maintain in the future. + + Basic functionality of this library was origianlly based on the + demo-code provided by ITead studio (for the ITDB02 modules) and + NKC Electronics (for the RGB GLCD module/shield). + + This library supports a number of 8bit, 16bit and serial graphic + displays, and will work with both Arduino and chipKit boards. For a + full list of tested display modules and controllers, see the + document UTFT_Supported_display_modules_&_controllers.pdf. + + When using 8bit and 16bit display modules there are some + requirements you must adhere to. These requirements can be found + in the document UTFT_Requirements.pdf. + There are no special requirements when using serial displays. + + You can always find the latest version of the library at + http://electronics.henningkarlsen.com/ + + If you make any modifications or improvements to the code, I would + appreciate that you share the code with me so that I might include + it in the next release. I can be contacted through + http://electronics.henningkarlsen.com/contact.php. + + This library is free software; you can redistribute it and/or + modify it under the terms of the CC BY-NC-SA 3.0 license. + Please see the included documents for further information. + + Commercial use of this library requires you to buy a license that + will allow commercial use. This includes using the library, + modified or not, as a tool to sell products. + + The license applies to all part of the library including the + examples and tools supplied with the library. +*/ + +#ifndef UTFT_h +#define UTFT_h + +#define UTFT_VERSION 276 + +#define LEFT 0 +#define RIGHT 9999 +#define CENTER 9998 + +#define PORTRAIT 0 +#define LANDSCAPE 1 + +#define HX8347A 0 +#define ILI9327 1 +#define SSD1289 2 +#define ILI9325C 3 +#define ILI9325D_8 4 +#define ILI9325D_16 5 +#define HX8340B_8 6 +#define HX8340B_S 7 +#define HX8352A 8 +#define ST7735 9 +#define PCF8833 10 +#define S1D19122 11 +#define SSD1963_480 12 +#define SSD1963_800 13 +#define S6D1121_8 14 +#define S6D1121_16 15 +#define SSD1289LATCHED 16 +#define ILI9320_8 17 +#define ILI9320_16 18 +#define SSD1289_8 19 +#define SSD1963_800ALT 20 +#define ILI9481 21 +#define ILI9325D_16ALT 22 +#define S6D0164 23 +#define ST7735S 24 +#define ILI9341_S5P 25 +#define ILI9341_S4P 26 +#define R61581 27 +#define ILI9486 28 +#define CPLD 29 +#define HX8353C 30 + +#define ITDB32 0 // HX8347-A (16bit) +#define ITDB32WC 1 // ILI9327 (16bit) +#define TFT01_32W 1 // ILI9327 (16bit) +#define ITDB32S 2 // SSD1289 (16bit) +#define TFT01_32 2 // SSD1289 (16bit) +#define CTE32 2 // SSD1289 (16bit) +#define GEEE32 2 // SSD1289 (16bit) +#define ITDB24 3 // ILI9325C (8bit) +#define ITDB24D 4 // ILI9325D (8bit) +#define ITDB24DWOT 4 // ILI9325D (8bit) +#define ITDB28 4 // ILI9325D (8bit) +#define TFT01_24_8 4 // ILI9325D (8bit) +#define DMTFT24104 4 // ILI9325D (8bit) +#define DMTFT28103 4 // ILI9325D (8bit) +#define TFT01_24_16 5 // ILI9325D (16bit) +#define ITDB22 6 // HX8340-B (8bit) +#define GEEE22 6 // HX8340-B (8bit) +#define ITDB22SP 7 // HX8340-B (Serial 4Pin) +#define ITDB32WD 8 // HX8352-A (16bit) +#define TFT01_32WD 8 // HX8352-A (16bit) +#define CTE32W 8 // HX8352-A (16bit) +#define ITDB18SP 9 // ST7735 (Serial 5Pin) +#define LPH9135 10 // PCF8833 (Serial 5Pin) +#define ITDB25H 11 // S1D19122 (16bit) +#define ITDB43 12 // SSD1963 (16bit) 480x272 +#define TFT01_43 12 // SSD1963 (16bit) 480x272 +#define ITDB50 13 // SSD1963 (16bit) 800x480 +#define TFT01_50 13 // SSD1963 (16bit) 800x480 +#define CTE50 13 // SSD1963 (16bit) 800x480 +#define EHOUSE50 13 // SSD1963 (16bit) 800x480 +#define ITDB24E_8 14 // S6D1121 (8bit) +#define TFT01_24R2 14 // S6D1121 (8bit) +#define ITDB24E_16 15 // S6D1121 (16bit) +#define INFINIT32 16 // SSD1289 (Latched 16bit) -- Legacy, will be removed later +#define ELEE32_REVA 16 // SSD1289 (Latched 16bit) +#define GEEE24 17 // ILI9320 (8bit) +#define GEEE28 18 // ILI9320 (16bit) +#define ELEE32_REVB 19 // SSD1289 (8bit) +#define TFT01_70 20 // SSD1963 (16bit) 800x480 Alternative Init +#define CTE70 20 // SSD1963 (16bit) 800x480 Alternative Init +#define EHOUSE70 20 // SSD1963 (16bit) 800x480 Alternative Init +#define CTE32HR 21 // ILI9481 (16bit) +#define CTE28 22 // ILI9325D (16bit) Alternative Init +#define TFT01_28 22 // ILI9325D (16bit) Alternative Init +#define CTE22 23 // S6D0164 (8bit) +#define TFT01_22 23 // S6D0164 (8bit) +#define DMTFT22102 23 // S6D0164 (8bit) +#define TFT01_18SP 24 // ST7735S (Serial 5Pin) +#define TFT01_22SP 25 // ILI9341 (Serial 5Pin) +#define DMTFT28105 25 // ILI9341 (Serial 5Pin) +#define MI0283QT9 26 // ILI9341 (Serial 4Pin) +#define CTE35IPS 27 // R61581 (16bit) +#define CTE40 28 // ILI9486 (16bit) +#define EHOUSE50CPLD 29 // CPLD (16bit) +#define CTE50CPLD 29 // CPLD (16bit) +#define CTE70CPLD 29 // CPLD (16bit) +#define DMTFT18101 30 // HX8353C (Serial 5Pin) + + +#define SERIAL_4PIN 4 +#define SERIAL_5PIN 5 +#define LATCHED_16 17 + +#define NOTINUSE 255 + +//********************************* +// COLORS +//********************************* +// VGA color palette +#define VGA_BLACK 0x0000 +#define VGA_WHITE 0xFFFF +#define VGA_RED 0xF800 +#define VGA_GREEN 0x0400 +#define VGA_BLUE 0x001F +#define VGA_SILVER 0xC618 +#define VGA_GRAY 0x8410 +#define VGA_MAROON 0x8000 +#define VGA_YELLOW 0xFFE0 +#define VGA_OLIVE 0x8400 +#define VGA_LIME 0x07E0 +#define VGA_AQUA 0x07FF +#define VGA_TEAL 0x0410 +#define VGA_NAVY 0x0010 +#define VGA_FUCHSIA 0xF81F +#define VGA_PURPLE 0x8010 +#define VGA_TRANSPARENT 0xFFFFFFFF + +#if defined(__AVR__) + #include "Arduino.h" + #include "hardware/avr/HW_AVR_defines.h" +#elif defined(__PIC32MX__) + #include "WProgram.h" + #include "hardware/pic32/HW_PIC32_defines.h" +#elif defined(__arm__) + #include "Arduino.h" + #include "hardware/arm/HW_ARM_defines.h" +#endif + +struct _current_font +{ + uint8_t* font; + uint8_t x_size; + uint8_t y_size; + uint8_t offset; + uint8_t numchars; +}; + +class UTFT : public Print +{ + public: + UTFT(); + UTFT(byte model, int RS, int WR, int CS, int RST, int SER=0); + void InitLCD(); + void clrScr(); + void drawPixel(int x, int y); + void drawLine(int x1, int y1, int x2, int y2); + void fillScr(byte r, byte g, byte b); + void fillScr(word color); + void drawRect(int x1, int y1, int x2, int y2); + void drawRoundRect(int x1, int y1, int x2, int y2); + void fillRect(int x1, int y1, int x2, int y2); + void fillRoundRect(int x1, int y1, int x2, int y2); + void drawCircle(int x, int y, int radius); + void fillCircle(int x, int y, int radius); + void setColor(byte r, byte g, byte b); + void setColor(word color); + word getColor(); + void setBackColor(byte r, byte g, byte b); + void setBackColor(word color); + word getBackColor(); + void setTransparent(bool transparent) + { + _transparent = transparent; + } + void setFont(uint8_t* font); + uint8_t* getFont(); + uint8_t getFontXsize(); + uint8_t getFontYsize(); + void drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int scale=1); + void drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, int deg, int rox, int roy); + virtual void setXY(int x, int y) + { + m_x = x; + m_y = y; + } + virtual size_t write(byte c); + + int m_x; + int m_y; + +/* + The functions and variables below should not normally be used. + They have been left publicly available for use in add-on libraries + that might need access to the lower level functions of UTFT. + + Please note that these functions and variables are not documented + and I do not provide support on how to use them. +*/ + byte fcl, fch, bcl, bch; + word disp_x_size, disp_y_size; + byte display_model, display_transfer_mode, display_serial_mode; + regtype *P_RS, *P_WR, *P_CS, *P_RST, *P_SDA, *P_SCL, *P_ALE; + regsize B_RS, B_WR, B_CS, B_RST, B_SDA, B_SCL, B_ALE; + byte __p1, __p2, __p3, __p4, __p5; + _current_font cfont; + boolean _transparent; + + void LCD_Writ_Bus(char VH,char VL, byte mode); + void LCD_Write_COM(char VL); + void LCD_Write_DATA(char VH,char VL); + void LCD_Write_DATA(char VL); + void LCD_Write_COM_DATA(char com1,int dat1); + void _hw_special_init(); + void setPixel(word color); + void setPixel(char ch, char cl); + void drawHLine(int x, int y, int l); + void drawVLine(int x, int y, int l); + virtual void setXY(word x1, word y1, word x2, word y2); + void clrXY(); + void rotateChar(byte c, int x, int y, int pos, int deg); + void _set_direction_registers(byte mode); + void _fast_fill_16(int ch, int cl, long pix); + void _fast_fill_8(int ch, long pix); + void _convert_float(char *buf, double num, int width, byte prec); +}; + +#endif diff --git a/libraries/MultiLCD/fonts.cpp b/libraries/MultiLCD/fonts.cpp deleted file mode 100644 index 2f33655..0000000 --- a/libraries/MultiLCD/fonts.cpp +++ /dev/null @@ -1,352 +0,0 @@ -#include -#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*/ -{0x84,0x84,0x82,0xFF,0xFF,0x80,0x80,0x00},/*1*/ -{0x84,0xC6,0xE1,0xA1,0xB1,0x9F,0x8E,0x00},/*2*/ -{0x42,0xC3,0x81,0x89,0x89,0xFF,0x76,0x00},/*3*/ -{0x20,0x38,0x24,0x22,0xFF,0xFF,0x20,0x00},/*4*/ -{0x5F,0xDF,0x99,0x89,0x89,0xF9,0x70,0x00},/*5*/ -{0x3C,0x7E,0x89,0x89,0x89,0xFB,0x72,0x00},/*6*/ -{0x01,0x01,0xE1,0xF9,0x1D,0x07,0x01,0x00},/*7*/ -{0x6E,0xFF,0x89,0x89,0x99,0xFF,0x76,0x00},/*8*/ -{0x4E,0xDF,0x91,0x91,0x91,0x7F,0x3E,0x00},/*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 ~ -}; - -// SevenSegNumFont.c -// Font Size : 32x50 -// Memory usage : 2004 bytes -// # characters : 10 - -const PROGMEM unsigned char sevenSegNumFont[]={ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x38,0x00,0x00,0x18,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x00,0x3E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0C,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x00,0x00,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8 -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9 -}; - -#ifndef MEMORY_SAVING -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*/ -}; - -#endif diff --git a/libraries/MultiLCD/fonts.h b/libraries/MultiLCD/fonts.h new file mode 100644 index 0000000..ab83ba3 --- /dev/null +++ b/libraries/MultiLCD/fonts.h @@ -0,0 +1,331 @@ +// The 7-bit ASCII character set... +const unsigned char font5x8[][5] PROGMEM = { + { 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 unsigned char digits16x24[][48] PROGMEM = { +{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 unsigned char digits16x16[][32] PROGMEM = { +{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 unsigned char digits8x8[][8] PROGMEM = { +{0x3C,0x7E,0x83,0x81,0x81,0x7E,0x3C,0x00},/*0*/ +{0x84,0x84,0x82,0xFF,0xFF,0x80,0x80,0x00},/*1*/ +{0x84,0xC6,0xE1,0xA1,0xB1,0x9F,0x8E,0x00},/*2*/ +{0x42,0xC3,0x81,0x89,0x89,0xFF,0x76,0x00},/*3*/ +{0x20,0x38,0x24,0x22,0xFF,0xFF,0x20,0x00},/*4*/ +{0x5F,0xDF,0x99,0x89,0x89,0xF9,0x70,0x00},/*5*/ +{0x3C,0x7E,0x89,0x89,0x89,0xFB,0x72,0x00},/*6*/ +{0x01,0x01,0xE1,0xF9,0x1D,0x07,0x01,0x00},/*7*/ +{0x6E,0xFF,0x89,0x89,0x99,0xFF,0x76,0x00},/*8*/ +{0x4E,0xDF,0x91,0x91,0x91,0x7F,0x3E,0x00},/*9*/ +}; + +#ifndef MEMORY_SAVING +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*/ +}; + +#endif diff --git a/libraries/MultiLCD/memorysaver.h b/libraries/MultiLCD/memorysaver.h new file mode 100644 index 0000000..34575eb --- /dev/null +++ b/libraries/MultiLCD/memorysaver.h @@ -0,0 +1,45 @@ +// UTFT Memory Saver +// ----------------- +// +// Since most people have only one or possibly two different display modules a lot +// of memory has been wasted to keep support for many unneeded controller chips. +// You now have the option to remove this unneeded code from the library with +// this file. +// By disabling the controllers you don't need you can reduce the memory footprint +// of the library by several Kb. +// +// Uncomment the lines for the displaycontrollers that you don't use to save +// some flash memory by not including the init code for that particular +// controller. + +#define DISABLE_CPLD 1 // EHOUSE50CPLD + +#define DISABLE_HX8340B_8 1 // ITDB22 8bit mode / GEEE22 +#define DISABLE_HX8340B_S 1 // ITDB22 Serial mode +#define DISABLE_HX8347A 1 // ITDB32 +#define DISABLE_HX8352A 1 // ITDB32WD / TFT01_32WD / CTE32W +#define DISABLE_HX8353C 1 // DMTFT18101 + +#define DISABLE_ILI9320 1 // GEEE24 / GEEE28 - This single define will disable both 8bit and 16bit mode for this controller +#define DISABLE_ILI9325C 1 // ITDB24 +#define DISABLE_ILI9325D 1 // ITDB24D / ITDB24DWOT / ITDB28 / TFT01_24_8 / TFT01_24_16 / DMTFT24104 / DMTFT28103 - This single define will disable both 8bit and 16bit mode for this controller +#define DISABLE_ILI9325D_ALT 1 // CTE28 +#define DISABLE_ILI9327 1 // ITDB32WC / TFT01_32W +#define DISABLE_ILI9341_S4P 1 // MI0283QT9 +#define DISABLE_ILI9341_S5P 1 // TFT01_22SP / DMTFT28105 +#define DISABLE_ILI9481 1 // CTE32HR +#define DISABLE_ILI9486 1 // CTE40 + +#define DISABLE_PCF8833 1 // LPH9135 + +#define DISABLE_R61581 1 // CTE35IPS + +#define DISABLE_S1D19122 1 // ITDB25H +#define DISABLE_S6D0164 1 // CTE22 / DMTFT22102 +#define DISABLE_S6D1121 1 // ITDB24E - This single define will disable both 8bit and 16bit mode for this controller +#define DISABLE_SSD1289 1 // ITDB32S / TFT01_32 / GEEE32 / ELEE32_REVA / ELEE32_REVB / CTE32 - This single define will disable both 8bit, 16bit and latched mode for this controller +#define DISABLE_SSD1963_480 1 // ITDB43 / TFT01_43 +#define DISABLE_SSD1963_800 1 // ITDB50 / TFT01_50 / CTE50 / EHOUSE50 +#define DISABLE_SSD1963_800_ALT 1 // TFT01_70 / CTE70 / EHOUSE70 +#define DISABLE_ST7735 1 // ITDB18SP +#define DISABLE_ST7735S 1 // TFT01_18SP -- cgit v1.2.3