From b6f01a6d54465e43d3626d3b47f99d5264ae3817 Mon Sep 17 00:00:00 2001 From: ddebernardde <diego.debernard@student.uclouvain.be> Date: Thu, 17 Nov 2022 18:54:29 +0100 Subject: [PATCH] librairie OLED ok --- Makefile | 6 + OLED.cpp | 27 + .../OLED_Module_Code/RaspberryPi/c/Makefile | 50 + .../RaspberryPi/c/Readme_CN.txt | 121 + .../RaspberryPi/c/Readme_EN.txt | 120 + .../RaspberryPi/c/examples/OLED_1in5_test.c | 120 + .../RaspberryPi/c/examples/main.c | 36 + .../RaspberryPi/c/examples/test.h | 45 + .../RaspberryPi/c/lib/Config/DEV_Config.c | 247 ++ .../RaspberryPi/c/lib/Config/DEV_Config.h | 73 + .../RaspberryPi/c/lib/Config/Debug.h | 47 + .../RaspberryPi/c/lib/Config/RPI_sysfs_gpio.c | 152 + .../RaspberryPi/c/lib/Config/RPI_sysfs_gpio.h | 82 + .../c/lib/Config/dev_hardware_SPI.c | 364 +++ .../c/lib/Config/dev_hardware_SPI.h | 120 + .../c/lib/Config/dev_hardware_i2c.c | 115 + .../c/lib/Config/dev_hardware_i2c.h | 61 + .../RaspberryPi/c/lib/Fonts/font12.c | 1384 +++++++++ .../RaspberryPi/c/lib/Fonts/font12CN.c | 120 + .../RaspberryPi/c/lib/Fonts/font16.c | 1764 ++++++++++++ .../RaspberryPi/c/lib/Fonts/font20.c | 2142 ++++++++++++++ .../RaspberryPi/c/lib/Fonts/font24.c | 2520 +++++++++++++++++ .../RaspberryPi/c/lib/Fonts/font24CN.c | 465 +++ .../RaspberryPi/c/lib/Fonts/font8.c | 1004 +++++++ .../RaspberryPi/c/lib/Fonts/fonts.h | 97 + .../RaspberryPi/c/lib/GUI/GUI_BMPfile.c | 421 +++ .../RaspberryPi/c/lib/GUI/GUI_BMPfile.h | 100 + .../RaspberryPi/c/lib/GUI/GUI_Paint.c | 838 ++++++ .../RaspberryPi/c/lib/GUI/GUI_Paint.h | 231 ++ .../RaspberryPi/c/lib/OLED/OLED_1in5.c | 196 ++ .../RaspberryPi/c/lib/OLED/OLED_1in5.h | 50 + .../OLED_Module_Code/RaspberryPi/c/main | Bin 0 -> 94556 bytes .../RaspberryPi/c/pic/0in91.bmp | Bin 0 -> 576 bytes .../RaspberryPi/c/pic/0in95_rgb.bmp | Bin 0 -> 12360 bytes .../RaspberryPi/c/pic/0in96.bmp | Bin 0 -> 1088 bytes .../RaspberryPi/c/pic/1in3.bmp | Bin 0 -> 1088 bytes .../RaspberryPi/c/pic/1in3c.bmp | Bin 0 -> 1088 bytes .../RaspberryPi/c/pic/1in5.bmp | Bin 0 -> 8312 bytes .../RaspberryPi/c/pic/1in51.bmp | Bin 0 -> 1088 bytes .../RaspberryPi/c/pic/1in5_rgb.bmp | Bin 0 -> 32840 bytes .../RaspberryPi/c/pic/1in5_rgb1.bmp | Bin 0 -> 32840 bytes .../OLED_Module_Code/Version_CN.txt | 2 + .../OLED_Module_Code/Version_EN.txt | 2 + oled | Bin 0 -> 8476 bytes 44 files changed, 13122 insertions(+) create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Makefile create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_CN.txt create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_EN.txt create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/OLED_1in5_test.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/main.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/test.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/Debug.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12CN.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font16.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font20.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24CN.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font8.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/fonts.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.h create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.c create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.h create mode 100755 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/main create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in91.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in95_rgb.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in96.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3c.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in51.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb1.bmp create mode 100644 OLED_Module_Code/OLED_Module_Code/Version_CN.txt create mode 100644 OLED_Module_Code/OLED_Module_Code/Version_EN.txt create mode 100755 oled diff --git a/Makefile b/Makefile index 8df1d79..94f858f 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,9 @@ encoder : compile_encoder lidar : compile_lidar sudo ./LIDAR +oled : compile_oled + sudo ./oled + # compilations compile_switch : g++ -o switch switch.cpp -lwiringPi @@ -43,6 +46,9 @@ compile_encoder : compile_lidar : g++ -o LIDAR LIDAR.cpp -l wiringPi +compile_oled : + g++ -o oled OLED.cpp -l wiringPi + .PHONY : clean clean : rm -rf switch motor led i2c uart spi encoder diff --git a/OLED.cpp b/OLED.cpp index e69de29..a4a5afe 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -0,0 +1,27 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include <wiringPi.h> +#include <wiringPiI2C.h> + + +const int OLED = 0x3d; + +int main(int argc, char const *argv[]) +{ + int fd = wiringPiI2CSetup(OLED); + + if (fd < 0) { + perror("I2C"); + exit(EXIT_FAILURE); + } + + int response = wiringPiI2CRead(fd); + printf("%x", response); + + + + return 0; +} diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Makefile b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Makefile new file mode 100644 index 0000000..c6d84da --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Makefile @@ -0,0 +1,50 @@ +DIR_Config = ./lib/Config +DIR_OLED = ./lib/OLED +DIR_FONTS = ./lib/Fonts +DIR_GUI = ./lib/GUI +DIR_Examples = ./examples +DIR_BIN = ./bin + +OBJ_C = $(wildcard ${DIR_OLED}/*.c ${DIR_Config}/*.c ${DIR_GUI}/*.c ${DIR_Examples}/*.c ${DIR_FONTS}/*.c) +OBJ_O = $(patsubst %.c,${DIR_BIN}/%.o,$(notdir ${OBJ_C})) + +TARGET = main + +#USELIB = USE_BCM2835_LIB +#USELIB = USE_WIRINGPI_LIB +USELIB = USE_DEV_LIB +DEBUG = -D $(USELIB) +ifeq ($(USELIB), USE_BCM2835_LIB) + LIB = -lbcm2835 -lm +else ifeq ($(USELIB), USE_WIRINGPI_LIB) + LIB = -lwiringPi -lm +else ifeq ($(USELIB), USE_DEV_LIB) + LIB = -lm +endif + + +CC = gcc +MSG = -g -O0 -Wall +CFLAGS += $(MSG) $(DEBUG) + +${TARGET}:${OBJ_O} + $(CC) $(CFLAGS) $(OBJ_O) -o $@ $(LIB) -l wiringPi + +${DIR_BIN}/%.o:$(DIR_Examples)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_GUI) -I $(DIR_OLED) -l wiringPi + +${DIR_BIN}/%.o:$(DIR_OLED)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -l wiringPi + +${DIR_BIN}/%.o:$(DIR_FONTS)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -l wiringPi + +${DIR_BIN}/%.o:$(DIR_GUI)/%.c + $(CC) $(CFLAGS) -c $< -o $@ -I $(DIR_Config) -I $(DIR_OLED) -I $(DIR_Examples) -l wiringPi + +${DIR_BIN}/%.o:$(DIR_Config)/%.c + $(CC) $(CFLAGS) -c $< -o $@ $(LIB) -l wiringPi + +clean : + rm -f $(DIR_BIN)/*.* + rm -f $(TARGET) diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_CN.txt b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_CN.txt new file mode 100644 index 0000000..ca985e4 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_CN.txt @@ -0,0 +1,121 @@ +/***************************************************************************** +* | File : Readme_CN.txt +* | Author : Waveshare team +* | Function : Help with use +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-08-28 +* | Info : 在这里提供一个中文版本的使用文档,以便你的快速使用 +******************************************************************************/ +这个文件是帮助您使用本例程。 +由于我们的OLED屏越来越多,不便于我们的维护,因此把所有的OLED程序做成一个工程。 +在这里简略的描述本工程的使用: + +1.基本信息: +本例程基于树莓派4B+开发的,内核版本 + Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux +本例程可以在工程的examples\中查看对应的测试例程; + +2.管脚连接: +管脚连接你可以打开/lib/Config/DEV_Config.h查看,这里也再重述一次: +SPI: + OLED => RPI(BCM) + VCC -> 3.3 + GND -> GND + DIN -> 10(MOSI) + CLK -> 11(SCLK) + CS -> 8 + DC -> 25 + RST -> 27 + +IIC: + OLED => RPI(BCM) + VCC -> 3.3 + GND -> GND + DIN -> 2(SDA) + CLK -> 3(SCL) + CS -> 8 + DC -> 25 + RST -> 27 + +3.基本使用: +由于本工程是一个综合工程,对于使用而言,你可能需要阅读以下内容: +请注意你购买的是哪一款的OLED。 +栗子1: + 如果你购买的1.3inch OLED Module (C),那么在主目录输入: + sudo make clean + sudo make + sudo ./main 1.3c + +栗子2: + 如果你购买的1.5inch RGB OLED Module,那么在主目录输入: + sudo make clean + sudo make + sudo ./main 1.5rgb + +栗子3: + 如果你购买的0.91inch OLED Module,注意由于该模块只有IIC接口,而例程默认是SPI,需要去Config.h中修改,即: + #define USE_SPI_4W 1 + #define USE_IIC 0 + 修改成: + #define USE_SPI_4W 0 + #define USE_IIC 1 + 并在主目录输入: + sudo make clean + sudo make + sudo ./main 0.91 + + +4.目录结构(选读): +如果你经常使用我们的产品,对我们的程序目录结构会十分熟悉,关于具体的函数的我们有一份 +函数的API手册,你可以在我们的WIKI上下载或像售后客服索取,这里简单介绍一次: +Config\:此目录为硬件接口层文件,在DEV_Config.c(.h)可以看到很多定义,包括: + 数据类型: + #define UBYTE uint8_t + #define UWORD uint16_t + #define UDOUBLE uint32_t + SPI和IIC的选择: + #define USE_SPI_4W 1 + #define USE_IIC 0 + IIC地址: + #define IIC_CMD 0X00 + #define IIC_RAM 0X40 + GPIO读写: + #define OLED_CS_0 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_RESET) + #define OLED_CS_1 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_SET) + #define OLED_DC_0 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET) + #define OLED_DC_1 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET) + #define OLED_RST_0 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_RESET) + #define OLED_RST_1 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_SET) + SPI传输数据: + void SPI4W_Write_Byte(UBYTE value); + IIC传输数据: + void I2C_Write_Byte(UBYTE value, UBYTE Cmd); + 延时: + #define DEV_Delay_ms(__xms) HAL_Delay(__xms); + 注意:此延时函数并未使用示波器测量具体数值 + 模块初始化与退出的处理: + UBYTE System_Init(void); + void System_Exit(void); + 注意:1.这里是处理使用OLED前与使用完之后一些GPIO的处理。 + +GUI\:此目录为一些基本的图像处理函数,在GUI_Paint.c(.h)中: + 常用图像处理:创建图形、翻转图形、镜像图形、设置像素点、清屏等; + 常用画图处理:画点、线、框、圆、中文字符、英文字符、数字等; + 常用时间显示:提供一个常用的显示时间函数; + 常用显示图片:提供一个显示位图的函数; + +Fonts\:为一些常用的字体: + Ascii: + font8: 5*8 + font12: 7*12 + font16: 11*16 + font20: 14*20 + font24: 17*24 + 中文: + font12CN: 16*21 + font24CN: 32*41 + +OLED\:此目录下为OLED驱动函数; +Examples\:此目录下为OLED的测试程序,你可在其中看到具体的使用方法; \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_EN.txt b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_EN.txt new file mode 100644 index 0000000..e84c2e3 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/Readme_EN.txt @@ -0,0 +1,120 @@ +/***************************************************************************** +* | File : Readme_CN.txt +* | Author : Waveshare team +* | Function : Help with use +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2020-08-28 +* | Info : Here is an English version of the documentation for your quick use. +******************************************************************************/ +This file is to help you use this routine. +Since our OLED screens are getting more and more, it is not convenient for our maintenance, so all the OLED screen programs are made into one project. +A brief description of the use of this project is here: + +1. Basic information: +This routine is based on the raspberry PI 4B+ development, the kernel version: + Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux +This routine can view the corresponding test routines in the examples\ of the project; + +2. Pin connection: +Pin connection you can use STM32CubeMX to open the project file oled_demo.ioc for viewing, which is also repeated here: +SPI: + OLED => RPI(BCM) + VCC -> 3.3 + GND -> GND + DIN -> 10(MOSI) + CLK -> 11(SCLK) + CS -> 8 + DC -> 25 + RST -> 27 + +IIC: + OLED => RPI(BCM) + VCC -> 3.3 + GND -> GND + DIN -> 2(SDA) + CLK -> 3(SCL) + CS -> 8 + DC -> 25 + RST -> 27 + +3. Basic use: +Since this project is a comprehensive project, for use, you may need to read the following: +Please pay attention to which OLED you bought. +eg 1: + If you bought a 1.3-inch OLED Module (C), enter it in your home directory: + sudo make clean + sudo make + sudo ./main 1.3c + +eg 2: + If you buy a 1.5-inch RGB OLED Module, enter it in your home directory: + sudo make clean + sudo make + sudo ./main 1.5rgb + +eg 3: + If you buy a 0.91inch OLED Module, please note that since the Module only has IIC interface and the routine defaults to SPI, you need to modify it in config.h, that is: + #define USE_SPI_4W 1 + #define USE_IIC 0 + Modified to: + #define USE_SPI_4W 0 + #define USE_IIC 1 + And enter in the home directory: + sudo make clean + sudo make + sudo ./main 0.91 + +4. Directory structure (selection): +If you use our products frequently, we will be very familiar with our program directory structure. We have a copy of the specific function. +The API manual for the function, you can download it on our WIKI or request it as an after-sales customer service. Here is a brief introduction: +Config\: This directory is a hardware interface layer file. You can see many definitions in DEV_Config.c(.h), including: + data type锛� + #define UBYTE uint8_t + #define UWORD uint16_t + #define UDOUBLE uint32_t + SPI or IIC select锛� + #define USE_SPI_4W 1 + #define USE_IIC 0 + IIC address锛� + #define IIC_CMD 0X00 + #define IIC_RAM 0X40 + GPIO read/write锛� + #define OLED_CS_0 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_RESET) + #define OLED_CS_1 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_SET) + #define OLED_DC_0 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET) + #define OLED_DC_1 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET) + #define OLED_RST_0 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_RESET) + #define OLED_RST_1 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_SET) + SPI transmission锛� + void SPI4W_Write_Byte(UBYTE value); + IIC transmission锛� + void I2C_Write_Byte(UBYTE value, UBYTE Cmd); + delay锛� + #define DEV_Delay_ms(__xms) HAL_Delay(__xms); + Note: This delay function does not use oscilloscope to measure specific values + The process of module initialization and exit锛� + UBYTE System_Init(void); + void System_Exit(void); + Note: Here is the processing of SOME GPIO before and after using OLED + +GUI\: This directory is some basic image processing functions, in GUI_Paint.c(.h): + Common image processing: creating graphics, flipping graphics, mirroring graphics, setting pixels, clearing screens, etc. + Common drawing processing: drawing points, lines, boxes, circles, Chinese characters, English characters, numbers, etc.; + Common time display: Provide a common display time function; + Commonly used display pictures: provide a function to display bitmaps; + + Fonts\: for some commonly used fonts: + Ascii: + Font8: 5*8 + Font12: 7*12 + Font16: 11*16 + Font20: 14*20 + Font24: 17*24 + Chinese: + font12CN: 16*21 + font24CN: 32*41 + +OLED\: This screen is the OLED screen driver function; +Examples\: This is the test program for the OLED screen. You can see the specific usage method in it. \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/OLED_1in5_test.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/OLED_1in5_test.c new file mode 100644 index 0000000..ed95d28 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/OLED_1in5_test.c @@ -0,0 +1,120 @@ +/***************************************************************************** +* | File : OLED_1in5_test.c +* | Author : Waveshare team +* | Function : 1.5inch OLED Module test demo +* | Info : +*---------------- +* | This version: V2.0 +* | Date : 2020-08-15 +* | Info : +* ----------------------------------------------------------------------------- +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "test.h" +#include "../lib/OLED/OLED_1in5.h" + +int OLED_1in5_test(void) +{ + printf("1.5inch OLED test demo\n"); + if(DEV_ModuleInit() != 0) { + return -1; + } + + printf("OLED Init...\r\n"); + OLED_1in5_Init(); + DEV_Delay_ms(500); + // 0.Create a new image cache + UBYTE *BlackImage; + UWORD Imagesize = ((OLED_1in5_WIDTH%2==0)? (OLED_1in5_WIDTH/2): (OLED_1in5_WIDTH/2+1)) * OLED_1in5_HEIGHT; + if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) { + printf("Failed to apply for black memory...\r\n"); + return -1; + } + printf("Paint_NewImage\r\n"); + Paint_NewImage(BlackImage, OLED_1in5_WIDTH, OLED_1in5_HEIGHT, 0, BLACK); + Paint_SetScale(16); + printf("Drawing\r\n"); + //1.Select Image + Paint_SelectImage(BlackImage); + DEV_Delay_ms(500); + Paint_Clear(BLACK); + while(1) { + + // 2.Drawing on the image + printf("Drawing:page 1\r\n"); + Paint_DrawPoint(20, 10, WHITE, DOT_PIXEL_1X1, DOT_STYLE_DFT); + Paint_DrawPoint(30, 10, WHITE, DOT_PIXEL_2X2, DOT_STYLE_DFT); + Paint_DrawPoint(40, 10, WHITE, DOT_PIXEL_3X3, DOT_STYLE_DFT); + Paint_DrawLine(10, 10, 10, 20, WHITE, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawLine(20, 20, 20, 30, WHITE, DOT_PIXEL_1X1, LINE_STYLE_SOLID); + Paint_DrawLine(30, 30, 30, 40, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + Paint_DrawLine(40, 40, 40, 50, WHITE, DOT_PIXEL_1X1, LINE_STYLE_DOTTED); + Paint_DrawCircle(60, 30, 15, WHITE, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawCircle(100, 40, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL); + Paint_DrawRectangle(50, 30, 60, 40, WHITE, DOT_PIXEL_1X1, DRAW_FILL_EMPTY); + Paint_DrawRectangle(90, 30, 110, 50, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL); + // 3.Show image on page1 + OLED_1in5_Display(BlackImage); + DEV_Delay_ms(2000); + Paint_Clear(BLACK); + + // Drawing on the image + printf("Drawing:page 2\r\n"); + for(UBYTE i=0; i<16; i++){ + Paint_DrawRectangle(0, 8*i, 127, 8*(i+1), i, DOT_PIXEL_1X1, DRAW_FILL_FULL); + } + // Show image on page2 + OLED_1in5_Display(BlackImage); + DEV_Delay_ms(2000); + Paint_Clear(BLACK); + + // Drawing on the image + printf("Drawing:page 3\r\n"); + Paint_DrawString_EN(10, 0, "waveshare", &Font16, 0x1, 0xb); + Paint_DrawString_EN(10, 17, "hello world", &Font8, 0x2, 0xc); + Paint_DrawNum(10, 30, 123.456789, &Font8, 4, 0x3, 0xd); + Paint_DrawNum(10, 43, 987654, &Font12, 5, 0x4, 0xe); + // Show image on page2 + OLED_1in5_Display(BlackImage); + DEV_Delay_ms(2000); + Paint_Clear(BLACK); + + // Drawing on the image + printf("Drawing:page 4\r\n"); + Paint_DrawString_CN(10, 0,"锟斤拷锟紸bc", &Font12CN, WHITE, WHITE); + Paint_DrawString_CN(0, 20, "微雪锟斤拷锟斤拷", &Font24CN, WHITE, WHITE); + // Show image on page3 + OLED_1in5_Display(BlackImage); + DEV_Delay_ms(2000); + Paint_Clear(BLACK); + + // Drawing on the image + printf("Drawing:page 5\r\n"); + GUI_ReadBmp_16Gray("./pic/1in5.bmp", 0, 0); + // Show image on page4 + OLED_1in5_Display(BlackImage); + DEV_Delay_ms(2000); + Paint_Clear(BLACK); + + OLED_1in5_Clear(); + } +} + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/main.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/main.c new file mode 100644 index 0000000..0dda241 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/main.c @@ -0,0 +1,36 @@ +#include <stdlib.h> //exit() +#include <signal.h> //signal() +#include "test.h" +#include <string.h> + +void Handler(int signo) +{ + //System Exit + printf("\r\nHandler:exit\r\n"); + DEV_ModuleExit(); + + exit(0); +} + + + +int main(int argc, char *argv[]) +{ + // Exception handling:ctrl + c + // signal(SIGINT, Handler); + + // if (argc != 2){ + // printf("please input OLED size and type! \r\n"); + // printf("example: sudo ./main 1.3 or sudo ./main 1.3c \r\n"); + // printf("If rgb: sudo ./main 1.5rgb \r\n"); + // exit(1); + // } + + // printf("%s OLED Moudule\r\n", argv[1]); + + + OLED_1in5_test(); + + return 0; + +} diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/test.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/test.h new file mode 100644 index 0000000..c55c3c2 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/examples/test.h @@ -0,0 +1,45 @@ +/***************************************************************************** +* | File : test.h +* | Author : Waveshare team +* | Function : +* | Info : +* +*---------------- +* | This version: V1.0 +* | Date : 2020-08-13 +* | Info : Basic version +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef _TEST_H_ +#define _TEST_H_ + +#include "../lib/Config/DEV_Config.h" +#include "../lib/GUI/GUI_Paint.h" +#include "../lib/GUI/GUI_BMPfile.h" +#include "../lib/Config/Debug.h" + +#include <stdlib.h> // malloc() free() +#include <math.h> + + +int OLED_1in5_test(void); + +#endif \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.c new file mode 100644 index 0000000..f318a31 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.c @@ -0,0 +1,247 @@ +/***************************************************************************** +* | File : DEV_Config.c +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +*---------------- +* | This version: V2.0 +* | Date : 2020-06-17 +* | Info : Basic version +* +******************************************************************************/ +#include "DEV_Config.h" +#include <unistd.h> + +uint32_t fd; +/***************************************** + GPIO +*****************************************/ +void DEV_Digital_Write(UWORD Pin, UBYTE Value) +{ +#ifdef USE_BCM2835_LIB + bcm2835_gpio_write(Pin, Value); + +#elif USE_WIRINGPI_LIB + digitalWrite(Pin, Value); + +#elif USE_DEV_LIB + SYSFS_GPIO_Write(Pin, Value); + +#endif +} + +UBYTE DEV_Digital_Read(UWORD Pin) +{ + UBYTE Read_value = 0; +#ifdef USE_BCM2835_LIB + Read_value = bcm2835_gpio_lev(Pin); + +#elif USE_WIRINGPI_LIB + Read_value = digitalRead(Pin); + +#elif USE_DEV_LIB + Read_value = SYSFS_GPIO_Read(Pin); +#endif + return Read_value; +} + +void DEV_GPIO_Mode(UWORD Pin, UWORD Mode) +{ +#ifdef USE_BCM2835_LIB + if(Mode == 0 || Mode == BCM2835_GPIO_FSEL_INPT){ + bcm2835_gpio_fsel(Pin, BCM2835_GPIO_FSEL_INPT); + }else { + bcm2835_gpio_fsel(Pin, BCM2835_GPIO_FSEL_OUTP); + } +#elif USE_WIRINGPI_LIB + if(Mode == 0 || Mode == INPUT){ + pinMode(Pin, INPUT); + pullUpDnControl(Pin, PUD_UP); + }else{ + pinMode(Pin, OUTPUT); + // printf (" %d OUT \r\n",Pin); + } +#elif USE_DEV_LIB + SYSFS_GPIO_Export(Pin); + if(Mode == 0 || Mode == SYSFS_GPIO_IN){ + SYSFS_GPIO_Direction(Pin, SYSFS_GPIO_IN); + // printf("IN Pin = %d\r\n",Pin); + }else{ + SYSFS_GPIO_Direction(Pin, SYSFS_GPIO_OUT); + // printf("OUT Pin = %d\r\n",Pin); + } +#endif +} + +/** + * delay x ms +**/ +void DEV_Delay_ms(UDOUBLE xms) +{ +#ifdef USE_BCM2835_LIB + bcm2835_delay(xms); +#elif USE_WIRINGPI_LIB + delay(xms); +#elif USE_DEV_LIB + UDOUBLE i; + for(i=0; i < xms; i++){ + usleep(1000); + } +#endif +} + +static void DEV_GPIO_Init(void) +{ + DEV_GPIO_Mode(OLED_CS, 1); + DEV_GPIO_Mode(OLED_RST, 1); + DEV_GPIO_Mode(OLED_DC, 1); +} + +/****************************************************************************** +function: Module Initialize, the library and initialize the pins, SPI protocol +parameter: +Info: +******************************************************************************/ +UBYTE DEV_ModuleInit(void) +{ + + #ifdef USE_BCM2835_LIB + if(!bcm2835_init()) { + printf("bcm2835 init failed !!! \r\n"); + return 1; + } else { + printf("bcm2835 init success !!! \r\n"); + } + DEV_GPIO_Init(); + #if USE_SPI + printf("USE_SPI\r\n"); + bcm2835_spi_begin(); //Start spi interface, set spi pin for the reuse function + bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); //High first transmission + bcm2835_spi_setDataMode(BCM2835_SPI_MODE3); //spi mode 3 + bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_128); //Frequency + bcm2835_spi_chipSelect(BCM2835_SPI_CS0); //set CE0 + bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); //enable cs0 + #elif USE_IIC + OLED_DC_0; + OLED_CS_0; + printf("USE_IIC\r\n"); + bcm2835_i2c_begin(); + bcm2835_i2c_setSlaveAddress(0x3c); + /**********************************************************/ + #endif + +#elif USE_WIRINGPI_LIB + //if(wiringPiSetup() < 0) {//use wiringpi Pin number table + if(wiringPiSetupGpio() < 0) { //use BCM2835 Pin number table + printf("set wiringPi lib failed !!! \r\n"); + return 1; + } else { + printf("set wiringPi lib success !!! \r\n"); + } + DEV_GPIO_Init(); + #if USE_SPI + printf("USE_SPI\r\n"); + //wiringPiSPISetup(0,9000000); + wiringPiSPISetupMode(0, 9000000, 3); + #elif USE_IIC + OLED_DC_0; + OLED_CS_0; + printf("USE_IIC\r\n"); + fd = wiringPiI2CSetup(0x3d); + #endif + +#elif USE_DEV_LIB + DEV_GPIO_Init(); + #if USE_SPI + printf("USE_SPI\r\n"); + DEV_HARDWARE_SPI_beginSet("/dev/spidev0.0",SPI_MODE_3,10000000); + #elif USE_IIC + printf("USE_IIC\r\n"); + OLED_DC_0; + OLED_CS_0; + DEV_HARDWARE_I2C_begin("/dev/i2c-1"); + DEV_HARDWARE_I2C_setSlaveAddress(0x3c); + #endif +#endif + return 0; +} + +void DEV_SPI_WriteByte(uint8_t Value) +{ +#ifdef USE_BCM2835_LIB + bcm2835_spi_transfer(Value); + +#elif USE_WIRINGPI_LIB + wiringPiSPIDataRW(0,&Value,1); + +#elif USE_DEV_LIB + // printf("write data is %d\r\n", Value); + DEV_HARDWARE_SPI_TransferByte(Value); + +#endif +} + +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len) +{ + printf("data is %s", pData); +#ifdef USE_BCM2835_LIB + char rData[Len]; + bcm2835_spi_transfernb(pData,rData,Len); + +#elif USE_WIRINGPI_LIB + wiringPiSPIDataRW(0, pData, Len); + +#elif USE_DEV_LIB + DEV_HARDWARE_SPI_Transfer(pData, Len); + +#endif +} + +void I2C_Write_Byte(uint8_t value, uint8_t Cmd) +{ +#ifdef USE_BCM2835_LIB + char wbuf[2]={Cmd, value}; + bcm2835_i2c_write(wbuf, 2); +#elif USE_WIRINGPI_LIB + int ref; + //wiringPiI2CWrite(fd,Cmd); + ref = wiringPiI2CWriteReg8(fd, (int)Cmd, (int)value); + while(ref != 0) { + ref = wiringPiI2CWriteReg8 (fd, (int)Cmd, (int)value); + if(ref == 0) + break; + } +#elif USE_DEV_LIB + char wbuf[2]={Cmd, value}; + DEV_HARDWARE_I2C_write(wbuf, 2); + +#endif +} + +/****************************************************************************** +function: Module exits, closes SPI and BCM2835 library +parameter: +Info: +******************************************************************************/ +void DEV_ModuleExit(void) +{ +#ifdef USE_BCM2835_LIB + bcm2835_spi_end(); + bcm2835_i2c_end(); + bcm2835_close(); + + +#elif USE_WIRINGPI_LIB + OLED_CS_0; + OLED_RST_1; + OLED_DC_0; + +#elif USE_DEV_LIB + OLED_CS_0; + OLED_RST_1; + OLED_DC_0; + DEV_HARDWARE_SPI_end(); + DEV_HARDWARE_I2C_end(); +#endif +} + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.h new file mode 100644 index 0000000..0ddeaa8 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/DEV_Config.h @@ -0,0 +1,73 @@ +#ifndef _DEV_CONFIG_H_ +#define _DEV_CONFIG_H_ + +#define USE_WIRINGPI_LIB 1 + +/*********************************************************************************************************************** + ------------------------------------------------------------------------ + |\\\ ///| + |\\\ Hardware interface ///| + ------------------------------------------------------------------------ +***********************************************************************************************************************/ +#ifdef USE_BCM2835_LIB + #include <bcm2835.h> +#elif USE_WIRINGPI_LIB + #include <wiringPi.h> + #include <wiringPiSPI.h> + #include <wiringPiI2C.h> +#elif USE_DEV_LIB + #include "RPI_sysfs_gpio.h" + #include "dev_hardware_SPI.h" + #include "dev_hardware_i2c.h" +#endif + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include <unistd.h> +#include "Debug.h" + +#define USE_SPI 0 +#define USE_IIC 1 +#define IIC_CMD 0X00 +#define IIC_RAM 0X40 + + +/** + * data +**/ +#define UBYTE uint8_t +#define UWORD uint16_t +#define UDOUBLE uint32_t + +//OLED Define +#define OLED_CS 8 +#define OLED_RST 27 +#define OLED_DC 25 + + +#define OLED_CS_0 DEV_Digital_Write(OLED_CS,0) +#define OLED_CS_1 DEV_Digital_Write(OLED_CS,1) + +#define OLED_RST_0 DEV_Digital_Write(OLED_RST,0) +#define OLED_RST_1 DEV_Digital_Write(OLED_RST,1) + +#define OLED_DC_0 DEV_Digital_Write(OLED_DC,0) +#define OLED_DC_1 DEV_Digital_Write(OLED_DC,1) + +/*------------------------------------------------------------------------------------------------------*/ + +UBYTE DEV_ModuleInit(void); +void DEV_ModuleExit(void); + +void DEV_GPIO_Mode(UWORD Pin, UWORD Mode); +void DEV_Digital_Write(UWORD Pin, UBYTE Value); +UBYTE DEV_Digital_Read(UWORD Pin); +void DEV_Delay_ms(UDOUBLE xms); + +void I2C_Write_Byte(uint8_t value, uint8_t Cmd); +void DEV_SPI_WriteByte(UBYTE Value); +void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len); + +#endif diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/Debug.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/Debug.h new file mode 100644 index 0000000..f2187d8 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/Debug.h @@ -0,0 +1,47 @@ +/***************************************************************************** +* | File : Debug.h +* | Author : Waveshare team +* | Function : debug with printf +* | Info : +* Image scanning +* Please use progressive scanning to generate images or fonts +*---------------- +* | This version: V2.0 +* | Date : 2020-06-17 +* | Info : +* 1.USE_DEBUG -> DEBUG, If you need to see the debug information, +* clear the execution: make DEBUG=-DDEBUG +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +******************************************************************************/ +#ifndef __DEBUG_H +#define __DEBUG_H + +#include <stdio.h> + +#if DEBUG + #define Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else + #define Debug(__info,...) +#endif + +#endif + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.c new file mode 100644 index 0000000..efd61b3 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.c @@ -0,0 +1,152 @@ +/***************************************************************************** +* | File : SYSFS_GPIO.c +* | Author : Waveshare team +* | Function : Drive SYSFS_ GPIO +* | Info : Read and write /sys/class/gpio +*---------------- +* | This version: V1.0 +* | Date : 2019-06-04 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# SYSFS_GPIO_IN the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the folSYSFS_GPIO_LOWing conditions: +# +# The above copyright notice and this permission notice shall be included SYSFS_GPIO_IN +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. SYSFS_GPIO_IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER SYSFS_GPIO_IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# SYSFS_GPIO_OUT OF OR SYSFS_GPIO_IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS SYSFS_GPIO_IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "RPI_sysfs_gpio.h" +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +int SYSFS_GPIO_Export(int Pin) +{ + char buffer[NUM_MAXBUF]; + int len; + int fd; + + fd = open("/sys/class/gpio/export", O_WRONLY); + if (fd < 0) { + SYSFS_GPIO_Debug( "Export Failed: Pin%d\n", Pin); + return -1; + } + + len = snprintf(buffer, NUM_MAXBUF, "%d", Pin); + write(fd, buffer, len); + + SYSFS_GPIO_Debug( "Export: Pin%d\r\n", Pin); + + close(fd); + return 0; +} + +int SYSFS_GPIO_Unexport(int Pin) +{ + char buffer[NUM_MAXBUF]; + int len; + int fd; + + fd = open("/sys/class/gpio/unexport", O_WRONLY); + if (fd < 0) { + SYSFS_GPIO_Debug( "unexport Failed: Pin%d\n", Pin); + return -1; + } + + len = snprintf(buffer, NUM_MAXBUF, "%d", Pin); + write(fd, buffer, len); + + SYSFS_GPIO_Debug( "Unexport: Pin%d\r\n", Pin); + + close(fd); + return 0; +} + +int SYSFS_GPIO_Direction(int Pin, int Dir) +{ + const char dir_str[] = "in\0out"; + char path[DIR_MAXSIZ]; + int fd; + + snprintf(path, DIR_MAXSIZ, "/sys/class/gpio/gpio%d/direction", Pin); + fd = open(path, O_WRONLY); + if (fd < 0) { + SYSFS_GPIO_Debug( "Set Direction failed: Pin%d\n", Pin); + return -1; + } + + if (write(fd, &dir_str[Dir == SYSFS_GPIO_IN ? 0 : 3], Dir == SYSFS_GPIO_IN ? 2 : 3) < 0) { + SYSFS_GPIO_Debug("failed to set direction!\r\n"); + return -1; + } + + if(Dir == SYSFS_GPIO_IN){ + SYSFS_GPIO_Debug("Pin%d:intput\r\n", Pin); + }else{ + SYSFS_GPIO_Debug("Pin%d:Output\r\n", Pin); + } + + close(fd); + return 0; +} + +int SYSFS_GPIO_Read(int Pin) +{ + char path[DIR_MAXSIZ]; + char value_str[3]; + int fd; + + snprintf(path, DIR_MAXSIZ, "/sys/class/gpio/gpio%d/value", Pin); + fd = open(path, O_RDONLY); + if (fd < 0) { + SYSFS_GPIO_Debug( "Read failed Pin%d\n", Pin); + return -1; + } + + if (read(fd, value_str, 3) < 0) { + SYSFS_GPIO_Debug( "failed to read value!\n"); + return -1; + } + + close(fd); + return(atoi(value_str)); +} + +int SYSFS_GPIO_Write(int Pin, int value) +{ + const char s_values_str[] = "01"; + char path[DIR_MAXSIZ]; + int fd; + + snprintf(path, DIR_MAXSIZ, "/sys/class/gpio/gpio%d/value", Pin); + fd = open(path, O_WRONLY); + if (fd < 0) { + SYSFS_GPIO_Debug( "Write failed : Pin%d,value = %d\n", Pin, value); + return -1; + } + + if (write(fd, &s_values_str[value == SYSFS_GPIO_LOW ? 0 : 1], 1) < 0) { + SYSFS_GPIO_Debug( "failed to write value!\n"); + return -1; + } + + close(fd); + return 0; +} diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.h new file mode 100644 index 0000000..f8efce5 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/RPI_sysfs_gpio.h @@ -0,0 +1,82 @@ +/***************************************************************************** +* | File : sysfs_gpio.h +* | Author : Waveshare team +* | Function : Drive SC16IS752 GPIO +* | Info : Read and write /sys/class/gpio +*---------------- +* | This version: V1.0 +* | Date : 2019-06-04 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __SYSFS_GPIO_ +#define __SYSFS_GPIO_ + +#include <stdio.h> + +#define SYSFS_GPIO_IN 0 +#define SYSFS_GPIO_OUT 1 + +#define SYSFS_GPIO_LOW 0 +#define SYSFS_GPIO_HIGH 1 + +#define NUM_MAXBUF 4 +#define DIR_MAXSIZ 60 + +#define SYSFS_GPIO_DEBUG 0 +#if SYSFS_GPIO_DEBUG + #define SYSFS_GPIO_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else + #define SYSFS_GPIO_Debug(__info,...) +#endif + +// BCM GPIO for Jetson nano +#define GPIO4 4 // 7, 4 +#define GPIO17 7 // 11, 17 +#define GPIO18 18 // 12, 18 +#define GPIO27 27 // 13, 27 +#define GPIO22 22 // 15, 22 +#define GPIO23 23 // 16, 23 +#define GPIO24 24 // 18, 24 +#define SPI0_MOSI 10 // 19, 10 +#define SPI0_MISO 9 // 21, 9 +#define GPIO25 28 // 22, 25 +#define SPI0_SCK 11 // 23, 11 +#define SPI0_CS0 8 // 24, 8 +#define SPI0_CS1 7 // 26, 7 +#define GPIO5 5 // 29, 5 +#define GPIO6 6 // 31, 6 +#define GPIO12 12 // 32, 12 +#define GPIO13 13 // 33, 13 +#define GPIO19 19 // 35, 19 +#define GPIO16 16 // 36, 16 +#define GPIO26 26 // 37, 26 +#define GPIO20 20 // 38, 20 +#define GPIO21 21 // 40, 21 + +int SYSFS_GPIO_Export(int Pin); +int SYSFS_GPIO_Unexport(int Pin); +int SYSFS_GPIO_Direction(int Pin, int Dir); +int SYSFS_GPIO_Read(int Pin); +int SYSFS_GPIO_Write(int Pin, int value); + +#endif \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.c new file mode 100644 index 0000000..7ca7e0d --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.c @@ -0,0 +1,364 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.c +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "dev_hardware_SPI.h" + + +#include <stdlib.h> +#include <stdio.h> + +#include <stdint.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <getopt.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/types.h> +#include <linux/spi/spidev.h> + +HARDWARE_SPI hardware_SPI; + +static uint8_t bits = 8; + +#define SPI_CS_HIGH 0x04 //Chip select high +#define SPI_LSB_FIRST 0x08 //LSB +#define SPI_3WIRE 0x10 //3-wire mode SI and SO same line +#define SPI_LOOP 0x20 //Loopback mode +#define SPI_NO_CS 0x40 //A single device occupies one SPI bus, so there is no chip select +#define SPI_READY 0x80 //Slave pull low to stop data transmission + +struct spi_ioc_transfer tr; + + +/****************************************************************************** +function: SPI port initialization +parameter: + SPI_device : Device name +Info: + /dev/spidev0.0 + /dev/spidev0.1 +******************************************************************************/ +void DEV_HARDWARE_SPI_begin(char *SPI_device) +{ + //device + int ret = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + DEV_HARDWARE_SPI_Debug("Failed to open SPI device\r\n"); + exit(1); + } else { + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + hardware_SPI.mode = 0; + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) { + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) { + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + } + tr.bits_per_word = bits; + + DEV_HARDWARE_SPI_Mode(SPI_MODE_0); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_SetBitOrder(SPI_BIT_ORDER_MSBFIRST); + DEV_HARDWARE_SPI_setSpeed(20000000); + DEV_HARDWARE_SPI_SetDataInterval(0); +} + +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed) +{ + //device + int ret = 0; + hardware_SPI.mode = 0; + if((hardware_SPI.fd = open(SPI_device, O_RDWR )) < 0) { + perror("Failed to open SPI device.\n"); + exit(1); + } else { + DEV_HARDWARE_SPI_Debug("open : %s\r\n", SPI_device); + } + + ret = ioctl(hardware_SPI.fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't set bits per word\r\n"); + + ret = ioctl(hardware_SPI.fd, SPI_IOC_RD_BITS_PER_WORD, &bits); + if (ret == -1) + DEV_HARDWARE_SPI_Debug("can't get bits per word\r\n"); + + DEV_HARDWARE_SPI_Mode(mode); + DEV_HARDWARE_SPI_ChipSelect(SPI_CS_Mode_LOW); + DEV_HARDWARE_SPI_setSpeed(speed); + DEV_HARDWARE_SPI_SetDataInterval(0); +} + + +/****************************************************************************** +function: SPI device End +parameter: +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_end(void) +{ + hardware_SPI.mode = 0; + if (close(hardware_SPI.fd) != 0){ + DEV_HARDWARE_SPI_Debug("Failed to close SPI device\r\n"); + perror("Failed to close SPI device.\n"); + } +} + +/****************************************************************************** +function: Set SPI speed +parameter: +Info: Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed) +{ + uint32_t speed1 = hardware_SPI.speed; + + hardware_SPI.speed = speed; + + //Write speed + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't set max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + + //Read the speed of just writing + if (ioctl(hardware_SPI.fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) == -1) { + DEV_HARDWARE_SPI_Debug("can't get max speed hz\r\n"); + hardware_SPI.speed = speed1;//Setting failure rate unchanged + return -1; + } + hardware_SPI.speed = speed; + tr.speed_hz = hardware_SPI.speed; + return 1; +} + +/****************************************************************************** +function: Set SPI Mode +parameter: +Info: + SPIMode: + SPI_MODE0 + SPI_MODE1 + SPI_MODE2 + SPI_MODE3 + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_Mode(SPIMode mode) +{ + hardware_SPI.mode &= 0xfC;//Clear low 2 digits + hardware_SPI.mode |= mode;//Setting mode + + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Set SPI CS Enable +parameter: +Info: + EN: + DISABLE + ENABLE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN) +{ + if(EN == ENABLE){ + hardware_SPI.mode |= SPI_NO_CS; + }else { + hardware_SPI.mode &= ~SPI_NO_CS; + } + //Write device + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi CS EN\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Chip Select +parameter: +Info: + CS_Mode: + SPI_CS_Mode_LOW + SPI_CS_Mode_HIGH + SPI_CS_Mode_NONE + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode) +{ + if(CS_Mode == SPI_CS_Mode_HIGH){ + hardware_SPI.mode |= SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + DEV_HARDWARE_SPI_Debug("CS HIGH \r\n"); + }else if(CS_Mode == SPI_CS_Mode_LOW){ + hardware_SPI.mode &= ~SPI_CS_HIGH; + hardware_SPI.mode &= ~SPI_NO_CS; + }else if(CS_Mode == SPI_CS_Mode_NONE){ + hardware_SPI.mode |= SPI_NO_CS; + } + + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI bit order +parameter: +Info: + Order: + SPI_BIT_ORDER_LSBFIRST + SPI_BIT_ORDER_MSBFIRST + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order) +{ + if(Order == SPI_BIT_ORDER_LSBFIRST){ + hardware_SPI.mode |= SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_LSB_FIRST\r\n"); + }else if(Order == SPI_BIT_ORDER_MSBFIRST){ + hardware_SPI.mode &= ~SPI_LSB_FIRST; + DEV_HARDWARE_SPI_Debug("SPI_MSB_FIRST\r\n"); + } + + // DEV_HARDWARE_SPI_Debug("hardware_SPI.mode = 0x%02x\r\n", hardware_SPI.mode); + int fd = ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode); + DEV_HARDWARE_SPI_Debug("fd = %d\r\n",fd); + if (fd == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi SPI_LSB_FIRST\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: Sets the SPI Bus Mode +parameter: +Info: + Order: + SPI_3WIRE_Mode + SPI_4WIRE_Mode + Return : + Return 1 success + Return -1 failed +******************************************************************************/ +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode) +{ + if(mode == SPI_3WIRE_Mode){ + hardware_SPI.mode |= SPI_3WIRE; + }else if(mode == SPI_4WIRE_Mode){ + hardware_SPI.mode &= ~SPI_3WIRE; + } + if (ioctl(hardware_SPI.fd, SPI_IOC_WR_MODE, &hardware_SPI.mode) == -1) { + DEV_HARDWARE_SPI_Debug("can't set spi mode\r\n"); + return -1; + } + return 1; +} + +/****************************************************************************** +function: + Time interval after transmission of one byte during continuous transmission +parameter: + us : Interval time (us) +Info: +******************************************************************************/ +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us) +{ + hardware_SPI.delay = us; + tr.delay_usecs = hardware_SPI.delay; +} + +/****************************************************************************** +function: SPI port sends one byte of data +parameter: + buf : Sent data +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf) +{ + uint8_t rbuf[1]; + tr.len = 1; + tr.tx_buf = (unsigned long)&buf; + tr.rx_buf = (unsigned long)rbuf; + + //ioctl Operation, transmission of data + if ( ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ) { + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return -1; + } + return rbuf[0]; +} + +/****************************************************************************** +function: The SPI port reads a byte +parameter: +Info: Return read data +******************************************************************************/ +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len) +{ + tr.len = len; + tr.tx_buf = (unsigned long)buf; + tr.rx_buf = (unsigned long)buf; + + //ioctl Operation, transmission of data + if (ioctl(hardware_SPI.fd, SPI_IOC_MESSAGE(1), &tr) < 1 ){ + DEV_HARDWARE_SPI_Debug("can't send spi message\r\n"); + return -1; + } + + return 1; +} + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.h new file mode 100644 index 0000000..c80de24 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_SPI.h @@ -0,0 +1,120 @@ +/***************************************************************************** +* | File : dev_hardware_SPI.h +* | Author : Waveshare team +* | Function : Read and write /dev/SPI, hardware SPI +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __DEV_HARDWARE_SPI_ +#define __DEV_HARDWARE_SPI_ + +#include <stdint.h> + +#define DEV_HARDWARE_SPI_DEBUG 0 +#if DEV_HARDWARE_SPI_DEBUG +#define DEV_HARDWARE_SPI_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define DEV_HARDWARE_SPI_Debug(__info,...) +#endif + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 +#define SPI_MODE_0 (0|0) +#define SPI_MODE_1 (0|SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL|0) +#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) + +typedef enum{ + SPI_MODE0 = SPI_MODE_0, /*!< CPOL = 0, CPHA = 0 */ + SPI_MODE1 = SPI_MODE_1, /*!< CPOL = 0, CPHA = 1 */ + SPI_MODE2 = SPI_MODE_2, /*!< CPOL = 1, CPHA = 0 */ + SPI_MODE3 = SPI_MODE_3 /*!< CPOL = 1, CPHA = 1 */ +}SPIMode; + +typedef enum{ + DISABLE = 0, + ENABLE = 1 +}SPICSEN; + +typedef enum{ + SPI_CS_Mode_LOW = 0, /*!< Chip Select 0 */ + SPI_CS_Mode_HIGH = 1, /*!< Chip Select 1 */ + SPI_CS_Mode_NONE = 3 /*!< No CS, control it yourself */ +}SPIChipSelect; + +typedef enum +{ + SPI_BIT_ORDER_LSBFIRST = 0, /*!< LSB First */ + SPI_BIT_ORDER_MSBFIRST = 1 /*!< MSB First */ +}SPIBitOrder; + +typedef enum +{ + SPI_3WIRE_Mode = 0, + SPI_4WIRE_Mode = 1 +}BusMode; + + +/** + * Define SPI attribute +**/ +typedef struct SPIStruct { + //GPIO + uint16_t SCLK_PIN; + uint16_t MOSI_PIN; + uint16_t MISO_PIN; + + uint16_t CS0_PIN; + uint16_t CS1_PIN; + + + uint32_t speed; + uint16_t mode; + uint16_t delay; + int fd; // +} HARDWARE_SPI; + + + + +void DEV_HARDWARE_SPI_begin(char *SPI_device); +void DEV_HARDWARE_SPI_beginSet(char *SPI_device, SPIMode mode, uint32_t speed); +void DEV_HARDWARE_SPI_end(void); + +int DEV_HARDWARE_SPI_setSpeed(uint32_t speed); + +uint8_t DEV_HARDWARE_SPI_TransferByte(uint8_t buf); +int DEV_HARDWARE_SPI_Transfer(uint8_t *buf, uint32_t len); + +void DEV_HARDWARE_SPI_SetDataInterval(uint16_t us); +int DEV_HARDWARE_SPI_SetBusMode(BusMode mode); +int DEV_HARDWARE_SPI_SetBitOrder(SPIBitOrder Order); +int DEV_HARDWARE_SPI_ChipSelect(SPIChipSelect CS_Mode); +int DEV_HARDWARE_SPI_CSEN(SPICSEN EN); +int DEV_HARDWARE_SPI_Mode(SPIMode mode); + + +#endif \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.c new file mode 100644 index 0000000..4f1eb8e --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.c @@ -0,0 +1,115 @@ +/***************************************************************************** +* | File : dev_hardware_i2c.c +* | Author : Waveshare team +* | Function : Read and write /dev/i2C, hardware I2C +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "dev_hardware_i2c.h" + +#include <stdio.h> +#include <stdlib.h> //exit() +#include <fcntl.h> //define O_RDWR +#include <linux/i2c-dev.h> +#include <sys/ioctl.h> +#include <stdio.h> +#include <unistd.h> + + +HARDWARE_I2C hardware_i2c; + +/****************************************************************************** +function: I2C device initialization +parameter: + i2c_device : Device name +Info: /dev/i2c-* +******************************************************************************/ +void DEV_HARDWARE_I2C_begin(char *i2c_device) +{ + //device + if((hardware_i2c.fd = open(i2c_device, O_RDWR)) < 0) { //鎵撳紑I2C + perror("Failed to open i2c device.\n"); + printf("Failed to open i2c device\r\n"); + exit(1); + } else { + DEV_HARDWARE_I2C_Debug("open : %s\r\n", i2c_device); + } +} + +/****************************************************************************** +function: I2C device End +parameter: +Info: +******************************************************************************/ +void DEV_HARDWARE_I2C_end(void) +{ + if (close(hardware_i2c.fd) != 0){ + perror("Failed to close i2c device.\n"); + } +} + +/****************************************************************************** +function: Set the device address for I2C access +parameter: + addr : Device address accessed by I2C +Info: +******************************************************************************/ +void DEV_HARDWARE_I2C_setSlaveAddress(uint8_t addr) +{ + if(ioctl(hardware_i2c.fd, I2C_SLAVE, addr) < 0) { + printf("Failed to access bus.\n"); + exit(1); + } +} + +/****************************************************************************** +function: I2C Send data +parameter: + buf : Send data buffer address + len : Send data length +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_I2C_write(const char * buf, uint32_t len) +{ + write(hardware_i2c.fd, buf, len); + return 0; +} + +/****************************************************************************** +function: I2C read data +parameter: + reg : Read data register address + buf : Sead data buffer address + len : Sead data length +Info: +******************************************************************************/ +uint8_t DEV_HARDWARE_I2C_read(uint8_t reg, char* buf, uint32_t len) +{ + uint8_t temp[1] = {reg}; + write(hardware_i2c.fd, temp, 1); + read(hardware_i2c.fd, buf, len); + return 0; +} \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.h new file mode 100644 index 0000000..7276911 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Config/dev_hardware_i2c.h @@ -0,0 +1,61 @@ +/***************************************************************************** +* | File : dev_hardware_i2c.h +* | Author : Waveshare team +* | Function : Read and write /dev/i2C, hardware I2C +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-26 +* | Info : Basic version +* +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __DEV_HARDWARE_I2C_ +#define __DEV_HARDWARE_I2C_ + +#include <stdint.h> + + +#define DEV_HARDWARE_I2C_DEBUG 0 +#if DEV_HARDWARE_I2C_DEBUG +#define DEV_HARDWARE_I2C_Debug(__info,...) printf("Debug: " __info,##__VA_ARGS__) +#else +#define DEV_HARDWARE_I2C_Debug(__info,...) +#endif + +/** + * Define I2C attribute +**/ +typedef struct I2CStruct { + //GPIO + uint16_t SCL_PIN; + uint16_t SDA_PIN; + + int fd; //I2C device file descriptor + uint16_t addr; //I2C device address +} HARDWARE_I2C; + +void DEV_HARDWARE_I2C_begin(char *i2c_device); +void DEV_HARDWARE_I2C_end(void); +void DEV_HARDWARE_I2C_setSlaveAddress(uint8_t addr); +uint8_t DEV_HARDWARE_I2C_write(const char * buf, uint32_t len); +uint8_t DEV_HARDWARE_I2C_read(uint8_t reg, char* buf, uint32_t len); +#endif \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12.c new file mode 100644 index 0000000..485c3f0 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12.c @@ -0,0 +1,1384 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12CN.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12CN.c new file mode 100644 index 0000000..cf29da2 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font12CN.c @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font12CN_Table[] = +{ +/*-- 文字: 你 --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"你"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xC0,0x1D,0x80,0x3B,0xFF,0x3B,0x07, +0x3F,0x77,0x7E,0x76,0xF8,0x70,0xFB,0xFE,0xFB,0xFE,0x3F,0x77,0x3F,0x77,0x3E,0x73, +0x38,0x70,0x38,0x70,0x3B,0xE0,0x00,0x00,0x00,0x00}}, + +/*-- 文字: 好 --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"好"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x73,0xFF,0x70,0x0F,0xFE,0x1E, +0x7E,0x3C,0x6E,0x38,0xEE,0x30,0xEF,0xFF,0xFC,0x30,0x7C,0x30,0x38,0x30,0x3E,0x30, +0x7E,0x30,0xE0,0x30,0xC1,0xF0,0x00,0x00,0x00,0x00}}, + +/*-- 文字: 树 --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"树"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0E,0x30,0x0E,0x3F,0xEE,0x30,0xEE, +0xFC,0xFF,0x76,0xCE,0x77,0xFE,0x7B,0xFE,0xFF,0xFE,0xF3,0xDE,0xF3,0xCE,0x37,0xEE, +0x3E,0x6E,0x3C,0x0E,0x30,0x3E,0x00,0x00,0x00,0x00}}, + +/*-- 文字: 莓 --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"莓"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x70,0xFF,0xFF,0x3E,0x70,0x38,0x00, +0x7F,0xFF,0xE0,0x00,0xFF,0xFC,0x3B,0x8C,0x39,0xCC,0xFF,0xFF,0x73,0x9C,0x71,0xDC, +0x7F,0xFF,0x00,0x1C,0x01,0xF8,0x00,0x00,0x00,0x00}}, + +/*-- 文字: 派 --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"派"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x1F,0xFF,0xF0,0x3E,0x00,0x0E,0x1F, +0xCF,0xFB,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0x7F,0xD8,0x7F,0xDC,0x6F,0xCE,0xED,0xFF, +0xFD,0xF7,0xF9,0xC0,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- 文字: a --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3E,0x00,0x67,0x00,0x07,0x80,0x0F,0x80,0x7F,0x80,0xE3,0x80,0xE7,0x80,0xE7,0x80, +0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- 文字: b --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00, +0x7F,0x00,0x7B,0x80,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x71,0xC0,0x7B,0x80, +0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- 文字: c --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x3F,0x00,0x73,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xF0,0x00,0x73,0x00, +0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + +/*-- 文字: A --*/ +/*-- 微软雅黑12; 此字体下对应的点阵为:宽x高=16x21 --*/ +{{"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00, +0x1F,0x00,0x3B,0x80,0x3B,0x80,0x71,0x80,0x7F,0xC0,0x71,0xC0,0xE0,0xE0,0xE0,0xE0, +0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +}; + +cFONT Font12CN = { + Font12CN_Table, + sizeof(Font12CN_Table)/sizeof(CH_CN), /*size of table*/ + 11, /* ASCII Width */ + 16, /* Width */ + 21, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font16.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font16.c new file mode 100644 index 0000000..58ce59b --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font16.c @@ -0,0 +1,1764 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font20.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font20.c new file mode 100644 index 0000000..697e3ed --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font20.c @@ -0,0 +1,2142 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24.c new file mode 100644 index 0000000..fea3321 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24.c @@ -0,0 +1,2520 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +const uint8_t Font24_Table [] = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFF, 0xFF, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24CN.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24CN.c new file mode 100644 index 0000000..d3c9584 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font24CN.c @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + + +// +// Font data for Courier New 12pt +// + +const CH_CN Font24CN_Table[] = +{ +/*-- 文字: 你 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"你"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xC0,0x00, +0x01,0xE3,0xE0,0x00,0x03,0xE3,0xC0,0x00,0x03,0xC7,0x80,0x00,0x03,0xC7,0xFF,0xFF, +0x07,0x8F,0xFF,0xFF,0x07,0x8F,0x00,0x0F,0x0F,0x1E,0x00,0x1E,0x0F,0x3C,0x1E,0x1E, +0x1F,0x3C,0x1E,0x3E,0x1F,0x18,0x1E,0x3C,0x3F,0x00,0x1E,0x1C,0x7F,0x00,0x1E,0x00, +0x7F,0x07,0x9E,0x70,0xFF,0x07,0x9E,0xF0,0xEF,0x0F,0x9E,0x78,0x6F,0x0F,0x1E,0x78, +0x0F,0x0F,0x1E,0x3C,0x0F,0x1E,0x1E,0x3C,0x0F,0x1E,0x1E,0x1E,0x0F,0x3C,0x1E,0x1E, +0x0F,0x3C,0x1E,0x1F,0x0F,0x7C,0x1E,0x0F,0x0F,0x78,0x1E,0x0E,0x0F,0x00,0x1E,0x00, +0x0F,0x00,0x1E,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x07,0xFC,0x00,0x0F,0x07,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 好 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"好"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00, +0x0F,0x07,0xFF,0xFE,0x0F,0x07,0xFF,0xFE,0x0F,0x00,0x00,0x3E,0x1E,0x00,0x00,0xFC, +0xFF,0xF8,0x01,0xF0,0xFF,0xF8,0x03,0xE0,0x1E,0x78,0x07,0xC0,0x1E,0x78,0x0F,0x80, +0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00,0x3C,0x78,0x0F,0x00, +0x3C,0x7F,0xFF,0xFF,0x78,0xFF,0xFF,0xFF,0x78,0xF0,0x0F,0x00,0x78,0xF0,0x0F,0x00, +0x3D,0xE0,0x0F,0x00,0x1F,0xE0,0x0F,0x00,0x0F,0xE0,0x0F,0x00,0x07,0xC0,0x0F,0x00, +0x07,0xE0,0x0F,0x00,0x07,0xF0,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x1E,0x7C,0x0F,0x00, +0x3C,0x38,0x0F,0x00,0x78,0x00,0x0F,0x00,0xF0,0x03,0xFF,0x00,0x60,0x01,0xFE,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 微 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"微"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 软 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"软"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x03,0xC0,0x78,0x00,0x07,0x80,0x78,0x00,0x07,0x80,0x78,0x00, +0x07,0x80,0xF0,0x00,0x0F,0x00,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x1E,0x03,0xC0,0x1F,0x1E,0x03,0xC0,0x1E,0x1F,0xE7,0x8F,0x3E,0x3D,0xE7,0x8F,0x3C, +0x3D,0xEF,0x0F,0x7C,0x3D,0xE7,0x0F,0x78,0x79,0xE0,0x0F,0x00,0x79,0xE0,0x0E,0x00, +0x7F,0xFE,0x0E,0x00,0x7F,0xFE,0x1F,0x00,0x01,0xE0,0x1F,0x00,0x01,0xE0,0x1F,0x00, +0x01,0xE0,0x1F,0x80,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x3F,0x80,0x01,0xFF,0x3F,0xC0, +0x0F,0xFF,0x7B,0xC0,0xFF,0xF0,0x79,0xE0,0xF9,0xE0,0xF1,0xF0,0x01,0xE1,0xF0,0xF0, +0x01,0xE3,0xE0,0xF8,0x01,0xE7,0xC0,0x7C,0x01,0xFF,0x80,0x3F,0x01,0xFF,0x00,0x1F, +0x01,0xEC,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 雅 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"雅"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xFF,0x00, +0x7F,0xFC,0xF7,0x80,0x7F,0xFD,0xE3,0xC0,0x01,0xC1,0xE3,0xC0,0x01,0xC3,0xC1,0x80, +0x3D,0xC7,0xFF,0xFF,0x39,0xC7,0xFF,0xFF,0x39,0xCF,0x83,0x80,0x79,0xDF,0x83,0x80, +0x79,0xFF,0x83,0x80,0x79,0xDF,0x83,0x80,0x71,0xC3,0x83,0x80,0x7F,0xFF,0xFF,0xFE, +0x7F,0xFF,0xFF,0xFE,0x03,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80,0x07,0xC3,0x83,0x80, +0x0F,0xC3,0x83,0x80,0x0F,0xC3,0x83,0x80,0x1F,0xC3,0xFF,0xFE,0x1D,0xC3,0xFF,0xFE, +0x3D,0xC3,0x83,0x80,0x79,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80,0xF1,0xC3,0x83,0x80, +0x61,0xC3,0x83,0x80,0x01,0xC3,0xFF,0xFF,0x03,0xC3,0xFF,0xFF,0x1F,0xC3,0x80,0x00, +0x1F,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 黑 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"黑"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC,0x1E,0x03,0xC0,0x3C,0x1E,0xC3,0xC7,0x3C, +0x1F,0xE3,0xC7,0xBC,0x1E,0xF3,0xCF,0x3C,0x1E,0xFB,0xDF,0x3C,0x1E,0x7B,0xDE,0x3C, +0x1E,0x33,0xDC,0x3C,0x1E,0x03,0xC0,0x3C,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFC, +0x1E,0x03,0xC0,0x3C,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x3F,0xFF,0xFF,0xFC, +0x3F,0xFF,0xFF,0xFC,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0x70, +0x3E,0x78,0xF8,0xF8,0x3C,0x7C,0x78,0x7C,0x7C,0x3C,0x3C,0x3E,0xF8,0x3E,0x3C,0x1F, +0xF0,0x1C,0x18,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 此 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"此"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00,0x00,0x78,0x3C,0x00, +0x00,0x78,0x3C,0x0C,0x3C,0x78,0x3C,0x1E,0x3C,0x78,0x3C,0x3F,0x3C,0x78,0x3C,0xF8, +0x3C,0x7F,0xFD,0xF0,0x3C,0x7F,0xFF,0xE0,0x3C,0x78,0x3F,0x80,0x3C,0x78,0x3E,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00, +0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x00,0x3C,0x78,0x3C,0x0E,0x3C,0x78,0x3C,0x0F, +0x3C,0x78,0x3C,0x0F,0x3C,0x79,0xFC,0x0F,0x3C,0x7F,0xFC,0x0F,0x3F,0xFF,0x3C,0x0F, +0x3F,0xF0,0x3E,0x1E,0xFF,0x00,0x1F,0xFE,0xF0,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 字 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"字"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE, +0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E,0x78,0x00,0x00,0x1E, +0x7B,0xFF,0xFF,0xDE,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00, +0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 体 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"体"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x3C,0x00, +0x03,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00, +0x07,0x80,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x1F,0x01,0xFE,0x00, +0x1F,0x01,0xFF,0x00,0x3F,0x01,0xFF,0x00,0x3F,0x03,0xFF,0x00,0x7F,0x03,0xFF,0x80, +0x7F,0x07,0xBF,0x80,0xFF,0x07,0xBF,0xC0,0xEF,0x0F,0x3D,0xC0,0xCF,0x0F,0x3D,0xE0, +0x0F,0x1E,0x3D,0xE0,0x0F,0x1E,0x3C,0xF0,0x0F,0x3C,0x3C,0x78,0x0F,0x7C,0x3C,0x7C, +0x0F,0xF8,0x3C,0x3E,0x0F,0xF7,0xFF,0xDF,0x0F,0xE7,0xFF,0xCF,0x0F,0xC0,0x3C,0x06, +0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00,0x0F,0x00,0x3C,0x00, +0x0F,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 下 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"下"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0xE0,0x00,0x00,0x0F,0xF8,0x00,0x00,0x0F,0xFC,0x00,0x00,0x0F,0xBF,0x00, +0x00,0x0F,0x9F,0x80,0x00,0x0F,0x87,0xE0,0x00,0x0F,0x83,0xF0,0x00,0x0F,0x80,0xF8, +0x00,0x0F,0x80,0x7C,0x00,0x0F,0x80,0x38,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 对 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"对"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x7F,0xFC,0x00,0x78,0x7F,0xFC,0x00,0x78, +0x00,0x3C,0x00,0x78,0x00,0x3F,0xFF,0xFF,0x30,0x3F,0xFF,0xFF,0x78,0x3C,0x00,0x78, +0x3C,0x38,0x00,0x78,0x3E,0x78,0x00,0x78,0x1E,0x78,0xC0,0x78,0x0F,0x79,0xE0,0x78, +0x0F,0xF0,0xF0,0x78,0x07,0xF0,0xF8,0x78,0x03,0xF0,0x78,0x78,0x01,0xE0,0x3C,0x78, +0x03,0xF0,0x3E,0x78,0x03,0xF0,0x18,0x78,0x07,0xF8,0x00,0x78,0x07,0xFC,0x00,0x78, +0x0F,0x3E,0x00,0x78,0x1F,0x1E,0x00,0x78,0x3E,0x1F,0x00,0x78,0x7C,0x0E,0x00,0xF8, +0xF8,0x00,0x00,0xF0,0xF0,0x00,0x3F,0xF0,0x60,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 应 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"应"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x01,0xE0,0x00, +0x00,0x01,0xF0,0x00,0x00,0x00,0xF0,0x00,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, +0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1E,0x01,0xE0,0x78,0x1E,0x01,0xE0,0x78, +0x1E,0xE1,0xE0,0x78,0x1F,0xF1,0xF0,0xF8,0x1E,0xF0,0xF0,0xF0,0x1E,0xF0,0xF0,0xF0, +0x1E,0xF8,0xF0,0xF0,0x1E,0x78,0xF1,0xF0,0x1E,0x78,0xF9,0xE0,0x1E,0x78,0x79,0xE0, +0x1E,0x7C,0x7B,0xE0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0,0x1E,0x3C,0x7B,0xC0, +0x3C,0x3E,0x07,0x80,0x3C,0x1C,0x07,0x80,0x3C,0x00,0x07,0x80,0x3C,0x00,0x0F,0x00, +0x78,0x00,0x0F,0x00,0x7B,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00, +0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 的 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"的"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x3C,0x00,0x07,0xC0,0x3E,0x00, +0x07,0x80,0x3C,0x00,0x07,0x80,0x7C,0x00,0x0F,0x00,0x78,0x00,0x7F,0xFE,0x7F,0xFE, +0x7F,0xFE,0xFF,0xFE,0x78,0x1E,0xF0,0x1E,0x78,0x1F,0xE0,0x1E,0x78,0x1F,0xE0,0x1E, +0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xC0,0x1E,0x78,0x1F,0xF0,0x1E,0x78,0x1E,0xF8,0x1E, +0x78,0x1E,0x7C,0x1E,0x7F,0xFE,0x3C,0x1E,0x7F,0xFE,0x1E,0x1E,0x78,0x1E,0x1F,0x1E, +0x78,0x1E,0x0F,0x9E,0x78,0x1E,0x07,0x9E,0x78,0x1E,0x07,0x1E,0x78,0x1E,0x00,0x1E, +0x78,0x1E,0x00,0x1E,0x78,0x1E,0x00,0x3E,0x78,0x1E,0x00,0x3C,0x78,0x1E,0x00,0x3C, +0x7F,0xFE,0x00,0x3C,0x7F,0xFE,0x00,0x7C,0x78,0x1E,0x3F,0xF8,0x78,0x1E,0x3F,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 点 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"点"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF, +0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78,0x0F,0x00,0x00,0x78, +0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0x00,0x00,0x78,0x00,0x00,0x00,0x00, +0x0C,0x38,0x38,0x30,0x1E,0x7C,0x78,0x78,0x3E,0x3C,0x78,0x78,0x3C,0x3C,0x3C,0x3C, +0x7C,0x3E,0x3C,0x3E,0xF8,0x1E,0x3C,0x1E,0xF0,0x1E,0x1E,0x1F,0x70,0x1E,0x1C,0x0E, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 阵 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"阵"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x78,0x00, +0x7F,0xF0,0x78,0x00,0x7F,0xF0,0x78,0x00,0x79,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF, +0x79,0xE1,0xE0,0x00,0x79,0xE1,0xE0,0x00,0x7B,0xC1,0xEF,0x80,0x7B,0xC3,0xCF,0x80, +0x7B,0xC3,0xCF,0x80,0x7F,0x87,0xCF,0x80,0x7F,0x87,0x8F,0x80,0x7F,0x87,0x8F,0x80, +0x7B,0xCF,0x0F,0x80,0x7B,0xCF,0xFF,0xFE,0x79,0xEF,0xFF,0xFE,0x79,0xE0,0x0F,0x80, +0x78,0xE0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80,0x78,0xF0,0x0F,0x80, +0x78,0xFF,0xFF,0xFF,0x79,0xFF,0xFF,0xFF,0x7F,0xE0,0x0F,0x80,0x7F,0xC0,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80,0x78,0x00,0x0F,0x80, +0x78,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 为 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"为"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00, +0x0E,0x07,0x80,0x00,0x1F,0x07,0x80,0x00,0x0F,0x87,0x80,0x00,0x07,0xC7,0x80,0x00, +0x01,0xE7,0x80,0x00,0x00,0xC7,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xFC, +0x7F,0xFF,0xFF,0xFC,0x00,0x07,0x80,0x3C,0x00,0x0F,0x80,0x3C,0x00,0x0F,0x00,0x3C, +0x00,0x0F,0x00,0x3C,0x00,0x0F,0x60,0x3C,0x00,0x1F,0xF0,0x3C,0x00,0x1E,0x78,0x3C, +0x00,0x3E,0x3C,0x3C,0x00,0x3C,0x3E,0x3C,0x00,0x7C,0x1F,0x3C,0x00,0x78,0x0F,0x3C, +0x00,0xF8,0x06,0x3C,0x01,0xF0,0x00,0x3C,0x03,0xE0,0x00,0x7C,0x07,0xC0,0x00,0x7C, +0x0F,0x80,0x00,0x78,0x1F,0x00,0x00,0xF8,0x3E,0x00,0xFF,0xF0,0x7C,0x00,0xFF,0xE0, +0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 树 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"树"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x38, +0x0F,0x00,0x00,0x38,0x0F,0x00,0x00,0x38,0x0F,0x3F,0xF8,0x38,0x0F,0x3F,0xF8,0x38, +0x0F,0x00,0x78,0x38,0xFF,0xE0,0x7F,0xFF,0xFF,0xE0,0x7F,0xFF,0x0F,0x00,0x70,0x38, +0x0F,0x18,0xF0,0x38,0x1F,0x3C,0xF0,0x38,0x1F,0x1C,0xFE,0x38,0x1F,0xDE,0xFE,0x38, +0x3F,0xEF,0xEF,0x38,0x3F,0xFF,0xEF,0x38,0x3F,0xF7,0xE7,0xB8,0x7F,0x67,0xC7,0xB8, +0x7F,0x03,0xC3,0xB8,0xFF,0x07,0xE0,0x38,0xEF,0x07,0xE0,0x38,0xEF,0x0F,0xF0,0x38, +0xCF,0x1F,0xF0,0x38,0x0F,0x1E,0x78,0x38,0x0F,0x3C,0x7C,0x38,0x0F,0x78,0x3C,0x38, +0x0F,0xF8,0x38,0x38,0x0F,0x60,0x00,0x78,0x0F,0x00,0x0F,0xF8,0x0F,0x00,0x07,0xF0, +0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 莓 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"莓"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x3C,0x1E,0x00, +0x00,0x3C,0x1E,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3C,0x1E,0x00, +0x07,0xBC,0x1E,0x00,0x07,0x80,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC, +0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF0, +0xF7,0xFF,0xFF,0xF0,0x37,0x83,0x80,0xF0,0x07,0x87,0xC0,0xF0,0x07,0x83,0xF0,0xF0, +0x07,0x00,0xE0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x00,0xE0, +0x0F,0x0F,0x81,0xE0,0x0E,0x03,0xE1,0xE0,0x1E,0x01,0xC1,0xE0,0x1F,0xFF,0xFF,0xFE, +0x1F,0xFF,0xFF,0xFE,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xFF,0xC0, +0x00,0x00,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 派 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"派"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x3E, +0x7C,0x00,0x3F,0xFE,0x3F,0x3F,0xFF,0xF0,0x1F,0xBF,0xE0,0x00,0x07,0xBC,0x00,0x00, +0x03,0x3C,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x0F,0xFE,0x70,0x3D,0xFF,0xF8, +0xF8,0x3D,0xFF,0x00,0x7C,0x3D,0xE7,0x80,0x3F,0x3D,0xE7,0x80,0x1F,0x3D,0xE7,0x8E, +0x0E,0x3D,0xE7,0x9F,0x00,0x3D,0xE7,0xFE,0x00,0x39,0xE7,0xF8,0x00,0x39,0xE3,0xF0, +0x1C,0x39,0xE3,0xC0,0x1E,0x79,0xE3,0xC0,0x1E,0x79,0xE1,0xE0,0x1E,0x79,0xE1,0xE0, +0x3C,0x79,0xE0,0xF0,0x3C,0x79,0xE0,0xF8,0x3C,0xF1,0xE0,0x7C,0x3C,0xF1,0xE3,0x7C, +0x7D,0xF1,0xEF,0x3F,0x79,0xE1,0xFE,0x1F,0x7B,0xE1,0xF8,0x0E,0x7B,0xC3,0xE0,0x00, +0x79,0x81,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: A --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{ +"A"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x7C,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xFE,0x00,0x00, +0x01,0xFF,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xEF,0x00,0x00,0x03,0xEF,0x80,0x00, +0x03,0xCF,0x80,0x00,0x07,0xC7,0x80,0x00,0x07,0xC7,0xC0,0x00,0x07,0x87,0xC0,0x00, +0x0F,0x83,0xE0,0x00,0x0F,0x83,0xE0,0x00,0x0F,0x01,0xE0,0x00,0x1F,0xFF,0xF0,0x00, +0x1F,0xFF,0xF0,0x00,0x3F,0xFF,0xF8,0x00,0x3E,0x00,0xF8,0x00,0x3C,0x00,0xF8,0x00, +0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x78,0x00,0x3C,0x00,0xF8,0x00,0x3E,0x00, +0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: a --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"a"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00, +0x1F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3E,0x3F,0x00,0x00,0x38,0x1F,0x00,0x00, +0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x03,0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00, +0x3F,0x8F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x7C,0x0F,0x00,0x00,0x78,0x1F,0x00,0x00, +0x7C,0x1F,0x00,0x00,0x7E,0x7F,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00, +0x0F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: b --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"b"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0xFE,0x00,0x00, +0x3D,0xFF,0x80,0x00,0x3F,0xFF,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0x07,0xE0,0x00, +0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3C,0x01,0xE0,0x00,0x3C,0x01,0xE0,0x00, +0x3C,0x01,0xE0,0x00,0x3C,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00,0x3E,0x03,0xE0,0x00, +0x3F,0x07,0xC0,0x00,0x3F,0x8F,0xC0,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0x00,0x00, +0x3C,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: c --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"c"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00, +0x07,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0x86,0x00,0x00,0x3E,0x00,0x00,0x00, +0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x78,0x00,0x00,0x00, +0x78,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, +0x3E,0x00,0x00,0x00,0x3F,0x86,0x00,0x00,0x1F,0xFE,0x00,0x00,0x0F,0xFE,0x00,0x00, +0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 微 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"微"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x01,0xE0,0x07,0x87,0x01,0xE0, +0x07,0x07,0x01,0xC0,0x0F,0xF7,0x79,0xC0,0x1E,0xF7,0x7B,0xC0,0x1E,0xF7,0x7B,0x80, +0x3C,0xF7,0x7B,0xFF,0x78,0xF7,0x7B,0xFF,0xF8,0xF7,0x7F,0x9E,0xF7,0xFF,0xFF,0x9E, +0x67,0xFF,0xFF,0x9E,0x07,0x00,0x7F,0x9C,0x0F,0x00,0x0F,0x9C,0x1E,0x00,0x1F,0x9C, +0x1E,0x7F,0xFF,0xBC,0x3E,0x7F,0xF3,0xFC,0x3E,0x00,0x03,0xFC,0x7E,0x00,0x01,0xF8, +0xFE,0x00,0x01,0xF8,0xFE,0x7F,0xE1,0xF8,0xDE,0x7F,0xE1,0xF8,0x1E,0x78,0xE0,0xF0, +0x1E,0x78,0xEE,0xF0,0x1E,0x78,0xFF,0xF0,0x1E,0x78,0xFD,0xF8,0x1E,0x79,0xFB,0xFC, +0x1E,0xF1,0xF7,0xBC,0x1E,0xF0,0xEF,0x9E,0x1F,0xE0,0x0F,0x0F,0x1E,0xC0,0x1E,0x0F, +0x1E,0x00,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 雪 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"雪"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x78,0x03,0xC0,0x1E,0x78,0x03,0xC0,0x1E, +0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00, +0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x78,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x78, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 电 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"电"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00, +0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8, +0x78,0x07,0x80,0xF8,0x78,0x07,0x80,0xF8,0x7F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF8, +0x78,0x07,0x80,0x0E,0x78,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F,0x00,0x07,0x80,0x0F, +0x00,0x07,0x80,0x1F,0x00,0x07,0x80,0x1E,0x00,0x03,0xFF,0xFE,0x00,0x01,0xFF,0xFC, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + +/*-- 文字: 子 --*/ +/*-- 微软雅黑24; 此字体下对应的点阵为:宽x高=32x41 --*/ +{{"子"},{ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0, +0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00, +0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0xE0,0x00, +0x00,0x03,0xE0,0x00,0x00,0x03,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00}}, + + +}; + +cFONT Font24CN = { + Font24CN_Table, + sizeof(Font24CN_Table)/sizeof(CH_CN), /*size of table*/ + 24, /* ASCII Width */ + 32, /* Width */ + 41, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font8.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font8.c new file mode 100644 index 0000000..88450d9 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/font8.c @@ -0,0 +1,1004 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/fonts.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/fonts.h new file mode 100644 index 0000000..c183f04 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/Fonts/fonts.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/*最大字体微软雅黑24 (32x41) */ +#define MAX_HEIGHT_FONT 41 +#define MAX_WIDTH_FONT 32 +#define OFFSET_BITMAP + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include <stdint.h> + +//ASCII +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + + +//GB2312 +typedef struct // 汉字字模数据结构 +{ + const char index[2]; // 汉字内码索引 + const char matrix[MAX_HEIGHT_FONT*MAX_WIDTH_FONT/8+2]; // 点阵码数据 +}CH_CN; + + +typedef struct +{ + const CH_CN *table; + uint16_t size; + uint16_t ASCII_Width; + uint16_t Width; + uint16_t Height; + +}cFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +extern cFONT Font12CN; +extern cFONT Font24CN; +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.c new file mode 100644 index 0000000..13c9b48 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.c @@ -0,0 +1,421 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.4 +* | Date : 2020-08-17 +* | Info : +* ----------------------------------------------------------------------------- +* V2.4(2020-08-17): +* 1.Add GUI_ReadBmp_65K() +* ----------------------------------------------------------------------------- +* V2.3(2020-08-15): +* 1.Add GUI_ReadBmp_16Gray() +* ----------------------------------------------------------------------------- +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* ----------------------------------------------------------------------------- +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* ----------------------------------------------------------------------------- +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +* ----------------------------------------------------------------------------- +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ + +#include "GUI_BMPfile.h" +#include "GUI_Paint.h" +#include "Debug.h" + +#include <fcntl.h> +#include <unistd.h> +#include <stdint.h> +#include <stdlib.h> //exit() +#include <string.h> //memset() +#include <math.h> //memset() +#include <stdio.h> + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 8 == 0)? (bmpInfoHeader.biWidth / 8): (bmpInfoHeader.biWidth / 8 + 1); + UWORD Bmp_Width_Byte = (Image_Width_Byte % 4 == 0) ? Image_Width_Byte: ((Image_Width_Byte / 4 + 1) * 4); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 1) { + Debug("the bmp Image is not a monochrome bitmap!\n"); + exit(0); + } + + // Determine black and white based on the palette + UWORD i; + UWORD Bcolor, Wcolor; + UWORD bmprgbquadsize = pow(2, bmpInfoHeader.biBitCount);// 2^1 = 2 + BMPRGBQUAD bmprgbquad[bmprgbquadsize]; //palette + // BMPRGBQUAD bmprgbquad[2]; //palette + + for(i = 0; i < bmprgbquadsize; i++){ + // for(i = 0; i < 2; i++) { + fread(&bmprgbquad[i * 4], sizeof(BMPRGBQUAD), 1, fp); + } + if(bmprgbquad[0].rgbBlue == 0xff && bmprgbquad[0].rgbGreen == 0xff && bmprgbquad[0].rgbRed == 0xff) { + Bcolor = BLACK; + Wcolor = WHITE; + } else { + Bcolor = WHITE; + Wcolor = BLACK; + } + + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, readbyte, fp) != readbyte) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte] = Rdata; + // printf("rdata = %d\r\n", Rdata); + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[(x / 8) + (y * Image_Width_Byte)]; + color = (((temp << (x%8)) & 0x80) == 0x80) ?Bcolor:Wcolor; + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} +/************************************************************************* + +*************************************************************************/ +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 4 == 0)? (bmpInfoHeader.biWidth / 4): (bmpInfoHeader.biWidth / 4 + 1); + UWORD Bmp_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 2 + 1); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight * 2]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight * 2); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 4){ + Debug("Bmp image is not a 4-color bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(x < Image_Width_Byte*2) { //bmp + Image[x + (bmpInfoHeader.biHeight - y - 1) * Image_Width_Byte*2] = Rdata; + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color, temp; + printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + temp = Image[x/2 + y * bmpInfoHeader.biWidth/2] >> ((x%2)? 0:4);//0xf 0x8 0x7 0x0 + color = temp>>2; //11 10 01 00 + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 4 + 1); + UWORD Bmp_Width_Byte = (bmpInfoHeader.biWidth % 2 == 0)? (bmpInfoHeader.biWidth / 2): (bmpInfoHeader.biWidth / 2 + 1); + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight * 2]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight * 2); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 4){ + Debug("Bmp image is not a 16-color bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + Image[x + (bmpInfoHeader.biHeight-1 - y) * Image_Width_Byte] = Rdata; + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UBYTE color; + printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + color = Image[x/2 + y * bmpInfoHeader.biWidth/2] >> ((x%2)? 0:4); + color &= 0x0f; + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_65K(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UWORD Image_Width_Byte = bmpInfoHeader.biWidth * 2; + UWORD Bmp_Width_Byte = bmpInfoHeader.biWidth * 2; + UBYTE Image[Image_Width_Byte * bmpInfoHeader.biHeight]; + memset(Image, 0xFF, Image_Width_Byte * bmpInfoHeader.biHeight); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + printf("biBitCount = %d\r\n",readbyte); + if(readbyte != 16){ + Debug("Bmp image is not a 65K-color bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < Bmp_Width_Byte; x++) {//Show a line in the line + if(fread((char *)&Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + Image[x + (bmpInfoHeader.biHeight-1 - y)*Image_Width_Byte] = Rdata; + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + UWORD color; + printf("bmpInfoHeader.biWidth = %d\r\n",bmpInfoHeader.biWidth); + printf("bmpInfoHeader.biHeight = %d\r\n",bmpInfoHeader.biHeight); + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + color = 0; + color |= Image[x*2 + y*bmpInfoHeader.biWidth*2]; + color |= Image[x*2 + y*bmpInfoHeader.biWidth*2 + 1] << 8; + Paint_SetPixel(Xstart + x, Ystart + y, color); + } + } + return 0; +} + +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart) +{ + FILE *fp; //Define a file pointer + BMPFILEHEADER bmpFileHeader; //Define a bmp file header structure + BMPINFOHEADER bmpInfoHeader; //Define a bmp info header structure + + // Binary file open + if((fp = fopen(path, "rb")) == NULL) { + Debug("Cann't open the file!\n"); + exit(0); + } + + // Set the file pointer from the beginning + fseek(fp, 0, SEEK_SET); + fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 14 + fread(&bmpInfoHeader, sizeof(BMPINFOHEADER), 1, fp); //sizeof(BMPFILEHEADER) must be 50 + printf("pixel = %d * %d\r\n", bmpInfoHeader.biWidth, bmpInfoHeader.biHeight); + + UDOUBLE Image_Byte = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3; + UBYTE Image[Image_Byte]; + memset(Image, 0xFF, Image_Byte); + + // Determine if it is a monochrome bitmap + int readbyte = bmpInfoHeader.biBitCount; + if(readbyte != 24){ + Debug("Bmp image is not 24 bitmap!\n"); + exit(0); + } + // Read image data into the cache + UWORD x, y; + UBYTE Rdata[3]; + fseek(fp, bmpFileHeader.bOffset, SEEK_SET); + + for(y = 0; y < bmpInfoHeader.biHeight; y++) {//Total display column + for(x = 0; x < bmpInfoHeader.biWidth ; x++) {//Show a line in the line + if(fread((char *)Rdata, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+1, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + if(fread((char *)Rdata+2, 1, 1, fp) != 1) { + perror("get bmpdata:\r\n"); + break; + } + + if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 0;//Black + }else if(Rdata[0] == 255 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 1;//White + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 2;//Green + }else if(Rdata[0] == 255 && Rdata[1] == 0 && Rdata[2] == 0){ + Image[x+(y* bmpInfoHeader.biWidth )] = 3;//Blue + }else if(Rdata[0] == 0 && Rdata[1] == 0 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 4;//Red + }else if(Rdata[0] == 0 && Rdata[1] == 255 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 5;//Yellow + }else if(Rdata[0] == 0 && Rdata[1] == 128 && Rdata[2] == 255){ + Image[x+(y* bmpInfoHeader.biWidth )] = 6;//Orange + } + } + } + fclose(fp); + + // Refresh the image to the display buffer based on the displayed orientation + for(y = 0; y < bmpInfoHeader.biHeight; y++) { + for(x = 0; x < bmpInfoHeader.biWidth; x++) { + if(x > Paint.Width || y > Paint.Height) { + break; + } + Paint_SetPixel(Xstart + x, Ystart + y, Image[bmpInfoHeader.biHeight * bmpInfoHeader.biWidth - 1 -(bmpInfoHeader.biWidth-x-1+(y* bmpInfoHeader.biWidth))]); + } + } + return 0; +} + + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.h new file mode 100644 index 0000000..2cdd2e6 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_BMPfile.h @@ -0,0 +1,100 @@ +/***************************************************************************** +* | File : GUI_BMPfile.h +* | Author : Waveshare team +* | Function : Hardware underlying interface +* | Info : +* Used to shield the underlying layers of each master +* and enhance portability +*---------------- +* | This version: V2.4 +* | Date : 2020-08-17 +* | Info : +* ----------------------------------------------------------------------------- +* V2.4(2020-08-17): +* 1.Add GUI_ReadBmp_65K() +* ----------------------------------------------------------------------------- +* V2.3(2020-08-15): +* 1.Add GUI_ReadBmp_16Gray() +* ----------------------------------------------------------------------------- +* V2.2(2020-07-08): +* 1.Add GUI_ReadBmp_RGB_7Color() +* ----------------------------------------------------------------------------- +* V2.1(2019-10-10): +* 1.Add GUI_ReadBmp_4Gray() +* ----------------------------------------------------------------------------- +* V2.0(2018-11-12): +* 1.Change file name: GUI_BMP.h -> GUI_BMPfile.h +* 2.fix: GUI_ReadBmp() +* Now Xstart and Xstart can control the position of the picture normally, +* and support the display of images of any size. If it is larger than +* the actual display range, it will not be displayed. +* ----------------------------------------------------------------------------- +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __GUI_BMPFILE_H +#define __GUI_BMPFILE_H + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdint.h> + +#include "../Config/DEV_Config.h" + +/*Bitmap file header 14bit*/ +typedef struct BMP_FILE_HEADER { + UWORD bType; //File identifier + UDOUBLE bSize; //The size of the file + UWORD bReserved1; //Reserved value, must be set to 0 + UWORD bReserved2; //Reserved value, must be set to 0 + UDOUBLE bOffset; //The offset from the beginning of the file header to the beginning of the image data bit +} __attribute__ ((packed)) BMPFILEHEADER; // 14bit + +/*Bitmap information header 40bit*/ +typedef struct BMP_INFO { + UDOUBLE biInfoSize; //The size of the header + UDOUBLE biWidth; //The width of the image + UDOUBLE biHeight; //The height of the image + UWORD biPlanes; //The number of planes in the image + UWORD biBitCount; //The number of bits per pixel + UDOUBLE biCompression; //Compression type + UDOUBLE bimpImageSize; //The size of the image, in bytes + UDOUBLE biXPelsPerMeter; //Horizontal resolution + UDOUBLE biYPelsPerMeter; //Vertical resolution + UDOUBLE biClrUsed; //The number of colors used + UDOUBLE biClrImportant; //The number of important colors +} __attribute__ ((packed)) BMPINFOHEADER; + +/*Color table: palette */ +typedef struct RGB_QUAD { + UBYTE rgbBlue; //Blue intensity + UBYTE rgbGreen; //Green strength + UBYTE rgbRed; //Red intensity + UBYTE rgbReversed; //Reserved value +} __attribute__ ((packed)) BMPRGBQUAD; +/**************************************** end ***********************************************/ + +UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_4Gray(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_16Gray(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_65K(const char *path, UWORD Xstart, UWORD Ystart); +UBYTE GUI_ReadBmp_RGB_7Color(const char *path, UWORD Xstart, UWORD Ystart); +#endif diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.c new file mode 100644 index 0000000..71679a2 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.c @@ -0,0 +1,838 @@ +/****************************************************************************** +* | File : GUI_Paint.c +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +* ----------------------------------------------------------------------------- +* | This version: V3.2 +* | Date : 2020-08-17 +* | Info : +* ----------------------------------------------------------------------------- +* V3.2(2020-08-17): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 65K +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 65K +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 65K +* ----------------------------------------------------------------------------- +* V3.1(2020-08-14): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 16 +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 16 +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 16 +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#include "GUI_Paint.h" +#include "DEV_Config.h" +#include "Debug.h" +#include <stdint.h> +#include <stdlib.h> +#include <string.h> //memset() +#include <math.h> + +PAINT Paint; + +/****************************************************************************** +function: Create Image +parameter: + image : Pointer to the image cache + width : The width of the picture + Height : The height of the picture + Color : Whether the picture is inverted +******************************************************************************/ +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color) +{ + Paint.Image = NULL; + Paint.Image = image; + + Paint.WidthMemory = Width; + Paint.HeightMemory = Height; + Paint.Color = Color; + Paint.Scale = 2; + + Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1); + Paint.HeightByte = Height; +// printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte); +// printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8); + + Paint.Rotate = Rotate; + Paint.Mirror = MIRROR_NONE; + + if(Rotate == ROTATE_0 || Rotate == ROTATE_180) { + Paint.Width = Width; + Paint.Height = Height; + } else { + Paint.Width = Height; + Paint.Height = Width; + } +} + +/****************************************************************************** +function: Select Image +parameter: + image : Pointer to the image cache +******************************************************************************/ +void Paint_SelectImage(UBYTE *image) +{ + Paint.Image = image; +} + +/****************************************************************************** +function: Select Image Rotate +parameter: + Rotate : 0,90,180,270 +******************************************************************************/ +void Paint_SetRotate(UWORD Rotate) +{ + if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) { + Debug("Set image Rotate %d\r\n", Rotate); + Paint.Rotate = Rotate; + } else { + Debug("rotate = 0, 90, 180, 270\r\n"); + } +} + +void Paint_SetScale(UBYTE scale) +{ + if(scale == 2){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1); + }else if(scale == 4){ + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1); + }else if(scale ==16) { + Paint.Scale = scale; + Paint.WidthByte = (Paint.WidthMemory%2==0) ? (Paint.WidthMemory/2) : (Paint.WidthMemory/2+1); + }else if(scale ==65) { + Paint.Scale = scale; + Paint.WidthByte = Paint.WidthMemory*2; + }else{ + Debug("Set Scale Input parameter error\r\n"); + Debug("Scale Only support: 2 4 16 65\r\n"); + } +} +/****************************************************************************** +function: Select Image mirror +parameter: + mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror +******************************************************************************/ +void Paint_SetMirroring(UBYTE mirror) +{ + if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL || + mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) { + Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none"); + Paint.Mirror = mirror; + } else { + Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \ + MIRROR_VERTICAL or MIRROR_ORIGIN\r\n"); + } +} + +/****************************************************************************** +function: Draw Pixels +parameter: + Xpoint : At point X + Ypoint : At point Y + Color : Painted colors +******************************************************************************/ +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +{ + if(Xpoint > Paint.Width || Ypoint > Paint.Height){ + Debug("Exceeding display boundaries\r\n"); + return; + } + UWORD X, Y; + + switch(Paint.Rotate) { + case 0: + X = Xpoint; + Y = Ypoint; + break; + case 90: + X = Paint.WidthMemory - Ypoint - 1; + Y = Xpoint; + break; + case 180: + X = Paint.WidthMemory - Xpoint - 1; + Y = Paint.HeightMemory - Ypoint - 1; + break; + case 270: + X = Ypoint; + Y = Paint.HeightMemory - Xpoint - 1; + break; + default: + return; + } + + switch(Paint.Mirror) { + case MIRROR_NONE: + break; + case MIRROR_HORIZONTAL: + X = Paint.WidthMemory - X - 1; + break; + case MIRROR_VERTICAL: + Y = Paint.HeightMemory - Y - 1; + break; + case MIRROR_ORIGIN: + X = Paint.WidthMemory - X - 1; + Y = Paint.HeightMemory - Y - 1; + break; + default: + return; + } + + if(X > Paint.WidthMemory || Y > Paint.HeightMemory){ + Debug("Exceeding display boundaries\r\n"); + return; + } + + if(Paint.Scale == 2){ + UDOUBLE Addr = X / 8 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + if(Color == BLACK) + Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8)); + else + Paint.Image[Addr] = Rdata | (0x80 >> (X % 8)); + }else if(Paint.Scale == 4){ + UDOUBLE Addr = X / 4 + Y * Paint.WidthByte; + Color = Color % 4;//Guaranteed color scale is 4 --- 0~3 + UBYTE Rdata = Paint.Image[Addr]; + + Rdata = Rdata & (~(0xC0 >> ((X % 4)*2))); + Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2)); + }else if(Paint.Scale == 16) { + UDOUBLE Addr = X / 2 + Y * Paint.WidthByte; + UBYTE Rdata = Paint.Image[Addr]; + Color = Color % 16; + Rdata = Rdata & (~(0xf0 >> ((X % 2)*4))); + Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4)); + }else if(Paint.Scale == 65) { + UDOUBLE Addr = X*2 + Y*Paint.WidthByte; + Paint.Image[Addr] = 0xff & (Color>>8); + Paint.Image[Addr+1] = 0xff & Color; + } + +} + +/****************************************************************************** +function: Clear the color of the picture +parameter: + Color : Painted colors +******************************************************************************/ +void Paint_Clear(UWORD Color) +{ + if(Paint.Scale == 2 || Paint.Scale == 4) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X + Y*Paint.WidthByte; + Paint.Image[Addr] = Color; + } + } + }else if(Paint.Scale == 16) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X + Y*Paint.WidthByte; + Color = Color & 0x0f; + Paint.Image[Addr] = (Color<<4) | Color; + } + } + }else if(Paint.Scale == 65) { + for (UWORD Y = 0; Y < Paint.HeightByte; Y++) { + for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte + UDOUBLE Addr = X*2 + Y*Paint.WidthByte; + Paint.Image[Addr] = 0x0f & (Color>>8); + Paint.Image[Addr+1] = 0x0f & Color; + } + } + } +} + +/****************************************************************************** +function: Clear the color of a window +parameter: + Xstart : x starting point + Ystart : Y starting point + Xend : x end point + Yend : y end point + Color : Painted colors +******************************************************************************/ +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) +{ + UWORD X, Y; + for (Y = Ystart; Y < Yend; Y++) { + for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte + Paint_SetPixel(X, Y, Color); + } + } +} + +/****************************************************************************** +function: Draw Point(Xpoint, Ypoint) Fill the color +parameter: + Xpoint : The Xpoint coordinate of the point + Ypoint : The Ypoint coordinate of the point + Color : Painted color + Dot_Pixel : point size + Dot_Style : point Style +******************************************************************************/ +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, + DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) +{ + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawPoint Input exceeds the normal display range\r\n"); + printf("Xpoint = %d , Paint.Width = %d \r\n ",Xpoint,Paint.Width); + printf("Ypoint = %d , Paint.Height = %d \r\n ",Ypoint,Paint.Height); + return; + } + + int16_t XDir_Num , YDir_Num; + if (Dot_Style == DOT_FILL_AROUND) { + for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) { + if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0) + break; + // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel); + Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color); + } + } + } else { + for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) { + for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) { + Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color); + } + } + } +} + +/****************************************************************************** +function: Draw a line of arbitrary slope +parameter: + Xstart 锛歋tarting Xpoint point coordinates + Ystart 锛歋tarting Xpoint point coordinates + Xend 锛欵nd point Xpoint coordinate + Yend 锛欵nd point Ypoint coordinate + Color 锛歍he color of the line segment + Line_width : Line width + Line_Style: Solid and dotted lines +******************************************************************************/ +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Paint_DrawLine Input exceeds the normal display range\r\n"); + return; + } + + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend; + int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend; + + // Increment direction, 1 is positive, -1 is counter; + int XAddway = Xstart < Xend ? 1 : -1; + int YAddway = Ystart < Yend ? 1 : -1; + + //Cumulative error + int Esp = dx + dy; + char Dotted_Len = 0; + + for (;;) { + Dotted_Len++; + //Painted dotted line, 2 point is really virtual + if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) { + //Debug("LINE_DOTTED\r\n"); + if(Color) + Paint_DrawPoint(Xpoint, Ypoint, BLACK, Line_width, DOT_STYLE_DFT); + else + Paint_DrawPoint(Xpoint, Ypoint, WHITE, Line_width, DOT_STYLE_DFT); + Dotted_Len = 0; + } else { + Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT); + } + if (2 * Esp >= dy) { + if (Xpoint == Xend) + break; + Esp += dy; + Xpoint += XAddway; + } + if (2 * Esp <= dx) { + if (Ypoint == Yend) + break; + Esp += dx; + Ypoint += YAddway; + } + } +} + +/****************************************************************************** +function: Draw a rectangle +parameter: + Xstart 锛歊ectangular Starting Xpoint point coordinates + Ystart 锛歊ectangular Starting Xpoint point coordinates + Xend 锛歊ectangular End point Xpoint coordinate + Yend 锛歊ectangular End point Ypoint coordinate + Color 锛歍he color of the Rectangular segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the rectangle +******************************************************************************/ +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (Xstart > Paint.Width || Ystart > Paint.Height || + Xend > Paint.Width || Yend > Paint.Height) { + Debug("Input exceeds the normal display range\r\n"); + return; + } + + if (Draw_Fill) { + UWORD Ypoint; + for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) { + Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID); + } + } else { + Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID); + Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID); + } +} + +/****************************************************************************** +function: Use the 8-point method to draw a circle of the + specified size at the specified position-> +parameter: + X_Center 锛欳enter X coordinate + Y_Center 锛欳enter Y coordinate + Radius 锛歝ircle Radius + Color 锛歍he color of the 锛歝ircle segment + Line_width: Line width + Draw_Fill : Whether to fill the inside of the Circle +******************************************************************************/ +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, + UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +{ + if (X_Center > Paint.Width || Y_Center >= Paint.Height) { + Debug("Paint_DrawCircle Input exceeds the normal display range\r\n"); + return; + } + + //Draw a circle from(0, R) as a starting point + int16_t XCurrent, YCurrent; + XCurrent = 0; + YCurrent = Radius; + + //Cumulative error,judge the next point of the logo + int16_t Esp = 3 - (Radius << 1 ); + + int16_t sCountY; + if (Draw_Fill == DRAW_FILL_FULL) { + while (XCurrent <= YCurrent ) { //Realistic circles + for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } else { //Draw a hollow circle + while (XCurrent <= YCurrent ) { + Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1 + Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2 + Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3 + Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4 + Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5 + Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6 + Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7 + Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0 + + if (Esp < 0 ) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent ); + YCurrent --; + } + XCurrent ++; + } + } +} + +/****************************************************************************** +function: Show English characters +parameter: + Xpoint 锛歑 coordinate + Ypoint 锛歒 coordinate + Acsii_Char 锛歍o display the English characters + Font 锛欰 structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Page, Column; + + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DrawChar Input exceeds the normal display range\r\n"); + return; + } + + uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0)); + const unsigned char *ptr = &Font->table[Char_Offset]; + + for (Page = 0; Page < Font->Height; Page ++ ) { + for (Column = 0; Column < Font->Width; Column ++ ) { + + //To determine whether the font background color and screen background color is consistent + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (Column % 8))) + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + if (*ptr & (0x80 >> (Column % 8))) { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background); + // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + //One pixel is 8 bits + if (Column % 8 == 7) + ptr++; + }// Write a line + if (Font->Width % 8 != 0) + ptr++; + }// Write all +} + +/****************************************************************************** +function: Display the string +parameter: + Xstart 锛歑 coordinate + Ystart 锛歒 coordinate + pString 锛歍he first address of the English string to be displayed + Font 锛欰 structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, + sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) +{ + UWORD Xpoint = Xstart; + UWORD Ypoint = Ystart; + + if (Xstart > Paint.Width || Ystart > Paint.Height) { + Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n"); + return; + } + + while (* pString != '\0') { + //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character + if ((Xpoint + Font->Width ) > Paint.Width ) { + Xpoint = Xstart; + Ypoint += Font->Height; + } + + // If the Y direction is full, reposition to(Xstart, Ystart) + if ((Ypoint + Font->Height ) > Paint.Height ) { + Xpoint = Xstart; + Ypoint = Ystart; + } + Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground); + + //The next character of the address + pString ++; + + //The next word of the abscissa increases the font of the broadband + Xpoint += Font->Width; + } +} + + +/****************************************************************************** +function: Display the string +parameter: + Xstart 锛歑 coordinate + Ystart 锛歒 coordinate + pString 锛歍he first address of the Chinese string and English + string to be displayed + Font 锛欰 structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, + UWORD Color_Foreground, UWORD Color_Background) +{ + const char* p_text = pString; + int x = Xstart, y = Ystart; + int i, j,Num; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + if(*p_text <= 0x7F) { //ASCII < 126 + for(Num = 0; Num < font->size; Num++) { + if(*p_text== font->table[Num].index[0]) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 1; + /* Decrement the column position by 16 */ + x += font->ASCII_Width; + } else { //Chinese + for(Num = 0; Num < font->size; Num++) { + if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) { + const char* ptr = &font->table[Num].matrix[0]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } else { + if (*ptr & (0x80 >> (i % 8))) { + Paint_SetPixel(x + i, y + j, Color_Foreground); + // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } else { + Paint_SetPixel(x + i, y + j, Color_Background); + // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT); + } + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } + break; + } + } + /* Point on the next character */ + p_text += 2; + /* Decrement the column position by 16 */ + x += font->Width; + } + } +} + +/****************************************************************************** +function: Display nummber +parameter: + Xstart 锛歑 coordinate + Ystart : Y coordinate + Nummber : The number displayed + Font 锛欰 structure pointer that displays a character size + Digit : Fractional width + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +#define ARRAY_LEN 255 +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, double Nummber, + sFONT* Font, UWORD Digit,UWORD Color_Foreground, UWORD Color_Background) +{ + int16_t Num_Bit = 0, Str_Bit = 0; + uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0}; + uint8_t *pStr = Str_Array; + int temp = Nummber; + float decimals; + uint8_t i; + if (Xpoint > Paint.Width || Ypoint > Paint.Height) { + Debug("Paint_DisNum Input exceeds the normal display range\r\n"); + return; + } + + if(Digit > 0) { + decimals = Nummber - temp; + for(i=Digit; i > 0; i--) { + decimals*=10; + } + temp = decimals; + //Converts a number to a string + for(i=Digit; i>0; i--) { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } + Num_Array[Num_Bit] = '.'; + Num_Bit++; + } + + temp = Nummber; + //Converts a number to a string + while (temp) { + Num_Array[Num_Bit] = temp % 10 + '0'; + Num_Bit++; + temp /= 10; + } + + //The string is inverted + while (Num_Bit > 0) { + Str_Array[Str_Bit] = Num_Array[Num_Bit - 1]; + Str_Bit ++; + Num_Bit --; + } + + //show + Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display time +parameter: + Xstart 锛歑 coordinate + Ystart : Y coordinate + pTime : Time-related structures + Font 锛欰 structure pointer that displays a character size + Color_Foreground : Select the foreground color + Color_Background : Select the background color +******************************************************************************/ +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, + UWORD Color_Foreground, UWORD Color_Background) +{ + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + UWORD Dx = Font->Width; + + //Write data into the cache + Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground); + Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground); +} + +/****************************************************************************** +function: Display monochrome bitmap +parameter: + image_buffer 锛欰 picture data converted to a bitmap +info: + Use a computer to convert the image into a corresponding array, + and then embed the array directly into Imagedata.cpp as a .c file. +******************************************************************************/ +void Paint_DrawBitMap(const unsigned char* image_buffer) +{ + UWORD x, y; + UDOUBLE Addr = 0; + + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte; + Paint.Image[Addr] = (unsigned char)image_buffer[Addr]; + } + } +} + +void Paint_DrawBitMap_Block(const unsigned char* image_buffer, UBYTE Region) +{ + UWORD x, y; + UDOUBLE Addr = 0; + for (y = 0; y < Paint.HeightByte; y++) { + for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte + Addr = x + y * Paint.WidthByte ; + Paint.Image[Addr] = \ + (unsigned char)image_buffer[Addr+ (Paint.HeightByte)*Paint.WidthByte*(Region - 1)]; + } + } +} + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.h new file mode 100644 index 0000000..ea49cf7 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/GUI/GUI_Paint.h @@ -0,0 +1,231 @@ +/****************************************************************************** +* | File : GUI_Paint.h +* | Author : Waveshare electronics +* | Function : Achieve drawing: draw points, lines, boxes, circles and +* their size, solid dotted line, solid rectangle hollow +* rectangle, solid circle hollow circle. +* | Info : +* Achieve display characters: Display a single character, string, number +* Achieve time display: adaptive size display time minutes and seconds +* ----------------------------------------------------------------------------- +* | This version: V3.2 +* | Date : 2020-08-17 +* | Info : +* ----------------------------------------------------------------------------- +* V3.2(2020-08-17): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 65K +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 65K +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 65K +* ----------------------------------------------------------------------------- +* V3.1(2020-08-14): +* 1.Change: Paint_SetScale(UBYTE scale) +* Add scale 16 +* 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) +* Add the branch for scale 16 +* 3.Change: Paint_Clear(UWORD Color) +* Add the branch for scale 16 +* ----------------------------------------------------------------------------- +* V3.0(2019-04-18): +* 1.Change: +* Paint_DrawPoint(..., DOT_STYLE DOT_STYLE) +* => Paint_DrawPoint(..., DOT_STYLE Dot_Style) +* Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel) +* => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style) +* Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel) +* => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) +* Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel) +* => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll) +* +* ----------------------------------------------------------------------------- +* V2.0(2018-11-15): +* 1.add: Paint_NewImage() +* Create an image's properties +* 2.add: Paint_SelectImage() +* Select the picture to be drawn +* 3.add: Paint_SetRotate() +* Set the direction of the cache +* 4.add: Paint_RotateImage() +* Can flip the picture, Support 0-360 degrees, +* but only 90.180.270 rotation is better +* 4.add: Paint_SetMirroring() +* Can Mirroring the picture, horizontal, vertical, origin +* 5.add: Paint_DrawString_CN() +* Can display Chinese(GB1312) +* +* ----------------------------------------------------------------------------- +* V1.0(2018-07-17): +* Create library +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documnetation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +* +******************************************************************************/ +#ifndef __GUI_PAINT_H +#define __GUI_PAINT_H + +#include "../Config/DEV_Config.h" +#include "../Fonts/fonts.h" + +/** + * Image attributes +**/ +typedef struct { + UBYTE *Image; + UWORD Width; + UWORD Height; + UWORD WidthMemory; + UWORD HeightMemory; + UWORD Color; + UWORD Rotate; + UWORD Mirror; + UWORD WidthByte; + UWORD HeightByte; + UWORD Scale; +} PAINT; +extern PAINT Paint; + +/** + * Display rotate +**/ +#define ROTATE_0 0 +#define ROTATE_90 90 +#define ROTATE_180 180 +#define ROTATE_270 270 + +/** + * Display Flip +**/ +typedef enum { + MIRROR_NONE = 0x00, + MIRROR_HORIZONTAL = 0x01, + MIRROR_VERTICAL = 0x02, + MIRROR_ORIGIN = 0x03, +} MIRROR_IMAGE; +#define MIRROR_IMAGE_DFT MIRROR_NONE + +/** + * image color +**/ +#define WHITE 0xFFFF +#define BLACK 0x0000 +#define BLUE 0x001F +#define BRED 0XF81F +#define GRED 0XFFE0 +#define GBLUE 0X07FF +#define RED 0xF800 +#define MAGENTA 0xF81F +#define GREEN 0x07E0 +#define CYAN 0x7FFF +#define YELLOW 0xFFE0 +#define BROWN 0XBC40 +#define BRRED 0XFC07 +#define GRAY 0X8430 + +#define IMAGE_BACKGROUND WHITE +#define FONT_FOREGROUND BLACK +#define FONT_BACKGROUND WHITE + +/** + * The size of the point +**/ +typedef enum { + DOT_PIXEL_1X1 = 1, // 1 x 1 + DOT_PIXEL_2X2 , // 2 X 2 + DOT_PIXEL_3X3 , // 3 X 3 + DOT_PIXEL_4X4 , // 4 X 4 + DOT_PIXEL_5X5 , // 5 X 5 + DOT_PIXEL_6X6 , // 6 X 6 + DOT_PIXEL_7X7 , // 7 X 7 + DOT_PIXEL_8X8 , // 8 X 8 +} DOT_PIXEL; +#define DOT_PIXEL_DFT DOT_PIXEL_1X1 //Default dot pilex + +/** + * Point size fill style +**/ +typedef enum { + DOT_FILL_AROUND = 1, // dot pixel 1 x 1 + DOT_FILL_RIGHTUP , // dot pixel 2 X 2 +} DOT_STYLE; +#define DOT_STYLE_DFT DOT_FILL_AROUND //Default dot pilex + +/** + * Line style, solid or dashed +**/ +typedef enum { + LINE_STYLE_SOLID = 0, + LINE_STYLE_DOTTED, +} LINE_STYLE; + +/** + * Whether the graphic is filled +**/ +typedef enum { + DRAW_FILL_EMPTY = 0, + DRAW_FILL_FULL, +} DRAW_FILL; + +/** + * Custom structure of a time attribute +**/ +typedef struct { + UWORD Year; //0000 + UBYTE Month; //1 - 12 + UBYTE Day; //1 - 30 + UBYTE Hour; //0 - 23 + UBYTE Min; //0 - 59 + UBYTE Sec; //0 - 59 +} PAINT_TIME; +extern PAINT_TIME sPaint_time; + +//init and Clear +void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); +void Paint_SelectImage(UBYTE *image); +void Paint_SetRotate(UWORD Rotate); +void Paint_SetMirroring(UBYTE mirror); +void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color); +void Paint_SetScale(UBYTE scale); + +void Paint_Clear(UWORD Color); +void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color); + +//Drawing +void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_FillWay); +void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style); +void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); +void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill); + +//Display string +void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Acsii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, double Nummber, sFONT* Font, UWORD Digit,UWORD Color_Foreground, UWORD Color_Background); +void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background); + +//pic +void Paint_DrawBitMap(const unsigned char* image_buffer); +void Paint_DrawBitMap_Block(const unsigned char* image_buffer, UBYTE Region); +#endif + + + + + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.c b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.c new file mode 100644 index 0000000..83d597a --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.c @@ -0,0 +1,196 @@ +/***************************************************************************** +* | File : OLED_1in5.c +* | Author : Waveshare team +* | Function : 1.5inch OLED Module Drive function +* | Info : +*---------------- +* | This version: V2.0 +* | Date : 2020-08-15 +* | Info : +* ----------------------------------------------------------------------------- +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include "OLED_1in5.h" +#include "stdio.h" + +/******************************************************************************* +function: + Hardware reset +*******************************************************************************/ +static void OLED_Reset(void) +{ + OLED_RST_1; + DEV_Delay_ms(100); + OLED_RST_0; + DEV_Delay_ms(100); + OLED_RST_1; + DEV_Delay_ms(100); +} + +/******************************************************************************* +function: + Write register address and data +*******************************************************************************/ +static void OLED_WriteReg(uint8_t Reg) +{ +#if USE_SPI + OLED_DC_0; + DEV_SPI_WriteByte(Reg); +#elif USE_IIC + I2C_Write_Byte(Reg,IIC_CMD); +#endif +} + +static void OLED_WriteData(uint8_t Data) +{ +#if USE_SPI + OLED_DC_1; + DEV_SPI_WriteByte(Data); +#elif USE_IIC + I2C_Write_Byte(Data,IIC_RAM); +#endif +} + +/******************************************************************************* +function: + Common register initialization +*******************************************************************************/ +static void OLED_InitReg(void) +{ + OLED_WriteReg(0xae);//--turn off oled panel + + OLED_WriteReg(0x15); // set column address + OLED_WriteReg(0x00); // start column 0 + OLED_WriteReg(0x7f); // end column 127 + + OLED_WriteReg(0x75); // set row address + OLED_WriteReg(0x00); // start row 0 + OLED_WriteReg(0x7f); // end row 127 + + OLED_WriteReg(0x81); // set contrast control + OLED_WriteReg(0x80); + + OLED_WriteReg(0xa0); // gment remap + OLED_WriteReg(0x51); //51 + + OLED_WriteReg(0xa1); // start line + OLED_WriteReg(0x00); + + OLED_WriteReg(0xa2); // display offset + OLED_WriteReg(0x00); + + OLED_WriteReg(0xa4); // rmal display + OLED_WriteReg(0xa8); // set multiplex ratio + OLED_WriteReg(0x7f); + + OLED_WriteReg(0xb1); // set phase leghth + OLED_WriteReg(0xf1); + + OLED_WriteReg(0xb3); // set dclk + OLED_WriteReg(0x00); //80Hz:0xc1 90Hz:0xe1 100Hz:0x00 110Hz:0x30 120Hz:0x50 130Hz:0x70 01 + + OLED_WriteReg(0xab); // + OLED_WriteReg(0x01); // + + OLED_WriteReg(0xb6); // set phase leghth + OLED_WriteReg(0x0f); + + OLED_WriteReg(0xbe); + OLED_WriteReg(0x0f); + + OLED_WriteReg(0xbc); + OLED_WriteReg(0x08); + + OLED_WriteReg(0xd5); + OLED_WriteReg(0x62); + + OLED_WriteReg(0xfd); + OLED_WriteReg(0x12); + +} + +/******************************************************************************** +function: + initialization +********************************************************************************/ +void OLED_1in5_Init(void) +{ + //Hardware reset + OLED_Reset(); + + //Set the initialization register + OLED_InitReg(); + DEV_Delay_ms(200); + + //Turn on the OLED display + OLED_WriteReg(0xAF); +} + +/******************************************************************************** +function: Set the display Window(Xstart, Ystart, Xend, Yend) +parameter: + xStart : X direction Start coordinates + Ystart : Y direction Start coordinates + Xend : X direction end coordinates + Yend : Y direction end coordinates +********************************************************************************/ +static void OLED_SetWindow(UBYTE Xstart, UBYTE Ystart, UBYTE Xend, UBYTE Yend) +{ + if((Xstart > OLED_1in5_WIDTH) || (Ystart > OLED_1in5_HEIGHT) || + (Xend > OLED_1in5_WIDTH) || (Yend > OLED_1in5_HEIGHT)) + return; + + OLED_WriteReg(0x15); + OLED_WriteReg(Xstart/2); + OLED_WriteReg(Xend/2 - 1); + + OLED_WriteReg(0x75); + OLED_WriteReg(Ystart); + OLED_WriteReg(Yend - 1); +} + +/******************************************************************************** +function: + Clear screen +********************************************************************************/ +void OLED_1in5_Clear(void) +{ + UWORD i; + OLED_SetWindow(0, 0, 128, 128); + for(i=0; i<OLED_1in5_WIDTH*OLED_1in5_HEIGHT/2; i++){ + OLED_WriteData(0x00); + } +} + +/******************************************************************************** +function: Update all memory to OLED +********************************************************************************/ +void OLED_1in5_Display(UBYTE *Image) +{ + UWORD i, j, temp; + OLED_SetWindow(0, 0, 128, 128); + for(i=0; i<OLED_1in5_HEIGHT; i++) + for(j=0; j<OLED_1in5_WIDTH/2; j++) + { + temp = Image[j + i*64]; + OLED_WriteData(temp); + } +} diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.h b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.h new file mode 100644 index 0000000..4eacb05 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/lib/OLED/OLED_1in5.h @@ -0,0 +1,50 @@ +/***************************************************************************** +* | File : OLED_1in5.h +* | Author : Waveshare team +* | Function : 1.5inch OLED Module Drive function +* | Info : +*---------------- +* | This version: V2.0 +* | Date : 2020-08-15 +* | Info : +* ----------------------------------------------------------------------------- +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#ifndef __OLED_1IN5_H +#define __OLED_1IN5_H + +#include "DEV_Config.h" + +/******************************************************************************** +function: + Define the full screen height length of the display +********************************************************************************/ + +#define OLED_1in5_WIDTH 128//OLED width +#define OLED_1in5_HEIGHT 128 //OLED height + + +void OLED_1in5_Init(void); +void OLED_1in5_Clear(void); +void OLED_1in5_Display(UBYTE *Image); + +#endif + diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/main b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/main new file mode 100755 index 0000000000000000000000000000000000000000..e77b2d2f3cac029a11b024e726fe39126e46f9c8 GIT binary patch literal 94556 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 Ctcjrj literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in91.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in91.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4befc79da6e3af5e052966fd81dadf36e8acd86f GIT binary patch literal 576 zcmchT!AiqG5QfL3&|7lwDx}bYp85o0#k=N_Qt;qK5ZVXuRV)!3Xz0E|WR<<9?4c22 zrvGeHbMVwlC(LZV`Tw0Exx2sh$i)rn6>^FkAkXkfc+iLAeYyq;GrL!urwG+8QQDRi zauagunyXJOTo5lDFDmpE>xwsyvpf_wb@Jml|A^qX=9gPeqb<K!V-CEE;J13&@_H@) zlKL$_1hL%z(}N(!-0ptZV3}}1lt6jzsd6O#mh+zIGOvQlysTArX}fvfRh*5^W!_%@ z@_c2i<3#+|Gyjcz@i&q1#Vkn;enFoZABuhRiOkne%#XtF^GN~Ga816jdHu)I)>4iS Fq8&<3w4ne1 literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in95_rgb.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in95_rgb.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4e3e1586615aee077b7d453cd78c024a417b4097 GIT binary patch literal 12360 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 LKYRgBPw#&KK^yL# literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in96.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/0in96.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e0afd5e8a6595083e11e0a47185067c1d664b282 GIT binary patch literal 1088 zcmd^;v5wR*5Qcxp$fmHeltv0ld!;2PQmoh$5+(28iaKQ~;?othlspEHFw*r%yn(4` zgJ@Em&iwZ3(3aOTksW_yXY$WX^6ta+Gc<e4`HCZPTyrR1)jICKd4C?w!Ksw;xcu+# zs%)1zE7qdqN6&~u<$p)ke7Z$`Rm#Kp#P5Bv5O3CU-yCwxMv)msszVOqR3fK!Z)}s- zDfBAE7C~&9Gy>1WF^xbZSj5VQJHB<+h~~`xSJ}bC(jz;%{fZ-oPKl#{%10b9b~+6d zP<bL3Xm|?H$lha68w>&kFwEo`Ey2}y1Oo{ky9IpHQ2DvaJ(hq>0gZKb7^0$p$RuZA za}1}FL#zn_vtu}o0X1pzWVp5rSvkLew^-04s5DT(NST5vpb3-{m9iBcnVPMVBbQ5u zsd8WiKXN&BJT1(j@yuMfn+)b&<B!eMu0%6rWQBel68Sb+ipb95ivdJ`rT_|JOTKBc z{m$J<$<%As1!C^GOM$^@&MNf_0;8nhO@vVR5wQx2-ehEzrV*J>AqTf{M>hMjJ_U&{ zE8k^RTTsjK`YR)qgmpJyKjbu!KLM8CQs~sp0}F#{r}o8_-7?>1YjX%ioVoq40=2OP Pm$tHcmo~~JJ#GCL^V+qL literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e0afd5e8a6595083e11e0a47185067c1d664b282 GIT binary patch literal 1088 zcmd^;v5wR*5Qcxp$fmHeltv0ld!;2PQmoh$5+(28iaKQ~;?othlspEHFw*r%yn(4` zgJ@Em&iwZ3(3aOTksW_yXY$WX^6ta+Gc<e4`HCZPTyrR1)jICKd4C?w!Ksw;xcu+# zs%)1zE7qdqN6&~u<$p)ke7Z$`Rm#Kp#P5Bv5O3CU-yCwxMv)msszVOqR3fK!Z)}s- zDfBAE7C~&9Gy>1WF^xbZSj5VQJHB<+h~~`xSJ}bC(jz;%{fZ-oPKl#{%10b9b~+6d zP<bL3Xm|?H$lha68w>&kFwEo`Ey2}y1Oo{ky9IpHQ2DvaJ(hq>0gZKb7^0$p$RuZA za}1}FL#zn_vtu}o0X1pzWVp5rSvkLew^-04s5DT(NST5vpb3-{m9iBcnVPMVBbQ5u zsd8WiKXN&BJT1(j@yuMfn+)b&<B!eMu0%6rWQBel68Sb+ipb95ivdJ`rT_|JOTKBc z{m$J<$<%As1!C^GOM$^@&MNf_0;8nhO@vVR5wQx2-ehEzrV*J>AqTf{M>hMjJ_U&{ zE8k^RTTsjK`YR)qgmpJyKjbu!KLM8CQs~sp0}F#{r}o8_-7?>1YjX%ioVoq40=2OP Pm$tHcmo~~JJ#GCL^V+qL literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3c.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in3c.bmp new file mode 100644 index 0000000000000000000000000000000000000000..952d7464f1291f317c5d32bd44c2577508d4dc99 GIT binary patch literal 1088 zcmb``L5tHs6bJAZM>0V}E1n`-(zqutLc+q*!<rQDeupiA?a}nUZX$x~LD;iU@GIyy zm=b6%{SaA%?$LPB9!kgmOqy*fDjs}gCi9y&c{6F7=P!nLNk@qO30j6WL^JSFaR>Q_ z_v@x7&`Bwq;r43%cZ=_StENR_zVFk2a*}?Vt*9i6{6gIi=Ns+dM_Ie5?abA7Nl5%E zT9L)pwYx-IStSt(&-Tp(bx%}%qMphd6<xTsO(HX)i8$}V&OCaHQWflS?f6PLnG_x6 zN6Qh+s<h%8rv2(;hI&!S)&_iV%s(jig`uD4;CS>IZo+ci;FD-X1o!>6d!1bpBg?_* zTG2dTGxdApcmHeXyS=8y_WCCee#zS~lTvsT@uj~`mAUrl{W6#qF5K4^i?bs;SB~UY ztf$6?ls7O}PLJ>(mhu`tvDNxmmsdWu$H6onWyEf#0W9osxej6eWjcVb1(DjFcy2jx zgyGirEciC~jAwg(7te(E;5KhsaV`$^>!jz*-lPzRgJHA4>{a8;+t4PYevz?~%PP$t zOG;wu*kxzH<tioEVZ?B1d>!ixdMbUJy?lLHD$AA1o9?r0(egYdXE9zldLPu+KHI)9 c*#A7F?q&X_)cMx=>h-(x*Vg^6^L9g`pIkfQk^lez literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0fee612a000471769e1261fee7595599f1daf74c GIT binary patch literal 8312 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 literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in51.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in51.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ad3edfb64898876780db1dcd4d1ac7594f8f49b GIT binary patch literal 1088 zcmb8vKX21O7zXfjg9t-Z4=jlk$bbYLTf77z;ljkicL)nz7=l<bRJlZ5K&t4#l1P#A zHOl6wl>$>gf*m3?V!P0x7umXp=gx^pBO#TG&i2pm{dw=s%Bwf~cZ4f1c->*`u<o;Z z{MoX__}O+|-3wj-xJTZXC0;$;+O^~HTAvuh4WCpQpD58n5ehLbmTn$;H{BA>V;9$< zR!wQ!UzU9K&uUP*DZ&^(ODEQRnft2B=_h7oQ*h>F&@J{iUS{Js0#vKX@qi2K5tp9j zw)r6eylmISr`AeC7<%42&#k1Af-ZNa$R-K1)47i)$ULQ5(6Yn$z0SzG0k)ujzm9%z zXf2?HjI8x{j-PonCyiAj`UEU&zQx>=0driHSTV7+5-YVPu>Xc{L>a%8SKq_xZabwL zJ^$@FV1$>#$h-?P((C2{sHN3Bs1F7bk$9PA?Y2xBLA_kHew&&wlh==fpx=||(5Pvc zCqdAwg#1cBq&R&5O%LeOyS)_3hnfX@!>^&K9z08t6fvFc*30+lStUhO!0h1ZVfE3_ zJiPwqoJe5Ebi?^PO`?LYvGgK0>Eh3O6W89F#eCfKVC3dYn&^&A&4}#+?IUT(?veI$ zpH?t8a=hR&#NDD>k2Z4pYe8@MZoQd~uDaI3cl%*lmy7;q>(K3|Y0E`_C#I#d8~;7W a_jo?sZ=U|y_)E>^_;>%U{^$JcpTHkw`yrSB literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb.bmp new file mode 100644 index 0000000000000000000000000000000000000000..01b3ded8b722ced630ec7c94a1838fdef4c54159 GIT binary patch literal 32840 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 literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb1.bmp b/OLED_Module_Code/OLED_Module_Code/RaspberryPi/c/pic/1in5_rgb1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8f20ccb905f95bc427e2552f92808aadf41621a1 GIT binary patch literal 32840 zcmeI4F%H5o5CjiUM9TvrQP5LUQy?0eyeMs&yfF{R1Kb6l1Fx7l%ZSkJ-i{Ahi09`$ zMypqSebhbv_8~5Ds_&2WgWG-I^>MEfv795W|K}(xcclqj^<`DR{Wt$y2jpM=x#@TQ z$-n%|Ki2{Imw#^ho&U){yEb^SyPxWpjl0xu|GDX3HuG=(%|F)x`Imog`kjCBFaPq- zbwK{*KQq8B`1NPI0pNDODKEiYX#iJ!{VlNi?LXK7^Y8iR`OkGg{^g&We!u_8zx>NT z*8%yLe{TBs`JW76%lmI^>wm(hmAldcuKKC{|AG3s4w!%W=ceEDPyXd!{<#jwzx;F4 z@BEj4`ImpL1Ia(Ty#HqRKVq1<D|^pXKg{a4|K^|Tfc(opH~r2(`ImqB=Q<$&^3P4b z^FR4#m-nCS{zvp3cV+Ln>ibUp_TT(-9gu(d=ceEJC;##<|6B*;U;er2cm5~;^!ftm Cksh4@ literal 0 HcmV?d00001 diff --git a/OLED_Module_Code/OLED_Module_Code/Version_CN.txt b/OLED_Module_Code/OLED_Module_Code/Version_CN.txt new file mode 100644 index 0000000..d5a92c2 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/Version_CN.txt @@ -0,0 +1,2 @@ +锘�2020-08-20: 瀹屾垚鍏ㄩ儴鏁村悎銆� +2020-09-15锛氫慨鏀归粯璁ゆ帴鍙d负SPI銆� \ No newline at end of file diff --git a/OLED_Module_Code/OLED_Module_Code/Version_EN.txt b/OLED_Module_Code/OLED_Module_Code/Version_EN.txt new file mode 100644 index 0000000..58003e0 --- /dev/null +++ b/OLED_Module_Code/OLED_Module_Code/Version_EN.txt @@ -0,0 +1,2 @@ +2020-08-20: Completed the integration. +2020-09-15锛欳hange the default interface to SPI \ No newline at end of file diff --git a/oled b/oled new file mode 100755 index 0000000000000000000000000000000000000000..c4c3b64fb5cf1c0c5997d17cc3153636fe5a75d0 GIT binary patch literal 8476 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 literal 0 HcmV?d00001 -- GitLab