diff --git a/SSD1306Fonts.h b/SSD1306Fonts.h new file mode 100644 index 0000000000000000000000000000000000000000..23086fd759fe30a068eae58249b561bac67cb825 --- /dev/null +++ b/SSD1306Fonts.h @@ -0,0 +1,602 @@ +const char ArialMT_Plain_10[] PROGMEM = { + 0x0A, // Width: 10 + 0x0D, // Height: 13 + 0x20, // First Char: 32 + 0x5F, // Numbers of Chars: 95 + + // Char Widths: + 0x03, // 32: 3 + 0x03, // 33: 3 + 0x04, // 34: 4 + 0x06, // 35: 6 + 0x06, // 36: 6 + 0x09, // 37: 9 + 0x07, // 38: 7 + 0x02, // 39: 2 + 0x03, // 40: 3 + 0x03, // 41: 3 + 0x04, // 42: 4 + 0x06, // 43: 6 + 0x03, // 44: 3 + 0x03, // 45: 3 + 0x03, // 46: 3 + 0x03, // 47: 3 + 0x06, // 48: 6 + 0x06, // 49: 6 + 0x06, // 50: 6 + 0x06, // 51: 6 + 0x06, // 52: 6 + 0x06, // 53: 6 + 0x06, // 54: 6 + 0x06, // 55: 6 + 0x06, // 56: 6 + 0x06, // 57: 6 + 0x03, // 58: 3 + 0x03, // 59: 3 + 0x06, // 60: 6 + 0x06, // 61: 6 + 0x06, // 62: 6 + 0x06, // 63: 6 + 0x0A, // 64: 10 + 0x07, // 65: 7 + 0x07, // 66: 7 + 0x07, // 67: 7 + 0x07, // 68: 7 + 0x07, // 69: 7 + 0x06, // 70: 6 + 0x08, // 71: 8 + 0x07, // 72: 7 + 0x03, // 73: 3 + 0x05, // 74: 5 + 0x07, // 75: 7 + 0x06, // 76: 6 + 0x08, // 77: 8 + 0x07, // 78: 7 + 0x08, // 79: 8 + 0x07, // 80: 7 + 0x08, // 81: 8 + 0x07, // 82: 7 + 0x07, // 83: 7 + 0x06, // 84: 6 + 0x07, // 85: 7 + 0x07, // 86: 7 + 0x09, // 87: 9 + 0x07, // 88: 7 + 0x07, // 89: 7 + 0x06, // 90: 6 + 0x03, // 91: 3 + 0x03, // 92: 3 + 0x03, // 93: 3 + 0x05, // 94: 5 + 0x06, // 95: 6 + 0x03, // 96: 3 + 0x06, // 97: 6 + 0x06, // 98: 6 + 0x05, // 99: 5 + 0x06, // 100: 6 + 0x06, // 101: 6 + 0x03, // 102: 3 + 0x06, // 103: 6 + 0x06, // 104: 6 + 0x02, // 105: 2 + 0x02, // 106: 2 + 0x05, // 107: 5 + 0x02, // 108: 2 + 0x08, // 109: 8 + 0x06, // 110: 6 + 0x06, // 111: 6 + 0x06, // 112: 6 + 0x06, // 113: 6 + 0x03, // 114: 3 + 0x05, // 115: 5 + 0x03, // 116: 3 + 0x06, // 117: 6 + 0x05, // 118: 5 + 0x07, // 119: 7 + 0x05, // 120: 5 + 0x05, // 121: 5 + 0x05, // 122: 5 + 0x03, // 123: 3 + 0x03, // 124: 3 + 0x03, // 125: 3 + 0x06, // 126: 6 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00, // 32 + 0x00,0x24,0x49,0x10,0x00, // 33 + 0x00,0x50,0x55,0x00,0x00,0x00,0x00, // 34 + 0x00,0x00,0x50,0xD4,0xA7,0x7C,0x45,0x01,0x00,0x00, // 35 + 0x00,0x00,0x38,0xD5,0xC1,0x50,0x95,0x43,0x00,0x00, // 36 + 0x00,0x00,0x00,0x20,0xA2,0x42,0x05,0x15,0x58,0xA8,0x90,0x00,0x00,0x00,0x00, // 37 + 0x00,0x00,0x80,0x23,0x61,0x18,0xD2,0x31,0x37,0x00,0x00,0x00, // 38 + 0x40,0x05,0x00,0x00, // 39 + 0x00,0xA8,0x24,0x89,0x08, // 40 + 0x00,0x22,0x92,0xA4,0x02, // 41 + 0x00,0x70,0x52,0x00,0x00,0x00,0x00, // 42 + 0x00,0x00,0x00,0x04,0xF1,0x11,0x04,0x00,0x00,0x00, // 43 + 0x00,0x00,0x00,0x90,0x00, // 44 + 0x00,0x00,0x60,0x00,0x00, // 45 + 0x00,0x00,0x00,0x10,0x00, // 46 + 0x00,0x48,0x49,0x09,0x00, // 47 + 0x00,0x00,0x38,0x51,0x14,0x45,0x91,0x03,0x00,0x00, // 48 + 0x00,0x00,0x20,0x8C,0x82,0x20,0x08,0x02,0x00,0x00, // 49 + 0x00,0x00,0x38,0x11,0x84,0x10,0xC2,0x07,0x00,0x00, // 50 + 0x00,0x00,0x38,0x11,0xC4,0x40,0x91,0x03,0x00,0x00, // 51 + 0x00,0x00,0x60,0x94,0x14,0xFD,0x10,0x04,0x00,0x00, // 52 + 0x00,0x00,0x78,0xC2,0x13,0x41,0x91,0x03,0x00,0x00, // 53 + 0x00,0x00,0x38,0xD1,0x13,0x45,0x91,0x03,0x00,0x00, // 54 + 0x00,0x00,0x7C,0x08,0x42,0x10,0x82,0x00,0x00,0x00, // 55 + 0x00,0x00,0x38,0x51,0xE4,0x44,0x91,0x03,0x00,0x00, // 56 + 0x00,0x00,0x38,0x51,0x14,0x79,0x91,0x03,0x00,0x00, // 57 + 0x00,0x00,0x01,0x10,0x00, // 58 + 0x00,0x00,0x01,0x90,0x00, // 59 + 0x00,0x00,0x00,0x10,0x23,0x30,0x10,0x00,0x00,0x00, // 60 + 0x00,0x00,0x00,0xC0,0x07,0x7C,0x00,0x00,0x00,0x00, // 61 + 0x00,0x00,0x00,0x02,0x03,0x31,0x02,0x00,0x00,0x00, // 62 + 0x00,0x00,0x78,0x21,0x88,0x21,0x00,0x02,0x00,0x00, // 63 + 0x00,0x00,0x00,0x00,0x3C,0x0C,0xD1,0xAA,0xAC,0x92,0x4A,0xC9,0x43,0x30,0x3E,0x00,0x00, // 64 + 0x00,0x00,0x00,0x41,0xA1,0x88,0x7C,0xA2,0x20,0x00,0x00,0x00, // 65 + 0x00,0x00,0xC0,0x23,0x12,0xF9,0x44,0x22,0x0F,0x00,0x00,0x00, // 66 + 0x00,0x00,0x80,0x23,0x12,0x08,0x04,0x22,0x0E,0x00,0x00,0x00, // 67 + 0x00,0x00,0xC0,0x21,0x11,0x89,0x44,0x12,0x07,0x00,0x00,0x00, // 68 + 0x00,0x00,0xC0,0x27,0x10,0xF8,0x04,0x02,0x1F,0x00,0x00,0x00, // 69 + 0x00,0x00,0x78,0x82,0xE0,0x08,0x82,0x00,0x00,0x00, // 70 + 0x00,0x00,0x00,0x18,0x24,0x02,0x72,0x42,0x24,0x18,0x00,0x00,0x00,0x00, // 71 + 0x00,0x00,0x40,0x24,0x12,0xF9,0x44,0x22,0x11,0x00,0x00,0x00, // 72 + 0x00,0x24,0x49,0x12,0x00, // 73 + 0x00,0x00,0x84,0x10,0x42,0xE9,0x00,0x00,0x00, // 74 + 0x00,0x00,0x40,0x24,0x51,0x28,0x2C,0x22,0x21,0x00,0x00,0x00, // 75 + 0x00,0x00,0x08,0x82,0x20,0x08,0x82,0x0F,0x00,0x00, // 76 + 0x00,0x00,0x00,0x82,0xC6,0xC6,0xAA,0xAA,0xAA,0x92,0x00,0x00,0x00,0x00, // 77 + 0x00,0x00,0x40,0x64,0x32,0xA9,0x64,0x32,0x11,0x00,0x00,0x00, // 78 + 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00,0x00, // 79 + 0x00,0x00,0xC0,0x23,0x12,0x79,0x04,0x02,0x01,0x00,0x00,0x00, // 80 + 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x32,0x7C,0x00,0x00,0x00,0x00, // 81 + 0x00,0x00,0xC0,0x23,0x12,0x79,0x24,0x22,0x11,0x00,0x00,0x00, // 82 + 0x00,0x00,0x80,0x23,0x12,0x70,0x40,0x22,0x0E,0x00,0x00,0x00, // 83 + 0x00,0x00,0xF8,0x08,0x82,0x20,0x08,0x02,0x00,0x00, // 84 + 0x00,0x00,0x40,0x24,0x12,0x89,0x44,0x22,0x0E,0x00,0x00,0x00, // 85 + 0x00,0x00,0x20,0x28,0x12,0x89,0x28,0x14,0x04,0x00,0x00,0x00, // 86 + 0x00,0x00,0x00,0x88,0x98,0x52,0x95,0x2A,0x55,0xAA,0x88,0x00,0x00,0x00,0x00, // 87 + 0x00,0x00,0x40,0x44,0x41,0x20,0x28,0xA2,0x20,0x00,0x00,0x00, // 88 + 0x00,0x00,0x20,0x28,0xA2,0x20,0x10,0x08,0x04,0x00,0x00,0x00, // 89 + 0x00,0x00,0xFC,0x30,0xC6,0x18,0xC1,0x0F,0x00,0x00, // 90 + 0x00,0x2C,0x49,0x92,0x0C, // 91 + 0x00,0x12,0x49,0x24,0x00, // 92 + 0x00,0x26,0x49,0x92,0x06, // 93 + 0x00,0x00,0xA2,0x54,0x04,0x00,0x00,0x00,0x00, // 94 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00, // 95 + 0x00,0x22,0x00,0x00,0x00, // 96 + 0x00,0x00,0x00,0x00,0x07,0x71,0x92,0x07,0x00,0x00, // 97 + 0x00,0x00,0x08,0x82,0x23,0x49,0x92,0x03,0x00,0x00, // 98 + 0x00,0x00,0x00,0x98,0x14,0x92,0x01,0x00,0x00, // 99 + 0x00,0x00,0x40,0x10,0x27,0x49,0x12,0x07,0x00,0x00, // 100 + 0x00,0x00,0x00,0x00,0x23,0x79,0x02,0x07,0x00,0x00, // 101 + 0x00,0xA8,0x4B,0x12,0x00, // 102 + 0x00,0x00,0x00,0x00,0x27,0x49,0x12,0x27,0x31,0x00, // 103 + 0x00,0x00,0x08,0x82,0x23,0x49,0x92,0x04,0x00,0x00, // 104 + 0x80,0xA8,0x0A,0x00, // 105 + 0x80,0xA8,0x6A,0x00, // 106 + 0x00,0x80,0x10,0x52,0x39,0x25,0x01,0x00,0x00, // 107 + 0x80,0xAA,0x0A,0x00, // 108 + 0x00,0x00,0x00,0x00,0x00,0x7E,0x92,0x92,0x92,0x92,0x00,0x00,0x00,0x00, // 109 + 0x00,0x00,0x00,0x80,0x23,0x49,0x92,0x04,0x00,0x00, // 110 + 0x00,0x00,0x00,0x00,0x23,0x49,0x12,0x03,0x00,0x00, // 111 + 0x00,0x00,0x00,0x80,0x23,0x49,0x92,0x23,0x08,0x00, // 112 + 0x00,0x00,0x00,0x00,0x27,0x49,0x12,0x07,0x41,0x00, // 113 + 0x00,0x00,0x4B,0x12,0x00, // 114 + 0x00,0x00,0x00,0x5C,0x30,0xE8,0x00,0x00,0x00, // 115 + 0x00,0xA4,0x4B,0x32,0x00, // 116 + 0x00,0x00,0x00,0x80,0x24,0x49,0x12,0x07,0x00,0x00, // 117 + 0x00,0x00,0x00,0xA2,0x52,0x8A,0x00,0x00,0x00, // 118 + 0x00,0x00,0x00,0x00,0x48,0x56,0xAB,0x55,0x11,0x00,0x00,0x00, // 119 + 0x00,0x00,0x00,0xA2,0x22,0x2A,0x02,0x00,0x00, // 120 + 0x00,0x00,0x00,0xA2,0x52,0x8A,0x10,0x01,0x00, // 121 + 0x00,0x00,0x00,0x3E,0x22,0xE2,0x03,0x00,0x00, // 122 + 0x00,0x2C,0x29,0x92,0x0C, // 123 + 0x00,0x24,0x49,0x92,0x04, // 124 + 0x00,0x26,0x89,0x92,0x06, // 125 + 0x00,0x00,0x00,0x00,0x70,0x75,0x00,0x00,0x00,0x00 // 126 +}; + +const char ArialMT_Plain_16[] PROGMEM = { + 0x10, // Width: 16 + 0x13, // Height: 19 + 0x20, // First Char: 32 + 0x5F, // Numbers of Chars: 95 + + // Char Widths: + 0x04, // 32: 4 + 0x04, // 33: 4 + 0x06, // 34: 6 + 0x09, // 35: 9 + 0x09, // 36: 9 + 0x0E, // 37: 14 + 0x0B, // 38: 11 + 0x03, // 39: 3 + 0x05, // 40: 5 + 0x05, // 41: 5 + 0x06, // 42: 6 + 0x09, // 43: 9 + 0x04, // 44: 4 + 0x05, // 45: 5 + 0x04, // 46: 4 + 0x04, // 47: 4 + 0x09, // 48: 9 + 0x09, // 49: 9 + 0x09, // 50: 9 + 0x09, // 51: 9 + 0x09, // 52: 9 + 0x09, // 53: 9 + 0x09, // 54: 9 + 0x09, // 55: 9 + 0x09, // 56: 9 + 0x09, // 57: 9 + 0x04, // 58: 4 + 0x04, // 59: 4 + 0x09, // 60: 9 + 0x09, // 61: 9 + 0x09, // 62: 9 + 0x09, // 63: 9 + 0x10, // 64: 16 + 0x0B, // 65: 11 + 0x0B, // 66: 11 + 0x0C, // 67: 12 + 0x0C, // 68: 12 + 0x0B, // 69: 11 + 0x0A, // 70: 10 + 0x0C, // 71: 12 + 0x0C, // 72: 12 + 0x04, // 73: 4 + 0x08, // 74: 8 + 0x0B, // 75: 11 + 0x09, // 76: 9 + 0x0D, // 77: 13 + 0x0C, // 78: 12 + 0x0C, // 79: 12 + 0x0B, // 80: 11 + 0x0C, // 81: 12 + 0x0C, // 82: 12 + 0x0B, // 83: 11 + 0x0A, // 84: 10 + 0x0C, // 85: 12 + 0x0B, // 86: 11 + 0x0F, // 87: 15 + 0x0B, // 88: 11 + 0x0B, // 89: 11 + 0x0A, // 90: 10 + 0x04, // 91: 4 + 0x04, // 92: 4 + 0x04, // 93: 4 + 0x08, // 94: 8 + 0x09, // 95: 9 + 0x05, // 96: 5 + 0x09, // 97: 9 + 0x09, // 98: 9 + 0x08, // 99: 8 + 0x09, // 100: 9 + 0x09, // 101: 9 + 0x04, // 102: 4 + 0x09, // 103: 9 + 0x09, // 104: 9 + 0x04, // 105: 4 + 0x04, // 106: 4 + 0x08, // 107: 8 + 0x04, // 108: 4 + 0x0D, // 109: 13 + 0x09, // 110: 9 + 0x09, // 111: 9 + 0x09, // 112: 9 + 0x09, // 113: 9 + 0x05, // 114: 5 + 0x08, // 115: 8 + 0x04, // 116: 4 + 0x09, // 117: 9 + 0x08, // 118: 8 + 0x0C, // 119: 12 + 0x08, // 120: 8 + 0x08, // 121: 8 + 0x08, // 122: 8 + 0x05, // 123: 5 + 0x04, // 124: 4 + 0x05, // 125: 5 + 0x09, // 126: 9 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 32 + 0x00,0x40,0x44,0x44,0x44,0x44,0x04,0x04,0x00,0x00, // 33 + 0x00,0x00,0x48,0x92,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 34 + 0x00,0x00,0x00,0x40,0x84,0x08,0x11,0x91,0xFF,0x44,0x88,0x10,0xF9,0x2F,0x42,0x84,0x08,0x00,0x00,0x00,0x00,0x00, // 35 + 0x00,0x00,0x40,0xC0,0x41,0x45,0x92,0x04,0x09,0x1C,0xE0,0x40,0x82,0x24,0x89,0x0A,0x0E,0x08,0x00,0x00,0x00,0x00, // 36 + 0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x22,0x81,0x48,0x20,0x0A,0x88,0x02,0x9C,0x00,0x90,0x03,0x14,0x81,0x44,0x20,0x11,0x44,0x04,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 37 + 0x00,0x00,0x00,0x00,0x70,0x40,0x04,0x22,0x10,0x01,0x05,0x18,0xA0,0x80,0x88,0x84,0x22,0x08,0xA2,0xE0,0x08,0x00,0x00,0x00,0x00,0x00,0x00, // 38 + 0x00,0x24,0x09,0x00,0x00,0x00,0x00,0x00, // 39 + 0x00,0x00,0x44,0x08,0x11,0x42,0x08,0x21,0x04,0x21,0x04,0x01, // 40 + 0x00,0x00,0x41,0x08,0x41,0x08,0x21,0x84,0x10,0x21,0x44,0x00, // 41 + 0x00,0x00,0x10,0x1F,0xA1,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0xFC,0x41,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x04,0x00, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00, // 46 + 0x00,0x80,0x48,0x44,0x24,0x22,0x12,0x01,0x00,0x00, // 47 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x90,0x20,0x41,0x82,0x04,0x09,0x12,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 48 + 0x00,0x00,0x00,0x00,0x01,0x03,0x05,0x09,0x10,0x20,0x40,0x80,0x00,0x01,0x02,0x04,0x08,0x00,0x00,0x00,0x00,0x00, // 49 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x10,0x20,0x40,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, // 50 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x08,0x10,0x30,0x38,0x80,0x00,0x02,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 51 + 0x00,0x00,0x00,0x00,0x02,0x06,0x0A,0x12,0x24,0x44,0x84,0x04,0xF9,0x07,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00, // 52 + 0x00,0x00,0x00,0xE0,0x47,0x80,0x80,0x00,0x1F,0x42,0x00,0x01,0x02,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 53 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x90,0x00,0x1D,0x46,0x04,0x09,0x12,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 54 + 0x00,0x00,0x00,0xF0,0x07,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00, // 55 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x90,0x20,0x22,0x38,0x88,0x08,0x12,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 56 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x90,0x20,0x41,0x82,0x88,0xE1,0x02,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 57 + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00, // 58 + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x22,0x02,0x00, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x38,0x0C,0x04,0x30,0x80,0x03,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 61 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x0E,0x60,0x00,0x81,0xE1,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 62 + 0x00,0x00,0x00,0xC0,0x41,0x44,0x90,0x20,0x40,0x40,0x40,0x40,0x80,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x30,0x30,0x08,0x40,0x84,0x4B,0x44,0x8C,0x22,0x88,0x12,0x88,0x12,0x84,0x12,0x84,0x12,0x44,0x22,0x26,0xC4,0x1D,0x08,0x80,0x30,0x60,0xC0,0x1F,0x00,0x00,0x00, // 64 + 0x00,0x00,0x00,0x00,0x40,0x00,0x05,0x28,0x40,0x01,0x11,0x88,0x40,0x04,0x7F,0x08,0x42,0x10,0x01,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00, // 65 + 0x00,0x00,0x00,0x00,0xFC,0x21,0x10,0x01,0x09,0x48,0x20,0xFE,0x10,0x88,0x80,0x04,0x24,0x20,0x81,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x00, // 66 + 0x00,0x00,0x00,0x00,0x00,0x1F,0x08,0x42,0x40,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x04,0x84,0x20,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 67 + 0x00,0x00,0x00,0x00,0xE0,0x0F,0x02,0x21,0x20,0x02,0x24,0x40,0x02,0x24,0x40,0x02,0x24,0x40,0x02,0x22,0x10,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 68 + 0x00,0x00,0x00,0x00,0xFC,0x27,0x00,0x01,0x08,0x40,0x00,0xFE,0x11,0x80,0x00,0x04,0x20,0x00,0x01,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00, // 69 + 0x00,0x00,0x00,0x80,0x7F,0x02,0x08,0x20,0x80,0x00,0x02,0xF8,0x23,0x80,0x00,0x02,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, // 70 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x08,0x41,0x20,0x02,0x20,0x00,0x02,0x20,0x7C,0x02,0x24,0x40,0x04,0x82,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 71 + 0x00,0x00,0x00,0x00,0x20,0x20,0x02,0x22,0x20,0x02,0x22,0x20,0xFE,0x23,0x20,0x02,0x22,0x20,0x02,0x22,0x20,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // 72 + 0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x02,0x00,0x00, // 73 + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0x42,0x42,0x3C,0x00,0x00,0x00,0x00,0x00, // 74 + 0x00,0x00,0x00,0x00,0x04,0x24,0x10,0x41,0x08,0x41,0x04,0x32,0x50,0x81,0x11,0x04,0x21,0x08,0x81,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00, // 75 + 0x00,0x00,0x00,0x10,0x20,0x40,0x80,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, // 76 + 0x00,0x00,0x00,0x00,0x00,0x01,0x64,0xC0,0x0C,0x98,0x82,0x52,0x50,0x12,0x49,0x22,0x89,0x22,0x51,0x24,0x8A,0x84,0x90,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // 77 + 0x00,0x00,0x00,0x00,0x20,0x20,0x06,0xA2,0x20,0x0A,0x22,0x21,0x22,0x22,0x22,0x42,0x22,0x28,0x82,0x22,0x30,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // 78 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x08,0x41,0x20,0x02,0x24,0x40,0x02,0x24,0x40,0x02,0x24,0x40,0x04,0x82,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 79 + 0x00,0x00,0x00,0x00,0xFC,0x21,0x10,0x01,0x09,0x48,0x40,0x02,0xF1,0x87,0x00,0x04,0x20,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 80 + 0x00,0x00,0x00,0x00,0x00,0x0F,0x08,0x41,0x20,0x02,0x24,0x40,0x02,0x24,0x40,0x02,0x24,0x40,0xC4,0x82,0x30,0xF0,0x06,0x00,0x00,0x00,0x00,0x00,0x00, // 81 + 0x00,0x00,0x00,0x00,0xE0,0x0F,0x02,0x21,0x20,0x02,0x22,0x20,0x02,0xE1,0x0F,0x42,0x20,0x08,0x82,0x20,0x10,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // 82 + 0x00,0x00,0x00,0x00,0xF0,0x41,0x10,0x01,0x09,0x80,0x00,0x38,0x00,0x0E,0x80,0x00,0x24,0x20,0x82,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00, // 83 + 0x00,0x00,0x00,0xC0,0x7F,0x10,0x40,0x00,0x01,0x04,0x10,0x40,0x00,0x01,0x04,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00, // 84 + 0x00,0x00,0x00,0x00,0x20,0x20,0x02,0x22,0x20,0x02,0x22,0x20,0x02,0x22,0x20,0x02,0x22,0x20,0x02,0x42,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 85 + 0x00,0x00,0x00,0x00,0x04,0x24,0x20,0x82,0x10,0x84,0x20,0x88,0x40,0x04,0x22,0xA0,0x00,0x05,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 86 + 0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x18,0x14,0x14,0x0A,0x09,0x85,0x44,0x44,0x22,0x22,0x12,0x09,0x05,0x85,0x82,0x42,0x41,0x41,0x40,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 87 + 0x00,0x00,0x00,0x00,0x04,0x44,0x10,0x44,0x20,0x02,0x0A,0x20,0x80,0x02,0x22,0x10,0x41,0x10,0x01,0x05,0x10,0x00,0x00,0x00,0x00,0x00,0x00, // 88 + 0x00,0x00,0x00,0x00,0x02,0x22,0x08,0x41,0x10,0x01,0x05,0x28,0x80,0x00,0x04,0x20,0x00,0x01,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 89 + 0x00,0x00,0x00,0x80,0x7F,0x80,0x00,0x01,0x04,0x08,0x10,0x40,0x80,0x00,0x01,0x04,0x08,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00, // 90 + 0x00,0xE0,0x22,0x22,0x22,0x22,0x22,0x22,0xE2,0x00, // 91 + 0x00,0x10,0x21,0x22,0x42,0x44,0x84,0x08,0x00,0x00, // 92 + 0x00,0x70,0x44,0x44,0x44,0x44,0x44,0x44,0x74,0x00, // 93 + 0x00,0x00,0x00,0x08,0x14,0x14,0x22,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 94 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00, // 95 + 0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x42,0x82,0xC0,0x71,0x12,0x24,0x48,0x18,0x2F,0x00,0x00,0x00,0x00,0x00, // 97 + 0x00,0x00,0x00,0x10,0x20,0x40,0x80,0x0E,0x23,0x82,0x04,0x09,0x12,0x24,0xC8,0x88,0x0E,0x00,0x00,0x00,0x00,0x00, // 98 + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x02,0x02,0x44,0x38,0x00,0x00,0x00,0x00,0x00, // 99 + 0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x2E,0x62,0x82,0x04,0x09,0x12,0x24,0x88,0x18,0x2E,0x00,0x00,0x00,0x00,0x00, // 100 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x22,0x82,0x04,0xF9,0x13,0x20,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 101 + 0x00,0xC0,0x22,0x2F,0x22,0x22,0x22,0x02,0x00,0x00, // 102 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x62,0x82,0x04,0x09,0x12,0x24,0x88,0x18,0x2E,0x40,0x42,0x78,0x00,0x00, // 103 + 0x00,0x00,0x00,0x10,0x20,0x40,0x80,0x0E,0x23,0x42,0x84,0x08,0x11,0x22,0x44,0x88,0x10,0x00,0x00,0x00,0x00,0x00, // 104 + 0x00,0x20,0x00,0x22,0x22,0x22,0x22,0x02,0x00,0x00, // 105 + 0x00,0x20,0x00,0x22,0x22,0x22,0x22,0x22,0x12,0x00, // 106 + 0x00,0x00,0x00,0x02,0x02,0x02,0x82,0x42,0x22,0x12,0x1A,0x26,0x22,0x42,0x82,0x00,0x00,0x00,0x00,0x00, // 107 + 0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x02,0x00,0x00, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xCE,0x31,0x46,0x42,0x48,0x08,0x09,0x21,0x21,0x24,0x84,0x84,0x90,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0E,0x23,0x42,0x84,0x08,0x11,0x22,0x44,0x88,0x10,0x00,0x00,0x00,0x00,0x00, // 110 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x22,0x82,0x04,0x09,0x12,0x24,0x88,0x08,0x0E,0x00,0x00,0x00,0x00,0x00, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0E,0x23,0x82,0x04,0x09,0x12,0x24,0xC8,0x88,0x0E,0x01,0x02,0x04,0x00,0x00, // 112 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x62,0x82,0x04,0x09,0x12,0x24,0x88,0x18,0x2E,0x40,0x80,0x00,0x01,0x00, // 113 + 0x00,0x00,0x00,0x80,0x36,0x42,0x08,0x21,0x84,0x00,0x00,0x00, // 114 + 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x3C,0x40,0x40,0x42,0x3C,0x00,0x00,0x00,0x00,0x00, // 115 + 0x00,0x00,0x22,0x2F,0x22,0x22,0x22,0x0E,0x00,0x00, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x10,0x21,0x42,0x84,0x08,0x11,0x22,0x44,0x0C,0x17,0x00,0x00,0x00,0x00,0x00, // 117 + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x22,0x22,0x14,0x14,0x14,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // 118 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x14,0x42,0x52,0x22,0x25,0x8A,0xA2,0x28,0x8A,0x42,0x10,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 119 + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x14,0x14,0x08,0x14,0x14,0x22,0x41,0x00,0x00,0x00,0x00,0x00, // 120 + 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x21,0x22,0x22,0x14,0x14,0x1C,0x08,0x08,0x08,0x06,0x00,0x00, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x10,0x10,0x08,0x04,0x04,0x02,0x7F,0x00,0x00,0x00,0x00,0x00, // 122 + 0x00,0x00,0x4C,0x08,0x21,0x84,0x0C,0x42,0x08,0x21,0x04,0x03, // 123 + 0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00, // 124 + 0x00,0x80,0x41,0x08,0x21,0x84,0x60,0x42,0x08,0x21,0x64,0x00, // 125 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8E,0xE2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // 126 +}; +const char ArialMT_Plain_24[] PROGMEM = { + 0x18, // Width: 24 + 0x1C, // Height: 28 + 0x20, // First Char: 32 + 0x5F, // Numbers of Chars: 95 + + // Char Widths: + 0x07, // 32: 7 + 0x07, // 33: 7 + 0x09, // 34: 9 + 0x0D, // 35: 13 + 0x0D, // 36: 13 + 0x15, // 37: 21 + 0x10, // 38: 16 + 0x05, // 39: 5 + 0x08, // 40: 8 + 0x08, // 41: 8 + 0x09, // 42: 9 + 0x0E, // 43: 14 + 0x07, // 44: 7 + 0x08, // 45: 8 + 0x07, // 46: 7 + 0x07, // 47: 7 + 0x0D, // 48: 13 + 0x0D, // 49: 13 + 0x0D, // 50: 13 + 0x0D, // 51: 13 + 0x0D, // 52: 13 + 0x0D, // 53: 13 + 0x0D, // 54: 13 + 0x0D, // 55: 13 + 0x0D, // 56: 13 + 0x0D, // 57: 13 + 0x07, // 58: 7 + 0x07, // 59: 7 + 0x0E, // 60: 14 + 0x0E, // 61: 14 + 0x0E, // 62: 14 + 0x0D, // 63: 13 + 0x18, // 64: 24 + 0x10, // 65: 16 + 0x10, // 66: 16 + 0x11, // 67: 17 + 0x11, // 68: 17 + 0x10, // 69: 16 + 0x0F, // 70: 15 + 0x13, // 71: 19 + 0x11, // 72: 17 + 0x07, // 73: 7 + 0x0C, // 74: 12 + 0x10, // 75: 16 + 0x0D, // 76: 13 + 0x14, // 77: 20 + 0x11, // 78: 17 + 0x13, // 79: 19 + 0x10, // 80: 16 + 0x13, // 81: 19 + 0x11, // 82: 17 + 0x10, // 83: 16 + 0x0F, // 84: 15 + 0x11, // 85: 17 + 0x10, // 86: 16 + 0x17, // 87: 23 + 0x10, // 88: 16 + 0x10, // 89: 16 + 0x0F, // 90: 15 + 0x07, // 91: 7 + 0x07, // 92: 7 + 0x07, // 93: 7 + 0x0B, // 94: 11 + 0x0D, // 95: 13 + 0x08, // 96: 8 + 0x0D, // 97: 13 + 0x0D, // 98: 13 + 0x0C, // 99: 12 + 0x0D, // 100: 13 + 0x0D, // 101: 13 + 0x07, // 102: 7 + 0x0D, // 103: 13 + 0x0D, // 104: 13 + 0x05, // 105: 5 + 0x05, // 106: 5 + 0x0C, // 107: 12 + 0x05, // 108: 5 + 0x14, // 109: 20 + 0x0D, // 110: 13 + 0x0D, // 111: 13 + 0x0D, // 112: 13 + 0x0D, // 113: 13 + 0x08, // 114: 8 + 0x0C, // 115: 12 + 0x07, // 116: 7 + 0x0D, // 117: 13 + 0x0C, // 118: 12 + 0x11, // 119: 17 + 0x0C, // 120: 12 + 0x0C, // 121: 12 + 0x0C, // 122: 12 + 0x08, // 123: 8 + 0x06, // 124: 6 + 0x08, // 125: 8 + 0x0E, // 126: 14 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 32 + 0x00,0x00,0x00,0x00,0xC0,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x30,0x18,0x0C,0x00,0x80,0xC1,0x00,0x00,0x00,0x00,0x00,0x00, // 33 + 0x00,0x00,0x00,0x00,0x00,0xC0,0x8C,0x19,0x33,0x66,0xCC,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 34 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x18,0x18,0x83,0x31,0x30,0x06,0xC6,0xFC,0xFF,0xFF,0x8F,0x31,0x30,0x06,0xC6,0xC0,0x18,0xFF,0xFF,0xFF,0x33,0x06,0xC6,0x60,0x0C,0x8C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 35 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xE0,0x03,0xFF,0x71,0x32,0x46,0xCC,0x08,0x18,0x01,0x2E,0x80,0x0F,0xC0,0x07,0xD0,0x01,0x62,0x40,0xCC,0x88,0x39,0x31,0xAE,0xC3,0x7F,0xE0,0x03,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 36 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x80,0x01,0x33,0x18,0x30,0x0C,0x03,0x86,0x31,0xC0,0x30,0x06,0x18,0x66,0x00,0xC3,0x0C,0xC0,0xCC,0x00,0xF0,0x98,0x07,0x80,0x99,0x01,0xB8,0x61,0x00,0x33,0x0C,0x70,0x86,0x01,0xC6,0x30,0xE0,0x18,0x06,0x0C,0x66,0xC0,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 37 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0xF0,0x03,0x38,0x07,0x18,0x06,0x18,0x06,0x30,0x03,0xE0,0x03,0xF0,0x00,0xF8,0x01,0x9C,0x31,0x0E,0x33,0x06,0x1E,0x06,0x1E,0x0E,0x1C,0x1C,0x3F,0xF8,0x77,0xF0,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 38 + 0x00,0x00,0x00,0x8C,0x31,0xC6,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 39 + 0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x60,0x00,0x00, // 40 + 0x00,0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x18,0x30,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x0C,0x06,0x00,0x00, // 41 + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0C,0xFF,0x78,0xF0,0x30,0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 42 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0xC0,0x80,0xFF,0xE7,0xFF,0x01,0x03,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x20,0x10,0x0C,0x02,0x00,0x00, // 44 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 46 + 0x00,0x00,0x00,0x00,0x00,0x83,0x61,0x30,0x18,0x06,0x83,0xE1,0x30,0x18,0x0C,0x83,0xC1,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00, // 47 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xFE,0xE0,0x38,0x0C,0xC6,0x80,0x19,0x30,0x03,0x66,0xC0,0x0C,0x98,0x01,0x33,0x60,0x06,0xCC,0x80,0x31,0x18,0x8E,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x60,0x00,0x0E,0xF0,0x01,0x37,0x60,0x06,0xC0,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x80,0x01,0x30,0x00,0x06,0xC0,0x00,0x18,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 49 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xFF,0x61,0x30,0x06,0xCC,0x80,0x01,0x30,0x00,0x06,0x60,0x00,0x06,0x60,0x00,0x06,0x60,0x00,0x06,0x60,0x00,0x06,0xE0,0xFF,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 50 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0xFF,0x60,0x38,0x06,0x06,0xC0,0x00,0x18,0x80,0x01,0x1E,0xC0,0x07,0x80,0x01,0x60,0x00,0xCC,0x80,0x39,0x30,0x06,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 51 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xE0,0x00,0x1E,0xC0,0x03,0x6C,0xC0,0x0D,0x98,0x81,0x31,0x30,0x06,0xC3,0x70,0x18,0xFE,0xCF,0xFF,0x01,0x0C,0x80,0x01,0x30,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 52 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0xFE,0x61,0x00,0x0C,0x80,0x01,0xB0,0x07,0xFE,0xE1,0x60,0x0C,0x18,0x00,0x03,0x60,0x00,0xCC,0x80,0x19,0x18,0x06,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 53 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0xFE,0xE1,0x70,0x0C,0x8C,0x01,0x18,0x00,0xF3,0x60,0x7F,0x3C,0x8C,0x03,0x33,0x60,0x06,0xCC,0x80,0x31,0x30,0x0E,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 54 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x9F,0xFF,0x03,0x20,0x00,0x06,0x60,0x00,0x04,0xC0,0x00,0x08,0x80,0x01,0x30,0x00,0x03,0x60,0x00,0x0C,0xC0,0x00,0x18,0x00,0x03,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 55 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xFE,0xE0,0x38,0x0C,0x86,0xC1,0x30,0x18,0x8C,0x01,0x1F,0xF0,0x07,0x83,0x31,0x60,0x06,0xCC,0x80,0x19,0x30,0x06,0xC3,0x7F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 56 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xFE,0x60,0x30,0x0E,0xC6,0x80,0x19,0x30,0x03,0x66,0xE0,0x18,0x1E,0x7F,0x83,0x67,0x00,0x0C,0xC0,0x18,0x18,0x87,0xC3,0x3F,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x20,0x10,0x0C,0x02,0x00,0x00, // 59 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x03,0x7C,0xC0,0x03,0x3C,0x80,0x01,0xC0,0x03,0xC0,0x03,0xC0,0x07,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 60 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xFE,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 61 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x03,0xC0,0x07,0x80,0x07,0x80,0x07,0x00,0x03,0x78,0x80,0x07,0x7C,0x80,0x03,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xFE,0xE1,0x30,0x0E,0xCC,0x80,0x01,0x30,0x00,0x03,0x70,0x00,0x07,0x30,0x00,0x07,0x60,0x00,0x0C,0x00,0x00,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 63 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0xC0,0xFF,0x03,0xE0,0x81,0x07,0x70,0x00,0x0E,0x38,0x9E,0x1D,0x18,0xBF,0x19,0x8C,0xE3,0x31,0xCC,0xC0,0x30,0xC6,0xC0,0x30,0x66,0xC0,0x30,0x66,0xC0,0x30,0x66,0xC0,0x38,0x66,0x60,0x18,0x66,0x70,0x1C,0xC6,0x78,0x0E,0xCC,0xEF,0x07,0x0C,0xC7,0x01,0x18,0x00,0x60,0x78,0x00,0x38,0xF0,0x01,0x1E,0xC0,0xFF,0x07,0x00,0xFE,0x01,0x00,0x00,0x00,0x00, // 64 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0x60,0x03,0x60,0x03,0x70,0x07,0x30,0x06,0x30,0x06,0x18,0x0C,0x18,0x0C,0x18,0x0C,0xFC,0x1F,0xFC,0x1F,0x0E,0x38,0x06,0x30,0x06,0x30,0x03,0x60,0x03,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x1F,0x0C,0x38,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0xFC,0x1F,0xFC,0x1F,0x0C,0x38,0x0C,0x70,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x30,0xFC,0x3F,0xFC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 66 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xFC,0x0F,0x1C,0x38,0x1C,0x60,0x18,0x80,0x39,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x0E,0xC0,0x18,0x80,0x71,0x80,0xC1,0x81,0x03,0xFF,0x03,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x01,0xFF,0x07,0x06,0x1C,0x0C,0x70,0x18,0xC0,0x30,0x00,0x63,0x00,0xC6,0x00,0x8C,0x01,0x18,0x03,0x30,0x06,0x60,0x0C,0xC0,0x18,0xC0,0x30,0xC0,0x61,0xC0,0xC1,0xFF,0x81,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7F,0xFC,0x7F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xFC,0x3F,0xFC,0x3F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0xFC,0x7F,0xFC,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xF1,0xFF,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0xFF,0xE1,0xFF,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 70 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xC0,0xFF,0x01,0x0F,0x1E,0x1C,0xC0,0x60,0x00,0x8C,0x03,0x00,0x0C,0x00,0x60,0x00,0x00,0x03,0xFE,0x18,0xF0,0xC7,0x00,0x30,0x0E,0x80,0x61,0x00,0x0C,0x07,0x60,0xF0,0xE0,0x03,0xFF,0x07,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x0C,0x03,0x18,0x06,0x30,0x0C,0x60,0x18,0xC0,0x30,0x80,0x61,0x00,0xC3,0xFF,0x87,0xFF,0x0F,0x03,0x18,0x06,0x30,0x0C,0x60,0x18,0xC0,0x30,0x80,0x61,0x00,0xC3,0x00,0x86,0x01,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 72 + 0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 73 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x03,0x30,0x00,0x03,0x30,0x00,0x03,0x30,0x00,0x03,0x30,0x00,0x03,0x30,0x00,0x63,0x30,0x06,0xE3,0x38,0xFC,0x81,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x70,0x0C,0x38,0x0C,0x1C,0x0C,0x0E,0x0C,0x07,0x8C,0x03,0xCC,0x01,0xEC,0x01,0xFC,0x03,0xBC,0x03,0x1C,0x07,0x0C,0x0E,0x0C,0x1C,0x0C,0x1C,0x0C,0x38,0x0C,0x70,0x0C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x80,0x01,0x30,0x00,0x06,0xC0,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x80,0x01,0x30,0x00,0x06,0xC0,0xFF,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x1C,0x3C,0xE0,0xC1,0x03,0x1E,0x3C,0xE0,0xC1,0x06,0x1B,0x6C,0xB0,0xC1,0x06,0x1B,0x4C,0x90,0xC1,0x8C,0x19,0xCC,0x98,0xC1,0x8C,0x19,0x8C,0x8D,0xC1,0xD8,0x18,0x8C,0x8D,0xC1,0x50,0x18,0x0C,0x87,0xC1,0x70,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x0C,0x07,0x18,0x1E,0x30,0x3C,0x60,0xD8,0xC0,0x30,0x83,0x61,0x06,0xC3,0x18,0x86,0x71,0x0C,0xC3,0x18,0x06,0x33,0x0C,0x6E,0x18,0xD8,0x30,0xE0,0x61,0xC0,0xC3,0x00,0x87,0x01,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 78 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xC0,0xFF,0x01,0x0F,0x1E,0x1C,0xC0,0x61,0x00,0x8C,0x03,0xE0,0x0C,0x00,0x66,0x00,0x30,0x03,0x80,0x19,0x00,0xCC,0x00,0x60,0x0E,0x80,0x63,0x00,0x0C,0x07,0x70,0xF0,0xE0,0x01,0xFF,0x07,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x0F,0xFC,0x3F,0x0C,0x30,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x30,0xFC,0x3F,0xFC,0x0F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 80 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xC0,0xFF,0x01,0x0F,0x1E,0x1C,0xC0,0x61,0x00,0x8C,0x03,0xE0,0x0C,0x00,0x66,0x00,0x30,0x03,0x80,0x19,0x00,0xCC,0x00,0x60,0x0E,0x80,0x63,0x60,0x0C,0x07,0x7F,0xF0,0xE0,0x01,0xFE,0x1F,0xC0,0xCF,0x01,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x03,0xFF,0x0F,0x06,0x38,0x0C,0x60,0x18,0xC0,0x30,0x80,0x61,0x80,0xC3,0xFF,0x83,0xFF,0x01,0xC3,0x01,0x06,0x07,0x0C,0x1C,0x18,0x38,0x30,0xE0,0x60,0x80,0xC1,0x00,0x87,0x01,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x1F,0x18,0x38,0x0C,0x70,0x0C,0x60,0x0C,0x00,0x38,0x00,0xF8,0x07,0xE0,0x1F,0x00,0x3C,0x00,0x70,0x06,0x60,0x06,0x60,0x0C,0x60,0x3C,0x38,0xF8,0x1F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 83 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFD,0xFF,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x0C,0x03,0x18,0x06,0x30,0x0C,0x60,0x18,0xC0,0x30,0x80,0x61,0x00,0xC3,0x00,0x86,0x01,0x0C,0x03,0x18,0x06,0x30,0x0C,0x60,0x18,0xC0,0x60,0xC0,0xC0,0xC1,0x01,0xFF,0x01,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 85 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x60,0x06,0x30,0x06,0x30,0x06,0x30,0x0C,0x18,0x0C,0x18,0x1C,0x1C,0x18,0x0C,0x18,0x0C,0x30,0x06,0x30,0x06,0x30,0x06,0x60,0x03,0x60,0x03,0xE0,0x03,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 86 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xE0,0x00,0x0F,0x70,0x80,0x0D,0x6C,0x60,0x06,0x36,0x30,0x03,0x1B,0x98,0xC1,0x18,0x8C,0x61,0x0C,0xC3,0x30,0x86,0x61,0x0C,0xC6,0x30,0x06,0x63,0x38,0x83,0x39,0xD8,0xC1,0x0D,0x6C,0xC0,0x06,0x36,0x60,0x03,0x1B,0xB0,0x01,0x07,0x70,0x80,0x03,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 87 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x1C,0x1C,0x18,0x0C,0x38,0x0E,0x70,0x07,0x60,0x03,0xE0,0x03,0xC0,0x01,0xC0,0x01,0x60,0x03,0x70,0x03,0x70,0x07,0x38,0x0E,0x1C,0x1C,0x0C,0x18,0x0E,0x38,0x07,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 88 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x06,0x70,0x0C,0x30,0x1C,0x38,0x38,0x1C,0x70,0x0E,0x60,0x06,0xE0,0x07,0xC0,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 89 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0xF9,0xFF,0x00,0x30,0x00,0x0C,0x00,0x03,0xC0,0x01,0x70,0x00,0x18,0x00,0x06,0x80,0x01,0xE0,0x00,0x38,0x00,0x0C,0x00,0x03,0xC0,0x00,0xF0,0xFF,0xFB,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 90 + 0x00,0x00,0x00,0x00,0xF0,0x78,0x0C,0x06,0x83,0xC1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x30,0x18,0x0C,0x06,0x8F,0x07,0x00, // 91 + 0x00,0x00,0x00,0x00,0x18,0x0C,0x0C,0x06,0x03,0x83,0xC1,0xE0,0x60,0x30,0x18,0x18,0x0C,0x06,0x06,0x03,0x00,0x00,0x00,0x00,0x00, // 92 + 0x00,0x00,0x00,0x00,0xE0,0xF1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x30,0x1E,0x0F,0x00, // 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xC0,0x03,0x1E,0x98,0xC1,0x0C,0x66,0x18,0xC6,0x30,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 94 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x7F,0x00,0x00, // 95 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xF0,0x0F,0x87,0x63,0x60,0x00,0x0C,0xF0,0xC1,0x3F,0x3C,0xC6,0xC0,0x18,0x1C,0xC7,0xC3,0x6F,0xF0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x80,0x79,0xB0,0x1F,0x1E,0xC7,0xC1,0x18,0x30,0x03,0x66,0xC0,0x0C,0x98,0x01,0x73,0x30,0x1E,0xC7,0x7E,0x98,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 98 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0xC3,0x71,0x0E,0x66,0x00,0x06,0x60,0x00,0x06,0x60,0x00,0x0E,0xC6,0x71,0xF8,0x03,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 99 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x9E,0xE1,0x37,0x8E,0xC7,0xE0,0x0C,0x98,0x01,0x33,0x60,0x06,0xCC,0x80,0x31,0x38,0x8E,0x87,0xDF,0xE0,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 100 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xE0,0x0F,0x8E,0xC3,0xE0,0x0C,0x98,0xFF,0xF3,0x7F,0x06,0xC0,0x00,0x38,0x30,0x8E,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 101 + 0x00,0x00,0x00,0x00,0xC0,0xF3,0x19,0x8C,0xFF,0x9F,0xC1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 102 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0xE1,0x37,0x8E,0xC7,0xE0,0x0C,0x98,0x01,0x33,0x60,0x06,0xCC,0x80,0x31,0x38,0x8E,0x87,0xDF,0xE0,0x19,0x00,0x33,0x70,0x0E,0x87,0x7F,0xE0,0x07,0x00,0x00, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x03,0x60,0x00,0x0C,0x80,0x79,0xB0,0x1F,0x1E,0xC7,0xC1,0x18,0x18,0x03,0x63,0x60,0x0C,0x8C,0x81,0x31,0x30,0x06,0xC6,0xC0,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 104 + 0x00,0x00,0x00,0x18,0x03,0x80,0x31,0xC6,0x18,0x63,0x8C,0x31,0xC6,0x18,0x00,0x00,0x00,0x00, // 105 + 0x00,0x00,0x00,0x18,0x03,0x80,0x31,0xC6,0x18,0x63,0x8C,0x31,0xC6,0x18,0x63,0xEC,0x1D,0x00, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x0C,0xC0,0x00,0x0C,0xC0,0x60,0x0C,0xC3,0x18,0xCC,0xC0,0x06,0x7C,0xC0,0x0F,0xCC,0xC0,0x18,0x8C,0xC3,0x30,0x0C,0xC6,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 107 + 0x00,0x00,0x00,0x18,0x63,0x8C,0x31,0xC6,0x18,0x63,0x8C,0x31,0xC6,0x18,0x00,0x00,0x00,0x00, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1C,0x0E,0xFC,0xFB,0xC1,0xF1,0x38,0x0C,0x06,0xC3,0x60,0x30,0x0C,0x06,0xC3,0x60,0x30,0x0C,0x06,0xC3,0x60,0x30,0x0C,0x06,0xC3,0x60,0x30,0x0C,0x06,0xC3,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x79,0xB0,0x1F,0x1E,0xC7,0xC1,0x18,0x18,0x03,0x63,0x60,0x0C,0x8C,0x81,0x31,0x30,0x06,0xC6,0xC0,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 110 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0xE0,0x0F,0x8E,0xE3,0xE0,0x0C,0x98,0x01,0x33,0x60,0x06,0xCC,0x80,0x39,0x38,0x8E,0x83,0x3F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x79,0xB0,0x1F,0x1E,0xC7,0xC1,0x18,0x30,0x03,0x66,0xC0,0x0C,0x98,0x01,0x73,0x30,0x1E,0xC7,0x7E,0x98,0x07,0x03,0x60,0x00,0x0C,0x80,0x01,0x30,0x00,0x00,0x00, // 112 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9E,0xE1,0x37,0x8E,0xC7,0xE0,0x0C,0x98,0x01,0x33,0x60,0x06,0xCC,0x80,0x31,0x38,0x8E,0x87,0xDF,0xE0,0x19,0x00,0x03,0x60,0x00,0x0C,0x80,0x01,0x30,0x00,0x00, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,0xFC,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 114 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0xFC,0xE3,0x70,0x06,0xE6,0x00,0xFC,0x80,0x3F,0xC0,0x07,0x60,0x06,0xE6,0x70,0xFC,0x83,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 115 + 0x00,0x00,0x00,0x00,0x40,0x30,0x18,0x8C,0xFF,0x9F,0xC1,0x60,0x30,0x18,0x0C,0x06,0x83,0xC1,0xC7,0x03,0x00,0x00,0x00,0x00,0x00, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x81,0x31,0x30,0x06,0xC6,0xC0,0x18,0x18,0x03,0x63,0x60,0x0C,0x8C,0x81,0x31,0x38,0x8E,0x87,0xDF,0xE0,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 117 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x03,0x66,0x30,0x06,0x63,0x30,0x8C,0xC1,0x18,0xD8,0x80,0x0D,0xD8,0x00,0x07,0x70,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 118 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x02,0x0F,0x0E,0x1E,0x1C,0x6C,0x28,0xCC,0xD8,0x98,0xB1,0x31,0x36,0x36,0x6C,0x6C,0xD8,0xD8,0xA0,0xA0,0xC0,0xC1,0x81,0x83,0x03,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 119 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x06,0xC3,0x38,0x9C,0x81,0x0D,0x70,0x00,0x07,0x70,0x80,0x0D,0xDC,0xC1,0x18,0x06,0x73,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 120 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x06,0x66,0x30,0x0C,0xC3,0x30,0x8C,0x81,0x19,0x98,0x01,0x1B,0xF0,0x00,0x0F,0xE0,0x00,0x06,0x60,0x00,0x06,0x30,0xC0,0x03,0x1C,0x00,0x00,0x00, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x7F,0xFC,0x07,0x30,0x80,0x03,0x1C,0xE0,0x00,0x06,0x30,0x80,0x03,0x1C,0xC0,0x00,0xFE,0xE7,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 122 + 0x00,0x00,0x00,0x00,0x00,0x70,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x06,0x06,0x0C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x70,0x00,0x00, // 123 + 0x00,0x00,0x00,0x00,0xC3,0x30,0x0C,0xC3,0x30,0x0C,0xC3,0x30,0x0C,0xC3,0x30,0x0C,0xC3,0x30,0x0C,0xC3,0x30,0x00, // 124 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x1E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x30,0x60,0x70,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1E,0x0E,0x00,0x00, // 125 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x80,0x3F,0x66,0xFC,0x01,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // 126 +}; + diff --git a/examples/SSD1306Demo/SSD1306Demo.ino b/examples/SSD1306Demo/SSD1306Demo.ino new file mode 100644 index 0000000000000000000000000000000000000000..df7eb61a125bd839a3360d3b39031c0452943c09 --- /dev/null +++ b/examples/SSD1306Demo/SSD1306Demo.ino @@ -0,0 +1,153 @@ +#include <ArduinoJson.h> + +/**The MIT License (MIT) + +Copyright (c) 2015 by Daniel Eichhorn + +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. + +See more at http://blog.squix.ch +*/ +#include <Wire.h> +#include "ssd1306_i2c.h" +#include "images.h" + +// if you are using a ESP8266 module with NodeMCU +// pin labels, you can use this list to keep +// your code and the lables in-sync +#define NODEMCU_D0 16 +#define NODEMCU_D1 5 +#define NODEMCU_D2 4 +#define NODEMCU_D3 0 +#define NODEMCU_D4 2 +#define NODEMCU_D5 14 +#define NODEMCU_D6 12 +#define NODEMCU_D7 13 +#define NODEMCU_D8 15 +#define NODEMCU_D9 3 +#define NODEMCU_D10 1 +#define NODEMCU_D12 10 + + + +// Initialize the oled display for address 0x3c +// sda-pin=14 and sdc-pin=12 +SSD1306 display(0x3c, NODEMCU_D6, NODEMCU_D5); + +// this array keeps function pointers to all frames +// frames are the single views that slide from right to left +void (*frameCallbacks[])(int x, int y) = {drawFrame1, drawFrame2, drawFrame3, drawFrame4}; + +// how many frames are there? +int frameCount = 4; + +void setup() { + Serial.begin(115200); + Serial.println(); + Serial.println(); + + // initialize dispaly + display.init(); + display.flipScreenVertically(); + // set the drawing functions + display.setFrameCallbacks(frameCount, frameCallbacks); + // how many ticks does a slide of a frame take? + display.setFrameTransitionTicks(10); + // defines how many ticks the driver waits between frame transitions + display.setFrameWaitTicks(150); + + display.clear(); + display.display(); + +} + +void loop() { + if (display.getFrameState() == display.FRAME_STATE_FIX) { + // do something which consumes a lot of time in a moment + // when there is no transition between frames going on. + // This will keep transitions smooth; + } + + // clear the frame + display.clear(); + + // Tell the driver to render the next frame. + // This enables the frame mode including the transition + // and the drawing of the frame indicators + display.nextFrameTick(); + + // Even in frame mode you can draw static elements. + // But they won't be transitioned + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0, 54, "20:54"); + + // copy the buffer to the display + display.display(); +} + +void drawFrame1(int x, int y) { + // draw an xbm image. + // Please note that everything that should be transitioned + // needs to be drawn relative to x and y + display.drawXbm(x + 34, y + 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits); + } + + void drawFrame2(int x, int y) { + // Demonstrates the 3 included default sizes. The fonts come from SSD1306Fonts.h file + // Besides the default fonts there will be a program to convert TrueType fonts into this format + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.setFont(ArialMT_Plain_10); + display.drawString(0 + x, 0 + y, "Arial 10"); + + display.setFont(ArialMT_Plain_16); + display.drawString(0 + x, 10 + y, "Arial 16"); + + display.setFont(ArialMT_Plain_24); + display.drawString(0 + x, 24 + y, "Arial 24"); +} + +void drawFrame3(int x, int y) { + // Text alignment demo + display.setFont(ArialMT_Plain_10); + + // The coordinates define the left starting point of the text + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0 + x, 0 + y, "Left aligned (0,0)"); + + // The coordinates define the center of the text + display.setTextAlignment(TEXT_ALIGN_CENTER); + display.drawString(64 + x, 20, "Center aligned (64,20)"); + + // The coordinates define the right end of the text + display.setTextAlignment(TEXT_ALIGN_RIGHT); + display.drawString(128 + x, 40, "Right aligned (128,40)"); +} + +void drawFrame4(int x, int y) { + // Demo for drawStringMaxWidth: + // with the third parameter you can define the width after which words will be wrapped. + // Currently only spaces and "-" are allowed for wrapping + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.setFont(ArialMT_Plain_10); + display.drawStringMaxWidth(0 + x, 0 + y, 128, "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore."); +} + + + diff --git a/examples/SSD1306Demo/images.h b/examples/SSD1306Demo/images.h new file mode 100644 index 0000000000000000000000000000000000000000..8f5de149d1733553de8cbd7d3dbef167b9551aec --- /dev/null +++ b/examples/SSD1306Demo/images.h @@ -0,0 +1,28 @@ +#define WiFi_Logo_width 60 +#define WiFi_Logo_height 36 +const char WiFi_Logo_bits[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF, + 0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, + 0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C, + 0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00, + 0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C, + 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00, + 0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, + 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, + 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C, + 0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00, + 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F, + 0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00, + 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; diff --git a/library.properties b/library.properties new file mode 100644 index 0000000000000000000000000000000000000000..fd453fe1480b9de3009a7681e695213b673a35b4 --- /dev/null +++ b/library.properties @@ -0,0 +1,9 @@ +name=ESP8266 Oled Driver for SSD1306 display +version=1.0.0 +author=Daniel Eichhorn +maintainer=Daniel Eichhorn <squix78@gmail.com> +sentence=A display driver for SSD1306 oled displays connected to an ESP8266 +paragraph=A display driver for SSD1306 oled displays connected to an ESP8266 +category=Display +url=https://github.com/squix78/esp8266-oled-ssd1306 +architectures=esp8266 diff --git a/ssd1306_i2c.cpp b/ssd1306_i2c.cpp new file mode 100644 index 0000000000000000000000000000000000000000..119f0f5c7eb0d651fda9a1ee70496e8ed7b99a0b --- /dev/null +++ b/ssd1306_i2c.cpp @@ -0,0 +1,390 @@ +/**The MIT License (MIT) + +Copyright (c) 2015 by Daniel Eichhorn + +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. + +See more at http://blog.squix.ch + +Credits for parts of this code go to Mike Rankin. Thank you so much for sharing! +*/ + +#include "ssd1306_i2c.h" +#include <Wire.h> + + +SSD1306::SSD1306(int i2cAddress, int sda, int sdc) +{ + myI2cAddress = i2cAddress; + mySda = sda; + mySdc = sdc; + +} + +void SSD1306::init() { + Wire.begin(mySda, mySdc); + Wire.setClock(400000); + sendInitCommands(); + resetDisplay(); +} + +void SSD1306::resetDisplay(void) +{ + displayOff(); + clear(); + display(); + displayOn(); +} + +void SSD1306::reconnect() { + Wire.begin(mySda, mySdc); +} + +void SSD1306::displayOn(void) +{ + sendCommand(0xaf); //display on +} + +void SSD1306::displayOff(void) +{ + sendCommand(0xae); //display off +} + +void SSD1306::setContrast(char contrast) { + sendCommand(0x81); + sendCommand(contrast); +} +void SSD1306::flipScreenVertically() { + sendCommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg + + sendCommand(0xC8); //COMSCANDEC Rotate screen 180 Deg +} +void SSD1306::clear(void) { + memset(buffer, 0, (128*64 / 8)); +} + +void SSD1306::display(void) { + + for (uint16_t i=0; i<(128*64/8); i++) { + // send a bunch of data in one xmission + //Wire.begin(mySda, mySdc); + Wire.beginTransmission(myI2cAddress); + Wire.write(0x40); + for (uint8_t x=0; x<16; x++) { + Wire.write(buffer[i]); + i++; + } + i--; + yield(); + Wire.endTransmission(); + } + + +} + +void SSD1306::setPixel(int x, int y) { + if (x >= 0 && x < 128 && y >= 0 && y < 64) { + + switch (myColor) { + case WHITE: buffer[x+ (y/8)*128] |= (1 << (y&7)); break; + case BLACK: buffer[x+ (y/8)*128] &= ~(1 << (y&7)); break; + case INVERSE: buffer[x+ (y/8)*128] ^= (1 << (y&7)); break; + } + } +} + +void SSD1306::setChar(int x, int y, unsigned char data) { + for (int i = 0; i < 8; i++) { + if (bitRead(data, i)) { + setPixel(x,y + i); + } + } +} + +void SSD1306::drawString(int x, int y, String text) { + unsigned char currentByte; + int charX, charY; + int currentBitCount; + int charCode; + int currentCharWidth; + int currentCharStartPos; + int cursorX = 0; + int numberOfChars = pgm_read_byte(myFontData + CHAR_NUM_POS); + // iterate over string + int firstChar = pgm_read_byte(myFontData + FIRST_CHAR_POS); + int charHeight = pgm_read_byte(myFontData + HEIGHT_POS); + int currentCharByteNum = 0; + int startX = 0; + int startY = y; + + if (myTextAlignment == TEXT_ALIGN_LEFT) { + startX = x; + } else if (myTextAlignment == TEXT_ALIGN_CENTER) { + int width = getStringWidth(text); + startX = x - width / 2; + } else if (myTextAlignment == TEXT_ALIGN_RIGHT) { + int width = getStringWidth(text); + startX = x - width; + } + + for (int j=0; j < text.length(); j++) { + + charCode = text.charAt(j)-0x20; + + currentCharWidth = pgm_read_byte(myFontData + CHAR_WIDTH_START_POS + charCode); + // Jump to font data beginning + currentCharStartPos = CHAR_WIDTH_START_POS + numberOfChars; + + for (int m = 0; m < charCode; m++) { + + currentCharStartPos += pgm_read_byte(myFontData + CHAR_WIDTH_START_POS + m) * charHeight / 8 + 1; + } + + currentCharByteNum = ((charHeight * currentCharWidth) / 8) + 1; + // iterate over all bytes of character + for (int i = 0; i < currentCharByteNum; i++) { + + currentByte = pgm_read_byte(myFontData + currentCharStartPos + i); + //Serial.println(String(charCode) + ", " + String(currentCharWidth) + ", " + String(currentByte)); + // iterate over all bytes of character + for(int bit = 0; bit < 8; bit++) { + //int currentBit = bitRead(currentByte, bit); + + currentBitCount = i * 8 + bit; + + charX = currentBitCount % currentCharWidth; + charY = currentBitCount / currentCharWidth; + + if (bitRead(currentByte, bit)) { + //Serial.println(String(charX) + ", " + String(charY)); + setPixel(startX + cursorX + charX, startY + charY); + //setPixel(charX, charY); + } + + } + yield(); + } + cursorX += currentCharWidth; + + } +} + +void SSD1306::drawStringMaxWidth(int x, int y, int maxLineWidth, String text) { + int currentLineWidth = 0; + int startsAt = 0; + int endsAt = 0; + int lineNumber = 0; + char currentChar = ' '; + int lineHeight = pgm_read_byte(myFontData + HEIGHT_POS); + String currentLine = ""; + for (int i = 0; i < text.length(); i++) { + currentChar = text.charAt(i); + if (currentChar == ' ' || currentChar == '-') { + String lineCandidate = text.substring(startsAt, i); + if (getStringWidth(lineCandidate) <= maxLineWidth) { + endsAt = i; + } else { + + drawString(x, y + lineNumber * lineHeight, text.substring(startsAt, endsAt)); + lineNumber++; + startsAt = endsAt + 1; + } + } + + } + drawString(x, y + lineNumber * lineHeight, text.substring(startsAt)); +} + +int SSD1306::getStringWidth(String text) { + int stringWidth = 0; + char charCode; + for (int j=0; j < text.length(); j++) { + charCode = text.charAt(j)-0x20; + stringWidth += pgm_read_byte(myFontData + CHAR_WIDTH_START_POS + charCode); + } + return stringWidth; +} + +void SSD1306::setTextAlignment(int textAlignment) { + myTextAlignment = textAlignment; +} + +void SSD1306::setFont(const char *fontData) { + myFontData = fontData; +} + +void SSD1306::drawBitmap(int x, int y, int width, int height, const char *bitmap) { + for (int i = 0; i < width * height / 8; i++ ){ + unsigned char charColumn = 255 - pgm_read_byte(bitmap + i); + for (int j = 0; j < 8; j++) { + int targetX = i % width + x; + int targetY = (i / (width)) * 8 + j + y; + if (bitRead(charColumn, j)) { + setPixel(targetX, targetY); + } + } + } +} + +void SSD1306::setColor(int color) { + myColor = color; +} + +void SSD1306::drawRect(int x, int y, int width, int height) { + for (int i = x; i < x + width; i++) { + setPixel(i, y); + setPixel(i, y + height); + } + for (int i = y; i < y + height; i++) { + setPixel(x, i); + setPixel(x + width, i); + } +} + +void SSD1306::fillRect(int x, int y, int width, int height) { + for (int i = x; i < x + width; i++) { + for (int j = 0; j < y + height; j++) { + setPixel(i, j); + } + } +} + +void SSD1306::drawXbm(int x, int y, int width, int height, const char *xbm) { + if (width % 8 != 0) { + width = ((width / 8) + 1) * 8; + } + for (int i = 0; i < width * height / 8; i++ ){ + unsigned char charColumn = pgm_read_byte(xbm + i); + for (int j = 0; j < 8; j++) { + int targetX = (i * 8 + j) % width + x; + int targetY = (8 * i / (width)) + y; + if (bitRead(charColumn, j)) { + setPixel(targetX, targetY); + } + } + } +} + +void SSD1306::sendCommand(unsigned char com) +{ + //Wire.begin(mySda, mySdc); + Wire.beginTransmission(myI2cAddress); //begin transmitting + Wire.write(0x80); //command mode + Wire.write(com); + Wire.endTransmission(); // stop transmitting +} + +void SSD1306::sendInitCommands(void) +{ + // Init sequence from https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp + sendCommand(0xae); //display off + sendCommand(0xa6); //Set Normal Display (default) + // Init sequence for 128x64 OLED module + sendCommand(0xAE); //DISPLAYOFF + sendCommand(0xD5); //SETDISPLAYCLOCKDIV + sendCommand(0x80); // the suggested ratio 0x80 + sendCommand(0xA8); //SSD1306_SETMULTIPLEX + sendCommand(0x3F); + sendCommand(0xD3); //SETDISPLAYOFFSET + sendCommand(0x0); //no offset + sendCommand(0x40 | 0x0); //SETSTARTLINE + sendCommand(0x8D); //CHARGEPUMP + sendCommand(0x14); + sendCommand(0x20); //MEMORYMODE + sendCommand(0x00); //0x0 act like ks0108 + + //sendCommand(0xA0 | 0x1); //SEGREMAP //Rotate screen 180 deg + sendCommand(0xA0); + + //sendCommand(0xC8); //COMSCANDEC Rotate screen 180 Deg + sendCommand(0xC0); + + sendCommand(0xDA); //0xDA + sendCommand(0x12); //COMSCANDEC + sendCommand(0x81); //SETCONTRAS + sendCommand(0xCF); // + sendCommand(0xd9); //SETPRECHARGE + sendCommand(0xF1); + sendCommand(0xDB); //SETVCOMDETECT + sendCommand(0x40); + sendCommand(0xA4); //DISPLAYALLON_RESUME + sendCommand(0xA6); //NORMALDISPLAY + + sendCommand(0x2e); // stop scroll + //----------------------------REVERSE comments----------------------------// + // sendCommand(0xa0); //seg re-map 0->127(default) + // sendCommand(0xa1); //seg re-map 127->0 + // sendCommand(0xc8); + // delay(1000); + //----------------------------REVERSE comments----------------------------// + // sendCommand(0xa7); //Set Inverse Display + // sendCommand(0xae); //display off + sendCommand(0x20); //Set Memory Addressing Mode + sendCommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode + //sendCommand(0x02); // Set Memory Addressing Mode ab Page addressing mode(RESET) + +} + +void SSD1306::nextFrameTick() { + myFrameTick++; + if (myFrameTick==myFrameWaitTicks && myFrameState == 0 || myFrameTick==myFrameTransitionTicks && myFrameState == 1) { + myFrameState = (myFrameState + 1) % 2; + if (myFrameState==FRAME_STATE_FIX) { + myCurrentFrame = (myCurrentFrame + 1) % myFrameCount; + } + myFrameTick = 0; + } + drawIndicators(myFrameCount, myCurrentFrame); + + switch(myFrameState) { + case 0: + (*myFrameCallbacks[myCurrentFrame])(0, 0); + break; + case 1: + (*myFrameCallbacks[myCurrentFrame])(-128 * myFrameTick / myFrameTransitionTicks, 0); + (*myFrameCallbacks[(myCurrentFrame + 1) % myFrameCount])(-128 * myFrameTick / myFrameTransitionTicks + 128, 0); + break; + } + +} +void SSD1306::drawIndicators(int frameCount, int activeFrame) { + for (int i = 0; i < frameCount; i++) { + const char *xbm; + if (activeFrame == i) { + xbm = active_bits; + } else { + xbm = inactive_bits; + } + drawXbm(64 - (12 * frameCount / 2) + 12 * i,56, 8, 8, xbm); + } +} +void SSD1306::setFrameCallbacks(int frameCount, void (*frameCallbacks[])(int x, int y)) { + myFrameCount = frameCount; + myFrameCallbacks = frameCallbacks; +} + +void SSD1306::setFrameWaitTicks(int frameWaitTicks) { + myFrameWaitTicks = frameWaitTicks; +} +void SSD1306::setFrameTransitionTicks(int frameTransitionTicks) { + myFrameTransitionTicks = frameTransitionTicks; +} +int SSD1306::getFrameState() { + return myFrameState; +} diff --git a/ssd1306_i2c.h b/ssd1306_i2c.h new file mode 100644 index 0000000000000000000000000000000000000000..fbae7ca05aa0bb0b6a36b275780aa512ff6283cf --- /dev/null +++ b/ssd1306_i2c.h @@ -0,0 +1,116 @@ +/**The MIT License (MIT) + +Copyright (c) 2015 by Daniel Eichhorn + +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. + +See more at http://blog.squix.ch + +Credits for parts of this code go to Mike Rankin. Thank you so much for sharing! +*/ +#pragma once + +#include <Arduino.h> +#include "SSD1306Fonts.h" + +#define active_width 8 +#define active_height 8 +const char active_bits[] PROGMEM = { + 0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00 }; + +#define inactive_width 8 +#define inactive_height 8 +const char inactive_bits[] PROGMEM = { + 0x00, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x00 }; + +#define BLACK 0 +#define WHITE 1 +#define INVERSE 2 + + +#define WIDTH_POS 0 +#define HEIGHT_POS 1 +#define FIRST_CHAR_POS 2 +#define CHAR_NUM_POS 3 +#define CHAR_WIDTH_START_POS 4 + +#define TEXT_ALIGN_LEFT 0 +#define TEXT_ALIGN_CENTER 1 +#define TEXT_ALIGN_RIGHT 2 + +class SSD1306 { + +private: + int myI2cAddress; + int mySda; + int mySdc; + uint8_t buffer[128 * 64 / 8]; + int myFrameState = 0; + int myFrameTick = 0; + int myCurrentFrame = 0; + int myFrameCount = 0; + int myFrameWaitTicks = 100; + int myFrameTransitionTicks = 25; + int myTextAlignment = TEXT_ALIGN_LEFT; + int myColor = WHITE; + const char *myFontData = ArialMT_Plain_10; + void (**myFrameCallbacks)(int x, int y); + + + +public: + // Empty constructor + SSD1306(int i2cAddress, int sda, int sdc); + void init(); + void resetDisplay(void); + void reconnect(void); + void displayOn(void); + void displayOff(void); + void clear(void); + void display(void); + void setPixel(int x, int y); + void setChar(int x, int y, unsigned char data); + void drawString(int x, int y, String text); + void drawStringMaxWidth(int x, int y, int maxLineWidth, String text); + int getStringWidth(String text); + void setTextAlignment(int textAlignment); + void setFont(const char *fontData); + void drawBitmap(int x, int y, int width, int height, const char *bitmap); + void drawXbm(int x, int y, int width, int height, const char *xbm); + void sendCommand(unsigned char com); + void sendInitCommands(void); + void setColor(int color); + void drawRect(int x, int y, int width, int height); + void fillRect(int x, int y, int width, int height); + + void setContrast(char contrast); + void flipScreenVertically(); + + + void setFrameCallbacks(int frameCount, void (*frameCallbacks[])(int x, int y)); + void nextFrameTick(void); + void drawIndicators(int frameCount, int activeFrame); + void setFrameWaitTicks(int frameWaitTicks); + void setFrameTransitionTicks(int frameTransitionTicks); + int getFrameState(); + + const int FRAME_STATE_FIX = 0; + const int FRAME_STATE_TRANSITION = 1; + +};