├── tools ├── exampleSprite.bmp ├── color.py ├── ConvertSprites.py └── sp.py ├── .gitignore ├── src ├── color_palette.h ├── sprites.h ├── fonts.h ├── color_palette.c ├── ssd1351.h ├── ssd1351.c └── fonts.c ├── example ├── main.c ├── myHAL.h ├── makefile └── myHAL.c ├── example_with_emulator_WIN ├── socketSPI.h ├── myHAL.h ├── makefile ├── myHAL.c ├── main.c ├── socketSPI.c └── ibm_vga.h ├── SSD1351_Emulator ├── go.mod ├── main.go └── go.sum ├── LICENSE.md ├── test └── test_ssd1351.c └── README.md /tools/exampleSprite.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gecko05/SSD1351-Driver-Library/HEAD/tools/exampleSprite.bmp -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.exe 3 | .vscode/settings.json 4 | SSD1351_Emulator/.vscode/settings.json 5 | tools/exampleSprite.bmp.import 6 | .vscode/c_cpp_properties.json 7 | .vscode/tasks.json 8 | -------------------------------------------------------------------------------- /src/color_palette.h: -------------------------------------------------------------------------------- 1 | /*$T src/color_palette.h GC 1.150 2023-03-18 10:52:36 */ 2 | 3 | 4 | /*$6*/ 5 | 6 | 7 | 8 | #ifndef COLOR_PALETTE_H 9 | #define COLOR_PALETTE_H 10 | 11 | #include "stdint.h" 12 | 13 | extern uint16_t color_palette[256]; 14 | #endif // COLOR_PALETTE_H 15 | -------------------------------------------------------------------------------- /example/main.c: -------------------------------------------------------------------------------- 1 | #include "ssd1351.h" 2 | 3 | int main(int argc, char *argv[]) { 4 | SSD1351_init(); 5 | SSD1351_fill(COLOR_BLACK); 6 | SSD1351_set_cursor(0, 0); 7 | SSD1351_printf(COLOR_AQUA, &Font_11x18, "Hello world!"); 8 | SSD1351_update(); 9 | SSD1351_DelayMs(1000); 10 | return 0; 11 | } -------------------------------------------------------------------------------- /example_with_emulator_WIN/socketSPI.h: -------------------------------------------------------------------------------- 1 | #ifndef SOCKET_SPI_H 2 | #define SOCKET_SPI_H 3 | 4 | #include "stdint.h" 5 | 6 | #include 7 | #include 8 | #include 9 | 10 | #pragma comment(lib, "Ws2_32.lib") 11 | 12 | void socketSPISendData(uint8_t *dataBytes, uint32_t len); 13 | 14 | void closeSocketSPI(); 15 | 16 | #endif -------------------------------------------------------------------------------- /src/sprites.h: -------------------------------------------------------------------------------- 1 | /*$T src/sprites.h GC 1.150 2023-03-18 10:52:29 */ 2 | 3 | 4 | /*$6*/ 5 | 6 | 7 | 8 | #ifndef SPRITES_H 9 | #define SPRITES_H 10 | 11 | #include 12 | #include 13 | 14 | typedef struct Sprite 15 | { 16 | const uint8_t *content; 17 | uint8_t width; 18 | uint8_t height; 19 | } sprite; 20 | 21 | extern sprite sprite0; 22 | #endif // SPRITES_H 23 | -------------------------------------------------------------------------------- /tools/color.py: -------------------------------------------------------------------------------- 1 | # This function can convert a hexadecimal color value 2 | # to a format that the C library can understand. 3 | 4 | def encodecolor(colorhex): 5 | encoded = 0 6 | blue = (colorhex & 0xFF0000) >> 16 7 | green = (colorhex & 0x00FF00) >> 8 8 | red = colorhex & 0x0000FF 9 | encoded |= (int(red/8) << 8) 10 | encoded |= (int(green/4) >> 3) 11 | encoded |= ((int(green/4) % 0x07) << 13) 12 | encoded |= (int(blue/8) << 3) 13 | return encoded 14 | -------------------------------------------------------------------------------- /example/myHAL.h: -------------------------------------------------------------------------------- 1 | #ifndef MY_HAL_H 2 | #define MY_HAL_H 3 | 4 | #include "stdint.h" 5 | 6 | #define GPIOA 0 7 | #define GPIOB 0 8 | #define GPIOC 0 9 | #define GPIOD 0 10 | #define GPIOE 0 11 | 12 | #define GPIO_PIN_0 0 13 | #define GPIO_PIN_1 1 14 | #define GPIO_PIN_2 2 15 | #define GPIO_PIN_3 3 16 | #define GPIO_PIN_4 4 17 | #define GPIO_PIN_5 5 18 | 19 | void SPI_TXBuffer(uint8_t *buffer, uint32_t len); 20 | 21 | void SPI_TXByte(uint8_t* data); 22 | 23 | void GPIO_SetPin(uint16_t Port, uint16_t Pin); 24 | 25 | void GPIO_ResetPin(uint16_t Port, uint16_t Pin); 26 | 27 | void HAL_Delay(uint16_t ms); 28 | 29 | #endif // MY_HAL_H -------------------------------------------------------------------------------- /example/makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | SRC_DIR = ../src 3 | HAL_DIR = ../example 4 | CFLAGS = -Wextra -g -I$(SRC_DIR) -I. 5 | INCLUDE = -I/../example 6 | DEPS = $(SRC_DIR)/ssd1351.h $(SRC_DIR)/fonts.h $(SRC_DIR)/sprites.h $(SRC_DIR)/color_palette.h $(HAL_DIR)/myHAL.h 7 | OBJS = $(SRC_DIR)/ssd1351.o $(SRC_DIR)/color_palette.o $(SRC_DIR)/fonts.o $(SRC_DIR)/sprites.o $(HAL_DIR)/myHAL.o 8 | 9 | all: main 10 | 11 | main: main.o $(DEPS) $(OBJS) 12 | $(CC) $(CFLAGS) $(INCLUDE) -o main main.o $(OBJS) 13 | 14 | $(SRC_DIR)/%.o: $(SRC_DIR)/%.c 15 | $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ 16 | 17 | $(HAL_DIR)/%.o: $(HAL_DIR)/%.c 18 | $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ 19 | 20 | clean: 21 | rm *.o main -------------------------------------------------------------------------------- /example_with_emulator_WIN/myHAL.h: -------------------------------------------------------------------------------- 1 | #ifndef MY_HAL_H 2 | #define MY_HAL_H 3 | 4 | #include "stdint.h" 5 | 6 | #define GPIOA 0 7 | #define GPIOB 0 8 | #define GPIOC 0 9 | #define GPIOD 0 10 | #define GPIOE 0 11 | 12 | #define GPIO_PIN_0 0 13 | #define GPIO_PIN_1 1 14 | #define GPIO_PIN_2 2 15 | #define GPIO_PIN_3 3 16 | #define GPIO_PIN_4 4 17 | #define GPIO_PIN_5 5 18 | #define GPIO_PIN_6 6 19 | #define GPIO_PIN_7 7 20 | #define GPIO_PIN_8 8 21 | 22 | void SPI_TXBuffer(uint8_t *buffer, uint32_t len); 23 | 24 | void SPI_TXByte(uint8_t data); 25 | 26 | void GPIO_SetPin(uint16_t Port, uint16_t Pin); 27 | 28 | void GPIO_ResetPin(uint16_t Port, uint16_t Pin); 29 | 30 | void HAL_Delay(uint16_t ms); 31 | 32 | void closeEmulatorSocket(); 33 | 34 | #endif // MY_HAL_H -------------------------------------------------------------------------------- /SSD1351_Emulator/go.mod: -------------------------------------------------------------------------------- 1 | module SSD1351_renderer 2 | 3 | go 1.18 4 | 5 | require gioui.org v0.0.0-20221004231135-80196f3c3ed3 6 | 7 | require ( 8 | eliasnaur.com/font v0.0.0-20220215125817-de715634c840 // indirect 9 | gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 // indirect 10 | gioui.org/shader v1.0.6 // indirect 11 | github.com/benoitkugler/textlayout v0.1.3 // indirect 12 | github.com/gioui/uax v0.2.1-0.20220819135011-cda973fac06d // indirect 13 | github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b // indirect 14 | golang.org/x/exp/shiny v0.0.0-20220906200021-fcb1a314c389 // indirect 15 | golang.org/x/image v0.5.0 // indirect 16 | golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 // indirect 17 | golang.org/x/text v0.7.0 // indirect 18 | ) 19 | -------------------------------------------------------------------------------- /example/myHAL.c: -------------------------------------------------------------------------------- 1 | #include "myHAL.h" 2 | 3 | // For demonstration purposes 4 | #include "stdio.h" 5 | 6 | #ifdef _WIN64 7 | #include "time.h" 8 | 9 | void SPI_TXBuffer(uint8_t *buffer, uint32_t len) { 10 | printf("I'm sending a buffer\n"); 11 | } 12 | 13 | void SPI_TXByte(uint8_t* data) { 14 | printf("I'm sending a byte\n"); 15 | } 16 | 17 | void GPIO_SetPin(uint16_t Port, uint16_t Pin) { 18 | printf("I'm setting a pin\n"); 19 | } 20 | 21 | void GPIO_ResetPin(uint16_t Port, uint16_t Pin) { 22 | printf("I'm resetting a pin\n"); 23 | } 24 | 25 | void HAL_Delay(uint16_t ms) { 26 | clock_t start = clock(); 27 | clock_t elapsed = clock() - start; 28 | while (elapsed < ms) { 29 | // wait 30 | elapsed = clock() - start; 31 | } 32 | } 33 | #endif -------------------------------------------------------------------------------- /example_with_emulator_WIN/makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | SRC_DIR = ../src 3 | HAL_DIR = ../example_with_emulator_WIN 4 | CFLAGS = -Wextra -g -I$(SRC_DIR) -I. 5 | INCLUDE = -I. 6 | DEPS = $(HAL_DIR)/ibm_vga.h $(SRC_DIR)/ssd1351.h $(SRC_DIR)/fonts.h $(SRC_DIR)/sprites.h $(SRC_DIR)/color_palette.h $(HAL_DIR)/myHAL.h $(HAL_DIR)/socketSPI.h 7 | OBJS = $(SRC_DIR)/ssd1351.o $(SRC_DIR)/color_palette.o $(SRC_DIR)/fonts.o $(SRC_DIR)/sprites.o $(HAL_DIR)/myHAL.o $(HAL_DIR)/socketSPI.o 8 | 9 | all: main 10 | 11 | main: main.o $(DEPS) $(OBJS) 12 | $(CC) $(CFLAGS) $(INCLUDE) -o main main.o $(OBJS) -lws2_32 13 | 14 | $(SRC_DIR)/%.o: $(SRC_DIR)/%.c 15 | $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ 16 | 17 | $(HAL_DIR)/%.o: $(HAL_DIR)/%.c 18 | $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ 19 | 20 | clean: 21 | rm *.o main.exe -------------------------------------------------------------------------------- /example_with_emulator_WIN/myHAL.c: -------------------------------------------------------------------------------- 1 | #include "myHAL.h" 2 | #include "socketSPI.h" 3 | 4 | #ifdef _WIN64 5 | #include "time.h" 6 | 7 | void SPI_TXBuffer(uint8_t *buffer, uint32_t len) { 8 | socketSPISendData(buffer, len); 9 | } 10 | 11 | void SPI_TXByte(uint8_t data) { 12 | socketSPISendData(&(uint8_t){data}, 1); 13 | } 14 | 15 | void GPIO_SetPin(uint16_t Port, uint16_t Pin) { 16 | // do nothing 17 | } 18 | 19 | void GPIO_ResetPin(uint16_t Port, uint16_t Pin) { 20 | // do nothing 21 | } 22 | 23 | void HAL_Delay(uint16_t ms) { 24 | clock_t start = clock(); 25 | clock_t elapsed = clock() - start; 26 | while (elapsed < ms) { 27 | // wait 28 | elapsed = clock() - start; 29 | } 30 | } 31 | 32 | void closeEmulatorSocket() { 33 | closeSocketSPI(); 34 | } 35 | #endif -------------------------------------------------------------------------------- /tools/ConvertSprites.py: -------------------------------------------------------------------------------- 1 | # Use this CLI tool to convert bitmap images to sprite files that the 2 | # C library can use. 3 | 4 | import sp 5 | import sys 6 | import os 7 | 8 | def printHelp(): 9 | print("usage: python3 ConvertSprites.py [spriteName1.bmp] ... [sprinteNameN.bmp]\ 10 | \n-h : print this help message and exit (also --help)\ 11 | \n-p8 : extract tileset from a .p8 file\ 12 | \n") 13 | 14 | def printError(): 15 | print("Argument error\n") 16 | 17 | try: 18 | os.remove("src/loaded_sprites.c") 19 | os.remove("src/color_palette.c") 20 | os.remove("src/loaded_palette.h") 21 | except: 22 | print("Loaded") 23 | if sys.argv[1][0] == '-': 24 | if sys.argv[1][1] == 'h': 25 | printHelp() 26 | elif sys.argv[1] == '--help': 27 | printHelp() 28 | elif sys.argv[1] == '-p8' and len(sys.argv) <= 3: 29 | sp.convertsprites(sys.argv, True) #It's a .p8 file 30 | else: 31 | printError() 32 | else: 33 | sp.convertsprites(sys.argv, False) 34 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jaime Centeno 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/fonts.h: -------------------------------------------------------------------------------- 1 | /*$T src/fonts.h GC 1.150 2023-03-18 10:52:42 */ 2 | 3 | /*Copyright (c) 2016 Olivier Van den Eede - ovde.be 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 6 | and associated documentation files (the “Software”), to deal in the Software without 7 | restriction, including without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies 12 | or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 15 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 17 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ 19 | #ifndef SSD1351_FONTS_H 20 | #define SSD1351_FONTS_H 21 | 22 | #include 23 | 24 | #define small_font & Font_7x10 25 | #define med_font & Font_11x18 26 | #define big_font & Font_16x26 27 | 28 | // Structure for the font definition 29 | typedef struct 30 | { 31 | const uint8_t width; // Font width in pixels 32 | uint8_t height; // Font height in pixels 33 | uint8_t first; // first glyph supported, 32 for ' ' 34 | uint8_t bits; // Bits needed to hold each character data 35 | const void *data; // Pointer to data font data array 36 | } font_t; 37 | 38 | // Three sizes of fonts 39 | extern font_t Font_7x10; 40 | extern font_t Font_11x18; 41 | extern font_t Font_16x26; 42 | #endif // SSD1351_FONTS_H 43 | -------------------------------------------------------------------------------- /example_with_emulator_WIN/main.c: -------------------------------------------------------------------------------- 1 | #include "math.h" 2 | #include "stdlib.h" 3 | #include "stdint.h" 4 | 5 | #include "ssd1351.h" // Remember to configure this file to your own hardware 6 | 7 | #include "ibm_vga.h" 8 | font_t IBMVGA_8x14 = {8, 14, 0, 8, IBM_VGA_8x14}; 9 | 10 | #define DEMO_PRINT 11 | 12 | int main(){ 13 | SSD1351_init(); 14 | SSD1351_fill(COLOR_BLACK); 15 | SSD1351_update(); 16 | int r = 50; 17 | int g = 100; 18 | int b = 240; 19 | int gd = 1; 20 | #ifdef DEMO_CIRCLES 21 | int c0, c1, c2, c3, c4; 22 | c0 = 5; 23 | c1 = 25; 24 | c2 = 45; 25 | c3 = 65; 26 | c4 = 85; 27 | #endif // DEMO_CIRCLES 28 | while(1){ 29 | #ifdef DEMO_PRINT 30 | // D E M O P R I N T 31 | SSD1351_set_cursor(0, 0); 32 | SSD1351_printf(SSD1351_get_rgb(r, g, b), &IBMVGA_8x14, "IBM_VGA FONT"); 33 | SSD1351_printf(COLOR_RED, &Font_11x18, "\nRGB OLED"); 34 | SSD1351_printf(SSD1351_get_rgb(245, g, 20), &Font_16x26, "\nSSD1351"); 35 | if (gd){ 36 | g+=3; 37 | b-=3; 38 | } 39 | else{ 40 | g-=3; 41 | b+=3; 42 | } 43 | if( b <= 100){ 44 | gd = !gd; 45 | } 46 | else if (g <= 100){ 47 | gd = !gd; 48 | } 49 | #endif // DEMO_PRINT 50 | #ifdef DEMO_RECTANGLES 51 | // D E M O R E C T A N G L E S 52 | for (int i = 128; i > 0;i-=12){ 53 | SSD1351_draw_filled_rect( 64 - i/2, 64 - i/2, i, i, 0x1111 + rand()); 54 | } 55 | #endif // DEMO_RECTANGLES 56 | #ifdef DEMO_CIRCLES 57 | // D E M O C I R C L E S 58 | c0+=5; 59 | c1+=5; 60 | c2+=5; 61 | c3+=5; 62 | c4+=5; 63 | if (c0 > 90){ 64 | c0 = 5; 65 | } 66 | if (c1 > 90){ 67 | c1 = 5; 68 | } 69 | if (c2 > 90){ 70 | c2 = 5; 71 | } 72 | if (c3 > 90){ 73 | c3 = 5; 74 | } 75 | if (c4 > 90){ 76 | c4 = 5; 77 | } 78 | int arr[5] = {c0, c1, c2, c3, c4}; 79 | int blu[5] = {150, 190, 250, 190, 150}; 80 | int green[5] = {50, 80, 130, 80, 50}; 81 | int maxi, max = 0; 82 | for (int k = 0; k < 5; k++){ 83 | max = 0; 84 | for (int j = 0; j < 5; j++){ 85 | if (arr[j] > max){ 86 | max = arr[j]; 87 | maxi = j; 88 | } 89 | } 90 | SSD1351_draw_filled_circle(64, 64, arr[maxi], SSD1351_get_rgb(20, green[maxi], blu[maxi])); 91 | arr[maxi] = 0; 92 | } 93 | #endif // DEMO_CIRCLES 94 | // D E M O S P R I T E S 95 | #ifdef DEMO_SPRITES 96 | SSD1351_draw_sprite(0, 0, &sprite0); 97 | #endif // DEMO_SPRITES 98 | SSD1351_update(); 99 | HAL_Delay(33); 100 | } 101 | } -------------------------------------------------------------------------------- /src/color_palette.c: -------------------------------------------------------------------------------- 1 | /*$T src/color_palette.c GC 1.150 2023-03-18 10:52:37 */ 2 | 3 | 4 | /*$6*/ 5 | 6 | 7 | 8 | #include "color_palette.h" 9 | uint16_t color_palette[256] = 10 | { 11 | 0, 12 | 25425, 13 | 20305, 14 | 41044, 15 | 54578, 16 | 2890, 17 | 55494, 18 | 40943, 19 | 8008, 20 | 48901, 21 | 32551, 22 | 8247, 23 | 9725, 24 | 12443, 25 | 16299, 26 | 24494, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0, 37 | 0, 38 | 0, 39 | 0, 40 | 0, 41 | 0, 42 | 0, 43 | 0, 44 | 0, 45 | 0, 46 | 0, 47 | 0, 48 | 0, 49 | 0, 50 | 0, 51 | 0, 52 | 0, 53 | 0, 54 | 0, 55 | 0, 56 | 0, 57 | 0, 58 | 0, 59 | 0, 60 | 0, 61 | 0, 62 | 0, 63 | 0, 64 | 0, 65 | 0, 66 | 0, 67 | 0, 68 | 0, 69 | 0, 70 | 0, 71 | 0, 72 | 0, 73 | 0, 74 | 0, 75 | 0, 76 | 0, 77 | 0, 78 | 0, 79 | 0, 80 | 0, 81 | 0, 82 | 0, 83 | 0, 84 | 0, 85 | 0, 86 | 0, 87 | 0, 88 | 0, 89 | 0, 90 | 0, 91 | 0, 92 | 0, 93 | 0, 94 | 0, 95 | 0, 96 | 0, 97 | 0, 98 | 0, 99 | 0, 100 | 0, 101 | 0, 102 | 0, 103 | 0, 104 | 0, 105 | 0, 106 | 0, 107 | 0, 108 | 0, 109 | 0, 110 | 0, 111 | 0, 112 | 0, 113 | 0, 114 | 0, 115 | 0, 116 | 0, 117 | 0, 118 | 0, 119 | 0, 120 | 0, 121 | 0, 122 | 0, 123 | 0, 124 | 0, 125 | 0, 126 | 0, 127 | 0, 128 | 0, 129 | 0, 130 | 0, 131 | 0, 132 | 0, 133 | 0, 134 | 0, 135 | 0, 136 | 0, 137 | 0, 138 | 0, 139 | 0, 140 | 0, 141 | 0, 142 | 0, 143 | 0, 144 | 0, 145 | 0, 146 | 0, 147 | 0, 148 | 0, 149 | 0, 150 | 0, 151 | 0, 152 | 0, 153 | 0, 154 | 0, 155 | 0, 156 | 0, 157 | 0, 158 | 0, 159 | 0, 160 | 0, 161 | 0, 162 | 0, 163 | 0, 164 | 0, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 0, 170 | 0, 171 | 0, 172 | 0, 173 | 0, 174 | 0, 175 | 0, 176 | 0, 177 | 0, 178 | 0, 179 | 0, 180 | 0, 181 | 0, 182 | 0, 183 | 0, 184 | 0, 185 | 0, 186 | 0, 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 0, 193 | 0, 194 | 0, 195 | 0, 196 | 0, 197 | 0, 198 | 0, 199 | 0, 200 | 0, 201 | 0, 202 | 0, 203 | 0, 204 | 0, 205 | 0, 206 | 0, 207 | 0, 208 | 0, 209 | 0, 210 | 0, 211 | 0, 212 | 0, 213 | 0, 214 | 0, 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 0, 221 | 0, 222 | 0, 223 | 0, 224 | 0, 225 | 0, 226 | 0, 227 | 0, 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 0, 233 | 0, 234 | 0, 235 | 0, 236 | 0, 237 | 0, 238 | 0, 239 | 0, 240 | 0, 241 | 0, 242 | 0, 243 | 0, 244 | 0, 245 | 0, 246 | 0, 247 | 0, 248 | 0, 249 | 0, 250 | 0, 251 | 0, 252 | 0, 253 | 0, 254 | 0, 255 | 0, 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 0, 261 | 0, 262 | 0, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | }; 268 | -------------------------------------------------------------------------------- /tools/sp.py: -------------------------------------------------------------------------------- 1 | import color as clr 2 | 3 | def eprint(file, string): 4 | file.write(string.encode('utf8')) 5 | 6 | def convertsprites(spriteList, picoType): 7 | if spriteList == 0: 8 | return 9 | cfile = open("src/sprites.c", "wb") 10 | pfile = open("src/color_palette.c", "wb") 11 | sfile = open("src/sprites.h", "wb") 12 | c = 0 13 | eprint(cfile, '#include "sprites.h"\n\n') 14 | eprint(sfile, '#ifndef SPRITES_H\n#define SPRITES_H\n\n#include \ 15 | \n#include \n\ntypedef struct Sprite{\n const uint8_t *content;\ 16 | \n uint8_t width;\n uint8_t height;\n} sprite;\n\n') 17 | eprint(pfile,'#include "color_palette.h"\n' + \ 18 | 'uint16_t color_palette[256] = {\n') 19 | palette = 0 20 | for bmp in spriteList: 21 | bmpF = open(bmp, "rb") 22 | data = bmpF.read() 23 | if data[:2] != b'BM': 24 | continue 25 | width = data[18] 26 | height = data[22] 27 | if width > 128 or height > 128: 28 | print("Sprite ",bmp," is too big to use\n") 29 | continue 30 | # Generate color palette 31 | if palette == 0: 32 | plt = [] 33 | for i in range(0, 256): 34 | colord = data[(54 + i * 4) : (57 + i * 4)] 35 | colori = int.from_bytes(colord, "big", signed=False) 36 | enclr = clr.encodecolor(colori) 37 | plt.append(enclr) 38 | for i in plt: 39 | eprint(pfile,(str(i) + ", ")) 40 | eprint(pfile,'\n};\n\n') 41 | offset = int.from_bytes(data[10:13], "little", signed=False) 42 | pfile.close() 43 | palette = 1 44 | else: 45 | print("palette already loaded") 46 | # Write sprites to sprite file "loaded_sprites.c" 47 | #print("Width: ",width, "Height: ", height, "Offset: ", offset) 48 | print("Writing data...") 49 | sprite_name = 'sprite' + str(c) + '_data' 50 | eprint(cfile, '// ' + bmp + '\n') 51 | eprint(cfile, 'const uint8_t ' + sprite_name + '[] = {\n') 52 | eprint(sfile, 'sprite ' + 'sprite' + str(c) + ';\n') 53 | for y in range(0, height): 54 | eprint(cfile,' ') 55 | for x in range(0, width): 56 | eprint(cfile, str(data[offset + ((height - y - 1) * width) + x - 1]) + ', ') 57 | eprint(cfile, '\n') 58 | eprint(cfile, '};\n\n') 59 | eprint(cfile, 'sprite ' + 'sprite' + str(c) + ' = {\n .width = ' + \ 60 | str(width) + ',\n .height = ' + str(height) \ 61 | + ',\n .content = ' + sprite_name + ',\n};\n\n') 62 | c = c + 1 63 | cfile.close() 64 | eprint(sfile, '\n#endif // SPRITES_H') 65 | sfile.close() 66 | pfile.close() 67 | return 68 | -------------------------------------------------------------------------------- /test/test_ssd1351.c: -------------------------------------------------------------------------------- 1 | #include "unity.h" 2 | #include "mock_myHAL.h" 3 | #include "ssd1351.h" 4 | #include "string.h" 5 | 6 | extern DRAM displayRAM; 7 | uint16_t compRAM[DRAM_SIZE_16]; 8 | int16_t x_pos; 9 | int16_t y_pos; 10 | int16_t x_0; 11 | int16_t y_0; 12 | int16_t x_1; 13 | int16_t y_1; 14 | int16_t w; 15 | int16_t h; 16 | uint16_t a_0; 17 | uint16_t a_1; 18 | uint16_t color; 19 | uint16_t a_pos; 20 | 21 | void printDRAM(void){ 22 | for (int i = 0; i < DRAM_SIZE_16; i++){ 23 | printf("%i", displayRAM.halfw[i]); 24 | } 25 | } 26 | 27 | void update_pixel_params(int16_t x, int16_t y, uint16_t col){ 28 | x_pos = x; 29 | y_pos = y; 30 | color = col; 31 | a_pos = (127 - x_pos) + (128 * y_pos); 32 | } 33 | 34 | void print_compRAM(void){ 35 | for (int i = 0; i < DRAM_SIZE_16; i++){ 36 | printf("%x ", compRAM[i]); 37 | } 38 | printf("\n"); 39 | } 40 | 41 | void print_dispRAM(void){ 42 | for (int i = 0; i < DRAM_SIZE_16; i++){ 43 | printf("%x ", displayRAM.halfw[i]); 44 | } 45 | printf("\n"); 46 | } 47 | 48 | void setUp(void){ 49 | SPI_TXBuffer_Ignore(); 50 | SPI_TXByte_Ignore(); 51 | GPIO_SetPin_Ignore(); 52 | //HAL_Delay_Ignore(); 53 | memset(displayRAM.halfw, 0, 16384); 54 | } 55 | 56 | void test_SSD1351_write_pixel(void){ 57 | /* Test with various positions */ 58 | update_pixel_params(120, 0, 0xFFAA); 59 | SSD1351_write_pixel(x_pos, y_pos, color); 60 | TEST_ASSERT_EQUAL_UINT16(color, displayRAM.halfw[a_pos]); 61 | 62 | update_pixel_params(0, 0, 0xC0AB); 63 | SSD1351_write_pixel(x_pos, y_pos, color); 64 | TEST_ASSERT_EQUAL_UINT16(color, displayRAM.halfw[a_pos]); 65 | 66 | update_pixel_params(127, 127, 0x185A); 67 | SSD1351_write_pixel(x_pos, y_pos, color); 68 | TEST_ASSERT_EQUAL_UINT16(color, displayRAM.halfw[a_pos]); 69 | 70 | update_pixel_params(0, 99, 0xAFE1); 71 | SSD1351_write_pixel(x_pos, y_pos, color); 72 | TEST_ASSERT_EQUAL_UINT16(color, displayRAM.halfw[a_pos]); 73 | 74 | /* Test with positions outside of the screen dimensions */ 75 | 76 | memcpy(compRAM, displayRAM.halfw, DRAM_SIZE_8); // copies bytes 77 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 78 | 79 | update_pixel_params(7148, 99, 0xA458); 80 | SSD1351_write_pixel(x_pos, y_pos, color); 81 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 82 | 83 | update_pixel_params(0, 129, 0xA458); 84 | SSD1351_write_pixel(x_pos, y_pos, color); 85 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 86 | 87 | update_pixel_params(-16, -1, 0xA458); 88 | SSD1351_write_pixel(x_pos, y_pos, color); 89 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 90 | 91 | update_pixel_params(-16, 0, 0xA458); 92 | SSD1351_write_pixel(x_pos, y_pos, color); 93 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 94 | 95 | update_pixel_params(0, -11512, 0xA458); 96 | SSD1351_write_pixel(x_pos, y_pos, color); 97 | TEST_ASSERT_EQUAL_UINT16_ARRAY(compRAM, displayRAM.halfw, DRAM_SIZE_16); 98 | } 99 | -------------------------------------------------------------------------------- /SSD1351_Emulator/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "image" 6 | "image/color" 7 | "log" 8 | "net" 9 | "os" 10 | "time" 11 | 12 | "gioui.org/app" 13 | "gioui.org/f32" 14 | 15 | "gioui.org/io/system" 16 | "gioui.org/layout" 17 | "gioui.org/op" 18 | "gioui.org/op/paint" 19 | ) 20 | 21 | const ( 22 | SERVER_HOST = "localhost" 23 | SERVER_PORT = "9988" 24 | SERVER_TYPE = "tcp" 25 | ) 26 | 27 | var screenBuffer []byte 28 | 29 | func processClient(connection net.Conn) { 30 | buffer := make([]byte, 32768) 31 | mLen, err := connection.Read(buffer) 32 | if err != nil { 33 | fmt.Println("Error reading:", err.Error()) 34 | } 35 | // Look for whole frames 36 | if mLen == 32768 { 37 | screenBuffer = buffer[:32768] 38 | } 39 | connection.Close() 40 | } 41 | 42 | func initServer() { 43 | fmt.Println("Server Running...") 44 | server, err := net.Listen(SERVER_TYPE, SERVER_HOST+":"+SERVER_PORT) 45 | if err != nil { 46 | fmt.Println("Error listening:", err.Error()) 47 | os.Exit(1) 48 | } 49 | defer server.Close() 50 | fmt.Println("Listening on " + SERVER_HOST + ":" + SERVER_PORT) 51 | fmt.Println("Waiting for client...") 52 | for { 53 | connection, err := server.Accept() 54 | if err != nil { 55 | fmt.Println("Error accepting: ", err.Error()) 56 | os.Exit(1) 57 | } 58 | processClient(connection) 59 | } 60 | } 61 | 62 | func main() { 63 | go initServer() 64 | go func() { 65 | w := app.NewWindow(app.Size(256, 256), app.MinSize(256, 256), app.MaxSize(256, 256)) 66 | go func() { 67 | timer1 := time.NewTicker(time.Second / 30) 68 | for { 69 | <-timer1.C 70 | w.Invalidate() 71 | } 72 | }() 73 | err := run(w) 74 | if err != nil { 75 | log.Fatal(err) 76 | } 77 | os.Exit(0) 78 | }() 79 | app.Main() 80 | } 81 | 82 | func drawImage(ops *op.Ops, img image.Image, w *app.Window) { 83 | imageOp := paint.NewImageOp(img) 84 | imageOp.Add(ops) 85 | t := op.Affine(f32.Affine2D{}.Scale(f32.Pt(0, 0), f32.Pt(2, 2))) 86 | t.Push(ops) 87 | paint.PaintOp{}.Add(ops) 88 | } 89 | 90 | func run(w *app.Window) error { 91 | var ops op.Ops 92 | for { 93 | e := <-w.Events() 94 | switch e := e.(type) { 95 | case system.DestroyEvent: 96 | return e.Err 97 | case system.FrameEvent: 98 | gtx := layout.NewContext(&ops, e) 99 | 100 | minPoint := image.Point{0, 0} 101 | maxPoint := image.Point{128, 128} 102 | rect := image.Rectangle{minPoint, maxPoint} 103 | myImage := image.NewNRGBA(rect) 104 | for i := 0; i < 32768; i += 2 { 105 | if len(screenBuffer) == 32768 { 106 | // 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 107 | // b b b b b g g g g g g r r r r r 108 | r := screenBuffer[i+1] & 0x1F << 3 109 | b := screenBuffer[i] & 0xF8 110 | g := (((screenBuffer[i] & 0x07) << 4) | ((screenBuffer[i+1] & 0xE0) >> 5)) << 1 111 | newColor := color.NRGBA{r, g, b, 255} 112 | // The image is flipped horizontally 113 | newI := 32767 - i 114 | myImage.SetNRGBA((newI/2)%128, int((i/2)/128), newColor) 115 | } else { 116 | newColor := color.NRGBA{0, 200, 0, 255} 117 | myImage.SetNRGBA((i/2)%128, int((i/2)/128), newColor) 118 | } 119 | } 120 | drawImage(gtx.Ops, myImage, w) 121 | 122 | e.Frame(gtx.Ops) 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /example_with_emulator_WIN/socketSPI.c: -------------------------------------------------------------------------------- 1 | #include "socketSPI.h" 2 | #include 3 | 4 | #define DEFAULT_BUFLEN 512 5 | 6 | typedef enum { 7 | DISCONNECTED, 8 | CONNECTED, 9 | SENDING, 10 | RECEIVING 11 | } SOCKET_STATUS; 12 | 13 | typedef enum { 14 | CONNECT, 15 | SEND, 16 | DISCONNECT 17 | } COMMAND; 18 | 19 | typedef struct { 20 | COMMAND command; 21 | uint8_t *data; 22 | } input; 23 | 24 | SOCKET_STATUS STATE = DISCONNECTED; 25 | SOCKET ConnectSocket = INVALID_SOCKET; 26 | 27 | WSADATA wsaData; 28 | 29 | bool initSocketSPI(); 30 | bool sendDataToSocket(uint8_t* dataBytes, uint32_t len); 31 | void closeSocketSPI(); 32 | 33 | SOCKET_STATUS changeState(COMMAND command, uint8_t* data) { 34 | // switch(command) { 35 | // case CONNECT : 36 | // if (STATE == DISCONNECTED) { 37 | // if (initSocketSPI()) { 38 | // STATE = CONNECTED; 39 | // } 40 | // } 41 | // case SEND : 42 | // // Connect if necessary, then continue sending the data 43 | // if (STATE == DISCONNECTED) { 44 | // if (initSocketSPI()) { 45 | // STATE = CONNECTED; 46 | // } 47 | // } 48 | // if (STATE == CONNECTED) { 49 | // STATE = SENDING; 50 | // sendByteToSocket(data); 51 | // STATE = CONNECTED; 52 | // } 53 | // case DISCONNECT : 54 | // if (STATE == CONNECTED) { 55 | // closeSocketSPI(); 56 | // STATE = DISCONNECTED; 57 | // } 58 | // default: 59 | // break; 60 | // } 61 | } 62 | 63 | void socketSPISendData(uint8_t *dataBytes, uint32_t len) { 64 | //changeState(SEND, dataByte); 65 | initSocketSPI(); 66 | sendDataToSocket(dataBytes, len); 67 | closeSocketSPI(); 68 | } 69 | 70 | bool initSocketSPI() { 71 | int iResult; 72 | 73 | // Initialize Winsock 74 | iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 75 | if (iResult != 0) { 76 | printf("WSAStartup failed: %d\n", iResult); 77 | return false; 78 | } 79 | 80 | struct addrinfo *result = NULL, *ptr = NULL, hints; 81 | ZeroMemory(&hints, sizeof(hints)); 82 | hints.ai_family = AF_UNSPEC; 83 | hints.ai_socktype = SOCK_STREAM; 84 | hints.ai_protocol = IPPROTO_TCP; 85 | 86 | // Resolve the server address and port 87 | iResult = getaddrinfo("127.0.0.1", "9988", &hints, &result); 88 | if (iResult != 0) { 89 | printf("getaddrinfo failed: %d\n", iResult); 90 | WSACleanup(); 91 | return false; 92 | } 93 | 94 | ptr = result; 95 | 96 | ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); 97 | if (ConnectSocket == INVALID_SOCKET) { 98 | printf("Error at socket(): %ld\n", WSAGetLastError()); 99 | freeaddrinfo(result); 100 | WSACleanup(); 101 | return false; 102 | } 103 | 104 | // Connect to server. 105 | iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 106 | if (iResult == SOCKET_ERROR) { 107 | closesocket(ConnectSocket); 108 | ConnectSocket = INVALID_SOCKET; 109 | } 110 | 111 | // Should really try the next address returned by getaddrinfo 112 | // if the connect call failed 113 | // But for this simple example we just free the resources 114 | // returned by getaddrinfo and print an error message 115 | 116 | freeaddrinfo(result); 117 | 118 | if (ConnectSocket == INVALID_SOCKET) { 119 | printf("Unable to connect to server!\n"); 120 | WSACleanup(); 121 | return false; 122 | } 123 | return true; 124 | } 125 | 126 | bool sendDataToSocket(uint8_t* dataBytes, uint32_t len) { 127 | int recvbuflen = DEFAULT_BUFLEN; 128 | 129 | const char *sendbuf = (char*)dataBytes; 130 | 131 | // Send an initial buffer 132 | int iResult = send(ConnectSocket, sendbuf, len, 0); 133 | if (iResult == SOCKET_ERROR) { 134 | printf("send failed: %d\n", WSAGetLastError()); 135 | //printf("tried: %i len: %i\n", dataBytes[0], len); 136 | closesocket(ConnectSocket); 137 | WSACleanup(); 138 | return false; 139 | } 140 | 141 | //printf("Bytes Sent: %ld\n", iResult); 142 | 143 | // shutdown the connection for sending since no more data will be sent 144 | // the client can still use the ConnectSocket for receiving data 145 | iResult = shutdown(ConnectSocket, SD_SEND); 146 | if (iResult == SOCKET_ERROR) { 147 | printf("shutdown failed: %d\n", WSAGetLastError()); 148 | closesocket(ConnectSocket); 149 | WSACleanup(); 150 | return false; 151 | } 152 | return true; 153 | } 154 | 155 | void closeSocketSPI() { 156 | closesocket(ConnectSocket); 157 | WSACleanup(); 158 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SSD1351 Driver Library 2 | Driver library for the SSD1351 128x128 RGB OLED Display intended for generic use with C in any microcontroller/device. 3 | Includes an emulator to run and test programs that use this library on Windows. 4 | 5 | *Remember to configure the ssd1351.h file GPIO, SPI definitions according to your own hardware* 6 | 7 | [Check the blog entry](https://gecko05.github.io/2019/06/23/rgb-library.html) 8 | 9 | Features: 10 | * Drawing sprites 11 | * Importing sprites from a .bmp file made in Aseprite 12 | * Formatted string printing 13 | * Drawing single pixels 14 | * Drawing lines 15 | * Drawing rectangles and filled rectangles 16 | * Drawing circles and filled circles 17 | * Display configuration 18 | * RGB color encoding 19 | * Screen emulator for Windows 20 | 21 | To Do: 22 | * Extend Display configurations such as color depth, frequency, etc. 23 | 24 | # Converting sprites 25 | Load a bitmap image created with Aseprite to the same folder where ConvertSprites.py is located, then call: 26 | ``` 27 | python3 ConvertSprites.py ".bmp"[, ".bmp", ...] 28 | ``` 29 | Loaded_sprites.c, Loaded_sprites.h and color_palette.c files will be generated with the converted sprites. 30 | 31 | Note that the color palette used in Aseprite will be translated to the equivalent colors under the library's color mode and this will be performed just once, so make sure to use the same palette across all the sprites. 32 | 33 | # Examples 34 | 35 | Check the releases to find a sample project that uses this library for the following boards: 36 | * [ST Nucleo L152RE](https://github.com/Gecko05/SSD1351-Driver-Library/releases) 37 | 38 | # Running the emulator 39 | 40 | An emulator written in Go is located under SSD1351_Emulator. To use it run the following command inside SSD1351_Emulator: 41 | ``` 42 | go run . 43 | ``` 44 | It will open a socket on port 9988 and listen for incoming screen data. To see it in action, simply compile and run the program under example_with_emulator_WIN. 45 | Note that this example program runs only on Windows. 46 | 47 | See the releases section if you're only interested in the binaries for both the demo program and the emulator. 48 | [Emulator and example binaries](https://github.com/Gecko05/SSD1351-Driver-Library/releases/tag/v1.1.0) 49 | 50 | # Demo 51 | 52 | Sample code includes three demos; printing, lines, circles and a sprite 53 | 54 | ``` 55 | #include "ssd1351.h" // Remember to configure this file to your own hardware 56 | #include "math.h" 57 | #include "stdlib.h" 58 | 59 | #define DEMO_RECTANGLES 60 | 61 | int main(){ 62 | SSD1351_init(); 63 | SSD1351_fill(COLOR_BLACK); 64 | SSD1351_update(); 65 | int r = 50; 66 | int g = 100; 67 | int b = 240; 68 | int gd = 1; 69 | #ifdef DEMO_CIRCLES 70 | int c0, c1, c2, c3, c4; 71 | c0 = 5; 72 | c1 = 25; 73 | c2 = 45; 74 | c3 = 65; 75 | c4 = 85; 76 | #endif // DEMO_CIRCLES 77 | while(1){ 78 | #ifdef DEMO_PRINT 79 | // D E M O P R I N T 80 | SSD1351_set_cursor(0, 0); 81 | SSD1351_printf(SSD1351_get_rgb(r, g, b), med_font, "Hello worldI spent \n%i %s\n", 17, "dollars"); 82 | SSD1351_printf(COLOR_RED, small_font, "\nfor this"); 83 | SSD1351_printf(SSD1351_get_rgb(245, 255, 20), big_font, "\nSSD1351"); 84 | if (gd){ 85 | g+=3; 86 | b-=3; 87 | } 88 | else{ 89 | g-=3; 90 | b+=3; 91 | } 92 | if( b <= 100){ 93 | gd = !gd; 94 | } 95 | else if (g <= 100){ 96 | gd = !gd; 97 | } 98 | #endif // DEMO_PRINT 99 | #ifdef DEMO_RECTANGLES 100 | // D E M O R E C T A N G L E S 101 | for (int i = 128; i > 0;i-=12){ 102 | SSD1351_draw_filled_rect( 64 - i/2, 64 - i/2, i, i, 0x1111 + rand()); 103 | } 104 | #endif // DEMO_RECTANGLES 105 | #ifdef DEMO_CIRCLES 106 | // D E M O C I R C L E S 107 | c0+=5; 108 | c1+=5; 109 | c2+=5; 110 | c3+=5; 111 | c4+=5; 112 | if (c0 > 90){ 113 | c0 = 5; 114 | } 115 | if (c1 > 90){ 116 | c1 = 5; 117 | } 118 | if (c2 > 90){ 119 | c2 = 5; 120 | } 121 | if (c3 > 90){ 122 | c3 = 5; 123 | } 124 | if (c4 > 90){ 125 | c4 = 5; 126 | } 127 | int arr[5] = {c0, c1, c2, c3, c4}; 128 | int blu[5] = {150, 190, 250, 190, 150}; 129 | int green[5] = {50, 80, 130, 80, 50}; 130 | int maxi, max = 0; 131 | for (int k = 0; k < 5; k++){ 132 | max = 0; 133 | for (int j = 0; j < 5; j++){ 134 | if (arr[j] > max){ 135 | max = arr[j]; 136 | maxi = j; 137 | } 138 | } 139 | SSD1351_draw_filled_circle(64, 64, arr[maxi], SSD1351_get_rgb(20, green[maxi], blu[maxi])); 140 | arr[maxi] = 0; 141 | } 142 | #endif // DEMO_CIRCLES 143 | // D E M O S P R I T E S 144 | #ifdef DEMO_SPRITES 145 | SSD1351_draw_sprite(0, 0, &sprite0); 146 | #endif // DEMO_SPRITES 147 | SSD1351_update(); 148 | HAL_Delay(33); 149 | } 150 | } 151 | ``` 152 | -------------------------------------------------------------------------------- /SSD1351_Emulator/go.sum: -------------------------------------------------------------------------------- 1 | eliasnaur.com/font v0.0.0-20220215125817-de715634c840 h1:HovVBbKkUnf7OFR0qZy1PRB5CIabj+k5VRUDiIboM9c= 2 | eliasnaur.com/font v0.0.0-20220215125817-de715634c840/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= 3 | gioui.org v0.0.0-20221004231135-80196f3c3ed3 h1:41UBL6RQpfauddgYpcIDLPxbHj/Sixa82dqWYdUdK4s= 4 | gioui.org v0.0.0-20221004231135-80196f3c3ed3/go.mod h1:GN091SCcGAfHfQiSOetXx7Abdy+8nmONj0ZN63Xxf7w= 5 | gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= 6 | gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 h1:AGDDxsJE1RpcXTAxPG2B4jrwVUJGFDjINIPi1jtO6pc= 7 | gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= 8 | gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y= 9 | gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= 10 | github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE= 11 | github.com/benoitkugler/textlayout v0.0.5/go.mod h1:puH4v13Uz7uIhIH0XMk5jgc8U3MXcn5r3VlV9K8n0D8= 12 | github.com/benoitkugler/textlayout v0.1.3 h1:Jv0E28xDkke3KrWle90yOLtBmZsUqXLBy70lZRfbKN0= 13 | github.com/benoitkugler/textlayout v0.1.3/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w= 14 | github.com/benoitkugler/textlayout-testdata v0.1.1 h1:AvFxBxpfrQd8v55qH59mZOJOQjtD6K2SFe9/HvnIbJk= 15 | github.com/gioui/uax v0.2.1-0.20220819135011-cda973fac06d h1:ro1W5kY1pVBLHy4GokZUfr9cl7ewZhAiT5WsXqFDYE4= 16 | github.com/gioui/uax v0.2.1-0.20220819135011-cda973fac06d/go.mod h1:b6uGh9ySJPVQG/RdiI88bE5sUGDk6vzzRujv1BAeuJc= 17 | github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b h1:WINlj3ANt+CVrO2B4NGDHRlPvEWZPxjhb7z+JKypwXI= 18 | github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b/go.mod h1:ZNYu5saGoMOqtkVH5T8onTwhzenDUVszI+5WFHJRaxQ= 19 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 20 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 21 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 22 | golang.org/x/exp/shiny v0.0.0-20220906200021-fcb1a314c389 h1:RJgV139fC8cnvcf8+MhE9Idc9wzOfUPhGY7q7R0YTvQ= 23 | golang.org/x/exp/shiny v0.0.0-20220906200021-fcb1a314c389/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8= 24 | golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 25 | golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= 26 | golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= 27 | golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= 28 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 29 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 30 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 31 | golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 32 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 33 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 34 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 35 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 36 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 37 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 38 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 39 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 40 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 41 | golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM= 42 | golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 43 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 44 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 45 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 46 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 47 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 48 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 49 | golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= 50 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 51 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 52 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 53 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 54 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 55 | -------------------------------------------------------------------------------- /src/ssd1351.h: -------------------------------------------------------------------------------- 1 | /*$T src/ssd1351.h GC 1.150 2023-03-18 10:52:22 */ 2 | 3 | //MIT License 4 | //Copyright (c) 2022 Jaime Centeno 5 | //Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 6 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation 7 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 8 | // to permit persons to whom the Software is furnished to do so, subject to the following conditions: 9 | //The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 11 | // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 12 | // OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 13 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 14 | #ifndef SSD1351_H 15 | #define SSD1351_H 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | 24 | #include "fonts.h" 25 | #include "sprites.h" 26 | #include "color_palette.h" 27 | 28 | /*------- CONFIGURE THIS TO YOUR OWN HARDWARE AND HARDWARE ABSTRACTION LAYER -------*/ 29 | 30 | // Provide your own HAL SPI Communication definitions in myHAL.h/myHAL.c as 31 | // SPI_TXByte(data) and SPI_TXBuffer(buffer, len) 32 | // and GPIO_SetPin(PORT, PIN) GPIO_ResetPin(PORT, PIN) 33 | #include "myHAL.h" 34 | 35 | // Define the ports and pins for your hardware 36 | // following your HAL ports/pins definitions 37 | // In this example: 38 | // PA8 = RESET PB2 = D/C# PB1 = CS 39 | 40 | #define RESET_PORT GPIOA 41 | #define RESET_PIN GPIO_PIN_8 42 | #define DC_PORT GPIOB 43 | #define DC_PIN GPIO_PIN_2 44 | #define CS_PORT GPIOB 45 | #define CS_PIN GPIO_PIN_1 46 | 47 | #define OLED_128x128 48 | 49 | // Definitions for SPI functions 50 | #define SSD1351_SendBuffer(buffer, len) SPI_TXBuffer(buffer, len) 51 | #define SSD1351_SendByte(data) SPI_TXByte(data) 52 | 53 | // Definitions for GPIO pin functions 54 | #define SSD1351_SetPin(PORT, PIN) GPIO_SetPin(PORT, PIN) 55 | #define SSD1351_ClearPin(PORT, PIN) GPIO_ResetPin(PORT, PIN) 56 | 57 | // Definition for delay function 58 | #define SSD1351_DelayMs(x) HAL_Delay(x) 59 | 60 | /*------------------- END OF HARDWARE CONFIGURATION ------------------------------- */ 61 | 62 | // Static definition for testing purposes on Ceedling 63 | #ifdef TEST 64 | #define STATIC 65 | #else 66 | #define STATIC static 67 | #endif // TEST 68 | #ifdef OLED_128x128 69 | #define DRAM_SIZE_8 32768 70 | #define DRAM_SIZE_16 16384 71 | #define COLUMNS 128 72 | #define ROWS 128 73 | #endif // OLED_128x128 74 | typedef union DisplayRAM 75 | { 76 | uint8_t byte[DRAM_SIZE_8]; 77 | uint16_t halfw[DRAM_SIZE_16]; 78 | } DRAM; 79 | 80 | // SSD1351 Commands 81 | #define SSD1351_CMD_SETCOLUMN 0x15 82 | #define SSD1351_CMD_SETROW 0x75 83 | #define SSD1351_CMD_WRITERAM 0x5C 84 | #define SSD1351_CMD_READRAM 0x5D 85 | #define SSD1351_CMD_SETREMAP 0xA0 86 | #define SSD1351_CMD_STARTLINE 0xA1 87 | #define SSD1351_CMD_DISPLAYOFFSET 0xA2 88 | #define SSD1351_CMD_DISPLAYALLOFF 0xA4 89 | #define SSD1351_CMD_DISPLAYALLON 0xA5 90 | #define SSD1351_CMD_NORMALDISPLAY 0xA6 91 | #define SSD1351_CMD_INVERTDISPLAY 0xA7 92 | #define SSD1351_CMD_FUNCTIONSELECT 0xAB 93 | #define SSD1351_CMD_DISPLAYOFF 0xAE 94 | #define SSD1351_CMD_DISPLAYON 0xAF 95 | #define SSD1351_CMD_PRECHARGE 0xB1 96 | #define SSD1351_CMD_DISPLAYENHANCE 0xB2 97 | #define SSD1351_CMD_CLOCKDIV 0xB3 98 | #define SSD1351_CMD_SETVSL 0xB4 99 | #define SSD1351_CMD_SETGPIO 0xB5 100 | #define SSD1351_CMD_PRECHARGE2 0xB6 101 | #define SSD1351_CMD_SETGRAY 0xB8 102 | #define SSD1351_CMD_USELUT 0xB9 103 | #define SSD1351_CMD_PRECHARGELEVEL 0xBB 104 | #define SSD1351_CMD_VCOMH 0xBE 105 | #define SSD1351_CMD_CONTRASTABC 0xC1 106 | #define SSD1351_CMD_CONTRASTMASTER 0xC7 107 | #define SSD1351_CMD_MUXRATIO 0xCA 108 | #define SSD1351_CMD_COMMANDLOCK 0xFD 109 | #define SSD1351_CMD_HORIZSCROLL 0x96 110 | #define SSD1351_CMD_STOPSCROLL 0x9E 111 | #define SSD1351_CMD_STARTSCROLL 0x9F 112 | 113 | // Some color definitions 114 | #define COLOR_BLUE 0x00F8 115 | #define COLOR_RED 0x1F00 116 | #define COLOR_GREEN 0xE007 117 | #define COLOR_YELLOW 0xFF07 118 | #define COLOR_PURPLE 0x1FF8 119 | #define COLOR_AQUA 0xE0FF 120 | #define COLOR_BLACK 0x0000 121 | #define COLOR_WHITE 0xFFFF 122 | 123 | #define SSD_PRINTF(...) SSD1351_printf(COLOR_WHITE, small_font, __VA_ARGS__) 124 | 125 | extern struct cursor SSD1351_cursor; 126 | 127 | uint16_t SSD1351_get_rgb(uint8_t r, uint8_t g, uint8_t b); 128 | 129 | void SSD1351_init(void); 130 | 131 | void SSD1351_stop(void); 132 | 133 | void SSD1351_turn_off(void); 134 | 135 | void SSD1351_fill(uint16_t color); 136 | 137 | void SSD1351_write_pixel(int16_t x, int16_t y, uint16_t color); 138 | 139 | void SSD1351_update(void); 140 | 141 | void SSD1351_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); 142 | 143 | void SSD1351_draw_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); 144 | 145 | void SSD1351_draw_filled_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); 146 | 147 | void SSD1351_draw_circle(int16_t xc, int16_t yc, uint16_t r, uint16_t color); 148 | 149 | void SSD1351_draw_filled_circle(int16_t xc, int16_t yc, uint16_t r, uint16_t color); 150 | 151 | void SSD1351_printf(uint16_t color, const font_t *font, const char *format, ...); 152 | 153 | void SSD1351_set_cursor(uint8_t x, uint8_t y); 154 | 155 | void SSD1351_draw_sprite(int16_t x, int16_t y, sprite *sp); 156 | #endif //SSD1351_H 157 | -------------------------------------------------------------------------------- /src/ssd1351.c: -------------------------------------------------------------------------------- 1 | /*$T src/ssd1351.c GC 1.150 2023-03-18 10:52:19 */ 2 | 3 | 4 | //MIT License 5 | //Copyright (c) 2022 Jaime Centeno 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 7 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation 8 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 9 | // to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | //The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 11 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 12 | // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 13 | // OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 14 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 | 16 | #include "ssd1351.h" 17 | 18 | /* Buffer to hold the Display RAM Data */ 19 | STATIC DRAM displayRAM; 20 | 21 | #define DRAM_16 displayRAM.halfw 22 | #define DRAM_8 displayRAM.byte 23 | 24 | /* Screen cursor for printing */ 25 | struct cursor 26 | { 27 | uint8_t x; 28 | uint8_t y; 29 | } SSD1351_cursor; 30 | 31 | /** 32 | * @brief Writes command to the SSD1351 OLED Display 33 | * @param cmd: command to send 34 | * @retval None 35 | */ 36 | STATIC void SSD1351_write_command(uint8_t cmd) 37 | { 38 | SSD1351_ClearPin(DC_PORT, DC_PIN); 39 | SSD1351_ClearPin(CS_PORT, CS_PIN); 40 | SSD1351_SendByte(cmd); 41 | SSD1351_SetPin(CS_PORT, CS_PIN); 42 | } 43 | 44 | /** 45 | * @brief Writes single byte data to the SSD1351 OLED Display 46 | * @param data: data byte to send 47 | * @retval None 48 | */ 49 | STATIC void SSD1351_write_data(uint8_t data) 50 | { 51 | SSD1351_SetPin(DC_PORT, DC_PIN); 52 | SSD1351_ClearPin(CS_PORT, CS_PIN); 53 | SSD1351_SendByte(data); 54 | SSD1351_SetPin(CS_PORT, CS_PIN); 55 | } 56 | 57 | /** 58 | * @brief Writes a data buffer of bytes to SSD1351 display 59 | * @param data: pointer to data buffer to send 60 | * @param len: integer with length of buffer to send 61 | * @retval None 62 | */ 63 | STATIC void SSD1351_write_data_buffer(uint8_t *data, uint32_t len) 64 | { 65 | SSD1351_SetPin(DC_PORT, DC_PIN); 66 | SSD1351_ClearPin(CS_PORT, CS_PIN); 67 | SSD1351_SendBuffer(DRAM_8, DRAM_SIZE_8); 68 | SSD1351_SetPin(CS_PORT, CS_PIN); 69 | } 70 | 71 | /* 72 | * @brief Converts from RGB to a single 16bit value 73 | * @param r: starting x coordinate 74 | * @para g: starting y coordinate 75 | * @param b: width of the rectangle 76 | * @reval 16bit value with the rgb color for display 77 | */ 78 | uint16_t SSD1351_get_rgb(uint8_t r, uint8_t g, uint8_t b) 79 | { 80 | uint16_t rgb_color = 0; 81 | rgb_color |= ((r / 8) << 8); 82 | rgb_color |= ((g / 4) >> 3); 83 | rgb_color |= (((g / 4) % 0x07) << 13); 84 | rgb_color |= ((b / 8) << 3); 85 | return rgb_color; 86 | } 87 | 88 | /** 89 | * @brief Initializes the SSD1351 OLED Display 90 | * @retval None 91 | */ 92 | void SSD1351_init(void) 93 | { 94 | SSD1351_SetPin(RESET_PORT, RESET_PIN); 95 | SSD1351_DelayMs(500); 96 | SSD1351_ClearPin(RESET_PORT, RESET_PIN); 97 | SSD1351_DelayMs(500); 98 | SSD1351_SetPin(RESET_PORT, RESET_PIN); 99 | SSD1351_DelayMs(500); 100 | SSD1351_write_command(SSD1351_CMD_COMMANDLOCK); 101 | SSD1351_write_data(0x12); 102 | SSD1351_write_command(SSD1351_CMD_COMMANDLOCK); 103 | SSD1351_write_data(0xB1); 104 | 105 | SSD1351_write_command(SSD1351_CMD_DISPLAYOFF); 106 | SSD1351_write_command(SSD1351_CMD_CLOCKDIV); 107 | SSD1351_write_data(0xF1); 108 | SSD1351_write_command(SSD1351_CMD_MUXRATIO); 109 | SSD1351_write_data(127); 110 | SSD1351_DelayMs(600); 111 | 112 | SSD1351_write_command(SSD1351_CMD_SETREMAP); 113 | SSD1351_write_data(0x20); 114 | 115 | SSD1351_write_command(SSD1351_CMD_SETCOLUMN); 116 | SSD1351_write_data(0x00); 117 | SSD1351_write_data(0x7F); 118 | 119 | SSD1351_write_command(SSD1351_CMD_SETROW); 120 | SSD1351_write_data(0x00); 121 | SSD1351_write_data(0x7F); 122 | 123 | SSD1351_write_command(SSD1351_CMD_STARTLINE); 124 | SSD1351_write_data(0x00); 125 | 126 | SSD1351_write_command(SSD1351_CMD_DISPLAYOFFSET); 127 | SSD1351_write_data(0x00); 128 | 129 | SSD1351_write_command(SSD1351_CMD_SETGPIO); 130 | SSD1351_write_data(0x00); 131 | 132 | SSD1351_write_command(SSD1351_CMD_FUNCTIONSELECT); 133 | SSD1351_write_data(0x01); 134 | 135 | SSD1351_write_command(SSD1351_CMD_PRECHARGE); 136 | SSD1351_write_data(0x32); 137 | 138 | SSD1351_write_command(SSD1351_CMD_VCOMH); 139 | SSD1351_write_data(0x05); 140 | 141 | SSD1351_write_command(SSD1351_CMD_NORMALDISPLAY); 142 | 143 | SSD1351_write_command(SSD1351_CMD_CONTRASTABC); 144 | SSD1351_write_data(0x8A); // Color A: Blue 145 | SSD1351_write_data(0x51); // Color B: Green 146 | SSD1351_write_data(0x8A); // Color C: Red 147 | SSD1351_write_command(SSD1351_CMD_CONTRASTMASTER); 148 | SSD1351_write_data(0x0F); 149 | 150 | SSD1351_write_command(SSD1351_CMD_SETVSL); 151 | SSD1351_write_data(0xA0); 152 | SSD1351_write_data(0xB5); 153 | SSD1351_write_data(0x55); 154 | 155 | SSD1351_write_command(SSD1351_CMD_PRECHARGE2); 156 | SSD1351_write_data(0x01); 157 | 158 | SSD1351_write_command(SSD1351_CMD_DISPLAYON); 159 | } 160 | 161 | /** 162 | * @brief Turns off the SSD1351 OLED Display 163 | * @retval None 164 | */ 165 | void SSD1351_stop(void) 166 | { 167 | SSD1351_write_command(SSD1351_CMD_DISPLAYOFF); 168 | } 169 | 170 | /** 171 | * @brief Turns off the SSD1351 OLED Display 172 | * @param color: Unsigned int16 containing color code 173 | * @retval None 174 | */ 175 | void SSD1351_fill(uint16_t color) 176 | { 177 | for(int i = 0; i < DRAM_SIZE_16; i++) 178 | { 179 | DRAM_16[i] = color; 180 | } 181 | 182 | //SSD1351_write_command(SSD1351_CMD_STOPSCROLL); 183 | } 184 | 185 | /** 186 | * @brief Updates the screen RAM 187 | * @retval None 188 | */ 189 | void SSD1351_update(void) 190 | { 191 | SSD1351_write_command(SSD1351_CMD_WRITERAM); 192 | SSD1351_write_data_buffer(DRAM_8, DRAM_SIZE_8); 193 | } 194 | 195 | /** 196 | * @brief Updates a specific area within the display 197 | * @retval None 198 | */ 199 | 200 | /*void SSD1351_update_area(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1){ 201 | SSD1351_write_command(SSD1351_CMD_SETCOLUMN); 202 | SSD1351_write_data(x0); 203 | SSD1351_write_data(y0); 204 | 205 | SSD1351_write_command(SSD1351_CMD_SETROW); 206 | SSD1351_write_data(x1); 207 | SSD1351_write_data(x0); 208 | 209 | int a0 = x0 + (y0 * 128); 210 | int a1 = x1 + (y1 * 128); 211 | 212 | SSD1351_write_command(SSD1351_CMD_WRITERAM); 213 | for (int i = a0; i < a1 * 2; i++){ 214 | SSD1351_write_data(DRAM_8[i]); 215 | } 216 | 217 | // Back to default settings 218 | 219 | SSD1351_write_command(SSD1351_CMD_SETCOLUMN); 220 | SSD1351_write_data(x0); 221 | SSD1351_write_data(y0); 222 | 223 | SSD1351_write_command(SSD1351_CMD_SETROW); 224 | SSD1351_write_data(x1); 225 | SSD1351_write_data(x0); 226 | }*/ 227 | 228 | /** 229 | * @brief Writes a pixel data to the screen RAM buffer 230 | * @param color: Unsigned int16 containing color code 231 | * @param x: Pixel's horizontal position 232 | * @param y: Pixel's vertical position 233 | * @retval None 234 | */ 235 | void SSD1351_write_pixel(int16_t x, int16_t y, uint16_t color) 236 | { 237 | if(x > 127 || y > 127 || x < 0 || y < 0) 238 | { 239 | return; 240 | } 241 | 242 | int a = (127 - x) + (y * 128); 243 | DRAM_16[a] = color; 244 | } 245 | 246 | /* LINE DRAWING FUNCTIONS */ 247 | STATIC void SSD1351_draw_line_low(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) 248 | { 249 | int16_t dx = x1 - x0; 250 | int16_t dy = y1 - y0; 251 | int16_t yi = 1; 252 | if(dy < 0) 253 | { 254 | yi = -1; 255 | dy = -dy; 256 | } 257 | 258 | int16_t D = 2 * dy - dx; 259 | int16_t y = y0; 260 | 261 | if(x0 < x1) 262 | { 263 | for(int16_t x = x0; x <= x1; x++) 264 | { 265 | SSD1351_write_pixel(x, y, color); 266 | if(D > 0) 267 | { 268 | y = y + yi; 269 | D = D - 2 * dx; 270 | } 271 | 272 | D = D + 2 * dy; 273 | } 274 | } 275 | else 276 | { 277 | for(int16_t x = x0; x >= x1; x--) 278 | { 279 | SSD1351_write_pixel(x, y, color); 280 | if(D > 0) 281 | { 282 | y = y + yi; 283 | D = D - 2 * dx; 284 | } 285 | 286 | D = D + 2 * dy; 287 | } 288 | } 289 | } 290 | 291 | /* */ 292 | STATIC void SSD1351_draw_line_high(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) 293 | { 294 | int16_t dx = x1 - x0; 295 | int16_t dy = y1 - y0; 296 | int16_t xi = 1; 297 | if(dx < 0) 298 | { 299 | xi = -1; 300 | dx = -dx; 301 | } 302 | 303 | int16_t D = 2 * dx - dy; 304 | int16_t x = x0; 305 | 306 | if(y0 < y1) 307 | { 308 | for(int16_t y = y0; y <= y1; y++) 309 | { 310 | SSD1351_write_pixel(x, y, color); 311 | if(D > 0) 312 | { 313 | x = x + xi; 314 | D = D - 2 * dy; 315 | } 316 | 317 | D = D + 2 * dx; 318 | } 319 | } 320 | else 321 | { 322 | for(int16_t y = y0; y >= y1; y--) 323 | { 324 | SSD1351_write_pixel(x, y, color); 325 | if(D > 0) 326 | { 327 | x = x + xi; 328 | D = D - 2 * dy; 329 | } 330 | 331 | D = D + 2 * dx; 332 | } 333 | } 334 | } 335 | 336 | /* 337 | * @brief Draws a line from specified parameters into display RAM 338 | * @param x0: starting x coordinate 339 | * @para y0: starting y coordinate 340 | * @param x1: ending x coordinate 341 | * @param y1: ending y coordinate 342 | * @color: color to use to draw the line 343 | * @reval None 344 | */ 345 | void SSD1351_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) 346 | { 347 | if(abs(y1 - y0) < abs(x1 - x0)) 348 | { 349 | if(x0 > x1) 350 | { 351 | SSD1351_draw_line_low(x1, y1, x0, y0, color); 352 | } 353 | else 354 | { 355 | SSD1351_draw_line_low(x0, y0, x1, y1, color); 356 | } 357 | } 358 | else 359 | { 360 | if(y0 > y1) 361 | { 362 | SSD1351_draw_line_high(x1, y1, x0, y0, color); 363 | } 364 | else 365 | { 366 | SSD1351_draw_line_high(x0, y0, x1, y1, color); 367 | } 368 | } 369 | 370 | return; 371 | } 372 | 373 | /* 374 | * @brief Draws a rectangle with specified dimensions into display RAM 375 | * @param x0: starting x coordinate 376 | * @para y0: starting y coordinate 377 | * @param w: width of the rectangle 378 | * @oaram h: height of the rectangle 379 | * @color: color for the border 380 | * @reval None 381 | */ 382 | void SSD1351_draw_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) 383 | { 384 | SSD1351_draw_line(x, y, x + w, y, color); 385 | SSD1351_draw_line(x + w, y, x + w, y + h, color); 386 | SSD1351_draw_line(x + w, y + h, x, y + h, color); 387 | SSD1351_draw_line(x, y + h, x, y, color); 388 | } 389 | 390 | /* 391 | * @brief Draws a filled rectangle with specified dimensions into display RAM 392 | * @param x0: starting x coordinate 393 | * @para y0: starting y coordinate 394 | * @param w: width of the rectangle 395 | * @oaram h: height of the rectangle 396 | * @oaram color: color for the rectangle 397 | * @reval None 398 | */ 399 | void SSD1351_draw_filled_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) 400 | { 401 | for(int i = x; i < x + w; i++) 402 | { 403 | for(int j = y; j < y + h; j++) 404 | { 405 | SSD1351_write_pixel(i, j, color); 406 | } 407 | } 408 | } 409 | 410 | /* 411 | * @brief Draws a rotated filled rectangle with specified dimensions into display RAM 412 | * @param xc: center x coordinate 413 | * @para yc: center y coordinate 414 | * @param w: width of the rectangle 415 | * @param h: height of the rectangle 416 | * @param r: rotation in degrees 417 | * @oaram color: color for the rectangle 418 | * @reval None 419 | */ 420 | 421 | /* 422 | void SSD1351_draw_rotated_rect(int16_t xc, int16_t yc, int16_t w, int16_t h, int16_t r, uint16_t color){ 423 | r = r % 90; 424 | int16_t hyp = sqrt((h * h)/4 + (w * w)/4); 425 | float wr = 45 + r; 426 | float rad = (wr/360)*M_PI; 427 | int16_t x0 = xc - (hyp * sin(rad)); 428 | int16_t y0 = yc + (hyp * cos(rad)); 429 | }*/ 430 | STATIC void draw_circle(int16_t xc, int16_t yc, int16_t x, int16_t y, uint16_t color) 431 | { 432 | SSD1351_write_pixel(xc + x, yc + y, color); 433 | SSD1351_write_pixel(xc - x, yc + y, color); 434 | SSD1351_write_pixel(xc + x, yc - y, color); 435 | SSD1351_write_pixel(xc - x, yc - y, color); 436 | SSD1351_write_pixel(xc + y, yc + x, color); 437 | SSD1351_write_pixel(xc - y, yc + x, color); 438 | SSD1351_write_pixel(xc + y, yc - x, color); 439 | SSD1351_write_pixel(xc - y, yc - x, color); 440 | } 441 | 442 | /* */ 443 | STATIC void draw_filled_circle(int16_t xc, int16_t yc, int16_t x, int16_t y, uint16_t color) 444 | { 445 | SSD1351_draw_line(xc - x, yc + y, xc + x, yc + y, color); 446 | SSD1351_draw_line(xc - x, yc - y, xc + x, yc - y, color); 447 | SSD1351_draw_line(xc - y, yc + x, xc + y, yc + x, color); 448 | SSD1351_draw_line(xc - y, yc - x, xc + y, yc - x, color); 449 | } 450 | 451 | /* 452 | * @brief Draws a cicle with specified origin and radius into display RAM 453 | * @param xc: integer for the x origin coordinate 454 | * @param yc: integer for the y origin coordinate 455 | * @param color: color for the border 456 | * @reval None 457 | */ 458 | void SSD1351_draw_circle(int16_t xc, int16_t yc, uint16_t r, uint16_t color) 459 | { 460 | int x = 0, y = r; 461 | int d = 3 - 2 * r; 462 | draw_circle(xc, yc, x, y, color); 463 | while(y >= x) 464 | { 465 | x++; 466 | if(d > 0) 467 | { 468 | y--; 469 | d = d + 4 * (x - y) + 10; 470 | } 471 | else 472 | { 473 | d = d + 4 * x + 6; 474 | } 475 | 476 | draw_circle(xc, yc, x, y, color); 477 | } 478 | } 479 | 480 | /* 481 | * @brief Draws a cicle with specified origin and radius into display RAM 482 | * @param xc: integer for the x origin coordinate 483 | * @param yc: integer for the y origin coordinate 484 | * @param color: color for the circle 485 | * @reval None 486 | */ 487 | void SSD1351_draw_filled_circle(int16_t xc, int16_t yc, uint16_t r, uint16_t color) 488 | { 489 | int x = 0, y = r; 490 | int d = 3 - 2 * r; 491 | draw_filled_circle(xc, yc, x, y, color); 492 | while(y >= x) 493 | { 494 | x++; 495 | if(d > 0) 496 | { 497 | y--; 498 | d = d + 4 * (x - y) + 10; 499 | } 500 | else 501 | { 502 | d = d + 4 * x + 6; 503 | } 504 | 505 | draw_filled_circle(xc, yc, x, y, color); 506 | } 507 | } 508 | 509 | /* */ 510 | STATIC void SSD1351_write_char(uint16_t color, const font_t *font, char c) 511 | { 512 | if(!font || !font->data || (COLUMNS <= SSD1351_cursor.x + font->width) || (ROWS <= SSD1351_cursor.y + font->height)) 513 | { 514 | return; 515 | } 516 | 517 | if(c == '\n') 518 | { 519 | SSD1351_cursor.x = 127; 520 | } 521 | else 522 | { 523 | for(int i = 0; i < font->height; i++) 524 | { 525 | uint16_t fd; 526 | uint16_t col = ((c - font->first) * font->height); 527 | if(font->bits == 8) 528 | { 529 | const uint8_t *fdata = (uint8_t *) font->data; 530 | fd = fdata[col + i]; 531 | } 532 | else 533 | { 534 | const uint16_t *fdata = (uint16_t *) font->data; 535 | fd = fdata[col + i]; 536 | } 537 | 538 | for(int j = 0; j < font->width; j++) 539 | { 540 | if((fd << j) & (0x1 << font->bits - 1)) 541 | { 542 | SSD1351_write_pixel(SSD1351_cursor.x + j, SSD1351_cursor.y + i, color); 543 | } 544 | } 545 | } 546 | } 547 | 548 | SSD1351_cursor.x += font->width; 549 | if((SSD1351_cursor.x + font->width >= 127) & (SSD1351_cursor.y + font->height <= 127)) 550 | { 551 | SSD1351_cursor.y = SSD1351_cursor.y + font->height + 2; 552 | SSD1351_cursor.x = 0; 553 | } 554 | 555 | return; 556 | } 557 | 558 | /* */ 559 | STATIC void SSD1351_write_string(uint16_t color, const font_t *font, char *line) 560 | { 561 | if(line == NULL) 562 | { 563 | return; 564 | } 565 | 566 | while(*line != 0) 567 | { 568 | SSD1351_write_char(color, font, *line); 569 | line++; 570 | } 571 | } 572 | 573 | /* */ 574 | STATIC void SSD1351_write_int(uint16_t color, const font_t *font, int8_t n) 575 | { 576 | char number[5]; 577 | sprintf(number, "%i", n); 578 | SSD1351_write_string(color, font, number); 579 | } 580 | 581 | /* 582 | * @brief Prints a formatted string to the display 583 | * @param color: unsigned integer for the color of the string 584 | * @param font: structure holding the type of font 585 | * @param format: formatted string 586 | */ 587 | void SSD1351_printf(uint16_t color, const font_t *font, const char *format, ...) 588 | { 589 | if(format == NULL) 590 | { 591 | return; 592 | } 593 | 594 | va_list valist; 595 | va_start(valist, format); 596 | while(*format != 0) 597 | { 598 | if(*format != '%') 599 | { 600 | SSD1351_write_char(color, font, *format); 601 | format++; 602 | } 603 | else 604 | { 605 | format++; 606 | switch(*format) 607 | { 608 | case 's': SSD1351_write_string(color, font, va_arg(valist, char *)); break; 609 | case 'c': SSD1351_write_char(color, font, va_arg(valist, int)); //? 610 | break; 611 | case 'i': SSD1351_write_int(color, font, (int8_t) va_arg(valist, int)); break; 612 | default: break; 613 | } 614 | 615 | format++; 616 | } 617 | } 618 | } 619 | 620 | /* 621 | * @brief Sets the printing cursor to a positioin 622 | * @param x: integer for the x position for the cursor 623 | * @param y: integer for the y position for the cursor 624 | */ 625 | void SSD1351_set_cursor(uint8_t x, uint8_t y) 626 | { 627 | SSD1351_cursor.x = x; 628 | SSD1351_cursor.y = y; 629 | } 630 | 631 | /* 632 | * @brief Draws a sprite 633 | * @param sp: pointer to struct holding sprite data 634 | */ 635 | void SSD1351_draw_sprite(int16_t x, int16_t y, sprite *sp) 636 | { 637 | for(int i = 0; i < sp->width; i++) 638 | { 639 | for(int j = 0; j < sp->height; j++) 640 | { 641 | uint16_t color = color_palette[sp->content[i + (j * sp->width)]]; 642 | if(color != 0) 643 | { 644 | SSD1351_write_pixel(x + i, y + j, color); 645 | } 646 | } 647 | } 648 | } 649 | -------------------------------------------------------------------------------- /example_with_emulator_WIN/ibm_vga.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | uint8_t IBM_VGA_8x14[3584] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x7e, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0x7e, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 13 | 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 14 | 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 15 | 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 19 | 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x02, 0x06, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 25 | 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 28 | 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37 | 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 38 | 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 40 | 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x66, 0xc6, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 43 | 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 53 | 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 57 | 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 58 | 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 61 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 62 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 66 | 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 69 | 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 73 | 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 74 | 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0xe6, 0x66, 0x6c, 0x6c, 0x78, 0x6c, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, 86 | 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 91 | 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x7c, 0x6c, 0x00, 0x00, 0x00, 92 | 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 93 | 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 94 | 0x00, 0x00, 0xfe, 0xc6, 0x8c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 95 | 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 96 | 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 97 | 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 98 | 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 99 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 100 | 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 102 | 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 104 | 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 106 | 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 107 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 108 | 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 109 | 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 110 | 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 111 | 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 112 | 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 113 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 114 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 116 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 117 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, 118 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 119 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x70, 0x1c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 120 | 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 121 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 122 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 123 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 124 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 125 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 126 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x66, 0xfe, 0x00, 0x00, 0x00, 127 | 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 128 | 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 129 | 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 130 | 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 | 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 132 | 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 133 | 0x00, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 134 | 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 135 | 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 136 | 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 137 | 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 138 | 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 139 | 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 140 | 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 141 | 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 142 | 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 143 | 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 144 | 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 145 | 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 146 | 0x00, 0xc6, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x00, 0x00, 0x00, 147 | 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x00, 0x00, 0x00, 148 | 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 149 | 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 150 | 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 151 | 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 152 | 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 153 | 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 154 | 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 155 | 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 156 | 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 157 | 0x00, 0xc6, 0xc6, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 158 | 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 159 | 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 160 | 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 161 | 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 162 | 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 163 | 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 164 | 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 165 | 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 166 | 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 167 | 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 168 | 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 169 | 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0x00, 0x00, 0x00, 170 | 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 171 | 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 | 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 175 | 0x00, 0xc0, 0xc0, 0xc6, 0xcc, 0xd8, 0x30, 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 176 | 0x00, 0xc0, 0xc0, 0xc6, 0xcc, 0xd8, 0x30, 0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 177 | 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 178 | 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 179 | 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 180 | 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 181 | 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 182 | 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 183 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 184 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 185 | 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 186 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 189 | 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 190 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 192 | 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 193 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 194 | 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 196 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 199 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 201 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 202 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 203 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 204 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 205 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 206 | 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 208 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 210 | 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 211 | 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 212 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 215 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 219 | 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 220 | 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 221 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 223 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 225 | 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 226 | 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 227 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 229 | 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0x40, 0x00, 230 | 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 231 | 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 232 | 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 234 | 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 235 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 236 | 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 237 | 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 238 | 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 239 | 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 240 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 241 | 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 242 | 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 243 | 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 244 | 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 245 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 246 | 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 247 | 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 248 | 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 249 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 250 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 251 | 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 252 | 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 255 | 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 256 | 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 257 | 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 258 | 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 260 | }; -------------------------------------------------------------------------------- /src/fonts.c: -------------------------------------------------------------------------------- 1 | /*Copyright (c) 2016 Olivier Van den Eede - ovde.be 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 4 | and associated documentation files (the “Software”), to deal in the Software without 5 | restriction, including without limitation the rights to use, copy, modify, merge, publish, 6 | distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 7 | Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies 10 | or substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 13 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 14 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 15 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 16 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ 17 | 18 | #include "fonts.h" 19 | 20 | static const uint16_t Font7x10 [] = { 21 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // sp 22 | 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // ! 23 | 0x2800, 0x2800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // " 24 | 0x2400, 0x2400, 0x7C00, 0x2400, 0x4800, 0x7C00, 0x4800, 0x4800, 0x0000, 0x0000, // # 25 | 0x3800, 0x5400, 0x5000, 0x3800, 0x1400, 0x5400, 0x5400, 0x3800, 0x1000, 0x0000, // $ 26 | 0x2000, 0x5400, 0x5800, 0x3000, 0x2800, 0x5400, 0x1400, 0x0800, 0x0000, 0x0000, // % 27 | 0x1000, 0x2800, 0x2800, 0x1000, 0x3400, 0x4800, 0x4800, 0x3400, 0x0000, 0x0000, // & 28 | 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ' 29 | 0x0800, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x0800, // ( 30 | 0x2000, 0x1000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1000, 0x2000, // ) 31 | 0x1000, 0x3800, 0x1000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // * 32 | 0x0000, 0x0000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, // + 33 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // , 34 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000, // - 35 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // . 36 | 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, // / 37 | 0x3800, 0x4400, 0x4400, 0x5400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 0 38 | 0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // 1 39 | 0x3800, 0x4400, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x7C00, 0x0000, 0x0000, // 2 40 | 0x3800, 0x4400, 0x0400, 0x1800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 3 41 | 0x0800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7C00, 0x0800, 0x0800, 0x0000, 0x0000, // 4 42 | 0x7C00, 0x4000, 0x4000, 0x7800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 5 43 | 0x3800, 0x4400, 0x4000, 0x7800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 6 44 | 0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, // 7 45 | 0x3800, 0x4400, 0x4400, 0x3800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // 8 46 | 0x3800, 0x4400, 0x4400, 0x4400, 0x3C00, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // 9 47 | 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, // : 48 | 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, // ; 49 | 0x0000, 0x0000, 0x0C00, 0x3000, 0x4000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x0000, // < 50 | 0x0000, 0x0000, 0x0000, 0x7C00, 0x0000, 0x7C00, 0x0000, 0x0000, 0x0000, 0x0000, // = 51 | 0x0000, 0x0000, 0x6000, 0x1800, 0x0400, 0x1800, 0x6000, 0x0000, 0x0000, 0x0000, // > 52 | 0x3800, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000, // ? 53 | 0x3800, 0x4400, 0x4C00, 0x5400, 0x5C00, 0x4000, 0x4000, 0x3800, 0x0000, 0x0000, // @ 54 | 0x1000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7C00, 0x4400, 0x4400, 0x0000, 0x0000, // A 55 | 0x7800, 0x4400, 0x4400, 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x0000, 0x0000, // B 56 | 0x3800, 0x4400, 0x4000, 0x4000, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // C 57 | 0x7000, 0x4800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4800, 0x7000, 0x0000, 0x0000, // D 58 | 0x7C00, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // E 59 | 0x7C00, 0x4000, 0x4000, 0x7800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // F 60 | 0x3800, 0x4400, 0x4000, 0x4000, 0x5C00, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // G 61 | 0x4400, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // H 62 | 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3800, 0x0000, 0x0000, // I 63 | 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // J 64 | 0x4400, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // K 65 | 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000, // L 66 | 0x4400, 0x6C00, 0x6C00, 0x5400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // M 67 | 0x4400, 0x6400, 0x6400, 0x5400, 0x5400, 0x4C00, 0x4C00, 0x4400, 0x0000, 0x0000, // N 68 | 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // O 69 | 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // P 70 | 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x5400, 0x3800, 0x0400, 0x0000, // Q 71 | 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000, // R 72 | 0x3800, 0x4400, 0x4000, 0x3000, 0x0800, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000, // S 73 | 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // T 74 | 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // U 75 | 0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000, // V 76 | 0x4400, 0x4400, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // W 77 | 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, // X 78 | 0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // Y 79 | 0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // Z 80 | 0x1800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1800, // [ 81 | 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000, /* \ */ 82 | 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3000, // ] 83 | 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ^ 84 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, // _ 85 | 0x2000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ` 86 | 0x0000, 0x0000, 0x3800, 0x4400, 0x3C00, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // a 87 | 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000, // b 88 | 0x0000, 0x0000, 0x3800, 0x4400, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // c 89 | 0x0400, 0x0400, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // d 90 | 0x0000, 0x0000, 0x3800, 0x4400, 0x7C00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000, // e 91 | 0x0C00, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // f 92 | 0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x7800, // g 93 | 0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // h 94 | 0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // i 95 | 0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xE000, // j 96 | 0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x0000, 0x0000, // k 97 | 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, // l 98 | 0x0000, 0x0000, 0x7800, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x0000, 0x0000, // m 99 | 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000, // n 100 | 0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000, // o 101 | 0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000, // p 102 | 0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x0400, // q 103 | 0x0000, 0x0000, 0x5800, 0x6400, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000, // r 104 | 0x0000, 0x0000, 0x3800, 0x4400, 0x3000, 0x0800, 0x4400, 0x3800, 0x0000, 0x0000, // s 105 | 0x2000, 0x2000, 0x7800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x0000, 0x0000, // t 106 | 0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000, // u 107 | 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000, // v 108 | 0x0000, 0x0000, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000, // w 109 | 0x0000, 0x0000, 0x4400, 0x2800, 0x1000, 0x1000, 0x2800, 0x4400, 0x0000, 0x0000, // x 110 | 0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x6000, // y 111 | 0x0000, 0x0000, 0x7C00, 0x0800, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000, // z 112 | 0x1800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1800, // { 113 | 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, // | 114 | 0x3000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x3000, // } 115 | 0x0000, 0x0000, 0x0000, 0x7400, 0x4C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ~ 116 | }; 117 | 118 | static const uint16_t Font11x18 [] = { 119 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // sp 120 | 0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // ! 121 | 0x0000, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // " 122 | 0x0000, 0x1980, 0x1980, 0x1980, 0x1980, 0x7FC0, 0x7FC0, 0x1980, 0x3300, 0x7FC0, 0x7FC0, 0x3300, 0x3300, 0x3300, 0x3300, 0x0000, 0x0000, 0x0000, // # 123 | 0x0000, 0x1E00, 0x3F00, 0x7580, 0x6580, 0x7400, 0x3C00, 0x1E00, 0x0700, 0x0580, 0x6580, 0x6580, 0x7580, 0x3F00, 0x1E00, 0x0400, 0x0400, 0x0000, // $ 124 | 0x0000, 0x7000, 0xD800, 0xD840, 0xD8C0, 0xD980, 0x7300, 0x0600, 0x0C00, 0x1B80, 0x36C0, 0x66C0, 0x46C0, 0x06C0, 0x0380, 0x0000, 0x0000, 0x0000, // % 125 | 0x0000, 0x1E00, 0x3F00, 0x3300, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x3CC0, 0x66C0, 0x6380, 0x6180, 0x6380, 0x3EC0, 0x1C80, 0x0000, 0x0000, 0x0000, // & 126 | 0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ' 127 | 0x0080, 0x0100, 0x0300, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0300, 0x0100, 0x0080, // ( 128 | 0x2000, 0x1000, 0x1800, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x1800, 0x1000, 0x2000, // ) 129 | 0x0000, 0x0C00, 0x2D00, 0x3F00, 0x1E00, 0x3300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // * 130 | 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // + 131 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800, // , 132 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1E00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // - 133 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // . 134 | 0x0000, 0x0300, 0x0300, 0x0300, 0x0600, 0x0600, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, // / 135 | 0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6D80, 0x6D80, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 0 136 | 0x0000, 0x0600, 0x0E00, 0x1E00, 0x3600, 0x2600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // 1 137 | 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // 2 138 | 0x0000, 0x1C00, 0x3E00, 0x6300, 0x6300, 0x0300, 0x0E00, 0x0E00, 0x0300, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 3 139 | 0x0000, 0x0600, 0x0E00, 0x0E00, 0x1E00, 0x1E00, 0x1600, 0x3600, 0x3600, 0x6600, 0x7F80, 0x7F80, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // 4 140 | 0x0000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x6380, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 5 141 | 0x0000, 0x1E00, 0x3F00, 0x3380, 0x6180, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x3380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 6 142 | 0x0000, 0x7F80, 0x7F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0800, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000, // 7 143 | 0x0000, 0x1E00, 0x3F00, 0x6380, 0x6180, 0x6180, 0x2100, 0x1E00, 0x3F00, 0x6180, 0x6180, 0x6180, 0x6180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 8 144 | 0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6180, 0x7300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // 9 145 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // : 146 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800, // ; 147 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0380, 0x0E00, 0x3800, 0x6000, 0x3800, 0x0E00, 0x0380, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // < 148 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // = 149 | 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x7000, 0x1C00, 0x0700, 0x0180, 0x0700, 0x1C00, 0x7000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // > 150 | 0x0000, 0x1F00, 0x3F80, 0x71C0, 0x60C0, 0x00C0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // ? 151 | 0x0000, 0x1E00, 0x3F00, 0x3180, 0x7180, 0x6380, 0x6F80, 0x6D80, 0x6D80, 0x6F80, 0x6780, 0x6000, 0x3200, 0x3E00, 0x1C00, 0x0000, 0x0000, 0x0000, // @ 152 | 0x0000, 0x0E00, 0x0E00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x3180, 0x3180, 0x3F80, 0x3F80, 0x3180, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000, // A 153 | 0x0000, 0x7C00, 0x7E00, 0x6300, 0x6300, 0x6300, 0x6300, 0x7E00, 0x7E00, 0x6300, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x0000, 0x0000, 0x0000, // B 154 | 0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // C 155 | 0x0000, 0x7C00, 0x7F00, 0x6300, 0x6380, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6300, 0x6300, 0x7E00, 0x7C00, 0x0000, 0x0000, 0x0000, // D 156 | 0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // E 157 | 0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, // F 158 | 0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6380, 0x6380, 0x6180, 0x6180, 0x3180, 0x3F80, 0x1E00, 0x0000, 0x0000, 0x0000, // G 159 | 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7F80, 0x7F80, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // H 160 | 0x0000, 0x3F00, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3F00, 0x3F00, 0x0000, 0x0000, 0x0000, // I 161 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // J 162 | 0x0000, 0x60C0, 0x6180, 0x6300, 0x6600, 0x6600, 0x6C00, 0x7800, 0x7C00, 0x6600, 0x6600, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // K 163 | 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // L 164 | 0x0000, 0x71C0, 0x71C0, 0x7BC0, 0x7AC0, 0x6AC0, 0x6AC0, 0x6EC0, 0x64C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000, // M 165 | 0x0000, 0x7180, 0x7180, 0x7980, 0x7980, 0x7980, 0x6D80, 0x6D80, 0x6D80, 0x6580, 0x6780, 0x6780, 0x6780, 0x6380, 0x6380, 0x0000, 0x0000, 0x0000, // N 166 | 0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // O 167 | 0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, // P 168 | 0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6580, 0x6780, 0x3300, 0x3F80, 0x1E40, 0x0000, 0x0000, 0x0000, // Q 169 | 0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6600, 0x6300, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // R 170 | 0x0000, 0x0E00, 0x1F00, 0x3180, 0x3180, 0x3000, 0x3800, 0x1E00, 0x0700, 0x0380, 0x6180, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // S 171 | 0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // T 172 | 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // U 173 | 0x0000, 0x60C0, 0x60C0, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x0400, 0x0000, 0x0000, 0x0000, // V 174 | 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xCCC0, 0x4C80, 0x4C80, 0x5E80, 0x5280, 0x5280, 0x7380, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // W 175 | 0x0000, 0xC0C0, 0x6080, 0x6180, 0x3300, 0x3B00, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x1F00, 0x3B00, 0x7180, 0x6180, 0xC0C0, 0x0000, 0x0000, 0x0000, // X 176 | 0x0000, 0xC0C0, 0x6180, 0x6180, 0x3300, 0x3300, 0x1E00, 0x1E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // Y 177 | 0x0000, 0x3F80, 0x3F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, // Z 178 | 0x0F00, 0x0F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0F00, 0x0F00, // [ 179 | 0x0000, 0x1800, 0x1800, 0x1800, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, 0x0300, 0x0000, 0x0000, 0x0000, /* \ */ 180 | 0x1E00, 0x1E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x1E00, 0x1E00, // ] 181 | 0x0000, 0x0C00, 0x0C00, 0x1E00, 0x1200, 0x3300, 0x3300, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ^ 182 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFE0, 0x0000, // _ 183 | 0x0000, 0x3800, 0x1800, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ` 184 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x3F80, 0x6180, 0x0180, 0x1F80, 0x3F80, 0x6180, 0x6380, 0x7F80, 0x38C0, 0x0000, 0x0000, 0x0000, // a 185 | 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x0000, 0x0000, 0x0000, // b 186 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6000, 0x6000, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // c 187 | 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0000, 0x0000, 0x0000, // d 188 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x7F80, 0x7F80, 0x6000, 0x7180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // e 189 | 0x0000, 0x07C0, 0x0FC0, 0x0C00, 0x0C00, 0x7F80, 0x7F80, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, // f 190 | 0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6380, 0x7F00, 0x3E00, // g 191 | 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // h 192 | 0x0000, 0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // i 193 | 0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x4600, 0x7E00, 0x3C00, // j 194 | 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x6300, 0x6600, 0x6C00, 0x7C00, 0x7600, 0x6300, 0x6300, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000, // k 195 | 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, // l 196 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xFFC0, 0xCEC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0x0000, 0x0000, 0x0000, // m 197 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, // n 198 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000, // o 199 | 0x0000, 0x0000, 0x0000, 0x0000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x6000, 0x6000, 0x6000, 0x6000, // p 200 | 0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x0180, 0x0180, 0x0180, // q 201 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6700, 0x3F80, 0x3900, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000, 0x0000, // r 202 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F80, 0x6180, 0x6000, 0x7F00, 0x3F80, 0x0180, 0x6180, 0x7F00, 0x1E00, 0x0000, 0x0000, 0x0000, // s 203 | 0x0000, 0x0000, 0x0800, 0x1800, 0x1800, 0x7F00, 0x7F00, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1F80, 0x0F80, 0x0000, 0x0000, 0x0000, // t 204 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F80, 0x3D80, 0x0000, 0x0000, 0x0000, // u 205 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0600, 0x0000, 0x0000, 0x0000, // v 206 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xDD80, 0xDD80, 0x5500, 0x5500, 0x5500, 0x7700, 0x7700, 0x2200, 0x2200, 0x0000, 0x0000, 0x0000, // w 207 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x3300, 0x3300, 0x6180, 0x0000, 0x0000, 0x0000, // x 208 | 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x3180, 0x3300, 0x3300, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x1C00, 0x7C00, 0x7000, // y 209 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FC0, 0x7FC0, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x7FC0, 0x7FC0, 0x0000, 0x0000, 0x0000, // z 210 | 0x0380, 0x0780, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0E00, 0x1C00, 0x1C00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0780, 0x0380, // { 211 | 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, // | 212 | 0x3800, 0x3C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0E00, 0x0700, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3C00, 0x3800, // } 213 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3880, 0x7F80, 0x4700, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ~ 214 | }; 215 | 216 | static const uint16_t Font16x26 [] = { 217 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [ ] 218 | 0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x03C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [!] 219 | 0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = ["] 220 | 0x01CE,0x03CE,0x03DE,0x039E,0x039C,0x079C,0x3FFF,0x7FFF,0x0738,0x0F38,0x0F78,0x0F78,0x0E78,0xFFFF,0xFFFF,0x1EF0,0x1CF0,0x1CE0,0x3CE0,0x3DE0,0x39E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [#] 221 | 0x03FC,0x0FFE,0x1FEE,0x1EE0,0x1EE0,0x1EE0,0x1EE0,0x1FE0,0x0FE0,0x07E0,0x03F0,0x01FC,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x3DFE,0x3FFC,0x0FF0,0x01E0,0x01E0,0x0000,0x0000,0x0000, // Ascii = [$] 222 | 0x3E03,0xF707,0xE78F,0xE78E,0xE39E,0xE3BC,0xE7B8,0xE7F8,0xF7F0,0x3FE0,0x01C0,0x03FF,0x07FF,0x07F3,0x0FF3,0x1EF3,0x3CF3,0x38F3,0x78F3,0xF07F,0xE03F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [%] 223 | 0x07E0,0x0FF8,0x0F78,0x1F78,0x1F78,0x1F78,0x0F78,0x0FF0,0x0FE0,0x1F80,0x7FC3,0xFBC3,0xF3E7,0xF1F7,0xF0F7,0xF0FF,0xF07F,0xF83E,0x7C7F,0x3FFF,0x1FEF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [&] 224 | 0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = ['] 225 | 0x003F,0x007C,0x01F0,0x01E0,0x03C0,0x07C0,0x0780,0x0780,0x0F80,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F80,0x0780,0x0780,0x07C0,0x03C0,0x01E0,0x01F0,0x007C,0x003F,0x000F,0x0000, // Ascii = [(] 226 | 0x7E00,0x1F00,0x07C0,0x03C0,0x01E0,0x01F0,0x00F0,0x00F0,0x00F8,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x00F8,0x00F0,0x00F0,0x01F0,0x01E0,0x03C0,0x07C0,0x1F00,0x7E00,0x7800,0x0000, // Ascii = [)] 227 | 0x03E0,0x03C0,0x01C0,0x39CE,0x3FFF,0x3F7F,0x0320,0x0370,0x07F8,0x0F78,0x1F3C,0x0638,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [*] 228 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0xFFFF,0xFFFF,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [+] 229 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x01C0,0x0380, // Ascii = [,] 230 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [-] 231 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [.] 232 | 0x000F,0x000F,0x001E,0x001E,0x003C,0x003C,0x0078,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0780,0x0F00,0x0F00,0x1E00,0x1E00,0x3C00,0x3C00,0x7800,0x7800,0xF000,0x0000, // Ascii = [/] 233 | 0x07F0,0x0FF8,0x1F7C,0x3E3E,0x3C1E,0x7C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x7C1F,0x3C1E,0x3E3E,0x1F7C,0x0FF8,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [0] 234 | 0x00F0,0x07F0,0x3FF0,0x3FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [1] 235 | 0x0FE0,0x3FF8,0x3C7C,0x003C,0x003E,0x003E,0x003E,0x003C,0x003C,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0780,0x0F00,0x1E00,0x3E00,0x3C00,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [2] 236 | 0x0FF0,0x1FF8,0x1C7C,0x003E,0x003E,0x003E,0x003C,0x003C,0x00F8,0x0FF0,0x0FF8,0x007C,0x003E,0x001E,0x001E,0x001E,0x001E,0x003E,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [3] 237 | 0x0078,0x00F8,0x00F8,0x01F8,0x03F8,0x07F8,0x07F8,0x0F78,0x1E78,0x1E78,0x3C78,0x7878,0x7878,0xFFFF,0xFFFF,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [4] 238 | 0x1FFC,0x1FFC,0x1FFC,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FE0,0x1FF8,0x00FC,0x007C,0x003E,0x003E,0x001E,0x003E,0x003E,0x003C,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [5] 239 | 0x01FC,0x07FE,0x0F8E,0x1F00,0x1E00,0x3E00,0x3C00,0x3C00,0x3DF8,0x3FFC,0x7F3E,0x7E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3E0F,0x1E1F,0x1F3E,0x0FFC,0x03F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [6] 240 | 0x3FFF,0x3FFF,0x3FFF,0x000F,0x001E,0x001E,0x003C,0x0038,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0F80,0x0F80,0x0F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [7] 241 | 0x07F8,0x0FFC,0x1F3E,0x1E1E,0x3E1E,0x3E1E,0x1E1E,0x1F3C,0x0FF8,0x07F0,0x0FF8,0x1EFC,0x3E3E,0x3C1F,0x7C1F,0x7C0F,0x7C0F,0x3C1F,0x3F3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [8] 242 | 0x07F0,0x0FF8,0x1E7C,0x3C3E,0x3C1E,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x3C1F,0x3E3F,0x1FFF,0x07EF,0x001F,0x001E,0x001E,0x003E,0x003C,0x38F8,0x3FF0,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [9] 243 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [:] 244 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x03C0,0x0380, // Ascii = [;] 245 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000F,0x003F,0x00FC,0x03F0,0x0FC0,0x3F00,0xFE00,0x3F00,0x0FC0,0x03F0,0x00FC,0x003F,0x000F,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [<] 246 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [=] 247 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xE000,0xF800,0x7E00,0x1F80,0x07E0,0x01F8,0x007E,0x001F,0x007E,0x01F8,0x07E0,0x1F80,0x7E00,0xF800,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [>] 248 | 0x1FF0,0x3FFC,0x383E,0x381F,0x381F,0x001E,0x001E,0x003C,0x0078,0x00F0,0x01E0,0x03C0,0x03C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [?] 249 | 0x03F8,0x0FFE,0x1F1E,0x3E0F,0x3C7F,0x78FF,0x79EF,0x73C7,0xF3C7,0xF38F,0xF38F,0xF38F,0xF39F,0xF39F,0x73FF,0x7BFF,0x79F7,0x3C00,0x1F1C,0x0FFC,0x03F8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [@] 250 | 0x0000,0x0000,0x0000,0x03E0,0x03E0,0x07F0,0x07F0,0x07F0,0x0F78,0x0F78,0x0E7C,0x1E3C,0x1E3C,0x3C3E,0x3FFE,0x3FFF,0x781F,0x780F,0xF00F,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [A] 251 | 0x0000,0x0000,0x0000,0x3FF8,0x3FFC,0x3C3E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7C,0x3FF0,0x3FF8,0x3C7E,0x3C1F,0x3C1F,0x3C0F,0x3C0F,0x3C1F,0x3FFE,0x3FF8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [B] 252 | 0x0000,0x0000,0x0000,0x01FF,0x07FF,0x1F87,0x3E00,0x3C00,0x7C00,0x7800,0x7800,0x7800,0x7800,0x7800,0x7C00,0x7C00,0x3E00,0x3F00,0x1F83,0x07FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [C] 253 | 0x0000,0x0000,0x0000,0x7FF0,0x7FFC,0x787E,0x781F,0x781F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x781F,0x781E,0x787E,0x7FF8,0x7FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [D] 254 | 0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFE,0x3FFE,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [E] 255 | 0x0000,0x0000,0x0000,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [F] 256 | 0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x7C00,0x7C00,0x7800,0xF800,0xF800,0xF87F,0xF87F,0x780F,0x7C0F,0x7C0F,0x3E0F,0x1F8F,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [G] 257 | 0x0000,0x0000,0x0000,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7FFF,0x7FFF,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [H] 258 | 0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [I] 259 | 0x0000,0x0000,0x0000,0x1FFC,0x1FFC,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x0078,0x0078,0x38F8,0x3FF0,0x3FC0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [J] 260 | 0x0000,0x0000,0x0000,0x3C1F,0x3C1E,0x3C3C,0x3C78,0x3CF0,0x3DE0,0x3FE0,0x3FC0,0x3F80,0x3FC0,0x3FE0,0x3DF0,0x3CF0,0x3C78,0x3C7C,0x3C3E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [K] 261 | 0x0000,0x0000,0x0000,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [L] 262 | 0x0000,0x0000,0x0000,0xF81F,0xFC1F,0xFC1F,0xFE3F,0xFE3F,0xFE3F,0xFF7F,0xFF77,0xFF77,0xF7F7,0xF7E7,0xF3E7,0xF3E7,0xF3C7,0xF007,0xF007,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [M] 263 | 0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7E0F,0x7F0F,0x7F0F,0x7F8F,0x7F8F,0x7FCF,0x7BEF,0x79EF,0x79FF,0x78FF,0x78FF,0x787F,0x783F,0x783F,0x781F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [N] 264 | 0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [O] 265 | 0x0000,0x0000,0x0000,0x3FFC,0x3FFF,0x3E1F,0x3E0F,0x3E0F,0x3E0F,0x3E0F,0x3E1F,0x3E3F,0x3FFC,0x3FF0,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [P] 266 | 0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F8,0x007C,0x003F,0x000F,0x0003,0x0000, // Ascii = [Q] 267 | 0x0000,0x0000,0x0000,0x3FF0,0x3FFC,0x3C7E,0x3C3E,0x3C1E,0x3C1E,0x3C3E,0x3C3C,0x3CFC,0x3FF0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [R] 268 | 0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x3E0E,0x3C00,0x3C00,0x3C00,0x3E00,0x1FC0,0x0FF8,0x03FE,0x007F,0x001F,0x000F,0x000F,0x201F,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [S] 269 | 0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [T] 270 | 0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x3C1E,0x3C1E,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [U] 271 | 0x0000,0x0000,0x0000,0xF007,0xF007,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1F3C,0x1F78,0x0F78,0x0FF8,0x07F0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [V] 272 | 0x0000,0x0000,0x0000,0xE003,0xF003,0xF003,0xF007,0xF3E7,0xF3E7,0xF3E7,0x73E7,0x7BF7,0x7FF7,0x7FFF,0x7F7F,0x7F7F,0x7F7E,0x3F7E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [W] 273 | 0x0000,0x0000,0x0000,0xF807,0x7C0F,0x3E1E,0x3E3E,0x1F3C,0x0FF8,0x07F0,0x07E0,0x03E0,0x03E0,0x07F0,0x0FF8,0x0F7C,0x1E7C,0x3C3E,0x781F,0x780F,0xF00F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [X] 274 | 0x0000,0x0000,0x0000,0xF807,0x7807,0x7C0F,0x3C1E,0x3E1E,0x1F3C,0x0F78,0x0FF8,0x07F0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Y] 275 | 0x0000,0x0000,0x0000,0x7FFF,0x7FFF,0x000F,0x001F,0x003E,0x007C,0x00F8,0x00F0,0x01E0,0x03E0,0x07C0,0x0F80,0x0F00,0x1E00,0x3E00,0x7C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Z] 276 | 0x07FF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07FF,0x07FF,0x0000, // Ascii = [[] 277 | 0x7800,0x7800,0x3C00,0x3C00,0x1E00,0x1E00,0x0F00,0x0F00,0x0780,0x0780,0x03C0,0x03C0,0x01E0,0x01E0,0x00F0,0x00F0,0x0078,0x0078,0x003C,0x003C,0x001E,0x001E,0x000F,0x000F,0x0007,0x0000, // Ascii = [\] 278 | 0x7FF0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x7FF0,0x7FF0,0x0000, // Ascii = []] 279 | 0x00C0,0x01C0,0x01C0,0x03E0,0x03E0,0x07F0,0x07F0,0x0778,0x0F78,0x0F38,0x1E3C,0x1E3C,0x3C1E,0x3C1E,0x380F,0x780F,0x7807,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [^] 280 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000, // Ascii = [_] 281 | 0x00F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [`] 282 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x3FFC,0x3C7C,0x003E,0x003E,0x003E,0x07FE,0x1FFE,0x3E3E,0x7C3E,0x783E,0x7C3E,0x7C7E,0x3FFF,0x1FCF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [a] 283 | 0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3C1E,0x3F3E,0x3FFC,0x3BF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [b] 284 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x3E00,0x3C00,0x7C00,0x7C00,0x7C00,0x3C00,0x3E00,0x3E00,0x1F87,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [c] 285 | 0x001F,0x001F,0x001F,0x001F,0x001F,0x001F,0x07FF,0x1FFF,0x3E3F,0x3C1F,0x7C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [d] 286 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03F8,0x0FFC,0x1F3E,0x3E1E,0x3C1F,0x7C1F,0x7FFF,0x7FFF,0x7C00,0x7C00,0x3C00,0x3E00,0x1F07,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [e] 287 | 0x01FF,0x03E1,0x03C0,0x07C0,0x07C0,0x07C0,0x7FFF,0x7FFF,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [f] 288 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EF,0x1FFF,0x3E7F,0x3C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x001E,0x001E,0x001E,0x387C,0x3FF8, // Ascii = [g] 289 | 0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [h] 290 | 0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x7FE0,0x7FE0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [i] 291 | 0x00F8,0x00F8,0x0000,0x0000,0x0000,0x0000,0x3FF8,0x3FF8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F0,0x71F0,0x7FE0, // Ascii = [j] 292 | 0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C1F,0x3C3E,0x3C7C,0x3CF8,0x3DF0,0x3DE0,0x3FC0,0x3FC0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [k] 293 | 0x7FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [l] 294 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFBE7,0xF9E7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [m] 295 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [n] 296 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x3C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x3C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [o] 297 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3E1E,0x3F3E,0x3FFC,0x3FF8,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00, // Ascii = [p] 298 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EE,0x1FFE,0x3E7E,0x3C1E,0x7C1E,0x781E,0x781E,0x781E,0x781E,0x781E,0x7C1E,0x7C3E,0x3E7E,0x1FFE,0x0FDE,0x001E,0x001E,0x001E,0x001E,0x001E, // Ascii = [q] 299 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F7F,0x1FFF,0x1FE7,0x1FC7,0x1F87,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [r] 300 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x1E0E,0x3E00,0x3E00,0x3F00,0x1FE0,0x07FC,0x00FE,0x003E,0x001E,0x001E,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [s] 301 | 0x0000,0x0000,0x0000,0x0780,0x0780,0x0780,0x7FFF,0x7FFF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07C0,0x03FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [t] 302 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7E,0x3EFE,0x1FFE,0x0FDE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [u] 303 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF007,0x780F,0x780F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1E3C,0x0F78,0x0F78,0x0FF0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [v] 304 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF003,0xF1E3,0xF3E3,0xF3E7,0xF3F7,0xF3F7,0x7FF7,0x7F77,0x7F7F,0x7F7F,0x7F7F,0x3E3E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [w] 305 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C0F,0x3E1E,0x3E3C,0x1F3C,0x0FF8,0x07F0,0x07F0,0x03E0,0x07F0,0x07F8,0x0FF8,0x1E7C,0x3E3E,0x3C1F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [x] 306 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x1E3C,0x1E3C,0x1F3C,0x0F78,0x0FF8,0x07F0,0x07F0,0x03E0,0x03E0,0x03C0,0x03C0,0x03C0,0x0780,0x0F80,0x7F00, // Ascii = [y] 307 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x001F,0x003E,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0F80,0x1F00,0x1E00,0x3C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [z] 308 | 0x01FE,0x03E0,0x03C0,0x03C0,0x03C0,0x03C0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x3F80,0x3F80,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x03C0,0x03C0,0x03C0,0x03C0,0x03E0,0x01FE,0x007E,0x0000, // Ascii = [{] 309 | 0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000, // Ascii = [|] 310 | 0x3FC0,0x03E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x00FE,0x00FE,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x01E0,0x03E0,0x3FC0,0x3F00,0x0000, // Ascii = [}] 311 | 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3F07,0x7FC7,0x73E7,0xF1FF,0xF07E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [~] 312 | }; 313 | 314 | // Three font sizes 315 | // 32 is the number for the space char, but you can simply write the char instead, like ' ' 316 | font_t Font_7x10 = {7, 10, 32, 16, (void*)&Font7x10}; 317 | font_t Font_11x18 = {11, 18, 32,16, (void*)&Font11x18}; 318 | font_t Font_16x26 = {16, 26, 32, 16, (void*)&Font16x26}; --------------------------------------------------------------------------------