1
0

Remove TFT_lib as a submodule and add as components again

This commit is contained in:
Christian Loch 2020-04-20 12:39:01 +02:00
parent 1cb397c98a
commit 206c00c10f
27 changed files with 9839 additions and 324 deletions

7
.gitmodules vendored
View File

@ -1,7 +0,0 @@
[submodule "components/ucglib"]
path = components/ucglib
url = https://github.com/olikraus/ucglib.git
branch = master
[submodule "components/ESP32_TFT_library"]
path = components/ESP32_TFT_library
url = https://github.com/jeremyjh/ESP32_TFT_library.git

View File

@ -3,6 +3,4 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake) include($ENV{IDF_PATH}/tools/cmake/project.cmake)
set(EXTRA_COMPONENT_DIRS
externals/ESP32_TFT_library/components)
project(app-template) project(app-template)

View File

@ -1,3 +1,3 @@
idf_component_register(SRCS "esp32_ucglib_hal.c" "display.c" idf_component_register(SRCS "display.c"
INCLUDE_DIRS "." INCLUDE_DIRS "."
REQUIRES ucglib driver tft) REQUIRES tft)

View File

@ -1,290 +0,0 @@
#include "esp32_ucglib_hal.h"
static spi_device_handle_t spi_hdl;
static ucg_esp32_hal_t pins;
static uint8_t* buffer_1 = 0;
static uint8_t* buffer_2 = 0;
static uint8_t* buffer_3 = 0;
int16_t ucg_esp32_hal(ucg_t *ucg, int16_t msg, uint16_t arg, uint8_t *data) {
//ESP_LOGI("hal", "spi_byte_cb: Received a msg: %d, arg: %d, arg_ptr: %p",
// msg, arg, data);
switch (msg) {
case UCG_COM_MSG_POWER_UP:
//ESP_LOGI("hal", "UCG_COM_MSG_POWER_UP");
/* "data" is a pointer to ucg_com_info_t structure with the following information: */
/* ((ucg_com_info_t *)data)->serial_clk_speed value in nanoseconds */
/* ((ucg_com_info_t *)data)->parallel_clk_speed value in nanoseconds */
/* "arg" is not used */
/* This message is sent once at the uC startup and for power up. */
/* setup i/o or do any other setup */
;
buffer_1 = (uint8_t*) heap_caps_malloc(1, MALLOC_CAP_DMA);
buffer_2 = (uint8_t*) heap_caps_malloc(1, MALLOC_CAP_DMA);
buffer_3 = (uint8_t*) heap_caps_malloc(1, MALLOC_CAP_DMA);
pins.clk = GPIO_NUM_18;
pins.cs = GPIO_NUM_17;
pins.dc = GPIO_NUM_2;
pins.mosi = GPIO_NUM_23;
pins.reset = GPIO_NUM_14;
gpio_config_t gp_config;
gp_config.intr_type = GPIO_INTR_DISABLE;
gp_config.mode = GPIO_MODE_OUTPUT;
gp_config.pin_bit_mask = ((1ULL << pins.reset) | (1ULL << pins.cs) | (1ULL << pins.dc));
gp_config.pull_down_en = GPIO_PULLDOWN_ENABLE;
gp_config.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&gp_config);
spi_bus_config_t* bus_config;
bus_config = heap_caps_calloc(1, sizeof(spi_bus_config_t), MALLOC_CAP_8BIT);
bus_config->mosi_io_num = pins.mosi;
bus_config->miso_io_num = -1;
bus_config->sclk_io_num = pins.clk;
bus_config->quadwp_io_num = -1;
bus_config->quadhd_io_num = -1;
bus_config->max_transfer_sz = 4094;
bus_config->flags = 0;
bus_config->intr_flags = 0;
esp_err_t err = spi_bus_initialize(VSPI_HOST, bus_config, 1);
if (err != ESP_OK) {
ESP_LOGE("hal", "Could not initialize spi bus...");
switch (err) {
case ESP_ERR_INVALID_ARG:
ESP_LOGE("hal", "ESP_ERR_INVALID_ARG");
break;
case ESP_ERR_INVALID_STATE:
ESP_LOGE("hal", "ESP_ERR_INVALID_STATE");
break;
case ESP_ERR_NO_MEM:
ESP_LOGE("hal", "ESP_ERR_NO_MEM");
break;
default:
ESP_LOGE("hal", "Unknown err!");
}
}
ESP_LOGI("hal", "successfully init bus!");
spi_device_interface_config_t* dev_config;
dev_config = heap_caps_calloc(1, sizeof(spi_device_interface_config_t), MALLOC_CAP_8BIT);
dev_config->address_bits = 0;
dev_config->command_bits = 0;
dev_config->dummy_bits = 0;
dev_config->mode = 0;
dev_config->duty_cycle_pos = 0;
dev_config->cs_ena_posttrans = 0;
dev_config->cs_ena_pretrans = 0;
dev_config->clock_speed_hz = SPI_MASTER_FREQ_40M;
dev_config->spics_io_num = pins.cs;
dev_config->queue_size = 200;
dev_config->flags = 0;
dev_config->pre_cb = NULL;
dev_config->post_cb = NULL;
err = spi_bus_add_device(VSPI_HOST, dev_config, &spi_hdl);
if (err != ESP_OK) {
ESP_LOGE("hal", "Could not initialize spi bus...");
switch (err) {
case ESP_ERR_INVALID_ARG:
ESP_LOGE("hal", "ESP_ERR_INVALID_ARG");
break;
case ESP_ERR_INVALID_STATE:
ESP_LOGE("hal", "ESP_ERR_INVALID_STATE");
break;
case ESP_ERR_NO_MEM:
ESP_LOGE("hal", "ESP_ERR_NO_MEM");
break;
default:
ESP_LOGE("hal", "Unknown err!");
}
}
ESP_LOGI("hal", "successfully init bus device!");
break;
case UCG_COM_MSG_POWER_DOWN:
//ESP_LOGI("hal", "UCG_COM_MSG_POWER_DOWN");
/* "data" and "arg" are not used*/
/* This message is sent for a power down request */
spi_bus_remove_device(spi_hdl);
spi_bus_free(HSPI_HOST);
heap_caps_free(buffer_1);
heap_caps_free(buffer_2);
heap_caps_free(buffer_3);
break;
case UCG_COM_MSG_DELAY:
//ESP_LOGI("hal", "UCG_COM_MSG_DELAY");
/* "data" is not used */
/* "arg" contains the number of microseconds for the delay */
/* By receiving this message, the following code should delay by */
/* "arg" microseconds. One microsecond is 0.000001 second */
//vTaskDelay(arg / portTICK_PERIOD_MS / 100);
break;
case UCG_COM_MSG_CHANGE_RESET_LINE:
//ESP_LOGI("hal", "UCG_COM_MSG_CHANGE_RESET_LINE");
/* "data" is not used */
/* "arg" = 1: set the reset output line to 1 */
/* "arg" = 0: set the reset output line to 0 */
gpio_set_level(pins.reset, arg);
break;
case UCG_COM_MSG_CHANGE_CD_LINE:
//ESP_LOGI("hal", "UCG_COM_MSG_CHANGE_CD_LINE");
/* "ucg->com_status" bit 0 contains the old level for the CD line */
/* "data" is not used */
/* "arg" = 1: set the command/data (a0) output line to 1 */
/* "arg" = 0: set the command/data (a0) output line to 0 */
gpio_set_level(pins.dc, arg);
break;
case UCG_COM_MSG_CHANGE_CS_LINE:
//ESP_LOGI("hal", "UCG_COM_MSG_CHANGE_CS_LINE");
/* "ucg->com_status" bit 1 contains the old level for the CS line */
/* "data" is not used */
/* "arg" = 1: set the chipselect output line to 1 */
/* "arg" = 0: set the chipselect output line to 0 */
gpio_set_level(pins.cs, arg);
break;
case UCG_COM_MSG_SEND_BYTE:
//ESP_LOGI("hal", "UCG_COM_MSG_SEND_BYTE");
/* "data" is not used */
/* "arg" contains one byte, which should be sent to the display */
/* The current status of the CD line is available */
/* in bit 0 of u8g->com_status */
;
*buffer_1 = (uint8_t) arg;
spi_transaction_t transaction;
transaction.addr = 0;
transaction.cmd = 0;
transaction.length = 8;
transaction.rxlength = 0;
transaction.tx_buffer = buffer_1;
transaction.rx_buffer = NULL;
transaction.flags = SPI_TRANS_USE_RXDATA ;
spi_device_transmit(spi_hdl, &transaction);
break;
case UCG_COM_MSG_REPEAT_1_BYTE:
{
ESP_LOGW("hal", "UCG_COM_MSG_REPEAT_1_BYTE");
/* "data[0]" contains one byte */
/* repeat sending the byte in data[0] "arg" times */
/* The current status of the CD line is available */
/* in bit 0 of u8g->com_status */
//spi_transaction_t transaction;
//transaction.length = 8;
//transaction.tx_buffer = data[0];
//transaction.flags = SPI_TRANS_USE_TXDATA;
//int i;
//for (i = 0; i < arg; i++) {
// spi_device_polling_transmit(spi_hdl, &transaction);
//}
break;
}
case UCG_COM_MSG_REPEAT_2_BYTES:
{
ESP_LOGW("hal", "UCG_COM_MSG_REPEAT_2_BYTES");
// spi_transaction_t transaction1;
// transaction.flags = SPI_TRANS_USE_TXDATA;
// transaction.length = 8;
// transaction.tx_buffer = data[0];
// spi_transaction_t transaction2;
// transaction2.flags = SPI_TRANS_USE_TXDATA;
// transaction2.length = 8;
// transaction2.tx_buffer = data[1];
// int i;
// for (i = 0; i < arg; i++) {
// spi_device_polling_transmit(spi_hdl, &transaction1);
// spi_device_polling_transmit(spi_hdl, &transaction2);
// }
/* "data[0]" contains first byte */
/* "data[1]" contains second byte */
/* repeat sending the two bytes "arg" times */
/* The current status of the CD line is available */
/* in bit 0 of u8g->com_status */
break;
}
case UCG_COM_MSG_REPEAT_3_BYTES:
{
//ESP_LOGI("hal", "UCG_COM_MSG_REPEAT_3_BYTES");
/* "data[0]" contains first byte */
/* "data[1]" contains second byte */
/* "data[2]" contains third byte */
/* repeat sending the three bytes "arg" times */
/* The current status of the CD line is available */
/* in bit 0 of u8g->com_status */
buffer_3[0] = data[0];
buffer_3[1] = data[1];
buffer_3[2] = data[2];
spi_transaction_t transaction;
transaction.addr = 0;
transaction.cmd = 0;
transaction.length = 3*8;
transaction.rxlength = 0;
transaction.tx_buffer = buffer_3;
transaction.rx_buffer = NULL;
transaction.flags = SPI_TRANS_USE_RXDATA ;
int i;
for (i = 0; i < arg; i++) {
spi_device_transmit(spi_hdl, &transaction);
}
// spi_transaction_t transaction1;
// transaction1.flags = SPI_TRANS_USE_TXDATA ;
// transaction1.length = 8;
// transaction1.tx_buffer = &data[0];
// spi_transaction_t transaction2;
// transaction2.flags = SPI_TRANS_USE_TXDATA ;
// transaction2.length = 8;
// transaction2.tx_buffer = &data[1];
// spi_transaction_t transaction3;
// transaction3.flags = SPI_TRANS_USE_TXDATA ;
// transaction3.length = 8;
// transaction3.tx_buffer = &data[2];
// int i;
// for (i = 0; i < arg; i++) {
// spi_device_polling_transmit(spi_hdl, &transaction1);
// spi_device_polling_transmit(spi_hdl, &transaction2);
// spi_device_polling_transmit(spi_hdl, &transaction3);
// }
break;
}
case UCG_COM_MSG_SEND_STR:
{
ESP_LOGW("hal", "UCG_COM_MSG_SEND_STR");
/* "data" is an array with "arg" bytes */
/* send "arg" bytes to the display */
spi_transaction_t transaction1;
transaction1.flags = SPI_TRANS_USE_RXDATA | SPI_TRANS_USE_TXDATA ;
transaction1.length = 8*arg;
transaction1.tx_buffer = &data[0];
spi_device_polling_transmit(spi_hdl, &transaction1);
break;
}
case UCG_COM_MSG_SEND_CD_DATA_SEQUENCE:
{
//ESP_LOGW("hal", "UCG_COM_MSG_SEND_CD_DATA_SEQUENCE");
/* "data" is a pointer to two bytes, which contain the cd line */
/* status and display data */
/* "arg" contains the number of these two byte tuples which need to */
/* be analysed and sent. Bellow is a example sequence */
/* The content of bit 0 in u8g->com_status is undefined for this message */
while (arg > 0) {
if (*data != 0) {
if (*data == 1) {
/* set CD (=D/C=A0) line to low */
} else {
/* set CD (=D/C=A0) line to high */
}
}
data++;
/* send *data to the display */
data++;
arg--;
}
break;
}
}
return 1;
}

View File

@ -1,22 +0,0 @@
#ifndef ESP32_UCGLIB_HAL_H
#define ESP32_UCGLIB_HAL_H
#include <ucg.h>
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "driver/i2c.h"
#include "esp_intr_alloc.h"
#include <esp_log.h>
typedef struct {
gpio_num_t clk;
gpio_num_t mosi;
gpio_num_t cs;
gpio_num_t reset;
gpio_num_t dc;
} ucg_esp32_hal_t ;
int16_t ucg_esp32_hal(ucg_t *ucg, int16_t msg, uint16_t arg, uint8_t *data);
#endif /* ESP32_UCGLIB_HAL_H */

View File

@ -0,0 +1,2 @@
FILE(GLOB SOURCES *.c)
idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ".")

View File

@ -0,0 +1,7 @@
#
# Main Makefile. This is basically the same as a component makefile.
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
COMPONENT_SRCDIRS := .
COMPONENT_ADD_INCLUDEDIRS := .

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,354 @@
// Copyright 2010-2016 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _DRIVER_SPI_MASTER_LOBO_H_
#define _DRIVER_SPI_MASTER_LOBO_H_
#include "esp_err.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "soc/spi_struct.h"
#include "esp_intr_alloc.h"
#include "esp32/rom/lldesc.h"
#ifdef __cplusplus
extern "C"
{
#endif
//Maximum amount of bytes that can be put in one DMA descriptor
#define SPI_MAX_DMA_LEN (4096-4)
/**
* @brief Enum with the three SPI peripherals that are software-accessible in it
*/
typedef enum {
TFT_SPI_HOST=0, ///< SPI1, SPI; Cannot be used in this driver!
TFT_HSPI_HOST=1, ///< SPI2, HSPI
TFT_VSPI_HOST=2 ///< SPI3, VSPI
} spi_lobo_host_device_t;
/**
* @brief This is a configuration structure for a SPI bus.
*
* You can use this structure to specify the GPIO pins of the bus. Normally, the driver will use the
* GPIO matrix to route the signals. An exception is made when all signals either can be routed through
* the IO_MUX or are -1. In that case, the IO_MUX is used, allowing for >40MHz speeds.
*/
typedef struct {
int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used.
int miso_io_num; ///< GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used.
int sclk_io_num; ///< GPIO pin for Spi CLocK signal, or -1 if not used.
int quadwp_io_num; ///< GPIO pin for WP (Write Protect) signal which is used as D2 in 4-bit communication modes, or -1 if not used.
int quadhd_io_num; ///< GPIO pin for HD (HolD) signal which is used as D3 in 4-bit communication modes, or -1 if not used.
int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4094 if 0.
} spi_lobo_bus_config_t;
#define LB_SPI_DEVICE_TXBIT_LSBFIRST (1<<0) ///< Transmit command/address/data LSB first instead of the default MSB first
#define LB_SPI_DEVICE_RXBIT_LSBFIRST (1<<1) ///< Receive data LSB first instead of the default MSB first
#define LB_SPI_DEVICE_BIT_LSBFIRST (SPI_TXBIT_LSBFIRST|SPI_RXBIT_LSBFIRST); ///< Transmit and receive LSB first
#define LB_SPI_DEVICE_3WIRE (1<<2) ///< Use spiq for both sending and receiving data
#define LB_SPI_DEVICE_POSITIVE_CS (1<<3) ///< Make CS positive during a transaction instead of negative
#define LB_SPI_DEVICE_HALFDUPLEX (1<<4) ///< Transmit data before receiving it, instead of simultaneously
#define LB_SPI_DEVICE_CLK_AS_CS (1<<5) ///< Output clock on CS line if CS is active
#define SPI_ERR_OTHER_CONFIG 7001
typedef struct spi_lobo_transaction_t spi_lobo_transaction_t;
typedef void(*spi_lobo_transaction_cb_t)(spi_lobo_transaction_t *trans);
/**
* @brief This is a configuration for a SPI slave device that is connected to one of the SPI buses.
*/
typedef struct {
uint8_t command_bits; ///< Amount of bits in command phase (0-16)
uint8_t address_bits; ///< Amount of bits in address phase (0-64)
uint8_t dummy_bits; ///< Amount of dummy bits to insert between address and data phase
uint8_t mode; ///< SPI mode (0-3)
uint8_t duty_cycle_pos; ///< Duty cycle of positive clock, in 1/256th increments (128 = 50%/50% duty). Setting this to 0 (=not setting it) is equivalent to setting this to 128.
uint8_t cs_ena_pretrans; ///< Amount of SPI bit-cycles the cs should be activated before the transmission (0-16). This only works on half-duplex transactions.
uint8_t cs_ena_posttrans; ///< Amount of SPI bit-cycles the cs should stay active after the transmission (0-16)
int clock_speed_hz; ///< Clock speed, in Hz
int spics_io_num; ///< CS GPIO pin for this device, handled by hardware; set to -1 if not used
int spics_ext_io_num; ///< CS GPIO pin for this device, handled by software (spi_lobo_device_select/spi_lobo_device_deselect); only used if spics_io_num=-1
uint32_t flags; ///< Bitwise OR of LB_SPI_DEVICE_* flags
spi_lobo_transaction_cb_t pre_cb; ///< Callback to be called before a transmission is started. This callback from 'spi_lobo_transfer_data' function.
spi_lobo_transaction_cb_t post_cb; ///< Callback to be called after a transmission has completed. This callback from 'spi_lobo_transfer_data' function.
uint8_t selected; ///< **INTERNAL** 1 if the device's CS pin is active
} spi_lobo_device_interface_config_t;
#define LB_SPI_TRANS_MODE_DIO (1<<0) ///< Transmit/receive data in 2-bit mode
#define LB_SPI_TRANS_MODE_QIO (1<<1) ///< Transmit/receive data in 4-bit mode
#define LB_SPI_TRANS_MODE_DIOQIO_ADDR (1<<2) ///< Also transmit address in mode selected by SPI_MODE_DIO/SPI_MODE_QIO
#define LB_SPI_TRANS_USE_RXDATA (1<<3) ///< Receive into rx_data member of spi_lobo_transaction_t instead into memory at rx_buffer.
#define LB_SPI_TRANS_USE_TXDATA (1<<4) ///< Transmit tx_data member of spi_lobo_transaction_t instead of data at tx_buffer. Do not set tx_buffer when using this.
/**
* This structure describes one SPI transmission
*/
struct spi_lobo_transaction_t {
uint32_t flags; ///< Bitwise OR of LB_SPI_TRANS_* flags
uint16_t command; ///< Command data. Specific length was given when device was added to the bus.
uint64_t address; ///< Address. Specific length was given when device was added to the bus.
size_t length; ///< Total data length to be transmitted to the device, in bits; if 0, no data is transmitted
size_t rxlength; ///< Total data length to be received from the device, in bits; if 0, no data is received
void *user; ///< User-defined variable. Can be used to store eg transaction ID or data to be used by pre_cb and/or post_cb callbacks.
union {
const void *tx_buffer; ///< Pointer to transmit buffer, or NULL for no MOSI phase
uint8_t tx_data[4]; ///< If SPI_USE_TXDATA is set, data set here is sent directly from this variable.
};
union {
void *rx_buffer; ///< Pointer to receive buffer, or NULL for no MISO phase
uint8_t rx_data[4]; ///< If SPI_USE_RXDATA is set, data is received directly to this variable
};
};
#define NO_CS 3 // Number of CS pins per SPI host
#define NO_DEV 6 // Number of spi devices per SPI host; more than 3 devices can be attached to the same bus if using software CS's
#define SPI_SEMAPHORE_WAIT 2000 // Time in ms to wait for SPI mutex
typedef struct spi_lobo_device_t spi_lobo_device_t;
typedef struct {
spi_lobo_device_t *device[NO_DEV];
intr_handle_t intr;
spi_dev_t *hw;
//spi_lobo_transaction_t *cur_trans;
int cur_device;
lldesc_t *dmadesc_tx;
lldesc_t *dmadesc_rx;
bool no_gpio_matrix;
int dma_chan;
int max_transfer_sz;
QueueHandle_t spi_lobo_bus_mutex;
spi_lobo_bus_config_t cur_bus_config;
} spi_lobo_host_t;
struct spi_lobo_device_t {
spi_lobo_device_interface_config_t cfg;
spi_lobo_host_t *host;
spi_lobo_bus_config_t bus_config;
spi_lobo_host_device_t host_dev;
};
typedef spi_lobo_device_t* spi_lobo_device_handle_t; ///< Handle for a device on a SPI bus
typedef spi_lobo_host_t* spi_lobo_host_handle_t;
typedef spi_lobo_device_interface_config_t* spi_lobo_device_interface_config_handle_t;
/**
* @brief Add a device. This allocates a CS line for the device, allocates memory for the device structure and hooks
* up the CS pin to whatever is specified.
*
* This initializes the internal structures for a device, plus allocates a CS pin on the indicated SPI master
* peripheral and routes it to the indicated GPIO. All SPI master devices have three hw CS pins and can thus control
* up to three devices. Software handled CS pin can also be used for additional devices on the same SPI bus.
*
* ### If selected SPI host device bus is not yet initialized, it is initialized first with 'bus_config' function ###
*
* @note While in general, speeds up to 80MHz on the dedicated SPI pins and 40MHz on GPIO-matrix-routed pins are
* supported, full-duplex transfers routed over the GPIO matrix only support speeds up to 26MHz.
*
* @param host SPI peripheral to allocate device on (HSPI or VSPI)
* @param dev_config SPI interface protocol config for the device
* @param bus_config Pointer to a spi_lobo_bus_config_t struct specifying how the host device bus should be initialized
* @param handle Pointer to variable to hold the device handle
* @return
* - ESP_ERR_INVALID_ARG if parameter is invalid
* - ESP_ERR_NOT_FOUND if host doesn't have any free CS slots
* - ESP_ERR_NO_MEM if out of memory
* - ESP_OK on success
*/
esp_err_t spi_lobo_bus_add_device(spi_lobo_host_device_t host, spi_lobo_bus_config_t *bus_config, spi_lobo_device_interface_config_t *dev_config, spi_lobo_device_handle_t *handle);
/**
* @brief Remove a device from the SPI bus. If after removal no other device is attached to the spi bus device, it is freed.
*
* @param handle Device handle to free
* @return
* - ESP_ERR_INVALID_ARG if parameter is invalid
* - ESP_ERR_INVALID_STATE if device already is freed
* - ESP_OK on success
*/
esp_err_t spi_lobo_bus_remove_device(spi_lobo_device_handle_t handle);
/**
* @brief Return the actuall SPI bus speed for the spi device in Hz
*
* Some frequencies cannot be set, for example 30000000 will actually set SPI clock to 26666666 Hz
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
*
* @return
* - actuall SPI clock
*/
uint32_t spi_lobo_get_speed(spi_lobo_device_handle_t handle);
/**
* @brief Set the new clock speed for the device, return the actuall SPI bus speed set, in Hz
* This function can be used after the device is initialized
*
* Some frequencies cannot be set, for example 30000000 will actually set SPI clock to 26666666 Hz
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
* @param speed New device spi clock to be set in Hz
*
* @return
* - actuall SPI clock
* - 0 if speed cannot be set
*/
uint32_t spi_lobo_set_speed(spi_lobo_device_handle_t handle, uint32_t speed);
/**
* @brief Select spi device for transmission
*
* It configures spi bus with selected spi device parameters if previously selected device was different than the current
* If device's spics_io_num=-1 and spics_ext_io_num > 0 'spics_ext_io_num' pin is set to active state (low)
*
* spi bus device's semaphore is taken before selecting the device
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
* @param force configure spi bus even if the previous device was the same
*
* @return
* - ESP_ERR_INVALID_ARG if parameter is invalid
* - ESP_OK on success
*/
esp_err_t spi_lobo_device_select(spi_lobo_device_handle_t handle, int force);
/**
* @brief De-select spi device
*
* If device's spics_io_num=-1 and spics_ext_io_num > 0 'spics_ext_io_num' pin is set to inactive state (high)
*
* spi bus device's semaphore is given after selecting the device
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
*
* @return
* - ESP_ERR_INVALID_ARG if parameter is invalid
* - ESP_OK on success
*/
esp_err_t spi_lobo_device_deselect(spi_lobo_device_handle_t handle);
/**
* @brief Check if spi bus uses native spi pins
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
*
* @return
* - true if native spi pins are used
* - false if spi pins are routed through gpio matrix
*/
bool spi_lobo_uses_native_pins(spi_lobo_device_handle_t handle);
/**
* @brief Get spi bus native spi pins
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
*
* @return
* places spi bus native pins in provided pointers
*/
void spi_lobo_get_native_pins(int host, int *sdi, int *sdo, int *sck);
/**
* @brief Transimit and receive data to/from spi device based on transaction data
*
* TRANSMIT 8-bit data to spi device from 'trans->tx_buffer' or 'trans->tx_data' (trans->lenght/8 bytes)
* and RECEIVE data to 'trans->rx_buffer' or 'trans->rx_data' (trans->rx_length/8 bytes)
* Lengths must be 8-bit multiples!
* If trans->rx_buffer is NULL or trans->rx_length is 0, only transmits data
* If trans->tx_buffer is NULL or trans->length is 0, only receives data
* If the device is in duplex mode (LB_SPI_DEVICE_HALFDUPLEX flag NOT set), data are transmitted and received simultaneously.
* If the device is in half duplex mode (LB_SPI_DEVICE_HALFDUPLEX flag IS set), data are received after transmission
* 'address', 'command' and 'dummy bits' are transmitted before data phase IF set in device's configuration
* and IF 'trans->length' and 'trans->rx_length' are NOT both 0
* If device was not previously selected, it will be selected before transmission and deselected after transmission.
*
* @param handle Device handle obtained using spi_lobo_bus_add_device
*
* @param trans Pointer to variable containing the description of the transaction that is executed
*
* @return
* - ESP_ERR_INVALID_ARG if parameter is invalid
* - ESP error code if device cannot be selected
* - ESP_OK on success
*
*/
esp_err_t spi_lobo_transfer_data(spi_lobo_device_handle_t handle, spi_lobo_transaction_t *trans);
/*
* SPI transactions uses the semaphore (taken in select function) to protect the transfer
*/
esp_err_t spi_lobo_device_TakeSemaphore(spi_lobo_device_handle_t handle);
void spi_lobo_device_GiveSemaphore(spi_lobo_device_handle_t handle);
/**
* @brief Setup a DMA link chain
*
* This routine will set up a chain of linked DMA descriptors in the array pointed to by
* ``dmadesc``. Enough DMA descriptors will be used to fit the buffer of ``len`` bytes in, and the
* descriptors will point to the corresponding positions in ``buffer`` and linked together. The
* end result is that feeding ``dmadesc[0]`` into DMA hardware results in the entirety ``len`` bytes
* of ``data`` being read or written.
*
* @param dmadesc Pointer to array of DMA descriptors big enough to be able to convey ``len`` bytes
* @param len Length of buffer
* @param data Data buffer to use for DMA transfer
* @param isrx True if data is to be written into ``data``, false if it's to be read from ``data``.
*/
void spi_lobo_setup_dma_desc_links(lldesc_t *dmadesc, int len, const uint8_t *data, bool isrx);
/**
* @brief Check if a DMA reset is requested but has not completed yet
*
* @return True when a DMA reset is requested but hasn't completed yet. False otherwise.
*/
bool spi_lobo_dmaworkaround_reset_in_progress();
/**
* @brief Mark a DMA channel as idle.
*
* A call to this function tells the workaround logic that this channel will
* not be affected by a global SPI DMA reset.
*/
void spi_lobo_dmaworkaround_idle(int dmachan);
/**
* @brief Mark a DMA channel as active.
*
* A call to this function tells the workaround logic that this channel will
* be affected by a global SPI DMA reset, and a reset like that should not be attempted.
*/
void spi_lobo_dmaworkaround_transfer_active(int dmachan);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,4 @@
FILE(GLOB SOURCES *.c)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS "."
REQUIRES spidriver)

View File

@ -0,0 +1,333 @@
// Default font
// ========================================================================
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// Header Format:
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset (start Y of visible pixels)
// Width (width of the visible pixels)
// Height (height of the visible pixels)
// xOffset (start X of visible pixels)
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ========================================================================
// dejavu
// Point Size : 12
// Memory usage : 1158 bytes
// # characters : 95
const unsigned char tft_DefaultFont[] =
{
0x00, 0x0B, 0x86, 0x04,
// ' '
0x20,0x0A,0x00,0x00,0x00,0x04,
// '!'
0x21,0x01,0x01,0x09,0x02,0x05,
0xFD,0x80,
// '"'
0x22,0x01,0x03,0x03,0x01,0x05,
0xB6,0x80,
// '#'
0x23,0x02,0x08,0x08,0x01,0x0A,
0x12,0x14,0x7F,0x24,0x24,0xFE,0x28,0x48,
// '$'
0x24,0x01,0x06,0x0B,0x02,0x08,
0x21,0xCA,0xA8,0xE0,0xE2,0xAA,0x70,0x82,0x00,
// '%'
0x25,0x01,0x0A,0x09,0x00,0x0B,
0x61,0x24,0x89,0x22,0x50,0x6D,0x82,0x91,0x24,0x49,0x21,0x80,
// '&'
0x26,0x01,0x09,0x09,0x01,0x0A,
0x30,0x24,0x10,0x0C,0x05,0x14,0x4A,0x19,0x8C,0x7B,0x00,
// '''
0x27,0x01,0x01,0x03,0x01,0x03,
0xE0,
// '('
0x28,0x00,0x03,0x0B,0x01,0x05,
0x69,0x49,0x24,0x48,0x80,
// ')'
0x29,0x00,0x03,0x0B,0x01,0x05,
0x89,0x12,0x49,0x4A,0x00,
// '*'
0x2A,0x01,0x05,0x06,0x01,0x06,
0x25,0x5C,0xEA,0x90,
// '+'
0x2B,0x03,0x07,0x07,0x01,0x0A,
0x10,0x20,0x47,0xF1,0x02,0x04,0x00,
// ','
0x2C,0x08,0x01,0x03,0x01,0x04,
0xE0,
// '-'
0x2D,0x06,0x03,0x01,0x01,0x04,
0xE0,
// '.'
0x2E,0x08,0x01,0x02,0x01,0x04,
0xC0,
// '/'
0x2F,0x01,0x04,0x0A,0x00,0x04,
0x11,0x22,0x24,0x44,0x88,
// '0'
0x30,0x01,0x06,0x09,0x01,0x08,
0x79,0x28,0x61,0x86,0x18,0x52,0x78,
// '1'
0x31,0x01,0x05,0x09,0x01,0x08,
0xE1,0x08,0x42,0x10,0x84,0xF8,
// '2'
0x32,0x01,0x07,0x09,0x01,0x08,
0x79,0x18,0x10,0x20,0x82,0x08,0x20,0xFC,
// '3'
0x33,0x01,0x06,0x09,0x01,0x08,
0x7A,0x10,0x41,0x38,0x30,0x63,0x78,
// '4'
0x34,0x01,0x06,0x09,0x01,0x08,
0x18,0x62,0x92,0x4A,0x2F,0xC2,0x08,
// '5'
0x35,0x01,0x06,0x09,0x01,0x08,
0xFA,0x08,0x3C,0x0C,0x10,0x63,0x78,
// '6'
0x36,0x01,0x06,0x09,0x01,0x08,
0x39,0x18,0x3E,0xCE,0x18,0x53,0x78,
// '7'
0x37,0x01,0x06,0x09,0x01,0x08,
0xFC,0x10,0x82,0x10,0x42,0x08,0x40,
// '8'
0x38,0x01,0x06,0x09,0x01,0x08,
0x7B,0x38,0x73,0x7B,0x38,0x73,0x78,
// '9'
0x39,0x01,0x06,0x09,0x01,0x08,
0x7B,0x28,0x61,0xCD,0xD0,0x62,0x70,
// ':'
0x3A,0x04,0x01,0x06,0x01,0x04,
0xCC,
// ';'
0x3B,0x04,0x01,0x07,0x01,0x04,
0xCE,
// '<'
0x3C,0x03,0x08,0x06,0x01,0x0A,
0x03,0x1E,0xE0,0xE0,0x1E,0x03,
// '='
0x3D,0x05,0x08,0x03,0x01,0x0A,
0xFF,0x00,0xFF,
// '>'
0x3E,0x03,0x08,0x06,0x01,0x0A,
0xC0,0x78,0x07,0x07,0x78,0xC0,
// '?'
0x3F,0x01,0x05,0x09,0x00,0x06,
0x74,0x42,0x22,0x10,0x04,0x20,
// '@'
0x40,0x01,0x0B,0x0B,0x01,0x0D,
0x1F,0x06,0x19,0x01,0x46,0x99,0x13,0x22,0x64,0x54,0x6C,0x40,0x04,0x10,0x7C,0x00,
// 'A'
0x41,0x01,0x08,0x09,0x00,0x08,
0x18,0x18,0x24,0x24,0x24,0x42,0x7E,0x42,0x81,
// 'B'
0x42,0x01,0x06,0x09,0x01,0x08,
0xFA,0x18,0x61,0xFA,0x18,0x61,0xF8,
// 'C'
0x43,0x01,0x06,0x09,0x01,0x08,
0x39,0x18,0x20,0x82,0x08,0x11,0x38,
// 'D'
0x44,0x01,0x07,0x09,0x01,0x09,
0xF9,0x0A,0x0C,0x18,0x30,0x60,0xC2,0xF8,
// 'E'
0x45,0x01,0x06,0x09,0x01,0x08,
0xFE,0x08,0x20,0xFE,0x08,0x20,0xFC,
// 'F'
0x46,0x01,0x05,0x09,0x01,0x07,
0xFC,0x21,0x0F,0xC2,0x10,0x80,
// 'G'
0x47,0x01,0x07,0x09,0x01,0x09,
0x3C,0x86,0x04,0x08,0xF0,0x60,0xA1,0x3C,
// 'H'
0x48,0x01,0x07,0x09,0x01,0x09,
0x83,0x06,0x0C,0x1F,0xF0,0x60,0xC1,0x82,
// 'I'
0x49,0x01,0x01,0x09,0x01,0x03,
0xFF,0x80,
// 'J'
0x4A,0x01,0x03,0x0B,0xFF,0x03,
0x24,0x92,0x49,0x27,0x00,
// 'K'
0x4B,0x01,0x07,0x09,0x01,0x07,
0x85,0x12,0x45,0x0C,0x14,0x24,0x44,0x84,
// 'L'
0x4C,0x01,0x05,0x09,0x01,0x06,
0x84,0x21,0x08,0x42,0x10,0xF8,
// 'M'
0x4D,0x01,0x08,0x09,0x01,0x0A,
0x81,0xC3,0xC3,0xA5,0xA5,0x99,0x99,0x81,0x81,
// 'N'
0x4E,0x01,0x07,0x09,0x01,0x09,
0xC3,0x86,0x8D,0x19,0x31,0x62,0xC3,0x86,
// 'O'
0x4F,0x01,0x07,0x09,0x01,0x09,
0x38,0x8A,0x0C,0x18,0x30,0x60,0xA2,0x38,
// 'P'
0x50,0x01,0x06,0x09,0x01,0x08,
0xFA,0x38,0x63,0xFA,0x08,0x20,0x80,
// 'Q'
0x51,0x01,0x07,0x0B,0x01,0x09,
0x38,0x8A,0x0C,0x18,0x30,0x60,0xA2,0x38,0x10,0x10,
// 'R'
0x52,0x01,0x07,0x09,0x01,0x08,
0xF9,0x1A,0x14,0x6F,0x91,0x21,0x42,0x82,
// 'S'
0x53,0x01,0x06,0x09,0x01,0x08,
0x7B,0x18,0x30,0x78,0x30,0x63,0x78,
// 'T'
0x54,0x01,0x07,0x09,0x00,0x07,
0xFE,0x20,0x40,0x81,0x02,0x04,0x08,0x10,
// 'U'
0x55,0x01,0x07,0x09,0x01,0x09,
0x83,0x06,0x0C,0x18,0x30,0x60,0xA2,0x38,
// 'V'
0x56,0x01,0x0A,0x09,0xFF,0x08,
0x40,0x90,0x22,0x10,0x84,0x21,0x04,0x81,0x20,0x30,0x0C,0x00,
// 'W'
0x57,0x01,0x0B,0x09,0x00,0x0B,
0x84,0x28,0x89,0x11,0x27,0x22,0xA8,0x55,0x0E,0xE0,0x88,0x11,0x00,
// 'X'
0x58,0x01,0x07,0x09,0x00,0x07,
0xC6,0x88,0xA1,0xC1,0x07,0x0A,0x22,0x82,
// 'Y'
0x59,0x01,0x07,0x09,0x00,0x07,
0x82,0x89,0x11,0x43,0x82,0x04,0x08,0x10,
// 'Z'
0x5A,0x01,0x07,0x09,0x01,0x09,
0xFE,0x04,0x10,0x41,0x04,0x10,0x40,0xFE,
// '['
0x5B,0x01,0x02,0x0B,0x02,0x05,
0xEA,0xAA,0xAC,
// '\'
0x5C,0x01,0x04,0x0A,0x00,0x04,
0x88,0x44,0x42,0x22,0x11,
// ']'
0x5D,0x01,0x02,0x0B,0x01,0x05,
0xD5,0x55,0x5C,
// '^'
0x5E,0x01,0x08,0x03,0x01,0x0A,
0x18,0x24,0x42,
// '_'
0x5F,0x0C,0x06,0x01,0x00,0x06,
0xFC,
// '`'
0x60,0x00,0x03,0x02,0x01,0x06,
0x44,
// 'a'
0x61,0x03,0x06,0x07,0x01,0x08,
0x7A,0x30,0x5F,0x86,0x37,0x40,
// 'b'
0x62,0x00,0x06,0x0A,0x01,0x08,
0x82,0x08,0x2E,0xCA,0x18,0x61,0xCE,0xE0,
// 'c'
0x63,0x03,0x05,0x07,0x01,0x07,
0x72,0x61,0x08,0x25,0xC0,
// 'd'
0x64,0x00,0x06,0x0A,0x01,0x08,
0x04,0x10,0x5D,0xCE,0x18,0x61,0xCD,0xD0,
// 'e'
0x65,0x03,0x06,0x07,0x01,0x08,
0x39,0x38,0x7F,0x81,0x13,0x80,
// 'f'
0x66,0x00,0x04,0x0A,0x00,0x04,
0x34,0x4F,0x44,0x44,0x44,
// 'g'
0x67,0x03,0x06,0x0A,0x01,0x08,
0x77,0x38,0x61,0x87,0x37,0x41,0x4C,0xE0,
// 'h'
0x68,0x00,0x06,0x0A,0x01,0x08,
0x82,0x08,0x2E,0xC6,0x18,0x61,0x86,0x10,
// 'i'
0x69,0x01,0x01,0x09,0x01,0x03,
0xBF,0x80,
// 'j'
0x6A,0x01,0x02,0x0C,0x00,0x03,
0x45,0x55,0x56,
// 'k'
0x6B,0x00,0x06,0x0A,0x01,0x07,
0x82,0x08,0x22,0x92,0x8E,0x28,0x92,0x20,
// 'l'
0x6C,0x00,0x01,0x0A,0x01,0x03,
0xFF,0xC0,
// 'm'
0x6D,0x03,0x09,0x07,0x01,0x0B,
0xB3,0x66,0x62,0x31,0x18,0x8C,0x46,0x22,
// 'n'
0x6E,0x03,0x06,0x07,0x01,0x08,
0xBB,0x18,0x61,0x86,0x18,0x40,
// 'o'
0x6F,0x03,0x06,0x07,0x01,0x08,
0x7B,0x38,0x61,0x87,0x37,0x80,
// 'p'
0x70,0x03,0x06,0x0A,0x01,0x08,
0xBB,0x28,0x61,0x87,0x3B,0xA0,0x82,0x00,
// 'q'
0x71,0x03,0x06,0x0A,0x01,0x08,
0x77,0x38,0x61,0x87,0x37,0x41,0x04,0x10,
// 'r'
0x72,0x03,0x04,0x07,0x01,0x05,
0xBC,0x88,0x88,0x80,
// 's'
0x73,0x03,0x06,0x07,0x01,0x07,
0x72,0x28,0x1C,0x0A,0x27,0x00,
// 't'
0x74,0x01,0x04,0x09,0x00,0x05,
0x44,0xF4,0x44,0x44,0x30,
// 'u'
0x75,0x03,0x06,0x07,0x01,0x08,
0x86,0x18,0x61,0x86,0x37,0x40,
// 'v'
0x76,0x03,0x08,0x07,0xFF,0x06,
0x42,0x42,0x24,0x24,0x24,0x18,0x18,
// 'w'
0x77,0x03,0x09,0x07,0x00,0x09,
0x88,0xC4,0x57,0x4A,0xA5,0x51,0x10,0x88,
// 'x'
0x78,0x03,0x06,0x07,0x00,0x06,
0x85,0x24,0x8C,0x49,0x28,0x40,
// 'y'
0x79,0x03,0x08,0x0A,0xFF,0x06,
0x42,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x10,0x60,
// 'z'
0x7A,0x03,0x05,0x07,0x00,0x05,
0xF8,0x44,0x44,0x43,0xE0,
// '{'
0x7B,0x01,0x05,0x0B,0x02,0x08,
0x19,0x08,0x42,0x60,0x84,0x21,0x06,
// '|'
0x7C,0x01,0x01,0x0C,0x02,0x04,
0xFF,0xF0,
// '}'
0x7D,0x01,0x05,0x0B,0x01,0x08,
0xC1,0x08,0x42,0x0C,0x84,0x21,0x30,
// '~'
0x7E,0x04,0x08,0x03,0x01,0x0A,
0x00,0x71,0x8E,
// Terminator
0xFF
};

View File

@ -0,0 +1,322 @@
// ============================================================================
// Proportional font Header Format:
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ============================================================================
// DejaVuSans
// Point Size : 18
// Memory usage : 1828 bytes
// # characters : 95
const unsigned char tft_Dejavu18[] =
{
0x00, 0x12, 0x00, 0x00,
// ' '
0x20,0x0E,0x00,0x00,0x00,0x06,
// '!'
0x21,0x01,0x02,0x0D,0x03,0x07,
0xFF,0xFF,0xC3,0xC0,
// '"'
0x22,0x01,0x06,0x05,0x01,0x08,
0xCF,0x3C,0xF3,0xCC,
// '#'
0x23,0x00,0x0C,0x0E,0x01,0x0F,
0x04,0x40,0x44,0x0C,0xC0,0xC8,0x7F,0xF7,0xFF,0x09,0x81,0x90,0xFF,0xEF,0xFE,0x13,0x03,0x30,0x32,0x02,0x20,
// '$'
0x24,0x00,0x0A,0x11,0x01,0x0B,
0x08,0x02,0x03,0xE1,0xFC,0xE9,0x32,0x0F,0x81,0xF8,0x0F,0x02,0x60,0x9A,0x2E,0xFF,0x1F,0x80,0x80,0x20,0x08,0x00,
// '%'
0x25,0x01,0x0F,0x0D,0x01,0x11,
0x78,0x10,0x90,0x43,0x31,0x86,0x62,0x0C,0xC8,0x19,0x10,0x1E,0x4F,0x01,0x12,0x02,0x66,0x08,0xCC,0x31,0x98,0x41,0x21,0x03,0xC0,
// '&'
0x26,0x01,0x0C,0x0D,0x01,0x0D,
0x0F,0x01,0xF8,0x30,0x83,0x00,0x38,0x03,0xC0,0x7E,0x6C,0x76,0xC3,0xCC,0x18,0xE1,0xC7,0xFE,0x3E,0x70,
// '''
0x27,0x01,0x02,0x05,0x01,0x04,
0xFF,0xC0,
// '('
0x28,0x00,0x04,0x10,0x02,0x07,
0x32,0x66,0x4C,0xCC,0xCC,0xC4,0x66,0x23,
// ')'
0x29,0x00,0x04,0x10,0x01,0x07,
0xC4,0x66,0x23,0x33,0x33,0x32,0x66,0x4C,
// '*'
0x2A,0x01,0x07,0x08,0x01,0x09,
0x11,0x25,0x51,0xC3,0x8A,0xA4,0x88,
// '+'
0x2B,0x02,0x0C,0x0C,0x02,0x0F,
0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x0F,0xFF,0xFF,0xF0,0x60,0x06,0x00,0x60,0x06,0x00,0x60,
// ','
0x2C,0x0C,0x03,0x04,0x01,0x06,
0x6D,0x40,
// '-'
0x2D,0x08,0x05,0x02,0x01,0x07,
0xFF,0xC0,
// '.'
0x2E,0x0C,0x02,0x02,0x02,0x06,
0xF0,
// '/'
0x2F,0x01,0x06,0x0F,0x00,0x06,
0x0C,0x31,0x86,0x18,0xE3,0x0C,0x31,0xC6,0x18,0x63,0x0C,0x00,
// '0'
0x30,0x01,0x09,0x0D,0x01,0x0B,
0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0,
// '1'
0x31,0x01,0x08,0x0D,0x02,0x0B,
0x38,0xF8,0xD8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,
// '2'
0x32,0x01,0x09,0x0D,0x01,0x0B,
0x7C,0x7F,0x21,0xC0,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x1F,0xEF,0xF0,
// '3'
0x33,0x01,0x09,0x0D,0x01,0x0B,
0x7E,0x7F,0xA0,0xE0,0x30,0x39,0xF0,0xFC,0x07,0x01,0x80,0xE0,0xFF,0xE7,0xE0,
// '4'
0x34,0x01,0x0A,0x0D,0x01,0x0B,
0x07,0x01,0xC0,0xB0,0x6C,0x13,0x08,0xC6,0x31,0x0C,0xFF,0xFF,0xF0,0x30,0x0C,0x03,0x00,
// '5'
0x35,0x01,0x08,0x0D,0x01,0x0B,
0x7E,0x7E,0x60,0x60,0x7C,0x7E,0x47,0x03,0x03,0x03,0x87,0xFE,0x7C,
// '6'
0x36,0x01,0x09,0x0D,0x01,0x0B,
0x1E,0x1F,0x9C,0x5C,0x0C,0x06,0xF3,0xFD,0xC7,0xC1,0xE0,0xD8,0xEF,0xE1,0xE0,
// '7'
0x37,0x01,0x08,0x0D,0x01,0x0B,
0xFF,0xFF,0x06,0x06,0x06,0x0E,0x0C,0x0C,0x1C,0x18,0x18,0x38,0x30,
// '8'
0x38,0x01,0x09,0x0D,0x01,0x0B,
0x3E,0x3F,0xB8,0xF8,0x3E,0x39,0xF1,0xFD,0xC7,0xC1,0xE0,0xF8,0xEF,0xE3,0xE0,
// '9'
0x39,0x01,0x09,0x0D,0x01,0x0B,
0x3C,0x3F,0xB8,0xD8,0x3C,0x1F,0x1D,0xFE,0x7B,0x01,0x81,0xD1,0xCF,0xC3,0xC0,
// ':'
0x3A,0x05,0x02,0x09,0x02,0x06,
0xF0,0x03,0xC0,
// ';'
0x3B,0x05,0x03,0x0B,0x01,0x06,
0x6C,0x00,0x03,0x6A,0x00,
// '<'
0x3C,0x04,0x0B,0x0A,0x02,0x0F,
0x00,0x20,0x3C,0x1F,0x1F,0x0F,0x81,0xF0,0x0F,0x80,0x3E,0x01,0xE0,0x04,
// '='
0x3D,0x05,0x0B,0x06,0x02,0x0F,
0xFF,0xFF,0xFC,0x00,0x00,0x0F,0xFF,0xFF,0xC0,
// '>'
0x3E,0x04,0x0B,0x0A,0x02,0x0F,
0x80,0x1E,0x01,0xF0,0x07,0xC0,0x3E,0x07,0xC3,0xE3,0xE0,0xF0,0x10,0x00,
// '?'
0x3F,0x01,0x07,0x0D,0x01,0x0A,
0x79,0xFA,0x38,0x30,0x61,0x86,0x18,0x30,0x60,0x01,0x83,0x00,
// '@'
0x40,0x01,0x10,0x10,0x01,0x12,
0x07,0xE0,0x1F,0xF8,0x3C,0x1C,0x70,0x06,0x60,0x07,0xE3,0x63,0xC7,0xE3,0xC6,0x63,0xC6,0x66,0xC7,0xFC,0xE3,0x70,0x60,0x00,0x70,0x00,0x3C,0x30,0x1F,0xF0,0x07,0xC0,
// 'A'
0x41,0x01,0x0C,0x0D,0x00,0x0C,
0x06,0x00,0x60,0x0F,0x00,0xF0,0x19,0x81,0x98,0x19,0x83,0x0C,0x3F,0xC7,0xFE,0x60,0x66,0x06,0xC0,0x30,
// 'B'
0x42,0x01,0x09,0x0D,0x02,0x0C,
0xFC,0x7F,0xB0,0xD8,0x6C,0x37,0xF3,0xF9,0x86,0xC1,0xE0,0xF0,0xFF,0xEF,0xE0,
// 'C'
0x43,0x01,0x0B,0x0D,0x01,0x0D,
0x0F,0xC7,0xFD,0xC0,0xB0,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x0C,0x01,0xC0,0x9F,0xF0,0xFC,
// 'D'
0x44,0x01,0x0B,0x0D,0x02,0x0E,
0xFE,0x1F,0xF3,0x07,0x60,0x6C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x1B,0x07,0x7F,0xCF,0xE0,
// 'E'
0x45,0x01,0x08,0x0D,0x02,0x0B,
0xFF,0xFF,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,
// 'F'
0x46,0x01,0x08,0x0D,0x02,0x0A,
0xFF,0xFF,0xC0,0xC0,0xC0,0xFE,0xFE,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
// 'G'
0x47,0x01,0x0B,0x0D,0x01,0x0E,
0x0F,0xC7,0xFD,0xC0,0xB0,0x0C,0x01,0x87,0xF0,0xFE,0x03,0xC0,0x6C,0x0D,0xC1,0x9F,0xE0,0xF8,
// 'H'
0x48,0x01,0x0A,0x0D,0x02,0x0E,
0xC0,0xF0,0x3C,0x0F,0x03,0xC0,0xFF,0xFF,0xFF,0x03,0xC0,0xF0,0x3C,0x0F,0x03,0xC0,0xC0,
// 'I'
0x49,0x01,0x02,0x0D,0x02,0x06,
0xFF,0xFF,0xFF,0xC0,
// 'J'
0x4A,0x01,0x05,0x11,0xFF,0x06,
0x18,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x8C,0xFE,0xE0,
// 'K'
0x4B,0x01,0x0B,0x0D,0x02,0x0C,
0xC1,0x98,0x63,0x18,0x66,0x0D,0x81,0xE0,0x3C,0x06,0xC0,0xCC,0x18,0xC3,0x0C,0x60,0xCC,0x0C,
// 'L'
0x4C,0x01,0x08,0x0D,0x02,0x0A,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,
// 'M'
0x4D,0x01,0x0C,0x0D,0x02,0x10,
0xE0,0x7F,0x0F,0xF0,0xFD,0x8B,0xD9,0xBD,0x9B,0xCF,0x3C,0xF3,0xC6,0x3C,0x63,0xC0,0x3C,0x03,0xC0,0x30,
// 'N'
0x4E,0x01,0x0A,0x0D,0x02,0x0E,
0xE0,0xF8,0x3F,0x0F,0xC3,0xD8,0xF6,0x3C,0xCF,0x1B,0xC6,0xF0,0xFC,0x3F,0x07,0xC1,0xC0,
// 'O'
0x4F,0x01,0x0C,0x0D,0x01,0x0E,
0x1F,0x83,0xFC,0x70,0xE6,0x06,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x06,0x70,0xE3,0xFC,0x1F,0x80,
// 'P'
0x50,0x01,0x08,0x0D,0x02,0x0B,
0xFC,0xFE,0xC7,0xC3,0xC3,0xC7,0xFE,0xFC,0xC0,0xC0,0xC0,0xC0,0xC0,
// 'Q'
0x51,0x01,0x0C,0x0F,0x01,0x0E,
0x1F,0x83,0xFC,0x70,0xE6,0x06,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x06,0x70,0xE3,0xFC,0x1F,0x80,0x18,0x00,0xC0,
// 'R'
0x52,0x01,0x0A,0x0D,0x02,0x0D,
0xFC,0x3F,0x8C,0x73,0x0C,0xC3,0x31,0xCF,0xE3,0xF0,0xC6,0x30,0xCC,0x33,0x06,0xC1,0xC0,
// 'S'
0x53,0x01,0x0A,0x0D,0x01,0x0B,
0x3E,0x1F,0xCE,0x13,0x00,0xC0,0x1F,0x03,0xF0,0x0E,0x01,0x80,0x68,0x3B,0xFC,0x7E,0x00,
// 'T'
0x54,0x01,0x0C,0x0D,0x00,0x0C,
0xFF,0xFF,0xFF,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,
// 'U'
0x55,0x01,0x0A,0x0D,0x02,0x0E,
0xC0,0xF0,0x3C,0x0F,0x03,0xC0,0xF0,0x3C,0x0F,0x03,0xC0,0xF0,0x36,0x19,0xFE,0x1E,0x00,
// 'V'
0x56,0x01,0x0C,0x0D,0x00,0x0C,
0xC0,0x36,0x06,0x60,0x66,0x06,0x30,0xC3,0x0C,0x19,0x81,0x98,0x19,0x80,0xF0,0x0F,0x00,0x60,0x06,0x00,
// 'W'
0x57,0x01,0x11,0x0D,0x01,0x13,
0xC1,0xC1,0xE0,0xE0,0xD8,0xF8,0xCC,0x6C,0x66,0x36,0x33,0x1B,0x18,0xD8,0xD8,0x6C,0x6C,0x36,0x36,0x1F,0x1F,0x07,0x07,0x03,0x83,0x81,0xC1,0xC0,
// 'X'
0x58,0x01,0x0B,0x0D,0x01,0x0D,
0x70,0xE6,0x18,0xE6,0x0D,0xC0,0xF0,0x1C,0x03,0x80,0x78,0x1B,0x07,0x30,0xC7,0x30,0x6E,0x0E,
// 'Y'
0x59,0x01,0x0C,0x0D,0x00,0x0C,
0xE0,0x76,0x06,0x30,0xC1,0x98,0x19,0x80,0xF0,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,
// 'Z'
0x5A,0x01,0x0B,0x0D,0x01,0x0D,
0xFF,0xFF,0xFC,0x07,0x01,0xC0,0x30,0x0E,0x03,0x80,0xE0,0x18,0x06,0x01,0xC0,0x7F,0xFF,0xFE,
// '['
0x5B,0x00,0x04,0x10,0x01,0x07,
0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFF,
// '\'
0x5C,0x01,0x06,0x0F,0x00,0x06,
0xC3,0x06,0x18,0x61,0xC3,0x0C,0x30,0xE1,0x86,0x18,0x30,0xC0,
// ']'
0x5D,0x00,0x04,0x10,0x02,0x07,
0xFF,0x33,0x33,0x33,0x33,0x33,0x33,0xFF,
// '^'
0x5E,0x01,0x0B,0x05,0x02,0x0F,
0x0E,0x03,0xE0,0xC6,0x30,0x6C,0x06,
// '_'
0x5F,0x10,0x09,0x02,0x00,0x09,
0xFF,0xFF,0xC0,
// '`'
0x60,0x00,0x04,0x03,0x02,0x09,
0xC6,0x30,
// 'a'
0x61,0x04,0x08,0x0A,0x01,0x0A,
0x3C,0x7E,0x47,0x03,0x3F,0xFF,0xC3,0xC7,0xFF,0x7B,
// 'b'
0x62,0x00,0x09,0x0E,0x02,0x0B,
0xC0,0x60,0x30,0x18,0x0D,0xE7,0xFB,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x7F,0xF6,0xF0,
// 'c'
0x63,0x04,0x08,0x0A,0x01,0x09,
0x1E,0x7F,0x61,0xC0,0xC0,0xC0,0xC0,0x61,0x7F,0x1E,
// 'd'
0x64,0x00,0x09,0x0E,0x01,0x0B,
0x01,0x80,0xC0,0x60,0x33,0xDB,0xFF,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x77,0xF9,0xEC,
// 'e'
0x65,0x04,0x0A,0x0A,0x01,0x0B,
0x1F,0x1F,0xE6,0x1F,0x03,0xFF,0xFF,0xFC,0x01,0x81,0x7F,0xC7,0xE0,
// 'f'
0x66,0x00,0x07,0x0E,0x00,0x06,
0x1E,0x7C,0xC1,0x8F,0xFF,0xCC,0x18,0x30,0x60,0xC1,0x83,0x06,0x00,
// 'g'
0x67,0x04,0x09,0x0E,0x01,0x0B,
0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x68,0x67,0xF1,0xF0,
// 'h'
0x68,0x00,0x08,0x0E,0x02,0x0B,
0xC0,0xC0,0xC0,0xC0,0xDE,0xFE,0xE7,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
// 'i'
0x69,0x00,0x02,0x0E,0x02,0x05,
0xF0,0xFF,0xFF,0xF0,
// 'j'
0x6A,0x00,0x04,0x12,0x00,0x05,
0x33,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0xEC,
// 'k'
0x6B,0x00,0x09,0x0E,0x02,0x0A,
0xC0,0x60,0x30,0x18,0x0C,0x36,0x33,0x31,0xB0,0xF0,0x78,0x36,0x19,0x8C,0x66,0x18,
// 'l'
0x6C,0x00,0x02,0x0E,0x02,0x05,
0xFF,0xFF,0xFF,0xF0,
// 'm'
0x6D,0x04,0x0E,0x0A,0x02,0x11,
0xDC,0x7B,0xFB,0xEE,0x79,0xF0,0xC3,0xC3,0x0F,0x0C,0x3C,0x30,0xF0,0xC3,0xC3,0x0F,0x0C,0x30,
// 'n'
0x6E,0x04,0x08,0x0A,0x02,0x0B,
0xDE,0xFE,0xE7,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,
// 'o'
0x6F,0x04,0x0A,0x0A,0x01,0x0B,
0x1E,0x1F,0xE6,0x1B,0x03,0xC0,0xF0,0x3C,0x0D,0x86,0x7F,0x87,0x80,
// 'p'
0x70,0x04,0x09,0x0E,0x02,0x0B,
0xDE,0x7F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0xFF,0x6F,0x30,0x18,0x0C,0x06,0x00,
// 'q'
0x71,0x04,0x09,0x0E,0x01,0x0B,
0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x60,0x30,0x18,0x0C,
// 'r'
0x72,0x04,0x06,0x0A,0x02,0x08,
0xDF,0xFE,0x30,0xC3,0x0C,0x30,0xC3,0x00,
// 's'
0x73,0x04,0x08,0x0A,0x01,0x08,
0x7C,0xFE,0xC2,0xE0,0x7C,0x1E,0x06,0x86,0xFE,0x78,
// 't'
0x74,0x01,0x06,0x0D,0x01,0x07,
0x61,0x86,0x3F,0xFD,0x86,0x18,0x61,0x86,0x1F,0x3C,
// 'u'
0x75,0x04,0x08,0x0A,0x02,0x0B,
0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xE7,0x7F,0x7B,
// 'v'
0x76,0x04,0x0C,0x0A,0x00,0x0B,
0x60,0x66,0x06,0x30,0xC3,0x0C,0x19,0x81,0x98,0x19,0x80,0xF0,0x0F,0x00,0x60,
// 'w'
0x77,0x04,0x0F,0x0A,0x01,0x10,
0x63,0x8C,0xC7,0x19,0x8E,0x31,0xB6,0xC3,0x6D,0x86,0xDB,0x0F,0x1E,0x0E,0x38,0x1C,0x70,0x38,0xE0,
// 'x'
0x78,0x04,0x0A,0x0A,0x01,0x0B,
0xE1,0xD8,0x63,0x30,0xCC,0x1E,0x07,0x83,0x30,0xCC,0x61,0xB8,0x70,
// 'y'
0x79,0x04,0x0C,0x0E,0x00,0x0B,
0x60,0x66,0x06,0x30,0xC3,0x0C,0x19,0x81,0x98,0x0F,0x00,0xF0,0x06,0x00,0x60,0x06,0x00,0xC0,0x3C,0x03,0x80,
// 'z'
0x7A,0x04,0x08,0x0A,0x01,0x09,
0xFF,0xFF,0x06,0x0C,0x1C,0x38,0x30,0x70,0xFF,0xFF,
// '{'
0x7B,0x00,0x08,0x11,0x02,0x0B,
0x0F,0x1F,0x18,0x18,0x18,0x18,0x38,0xF0,0xF0,0x38,0x18,0x18,0x18,0x18,0x18,0x1F,0x0F,
// '|'
0x7C,0x00,0x02,0x12,0x02,0x06,
0xFF,0xFF,0xFF,0xFF,0xF0,
// '}'
0x7D,0x00,0x08,0x11,0x02,0x0B,
0xF0,0xF8,0x18,0x18,0x18,0x18,0x1C,0x0F,0x0F,0x1C,0x18,0x18,0x18,0x18,0x18,0xF8,0xF0,
// '~'
0x7E,0x05,0x0B,0x05,0x02,0x0F,
0x00,0x0F,0x87,0xFF,0xC3,0xE0,0x00,
// Terminator
0xFF
};

View File

@ -0,0 +1,331 @@
// ========================================================================
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// Header Format:
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ========================================================================
// dejavu
// Point Size : 24
// Memory usage : 2724 bytes
// # characters : 95
const unsigned char tft_Dejavu24[] =
{
0x00, 0x17, 0x00, 0x00,
// ' '
0x20,0x13,0x00,0x00,0x00,0x08,
// '!'
0x21,0x01,0x02,0x12,0x04,0x0A,
0xFF,0xFF,0xFF,0x03,0xF0,
// '"'
0x22,0x01,0x06,0x07,0x02,0x0B,
0xCF,0x3C,0xF3,0xCF,0x3C,0xC0,
// '#'
0x23,0x01,0x10,0x12,0x02,0x14,
0x03,0x08,0x03,0x18,0x03,0x18,0x03,0x18,0x02,0x18,0x7F,0xFF,0x7F,0xFF,0x06,0x30,0x04,0x30,0x0C,0x20,0x0C,0x60,0xFF,0xFE,0xFF,0xFE,0x18,0x40,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x10,0xC0,
// '$'
0x24,0x01,0x0B,0x16,0x02,0x0F,
0x04,0x00,0x80,0x10,0x0F,0xC7,0xFD,0xC8,0xB1,0x06,0x20,0xE4,0x0F,0x80,0xFE,0x03,0xE0,0x4E,0x08,0xC1,0x1E,0x27,0xFF,0xC7,0xE0,0x10,0x02,0x00,0x40,0x08,0x00,
// '%'
0x25,0x01,0x14,0x12,0x01,0x17,
0x3C,0x03,0x06,0x60,0x60,0xC3,0x06,0x0C,0x30,0xC0,0xC3,0x1C,0x0C,0x31,0x80,0xC3,0x38,0x0C,0x33,0x00,0x66,0x63,0xC3,0xC6,0x66,0x00,0xCC,0x30,0x1C,0xC3,0x01,0x8C,0x30,0x38,0xC3,0x03,0x0C,0x30,0x60,0xC3,0x06,0x06,0x60,0xC0,0x3C,
// '&'
0x26,0x01,0x10,0x12,0x01,0x13,
0x07,0xC0,0x1F,0xE0,0x38,0x20,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x1C,0x00,0x3E,0x00,0x77,0x06,0xE3,0x86,0xC1,0xCC,0xC0,0xFC,0xC0,0x78,0xE0,0x78,0x70,0xFC,0x3F,0xCE,0x0F,0x87,
// '''
0x27,0x01,0x02,0x07,0x02,0x07,
0xFF,0xFC,
// '('
0x28,0x01,0x05,0x15,0x02,0x09,
0x19,0x8C,0xC6,0x31,0x18,0xC6,0x31,0x8C,0x61,0x0C,0x63,0x0C,0x61,0x80,
// ')'
0x29,0x01,0x05,0x15,0x02,0x09,
0xC3,0x18,0x63,0x18,0x43,0x18,0xC6,0x31,0x8C,0x46,0x31,0x98,0xCC,0x00,
// '*'
0x2A,0x01,0x0B,0x0A,0x00,0x0C,
0x04,0x00,0x83,0x11,0xBA,0xE1,0xF0,0x3E,0x1D,0x76,0x23,0x04,0x00,0x80,
// '+'
0x2B,0x03,0x10,0x10,0x03,0x14,
0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0xFF,0xFF,0xFF,0xFF,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
// ','
0x2C,0x10,0x03,0x06,0x02,0x08,
0x6D,0xBD,0x80,
// '-'
0x2D,0x0B,0x06,0x02,0x01,0x09,
0xFF,0xF0,
// '.'
0x2E,0x10,0x02,0x03,0x03,0x08,
0xFC,
// '/'
0x2F,0x01,0x08,0x14,0x00,0x08,
0x03,0x07,0x06,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x18,0x18,0x30,0x30,0x30,0x60,0x60,0x60,0xE0,0xC0,
// '0'
0x30,0x01,0x0C,0x12,0x02,0x0F,
0x0F,0x03,0xFC,0x70,0xE6,0x06,0x60,0x6C,0x03,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x06,0x60,0x67,0x0E,0x3F,0xC0,0xF0,
// '1'
0x31,0x01,0x0A,0x12,0x03,0x0F,
0x3C,0x3F,0x0C,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,
// '2'
0x32,0x01,0x0C,0x12,0x02,0x0F,
0x3F,0x0F,0xF8,0xC1,0xC0,0x0E,0x00,0x60,0x06,0x00,0x60,0x0C,0x01,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xFF,0xEF,0xFE,
// '3'
0x33,0x01,0x0C,0x12,0x02,0x0F,
0x3F,0x07,0xFC,0x41,0xC0,0x06,0x00,0x60,0x06,0x00,0x60,0x0C,0x1F,0x81,0xFC,0x00,0xE0,0x07,0x00,0x30,0x03,0x00,0x78,0x0E,0xFF,0xC3,0xF0,
// '4'
0x34,0x01,0x0D,0x12,0x01,0x0F,
0x01,0xC0,0x1E,0x00,0xB0,0x0D,0x80,0xCC,0x06,0x60,0x63,0x03,0x18,0x30,0xC3,0x06,0x18,0x31,0x81,0x8F,0xFF,0xFF,0xFC,0x03,0x00,0x18,0x00,0xC0,0x06,0x00,
// '5'
0x35,0x01,0x0B,0x12,0x02,0x0F,
0x7F,0xCF,0xF9,0x80,0x30,0x06,0x00,0xC0,0x1F,0xC3,0xFC,0x41,0xC0,0x1C,0x01,0x80,0x30,0x06,0x00,0xC0,0x3C,0x0E,0xFF,0x8F,0xC0,
// '6'
0x36,0x01,0x0C,0x12,0x02,0x0F,
0x07,0xC1,0xFE,0x38,0x27,0x00,0x60,0x0C,0x00,0xCF,0x8D,0xFC,0xF8,0xEF,0x07,0xE0,0x3E,0x03,0xE0,0x36,0x03,0x70,0x77,0x8E,0x3F,0xC0,0xF8,
// '7'
0x37,0x01,0x0B,0x12,0x02,0x0F,
0xFF,0xFF,0xFC,0x03,0x00,0x60,0x1C,0x03,0x00,0x60,0x18,0x03,0x00,0xE0,0x18,0x03,0x00,0xC0,0x18,0x07,0x00,0xC0,0x18,0x06,0x00,
// '8'
0x38,0x01,0x0C,0x12,0x02,0x0F,
0x1F,0x87,0xFE,0x70,0xEC,0x03,0xC0,0x3C,0x03,0xC0,0x37,0x0E,0x3F,0xC3,0xFC,0x70,0xEC,0x03,0xC0,0x3C,0x03,0xC0,0x37,0x0E,0x7F,0xE1,0xF8,
// '9'
0x39,0x01,0x0C,0x12,0x02,0x0F,
0x1F,0x03,0xFC,0x71,0xCE,0x0E,0xC0,0x6C,0x07,0xC0,0x7C,0x07,0xE0,0xF7,0x1F,0x3F,0xB1,0xF3,0x00,0x30,0x06,0x00,0xE4,0x1C,0x7F,0x83,0xE0,
// ':'
0x3A,0x07,0x02,0x0C,0x03,0x08,
0xFC,0x00,0x3F,
// ';'
0x3B,0x07,0x03,0x0F,0x02,0x08,
0x6D,0x80,0x00,0x0D,0xB7,0xB0,
// '<'
0x3C,0x05,0x0F,0x0D,0x03,0x14,
0x00,0x02,0x00,0x3C,0x03,0xF0,0x3F,0x01,0xF8,0x1F,0x80,0x3C,0x00,0x7E,0x00,0x1F,0x80,0x0F,0xC0,0x03,0xF0,0x00,0xF0,0x00,0x20,
// '='
0x3D,0x08,0x0F,0x07,0x03,0x14,
0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,
// '>'
0x3E,0x05,0x0F,0x0D,0x03,0x14,
0x80,0x01,0xE0,0x01,0xF8,0x00,0x7E,0x00,0x3F,0x00,0x0F,0xC0,0x07,0x80,0x3F,0x03,0xF0,0x1F,0x81,0xF8,0x07,0x80,0x08,0x00,0x00,
// '?'
0x3F,0x01,0x09,0x12,0x02,0x0D,
0x3E,0x3F,0xB0,0xF0,0x30,0x18,0x0C,0x0C,0x0E,0x0E,0x0E,0x06,0x03,0x01,0x80,0x00,0x00,0x30,0x18,0x0C,0x00,
// '@'
0x40,0x02,0x15,0x15,0x02,0x18,
0x00,0xFC,0x00,0x3F,0xF8,0x03,0xC0,0xF0,0x38,0x01,0xC3,0x80,0x07,0x38,0x79,0x99,0x8F,0xEC,0xFC,0x71,0xE3,0xC7,0x07,0x1E,0x30,0x18,0xF1,0x80,0xC7,0x8C,0x06,0x3C,0x70,0x73,0x71,0xC7,0xB9,0x8F,0xEF,0x8E,0x1E,0x70,0x38,0x00,0x00,0xE0,0x04,0x03,0xC0,0xE0,0x0F,0xFE,0x00,0x0F,0x80,0x00,
// 'A'
0x41,0x01,0x10,0x12,0x00,0x10,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x06,0x60,0x06,0x60,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x38,0x1C,0x3F,0xFC,0x3F,0xFC,0x60,0x06,0x60,0x06,0x60,0x06,0xC0,0x03,
// 'B'
0x42,0x01,0x0C,0x12,0x02,0x10,
0xFF,0x0F,0xFC,0xC0,0xEC,0x06,0xC0,0x6C,0x06,0xC0,0x6C,0x0C,0xFF,0x8F,0xFC,0xC0,0x6C,0x03,0xC0,0x3C,0x03,0xC0,0x3C,0x06,0xFF,0xEF,0xF8,
// 'C'
0x43,0x01,0x0E,0x12,0x01,0x11,
0x07,0xE0,0x7F,0xE3,0xC1,0xDC,0x01,0x60,0x01,0x80,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x60,0x01,0x80,0x07,0x00,0x4F,0x07,0x1F,0xF8,0x1F,0x80,
// 'D'
0x44,0x01,0x0F,0x12,0x02,0x12,
0xFF,0x81,0xFF,0xE3,0x01,0xE6,0x00,0xEC,0x00,0xD8,0x01,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0xF8,0x01,0xB0,0x07,0x60,0x3C,0xFF,0xF1,0xFF,0x00,
// 'E'
0x45,0x01,0x0B,0x12,0x02,0x0F,
0xFF,0xFF,0xFF,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xFF,0xDF,0xFB,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xFF,0xFF,0xFC,
// 'F'
0x46,0x01,0x0A,0x12,0x02,0x0E,
0xFF,0xFF,0xFC,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xFF,0xBF,0xEC,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x00,
// 'G'
0x47,0x01,0x0F,0x12,0x01,0x13,
0x07,0xE0,0x3F,0xF0,0xE0,0x73,0x80,0x26,0x00,0x1C,0x00,0x30,0x00,0x60,0x00,0xC0,0x7F,0x80,0xFF,0x00,0x1E,0x00,0x36,0x00,0x6C,0x00,0xDC,0x01,0x9E,0x07,0x1F,0xFC,0x0F,0xE0,
// 'H'
0x48,0x01,0x0D,0x12,0x02,0x12,
0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xFF,0xFF,0xFF,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xC0,
// 'I'
0x49,0x01,0x02,0x12,0x02,0x07,
0xFF,0xFF,0xFF,0xFF,0xF0,
// 'J'
0x4A,0x01,0x06,0x17,0xFE,0x07,
0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x1B,0xEF,0x00,
// 'K'
0x4B,0x01,0x0F,0x12,0x02,0x10,
0xC0,0x71,0x81,0xC3,0x07,0x06,0x1C,0x0C,0x70,0x19,0xC0,0x37,0x00,0x7C,0x00,0xF8,0x01,0xB0,0x03,0x38,0x06,0x38,0x0C,0x38,0x18,0x38,0x30,0x38,0x60,0x38,0xC0,0x39,0x80,0x38,
// 'L'
0x4C,0x01,0x0B,0x12,0x02,0x0D,
0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xFF,0xFF,0xFC,
// 'M'
0x4D,0x01,0x10,0x12,0x02,0x15,
0xE0,0x07,0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xD8,0x1B,0xD8,0x1B,0xCC,0x33,0xCC,0x33,0xCC,0x33,0xC6,0x63,0xC6,0x63,0xC7,0xE3,0xC3,0xC3,0xC3,0xC3,0xC1,0x83,0xC0,0x03,0xC0,0x03,0xC0,0x03,
// 'N'
0x4E,0x01,0x0D,0x12,0x02,0x12,
0xE0,0x1F,0x80,0xFC,0x07,0xF0,0x3D,0x81,0xE6,0x0F,0x30,0x78,0xC3,0xC6,0x1E,0x18,0xF0,0xC7,0x83,0x3C,0x19,0xE0,0x6F,0x03,0x78,0x0F,0xC0,0x7E,0x01,0xC0,
// 'O'
0x4F,0x01,0x10,0x12,0x01,0x13,
0x07,0xE0,0x1F,0xF8,0x3C,0x3C,0x70,0x0E,0x60,0x06,0x60,0x06,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x60,0x06,0x60,0x06,0x70,0x0E,0x3C,0x3C,0x1F,0xF8,0x07,0xE0,
// 'P'
0x50,0x01,0x0B,0x12,0x02,0x0E,
0xFF,0x1F,0xFB,0x07,0x60,0x3C,0x07,0x80,0xF0,0x1E,0x0E,0xFF,0xDF,0xE3,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x00,
// 'Q'
0x51,0x01,0x10,0x15,0x01,0x13,
0x07,0xE0,0x1F,0xF8,0x3C,0x3C,0x70,0x0E,0x60,0x06,0x60,0x06,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x60,0x07,0x60,0x06,0x70,0x0E,0x3C,0x3C,0x1F,0xF8,0x07,0xF0,0x00,0x38,0x00,0x18,0x00,0x0C,
// 'R'
0x52,0x01,0x0D,0x12,0x02,0x11,
0xFF,0x07,0xFE,0x30,0x31,0x80,0xCC,0x06,0x60,0x33,0x01,0x98,0x18,0xFF,0xC7,0xFC,0x30,0x71,0x81,0x8C,0x06,0x60,0x33,0x01,0xD8,0x06,0xC0,0x36,0x00,0xC0,
// 'S'
0x53,0x01,0x0C,0x12,0x02,0x0F,
0x1F,0x87,0xFE,0x70,0x6C,0x00,0xC0,0x0C,0x00,0xC0,0x07,0x00,0x7F,0x01,0xFC,0x00,0xE0,0x07,0x00,0x30,0x03,0x00,0x3C,0x0E,0xFF,0xE3,0xF8,
// 'T'
0x54,0x01,0x0E,0x12,0x00,0x0F,
0xFF,0xFF,0xFF,0xF0,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,
// 'U'
0x55,0x01,0x0D,0x12,0x02,0x12,
0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x0D,0x80,0xCE,0x0E,0x3F,0xE0,0x7C,0x00,
// 'V'
0x56,0x01,0x10,0x12,0x00,0x10,
0xC0,0x03,0x60,0x06,0x60,0x06,0x60,0x06,0x30,0x0C,0x30,0x0C,0x38,0x1C,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x07,0x60,0x03,0xC0,0x03,0xC0,0x03,0xC0,
// 'W'
0x57,0x01,0x16,0x12,0x01,0x18,
0xC0,0x78,0x0F,0x01,0xE0,0x36,0x07,0x81,0x98,0x1E,0x06,0x60,0xEC,0x19,0x83,0x30,0x63,0x0C,0xC3,0x0C,0x33,0x0C,0x30,0xCE,0x30,0xC6,0x18,0xC1,0x98,0x66,0x06,0x61,0x98,0x19,0x86,0x60,0x6C,0x0D,0x80,0xF0,0x3C,0x03,0xC0,0xF0,0x0F,0x03,0xC0,0x38,0x07,0x00,
// 'X'
0x58,0x01,0x0F,0x12,0x01,0x11,
0x70,0x0E,0x60,0x18,0x60,0x60,0xE1,0xC0,0xC7,0x00,0xCC,0x01,0xF0,0x01,0xE0,0x03,0x80,0x07,0x80,0x1F,0x00,0x37,0x00,0xC6,0x03,0x86,0x0E,0x0E,0x18,0x0C,0x60,0x0D,0xC0,0x1C,
// 'Y'
0x59,0x01,0x0E,0x12,0x00,0x0F,
0xE0,0x1D,0x80,0x63,0x03,0x0E,0x1C,0x18,0x60,0x33,0x00,0xFC,0x01,0xE0,0x07,0x80,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,
// 'Z'
0x5A,0x01,0x0E,0x12,0x01,0x10,
0xFF,0xFF,0xFF,0xF0,0x01,0x80,0x0E,0x00,0x70,0x01,0x80,0x0C,0x00,0x60,0x03,0x80,0x1C,0x00,0x60,0x03,0x00,0x18,0x00,0xE0,0x07,0x00,0x18,0x00,0xFF,0xFF,0xFF,0xF0,
// '['
0x5B,0x01,0x05,0x15,0x02,0x09,
0xFF,0xF1,0x8C,0x63,0x18,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x31,0xFF,0x80,
// '\'
0x5C,0x01,0x08,0x14,0x00,0x08,
0xC0,0xE0,0x60,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06,0x06,0x07,0x03,
// ']'
0x5D,0x01,0x05,0x15,0x02,0x09,
0xFF,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x8C,0x63,0x18,0xC7,0xFF,0x80,
// '^'
0x5E,0x01,0x0F,0x07,0x03,0x14,
0x03,0x80,0x0F,0x80,0x3B,0x80,0xE3,0x83,0x83,0x8E,0x03,0xB8,0x03,0x80,
// '_'
0x5F,0x17,0x0C,0x02,0x00,0x0C,
0xFF,0xFF,0xFF,
// '`'
0x60,0x00,0x06,0x04,0x02,0x0C,
0x60,0xC1,0x83,
// 'a'
0x61,0x06,0x0B,0x0D,0x01,0x0E,
0x3F,0x0F,0xF9,0x03,0x00,0x30,0x06,0x3F,0xDF,0xFF,0x03,0xC0,0x78,0x1F,0x87,0xBF,0xF3,0xE6,
// 'b'
0x62,0x01,0x0C,0x12,0x02,0x0F,
0xC0,0x0C,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0xF8,0xFF,0xCF,0x0E,0xE0,0x6C,0x03,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xE0,0x6F,0x0E,0xFF,0xCC,0xF8,
// 'c'
0x63,0x06,0x0A,0x0D,0x01,0x0D,
0x0F,0x8F,0xF7,0x05,0x80,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x18,0x07,0x04,0xFF,0x0F,0x80,
// 'd'
0x64,0x01,0x0C,0x12,0x01,0x0F,
0x00,0x30,0x03,0x00,0x30,0x03,0x00,0x31,0xF3,0x3F,0xF7,0x0F,0x60,0x7C,0x03,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0x60,0x77,0x0F,0x3F,0xF1,0xF3,
// 'e'
0x65,0x06,0x0C,0x0D,0x01,0x0E,
0x0F,0x83,0xFC,0x70,0xE6,0x07,0xC0,0x3F,0xFF,0xFF,0xFC,0x00,0xC0,0x06,0x00,0x70,0x23,0xFE,0x0F,0xC0,
// 'f'
0x66,0x01,0x08,0x12,0x01,0x08,
0x0F,0x1F,0x38,0x30,0x30,0xFF,0xFF,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
// 'g'
0x67,0x06,0x0C,0x12,0x01,0x0F,
0x1F,0x33,0xFF,0x70,0xF6,0x07,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x07,0x70,0xF3,0xFF,0x1F,0x30,0x03,0x00,0x72,0x0E,0x3F,0xC1,0xF8,
// 'h'
0x68,0x01,0x0B,0x12,0x02,0x0F,
0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x9F,0x3F,0xF7,0x87,0xE0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0C,
// 'i'
0x69,0x01,0x02,0x12,0x02,0x07,
0xFC,0x3F,0xFF,0xFF,0xF0,
// 'j'
0x6A,0x01,0x05,0x17,0xFF,0x07,
0x18,0xC6,0x00,0x0C,0x63,0x18,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x33,0xFB,0x80,
// 'k'
0x6B,0x01,0x0C,0x12,0x02,0x0E,
0xC0,0x0C,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0x1C,0xC3,0x8C,0x70,0xCE,0x0D,0xC0,0xF8,0x0F,0x80,0xDC,0x0C,0xE0,0xC7,0x0C,0x38,0xC1,0xCC,0x0E,
// 'l'
0x6C,0x01,0x02,0x12,0x02,0x06,
0xFF,0xFF,0xFF,0xFF,0xF0,
// 'm'
0x6D,0x06,0x14,0x0D,0x02,0x18,
0xCF,0x87,0xCF,0xFC,0xFE,0xF0,0xF8,0x7E,0x07,0x03,0xC0,0x60,0x3C,0x06,0x03,0xC0,0x60,0x3C,0x06,0x03,0xC0,0x60,0x3C,0x06,0x03,0xC0,0x60,0x3C,0x06,0x03,0xC0,0x60,0x30,
// 'n'
0x6E,0x06,0x0B,0x0D,0x02,0x0F,
0xCF,0x9F,0xFB,0xC3,0xF0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x06,
// 'o'
0x6F,0x06,0x0C,0x0D,0x01,0x0E,
0x1F,0x83,0xFC,0x70,0xE6,0x06,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x06,0x70,0xE3,0xFC,0x1F,0x80,
// 'p'
0x70,0x06,0x0C,0x12,0x02,0x0F,
0xCF,0x8F,0xFC,0xF0,0xEE,0x06,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x3E,0x06,0xF0,0xEF,0xFC,0xCF,0x8C,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0x00,
// 'q'
0x71,0x06,0x0C,0x12,0x01,0x0F,
0x1F,0x33,0xFF,0x70,0xF6,0x07,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0xC0,0x36,0x07,0x70,0xF3,0xFF,0x1F,0x30,0x03,0x00,0x30,0x03,0x00,0x30,0x03,
// 'r'
0x72,0x06,0x08,0x0D,0x02,0x0A,
0xCF,0xFF,0xF0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
// 's'
0x73,0x06,0x0B,0x0D,0x01,0x0C,
0x3F,0x0F,0xF3,0x82,0x60,0x0C,0x00,0xF0,0x0F,0xC0,0x3C,0x00,0xC0,0x1A,0x07,0x7F,0xC7,0xF0,
// 't'
0x74,0x02,0x08,0x11,0x00,0x09,
0x30,0x30,0x30,0x30,0xFF,0xFF,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x1F,0x0F,
// 'u'
0x75,0x06,0x0B,0x0D,0x02,0x0F,
0xC0,0x78,0x0F,0x01,0xE0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x78,0x1F,0x87,0xBF,0xF3,0xE6,
// 'v'
0x76,0x06,0x0D,0x0D,0x01,0x0F,
0xC0,0x1B,0x01,0x98,0x0C,0xC0,0x63,0x06,0x18,0x30,0x63,0x03,0x18,0x18,0xC0,0x6C,0x03,0x60,0x1F,0x00,0x70,0x00,
// 'w'
0x77,0x06,0x12,0x0D,0x01,0x14,
0xC1,0xE0,0xF0,0x78,0x36,0x1E,0x19,0x87,0x86,0x63,0x31,0x9C,0xCC,0xE3,0x33,0x30,0xCC,0xCC,0x36,0x1B,0x07,0x87,0x81,0xE1,0xE0,0x78,0x78,0x1C,0x0E,0x00,
// 'x'
0x78,0x06,0x0D,0x0D,0x01,0x0F,
0xE0,0x3B,0x83,0x8E,0x38,0x31,0x80,0xD8,0x07,0xC0,0x1C,0x01,0xF0,0x1D,0xC0,0xC6,0x0C,0x18,0xE0,0xEE,0x03,0x80,
// 'y'
0x79,0x06,0x0D,0x12,0x01,0x0F,
0xC0,0x1B,0x01,0x98,0x0C,0xE0,0xE3,0x06,0x18,0x70,0x63,0x03,0x18,0x0D,0x80,0x6C,0x03,0xE0,0x0E,0x00,0x70,0x03,0x00,0x18,0x01,0x80,0x7C,0x03,0xC0,0x00,
// 'z'
0x7A,0x06,0x0B,0x0D,0x01,0x0D,
0xFF,0xFF,0xFC,0x03,0x00,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x01,0x80,0x7F,0xFF,0xFE,
// '{'
0x7B,0x01,0x09,0x16,0x03,0x0F,
0x03,0x83,0xC3,0x81,0x80,0xC0,0x60,0x30,0x18,0x0C,0x0E,0x3E,0x1F,0x01,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0xC0,0x78,0x1C,
// '|'
0x7C,0x01,0x02,0x18,0x03,0x08,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// '}'
0x7D,0x01,0x09,0x16,0x03,0x0F,
0xE0,0x78,0x0E,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0E,0x03,0xE1,0xF1,0xC0,0xC0,0x60,0x30,0x18,0x0C,0x06,0x07,0x0F,0x07,0x00,
// '~'
0x7E,0x09,0x0F,0x05,0x03,0x14,
0x00,0x00,0x7C,0x05,0xFE,0x1E,0x1F,0xE0,0x0F,0x80,
// Terminator
0xFF
};

157
components/tft/Kconfig Normal file
View File

@ -0,0 +1,157 @@
menu "TFT Display"
config TFT_PREDEFINED_DISPLAY_TYPE
int
default 0 if TFT_PREDEFINED_DISPLAY_TYPE0
default 1 if TFT_PREDEFINED_DISPLAY_TYPE1
default 2 if TFT_PREDEFINED_DISPLAY_TYPE2
default 3 if TFT_PREDEFINED_DISPLAY_TYPE3
default 4 if TFT_PREDEFINED_DISPLAY_TYPE4
default 5 if TFT_PREDEFINED_DISPLAY_TYPE5
choice
prompt "Select predefined display configuration"
default TFT_PREDEFINED_DISPLAY_TYPE0
help
Select predefined display configuration
config TFT_PREDEFINED_DISPLAY_TYPE0
bool "None"
config TFT_PREDEFINED_DISPLAY_TYPE1
bool "ESP-WROVER-KIT v3 Display (ST7789V)"
config TFT_PREDEFINED_DISPLAY_TYPE4
bool "ESP-WROVER-KIT v4.1 Display (ILI9341)"
config TFT_PREDEFINED_DISPLAY_TYPE2
bool "Adafruit TFT Feather Display"
config TFT_PREDEFINED_DISPLAY_TYPE3
bool "M5Stack TFT Display"
config TFT_PREDEFINED_DISPLAY_TYPE5
bool "TTGO T-DISPLAY (ST7789V)"
endchoice
if TFT_PREDEFINED_DISPLAY_TYPE0
config TFT_DISPLAY_CONTROLLER_MODEL
int
default 0 if TFT_DISPLAY_CONTROLLER_ILI9341
default 1 if TFT_DISPLAY_CONTROLLER_ILI9488
default 2 if TFT_DISPLAY_CONTROLLER_ST7789V
default 3 if TFT_DISPLAY_CONTROLLER_ST7735
default 4 if TFT_DISPLAY_CONTROLLER_ST7735R
default 5 if TFT_DISPLAY_CONTROLLER_ST7735B
choice
prompt "Select a display controller model."
default TFT_DISPLAY_CONTROLLER_ILI9341
help
Select the controller for your display. If an TFT_PREDEFINED_DISPLAY_TYPE is set, this will be overridden.
config TFT_DISPLAY_CONTROLLER_ILI9341
bool "ILI9341"
config TFT_DISPLAY_CONTROLLER_ILI9488
bool "ILI9488"
config TFT_DISPLAY_CONTROLLER_ST7789V
bool "ST7789V"
config TFT_DISPLAY_CONTROLLER_ST7735
bool "ST7735"
config TFT_DISPLAY_CONTROLLER_ST7735R
bool "ST7735R"
config TFT_DISPLAY_CONTROLLER_ST7735B
bool "ST7735B"
endchoice
config TFT_DISPLAY_WIDTH
int "TFT display width in pixels."
default 240
help
The smaller dimension (in portrait).
config TFT_DISPLAY_HEIGHT
int "TFT display height in pixels."
default 320
help
The smaller dimension (in portrait).
config TFT_RGB_BGR
bool "RGB (Red Green Blue)"
default n
help
Is the display RGB rather than GBR?
config TFT_TOUCH_CONTROLLER
int
default 0 if TFT_TOUCH_CONTROLLER0
default 1 if TFT_TOUCH_CONTROLLER1
default 2 if TFT_TOUCH_CONTROLLER2
choice
prompt "Select touch controller."
default TFT_TOUCH_CONTROLLER0
help
Select predefined display configuration
config TFT_TOUCH_CONTROLLER0
bool "None"
config TFT_TOUCH_CONTROLLER1
bool "XPT2046"
config TFT_TOUCH_CONTROLLER2
bool "STMPE610"
endchoice
config TFT_INVERT_ROTATION1
bool "Invert rotation1."
default n
help
If text is backwards on your display, try enabling this.
config TFT_PIN_NUM_MOSI
int "GPIO for MOSI (Master Out Slave In)"
default 23
help
If not using a predefined display type, configure the MOSI pin here.
config TFT_PIN_NUM_MISO
int "GPIO for MISO (Master In Slave Out)"
default 19
help
If not using a predefined display type, configure the MISO pin here.
config TFT_PIN_NUM_CLK
int "GPIO for CLK (SCK / Serial Clock)"
default 18
help
If not using a predefined display type, configure the SCK pin here.
config TFT_PIN_NUM_CS
int "GPIO for CS (Slave Select)"
default 5
help
If not using a predefined display type, configure the CS pin here.
config TFT_PIN_NUM_DC
int "GPIO for DC (Data \ Command)"
default 26
help
If not using a predefined display type, configure the DC pin here.
config TFT_PIN_NUM_TCS
int "GPIO for TCS (Touchscreen)"
default 25
help
Optional. If not using a predefined display type, configure the TCS (touch screen) pin here.
config TFT_PIN_NUM_RST
int "GPIO for Reset"
default 0
help
Optional. If not using a predefined display type, configure the reset pin here.
config TFT_PIN_NUM_BCKL
int "GPIO for Back-light control"
default 0
help
Optional. If not using a predefined display type, configure the blacklight pin here.
endif
endmenu

120
components/tft/SmallFont.c Normal file
View File

@ -0,0 +1,120 @@
// SmallFont.c
// Font type : Full (95 characters)
// Font size : 8x12 pixels
// Memory usage : 1144 bytes
#if defined(__AVR__)
#include <avr/pgmspace.h>
#define fontdatatype const uint8_t
#elif defined(__PIC32MX__)
#define PROGMEM
#define fontdatatype const unsigned char
#elif defined(__arm__)
#define PROGMEM
#define fontdatatype const unsigned char
#endif
const unsigned char tft_SmallFont[1144] =
{
0x08,0x0C,0x20,0x5F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // <space>
0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, // !
0x00,0x28,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // "
0x00,0x00,0x28,0x28,0xFC,0x28,0x50,0xFC,0x50,0x50,0x00,0x00, // #
0x00,0x20,0x78,0xA8,0xA0,0x60,0x30,0x28,0xA8,0xF0,0x20,0x00, // $
0x00,0x00,0x48,0xA8,0xB0,0x50,0x28,0x34,0x54,0x48,0x00,0x00, // %
0x00,0x00,0x20,0x50,0x50,0x78,0xA8,0xA8,0x90,0x6C,0x00,0x00, // &
0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x00, // (
0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00, // )
0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00, // *
0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00,0x00, // +
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, // ,
0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, // -
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, // .
0x00,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, // /
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // 0
0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // 1
0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00, // 2
0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00, // 3
0x00,0x00,0x10,0x30,0x50,0x50,0x90,0x78,0x10,0x18,0x00,0x00, // 4
0x00,0x00,0xF8,0x80,0x80,0xF0,0x08,0x08,0x88,0x70,0x00,0x00, // 5
0x00,0x00,0x70,0x90,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00, // 6
0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x20,0x20,0x20,0x00,0x00, // 7
0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, // 8
0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x48,0x70,0x00,0x00, // 9
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0x00, // :
0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00, // ;
0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, // <
0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, // =
0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, // >
0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, // ?
0x00,0x00,0x70,0x88,0x98,0xA8,0xA8,0xB8,0x80,0x78,0x00,0x00, // @
0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00, // A
0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00, // B
0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00, // C
0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00, // D
0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00, // E
0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00, // F
0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00, // G
0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00, // H
0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // I
0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0,0x00, // J
0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x50,0x48,0xEC,0x00,0x00, // K
0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00, // L
0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // M
0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00, // N
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // O
0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00, // P
0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00, // Q
0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00, // R
0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00, // S
0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // T
0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00, // U
0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00, // V
0x00,0x00,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x50,0x00,0x00, // W
0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00, // X
0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // Y
0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00, // Z
0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, // [
0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x00,0x00, // <backslash>
0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, // ]
0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, // _
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // `
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00, // a
0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, // b
0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x40,0x38,0x00,0x00, // c
0x00,0x00,0x18,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00, // d
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, // e
0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00, // f
0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x78,0x44,0x38, // g
0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00, // h
0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00, // i
0x00,0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0, // j
0x00,0x00,0xC0,0x40,0x40,0x5C,0x50,0x70,0x48,0xEC,0x00,0x00, // k
0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // l
0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // m
0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00, // n
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, // o
0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0, // p
0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C, // q
0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00, // r
0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00, // s
0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x18,0x00,0x00, // t
0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00, // u
0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x00,0x00, // v
0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00, // w
0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00, // x
0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x20,0xC0, // y
0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00, // z
0x00,0x18,0x10,0x10,0x10,0x20,0x10,0x10,0x10,0x10,0x18,0x00, // {
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, // |
0x00,0x60,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00, // }
0x40,0xA4,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~
};

331
components/tft/Ubuntu16.c Normal file
View File

@ -0,0 +1,331 @@
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// on Arduinos. It can however handle any ttf font that has been converted
// using the conversion program. These could be fixed width or proportional
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// Ubuntu16.c
// Point Size : 16
// Memory usage : 1433 bytes
// # characters : 95
// Header Format (to make Arduino UTFT Compatible):
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
const unsigned char tft_Ubuntu16[] =
{
0x00, 0x10, 0x00, 0x00,
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ' '
0x20,0x0D,0x00,0x00,0x00,0x04,
// '!'
0x21,0x02,0x01,0x0B,0x01,0x04,
0xFC,0x60,
// '"'
0x22,0x00,0x04,0x04,0x01,0x07,
0x99,0x99,
// '#'
0x23,0x02,0x09,0x0B,0x01,0x0B,
0x11,0x08,0x84,0x5F,0xF2,0x21,0x10,0x89,0xFF,0x44,0x22,0x11,0x00,
// '$'
0x24,0x00,0x07,0x10,0x01,0x09,
0x10,0x20,0xF6,0x08,0x10,0x18,0x08,0x0C,0x0C,0x08,0x3F,0xC2,0x04,0x00,
// '%'
0x25,0x02,0x0C,0x0B,0x01,0x0E,
0x70,0x4D,0x88,0x89,0x08,0x90,0xDA,0x07,0x4E,0x05,0xB0,0x91,0x09,0x11,0x1B,0x20,0xE0,
// '&'
0x26,0x02,0x0A,0x0B,0x01,0x0B,
0x3C,0x18,0x84,0x21,0x08,0x2C,0x0C,0x04,0x8A,0x10,0x83,0x30,0xC7,0xC8,
// '''
0x27,0x00,0x01,0x04,0x01,0x04,
0xF0,
// '('
0x28,0x00,0x04,0x10,0x01,0x05,
0x02,0x44,0x48,0x88,0x88,0x84,0x44,0x20,
// ')'
0x29,0x00,0x04,0x10,0x00,0x05,
0x04,0x22,0x21,0x11,0x11,0x12,0x22,0x40,
// '*'
0x2A,0x02,0x09,0x06,0x00,0x08,
0x08,0x24,0x8F,0x83,0x81,0x41,0x10,
// '+'
0x2B,0x05,0x07,0x07,0x01,0x09,
0x10,0x20,0x47,0xF1,0x02,0x04,0x00,
// ','
0x2C,0x0B,0x02,0x05,0x00,0x04,
0x54,0x80,
// '-'
0x2D,0x08,0x04,0x01,0x01,0x06,
0xF0,
// '.'
0x2E,0x0B,0x01,0x02,0x01,0x04,
0xC0,
// '/'
0x2F,0x00,0x07,0x10,0x00,0x06,
0x02,0x08,0x10,0x20,0x81,0x02,0x08,0x10,0x40,0x81,0x04,0x08,0x10,0x40,
// '0'
0x30,0x02,0x07,0x0B,0x01,0x09,
0x38,0x8B,0x1C,0x18,0x30,0x60,0xC1,0x86,0x88,0xE0,
// '1'
0x31,0x02,0x04,0x0B,0x01,0x09,
0x13,0x59,0x11,0x11,0x11,0x10,
// '2'
0x32,0x02,0x06,0x0B,0x01,0x09,
0x7A,0x30,0x41,0x08,0x21,0x08,0x42,0x0F,0xC0,
// '3'
0x33,0x02,0x07,0x0B,0x01,0x09,
0x78,0x08,0x08,0x10,0x47,0x01,0x01,0x02,0x0B,0xE0,
// '4'
0x34,0x02,0x07,0x0B,0x01,0x09,
0x04,0x18,0x51,0x22,0x48,0xA1,0x7F,0x04,0x08,0x10,
// '5'
0x35,0x02,0x07,0x0B,0x01,0x09,
0x7E,0x81,0x02,0x07,0x81,0x80,0x81,0x02,0x0B,0xE0,
// '6'
0x36,0x02,0x07,0x0B,0x01,0x09,
0x1C,0x61,0x00,0x0F,0x90,0xA0,0xC1,0x82,0x88,0xE0,
// '7'
0x37,0x02,0x07,0x0B,0x01,0x09,
0xFE,0x04,0x10,0x40,0x82,0x04,0x08,0x20,0x40,0x80,
// '8'
0x38,0x02,0x07,0x0B,0x01,0x09,
0x39,0x8A,0x0C,0x14,0x47,0x11,0x41,0x83,0x89,0xE0,
// '9'
0x39,0x02,0x07,0x0B,0x01,0x09,
0x38,0x8A,0x0C,0x18,0x28,0x4F,0x81,0x04,0x11,0xC0,
// ':'
0x3A,0x05,0x01,0x08,0x01,0x04,
0xC3,
// ';'
0x3B,0x05,0x02,0x0B,0x00,0x04,
0x50,0x05,0x48,
// '<'
0x3C,0x05,0x08,0x07,0x01,0x09,
0x02,0x0C,0x30,0x60,0x30,0x0C,0x02,
// '='
0x3D,0x06,0x07,0x04,0x01,0x09,
0xFE,0x00,0x07,0xF0,
// '>'
0x3E,0x05,0x09,0x07,0x00,0x09,
0x40,0x1C,0x01,0x80,0x70,0x61,0xC1,0x00,
// '?'
0x3F,0x02,0x06,0x0B,0x01,0x07,
0x78,0x30,0x41,0x18,0xC2,0x00,0x00,0x82,0x00,
// '@'
0x40,0x02,0x0D,0x0D,0x01,0x0F,
0x0F,0x81,0x83,0x10,0x0C,0x8F,0xA8,0x84,0xC8,0x26,0x41,0x32,0x09,0x88,0x5A,0x3F,0x90,0x00,0x60,0x00,0xFC,0x00,
// 'A'
0x41,0x02,0x0B,0x0B,0x00,0x0B,
0x04,0x01,0xC0,0x28,0x08,0x81,0x10,0x61,0x08,0x21,0xFC,0x60,0x48,0x0B,0x00,0x80,
// 'B'
0x42,0x02,0x08,0x0B,0x01,0x0A,
0xF8,0x86,0x82,0x82,0x86,0xFC,0x82,0x81,0x81,0x82,0xFC,
// 'C'
0x43,0x02,0x09,0x0B,0x01,0x0B,
0x1F,0x10,0x10,0x10,0x08,0x04,0x02,0x01,0x00,0x40,0x30,0x07,0xC0,
// 'D'
0x44,0x02,0x09,0x0B,0x01,0x0B,
0xFC,0x41,0x20,0x50,0x18,0x0C,0x06,0x03,0x01,0x81,0x41,0x3F,0x00,
// 'E'
0x45,0x02,0x07,0x0B,0x01,0x09,
0xFF,0x02,0x04,0x08,0x1F,0xA0,0x40,0x81,0x03,0xF8,
// 'F'
0x46,0x02,0x07,0x0B,0x01,0x09,
0xFF,0x02,0x04,0x08,0x1F,0xA0,0x40,0x81,0x02,0x00,
// 'G'
0x47,0x02,0x09,0x0B,0x01,0x0B,
0x1F,0x10,0x10,0x10,0x08,0x04,0x02,0x03,0x01,0x40,0xB0,0x47,0xE0,
// 'H'
0x48,0x02,0x09,0x0B,0x01,0x0B,
0x80,0xC0,0x60,0x30,0x18,0x0F,0xFE,0x03,0x01,0x80,0xC0,0x60,0x20,
// 'I'
0x49,0x02,0x01,0x0B,0x01,0x03,
0xFF,0xE0,
// 'J'
0x4A,0x02,0x07,0x0B,0x00,0x08,
0x02,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x09,0xE0,
// 'K'
0x4B,0x02,0x09,0x0B,0x01,0x0A,
0x81,0x41,0x23,0x12,0x0A,0x06,0x02,0xC1,0x10,0x86,0x40,0xA0,0x20,
// 'L'
0x4C,0x02,0x07,0x0B,0x01,0x08,
0x81,0x02,0x04,0x08,0x10,0x20,0x40,0x81,0x03,0xF8,
// 'M'
0x4D,0x02,0x0B,0x0B,0x01,0x0D,
0x40,0x4C,0x19,0x01,0x28,0xA5,0x14,0x94,0xB2,0x9C,0x33,0x84,0x30,0x06,0x00,0x80,
// 'N'
0x4E,0x02,0x09,0x0B,0x01,0x0B,
0x80,0xE0,0x68,0x32,0x19,0x0C,0x46,0x13,0x05,0x82,0xC0,0xE0,0x20,
// 'O'
0x4F,0x02,0x0B,0x0B,0x01,0x0D,
0x1F,0x04,0x11,0x01,0x40,0x18,0x03,0x00,0x60,0x0C,0x01,0x40,0x44,0x10,0x7C,0x00,
// 'P'
0x50,0x02,0x08,0x0B,0x01,0x0A,
0xFC,0x82,0x81,0x81,0x81,0x82,0xFC,0x80,0x80,0x80,0x80,
// 'Q'
0x51,0x02,0x0B,0x0E,0x01,0x0D,
0x1F,0x04,0x11,0x01,0x40,0x18,0x03,0x00,0x60,0x0C,0x01,0x40,0x44,0x10,0x78,0x02,0x00,0x30,0x01,0x80,
// 'R'
0x52,0x02,0x09,0x0B,0x01,0x0A,
0xFC,0x41,0x20,0x50,0x28,0x14,0x13,0xF1,0x08,0x82,0x40,0xA0,0x20,
// 'S'
0x53,0x02,0x08,0x0B,0x01,0x09,
0x3C,0xC2,0x80,0x80,0x40,0x1C,0x06,0x02,0x02,0x06,0x78,
// 'T'
0x54,0x02,0x09,0x0B,0x00,0x09,
0xFF,0x84,0x02,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00,
// 'U'
0x55,0x02,0x09,0x0B,0x01,0x0B,
0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xA0,0x8F,0x80,
// 'V'
0x56,0x02,0x09,0x0B,0x00,0x09,
0x80,0xE0,0xD0,0x48,0x26,0x21,0x10,0x88,0x28,0x14,0x0E,0x02,0x00,
// 'W'
0x57,0x02,0x0D,0x0B,0x00,0x0D,
0x80,0x0E,0x10,0xD0,0x84,0x8E,0x24,0x51,0x22,0x88,0xA2,0x85,0x14,0x38,0xE0,0xC2,0x04,0x10,
// 'X'
0x58,0x02,0x09,0x0B,0x00,0x09,
0xC1,0xA0,0x88,0x86,0xC1,0x40,0x60,0x70,0x6C,0x22,0x20,0xB0,0x60,
// 'Y'
0x59,0x02,0x09,0x0B,0x00,0x09,
0x80,0xA0,0x90,0x44,0x41,0x40,0xA0,0x20,0x10,0x08,0x04,0x02,0x00,
// 'Z'
0x5A,0x02,0x07,0x0B,0x01,0x09,
0xFE,0x04,0x10,0x41,0x02,0x08,0x00,0x41,0x03,0xF8,
// '['
0x5B,0x00,0x03,0x10,0x02,0x05,
0xF2,0x49,0x24,0x92,0x49,0x27,
// '\'
0x5C,0x00,0x07,0x10,0x00,0x06,
0x80,0x81,0x02,0x02,0x04,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x81,0x01,
// ']'
0x5D,0x00,0x03,0x10,0x00,0x05,
0xE4,0x92,0x49,0x24,0x92,0x4F,
// '^'
0x5E,0x02,0x07,0x06,0x01,0x09,
0x10,0x70,0xA2,0x24,0x50,0x40,
// '_'
0x5F,0x0F,0x08,0x01,0x00,0x08,
0xFF,
// '`'
0x60,0x01,0x04,0x03,0x01,0x06,
0x86,0x10,
// 'a'
0x61,0x05,0x06,0x08,0x01,0x08,
0x78,0x30,0x5F,0xC6,0x18,0x5F,
// 'b'
0x62,0x01,0x07,0x0C,0x01,0x09,
0x81,0x02,0x04,0x0F,0x90,0xA0,0xC1,0x83,0x06,0x17,0xC0,
// 'c'
0x63,0x05,0x06,0x08,0x01,0x08,
0x3D,0x08,0x20,0x82,0x04,0x0F,
// 'd'
0x64,0x01,0x07,0x0C,0x01,0x09,
0x02,0x04,0x08,0x13,0xE8,0x60,0xC1,0x83,0x05,0x09,0xF0,
// 'e'
0x65,0x05,0x07,0x08,0x01,0x09,
0x3C,0x8A,0x0F,0xF8,0x10,0x10,0x1E,
// 'f'
0x66,0x01,0x05,0x0C,0x01,0x06,
0x7E,0x21,0x0F,0xC2,0x10,0x84,0x21,0x00,
// 'g'
0x67,0x05,0x07,0x0B,0x01,0x09,
0x3E,0x86,0x0C,0x18,0x30,0x50,0x9F,0x02,0x0B,0xE0,
// 'h'
0x68,0x01,0x07,0x0C,0x01,0x09,
0x81,0x02,0x04,0x0F,0x90,0xE0,0xC1,0x83,0x06,0x0C,0x10,
// 'i'
0x69,0x01,0x03,0x0C,0x00,0x03,
0x48,0x04,0x92,0x49,0x20,
// 'j'
0x6A,0x01,0x04,0x0F,0xFF,0x03,
0x22,0x00,0x22,0x22,0x22,0x22,0x22,0xC0,
// 'k'
0x6B,0x01,0x06,0x0C,0x01,0x08,
0x82,0x08,0x20,0x8A,0x4A,0x30,0xA2,0x48,0xA1,
// 'l'
0x6C,0x01,0x04,0x0C,0x01,0x04,
0x88,0x88,0x88,0x88,0x88,0x86,
// 'm'
0x6D,0x05,0x0B,0x08,0x01,0x0D,
0xFB,0xD1,0x8E,0x10,0xC2,0x18,0x43,0x08,0x61,0x0C,0x21,
// 'n'
0x6E,0x05,0x07,0x08,0x01,0x09,
0xFD,0x0E,0x0C,0x18,0x30,0x60,0xC1,
// 'o'
0x6F,0x05,0x08,0x08,0x01,0x0A,
0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C,
// 'p'
0x70,0x05,0x07,0x0B,0x01,0x09,
0xF9,0x0A,0x0C,0x18,0x30,0x61,0x7C,0x81,0x02,0x00,
// 'q'
0x71,0x05,0x07,0x0B,0x01,0x09,
0x3E,0x86,0x0C,0x18,0x30,0x50,0x9F,0x02,0x04,0x08,
// 'r'
0x72,0x05,0x05,0x08,0x01,0x06,
0xFC,0x21,0x08,0x42,0x10,
// 's'
0x73,0x05,0x05,0x08,0x01,0x07,
0x7C,0x20,0xC3,0x04,0x3E,
// 't'
0x74,0x02,0x05,0x0B,0x01,0x07,
0x84,0x21,0xF8,0x42,0x10,0x84,0x1E,
// 'u'
0x75,0x05,0x07,0x08,0x01,0x09,
0x83,0x06,0x0C,0x18,0x30,0x50,0xBF,
// 'v'
0x76,0x05,0x07,0x08,0x00,0x07,
0x83,0x05,0x12,0x22,0x85,0x0E,0x08,
// 'w'
0x77,0x05,0x0D,0x08,0x00,0x0D,
0x82,0x0C,0x10,0x51,0xC4,0x8A,0x26,0x5B,0x14,0x50,0xE3,0x82,0x08,
// 'x'
0x78,0x05,0x08,0x08,0x00,0x08,
0xC3,0x66,0x24,0x18,0x18,0x24,0x42,0xC3,
// 'y'
0x79,0x05,0x07,0x0B,0x00,0x07,
0x82,0x89,0x12,0x22,0x85,0x04,0x08,0x10,0x43,0x00,
// 'z'
0x7A,0x05,0x06,0x08,0x01,0x08,
0xFC,0x10,0x84,0x21,0x08,0x3F,
// '{'
0x7B,0x00,0x05,0x10,0x00,0x05,
0x19,0x08,0x42,0x10,0x98,0x61,0x08,0x42,0x10,0x83,
// '|'
0x7C,0x00,0x01,0x10,0x02,0x05,
0xFF,0xFF,
// '}'
0x7D,0x00,0x05,0x10,0x00,0x05,
0xC1,0x08,0x42,0x10,0x83,0x31,0x08,0x42,0x10,0x98,
// '~'
0x7E,0x07,0x07,0x02,0x01,0x09,
0x73,0x18,
// Terminator
0xFF
};

331
components/tft/comic24.c Normal file
View File

@ -0,0 +1,331 @@
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// on Arduinos. It can however handle any ttf font that has been converted
// using the conversion program. These could be fixed width or proportional
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// comic.c
// Point Size : 24
// Memory usage : 2814 bytes
// # characters : 95
// Header Format (to make Arduino UTFT Compatible):
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
unsigned char tft_Comic24[] =
{
0x00, 0x19, 0x00, 0x00,
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ' '
0x20,0x15,0x00,0x00,0x00,0x07,
// '!'
0x21,0x02,0x02,0x14,0x01,0x06,
0xFF,0xFF,0xFF,0xFC,0x2D,
// '"'
0x22,0x03,0x06,0x08,0x02,0x0A,
0xCF,0x3C,0xF3,0xCF,0x3C,0xF3,
// '#'
0x23,0x03,0x14,0x12,0x01,0x14,
0x01,0x81,0x80,0x18,0x18,0x01,0x81,0x80,0x30,0x30,0x03,0x03,0x07,0xFF,0xFF,0x7F,0xFF,0xF0,0x60,0x60,0x06,0x06,0x00,0xC0,0xC0,0x0C,0x0C,0x0F,0xFF,0xFE,0xFF,0xFF,0xE1,0x81,0x80,0x18,0x18,0x03,0x83,0x00,0x30,0x30,0x03,0x03,0x00,
// '$'
0x24,0x00,0x0B,0x19,0x02,0x11,
0x0C,0x01,0x80,0x30,0x0F,0x83,0xFC,0xD9,0xBB,0x06,0x60,0xCC,0x19,0x83,0xB0,0x3F,0x83,0xFC,0x1B,0x83,0x18,0x63,0x0C,0x71,0x9F,0x37,0x7F,0xC3,0xF0,0x18,0x03,0x00,0x60,0x0C,0x00,
// '%'
0x25,0x01,0x11,0x14,0x02,0x14,
0x00,0x00,0x00,0x0C,0x0E,0x0E,0x0F,0x86,0x0C,0x67,0x06,0x33,0x03,0x19,0x80,0xF9,0x80,0x38,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x31,0xE0,0x39,0xF8,0x19,0xCE,0x1C,0xC3,0x0C,0x61,0x86,0x39,0xC6,0x0F,0xC3,0x03,0xC0,
// '&'
0x26,0x03,0x0F,0x13,0x01,0x10,
0x01,0xC0,0x07,0xC0,0x19,0x80,0x33,0x00,0x6E,0x00,0xF8,0x01,0xE0,0x07,0x80,0x1F,0x8C,0x73,0x19,0xC3,0x37,0x07,0xEC,0x07,0xD8,0x07,0x30,0x0E,0x38,0x7E,0x3F,0xEC,0x3F,0x0C,0x00,0x18,
// '''
0x27,0x03,0x02,0x06,0x03,0x09,
0xFF,0xF0,
// '('
0x28,0x02,0x07,0x18,0x01,0x09,
0x06,0x1C,0x71,0xC3,0x0E,0x18,0x30,0xE1,0x83,0x06,0x0C,0x18,0x30,0x60,0xE0,0xC1,0x83,0x83,0x83,0x87,0x83,
// ')'
0x29,0x02,0x06,0x18,0x02,0x09,
0xC3,0x86,0x0C,0x30,0x61,0x86,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x61,0x86,0x31,0xCE,0x30,
// '*'
0x2A,0x03,0x0B,0x09,0x01,0x0D,
0x0C,0x01,0x83,0xBF,0xFF,0xF3,0xFC,0x3C,0x0F,0xC3,0x9C,0x61,0x80,
// '+'
0x2B,0x09,0x0A,0x0A,0x00,0x0C,
0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00,
// ','
0x2C,0x13,0x04,0x06,0x02,0x07,
0x37,0x66,0xEC,
// '-'
0x2D,0x0E,0x08,0x02,0x01,0x0A,
0xFF,0xFF,
// '.'
0x2E,0x12,0x03,0x03,0x02,0x06,
0xFF,0x80,
// '/'
0x2F,0x01,0x0A,0x15,0x01,0x0C,
0x00,0x00,0x30,0x0C,0x06,0x01,0x80,0x60,0x30,0x0C,0x06,0x01,0x80,0xC0,0x30,0x18,0x06,0x03,0x00,0xC0,0x60,0x18,0x0E,0x03,0x00,0xC0,0x00,
// '0'
0x30,0x03,0x0D,0x12,0x01,0x0F,
0x0F,0x80,0xFF,0x0E,0x18,0xE0,0x66,0x03,0x70,0x0F,0x00,0x78,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x03,0xB0,0x19,0x81,0xC7,0x1C,0x3F,0xC0,0x7C,0x00,
// '1'
0x31,0x03,0x06,0x12,0x03,0x0B,
0x10,0xC7,0x3C,0xB0,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0xFF,0xF0,
// '2'
0x32,0x03,0x0B,0x12,0x02,0x0F,
0x1F,0x07,0xFB,0xC3,0xE0,0x30,0x06,0x00,0xC0,0x38,0x0E,0x07,0x81,0xE0,0xF8,0x3C,0x07,0x01,0xC0,0x30,0x06,0x00,0xFF,0xDF,0xFC,
// '3'
0x33,0x03,0x0B,0x12,0x02,0x0F,
0x1F,0x0F,0xF9,0xC3,0x80,0x30,0x06,0x00,0xC0,0x78,0x7E,0x0F,0x80,0x78,0x03,0x80,0x30,0x06,0x00,0xF0,0x1F,0x0E,0x7F,0x83,0xE0,
// '4'
0x34,0x03,0x0D,0x12,0x02,0x0F,
0x01,0xC0,0x0E,0x00,0xF0,0x0F,0x80,0x6C,0x07,0x60,0x33,0x03,0x98,0x38,0xC1,0x86,0x1C,0x31,0xFF,0xFF,0xFF,0x80,0x60,0x03,0x00,0x18,0x00,0xC0,0x06,0x00,
// '5'
0x35,0x02,0x0C,0x13,0x02,0x0F,
0x00,0x0F,0xFE,0xFF,0xE6,0x00,0x60,0x0E,0x00,0xEF,0x8F,0xFC,0xF8,0x6E,0x07,0xC0,0x30,0x03,0x00,0x30,0x03,0x00,0x7C,0x06,0xE1,0xE7,0xFC,0x3F,0x00,
// '6'
0x36,0x03,0x0C,0x12,0x01,0x0F,
0x03,0x00,0x70,0x0E,0x01,0xC0,0x38,0x03,0x00,0x60,0x06,0xF8,0xFF,0xEE,0x0E,0xC0,0x3C,0x03,0xC0,0x3C,0x03,0x60,0x77,0x0E,0x3F,0xC1,0xF8,
// '7'
0x37,0x02,0x0D,0x13,0x01,0x0F,
0x00,0x07,0xFF,0xFF,0xFE,0x00,0xE0,0x0E,0x00,0x60,0x06,0x00,0x30,0x03,0x80,0x18,0x01,0xC0,0x0C,0x00,0x60,0x07,0x00,0x30,0x03,0x80,0x18,0x00,0xC0,0x04,0x00,
// '8'
0x38,0x02,0x0C,0x13,0x01,0x0F,
0x00,0x00,0xFC,0x3F,0xE3,0x07,0x60,0x36,0x03,0x60,0x37,0x8F,0x3F,0xE1,0xFE,0x38,0xE7,0x07,0x60,0x36,0x03,0x60,0x36,0x03,0x30,0x63,0xFE,0x0F,0x80,
// '9'
0x39,0x03,0x0D,0x13,0x01,0x0F,
0x0F,0x01,0xFE,0x1C,0x38,0xC0,0xCC,0x07,0x60,0x1B,0x00,0xD8,0x06,0xE0,0x73,0x87,0x8F,0xF8,0x3E,0xC0,0x0E,0x00,0x60,0x07,0x00,0xF0,0x1F,0x03,0xE0,0x1C,0x00,
// ':'
0x3A,0x09,0x03,0x0B,0x02,0x07,
0xFF,0x80,0x00,0xFF,0x80,
// ';'
0x3B,0x09,0x04,0x0E,0x02,0x07,
0xEE,0xE0,0x00,0x00,0x03,0x7E,0xCC,
// '<'
0x3C,0x09,0x07,0x0A,0x01,0x09,
0x06,0x1C,0x71,0xC7,0x1E,0x1E,0x0E,0x0E,0x0C,
// '='
0x3D,0x0A,0x09,0x09,0x01,0x0C,
0xFF,0xFF,0xC0,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,
// '>'
0x3E,0x08,0x08,0x0B,0x01,0x0A,
0x60,0x70,0x38,0x3C,0x1E,0x0F,0x06,0x0C,0x38,0x70,0xC0,
// '?'
0x3F,0x04,0x0B,0x12,0x01,0x0D,
0x1E,0x0F,0xE3,0xC6,0x60,0x60,0x06,0x00,0xC0,0x18,0x07,0x01,0xE0,0xF8,0x3E,0x0F,0x01,0x80,0x00,0x00,0x01,0x80,0x30,0x06,0x00,
// '@'
0x40,0x02,0x13,0x14,0x01,0x16,
0x03,0xF8,0x01,0xFF,0xC0,0x78,0x3C,0x1C,0x01,0xC3,0x00,0x1C,0xC1,0xC1,0x98,0xF8,0x1E,0x3C,0x03,0xC6,0x30,0x79,0x8E,0x0F,0x31,0xC1,0xE6,0x78,0x6C,0x7F,0xFC,0xC7,0x3E,0x18,0x00,0x01,0x80,0x00,0x38,0x00,0x03,0xC0,0xE0,0x1F,0xFC,0x00,0xFE,0x00,
// 'A'
0x41,0x03,0x0E,0x12,0x01,0x11,
0x00,0x80,0x07,0x00,0x1C,0x00,0xF0,0x03,0xC0,0x1D,0x80,0x76,0x03,0x98,0x0E,0x20,0x70,0xC1,0xFF,0x0F,0xFC,0x7C,0x19,0xC0,0x67,0x01,0xB8,0x07,0xE0,0x0F,0x00,0x30,
// 'B'
0x42,0x03,0x0B,0x13,0x03,0x0F,
0x7C,0x1F,0xE3,0x0E,0x60,0xEC,0x0D,0x81,0xB0,0x36,0x0E,0xC3,0x9F,0xE3,0xFC,0x61,0xEC,0x0F,0x80,0xF0,0x1E,0x0E,0xC7,0xDF,0xE3,0xF0,0x00,
// 'C'
0x43,0x03,0x0D,0x12,0x01,0x0E,
0x01,0xF8,0x3F,0xC3,0xC6,0x38,0x31,0x80,0x1C,0x01,0xC0,0x0C,0x00,0x60,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x19,0x81,0xCE,0x3C,0x3F,0xC0,0xF8,0x00,
// 'D'
0x44,0x03,0x0D,0x12,0x02,0x11,
0x60,0x07,0xC0,0x37,0x81,0x8F,0x0C,0x1C,0x60,0x73,0x01,0xD8,0x06,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x3C,0x01,0xE0,0x1B,0x01,0xDC,0x1C,0xFF,0xC1,0xF8,0x00,
// 'E'
0x45,0x03,0x0D,0x12,0x02,0x0F,
0xFF,0xF7,0xFF,0xF0,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x7E,0xFF,0xF7,0xE0,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0x7F,0xF1,0xFF,0x80,
// 'F'
0x46,0x03,0x0C,0x12,0x02,0x0F,
0xFF,0xCF,0xFF,0xC0,0x7C,0x00,0xC0,0x0C,0x00,0xC0,0x0D,0xFE,0xFF,0xEF,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0x00,0xC0,0x0C,0x00,
// 'G'
0x47,0x03,0x0F,0x12,0x01,0x10,
0x03,0xE0,0x0F,0xF0,0x38,0xE0,0xE0,0x03,0x80,0x06,0x00,0x18,0x00,0x30,0x00,0x61,0xFF,0x9F,0xFF,0x3C,0x36,0x00,0x6C,0x01,0x98,0x07,0x30,0x0C,0x30,0x70,0x7F,0xC0,0x3E,0x00,
// 'H'
0x48,0x03,0x0F,0x12,0x02,0x12,
0xC0,0x03,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0xFF,0xFF,0xFF,0xFC,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0x80,0x0C,
// 'I'
0x49,0x03,0x0C,0x12,0x00,0x0D,
0xFF,0xEF,0xFF,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0xFF,0xFF,0xFF,
// 'J'
0x4A,0x03,0x0E,0x12,0x01,0x10,
0x1F,0xFC,0x7F,0xF0,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0xC0,0xC3,0x06,0x0E,0x18,0x1C,0x60,0x3F,0x80,0x3C,0x00,
// 'K'
0x4B,0x03,0x0C,0x12,0x03,0x0F,
0xC0,0x6C,0x0E,0xC1,0xCC,0x38,0xC7,0x0C,0xE0,0xDC,0x0F,0x80,0xF0,0x0F,0x00,0xF8,0x0F,0xC0,0xDE,0x0C,0xF0,0xC7,0x8C,0x1E,0xC0,0xFC,0x07,
// 'L'
0x4C,0x03,0x0B,0x12,0x01,0x0D,
0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xFF,0xEF,0xFC,
// 'M'
0x4D,0x03,0x13,0x13,0x01,0x15,
0x0C,0x06,0x01,0x80,0xC0,0x78,0x3C,0x0F,0x07,0x81,0xE0,0xF0,0x3C,0x1E,0x07,0x83,0xC1,0xD8,0xEC,0x3B,0x1D,0x87,0x63,0xB0,0xCC,0xE6,0x38,0xDC,0x47,0x1B,0x8C,0xE3,0xF1,0xB8,0x3C,0x37,0x07,0x86,0xE0,0xF0,0x7C,0x1E,0x0F,0x01,0x81,0x80,
// 'N'
0x4E,0x03,0x11,0x12,0x01,0x13,
0x60,0x01,0x38,0x00,0xDE,0x00,0x6F,0x00,0x37,0xC0,0x1B,0x70,0x0D,0x9C,0x06,0xCF,0x03,0x63,0x81,0xB0,0xE0,0xD8,0x38,0x6C,0x0E,0x36,0x03,0x9B,0x00,0xED,0x80,0x3E,0xC0,0x0F,0x60,0x03,0xB0,0x00,0xC0,
// 'O'
0x4F,0x03,0x11,0x12,0x01,0x13,
0x01,0xF8,0x03,0xFF,0x07,0x81,0xC3,0x00,0x63,0x00,0x1B,0x80,0x0D,0x80,0x07,0xC0,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0xF8,0x00,0x6C,0x00,0x33,0x00,0x31,0xC0,0x38,0x70,0x78,0x1F,0xF8,0x03,0xF0,0x00,
// 'P'
0x50,0x03,0x0B,0x12,0x01,0x0D,
0xFE,0x1F,0xF3,0x0F,0x60,0x7C,0x07,0x80,0xF0,0x1E,0x06,0xC3,0xDF,0xF3,0xF8,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x00,
// 'Q'
0x51,0x03,0x14,0x17,0x01,0x15,
0x01,0xF8,0x00,0x7F,0xE0,0x1E,0x07,0x03,0x80,0x18,0x30,0x01,0xC6,0x00,0x0C,0x60,0x00,0xEC,0x00,0x06,0xC0,0x00,0x6C,0x00,0x06,0xC0,0x00,0x6C,0x00,0x06,0x60,0xE0,0xE7,0x0F,0x0C,0x38,0x79,0xC1,0xC3,0xF8,0x0F,0xFF,0x00,0x3F,0x78,0x00,0x03,0xC0,0x00,0x1E,0x00,0x00,0xF0,0x00,0x07,0x00,0x00,0x20,
// 'R'
0x52,0x02,0x0D,0x13,0x01,0x0F,
0x00,0x03,0xE0,0x3F,0xC1,0x8F,0x0C,0x0E,0x60,0x33,0x00,0xD8,0x06,0xC0,0x36,0x03,0xB0,0x79,0xFF,0x8F,0xF0,0x7F,0x83,0x1F,0x18,0x3C,0xC0,0xF6,0x01,0xF0,0x06,
// 'S'
0x53,0x03,0x0F,0x13,0x01,0x11,
0x01,0xF0,0x07,0xF8,0x18,0x70,0x60,0x01,0x80,0x03,0x00,0x06,0x00,0x0E,0x00,0x0F,0xF0,0x07,0xF0,0x00,0xF0,0x00,0x70,0x00,0x60,0x00,0xD8,0x01,0xB8,0x06,0x78,0x3C,0x7F,0xE0,0x3F,0x00,
// 'T'
0x54,0x02,0x0F,0x13,0x01,0x10,
0x00,0x01,0xFF,0xFD,0xFF,0xF8,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,
// 'U'
0x55,0x03,0x11,0x12,0x01,0x12,
0x60,0x03,0x30,0x01,0x98,0x00,0xCC,0x00,0x66,0x00,0x33,0x00,0x19,0x80,0x0C,0xC0,0x06,0x60,0x03,0x30,0x01,0x98,0x01,0xCC,0x00,0xC7,0x00,0x61,0x80,0x70,0xE0,0x30,0x38,0x38,0x0F,0xF8,0x01,0xF0,0x00,
// 'V'
0x56,0x03,0x0E,0x13,0x02,0x10,
0x80,0x0F,0x00,0x3C,0x01,0xB0,0x06,0x60,0x31,0x80,0xC6,0x03,0x0C,0x18,0x30,0x60,0xC1,0x81,0x8C,0x06,0x30,0x0D,0x80,0x36,0x00,0xF8,0x01,0xC0,0x07,0x00,0x08,0x00,0x00,0x00,
// 'W'
0x57,0x03,0x17,0x12,0x01,0x19,
0xC0,0x20,0x0F,0xC0,0x60,0x19,0x81,0xC0,0x23,0x03,0x80,0xC6,0x07,0x01,0x86,0x1E,0x03,0x0C,0x36,0x0C,0x18,0x6C,0x18,0x11,0x98,0x60,0x33,0x30,0xC0,0x66,0x61,0x80,0xD8,0x66,0x01,0xB0,0xCC,0x01,0xC1,0xB0,0x03,0x83,0x60,0x07,0x07,0x80,0x0C,0x07,0x00,0x08,0x0E,0x00,
// 'X'
0x58,0x03,0x10,0x12,0x01,0x11,
0x60,0x03,0x70,0x07,0x38,0x0E,0x1C,0x1C,0x0C,0x1C,0x0E,0x38,0x07,0x70,0x03,0xE0,0x01,0xC0,0x03,0xC0,0x07,0xE0,0x07,0x70,0x0E,0x38,0x1C,0x18,0x38,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,
// 'Y'
0x59,0x03,0x0F,0x13,0x00,0x10,
0x60,0x06,0xE0,0x1D,0xC0,0x31,0xC0,0xE1,0xC1,0x83,0x83,0x03,0x8C,0x07,0x18,0x07,0x70,0x0F,0xC0,0x0F,0x80,0x0F,0x00,0x1C,0x00,0x38,0x00,0x60,0x01,0xC0,0x03,0x00,0x06,0x00,0x08,0x00,
// 'Z'
0x5A,0x03,0x0F,0x12,0x01,0x11,
0xFF,0xFF,0xFF,0xFC,0x00,0xF0,0x03,0x80,0x0E,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x07,0x00,0x1E,0x00,0x38,0x00,0xE0,0x03,0xC0,0x07,0x00,0x1C,0x00,0x70,0x00,0xFF,0xFF,0xFF,0xFC,
// '['
0x5B,0x01,0x07,0x1A,0x01,0x09,
0x00,0xFD,0xFB,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x3F,0x7E,0x00,
// '\'
0x5C,0x03,0x0B,0x14,0x02,0x0D,
0xC0,0x18,0x01,0x80,0x30,0x03,0x00,0x60,0x06,0x00,0xC0,0x0C,0x01,0x80,0x18,0x03,0x00,0x20,0x06,0x00,0xC0,0x0C,0x01,0x80,0x18,0x03,0x00,0x60,
// ']'
0x5D,0x01,0x07,0x1A,0x02,0x09,
0x01,0xFB,0xF0,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x7E,0xFC,0x00,
// '^'
0x5E,0x02,0x0A,0x06,0x02,0x0E,
0x0C,0x07,0x83,0xF1,0xCE,0xE1,0xF0,0x30,
// '_'
0x5F,0x16,0x0F,0x04,0x00,0x0F,
0x00,0x01,0xFF,0xFF,0xFF,0xF8,0x00,0x00,
// '`'
0x60,0x02,0x05,0x06,0x02,0x0D,
0xC7,0x1C,0x63,0x8C,
// 'a'
0x61,0x09,0x0B,0x0C,0x01,0x0C,
0x0F,0x87,0xF9,0xE3,0x30,0x6E,0x0D,0x81,0xB0,0x36,0x06,0xC0,0xCC,0x39,0xFF,0x9F,0x30,
// 'b'
0x62,0x02,0x0C,0x13,0x01,0x0E,
0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x78,0x7F,0xC7,0x8E,0x60,0x76,0x03,0x60,0x36,0x03,0x60,0x36,0x06,0x70,0xE7,0xFC,0x7F,0x00,
// 'c'
0x63,0x09,0x0A,0x0C,0x01,0x0C,
0x0F,0x07,0xF3,0x0D,0x80,0x60,0x30,0x0C,0x03,0x00,0xC0,0x1C,0x33,0xFC,0x7C,
// 'd'
0x64,0x02,0x0C,0x13,0x01,0x0E,
0x00,0x20,0x06,0x00,0x60,0x06,0x00,0x60,0x06,0x00,0x61,0xF6,0x3F,0xE7,0x0E,0x60,0x6C,0x06,0xC0,0x6C,0x06,0xC0,0x6E,0x06,0x70,0xE3,0xFE,0x1F,0x60,
// 'e'
0x65,0x09,0x0B,0x0C,0x01,0x0D,
0x1F,0x07,0xF9,0xC7,0x30,0xEC,0x79,0xBE,0x3E,0x07,0x00,0xC0,0x6E,0x1D,0xFF,0x0F,0x80,
// 'f'
0x66,0x02,0x0A,0x14,0x01,0x0C,
0x03,0x83,0xE0,0xE0,0x70,0x18,0x06,0x01,0x83,0xFF,0xFF,0xC6,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,
// 'g'
0x67,0x09,0x0A,0x13,0x02,0x0D,
0x0F,0x0F,0xF7,0x0D,0x83,0xC0,0xF0,0x3C,0x1F,0x07,0xC1,0xD8,0xF7,0xEC,0xF3,0x00,0xC0,0x30,0x18,0x06,0x03,0xBF,0xC7,0xE0,
// 'h'
0x68,0x02,0x0B,0x13,0x01,0x0E,
0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x1E,0x6F,0xEF,0x8D,0xE1,0xB8,0x36,0x06,0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0x80,
// 'i'
0x69,0x04,0x02,0x11,0x03,0x07,
0xF0,0x3F,0xFF,0xFF,0xC0,
// 'j'
0x6A,0x04,0x08,0x18,0x00,0x0A,
0x03,0x03,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xC3,0xE3,0x77,0x7E,0x1C,
// 'k'
0x6B,0x03,0x0B,0x13,0x02,0x0E,
0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x36,0x0E,0xC7,0x99,0xE3,0x70,0x7E,0x0F,0xE1,0xCE,0x30,0xE6,0x0E,0xC0,0xF8,0x08,0x00,0x00,
// 'l'
0x6C,0x02,0x02,0x13,0x03,0x07,
0xFF,0xFF,0xFF,0xFF,0xFC,
// 'm'
0x6D,0x09,0x10,0x0C,0x01,0x12,
0x67,0x3C,0x6F,0xFE,0x7D,0xEE,0x79,0x86,0x71,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,
// 'n'
0x6E,0x09,0x0B,0x0C,0x01,0x0D,
0x63,0x8D,0xF9,0xF1,0xBC,0x37,0x06,0xE0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x30,
// 'o'
0x6F,0x09,0x0C,0x0C,0x01,0x0D,
0x0F,0x81,0xFC,0x38,0xC3,0x06,0x60,0x66,0x06,0x60,0x66,0x06,0x60,0xE3,0x1C,0x1F,0x80,0xF0,
// 'p'
0x70,0x08,0x0A,0x14,0x02,0x0D,
0xC0,0x33,0xCF,0xFB,0xC6,0xC0,0xF0,0x3C,0x0F,0x03,0xC0,0xF0,0x7C,0x1B,0xFC,0xFE,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,
// 'q'
0x71,0x08,0x0A,0x14,0x01,0x0C,
0x00,0x03,0xF3,0xFD,0xE3,0x60,0xF8,0x3C,0x0F,0x03,0xC0,0xF0,0x76,0x1D,0xFF,0x1F,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x06,
// 'r'
0x72,0x09,0x09,0x0C,0x01,0x0B,
0xCF,0x6F,0xFE,0x7C,0x3C,0x1E,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x00,
// 's'
0x73,0x09,0x09,0x0C,0x02,0x0C,
0x03,0x9F,0xDE,0x7C,0x3E,0x07,0xF0,0xFC,0x07,0x01,0xE0,0xFF,0xC7,0xC0,
// 't'
0x74,0x05,0x0A,0x10,0x00,0x0A,
0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,
// 'u'
0x75,0x09,0x0B,0x0C,0x01,0x0C,
0xC0,0xD8,0x1B,0x03,0x60,0x6C,0x0D,0x81,0xB0,0x36,0x06,0xC0,0xD8,0x19,0xFF,0x1F,0x60,
// 'v'
0x76,0x09,0x0B,0x0D,0x01,0x0C,
0xC0,0x78,0x1F,0x83,0x30,0x67,0x1C,0x63,0x0C,0xE0,0xD8,0x1E,0x03,0xC0,0x30,0x06,0x00,0x00,
// 'w'
0x77,0x09,0x0F,0x0D,0x01,0x11,
0xC1,0x87,0x83,0x0F,0x0E,0x1E,0x1C,0x66,0x7C,0xCC,0xD9,0x99,0x36,0x36,0x6C,0x7C,0xD8,0x70,0xE0,0xE1,0xC0,0x83,0x80,0x00,0x00,
// 'x'
0x78,0x09,0x0D,0x0D,0x01,0x0E,
0x60,0x1B,0x81,0xCE,0x1C,0x39,0xC0,0xFC,0x03,0xC0,0x3C,0x03,0xF0,0x39,0xC3,0x87,0x38,0x1D,0x80,0x70,0x01,0x80,
// 'y'
0x79,0x09,0x0C,0x13,0x00,0x0D,
0xC0,0x3E,0x07,0x60,0x67,0x0C,0x30,0xC3,0x98,0x19,0x81,0xD8,0x0F,0x00,0xF0,0x06,0x00,0x60,0x0C,0x00,0xC0,0x18,0x01,0x80,0x30,0x03,0x00,0x30,0x00,
// 'z'
0x7A,0x09,0x0B,0x0C,0x01,0x0D,
0xFF,0xFF,0xFC,0x07,0x00,0xC0,0x30,0x0C,0x03,0x80,0xE0,0x38,0x0E,0x03,0xFF,0xFF,0xF0,
// '{'
0x7B,0x02,0x08,0x18,0x01,0x09,
0x0F,0x1F,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xE0,0xE0,0x70,0x30,0x30,0x30,0x30,0x30,0x38,0x18,0x1F,0x07,
// '|'
0x7C,0x01,0x02,0x18,0x04,0x0A,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// '}'
0x7D,0x02,0x08,0x18,0x01,0x09,
0x70,0xF8,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x06,0x07,0x07,0x0E,0x0C,0x0C,0x0C,0x0C,0x0C,0x1C,0x18,0xF8,0xE0,
// '~'
0x7E,0x0B,0x0C,0x05,0x01,0x0E,
0x38,0x37,0xE3,0xE7,0x7C,0x3E,0x01,0xC0,
// Terminator
0xFF
};

View File

@ -0,0 +1,7 @@
#
# Main Makefile. This is basically the same as a component makefile.
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
COMPONENT_SRCDIRS := .
COMPONENT_ADD_INCLUDEDIRS := .

332
components/tft/def_small.c Normal file
View File

@ -0,0 +1,332 @@
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// on Arduinos. It can however handle any ttf font that has been converted
// using the conversion program. These could be fixed width or proportional
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// def_small.c
// Point Size : 9
// Memory usage : 928 bytes
// # characters : 95
// Header Format (to make Arduino UTFT Compatible):
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
unsigned char tft_def_small[] =
{
0x00, 0x08, 0x00, 0x00,
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ' '
0x20,0x08,0x00,0x00,0x00,0x03,
// '!'
0x21,0x01,0x01,0x07,0x01,0x03,
0xFA,
// '"'
0x22,0x01,0x03,0x02,0x01,0x04,
0xB4,
// '#'
0x23,0x01,0x06,0x07,0x01,0x08,
0x28,0xAF,0xCA,0xFD,0x45,0x00,
// '$'
0x24,0x01,0x06,0x08,0x00,0x06,
0x21,0xEA,0x38,0x38,0xAF,0x08,
// '%'
0x25,0x01,0x08,0x07,0x00,0x09,
0x44,0xA4,0xA8,0x5A,0x15,0x25,0x22,
// '&'
0x26,0x01,0x06,0x07,0x01,0x08,
0x31,0x04,0x19,0x9E,0x66,0xC0,
// '''
0x27,0x01,0x01,0x02,0x01,0x02,
0xC0,
// '('
0x28,0x00,0x02,0x08,0x01,0x04,
0x4A,0xA1,
// ')'
0x29,0x00,0x02,0x08,0x01,0x04,
0x85,0x52,
// '*'
0x2A,0x01,0x05,0x04,0x00,0x05,
0xAB,0x9D,0x50,
// '+'
0x2B,0x03,0x05,0x05,0x01,0x08,
0x21,0x3E,0x42,0x00,
// ','
0x2C,0x07,0x01,0x02,0x01,0x03,
0xC0,
// '-'
0x2D,0x05,0x02,0x01,0x01,0x03,
0xC0,
// '.'
0x2E,0x07,0x01,0x01,0x01,0x03,
0x80,
// '/'
0x2F,0x01,0x03,0x07,0x00,0x03,
0x25,0x25,0x20,
// '0'
0x30,0x01,0x04,0x07,0x01,0x06,
0x69,0x99,0x99,0x60,
// '1'
0x31,0x01,0x03,0x07,0x02,0x06,
0xC9,0x24,0xB8,
// '2'
0x32,0x01,0x05,0x07,0x01,0x06,
0x64,0x84,0x44,0x43,0xC0,
// '3'
0x33,0x01,0x04,0x07,0x01,0x06,
0x69,0x16,0x11,0x60,
// '4'
0x34,0x01,0x05,0x07,0x01,0x06,
0x11,0x94,0xA9,0x7C,0x40,
// '5'
0x35,0x01,0x04,0x07,0x01,0x06,
0xF8,0x8E,0x11,0xE0,
// '6'
0x36,0x01,0x04,0x07,0x01,0x06,
0x7C,0x8E,0x99,0x60,
// '7'
0x37,0x01,0x04,0x07,0x01,0x06,
0xF1,0x22,0x24,0x40,
// '8'
0x38,0x01,0x04,0x07,0x01,0x06,
0x69,0x96,0x99,0x60,
// '9'
0x39,0x01,0x04,0x07,0x01,0x06,
0x69,0x97,0x13,0xE0,
// ':'
0x3A,0x03,0x01,0x05,0x01,0x03,
0x88,
// ';'
0x3B,0x03,0x01,0x06,0x01,0x03,
0x8C,
// '<'
0x3C,0x03,0x06,0x05,0x01,0x08,
0x04,0xEE,0x0E,0x04,
// '='
0x3D,0x04,0x06,0x03,0x01,0x08,
0xFC,0x0F,0xC0,
// '>'
0x3E,0x03,0x06,0x05,0x01,0x08,
0x81,0xC1,0xDC,0x80,
// '?'
0x3F,0x01,0x04,0x07,0x01,0x05,
0xE1,0x24,0x40,0x40,
// '@'
0x40,0x01,0x08,0x08,0x01,0x0A,
0x3C,0x42,0x9D,0xA5,0xA5,0x9E,0x40,0x38,
// 'A'
0x41,0x01,0x06,0x07,0x00,0x06,
0x30,0xC4,0x92,0x7A,0x18,0x40,
// 'B'
0x42,0x01,0x05,0x07,0x01,0x07,
0xF4,0x63,0xE8,0xC7,0xC0,
// 'C'
0x43,0x01,0x05,0x07,0x01,0x07,
0x72,0x61,0x08,0x25,0xC0,
// 'D'
0x44,0x01,0x05,0x07,0x01,0x07,
0xF4,0xE3,0x18,0xCF,0xC0,
// 'E'
0x45,0x01,0x04,0x07,0x01,0x06,
0xF8,0x8F,0x88,0xF0,
// 'F'
0x46,0x01,0x04,0x07,0x01,0x06,
0xF8,0x8F,0x88,0x80,
// 'G'
0x47,0x01,0x05,0x07,0x01,0x07,
0x76,0x61,0x38,0xE5,0xC0,
// 'H'
0x48,0x01,0x05,0x07,0x01,0x07,
0x8C,0x63,0xF8,0xC6,0x20,
// 'I'
0x49,0x01,0x01,0x07,0x01,0x03,
0xFE,
// 'J'
0x4A,0x01,0x02,0x09,0x00,0x03,
0x55,0x55,0x80,
// 'K'
0x4B,0x01,0x05,0x07,0x01,0x06,
0x8C,0xA9,0x8A,0x4A,0x20,
// 'L'
0x4C,0x01,0x04,0x07,0x01,0x05,
0x88,0x88,0x88,0xF0,
// 'M'
0x4D,0x01,0x06,0x07,0x01,0x08,
0x87,0x3C,0xED,0xB6,0x18,0x40,
// 'N'
0x4E,0x01,0x05,0x07,0x01,0x07,
0x8E,0x73,0x59,0xCE,0x20,
// 'O'
0x4F,0x01,0x05,0x07,0x01,0x07,
0x76,0xE3,0x18,0xED,0xC0,
// 'P'
0x50,0x01,0x04,0x07,0x01,0x06,
0xE9,0x9E,0x88,0x80,
// 'Q'
0x51,0x01,0x05,0x08,0x01,0x07,
0x76,0xE3,0x18,0xE9,0xC2,
// 'R'
0x52,0x01,0x05,0x07,0x01,0x06,
0xE4,0xA5,0xCA,0x4A,0x20,
// 'S'
0x53,0x01,0x06,0x07,0x01,0x07,
0x72,0x28,0x1C,0x0A,0x27,0x00,
// 'T'
0x54,0x01,0x05,0x07,0x00,0x05,
0xF9,0x08,0x42,0x10,0x80,
// 'U'
0x55,0x01,0x05,0x07,0x01,0x07,
0x8C,0x63,0x18,0xC5,0xC0,
// 'V'
0x56,0x01,0x06,0x07,0x00,0x06,
0x86,0x14,0x92,0x48,0xC3,0x00,
// 'W'
0x57,0x01,0x09,0x07,0xFF,0x07,
0x49,0x24,0x8A,0x85,0x43,0xE0,0xA0,0x50,
// 'X'
0x58,0x01,0x06,0x07,0x00,0x06,
0xCD,0x23,0x0C,0x31,0x28,0xC0,
// 'Y'
0x59,0x01,0x05,0x07,0x00,0x05,
0x8A,0x9C,0x42,0x10,0x80,
// 'Z'
0x5A,0x01,0x05,0x07,0x00,0x05,
0xF8,0x44,0x44,0x43,0xE0,
// '['
0x5B,0x01,0x02,0x08,0x01,0x04,
0xEA,0xAB,
// '\'
0x5C,0x01,0x03,0x07,0x00,0x03,
0x91,0x24,0x48,
// ']'
0x5D,0x01,0x02,0x08,0x01,0x04,
0xD5,0x57,
// '^'
0x5E,0x01,0x06,0x02,0x01,0x08,
0x31,0x20,
// '_'
0x5F,0x09,0x05,0x01,0x00,0x05,
0xF8,
// '`'
0x60,0x00,0x02,0x02,0x01,0x05,
0x90,
// 'a'
0x61,0x03,0x04,0x05,0x01,0x06,
0x61,0x79,0xF0,
// 'b'
0x62,0x00,0x04,0x08,0x01,0x06,
0x88,0x8E,0x99,0x9E,
// 'c'
0x63,0x03,0x04,0x05,0x01,0x06,
0x78,0x88,0x70,
// 'd'
0x64,0x00,0x04,0x08,0x01,0x06,
0x11,0x17,0x99,0x97,
// 'e'
0x65,0x03,0x04,0x05,0x01,0x06,
0x69,0xF8,0x70,
// 'f'
0x66,0x00,0x04,0x08,0x00,0x03,
0x34,0x4E,0x44,0x44,
// 'g'
0x67,0x03,0x04,0x07,0x01,0x06,
0x79,0x99,0x71,0x60,
// 'h'
0x68,0x00,0x04,0x08,0x01,0x06,
0x88,0x8E,0x99,0x99,
// 'i'
0x69,0x01,0x01,0x07,0x01,0x03,
0xBE,
// 'j'
0x6A,0x01,0x02,0x09,0x00,0x03,
0x45,0x55,0x80,
// 'k'
0x6B,0x00,0x04,0x08,0x01,0x05,
0x88,0x89,0xAC,0xA9,
// 'l'
0x6C,0x00,0x01,0x08,0x01,0x03,
0xFF,
// 'm'
0x6D,0x03,0x07,0x05,0x01,0x09,
0xED,0x26,0x4C,0x99,0x20,
// 'n'
0x6E,0x03,0x04,0x05,0x01,0x06,
0xE9,0x99,0x90,
// 'o'
0x6F,0x03,0x04,0x05,0x01,0x06,
0x69,0x99,0x60,
// 'p'
0x70,0x03,0x04,0x07,0x01,0x06,
0xE9,0x99,0xE8,0x80,
// 'q'
0x71,0x03,0x04,0x07,0x01,0x06,
0x79,0x99,0x71,0x10,
// 'r'
0x72,0x03,0x03,0x05,0x01,0x04,
0xF2,0x48,
// 's'
0x73,0x03,0x04,0x05,0x01,0x05,
0x68,0x62,0xE0,
// 't'
0x74,0x02,0x04,0x06,0x00,0x04,
0x4F,0x44,0x47,
// 'u'
0x75,0x03,0x04,0x05,0x01,0x06,
0x99,0x99,0x70,
// 'v'
0x76,0x03,0x07,0x05,0xFF,0x05,
0x44,0x98,0xA1,0xC1,0x00,
// 'w'
0x77,0x03,0x07,0x05,0x00,0x07,
0x93,0x76,0xBA,0x24,0x40,
// 'x'
0x78,0x03,0x05,0x05,0x00,0x05,
0x8A,0x88,0xA8,0x80,
// 'y'
0x79,0x03,0x07,0x07,0xFF,0x05,
0x44,0x88,0xA1,0xC1,0x02,0x18,0x00,
// 'z'
0x7A,0x03,0x04,0x05,0x01,0x06,
0xF1,0x24,0xF0,
// '{'
0x7B,0x01,0x03,0x08,0x01,0x05,
0x69,0x64,0x93,
// '|'
0x7C,0x01,0x01,0x09,0x01,0x03,
0xFF,0x80,
// '}'
0x7D,0x01,0x03,0x08,0x01,0x05,
0xC9,0x34,0x96,
// '~'
0x7E,0x03,0x06,0x03,0x01,0x08,
0x01,0x91,0x80,
// Terminator
0xFF
};

331
components/tft/minya24.c Normal file
View File

@ -0,0 +1,331 @@
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// on Arduinos. It can however handle any ttf font that has been converted
// using the conversion program. These could be fixed width or proportional
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// minya24.c
// Point Size : 24
// Memory usage : 2807 bytes
// # characters : 95
// Header Format (to make Arduino UTFT Compatible):
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
unsigned char tft_minya24[] =
{
0x00, 0x15, 0x00, 0x00,
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ' '
0x20,0x13,0x00,0x00,0x00,0x07,
// '!'
0x21,0x02,0x05,0x12,0x00,0x05,
0x11,0x8C,0x63,0x18,0xC6,0x31,0x8C,0x42,0x01,0xCE,0x73,0x80,
// '"'
0x22,0x01,0x06,0x08,0x00,0x06,
0x01,0xA6,0xDB,0x6D,0xB6,0xC0,
// '#'
0x23,0x04,0x0C,0x0E,0x00,0x0B,
0x04,0x80,0x6C,0x0C,0x80,0xD8,0x7F,0xE7,0xFE,0x1B,0x01,0xB0,0x7F,0xE7,0xFC,0x12,0x03,0x20,0x32,0x00,0x00,
// '$'
0x24,0x02,0x0A,0x11,0x00,0x0B,
0x04,0x01,0x61,0xF8,0xFE,0x65,0x19,0x06,0x40,0xF0,0x1F,0x01,0xE0,0x4C,0x93,0x7C,0xCF,0xE0,0x60,0x10,0x04,0x00,
// '%'
0x25,0x01,0x0D,0x14,0x01,0x0F,
0x00,0x01,0xC1,0x1F,0x19,0x8C,0xCC,0x6C,0x63,0x61,0x36,0x0F,0xB0,0x1B,0x00,0x18,0x01,0x80,0x0C,0x00,0xCE,0x06,0xF8,0x6C,0x66,0x63,0x33,0x13,0x0F,0x98,0x38,0x00,0x00,
// '&'
0x26,0x02,0x0E,0x11,0x00,0x0D,
0x0E,0x00,0x7C,0x01,0xB0,0x06,0xC0,0x1E,0x00,0x38,0x00,0xC3,0x07,0x8C,0x37,0x60,0xCD,0x86,0x1E,0x18,0x70,0x41,0xE1,0x07,0xC6,0x33,0x9F,0x86,0x38,0x00,
// '''
0x27,0x02,0x03,0x08,0x00,0x03,
0x6D,0xB6,0xD8,
// '('
0x28,0x01,0x05,0x14,0x02,0x07,
0x00,0x8E,0x66,0x33,0x18,0xC6,0x31,0x8C,0x61,0x0C,0x63,0x8C,0x00,
// ')'
0x29,0x01,0x06,0x15,0x00,0x07,
0x01,0x86,0x0C,0x18,0x61,0x82,0x08,0x30,0xC2,0x08,0x61,0x86,0x30,0xC6,0x10,0x00,
// '*'
0x2A,0x04,0x0A,0x0D,0x01,0x0B,
0x08,0x03,0x04,0xC1,0xF6,0x7F,0x07,0x81,0xC0,0xF8,0x3F,0x1B,0xCC,0xD8,0x30,0x0C,0x00,
// '+'
0x2B,0x06,0x0A,0x0A,0x01,0x0B,
0x00,0x03,0x00,0xC0,0x30,0x7F,0xBF,0xE0,0xC0,0x30,0x0C,0x00,0x00,
// ','
0x2C,0x10,0x05,0x07,0x00,0x05,
0x33,0x9C,0x63,0x20,0x00,
// '-'
0x2D,0x09,0x07,0x02,0x00,0x07,
0x7D,0xF8,
// '.'
0x2E,0x10,0x04,0x04,0x01,0x05,
0x6E,0xE6,
// '/'
0x2F,0x01,0x0C,0x13,0x00,0x0B,
0x00,0x00,0x06,0x00,0x60,0x0C,0x00,0xC0,0x18,0x01,0x80,0x30,0x03,0x00,0x60,0x06,0x00,0xC0,0x0C,0x01,0x80,0x18,0x03,0x00,0x30,0x06,0x00,0x40,0x00,
// '0'
0x30,0x08,0x0B,0x0B,0x00,0x0B,
0x0E,0x03,0xE0,0xC6,0x30,0x66,0x0C,0xC0,0x98,0x33,0x06,0x61,0xC7,0xF0,0x7C,0x00,
// '1'
0x31,0x08,0x0A,0x0D,0x00,0x09,
0x04,0x1F,0x03,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x07,0xF9,0xFE,0x00,0x00,
// '2'
0x32,0x06,0x0A,0x0E,0x00,0x0A,
0x0E,0x07,0xC3,0x30,0xCC,0x03,0x01,0x80,0x60,0x30,0x18,0x0C,0x03,0x01,0xF8,0x7F,0xC0,0x20,
// '3'
0x33,0x08,0x09,0x10,0x00,0x08,
0x78,0x3F,0x81,0x81,0x81,0xC0,0xC0,0xE0,0x78,0x06,0x01,0x01,0x80,0xC0,0xE1,0xE0,0xC0,0x00,
// '4'
0x34,0x03,0x0B,0x13,0x00,0x0A,
0x00,0x00,0xC0,0x18,0x03,0x00,0x60,0x08,0x03,0x00,0x60,0x0D,0x83,0x20,0x64,0x18,0x83,0x10,0xC6,0x1F,0xF3,0xFE,0x03,0x00,0x60,0x0C,0x00,
// '5'
0x35,0x09,0x0A,0x0E,0x00,0x0A,
0x3F,0x8F,0xE3,0x00,0x80,0x60,0x1F,0x87,0xF0,0x06,0x01,0x80,0x60,0x19,0x86,0x7F,0x07,0x80,
// '6'
0x36,0x03,0x0A,0x12,0x00,0x0A,
0x00,0x01,0x80,0xE0,0x30,0x18,0x06,0x03,0x00,0xC0,0x60,0x1B,0x87,0xF1,0x86,0x61,0x90,0x66,0x19,0x86,0x3F,0x07,0x80,
// '7'
0x37,0x09,0x0A,0x0E,0x00,0x0A,
0x7F,0x9F,0xF0,0x18,0x0C,0x06,0x01,0x80,0xC0,0x30,0x18,0x06,0x01,0x80,0x40,0x10,0x0C,0x00,
// '8'
0x38,0x03,0x0B,0x11,0x00,0x0B,
0x0F,0x07,0xF0,0xC3,0x30,0x66,0x0C,0x63,0x87,0xE0,0xF8,0x39,0xCE,0x19,0x81,0x30,0x34,0x06,0xC1,0x98,0x71,0xFC,0x1F,0x00,
// '9'
0x39,0x07,0x0A,0x11,0x00,0x0A,
0x1E,0x0F,0xC6,0x19,0x86,0x41,0x98,0x66,0x18,0xFE,0x1D,0x80,0x40,0x30,0x0C,0x06,0x03,0x01,0xC0,0x20,0x00,0x00,
// ':'
0x3A,0x0A,0x05,0x0A,0x00,0x05,
0x33,0x9C,0x60,0x00,0xCE,0x71,0x80,
// ';'
0x3B,0x09,0x05,0x0D,0x00,0x06,
0x33,0xDE,0x60,0x00,0x0E,0x73,0x8C,0xC0,0x00,
// '<'
0x3C,0x06,0x0A,0x0C,0x00,0x09,
0x00,0x00,0xE0,0x70,0x38,0x1C,0x1C,0x03,0x00,0x70,0x0E,0x01,0xC0,0x10,0x00,
// '='
0x3D,0x09,0x08,0x06,0x01,0x0A,
0xFF,0xFE,0x00,0x00,0x7F,0xFF,
// '>'
0x3E,0x06,0x0A,0x0C,0x00,0x09,
0x00,0x18,0x03,0x80,0x70,0x0E,0x00,0xE0,0x30,0x38,0x1C,0x0E,0x02,0x00,0x00,
// '?'
0x3F,0x02,0x09,0x12,0x00,0x09,
0x1E,0x1F,0x98,0x6C,0x30,0x18,0x18,0x38,0x30,0x30,0x18,0x0C,0x02,0x01,0x00,0x00,0x60,0x78,0x3C,0x0C,0x00,
// '@'
0x40,0x02,0x11,0x11,0x00,0x11,
0x01,0xF0,0x03,0xFE,0x03,0x03,0x83,0x00,0xC3,0x04,0x31,0x1F,0x19,0x9F,0x0C,0xCC,0x86,0x4C,0x43,0x24,0x21,0x12,0x39,0x89,0xF7,0x84,0x71,0x83,0x00,0x00,0xC1,0x80,0x3F,0xC0,0x0F,0x80,0x00,
// 'A'
0x41,0x02,0x12,0x13,0x00,0x10,
0x00,0x00,0x01,0xF0,0x00,0x7E,0x00,0x03,0x80,0x01,0xA0,0x00,0x6C,0x00,0x1B,0x00,0x0C,0x40,0x03,0x18,0x01,0x86,0x00,0x61,0x80,0x1F,0xE0,0x0F,0xFC,0x03,0x03,0x01,0x80,0xC0,0x60,0x10,0x18,0x1F,0x9F,0xC7,0xEF,0xF8,0x00,
// 'B'
0x42,0x02,0x0E,0x13,0x00,0x0E,
0x7F,0x81,0xFF,0x81,0x86,0x06,0x18,0x18,0xC0,0x66,0x01,0xFC,0x07,0xFC,0x1C,0x30,0x60,0x61,0x81,0x86,0x06,0x18,0x18,0x60,0x61,0x81,0x06,0x0C,0x18,0xE0,0xFE,0x03,0xE0,0x00,
// 'C'
0x43,0x02,0x0F,0x12,0x00,0x0F,
0x03,0xF0,0x1F,0xE0,0x70,0xC1,0x80,0x83,0x00,0x04,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x0E,0x01,0x0E,0x0E,0x0F,0xF8,0x07,0xE0,
// 'D'
0x44,0x02,0x0F,0x13,0x00,0x0F,
0x3F,0xC0,0x7F,0xE0,0x60,0xE0,0xC0,0xC1,0x80,0xC3,0x01,0x86,0x03,0x0C,0x02,0x18,0x04,0x30,0x08,0x60,0x30,0xC0,0x61,0x80,0x83,0x03,0x06,0x0C,0x0C,0x38,0x18,0xE0,0xFF,0x81,0xF8,0x00,
// 'E'
0x45,0x02,0x0D,0x13,0x00,0x0D,
0x3F,0xF1,0xFF,0x86,0x0C,0x30,0x61,0x80,0x0C,0x40,0x62,0x03,0xF0,0x1F,0x80,0xC4,0x06,0x20,0x30,0x01,0x80,0x0C,0x00,0x60,0xC3,0x06,0x7F,0xF3,0xFF,0x80,0x00,
// 'F'
0x46,0x01,0x0E,0x13,0x00,0x0E,
0x00,0x01,0xFF,0xE7,0xFF,0x86,0x06,0x18,0x18,0x63,0x01,0x8C,0x03,0xF0,0x0F,0xC0,0x63,0x01,0x8C,0x06,0x30,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x3F,0x81,0xFE,0x00,0x00,0x00,
// 'G'
0x47,0x01,0x11,0x14,0x00,0x11,
0x00,0x00,0x03,0xC8,0x03,0xFC,0x03,0x0E,0x03,0x03,0x01,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x03,0x30,0x3F,0xD8,0x1F,0x0C,0x01,0x86,0x00,0xC3,0x80,0x60,0xC0,0x30,0x70,0x38,0x1C,0x3C,0x07,0xF6,0x01,0xF3,0x80,0x01,0xE0,
// 'H'
0x48,0x01,0x10,0x13,0x00,0x10,
0x00,0x00,0x7C,0x0F,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x08,0x0C,0x08,0x0F,0xF8,0x0F,0xF8,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x1A,0x7C,0x1F,0x7C,0x10,
// 'I'
0x49,0x02,0x08,0x13,0x00,0x08,
0x7E,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,
// 'J'
0x4A,0x01,0x0C,0x14,0x00,0x0B,
0x00,0x00,0x7E,0x07,0xE0,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x00,0x80,0x08,0x00,0x80,0x18,0x61,0x84,0x18,0x41,0x8C,0x18,0xC3,0x06,0x70,0x7E,0x01,0x80,
// 'K'
0x4B,0x02,0x11,0x13,0x00,0x10,
0x7E,0x7E,0x3F,0x3E,0x06,0x06,0x03,0x06,0x01,0x86,0x00,0xC6,0x00,0x66,0x00,0x37,0x00,0x1F,0x80,0x0E,0x60,0x06,0x10,0x03,0x0C,0x01,0x06,0x00,0x81,0x00,0x60,0x80,0x30,0x66,0x7E,0x1B,0x3F,0x0F,0x80,0x01,0x80,
// 'L'
0x4C,0x02,0x0D,0x11,0x00,0x0D,
0x7E,0x03,0xF0,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x06,0x00,0x30,0x01,0x81,0x0C,0x08,0x60,0x4F,0xFF,0x7F,0xF8,
// 'M'
0x4D,0x02,0x14,0x12,0x00,0x13,
0x7C,0x07,0x87,0xC0,0x7C,0x0C,0x06,0x00,0xE0,0xE0,0x0E,0x0E,0x00,0xE0,0xE0,0x1B,0x1E,0x01,0xB1,0x60,0x0B,0x16,0x00,0x9B,0x60,0x09,0xA6,0x00,0x9E,0x60,0x08,0xE6,0x00,0x8C,0x60,0x08,0xC6,0x03,0x8C,0x7E,0x78,0x47,0xE0,0x00,0x00,
// 'N'
0x4E,0x01,0x12,0x13,0x00,0x12,
0x00,0x00,0x1F,0x03,0xF3,0xC0,0x7C,0x38,0x10,0x0E,0x04,0x03,0xC1,0x00,0xB0,0x40,0x26,0x10,0x09,0x84,0x02,0x31,0x00,0x8C,0x40,0x21,0x90,0x08,0x74,0x06,0x0F,0x01,0x81,0xC0,0x60,0x70,0x78,0x0C,0x3E,0x03,0x00,0x00,0x40,
// 'O'
0x4F,0x02,0x11,0x12,0x00,0x11,
0x03,0xE0,0x07,0xFC,0x07,0x07,0x06,0x01,0x82,0x00,0x63,0x00,0x11,0x80,0x0C,0x80,0x06,0x40,0x03,0x20,0x01,0x98,0x00,0xCC,0x00,0x66,0x00,0x31,0x80,0x30,0xE0,0x18,0x38,0x18,0x0F,0xF8,0x01,0xF0,0x00,
// 'P'
0x50,0x02,0x0C,0x12,0x00,0x0C,
0x7F,0x07,0xFC,0x10,0x61,0x03,0x10,0x31,0x03,0x10,0x31,0x06,0x10,0xE1,0xFC,0x1E,0x01,0x00,0x18,0x01,0x80,0x18,0x01,0x80,0x7E,0x07,0xF0,
// 'Q'
0x51,0x02,0x13,0x15,0x00,0x11,
0x07,0xE0,0x01,0xFE,0x00,0x60,0x70,0x18,0x06,0x06,0x00,0x60,0xC0,0x0C,0x18,0x00,0xC2,0x00,0x18,0x40,0x03,0x08,0x0C,0x61,0x83,0xCC,0x30,0xCD,0x83,0x09,0xE0,0x60,0x3C,0x06,0x07,0x00,0x7F,0xE3,0x07,0xEC,0x40,0x01,0x98,0x00,0x33,0x00,0x03,0xC0,0x00,0x30,
// 'R'
0x52,0x02,0x0F,0x13,0x00,0x0F,
0x7F,0x80,0xFF,0xE0,0x60,0xE0,0xC0,0x61,0x80,0xC3,0x01,0x86,0x07,0x0C,0x1C,0x1F,0xF0,0x3F,0x80,0x66,0x00,0xC4,0x01,0x8C,0x63,0x18,0xC6,0x11,0x8C,0x33,0x7E,0x7C,0xFC,0x70,0x00,0x00,
// 'S'
0x53,0x01,0x0D,0x13,0x00,0x0D,
0x00,0x60,0x7B,0x07,0xF8,0x71,0xC3,0x06,0x18,0x00,0xC0,0x03,0x80,0x0E,0x00,0x1C,0x00,0x78,0x00,0xC0,0x03,0x30,0x19,0x80,0xCC,0x06,0x30,0x70,0xFF,0x03,0xE0,
// 'T'
0x54,0x01,0x0F,0x12,0x00,0x0F,
0x00,0x00,0xFF,0xF9,0xFF,0xF3,0x18,0x66,0x30,0xCC,0x61,0x90,0xC3,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x0F,0xE0,0x1F,0xC0,
// 'U'
0x55,0x02,0x10,0x11,0x00,0x0F,
0x7C,0x7E,0x7C,0x7E,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x10,0x08,0x18,0x18,0x18,0x18,0x0C,0x30,0x0F,0xF0,0x03,0xC0,
// 'V'
0x56,0x01,0x10,0x12,0x00,0x10,
0x00,0x7E,0xFE,0x7E,0x7E,0x18,0x18,0x30,0x18,0x30,0x18,0x20,0x08,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x40,0x0C,0xC0,0x04,0xC0,0x04,0xC0,0x06,0x80,0x07,0x80,0x07,0x80,0x03,0x00,0x03,0x00,
// 'W'
0x57,0x01,0x14,0x13,0x00,0x14,
0x00,0x00,0x0F,0xC4,0xFF,0xF0,0x4F,0xE3,0x06,0x10,0x30,0xE3,0x01,0x8E,0x30,0x18,0xE3,0x01,0x8E,0x30,0x19,0xA3,0x01,0x9A,0x20,0x09,0xA6,0x00,0xD2,0x60,0x0D,0x36,0x00,0xF3,0x40,0x0F,0x34,0x00,0x63,0xC0,0x06,0x1C,0x00,0x61,0x80,0x00,0x18,0x00,
// 'X'
0x58,0x01,0x10,0x13,0x00,0x10,
0x00,0x00,0x7F,0x7F,0x7E,0x7E,0x0C,0x30,0x06,0x20,0x06,0x60,0x03,0xC0,0x01,0x80,0x01,0x80,0x03,0x80,0x02,0xC0,0x06,0x40,0x04,0x60,0x0C,0x60,0x18,0x30,0x18,0x30,0x7C,0x30,0xFC,0xFE,0x00,0xFF,
// 'Y'
0x59,0x01,0x11,0x13,0x00,0x10,
0x00,0x00,0x7F,0x3F,0xBF,0x07,0x03,0x03,0x00,0xC1,0x00,0x31,0x80,0x18,0x80,0x06,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x07,0x80,0x03,0xF8,0x00,0x7C,0x00,
// 'Z'
0x5A,0x02,0x0E,0x12,0x00,0x0D,
0x7F,0xF9,0xFF,0xE6,0x03,0x18,0x18,0x60,0xC1,0x07,0x00,0x18,0x00,0xC0,0x06,0x00,0x18,0x00,0xC0,0x06,0x00,0x18,0x30,0xC0,0xC3,0x03,0x1F,0xFE,0x7F,0xF8,0x00,0x60,
// '['
0x5B,0x01,0x08,0x14,0x01,0x08,
0x00,0x7C,0x7C,0x40,0x40,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x7E,0x00,
// '\'
0x5C,0x01,0x0A,0x13,0x00,0x0A,
0x00,0x10,0x06,0x01,0x80,0x30,0x0C,0x01,0x80,0x60,0x0C,0x03,0x00,0x60,0x18,0x06,0x00,0xC0,0x30,0x06,0x01,0x80,0x60,0x08,
// ']'
0x5D,0x01,0x08,0x14,0x00,0x08,
0x00,0x7C,0x7E,0x04,0x04,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C,0xFC,
// '^'
0x5E,0x03,0x0B,0x0B,0x00,0x0B,
0x00,0x00,0x40,0x18,0x03,0x00,0xF0,0x32,0x0C,0x63,0x86,0x60,0xC0,0x0C,0x00,0x00,
// '_'
0x5F,0x15,0x11,0x02,0xFF,0x0F,
0x7F,0xFF,0x3F,0xFF,0x80,
// '`'
0x60,0x00,0x06,0x07,0x00,0x06,
0x01,0x87,0x0C,0x18,0x20,0x00,
// 'a'
0x61,0x06,0x0C,0x0D,0x00,0x0B,
0x0E,0x03,0xF0,0x31,0x06,0x10,0x23,0x80,0xF8,0x3D,0x87,0x10,0x61,0x0C,0x18,0x63,0xA7,0xFE,0x1C,0xC0,
// 'b'
0x62,0x01,0x0C,0x14,0x00,0x0C,
0x00,0x07,0xC0,0x3C,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x98,0x1F,0xC1,0xC6,0x18,0x21,0x83,0x10,0x31,0x03,0x18,0x31,0x83,0x18,0x6F,0xC6,0xF7,0xC0,0x30,
// 'c'
0x63,0x06,0x0B,0x0D,0x00,0x0B,
0x06,0x03,0xF0,0xC7,0x31,0xE4,0x1C,0x80,0x30,0x06,0x00,0x60,0x0C,0x01,0xC3,0x1F,0xC0,0xF0,
// 'd'
0x64,0x01,0x0D,0x13,0x00,0x0D,
0x00,0x00,0x1E,0x00,0xF0,0x01,0x80,0x0C,0x00,0x60,0x03,0x01,0x98,0x3E,0x81,0x9C,0x18,0x60,0xC3,0x04,0x08,0x60,0x41,0x02,0x0C,0x30,0x71,0x91,0xFF,0x87,0x1C,
// 'e'
0x65,0x07,0x0B,0x0C,0x00,0x0B,
0x0F,0x03,0xF0,0xC3,0x30,0x66,0x1C,0xDE,0x1E,0x03,0x00,0x60,0x06,0x18,0x7E,0x07,0x80,
// 'f'
0x66,0x02,0x0A,0x12,0x00,0x08,
0x07,0x07,0xE1,0xB8,0x4E,0x10,0x04,0x07,0xE1,0xF8,0x18,0x06,0x01,0x80,0x60,0x18,0x06,0x01,0x81,0xF8,0x7E,0x00,0x00,
// 'g'
0x67,0x05,0x0A,0x12,0x00,0x0A,
0x00,0x00,0x20,0x18,0x7E,0x3F,0x18,0x64,0x09,0x02,0x61,0x9F,0xC1,0xE0,0x0C,0x01,0x84,0x67,0x19,0x8C,0x7E,0x0F,0x00,
// 'h'
0x68,0x02,0x0E,0x12,0x00,0x0D,
0x78,0x01,0xE0,0x01,0x80,0x06,0x00,0x19,0xC0,0x2F,0x80,0xE6,0x07,0x08,0x18,0x20,0x60,0x81,0x82,0x06,0x08,0x18,0x20,0x60,0x81,0x82,0x1F,0x9E,0x7E,0x78,0x00,0x00,
// 'i'
0x69,0x02,0x08,0x11,0x00,0x08,
0x30,0x78,0x78,0x30,0x00,0x78,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7F,
// 'j'
0x6A,0x02,0x09,0x15,0xFE,0x07,
0x06,0x07,0x03,0x81,0xC0,0x00,0xF8,0x7C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x99,0x8F,0xC3,0xC0,
// 'k'
0x6B,0x02,0x0D,0x12,0x00,0x0D,
0x78,0x03,0xC0,0x06,0x00,0x37,0xC1,0xBC,0x0C,0xC0,0x6C,0x03,0xC0,0x1C,0x00,0xC0,0x07,0x00,0x3E,0x01,0xB8,0x08,0x61,0xC1,0xCF,0x07,0x00,0x10,0x00,0x00,
// 'l'
0x6C,0x02,0x08,0x12,0x00,0x08,
0x78,0x78,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,0x00,
// 'm'
0x6D,0x08,0x14,0x0D,0x00,0x14,
0x40,0xC3,0x0F,0xBE,0xF8,0x1E,0x78,0xC1,0xC7,0x0C,0x18,0x20,0xC1,0x82,0x0C,0x10,0x20,0xC1,0x82,0x08,0x18,0x60,0x81,0x84,0x18,0x7E,0x71,0xE7,0xE7,0x9E,0x00,0x00,0x00,
// 'n'
0x6E,0x06,0x0E,0x0E,0x00,0x0D,
0x79,0xC1,0xEF,0x81,0xE6,0x07,0x08,0x18,0x30,0x60,0xC1,0x82,0x06,0x08,0x18,0x20,0x60,0x81,0x82,0x1F,0x1E,0x7E,0x78,0x00,0x00,
// 'o'
0x6F,0x08,0x0B,0x0C,0x00,0x0C,
0x0F,0x03,0xF8,0xC3,0x30,0x36,0x06,0x80,0xD0,0x1B,0x03,0x60,0x66,0x18,0xFE,0x07,0x80,
// 'p'
0x70,0x07,0x0B,0x10,0x00,0x0B,
0x07,0x1F,0xF1,0xE3,0x18,0x23,0x06,0x60,0xCC,0x19,0x82,0x30,0xC6,0x18,0xFE,0x1B,0x83,0x00,0x60,0x1C,0x07,0x80,
// 'q'
0x71,0x06,0x0D,0x11,0x00,0x0B,
0x0C,0x01,0xF7,0x0C,0xF8,0xC3,0x04,0x18,0x20,0x41,0x02,0x08,0x10,0x60,0x83,0x04,0x0C,0x60,0x7F,0x01,0xE8,0x00,0xC0,0x06,0xC0,0x1E,0x00,0xE0,
// 'r'
0x72,0x08,0x0A,0x0D,0x00,0x09,
0x77,0x3F,0xE3,0xB8,0xCE,0x33,0x0C,0x03,0x00,0xC0,0x30,0x04,0x07,0xC1,0xF0,0x00,0x00,
// 's'
0x73,0x05,0x0A,0x0E,0x00,0x0A,
0x03,0x00,0xC1,0xF0,0xFC,0x63,0x18,0x47,0x00,0xF8,0x07,0x80,0x64,0x19,0x86,0x7F,0x07,0x80,
// 't'
0x74,0x02,0x09,0x13,0x00,0x09,
0x30,0x18,0x0C,0x06,0x02,0x07,0xE3,0xF8,0x40,0x20,0x10,0x08,0x04,0x02,0x11,0x18,0x84,0x62,0x33,0x0F,0x83,0x00,
// 'u'
0x75,0x06,0x0E,0x0E,0x00,0x0D,
0x00,0x03,0xE7,0xC7,0x9F,0x0C,0x30,0x30,0xC0,0xC3,0x03,0x0C,0x0C,0x30,0x30,0xC0,0xC3,0x03,0x0C,0x0E,0x7C,0x1F,0xF8,0x3C,0x00,
// 'v'
0x76,0x07,0x0E,0x0D,0x00,0x0D,
0x01,0xFB,0xF3,0xEF,0xC6,0x06,0x18,0x18,0x60,0x31,0x00,0xCC,0x01,0x30,0x06,0x80,0x0A,0x00,0x38,0x00,0xE0,0x01,0x00,
// 'w'
0x77,0x08,0x11,0x0D,0x00,0x11,
0x04,0x1F,0xFF,0x6F,0xBE,0x31,0x83,0x1C,0xC1,0x9E,0x40,0x4D,0x20,0x34,0xB0,0x1A,0x78,0x05,0x3C,0x03,0x8E,0x01,0x86,0x00,0x43,0x00,0x00,0x00,
// 'x'
0x78,0x08,0x0D,0x0D,0x00,0x0D,
0x0C,0xFB,0xE7,0xDE,0x18,0x31,0x80,0xD8,0x03,0x80,0x18,0x01,0xE0,0x19,0x81,0x8C,0x0E,0x7D,0xF3,0xE4,0x00,0x00,
// 'y'
0x79,0x06,0x0F,0x11,0x00,0x0D,
0x7C,0x01,0xF8,0x00,0xC3,0xF0,0xC7,0xE1,0x82,0x01,0x0C,0x03,0x18,0x06,0x20,0x06,0xC0,0x0D,0x00,0x0E,0x00,0x18,0x00,0x30,0x06,0xC0,0x1F,0x00,0x3E,0x00,0x30,0x00,
// 'z'
0x7A,0x08,0x0B,0x0B,0x00,0x0B,
0x7F,0xCF,0xF9,0x86,0x31,0x86,0x60,0x1C,0x07,0x00,0xC6,0x30,0xCF,0xF9,0xFF,0x00,
// '{'
0x7B,0x02,0x09,0x12,0x00,0x08,
0x07,0x07,0x83,0x01,0x01,0x80,0xC0,0x60,0xE0,0x70,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x1F,0x03,0x80,
// '|'
0x7C,0x02,0x03,0x12,0x01,0x05,
0x49,0x24,0x92,0x6D,0xB6,0xDB,0x6C,
// '}'
0x7D,0x02,0x07,0x11,0x00,0x07,
0x30,0xF0,0x20,0x41,0x83,0x02,0x06,0x0E,0x18,0x60,0xC0,0x81,0x83,0x3C,0x78,
// '~'
0x7E,0x09,0x0D,0x04,0x00,0x0D,
0x18,0x03,0xF1,0x98,0xFC,0x83,0xC0,
// Terminator
0xFF
};

71
components/tft/stmpe610.h Normal file
View File

@ -0,0 +1,71 @@
/*
STMPE610 Touch controller constants
*/
#ifndef _STMPE610_H
#define _STMPE610_H
#include <stdint.h>
#define STMPE610_SPI_MODE 1
// Identification registers
#define STMPE610_REG_CHP_ID 0x00 // 16-bit
#define STMPE610_REG_ID_VER 0x02
// System registers
#define STMPE610_REG_SYS_CTRL1 0x03
#define STMPE610_REG_SYS_CTRL2 0x04
#define STMPE610_REG_SPI_CFG 0x08
// Interrupt control registers
#define STMPE610_REG_INT_CTRL 0x09
#define STMPE610_REG_INT_EN 0x0A
#define STMPE610_REG_INT_STA 0x0B
#define STMPE610_REG_GPIO_INT_EN 0x0C
#define STMPE610_REG_GPIO_INT_STA 0x0D
#define STMPE610_REG_ADC_INT_EN 0x0E
#define STMPE610_REG_ADC_INT_STA 0x0F
// GPIO registers
#define STMPE610_REG_GPIO_SET_PIN 0x10
#define STMPE610_REG_GPIO_CLR_PIN 0x11
#define STMPE610_REG_GPIO_MP_STA 0x12
#define STMPE610_REG_GPIO_DIR 0x13
#define STMPE610_REG_GPIO_ED 0x14
#define STMPE610_REG_GPIO_RE 0x15
#define STMPE610_REG_GPIO_FE 0x16
#define STMPE610_REG_GPIO_AF 0x17
// ADC registers
#define STMPE610_REG_ADC_CTRL1 0x20
#define STMPE610_REG_ADC_CTRL2 0x21
#define STMPE610_REG_ADC_CAPT 0x22
#define STMPE610_REG_ADC_DATA_CH0 0x30 // 16-bit
#define STMPE610_REG_ADC_DATA_CH1 0x32 // 16-bit
#define STMPE610_REG_ADC_DATA_CH4 0x38 // 16-bit
#define STMPE610_REG_ADC_DATA_CH5 0x3A // 16-bit
#define STMPE610_REG_ADC_DATA_CH6 0x3C // 16-bit
#define STMPE610_REG_ADC_DATA_CH7 0x3E // 16-bit
// Touchscreen registers
#define STMPE610_REG_TSC_CTRL 0x40
#define STMPE610_REG_TSC_CFG 0x41
#define STMPE610_REG_WDW_TR_X 0x42 // 16-bit
#define STMPE610_REG_WDW_TR_Y 0x44 // 16-bit
#define STMPE610_REG_WDW_BL_X 0x46 // 16-bit
#define STMPE610_REG_WDW_BL_Y 0x48 // 16-bit
#define STMPE610_REG_FIFO_TH 0x4A
#define STMPE610_REG_FIFO_STA 0x4B
#define STMPE610_REG_FIFO_SIZE 0x4C
#define STMPE610_REG_TSC_DATA_X 0x4D // 16-bit
#define STMPE610_REG_TSC_DATA_Y 0x4F // 16-bit
#define STMPE610_REG_TSC_DATA_Z 0x51
#define STMPE610_REG_TSC_DATA_XYZ 0x52 // 32-bit
#define STMPE610_REG_TSC_FRACT_XYZ 0x56
#define STMPE610_REG_TSC_DATA 0x57
#define STMPE610_REG_TSC_I_DRIVE 0x58
#define STMPE610_REG_TSC_SHIELD 0x59
#endif /* _STMPE610_H */

2950
components/tft/tft.c Normal file

File diff suppressed because it is too large Load Diff

688
components/tft/tft.h Normal file
View File

@ -0,0 +1,688 @@
/*
* High level TFT functions
* Author: LoBo 04/2017, https://github/loboris
*
*/
#ifndef _TFT_H_
#define _TFT_H_
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "tftspi.h"
typedef struct {
uint16_t x1;
uint16_t y1;
uint16_t x2;
uint16_t y2;
} dispWin_t;
typedef struct {
uint8_t *font;
uint8_t x_size;
uint8_t y_size;
uint8_t offset;
uint16_t numchars;
uint16_t size;
uint8_t max_x_size;
uint8_t bitmap;
color_t color;
} Font;
//==========================================================================================
// ==== Global variables ===================================================================
//==========================================================================================
extern uint8_t tft_orientation; // current screen tft_orientation
extern uint16_t tft_font_rotate; // current font tft_font_rotate angle (0~395)
extern uint8_t tft_font_transparent; // if not 0 draw fonts transparent
extern uint8_t tft_font_forceFixed; // if not zero force drawing proportional fonts with fixed width
extern uint8_t tft_font_buffered_char;
extern uint8_t tft_font_line_space; // additional spacing between text lines; added to font height
extern uint8_t tft_text_wrap; // if not 0 wrap long text to the new line, else clip
extern color_t tft_fg; // current foreground color for fonts
extern color_t tft_bg; // current background for non transparent fonts
extern dispWin_t tft_dispWin; // display clip window
extern float tft_angleOffset; // angle offset for arc, polygon and line by angle functions
extern uint8_t tft_image_debug; // print debug messages during image decode if set to 1
extern Font tft_cfont; // Current font structure
extern int tft_x; // X position of the next character after TFT_print() function
extern int tft_y; // Y position of the next character after TFT_print() function
extern uint32_t tft_tp_calx; // touch screen X calibration constant
extern uint32_t tft_tp_caly; // touch screen Y calibration constant
// =========================================================================================
// Buffer is created during jpeg decode for sending data
// Total size of the buffer is 2 * (JPG_IMAGE_LINE_BUF_SIZE * 3)
// The size must be multiple of 256 bytes !!
#define JPG_IMAGE_LINE_BUF_SIZE 512
// --- Constants for ellipse function ---
#define TFT_ELLIPSE_UPPER_RIGHT 0x01
#define TFT_ELLIPSE_UPPER_LEFT 0x02
#define TFT_ELLIPSE_LOWER_LEFT 0x04
#define TFT_ELLIPSE_LOWER_RIGHT 0x08
// Constants for Arc function
// number representing the maximum angle (e.g. if 100, then if you pass in start=0 and end=50, you get a half circle)
// this can be changed with setArcParams function at runtime
#define DEFAULT_ARC_ANGLE_MAX 360
// rotational offset in degrees defining position of value 0 (-90 will put it at the top of circle)
// this can be changed with setAngleOffset function at runtime
#define DEFAULT_ANGLE_OFFSET -90
#define PI 3.14159265359
#define MIN_POLIGON_SIDES 3
#define MAX_POLIGON_SIDES 60
// === Color names constants ===
extern const color_t TFT_BLACK;
extern const color_t TFT_NAVY;
extern const color_t TFT_DARKGREEN;
extern const color_t TFT_DARKCYAN;
extern const color_t TFT_MAROON;
extern const color_t TFT_PURPLE;
extern const color_t TFT_OLIVE;
extern const color_t TFT_LIGHTGREY;
extern const color_t TFT_DARKGREY;
extern const color_t TFT_BLUE;
extern const color_t TFT_GREEN;
extern const color_t TFT_CYAN;
extern const color_t TFT_RED;
extern const color_t TFT_MAGENTA;
extern const color_t TFT_YELLOW;
extern const color_t TFT_WHITE;
extern const color_t TFT_ORANGE;
extern const color_t TFT_GREENYELLOW;
extern const color_t TFT_PINK;
// === Color invert constants ===
#define INVERT_ON 1
#define INVERT_OFF 0
// === Special coordinates constants ===
#define CENTER -9003
#define RIGHT -9004
#define BOTTOM -9004
#define LASTX 7000
#define LASTY 8000
// === Embedded fonts constants ===
#define DEFAULT_FONT 0
#define DEJAVU18_FONT 1
#define DEJAVU24_FONT 2
#define UBUNTU16_FONT 3
#define COMIC24_FONT 4
#define MINYA24_FONT 5
#define TOONEY32_FONT 6
#define SMALL_FONT 7
#define DEF_SMALL_FONT 8
#define FONT_7SEG 9
#define USER_FONT 10 // font will be read from file
// ===== PUBLIC FUNCTIONS =========================================================================
/*
* Draw pixel at given x,y coordinates
*
* Params:
* x: horizontal position
* y: vertical position
* color: pixel color
* sel: if not 0 activate CS before and deactivat after sending pixel data to display
* when sending multiple pixels it is faster to activate the CS first,
* send all pixels an deactivate CS after all pixela was sent
*/
//-------------------------------------------------------------------
void TFT_drawPixel(int16_t x, int16_t y, color_t color, uint8_t sel);
/*
* Read pixel color value from display GRAM at given x,y coordinates
*
* Params:
* x: horizontal position
* y: vertical position
*
* Returns:
* pixel color at x,y
*/
//------------------------------------------
color_t TFT_readPixel(int16_t x, int16_t y);
/*
* Draw vertical line at given x,y coordinates
*
* Params:
* x: horizontal start position
* y: vertical start position
* h: line height in pixels
* color: line color
*/
//---------------------------------------------------------------------
void TFT_drawFastVLine(int16_t x, int16_t y, int16_t h, color_t color);
/*
* Draw horizontal line at given x,y coordinates
*
* Params:
* x: horizontal start position
* y: vertical start position
* w: line width in pixels
* color: line color
*/
//---------------------------------------------------------------------
void TFT_drawFastHLine(int16_t x, int16_t y, int16_t w, color_t color);
/*
* Draw line on screen
*
* Params:
* x0: horizontal start position
* y0: vertical start position
* x1: horizontal end position
* y1: vertical end position
* color: line color
*/
//-------------------------------------------------------------------------------
void TFT_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, color_t color);
/*
* Draw line on screen from (x,y) point at given angle
* Line drawing angle starts at lower right quadrant of the screen and is offseted by
* 'tft_angleOffset' global variable (default: -90 degrees)
*
* Params:
* x: horizontal start position
* y: vertical start position
* start: start offset from (x,y)
* len: length of the line
* angle: line angle in degrees
* color: line color
*/
//-----------------------------------------------------------------------------------------------------------
void TFT_drawLineByAngle(uint16_t x, uint16_t y, uint16_t start, uint16_t len, uint16_t angle, color_t color);
/*
* Fill given rectangular screen region with color
*
* Params:
* x: horizontal rect start position
* y: vertical rect start position
* w: rectangle width
* h: rectangle height
* color: fill color
*/
//---------------------------------------------------------------------------
void TFT_fillRect(int16_t x, int16_t y, int16_t w, int16_t h, color_t color);
/*
* Draw rectangle on screen
*
* Params:
* x: horizontal rect start position
* y: vertical rect start position
* w: rectangle width
* h: rectangle height
* color: rect line color
*/
//------------------------------------------------------------------------------
void TFT_drawRect(uint16_t x1,uint16_t y1,uint16_t w,uint16_t h, color_t color);
/*
* Draw rectangle with rounded corners on screen
*
* Params:
* x: horizontal rect start position
* y: vertical rect start position
* w: rectangle width
* h: rectangle height
* r: corner radius
* color: rectangle color
*/
//----------------------------------------------------------------------------------------------
void TFT_drawRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color);
/*
* Fill given rectangular screen region with rounded corners with color
*
* Params:
* x: horizontal rect start position
* y: vertical rect start position
* w: rectangle width
* h: rectangle height
* r: corner radius
* color: fill color
*/
//----------------------------------------------------------------------------------------------
void TFT_fillRoundRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t r, color_t color);
/*
* Fill the whole screen with color
*
* Params:
* color: fill color
*/
//--------------------------------
void TFT_fillScreen(color_t color);
/*
* Fill the current clip window with color
*
* Params:
* color: fill color
*/
//---------------------------------
void TFT_fillWindow(color_t color);
/*
* Draw triangle on screen
*
* Params:
* x0: first triangle point x position
* y0: first triangle point y position
* x0: second triangle point x position
* y0: second triangle point y position
* x0: third triangle point x position
* y0: third triangle point y position
* color: triangle color
*/
//-----------------------------------------------------------------------------------------------------------------
void TFT_drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color);
/*
* Fill triangular screen region with color
*
* Params:
* x0: first triangle point x position
* y0: first triangle point y position
* x0: second triangle point x position
* y0: second triangle point y position
* x0: third triangle point x position
* y0: third triangle point y position
* color: fill color
*/
//-----------------------------------------------------------------------------------------------------------------
void TFT_fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, color_t color);
/*
* Draw circle on screen
*
* Params:
* x: circle center x position
* y: circle center x position
* r: circle radius
* color: circle color
*/
//-------------------------------------------------------------------
void TFT_drawCircle(int16_t x, int16_t y, int radius, color_t color);
/*
* Fill circle on screen with color
*
* Params:
* x: circle center x position
* y: circle center x position
* r: circle radius
* color: circle fill color
*/
//-------------------------------------------------------------------
void TFT_fillCircle(int16_t x, int16_t y, int radius, color_t color);
/*
* Draw ellipse on screen
*
* Params:
* x0: ellipse center x position
* y0: ellipse center x position
* rx: ellipse horizontal radius
* ry: ellipse vertical radius
* option: drawing options, multiple options can be combined
1 (TFT_ELLIPSE_UPPER_RIGHT) draw upper right corner
2 (TFT_ELLIPSE_UPPER_LEFT) draw upper left corner
4 (TFT_ELLIPSE_LOWER_LEFT) draw lower left corner
8 (TFT_ELLIPSE_LOWER_RIGHT) draw lower right corner
to draw the whole ellipse use option value 15 (1 | 2 | 4 | 8)
*
* color: circle color
*/
//------------------------------------------------------------------------------------------------------
void TFT_drawEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option);
/*
* Fill elliptical region on screen
*
* Params:
* x0: ellipse center x position
* y0: ellipse center x position
* rx: ellipse horizontal radius
* ry: ellipse vertical radius
* option: drawing options, multiple options can be combined
1 (TFT_ELLIPSE_UPPER_RIGHT) fill upper right corner
2 (TFT_ELLIPSE_UPPER_LEFT) fill upper left corner
4 (TFT_ELLIPSE_LOWER_LEFT) fill lower left corner
8 (TFT_ELLIPSE_LOWER_RIGHT) fill lower right corner
to fill the whole ellipse use option value 15 (1 | 2 | 4 | 8)
*
* color: fill color
*/
//------------------------------------------------------------------------------------------------------
void TFT_fillEllipse(uint16_t x0, uint16_t y0, uint16_t rx, uint16_t ry, color_t color, uint8_t option);
/*
* Draw circle arc on screen
* Arc drawing angle starts at lower right quadrant of the screen and is offseted by
* 'tft_angleOffset' global variable (default: -90 degrees)
*
* Params:
* cx: arc center X position
* cy: arc center Y position
* th: thickness of the drawn arc
* ry: arc vertical radius
* start: arc start angle in degrees
* end: arc end angle in degrees
* color: arc outline color
* fillcolor: arc fill color
*/
//----------------------------------------------------------------------------------------------------------------------------
void TFT_drawArc(uint16_t cx, uint16_t cy, uint16_t r, uint16_t th, float start, float end, color_t color, color_t fillcolor);
/*
* Draw polygon on screen
*
* Params:
* cx: polygon center X position
* cy: arc center Y position
* sides: number of polygon sides; MAX_POLIGON_SIDES ~ MAX_POLIGON_SIDES (3 ~ 60)
* diameter: diameter of the circle inside which the polygon is drawn
* color: polygon outline color
* fill: polygon fill color; if same as color, polygon is not filled
* deg: polygon rotation angle; 0 ~ 360
* th: thickness of the polygon outline
*/
//--------------------------------------------------------------------------------------------------------------
void TFT_drawPolygon(int cx, int cy, int sides, int diameter, color_t color, color_t fill, int deg, uint8_t th);
//--------------------------------------------------------------------------------------
//void TFT_drawStar(int cx, int cy, int diameter, color_t color, bool fill, float factor);
/*
* Set the font used for writing the text to display.
*
* ------------------------------------------------------------------------------------
* For 7 segment font only characters 0,1,2,3,4,5,6,7,8,9, . , - , : , / are available.
* Character / draws the degree sign.
* ------------------------------------------------------------------------------------
*
* Params:
* font: font number; use defined font names
* font_file: pointer to font file name; NULL for embeded fonts
*/
//----------------------------------------------------
void TFT_setFont(uint8_t font, const char *font_file);
/*
* Returns current font height & width in pixels.
*
* Params:
* width: pointer to returned font width
* height: pointer to returned font height
*/
//-------------------------------------------
int TFT_getfontsize(int *width, int* height);
/*
* Returns current font height in pixels.
*
*/
//----------------------
int TFT_getfontheight();
/*
* Write text to display.
*
* Rotation of the displayed text depends on 'tft_font_rotate' variable (0~360)
* if 'tft_font_transparent' variable is set to 1, no background pixels will be printed
*
* If the text does not fit the screen width it will be clipped (if tft_text_wrap=0),
* or continued on next line (if tft_text_wrap=1)
*
* Two special characters are allowed in strings:
* \r CR (0x0D), clears the display to EOL
* \n LF (ox0A), continues to the new line, x=0
*
* Params:
* st: pointer to null terminated string to be printed
* x: horizontal position of the upper left point in pixels
* Special values can be entered:
* CENTER, centers the text
* RIGHT, right justifies the text
* LASTX, continues from last X position; offset can be used: LASTX+n
* y: vertical position of the upper left point in pixels
* Special values can be entered:
* CENTER, centers the text
* BOTTOM, bottom justifies the text
* LASTY, continues from last Y position; offset can be used: LASTY+n
*
*/
//-------------------------------------
void TFT_print(char *st, int x, int y);
/*
* Set atributes for 7 segment vector font
* == 7 segment font must be the current font to this function to have effect ==
*
* Params:
* l: 6~40; distance between bars in pixels
* w: 1~12, max l/2; bar width in pixels
* outline: draw font outline if set to 1
* color: font outline color, only used if outline=1
*
*/
//-------------------------------------------------------------------------
void set_7seg_font_atrib(uint8_t l, uint8_t w, int outline, color_t color);
/*
* Sets the clipping area coordinates.
* All writing to screen is clipped to that area.
* Starting x & y in all functions will be adjusted to the clipping area.
*
* Params:
* x1,y1: upper left point of the clipping area
* x2,y2: bottom right point of the clipping area
*
*/
//----------------------------------------------------------------------
void TFT_setclipwin(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
/*
* Resets the clipping area to full screen (0,0),(_wodth,tft_height)
*
*/
//----------------------
void TFT_resetclipwin();
/*
* Save current clipping area to temporary variable
*
*/
//---------------------
void TFT_saveClipWin();
/*
* Restore current clipping area from temporary variable
*
*/
//------------------------
void TFT_restoreClipWin();
/*
* Set the screen rotation
* Also resets the clip window and clears the screen with current background color
*
* Params:
* rot: 0~3; screen rotation; use defined rotation constants:
* PORTRAIT, LANDSCAPE, PORTRAIT_FLIP, LANDSCAPE_FLIP
*
*/
//--------------------------------
void TFT_setRotation(uint8_t rot);
/*
* Set inverted/normal colors
*
* Params:
* mode: 0 or 1; use defined constants: INVERT_ON or INVERT_OFF
*
*/
//-----------------------------------------
void TFT_invertDisplay(const uint8_t mode);
/*
* Select gamma curve
* Params:
* gamma: gama curve, values 0~3
*/
//=================================
void TFT_setGammaCurve(uint8_t gm);
/*
* Compare two color structures
* Returns 0 if equal, 1 if not equal
*
* Params:
* c1, c2: colors to be compared
*/
//---------------------------------------------
int TFT_compare_colors(color_t c1, color_t c2);
/*
* returns the string width in pixels.
* Useful for positions strings on the screen.
*/
//--------------------------------
int TFT_getStringWidth(char* str);
/*
* Fills the rectangle occupied by string with current background color
*/
void TFT_clearStringRect(int x, int y, char *str);
/*
* Converts the components of a color, as specified by the HSB model,
* to an equivalent set of values for the default RGB model.
* The color structure that is returned by HSBtoRGB encodes the value of a color as R, G & B component
*
* Params:
* _hue: float; any number, the floor of this number is subtracted from it to create a fraction between 0 and 1.
* This fractional number is then multiplied by 360 to produce the hue angle in the HSB color model.
* _sat: float; 0 ~ 1.0
* _brightness: float; 0 ~ 1.0
*
*/
//----------------------------------------------------------
color_t HSBtoRGB(float _hue, float _sat, float _brightness);
/*
* Decodes and displays JPG image
* Limits:
* Baseline only. Progressive and Lossless JPEG format are not supported.
* Image size: Up to 65520 x 65520 pixels
* Color space: YCbCr three components only. Gray scale image is not supported.
* Sampling factor: 4:4:4, 4:2:2 or 4:2:0.
*
* Params:
* x: image left position; constants CENTER & RIGHT can be used; negative value is accepted
* y: image top position; constants CENTER & BOTTOM can be used; negative value is accepted
* scale: image scale factor: 0~3; if scale>0, image is scaled by factor 1/(2^scale) (1/2, 1/4 or 1/8)
* fname: pointer to the name of the file from which the image will be read
* if set to NULL, image will be read from memory buffer pointed to by 'buf'
* buf: pointer to the memory buffer from which the image will be read; used if fname=NULL
* size: size of the memory buffer from which the image will be read; used if fname=NULL & buf!=NULL
*
*/
//-----------------------------------------------------------------------------------
void TFT_jpg_image(int x, int y, uint8_t scale, char *fname, uint8_t *buf, int size);
/*
* Decodes and displays BMP image
* Only uncompressed RGB 24-bit with no color space information BMP images can be displayed
*
* Params:
* x: image left position; constants CENTER & RIGHT can be used; negative value is accepted
* y: image top position; constants CENTER & BOTTOM can be used; negative value is accepted
* scale: image scale factor: 0~7; if scale>0, image is scaled by factor 1/(scale+1)
* fname: pointer to the name of the file from which the image will be read
* if set to NULL, image will be read from memory buffer pointed to by 'imgbuf'
* imgbuf: pointer to the memory buffer from which the image will be read; used if fname=NULL
* size: size of the memory buffer from which the image will be read; used if fname=NULL & imgbuf!=NULL
*
*/
//-------------------------------------------------------------------------------------
int TFT_bmp_image(int x, int y, uint8_t scale, char *fname, uint8_t *imgbuf, int size);
/*
* Get the touch panel coordinates.
* The coordinates are adjusted to screen tft_orientation if raw=0
*
* Params:
* x: pointer to X coordinate
* y: pointer to Y coordinate
* raw: if 0 returns calibrated screen coordinates; if 1 returns raw touch controller coordinates
*
* Returns:
* 0 if touch panel is not touched; x=y=0
* 1 if touch panel is touched; x&y are the valid coordinates
*/
//----------------------------------------------
int TFT_read_touch(int *x, int* y, uint8_t raw);
/*
* Compile font c source file to .fnt file
* which can be used in TFT_setFont() function to select external font
* Created file have the same name as source file and extension .fnt
*
* Params:
* fontfile: pointer to c source font file name; must have .c extension
* dbg: if set to 1, prints debug information
*
* Returns:
* 0 on success
* err no on error
*
*/
//------------------------------------------------
int compile_font_file(char *fontfile, uint8_t dbg);
/*
* Get all font's characters to buffer
*/
void getFontCharacters(uint8_t *buf);
#endif
#ifdef __cplusplus
}
#endif

947
components/tft/tftspi.c Normal file
View File

@ -0,0 +1,947 @@
/*
* Author: LoBo (loboris@gmail.com, loboris.github)
*
* Module supporting SPI TFT displays based on ILI9341 & ILI9488 controllers
*
* HIGH SPEED LOW LEVEL DISPLAY FUNCTIONS
* USING DIRECT or DMA SPI TRANSFER MODEs
*
*/
#include <string.h>
#include "tftspi.h"
#include "freertos/task.h"
#include "soc/spi_reg.h"
#include "driver/gpio.h"
// ====================================================
// ==== Global variables, default values ==============
// Converts colors to grayscale if set to 1
uint8_t tft_gray_scale = 0;
// Spi clock for reading data from display memory in Hz
uint32_t tft_max_rdclock = 8000000;
// Default display dimensions
int tft_width = DEFAULT_TFT_DISPLAY_WIDTH;
int tft_height = DEFAULT_TFT_DISPLAY_HEIGHT;
// Display type, DISP_TYPE_ILI9488 or DISP_TYPE_ILI9341
uint8_t tft_disp_type = DEFAULT_DISP_TYPE;
// Spi device handles for display and touch screen
spi_lobo_device_handle_t tft_disp_spi = NULL;
spi_lobo_device_handle_t tft_ts_spi = NULL;
// ====================================================
static color_t *trans_cline = NULL;
static uint8_t _dma_sending = 0;
// RGB to GRAYSCALE constants
// 0.2989 0.5870 0.1140
#define GS_FACT_R 0.2989
#define GS_FACT_G 0.4870
#define GS_FACT_B 0.2140
// ==== Functions =====================
//------------------------------------------------------
esp_err_t IRAM_ATTR wait_trans_finish(uint8_t free_line)
{
// Wait for SPI bus ready
while (tft_disp_spi->host->hw->cmd.usr);
if ((free_line) && (trans_cline)) {
free(trans_cline);
trans_cline = NULL;
}
if (_dma_sending) {
//Tell common code DMA workaround that our DMA channel is idle. If needed, the code will do a DMA reset.
if (tft_disp_spi->host->dma_chan) spi_lobo_dmaworkaround_idle(tft_disp_spi->host->dma_chan);
// Reset DMA
tft_disp_spi->host->hw->dma_conf.val |= SPI_OUT_RST|SPI_IN_RST|SPI_AHBM_RST|SPI_AHBM_FIFO_RST;
tft_disp_spi->host->hw->dma_out_link.start=0;
tft_disp_spi->host->hw->dma_in_link.start=0;
tft_disp_spi->host->hw->dma_conf.val &= ~(SPI_OUT_RST|SPI_IN_RST|SPI_AHBM_RST|SPI_AHBM_FIFO_RST);
tft_disp_spi->host->hw->dma_conf.out_data_burst_en=1;
_dma_sending = 0;
}
return ESP_OK;
}
//-------------------------------
esp_err_t IRAM_ATTR disp_select()
{
wait_trans_finish(1);
return spi_lobo_device_select(tft_disp_spi, 0);
}
//---------------------------------
esp_err_t IRAM_ATTR disp_deselect()
{
wait_trans_finish(1);
return spi_lobo_device_deselect(tft_disp_spi);
}
//---------------------------------------------------------------------------------------------------
static void IRAM_ATTR _spi_transfer_start(spi_lobo_device_handle_t spi_dev, int wrbits, int rdbits) {
// Load send buffer
spi_dev->host->hw->user.usr_mosi_highpart = 0;
spi_dev->host->hw->mosi_dlen.usr_mosi_dbitlen = wrbits-1;
spi_dev->host->hw->user.usr_mosi = 1;
if (rdbits) {
spi_dev->host->hw->miso_dlen.usr_miso_dbitlen = rdbits;
spi_dev->host->hw->user.usr_miso = 1;
}
else {
spi_dev->host->hw->miso_dlen.usr_miso_dbitlen = 0;
spi_dev->host->hw->user.usr_miso = 0;
}
// Start transfer
spi_dev->host->hw->cmd.usr = 1;
// Wait for SPI bus ready
while (spi_dev->host->hw->cmd.usr);
}
// Send 1 byte display command, display must be selected
//------------------------------------------------
void IRAM_ATTR disp_spi_transfer_cmd(int8_t cmd) {
// Wait for SPI bus ready
while (tft_disp_spi->host->hw->cmd.usr);
// Set DC to 0 (command mode);
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)cmd;
_spi_transfer_start(tft_disp_spi, 8, 0);
}
// Send command with data to display, display must be selected
//----------------------------------------------------------------------------------
void IRAM_ATTR disp_spi_transfer_cmd_data(int8_t cmd, uint8_t *data, uint32_t len) {
// Wait for SPI bus ready
while (tft_disp_spi->host->hw->cmd.usr);
// Set DC to 0 (command mode);
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)cmd;
_spi_transfer_start(tft_disp_spi, 8, 0);
if ((len == 0) || (data == NULL)) return;
// Set DC to 1 (data mode);
gpio_set_level(PIN_NUM_DC, 1);
uint8_t idx=0, bidx=0;
uint32_t bits=0;
uint32_t count=0;
uint32_t wd = 0;
while (count < len) {
// get data byte from buffer
wd |= (uint32_t)data[count] << bidx;
count++;
bits += 8;
bidx += 8;
if (count == len) {
tft_disp_spi->host->hw->data_buf[idx] = wd;
break;
}
if (bidx == 32) {
tft_disp_spi->host->hw->data_buf[idx] = wd;
idx++;
bidx = 0;
wd = 0;
}
if (idx == 16) {
// SPI buffer full, send data
_spi_transfer_start(tft_disp_spi, bits, 0);
bits = 0;
idx = 0;
bidx = 0;
}
}
if (bits > 0) _spi_transfer_start(tft_disp_spi, bits, 0);
}
// Set the address window for display write & read commands, display must be selected
//---------------------------------------------------------------------------------------------------
static void IRAM_ATTR disp_spi_transfer_addrwin(uint16_t x1, uint16_t x2, uint16_t y1, uint16_t y2) {
uint32_t wd;
taskDISABLE_INTERRUPTS();
// Wait for SPI bus ready
while (tft_disp_spi->host->hw->cmd.usr);
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)TFT_CASET;
tft_disp_spi->host->hw->user.usr_mosi_highpart = 0;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 7;
tft_disp_spi->host->hw->user.usr_mosi = 1;
tft_disp_spi->host->hw->miso_dlen.usr_miso_dbitlen = 0;
tft_disp_spi->host->hw->user.usr_miso = 0;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
wd = (uint32_t)(x1>>8);
wd |= (uint32_t)(x1&0xff) << 8;
wd |= (uint32_t)(x2>>8) << 16;
wd |= (uint32_t)(x2&0xff) << 24;
while (tft_disp_spi->host->hw->cmd.usr); // wait transfer end
gpio_set_level(PIN_NUM_DC, 1);
tft_disp_spi->host->hw->data_buf[0] = wd;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 31;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
while (tft_disp_spi->host->hw->cmd.usr);
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)TFT_PASET;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 7;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
wd = (uint32_t)(y1>>8);
wd |= (uint32_t)(y1&0xff) << 8;
wd |= (uint32_t)(y2>>8) << 16;
wd |= (uint32_t)(y2&0xff) << 24;
while (tft_disp_spi->host->hw->cmd.usr);
gpio_set_level(PIN_NUM_DC, 1);
tft_disp_spi->host->hw->data_buf[0] = wd;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 31;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
while (tft_disp_spi->host->hw->cmd.usr);
taskENABLE_INTERRUPTS();
}
// Convert color to gray scale
//----------------------------------------------
static color_t IRAM_ATTR color2gs(color_t color)
{
color_t _color;
float gs_clr = GS_FACT_R * color.r + GS_FACT_G * color.g + GS_FACT_B * color.b;
if (gs_clr > 255) gs_clr = 255;
_color.r = (uint8_t)gs_clr;
_color.g = (uint8_t)gs_clr;
_color.b = (uint8_t)gs_clr;
return _color;
}
// Set display pixel at given coordinates to given color
//------------------------------------------------------------------------
void IRAM_ATTR drawPixel(int16_t x, int16_t y, color_t color, uint8_t sel)
{
if (!(tft_disp_spi->cfg.flags & LB_SPI_DEVICE_HALFDUPLEX)) return;
if (sel) {
if (disp_select()) return;
}
else wait_trans_finish(1);
uint32_t wd = 0;
color_t _color = color;
if (tft_gray_scale) _color = color2gs(color);
taskDISABLE_INTERRUPTS();
disp_spi_transfer_addrwin(x, x+1, y, y+1);
// Send RAM WRITE command
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)TFT_RAMWR;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 7;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
while (tft_disp_spi->host->hw->cmd.usr); // Wait for SPI bus ready
wd = (uint32_t)_color.r;
wd |= (uint32_t)_color.g << 8;
wd |= (uint32_t)_color.b << 16;
// Set DC to 1 (data mode);
gpio_set_level(PIN_NUM_DC, 1);
tft_disp_spi->host->hw->data_buf[0] = wd;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 23;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
while (tft_disp_spi->host->hw->cmd.usr); // Wait for SPI bus ready
taskENABLE_INTERRUPTS();
if (sel) disp_deselect();
}
//-----------------------------------------------------------
static void IRAM_ATTR _dma_send(uint8_t *data, uint32_t size)
{
//Fill DMA descriptors
spi_lobo_dmaworkaround_transfer_active(tft_disp_spi->host->dma_chan); //mark channel as active
spi_lobo_setup_dma_desc_links(tft_disp_spi->host->dmadesc_tx, size, data, false);
tft_disp_spi->host->hw->user.usr_mosi_highpart=0;
tft_disp_spi->host->hw->dma_out_link.addr=(int)(&tft_disp_spi->host->dmadesc_tx[0]) & 0xFFFFF;
tft_disp_spi->host->hw->dma_out_link.start=1;
tft_disp_spi->host->hw->user.usr_mosi_highpart=0;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = (size * 8) - 1;
_dma_sending = 1;
// Start transfer
tft_disp_spi->host->hw->cmd.usr = 1;
}
//---------------------------------------------------------------------------
static void IRAM_ATTR _direct_send(color_t *color, uint32_t len, uint8_t rep)
{
uint32_t cidx = 0; // color buffer index
uint32_t wd = 0;
int idx = 0;
int bits = 0;
int wbits = 0;
taskDISABLE_INTERRUPTS();
color_t _color = color[0];
if ((rep) && (tft_gray_scale)) _color = color2gs(color[0]);
while (len) {
// ** Get color data from color buffer **
if (rep == 0) {
if (tft_gray_scale) _color = color2gs(color[cidx]);
else _color = color[cidx];
}
wd |= (uint32_t)_color.r << wbits;
wbits += 8;
if (wbits == 32) {
bits += wbits;
wbits = 0;
tft_disp_spi->host->hw->data_buf[idx++] = wd;
wd = 0;
}
wd |= (uint32_t)_color.g << wbits;
wbits += 8;
if (wbits == 32) {
bits += wbits;
wbits = 0;
tft_disp_spi->host->hw->data_buf[idx++] = wd;
wd = 0;
}
wd |= (uint32_t)_color.b << wbits;
wbits += 8;
if (wbits == 32) {
bits += wbits;
wbits = 0;
tft_disp_spi->host->hw->data_buf[idx++] = wd;
wd = 0;
}
len--; // Decrement colors counter
if (rep == 0) cidx++; // if not repeating color, increment color buffer index
}
if (bits) {
while (tft_disp_spi->host->hw->cmd.usr); // Wait for SPI bus ready
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = bits-1; // set number of bits to be sent
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
}
taskENABLE_INTERRUPTS();
}
// ================================================================
// === Main function to send data to display ======================
// If rep==true: repeat sending color data to display 'len' times
// If rep==false: send 'len' color data from color buffer to display
// ** Device must already be selected and address window set **
// ================================================================
//----------------------------------------------------------------------------------------------
static void IRAM_ATTR _TFT_pushColorRep(color_t *color, uint32_t len, uint8_t rep, uint8_t wait)
{
if (len == 0) return;
if (!(tft_disp_spi->cfg.flags & LB_SPI_DEVICE_HALFDUPLEX)) return;
// Send RAM WRITE command
gpio_set_level(PIN_NUM_DC, 0);
tft_disp_spi->host->hw->data_buf[0] = (uint32_t)TFT_RAMWR;
tft_disp_spi->host->hw->mosi_dlen.usr_mosi_dbitlen = 7;
tft_disp_spi->host->hw->cmd.usr = 1; // Start transfer
while (tft_disp_spi->host->hw->cmd.usr); // Wait for SPI bus ready
gpio_set_level(PIN_NUM_DC, 1); // Set DC to 1 (data mode);
if ((len*24) <= 512) {
_direct_send(color, len, rep);
}
else if (rep == 0) {
// ==== use DMA transfer ====
// ** Prepare data
if (tft_gray_scale) {
for (int n=0; n<len; n++) {
color[n] = color2gs(color[n]);
}
}
_dma_send((uint8_t *)color, len*3);
}
else {
// ==== Repeat color, more than 512 bits total ====
color_t _color;
uint32_t buf_colors;
int buf_bytes, to_send;
/*
to_send = len;
while (to_send > 0) {
wait_trans_finish(0);
_direct_send(color, ((to_send > 21) ? 21 : to_send), rep);
to_send -= 21;
}
*/
buf_colors = ((len > (tft_width*2)) ? (tft_width*2) : len);
buf_bytes = buf_colors * 3;
// Prepare color buffer of maximum 2 color lines
trans_cline = heap_caps_malloc(buf_bytes, MALLOC_CAP_DMA);
if (trans_cline == NULL) return;
// Prepare fill color
if (tft_gray_scale) _color = color2gs(color[0]);
else _color = color[0];
// Fill color buffer with fill color
for (uint32_t i=0; i<buf_colors; i++) {
trans_cline[i] = _color;
}
// Send 'len' colors
to_send = len;
while (to_send > 0) {
wait_trans_finish(0);
_dma_send((uint8_t *)trans_cline, ((to_send > buf_colors) ? buf_bytes : (to_send*3)));
to_send -= buf_colors;
}
}
if (wait) wait_trans_finish(1);
}
// Write 'len' color data to TFT 'window' (x1,y2),(x2,y2)
//-------------------------------------------------------------------------------------------
void IRAM_ATTR TFT_pushColorRep(int x1, int y1, int x2, int y2, color_t color, uint32_t len)
{
if (disp_select() != ESP_OK) return;
// ** Send address window **
disp_spi_transfer_addrwin(x1, x2, y1, y2);
_TFT_pushColorRep(&color, len, 1, 1);
disp_deselect();
}
// Write 'len' color data to TFT 'window' (x1,y2),(x2,y2) from given buffer
// ** Device must already be selected **
//-----------------------------------------------------------------------------------
void IRAM_ATTR send_data(int x1, int y1, int x2, int y2, uint32_t len, color_t *buf)
{
// ** Send address window **
disp_spi_transfer_addrwin(x1, x2, y1, y2);
_TFT_pushColorRep(buf, len, 0, 0);
}
// Reads 'len' pixels/colors from the TFT's GRAM 'window'
// 'buf' is an array of bytes with 1st byte reserved for reading 1 dummy byte
// and the rest is actually an array of color_t values
//--------------------------------------------------------------------------------------------
int IRAM_ATTR read_data(int x1, int y1, int x2, int y2, int len, uint8_t *buf, uint8_t set_sp)
{
spi_lobo_transaction_t t;
uint32_t current_clock = 0;
memset(&t, 0, sizeof(t)); //Zero out the transaction
memset(buf, 0, len*sizeof(color_t));
if (set_sp) {
if (disp_deselect() != ESP_OK) return -1;
// Change spi clock if needed
current_clock = spi_lobo_get_speed(tft_disp_spi);
if (tft_max_rdclock < current_clock) spi_lobo_set_speed(tft_disp_spi, tft_max_rdclock);
}
if (disp_select() != ESP_OK) return -2;
// ** Send address window **
disp_spi_transfer_addrwin(x1, x2, y1, y2);
// ** GET pixels/colors **
disp_spi_transfer_cmd(TFT_RAMRD);
t.length=0; //Send nothing
t.tx_buffer=NULL;
t.rxlength=8*((len*3)+1); //Receive size in bits
t.rx_buffer=buf;
//t.user = (void*)1;
esp_err_t res = spi_lobo_transfer_data(tft_disp_spi, &t); // Receive using direct mode
disp_deselect();
if (set_sp) {
// Restore spi clock if needed
if (tft_max_rdclock < current_clock) spi_lobo_set_speed(tft_disp_spi, current_clock);
}
return res;
}
// Reads one pixel/color from the TFT's GRAM at position (x,y)
//-----------------------------------------------
color_t IRAM_ATTR readPixel(int16_t x, int16_t y)
{
uint8_t color_buf[sizeof(color_t)+1] = {0};
read_data(x, y, x+1, y+1, 1, color_buf, 1);
color_t color;
color.r = color_buf[1];
color.g = color_buf[2];
color.b = color_buf[3];
return color;
}
// get 16-bit data from touch controller for specified type
// ** Touch device must already be selected **
//----------------------------------------
int IRAM_ATTR touch_get_data(uint8_t type)
{
/*
esp_err_t ret;
spi_lobo_transaction_t t;
memset(&t, 0, sizeof(t)); //Zero out the transaction
uint8_t rxdata[2] = {0};
// send command byte & receive 2 byte response
t.rxlength=8*2;
t.rx_buffer=&rxdata;
t.command = type;
ret = spi_lobo_transfer_data(tft_ts_spi, &t); // Transmit using direct mode
if (ret != ESP_OK) return -1;
return (((int)(rxdata[0] << 8) | (int)(rxdata[1])) >> 4);
*/
spi_lobo_device_select(tft_ts_spi, 0);
tft_ts_spi->host->hw->data_buf[0] = type;
_spi_transfer_start(tft_ts_spi, 24, 24);
uint16_t res = (uint16_t)(tft_ts_spi->host->hw->data_buf[0] >> 8);
spi_lobo_device_deselect(tft_ts_spi);
return res;
}
// ==== STMPE610 ===============================================================
// ----- STMPE610 --------------------------------------------------------------------------
// Send 1 byte display command, display must be selected
//---------------------------------------------------------
static void IRAM_ATTR stmpe610_write_reg(uint8_t reg, uint8_t val) {
spi_lobo_device_select(tft_ts_spi, 0);
tft_ts_spi->host->hw->data_buf[0] = (val << 8) | reg;
_spi_transfer_start(tft_ts_spi, 16, 0);
spi_lobo_device_deselect(tft_ts_spi);
}
//-----------------------------------------------
static uint8_t IRAM_ATTR stmpe610_read_byte(uint8_t reg) {
spi_lobo_device_select(tft_ts_spi, 0);
tft_ts_spi->host->hw->data_buf[0] = (reg << 8) | (reg | 0x80);
_spi_transfer_start(tft_ts_spi, 16, 16);
uint8_t res = tft_ts_spi->host->hw->data_buf[0] >> 8;
spi_lobo_device_deselect(tft_ts_spi);
return res;
}
//-----------------------------------------
static uint16_t IRAM_ATTR stmpe610_read_word(uint8_t reg) {
spi_lobo_device_select(tft_ts_spi, 0);
tft_ts_spi->host->hw->data_buf[0] = ((((reg+1) << 8) | ((reg+1) | 0x80)) << 16) | (reg << 8) | (reg | 0x80);
_spi_transfer_start(tft_ts_spi, 32, 32);
uint16_t res = (uint16_t)(tft_ts_spi->host->hw->data_buf[0] & 0xFF00);
res |= (uint16_t)(tft_ts_spi->host->hw->data_buf[0] >> 24);
spi_lobo_device_deselect(tft_ts_spi);
return res;
}
//-----------------------
uint32_t stmpe610_getID()
{
uint16_t tid = stmpe610_read_word(0);
uint8_t tver = stmpe610_read_byte(2);
return (tid << 8) | tver;
}
//==================
void stmpe610_Init()
{
stmpe610_write_reg(STMPE610_REG_SYS_CTRL1, 0x02); // Software chip reset
vTaskDelay(10 / portTICK_RATE_MS);
stmpe610_write_reg(STMPE610_REG_SYS_CTRL2, 0x04); // Temperature sensor clock off, GPIO clock off, touch clock on, ADC clock on
stmpe610_write_reg(STMPE610_REG_INT_EN, 0x00); // Don't Interrupt on INT pin
stmpe610_write_reg(STMPE610_REG_ADC_CTRL1, 0x48); // ADC conversion time = 80 clock ticks, 12-bit ADC, internal voltage refernce
vTaskDelay(2 / portTICK_RATE_MS);
stmpe610_write_reg(STMPE610_REG_ADC_CTRL2, 0x01); // ADC speed 3.25MHz
stmpe610_write_reg(STMPE610_REG_GPIO_AF, 0x00); // GPIO alternate function - OFF
stmpe610_write_reg(STMPE610_REG_TSC_CFG, 0xE3); // Averaging 8, touch detect delay 1ms, panel driver settling time 1ms
stmpe610_write_reg(STMPE610_REG_FIFO_TH, 0x01); // FIFO threshold = 1
stmpe610_write_reg(STMPE610_REG_FIFO_STA, 0x01); // FIFO reset enable
stmpe610_write_reg(STMPE610_REG_FIFO_STA, 0x00); // FIFO reset disable
stmpe610_write_reg(STMPE610_REG_TSC_FRACT_XYZ, 0x07); // Z axis data format
stmpe610_write_reg(STMPE610_REG_TSC_I_DRIVE, 0x01); // max 50mA touchscreen line current
stmpe610_write_reg(STMPE610_REG_TSC_CTRL, 0x30); // X&Y&Z, 16 reading window
stmpe610_write_reg(STMPE610_REG_TSC_CTRL, 0x31); // X&Y&Z, 16 reading window, TSC enable
stmpe610_write_reg(STMPE610_REG_INT_STA, 0xFF); // Clear all interrupts
stmpe610_write_reg(STMPE610_REG_INT_CTRL, 0x00); // Level interrupt, disable interrupts
}
//===========================================================
int stmpe610_get_touch(uint16_t *x, uint16_t *y, uint16_t *z)
{
if (!(stmpe610_read_byte(STMPE610_REG_TSC_CTRL) & 0x80)) return 0;
// Get touch data
uint8_t fifo_size = stmpe610_read_byte(STMPE610_REG_FIFO_SIZE);
while (fifo_size < 2) {
if (!(stmpe610_read_byte(STMPE610_REG_TSC_CTRL) & 0x80)) return 0;
fifo_size = stmpe610_read_byte(STMPE610_REG_FIFO_SIZE);
}
while (fifo_size > 120) {
if (!(stmpe610_read_byte(STMPE610_REG_TSC_CTRL) & 0x80)) return 0;
*x = stmpe610_read_word(STMPE610_REG_TSC_DATA_X);
*y = stmpe610_read_word(STMPE610_REG_TSC_DATA_Y);
*z = stmpe610_read_byte(STMPE610_REG_TSC_DATA_Z);
fifo_size = stmpe610_read_byte(STMPE610_REG_FIFO_SIZE);
}
for (uint8_t i=0; i < (fifo_size-1); i++) {
*x = stmpe610_read_word(STMPE610_REG_TSC_DATA_X);
*y = stmpe610_read_word(STMPE610_REG_TSC_DATA_Y);
*z = stmpe610_read_byte(STMPE610_REG_TSC_DATA_Z);
}
*x = 4096 - *x;
/*
// Clear the rest of the fifo
{
stmpe610_write_reg(STMPE610_REG_FIFO_STA, 0x01); // FIFO reset enable
stmpe610_write_reg(STMPE610_REG_FIFO_STA, 0x00); // FIFO reset disable
}
*/
return 1;
}
// ==== STMPE610 ===========================================================================
// Find maximum spi clock for successful read from display RAM
// ** Must be used AFTER the display is initialized **
//======================
uint32_t find_rd_speed()
{
esp_err_t ret;
color_t color;
uint32_t max_speed = 1000000;
uint32_t change_speed, cur_speed;
int line_check;
color_t *color_line = NULL;
uint8_t *line_rdbuf = NULL;
uint8_t gs = tft_gray_scale;
tft_gray_scale = 0;
cur_speed = spi_lobo_get_speed(tft_disp_spi);
color_line = malloc(tft_width*3);
if (color_line == NULL) goto exit;
line_rdbuf = malloc((tft_width*3)+1);
if (line_rdbuf == NULL) goto exit;
color_t *rdline = (color_t *)(line_rdbuf+1);
// Fill test line with colors
color = (color_t){0xEC,0xA8,0x74};
for (int x=0; x<tft_width; x++) {
color_line[x] = color;
}
// Find maximum read spi clock
for (uint32_t speed=2000000; speed<=cur_speed; speed += 1000000) {
change_speed = spi_lobo_set_speed(tft_disp_spi, speed);
if (change_speed == 0) goto exit;
memset(line_rdbuf, 0, tft_width*sizeof(color_t)+1);
if (disp_select()) goto exit;
// Write color line
send_data(0, tft_height/2, tft_width-1, tft_height/2, tft_width, color_line);
if (disp_deselect()) goto exit;
// Read color line
ret = read_data(0, tft_height/2, tft_width-1, tft_height/2, tft_width, line_rdbuf, 0);
// Compare
line_check = 0;
if (ret == ESP_OK) {
for (int y=0; y<tft_width; y++) {
if ((color_line[y].r & 0xFC) != (rdline[y].r & 0xFC)) line_check = 1;
else if ((color_line[y].g & 0xFC) != (rdline[y].g & 0xFC)) line_check = 1;
else if ((color_line[y].b & 0xFC) != (rdline[y].b & 0xFC)) line_check = 1;
if (line_check) break;
}
}
else line_check = ret;
if (line_check) break;
max_speed = speed;
}
exit:
tft_gray_scale = gs;
if (line_rdbuf) free(line_rdbuf);
if (color_line) free(color_line);
// restore spi clk
change_speed = spi_lobo_set_speed(tft_disp_spi, cur_speed);
return max_speed;
}
//---------------------------------------------------------------------------
// Companion code to the initialization table.
// Reads and issues a series of LCD commands stored in byte array
//---------------------------------------------------------------------------
static void commandList(spi_lobo_device_handle_t spi, const uint8_t *addr) {
uint8_t numCommands, numArgs, cmd;
uint16_t ms;
numCommands = *addr++; // Number of commands to follow
while(numCommands--) { // For each command...
cmd = *addr++; // save command
numArgs = *addr++; // Number of args to follow
ms = numArgs & TFT_CMD_DELAY; // If high bit set, delay follows args
numArgs &= ~TFT_CMD_DELAY; // Mask out delay bit
disp_spi_transfer_cmd_data(cmd, (uint8_t *)addr, numArgs);
addr += numArgs;
if(ms) {
ms = *addr++; // Read post-command delay time (ms)
if(ms == 255) ms = 500; // If 255, delay for 500 ms
vTaskDelay(ms / portTICK_RATE_MS);
}
}
}
//==================================
void _tft_setRotation(uint8_t rot) {
uint8_t rotation = rot & 3; // can't be higher than 3
uint8_t send = 1;
uint8_t madctl = 0;
uint16_t tmp;
if ((rotation & 1)) {
// in landscape modes must be width > height
if (tft_width < tft_height) {
tmp = tft_width;
tft_width = tft_height;
tft_height = tmp;
}
}
else {
// in portrait modes must be width < height
if (tft_width > tft_height) {
tmp = tft_width;
tft_width = tft_height;
tft_height = tmp;
}
}
#if TFT_INVERT_ROTATION
switch (rotation) {
case PORTRAIT:
madctl = (MADCTL_MV | TFT_RGB_BGR);
break;
case LANDSCAPE:
madctl = (MADCTL_MX | TFT_RGB_BGR);
break;
case PORTRAIT_FLIP:
madctl = (MADCTL_MV | TFT_RGB_BGR);
break;
case LANDSCAPE_FLIP:
madctl = (MADCTL_MY | TFT_RGB_BGR);
break;
}
#elif TFT_INVERT_ROTATION1
switch (rotation) {
case PORTRAIT:
madctl = (MADCTL_MY | MADCTL_MX | TFT_RGB_BGR);
break;
case LANDSCAPE:
madctl = (MADCTL_MY | MADCTL_MV | TFT_RGB_BGR);
break;
case PORTRAIT_FLIP:
madctl = (TFT_RGB_BGR);
break;
case LANDSCAPE_FLIP:
madctl = (MADCTL_MX | MADCTL_MV | TFT_RGB_BGR);
break;
}
#elif TFT_INVERT_ROTATION2
switch (rotation) {
case PORTRAIT:
madctl = (MADCTL_MX | MADCTL_MV | TFT_RGB_BGR);
break;
case LANDSCAPE:
madctl = (TFT_RGB_BGR);
break;
case PORTRAIT_FLIP:
madctl = (MADCTL_MY | MADCTL_MV | TFT_RGB_BGR);
break;
case LANDSCAPE_FLIP:
madctl = (MADCTL_MY | MADCTL_MX | TFT_RGB_BGR);
break;
}
#else
switch (rotation) {
case PORTRAIT:
madctl = (MADCTL_MX | TFT_RGB_BGR);
break;
case LANDSCAPE:
madctl = (MADCTL_MV | TFT_RGB_BGR);
break;
case PORTRAIT_FLIP:
madctl = (MADCTL_MY | TFT_RGB_BGR);
break;
case LANDSCAPE_FLIP:
madctl = (MADCTL_MX | MADCTL_MY | MADCTL_MV | TFT_RGB_BGR);
break;
}
#endif
if (send) {
if (disp_select() == ESP_OK) {
disp_spi_transfer_cmd_data(TFT_MADCTL, &madctl, 1);
disp_deselect();
}
}
}
//=================
void TFT_PinsInit()
{
// Route all used pins to GPIO control
gpio_pad_select_gpio(PIN_NUM_CS);
gpio_pad_select_gpio(PIN_NUM_MISO);
gpio_pad_select_gpio(PIN_NUM_MOSI);
gpio_pad_select_gpio(PIN_NUM_CLK);
gpio_pad_select_gpio(PIN_NUM_DC);
gpio_set_direction(PIN_NUM_MISO, GPIO_MODE_INPUT);
gpio_set_pull_mode(PIN_NUM_MISO, GPIO_PULLUP_ONLY);
gpio_set_direction(PIN_NUM_CS, GPIO_MODE_OUTPUT);
gpio_set_direction(PIN_NUM_MOSI, GPIO_MODE_OUTPUT);
gpio_set_direction(PIN_NUM_CLK, GPIO_MODE_OUTPUT);
gpio_set_direction(PIN_NUM_DC, GPIO_MODE_OUTPUT);
gpio_set_level(PIN_NUM_DC, 0);
#if USE_TOUCH
gpio_pad_select_gpio(PIN_NUM_TCS);
gpio_set_direction(PIN_NUM_TCS, GPIO_MODE_OUTPUT);
#endif
#if PIN_NUM_BCKL
gpio_pad_select_gpio(PIN_NUM_BCKL);
gpio_set_direction(PIN_NUM_BCKL, GPIO_MODE_OUTPUT);
gpio_set_level(PIN_NUM_BCKL, PIN_BCKL_OFF);
#endif
#if PIN_NUM_RST
gpio_pad_select_gpio(PIN_NUM_RST);
gpio_set_direction(PIN_NUM_RST, GPIO_MODE_OUTPUT);
gpio_set_level(PIN_NUM_RST, 0);
#endif
}
// Initialize the display
// ====================
void TFT_display_init()
{
esp_err_t ret;
#if PIN_NUM_RST
//Reset the display
gpio_set_level(PIN_NUM_RST, 0);
vTaskDelay(20 / portTICK_RATE_MS);
gpio_set_level(PIN_NUM_RST, 1);
vTaskDelay(150 / portTICK_RATE_MS);
#endif
ret = disp_select();
assert(ret==ESP_OK);
//Send all the initialization commands
if (tft_disp_type == DISP_TYPE_ILI9341) {
commandList(tft_disp_spi, ILI9341_init);
}
else if (tft_disp_type == DISP_TYPE_ILI9488) {
commandList(tft_disp_spi, ILI9488_init);
}
else if (tft_disp_type == DISP_TYPE_ST7789V) {
commandList(tft_disp_spi, ST7789V_init);
}
else if (tft_disp_type == DISP_TYPE_ST7735) {
commandList(tft_disp_spi, STP7735_init);
}
else if (tft_disp_type == DISP_TYPE_ST7735R) {
commandList(tft_disp_spi, STP7735R_init);
commandList(tft_disp_spi, Rcmd2green);
commandList(tft_disp_spi, Rcmd3);
}
else if (tft_disp_type == DISP_TYPE_ST7735B) {
commandList(tft_disp_spi, STP7735R_init);
commandList(tft_disp_spi, Rcmd2red);
commandList(tft_disp_spi, Rcmd3);
uint8_t dt = 0xC0;
disp_spi_transfer_cmd_data(TFT_MADCTL, &dt, 1);
}
else assert(0);
ret = disp_deselect();
assert(ret==ESP_OK);
// Clear screen
_tft_setRotation(PORTRAIT);
TFT_pushColorRep(TFT_STATIC_WIDTH_OFFSET, TFT_STATIC_HEIGHT_OFFSET, tft_width + TFT_STATIC_WIDTH_OFFSET -1, tft_height + TFT_STATIC_HEIGHT_OFFSET -1, (color_t){0,0,0}, (uint32_t)(tft_height*tft_width));
///Enable backlight
#if PIN_NUM_BCKL
gpio_set_level(PIN_NUM_BCKL, PIN_BCKL_ON);
#endif
}

751
components/tft/tftspi.h Normal file
View File

@ -0,0 +1,751 @@
/*
*
* HIGH SPEED LOW LEVEL DISPLAY FUNCTIONS USING DIRECT TRANSFER MODE
*
*/
#ifndef _TFTSPI_H_
#define _TFTSPI_H_
#include "tftspi.h"
#include "spi_master_lobo.h"
#include "sdkconfig.h"
#include "stmpe610.h"
#define TOUCH_TYPE_NONE 0
#define TOUCH_TYPE_XPT2046 1
#define TOUCH_TYPE_STMPE610 2
#define TP_CALX_XPT2046 7472920
#define TP_CALY_XPT2046 122224794
#define TP_CALX_STMPE610 21368532
#define TP_CALY_STMPE610 11800144
// === Screen tft_orientation constants ===
#define PORTRAIT 0
#define LANDSCAPE 1
#define PORTRAIT_FLIP 2
#define LANDSCAPE_FLIP 3
#define DISP_TYPE_ILI9341 0
#define DISP_TYPE_ILI9488 1
#define DISP_TYPE_ST7789V 2
#define DISP_TYPE_ST7735 3
#define DISP_TYPE_ST7735R 4
#define DISP_TYPE_ST7735B 5
#if CONFIG_TFT_PREDEFINED_DISPLAY_TYPE == 1
// ** Set the correct configuration for ESP-WROVER-KIT v3
// --------------------------------------------------------
#define DEFAULT_DISP_TYPE DISP_TYPE_ST7789V
#define DEFAULT_TFT_DISPLAY_WIDTH 240
#define DEFAULT_TFT_DISPLAY_HEIGHT 320
#define DISP_COLOR_BITS_24 0x66
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 26000000
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 1
#define TFT_RGB_BGR 0x00
#define USE_TOUCH TOUCH_TYPE_NONE
#define PIN_NUM_MISO 25 // SPI MISO
#define PIN_NUM_MOSI 23 // SPI MOSI
#define PIN_NUM_CLK 19 // SPI CLOCK pin
#define PIN_NUM_CS 22 // Display CS pin
#define PIN_NUM_DC 21 // Display command/data pin
#define PIN_NUM_TCS 0 // Touch screen CS pin
#define PIN_NUM_RST 18 // GPIO used for RESET control
#define PIN_NUM_BCKL 5 // GPIO used for backlight control
#define PIN_BCKL_ON 0 // GPIO value for backlight ON
#define PIN_BCKL_OFF 1 // GPIO value for backlight OFF
// --------------------------------------------------------
#elif CONFIG_TFT_PREDEFINED_DISPLAY_TYPE == 2
// ** Set the correct configuration for Adafruit TFT Feather
// ---------------------------------------------------------
#define DEFAULT_DISP_TYPE DISP_TYPE_ILI9341
#define DEFAULT_TFT_DISPLAY_WIDTH 240
#define DEFAULT_TFT_DISPLAY_HEIGHT 320
#define DISP_COLOR_BITS_24 0x66
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 26000000
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 0
#define TFT_RGB_BGR 0x08
#define USE_TOUCH TOUCH_TYPE_STMPE610
#define PIN_NUM_MISO 19 // SPI MISO
#define PIN_NUM_MOSI 18 // SPI MOSI
#define PIN_NUM_CLK 5 // SPI CLOCK pin
#define PIN_NUM_CS 15 // Display CS pin
#define PIN_NUM_DC 33 // Display command/data pin
#define PIN_NUM_TCS 32 // Touch screen CS pin (NOT used if USE_TOUCH=0)
#define PIN_NUM_RST 0 // GPIO used for RESET control (#16)
#define PIN_NUM_BCKL 0 // GPIO used for backlight control
#define PIN_BCKL_ON 0 // GPIO value for backlight ON
#define PIN_BCKL_OFF 1 // GPIO value for backlight OFF
// ---------------------------------------------------------
#elif CONFIG_TFT_PREDEFINED_DISPLAY_TYPE == 3
// ** Set the correct configuration for M5Stack TFT
// ---------------------------------------------------------
#define DEFAULT_DISP_TYPE DISP_TYPE_ILI9341
#define DEFAULT_TFT_DISPLAY_WIDTH 320
#define DEFAULT_TFT_DISPLAY_HEIGHT 240
#define DISP_COLOR_BITS_24 0x66
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 26000000
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 0
#define TFT_INVERT_ROTATION2 1 // Adapte M5Stack TFT
#define TFT_RGB_BGR 0x08
#define USE_TOUCH TOUCH_TYPE_NONE
#define PIN_NUM_MISO 19 // SPI MISO
#define PIN_NUM_MOSI 23 // SPI MOSI
#define PIN_NUM_CLK 18 // SPI CLOCK pin
#define PIN_NUM_CS 14 // Display CS pin
#define PIN_NUM_DC 27 // Display command/data pin
#define PIN_NUM_TCS 0 // Touch screen CS pin (NOT used if USE_TOUCH=0)
#define PIN_NUM_RST 33 // GPIO used for RESET control (#16)
#define PIN_NUM_BCKL 32 // GPIO used for backlight control
#define PIN_BCKL_ON 1 // GPIO value for backlight ON
#define PIN_BCKL_OFF 0 // GPIO value for backlight OFF
// ---------------------------------------------------------
#elif CONFIG_TFT_PREDEFINED_DISPLAY_TYPE == 4
// ** Set the correct configuration for ESP-WROVER-KIT v4.1
// --------------------------------------------------------
#define DEFAULT_DISP_TYPE DISP_TYPE_ILI9341
#define DEFAULT_TFT_DISPLAY_WIDTH 240
#define DEFAULT_TFT_DISPLAY_HEIGHT 320
#define DISP_COLOR_BITS_24 0x66
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 26000000
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 0
#define TFT_INVERT_ROTATION2 0
#define TFT_RGB_BGR 0x08
#define USE_TOUCH TOUCH_TYPE_NONE
#define PIN_NUM_MISO 25 // SPI MISO
#define PIN_NUM_MOSI 23 // SPI MOSI
#define PIN_NUM_CLK 19 // SPI CLOCK pin
#define PIN_NUM_CS 22 // Display CS pin
#define PIN_NUM_DC 21 // Display command/data pin
#define PIN_NUM_TCS 0 // Touch screen CS pin
#define PIN_NUM_RST 18 // GPIO used for RESET control
#define PIN_NUM_BCKL 5 // GPIO used for backlight control
#define PIN_BCKL_ON 0 // GPIO value for backlight ON
#define PIN_BCKL_OFF 1 // GPIO value for backlight OFF
// --------------------------------------------------------
#elif CONFIG_TFT_PREDEFINED_DISPLAY_TYPE == 5
//CONFIG FOR TTGO T-DISPLAY
#define DEFAULT_DISP_TYPE DISP_TYPE_ST7789V
#define DEFAULT_TFT_DISPLAY_WIDTH 135
#define DEFAULT_TFT_DISPLAY_HEIGHT 240
//Need to be defined together so they can be swapped for x;y when rotating
#define TFT_STATIC_WIDTH_OFFSET 53
#define TFT_STATIC_HEIGHT_OFFSET 40
#define DISP_COLOR_BITS_24 0x66
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 20000000
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 1
#define TFT_RGB_BGR 0x00
//To be used by user application for initialization
#define TFT_START_COLORS_INVERTED
#define USE_TOUCH TOUCH_TYPE_NONE
#define PIN_NUM_MISO 0 // SPI MISO
#define PIN_NUM_MOSI 19 // SPI MOSI
#define PIN_NUM_CLK 18 // SPI CLOCK pin
#define PIN_NUM_CS 5 // Display CS pin
#define PIN_NUM_DC 16 // Display command/data pin
#define PIN_NUM_TCS 0 // Touch screen CS pin
#define PIN_NUM_RST 23 // GPIO used for RESET control
#define PIN_NUM_BCKL 4 // GPIO used for backlight control
#define PIN_BCKL_ON 1 // GPIO value for backlight ON
#define PIN_BCKL_OFF 0 // GPIO value for backlight OFF
//END TTGO T_DISPLAY
#else
// Configuration for other boards, set the correct values for the display used
//----------------------------------------------------------------------------
#define DISP_COLOR_BITS_24 0x66
//#define DISP_COLOR_BITS_16 0x55 // Do not use!
#define TFT_INVERT_ROTATION 0
#define TFT_INVERT_ROTATION1 CONFIG_TFT_INVERT_ROTATION1
// ################################################
// ### SET TO 0X00 FOR DISPLAYS WITH RGB MATRIX ###
// ### SET TO 0X08 FOR DISPLAYS WITH BGR MATRIX ###
// ### For ESP-WROWER-KIT set to 0x00 ###
// ################################################
#if CONFIG_TFT_RGB_BGR
#define TFT_RGB_BGR 0x00
#else
#define TFT_RGB_BGR 0x08
#endif
// ##############################################################
// ### Define ESP32 SPI pins to which the display is attached ###
// ##############################################################
// The pins configured here are the native spi pins for HSPI interface
// Any other valid pin combination can be used
#define PIN_NUM_MISO CONFIG_TFT_PIN_NUM_MISO
#define PIN_NUM_MOSI CONFIG_TFT_PIN_NUM_MOSI
#define PIN_NUM_CLK CONFIG_TFT_PIN_NUM_CLK
#define PIN_NUM_CS CONFIG_TFT_PIN_NUM_CS
#define PIN_NUM_DC CONFIG_TFT_PIN_NUM_DC
#define PIN_NUM_TCS CONFIG_TFT_PIN_NUM_TCS
#define PIN_NUM_RST CONFIG_TFT_PIN_NUM_RST
#define PIN_NUM_BCKL CONFIG_TFT_PIN_NUM_BCKL
#define PIN_BCKL_ON 0 // GPIO value for backlight ON
#define PIN_BCKL_OFF 1 // GPIO value for backlight OFF
// --------------------------------------------------------------
#define USE_TOUCH CONFIG_TFT_TOUCH_CONTROLLER
// #######################################################################
// Default display width (smaller dimension) and height (larger dimension)
// #######################################################################
#define DEFAULT_TFT_DISPLAY_WIDTH CONFIG_TFT_DISPLAY_WIDTH
#define DEFAULT_TFT_DISPLAY_HEIGHT CONFIG_TFT_DISPLAY_HEIGHT
// #######################################################################
#define DEFAULT_GAMMA_CURVE 0
#define DEFAULT_SPI_CLOCK 26000000
#if defined(CONFIG_TFT_DISPLAY_CONTROLLER_MODEL)
#define DEFAULT_DISP_TYPE CONFIG_TFT_DISPLAY_CONTROLLER_MODEL
#else
#define DEFAULT_DISP_TYPE DISP_TYPE_ILI9341
#endif
//----------------------------------------------------------------------------
#endif // CONFIG_PREDEFINED_DISPLAY_TYPE
// Define offset generation, or ignore offsets if none are needed
#ifdef TFT_STATIC_WIDTH_OFFSET
#define TFT_STATIC_X_OFFSET (tft_orientation & 1 ? TFT_STATIC_HEIGHT_OFFSET : TFT_STATIC_WIDTH_OFFSET)
#define TFT_STATIC_Y_OFFSET (tft_orientation & 1 ? TFT_STATIC_WIDTH_OFFSET : TFT_STATIC_HEIGHT_OFFSET)
#else
#define TFT_STATIC_WIDTH_OFFSET 0
#define TFT_STATIC_X_OFFSET 0
#define TFT_STATIC_HEIGHT_OFFSET 0
#define TFT_STATIC_Y_OFFSET 0
#endif
// ##############################################################
// #### Global variables ####
// ##############################################################
// ==== Converts colors to grayscale if 1 =======================
extern uint8_t tft_gray_scale;
// ==== Spi clock for reading data from display memory in Hz ====
extern uint32_t tft_max_rdclock;
// ==== Display dimensions in pixels ============================
extern int tft_width;
extern int tft_height;
// ==== Display type, DISP_TYPE_ILI9488 or DISP_TYPE_ILI9341 ====
extern uint8_t tft_disp_type;
// ==== Spi device handles for display and touch screen =========
extern spi_lobo_device_handle_t tft_disp_spi;
extern spi_lobo_device_handle_t tft_ts_spi;
// ##############################################################
// 24-bit color type structure
typedef struct __attribute__((__packed__)) {
//typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
} color_t ;
// ==== Display commands constants ====
#define TFT_INVOFF 0x20
#define TFT_INVONN 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_MADCTL 0x36
#define TFT_PTLAR 0x30
#define TFT_ENTRYM 0xB7
#define TFT_CMD_NOP 0x00
#define TFT_CMD_SWRESET 0x01
#define TFT_CMD_RDDID 0x04
#define TFT_CMD_RDDST 0x09
#define TFT_CMD_SLPIN 0x10
#define TFT_CMD_SLPOUT 0x11
#define TFT_CMD_PTLON 0x12
#define TFT_CMD_NORON 0x13
#define TFT_CMD_RDMODE 0x0A
#define TFT_CMD_RDMADCTL 0x0B
#define TFT_CMD_RDPIXFMT 0x0C
#define TFT_CMD_RDIMGFMT 0x0D
#define TFT_CMD_RDSELFDIAG 0x0F
#define TFT_CMD_GAMMASET 0x26
#define TFT_CMD_FRMCTR1 0xB1
#define TFT_CMD_FRMCTR2 0xB2
#define TFT_CMD_FRMCTR3 0xB3
#define TFT_CMD_INVCTR 0xB4
#define TFT_CMD_DFUNCTR 0xB6
#define TFT_CMD_PWCTR1 0xC0
#define TFT_CMD_PWCTR2 0xC1
#define TFT_CMD_PWCTR3 0xC2
#define TFT_CMD_PWCTR4 0xC3
#define TFT_CMD_PWCTR5 0xC4
#define TFT_CMD_VMCTR1 0xC5
#define TFT_CMD_VMCTR2 0xC7
#define TFT_CMD_RDID1 0xDA
#define TFT_CMD_RDID2 0xDB
#define TFT_CMD_RDID3 0xDC
#define TFT_CMD_RDID4 0xDD
#define TFT_CMD_GMCTRP1 0xE0
#define TFT_CMD_GMCTRN1 0xE1
#define TFT_CMD_POWERA 0xCB
#define TFT_CMD_POWERB 0xCF
#define TFT_CMD_POWER_SEQ 0xED
#define TFT_CMD_DTCA 0xE8
#define TFT_CMD_DTCB 0xEA
#define TFT_CMD_PRC 0xF7
#define TFT_CMD_3GAMMA_EN 0xF2
#define ST_CMD_VCOMS 0xBB
#define ST_CMD_FRCTRL2 0xC6
#define ST_CMD_PWCTR1 0xD0
#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR 0xB4
#define ST7735_DISSET5 0xB6
#define ST7735_PWCTR1 0xC0
#define ST7735_PWCTR2 0xC1
#define ST7735_PWCTR3 0xC2
#define ST7735_PWCTR4 0xC3
#define ST7735_PWCTR5 0xC4
#define ST7735_VMCTR1 0xC5
#define ST7735_RDID1 0xDA
#define ST7735_RDID2 0xDB
#define ST7735_RDID3 0xDC
#define ST7735_RDID4 0xDD
#define ST7735_NOP 0x00
#define ST7735_SWRESET 0x01
#define ST7735_RDDID 0x04
#define ST7735_RDDST 0x09
#define ST7735_SLPIN 0x10
#define ST7735_SLPOUT 0x11
#define ST7735_PTLON 0x12
#define ST7735_NORON 0x13
#define ST7735_PWCTR6 0xFC
#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1
#define MADCTL_MY 0x80
#define MADCTL_MX 0x40
#define MADCTL_MV 0x20
#define MADCTL_ML 0x10
#define MADCTL_MH 0x04
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_CMD_PIXFMT 0x3A
#define TFT_CMD_DELAY 0x80
// Initialization sequence for ILI7749
// ====================================
static const uint8_t ST7789V_init[] = {
#if PIN_NUM_RST
15, // 15 commands in list
#else
16, // 16 commands in list
TFT_CMD_SWRESET, TFT_CMD_DELAY, // 1: Software reset, no args, w/delay
200, // 200 ms delay
#endif
TFT_CMD_FRMCTR2, 5, 0x0c, 0x0c, 0x00, 0x33, 0x33,
TFT_ENTRYM, 1, 0x45,
ST_CMD_VCOMS, 1, 0x2B,
TFT_CMD_PWCTR1, 1, 0x2C,
TFT_CMD_PWCTR3, 2, 0x01, 0xff,
TFT_CMD_PWCTR4, 1, 0x11,
TFT_CMD_PWCTR5, 1, 0x20,
ST_CMD_FRCTRL2, 1, 0x0f,
ST_CMD_PWCTR1, 2, 0xA4, 0xA1,
TFT_CMD_GMCTRP1, 14, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19,
TFT_CMD_GMCTRN1, 14, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19,
TFT_MADCTL, 1, (MADCTL_MX | TFT_RGB_BGR), // Memory Access Control (tft_orientation)
TFT_CMD_PIXFMT, 1, DISP_COLOR_BITS_24, // *** INTERFACE PIXEL FORMAT: 0x66 -> 18 bit; 0x55 -> 16 bit
TFT_CMD_SLPOUT, TFT_CMD_DELAY, 120, // Sleep out, // 120 ms delay
TFT_DISPON, TFT_CMD_DELAY, 120,
};
// Initialization sequence for ILI7341
// ====================================
static const uint8_t ILI9341_init[] = {
#if PIN_NUM_RST
23, // 24 commands in list
#else
24, // 24 commands in list
TFT_CMD_SWRESET, TFT_CMD_DELAY, // 1: Software reset, no args, w/delay
250, // 200 ms delay
#endif
TFT_CMD_POWERA, 5, 0x39, 0x2C, 0x00, 0x34, 0x02,
TFT_CMD_POWERB, 3, 0x00, 0XC1, 0X30,
0xEF, 3, 0x03, 0x80, 0x02,
TFT_CMD_DTCA, 3, 0x85, 0x00, 0x78,
TFT_CMD_DTCB, 2, 0x00, 0x00,
TFT_CMD_POWER_SEQ, 4, 0x64, 0x03, 0X12, 0X81,
TFT_CMD_PRC, 1, 0x20,
TFT_CMD_PWCTR1, 1, 0x23, //Power control VRH[5:0]
TFT_CMD_PWCTR2, 1, 0x10, //Power control SAP[2:0];BT[3:0]
TFT_CMD_VMCTR1, 2, 0x3e, 0x28, //VCM control
TFT_CMD_VMCTR2, 1, 0x86, //VCM control2
TFT_MADCTL, 1, // Memory Access Control (tft_orientation)
(MADCTL_MX | TFT_RGB_BGR),
// *** INTERFACE PIXEL FORMAT: 0x66 -> 18 bit; 0x55 -> 16 bit
TFT_CMD_PIXFMT, 1, DISP_COLOR_BITS_24,
TFT_INVOFF, 0,
TFT_CMD_FRMCTR1, 2, 0x00, 0x18,
TFT_CMD_DFUNCTR, 4, 0x08, 0x82, 0x27, 0x00, // Display Function Control
TFT_PTLAR, 4, 0x00, 0x00, 0x01, 0x3F,
TFT_CMD_3GAMMA_EN, 1, 0x00, // 3Gamma Function: Disable (0x02), Enable (0x03)
TFT_CMD_GAMMASET, 1, 0x01, //Gamma curve selected (0x01, 0x02, 0x04, 0x08)
TFT_CMD_GMCTRP1, 15, //Positive Gamma Correction
0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00,
TFT_CMD_GMCTRN1, 15, //Negative Gamma Correction
0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F,
TFT_CMD_SLPOUT, TFT_CMD_DELAY, // Sleep out
200, // 120 ms delay
TFT_DISPON, TFT_CMD_DELAY, 200,
};
// Initialization sequence for ILI9488
// ====================================
static const uint8_t ILI9488_init[] = {
#if PIN_NUM_RST
17, // 17 commands in list
#else
18, // 18 commands in list
TFT_CMD_SWRESET, TFT_CMD_DELAY, // 1: Software reset, no args, w/delay
200, // 200 ms delay
#endif
0xE0, 15, 0x00, 0x03, 0x09, 0x08, 0x16, 0x0A, 0x3F, 0x78, 0x4C, 0x09, 0x0A, 0x08, 0x16, 0x1A, 0x0F,
0xE1, 15, 0x00, 0x16, 0x19, 0x03, 0x0F, 0x05, 0x32, 0x45, 0x46, 0x04, 0x0E, 0x0D, 0x35, 0x37, 0x0F,
0xC0, 2, //Power Control 1
0x17, //Vreg1out
0x15, //Verg2out
0xC1, 1, //Power Control 2
0x41, //VGH,VGL
0xC5, 3, //Power Control 3
0x00,
0x12, //Vcom
0x80,
#if TFT_INVERT_ROTATION
TFT_MADCTL, 1, (MADCTL_MV | TFT_RGB_BGR), // Memory Access Control (tft_orientation), set to portrait
#else
TFT_MADCTL, 1, (MADCTL_MX | TFT_RGB_BGR), // Memory Access Control (tft_orientation), set to portrait
#endif
// *** INTERFACE PIXEL FORMAT: 0x66 -> 18 bit;
TFT_CMD_PIXFMT, 1, DISP_COLOR_BITS_24,
0xB0, 1, // Interface Mode Control
0x00, // 0x80: SDO NOT USE; 0x00 USE SDO
0xB1, 1, //Frame rate
0xA0, //60Hz
0xB4, 1, //Display Inversion Control
0x02, //2-dot
0xB6, 2, //Display Function Control RGB/MCU Interface Control
0x02, //MCU
0x02, //Source,Gate scan direction
0xE9, 1, // Set Image Function
0x00, // Disable 24 bit data
0x53, 1, // Write CTRL Display Value
0x28, // BCTRL && DD on
0x51, 1, // Write Display Brightness Value
0x7F, //
0xF7, 4, // Adjust Control
0xA9,
0x51,
0x2C,
0x02, // D7 stream, loose
0x11, TFT_CMD_DELAY, //Exit Sleep
120,
0x29, 0, //Display on
};
// Initialization commands for 7735B screens
// ------------------------------------
static const uint8_t STP7735_init[] = {
#if PIN_NUM_RST
16, // 17 commands in list
#else
17, // 18 commands in list:
ST7735_SLPOUT, TFT_CMD_DELAY, // 2: Out of sleep mode, no args, w/delay
255, // 255 = 500 ms delay
#endif
TFT_CMD_PIXFMT, 1+TFT_CMD_DELAY, // 3: Set color mode, 1 arg + delay:
0x06, // 18-bit color 6-6-6 color format
10, // 10 ms delay
ST7735_FRMCTR1, 3+TFT_CMD_DELAY, // 4: Frame rate control, 3 args + delay:
0x00, // fastest refresh
0x06, // 6 lines front porch
0x03, // 3 lines back porch
10, // 10 ms delay
TFT_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg:
0x08, // Row addr/col addr, bottom to top refresh
ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay:
0x15, // 1 clk cycle nonoverlap, 2 cycle gate
// rise, 3 cycle osc equalize
0x02, // Fix on VTL
ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg:
0x0, // Line inversion
ST7735_PWCTR1 , 2+TFT_CMD_DELAY, // 8: Power control, 2 args + delay:
0x02, // GVDD = 4.7V
0x70, // 1.0uA
10, // 10 ms delay
ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay:
0x05, // VGH = 14.7V, VGL = -7.35V
ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay:
0x01, // Opamp current small
0x02, // Boost frequency
ST7735_VMCTR1 , 2+TFT_CMD_DELAY, // 11: Power control, 2 args + delay:
0x3C, // VCOMH = 4V
0x38, // VCOML = -1.1V
10, // 10 ms delay
ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay:
0x11, 0x15,
ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay:
0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what
0x21, 0x1B, 0x13, 0x19, // these config values represent)
0x17, 0x15, 0x1E, 0x2B,
0x04, 0x05, 0x02, 0x0E,
ST7735_GMCTRN1,16+TFT_CMD_DELAY, // 14: Sparkles and rainbows, 16 args + delay:
0x0B, 0x14, 0x08, 0x1E, // (ditto)
0x22, 0x1D, 0x18, 0x1E,
0x1B, 0x1A, 0x24, 0x2B,
0x06, 0x06, 0x02, 0x0F,
10, // 10 ms delay
TFT_CASET , 4 , // 15: Column addr set, 4 args, no delay:
0x00, 0x02, // XSTART = 2
0x00, 0x81, // XEND = 129
TFT_PASET , 4 , // 16: Row addr set, 4 args, no delay:
0x00, 0x02, // XSTART = 1
0x00, 0x81, // XEND = 160
ST7735_NORON , TFT_CMD_DELAY, // 17: Normal display on, no args, w/delay
10, // 10 ms delay
TFT_DISPON , TFT_CMD_DELAY, // 18: Main screen turn on, no args, w/delay
255 // 255 = 500 ms delay
};
// Init for 7735R, part 1 (red or green tab)
// --------------------------------------
static const uint8_t STP7735R_init[] = {
#if PIN_NUM_RST
14, // 14 commands in list
#else
15, // 15 commands in list:
ST7735_SWRESET, TFT_CMD_DELAY, // 1: Software reset, 0 args, w/delay
150, // 150 ms delay
#endif
ST7735_SLPOUT , TFT_CMD_DELAY, // 2: Out of sleep mode, 0 args, w/delay
255, // 500 ms delay
ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args:
0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args:
0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args:
0x01, 0x2C, 0x2D, // Dot inversion mode
0x01, 0x2C, 0x2D, // Line inversion mode
ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay:
0x07, // No inversion
ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay:
0xA2,
0x02, // -4.6V
0x84, // AUTO mode
ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay:
0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay:
0x0A, // Opamp current small
0x00, // Boost frequency
ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay:
0x8A, // BCLK/2, Opamp current small & Medium low
0x2A,
ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay:
0x8A, 0xEE,
ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay:
0x0E,
TFT_INVOFF , 0 , // 13: Don't invert display, no args, no delay
TFT_MADCTL , 1 , // 14: Memory access control (directions), 1 arg:
0xC0, // row addr/col addr, bottom to top refresh, RGB order
TFT_CMD_PIXFMT , 1+TFT_CMD_DELAY, // 15: Set color mode, 1 arg + delay:
0x06, // 18-bit color 6-6-6 color format
10 // 10 ms delay
};
// Init for 7735R, part 2 (green tab only)
// ---------------------------------------
static const uint8_t Rcmd2green[] = {
2, // 2 commands in list:
TFT_CASET , 4 , // 1: Column addr set, 4 args, no delay:
0x00, 0x02, // XSTART = 0
0x00, 0x7F+0x02, // XEND = 129
TFT_PASET , 4 , // 2: Row addr set, 4 args, no delay:
0x00, 0x01, // XSTART = 0
0x00, 0x9F+0x01 // XEND = 160
};
// Init for 7735R, part 2 (red tab only)
// -------------------------------------
static const uint8_t Rcmd2red[] = {
2, // 2 commands in list:
TFT_CASET , 4 , // 1: Column addr set, 4 args, no delay:
0x00, 0x00, // XSTART = 0
0x00, 0x7F, // XEND = 127
TFT_PASET , 4 , // 2: Row addr set, 4 args, no delay:
0x00, 0x00, // XSTART = 0
0x00, 0x9F // XEND = 159
};
// Init for 7735R, part 3 (red or green tab)
// -----------------------------------------
static const uint8_t Rcmd3[] = {
4, // 4 commands in list:
ST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay:
0x02, 0x1c, 0x07, 0x12,
0x37, 0x32, 0x29, 0x2d,
0x29, 0x25, 0x2B, 0x39,
0x00, 0x01, 0x03, 0x10,
ST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay:
0x03, 0x1d, 0x07, 0x06,
0x2E, 0x2C, 0x29, 0x2D,
0x2E, 0x2E, 0x37, 0x3F,
0x00, 0x00, 0x02, 0x10,
ST7735_NORON , TFT_CMD_DELAY, // 3: Normal display on, no args, w/delay
10, // 10 ms delay
TFT_DISPON , TFT_CMD_DELAY, // 4: Main screen turn on, no args w/delay
100 // 100 ms delay
};
// ==== Public functions =========================================================
// == Low level functions; usually not used directly ==
esp_err_t wait_trans_finish(uint8_t free_line);
void disp_spi_transfer_cmd(int8_t cmd);
void disp_spi_transfer_cmd_data(int8_t cmd, uint8_t *data, uint32_t len);
void drawPixel(int16_t x, int16_t y, color_t color, uint8_t sel);
void send_data(int x1, int y1, int x2, int y2, uint32_t len, color_t *buf);
void TFT_pushColorRep(int x1, int y1, int x2, int y2, color_t data, uint32_t len);
int read_data(int x1, int y1, int x2, int y2, int len, uint8_t *buf, uint8_t set_sp);
color_t readPixel(int16_t x, int16_t y);
int touch_get_data(uint8_t type);
// Deactivate display's CS line
//========================
esp_err_t disp_deselect();
// Activate display's CS line and configure SPI interface if necessary
//======================
esp_err_t disp_select();
// Find maximum spi clock for successful read from display RAM
// ** Must be used AFTER the display is initialized **
//======================
uint32_t find_rd_speed();
// Change the screen rotation.
// Input: m new rotation value (0 to 3)
//=================================
void _tft_setRotation(uint8_t rot);
// Initialize all pins used by display driver
// ** MUST be executed before SPI interface initialization
//=================
void TFT_PinsInit();
// Perform display initialization sequence
// Sets tft_orientation to landscape; clears the screen
// * All pins must be configured
// * SPI interface must already be setup
// * 'tft_disp_type', 'COLOR_BITS', 'tft_width', 'tft_height' variables must be set
//======================
void TFT_display_init();
//===================
void stmpe610_Init();
//============================================================
int stmpe610_get_touch(uint16_t *x, uint16_t *y, uint16_t *z);
//========================
uint32_t stmpe610_getID();
// ===============================================================================
#endif

331
components/tft/tooney32.c Normal file
View File

@ -0,0 +1,331 @@
// This comes with no warranty, implied or otherwise
// This data structure was designed to support Proportional fonts
// on Arduinos. It can however handle any ttf font that has been converted
// using the conversion program. These could be fixed width or proportional
// fonts. Individual characters do not have to be multiples of 8 bits wide.
// Any width is fine and does not need to be fixed.
// The data bits are packed to minimize data requirements, but the tradeoff
// is that a header is required per character.
// tooney32.c
// Point Size : 32
// Memory usage : 5470 bytes
// # characters : 95
// Header Format (to make Arduino UTFT Compatible):
// ------------------------------------------------
// Character Width (Used as a marker to indicate use this format. i.e.: = 0x00)
// Character Height
// First Character (Reserved. 0x00)
// Number Of Characters (Reserved. 0x00)
unsigned char tft_tooney32[] =
{
0x00, 0x20, 0x00, 0x00,
// Individual Character Format:
// ----------------------------
// Character Code
// Adjusted Y Offset
// Width
// Height
// xOffset
// xDelta (the distance to move the cursor. Effective width of the character.)
// Data[n]
// NOTE: You can remove any of these characters if they are not needed in
// your application. The first character number in each Glyph indicates
// the ASCII character code. Therefore, these do not have to be sequential.
// Just remove all the content for a particular character to save space.
// ' '
0x20,0x1E,0x00,0x00,0x00,0x09,
// '!'
0x21,0x09,0x0B,0x16,0x00,0x0B,
0x3F,0xC8,0x07,0x81,0x70,0x27,0x00,0xE0,0x1C,0x21,0x84,0x30,0x86,0x10,0xC2,0x18,0x43,0xF0,0x61,0x0C,0x13,0x02,0x60,0x4E,0x09,0xE2,0x1F,0x81,0xE0,0x00,0x00,
// '"'
0x22,0x05,0x0E,0x0A,0xFF,0x0D,
0x04,0x30,0x2D,0x61,0x8C,0x44,0x71,0x31,0x88,0xCE,0x42,0x72,0x18,0xC8,0x7B,0xC0,0xC6,0x00,
// '#'
0x23,0x07,0x18,0x16,0x00,0x18,
0x00,0xFF,0xF8,0x01,0x83,0x08,0x01,0x82,0x08,0x01,0x82,0x08,0x0F,0x06,0x0F,0x10,0x00,0x01,0x30,0x00,0x01,0x30,0x00,0x00,0x20,0x00,0x02,0x7E,0x0C,0x1E,0x7E,0x0C,0x1E,0x60,0x00,0x02,0x60,0x00,0x00,0x40,0x00,0x04,0x40,0x00,0x04,0xC0,0x00,0x04,0xFC,0x10,0x78,0xFC,0x30,0x78,0x08,0x30,0x40,0x18,0x30,0x40,0x1F,0xFF,0x80,0x1F,0xFF,0x80,
// '$'
0x24,0x09,0x0F,0x14,0x00,0x0F,
0x01,0x80,0x04,0xF8,0x18,0x08,0x20,0x10,0xC0,0x41,0x00,0x86,0x01,0x0C,0x12,0x18,0x38,0x30,0x60,0xA0,0x83,0x01,0x06,0x02,0x0C,0x04,0x18,0x10,0x30,0x20,0x6E,0x40,0xFF,0x81,0x9E,0x00,0x18,0x00,
// '%'
0x25,0x07,0x17,0x16,0x00,0x17,
0x0F,0x81,0xF8,0x20,0x84,0x10,0x80,0x98,0x42,0x00,0x21,0x0C,0x01,0x82,0x18,0x43,0x08,0x30,0x04,0x10,0x70,0x18,0x40,0xE0,0x21,0x00,0xF1,0x82,0x00,0xFF,0x0F,0xC0,0xFC,0x10,0x40,0x18,0x40,0x40,0x21,0x80,0x40,0x82,0x00,0x83,0x0C,0x21,0x04,0x18,0x02,0x18,0x78,0x04,0x21,0x30,0x10,0xC2,0x78,0xC3,0xF8,0x7F,0x07,0xE0,0x7C,0x00,
// '&'
0x26,0x08,0x17,0x17,0x00,0x17,
0x01,0xF6,0x00,0x04,0x1A,0x00,0x10,0x04,0x00,0x40,0x10,0x01,0x00,0x40,0x06,0x00,0x80,0x0C,0x1A,0x00,0x18,0x1F,0xC0,0x30,0x18,0xF8,0x60,0x08,0x09,0x80,0x00,0x33,0x00,0x00,0xCC,0x0C,0x01,0x18,0x3C,0x04,0x30,0x30,0x07,0x60,0x00,0x01,0xE0,0x00,0x07,0xC0,0x00,0x09,0xC0,0x0C,0x23,0xC0,0x38,0x03,0xE1,0xF8,0x03,0xFF,0x70,0x01,0xF8,0x60,0x00,
// '''
0x27,0x05,0x09,0x0A,0xFF,0x08,
0x06,0x05,0x86,0x23,0x13,0x11,0x90,0x90,0xC8,0x78,0x18,0x00,
// '('
0x28,0x05,0x0D,0x1D,0x00,0x0D,
0x03,0x00,0x34,0x01,0x90,0x08,0x40,0x81,0x88,0x1C,0xC1,0xC4,0x08,0x60,0x83,0x04,0x10,0x41,0x82,0x0C,0x10,0x60,0x83,0x04,0x18,0x20,0xC0,0x06,0x04,0x38,0x20,0xC0,0x87,0x06,0x38,0x1C,0xE0,0x67,0x86,0x1C,0x60,0x76,0x01,0xE0,0x0E,0x00,0x60,0x00,
// ')'
0x29,0x05,0x0D,0x1D,0x00,0x0D,
0x01,0x00,0x10,0x01,0x20,0x11,0x03,0x04,0x30,0x11,0xE0,0x8F,0x82,0x1C,0x10,0x70,0x81,0x82,0x0E,0x10,0x30,0x81,0x84,0x0C,0x20,0x61,0x02,0x08,0x10,0x01,0x84,0x08,0x20,0x81,0x18,0x11,0x80,0x8E,0x08,0x78,0x80,0xE4,0x03,0xE0,0x0E,0x00,0x30,0x00,
// '*'
0x2A,0x09,0x0C,0x0D,0x01,0x0D,
0x07,0x00,0x88,0x18,0xE4,0x11,0xC0,0x1F,0x8E,0xC0,0x1C,0x11,0xC8,0xBF,0x8E,0x7D,0xC1,0xE0,0x0C,0x00,
// '+'
0x2B,0x09,0x15,0x14,0x00,0x15,
0x00,0x7C,0x00,0x04,0x10,0x00,0x60,0x80,0x07,0x04,0x00,0x38,0x20,0x01,0xC1,0x00,0xFE,0x0F,0xCC,0x00,0x01,0xE0,0x00,0x0F,0x00,0x00,0x78,0x00,0x03,0xFF,0x07,0xFF,0xF8,0x3F,0x7F,0xC1,0xF0,0x0E,0x08,0x00,0x70,0x40,0x03,0x82,0x00,0x1F,0xF0,0x00,0xFE,0x00,0x03,0xE0,0x00,
// ','
0x2C,0x17,0x09,0x0B,0x00,0x09,
0x1E,0x10,0x98,0x38,0x1C,0x0F,0x0B,0xC4,0xE4,0x32,0x1E,0x0E,0x00,
// '-'
0x2D,0x11,0x09,0x06,0x00,0x09,
0x1B,0x90,0x50,0x39,0x2F,0xE7,0xF0,
// '.'
0x2E,0x16,0x09,0x09,0x00,0x09,
0x1E,0x10,0x90,0x38,0x1C,0x0F,0x07,0xCC,0xFC,0x3C,0x00,
// '/'
0x2F,0x09,0x11,0x19,0x00,0x11,
0x00,0x3F,0x80,0x30,0x40,0x30,0x20,0x18,0x20,0x18,0x10,0x0C,0x08,0x06,0x08,0x06,0x04,0x03,0x04,0x03,0x02,0x01,0x81,0x00,0xC1,0x00,0xC0,0x80,0x60,0x00,0x60,0x40,0x30,0x20,0x18,0x20,0x18,0x10,0x0C,0x08,0x06,0x08,0x06,0x04,0x03,0x04,0x03,0xFE,0x01,0xFE,0x00,0xFE,0x00,0x00,
// '0'
0x30,0x08,0x17,0x17,0x00,0x17,
0x00,0x7E,0x00,0x03,0x01,0x80,0x18,0x00,0x80,0x40,0x00,0x81,0x00,0x00,0x86,0x00,0x00,0x08,0x00,0x01,0x30,0x00,0x02,0x40,0x3C,0x03,0x80,0xFC,0x07,0x02,0x3C,0x0E,0x04,0x38,0x1C,0x08,0x30,0x3C,0x08,0x40,0x78,0x0F,0x01,0x30,0x00,0x02,0x70,0x00,0x08,0xF0,0x00,0x10,0xF0,0x00,0xC0,0xF0,0x03,0x00,0xFC,0x1C,0x00,0xFF,0xE0,0x00,0x3F,0x00,0x00,
// '1'
0x31,0x09,0x0D,0x16,0x00,0x0D,
0x00,0x30,0x06,0x40,0xC4,0x18,0x43,0x02,0x20,0x13,0xC0,0x9E,0x04,0x30,0x21,0x81,0x0C,0x08,0x60,0x43,0x02,0x18,0x10,0xC0,0x86,0x04,0x30,0x21,0x81,0x98,0x03,0xFF,0xE7,0xFE,0x00,0x00,
// '2'
0x32,0x08,0x12,0x17,0x00,0x12,
0x00,0xF0,0x00,0x81,0x00,0xC0,0x20,0xE0,0x04,0x40,0x01,0x38,0x00,0x2F,0x84,0x08,0xF9,0x82,0x1F,0xE0,0x81,0xF0,0x00,0x1C,0x10,0x06,0x04,0x01,0x03,0x80,0xC0,0xD0,0x20,0x04,0x18,0x01,0x0C,0x00,0x43,0x00,0x11,0x80,0x04,0x60,0x01,0x3F,0xFF,0x4F,0xFF,0xE0,0x00,0x30,
// '3'
0x33,0x08,0x12,0x17,0x00,0x12,
0x0C,0x00,0x05,0xFF,0xE3,0x00,0x08,0xC0,0x02,0x30,0x01,0x0C,0x00,0x43,0x00,0x10,0xC0,0x0C,0x37,0x01,0x0F,0x80,0x23,0xE0,0x08,0x10,0x01,0x0F,0xE0,0x43,0xF8,0x10,0x4E,0x04,0x23,0x01,0x10,0x00,0x08,0x00,0x24,0x00,0x13,0x00,0x08,0xFC,0x0C,0x1F,0xFE,0x00,0xFE,0x00,
// '4'
0x34,0x09,0x12,0x16,0x00,0x12,
0x00,0x0E,0x00,0x04,0x80,0x06,0x20,0x03,0x08,0x01,0x82,0x00,0xC0,0x80,0x40,0x20,0x20,0x08,0x10,0x03,0x88,0x20,0x94,0x00,0x07,0x00,0x01,0xC0,0x00,0x70,0x00,0x1C,0x00,0x07,0xFE,0x09,0xFF,0x83,0x80,0x60,0xC0,0x30,0x10,0x0F,0xF8,0x03,0xFC,0x00,0x00,0x00,
// '5'
0x35,0x08,0x11,0x17,0x00,0x11,
0x00,0x03,0x00,0xFF,0x40,0x80,0x20,0xC0,0x10,0x60,0x08,0x30,0x04,0x30,0x02,0x18,0x1D,0x0C,0x07,0x06,0x01,0x82,0x00,0x43,0x00,0x11,0xFC,0x08,0xFF,0x04,0x17,0x82,0x18,0x01,0x18,0x00,0x08,0x00,0x8C,0x00,0x8C,0x00,0xC7,0xC1,0xC3,0xFF,0x80,0xBF,0x00,
// '6'
0x36,0x08,0x13,0x17,0x00,0x13,
0x00,0x7F,0xC0,0x30,0x08,0x18,0x01,0x06,0x00,0x41,0x80,0x10,0x60,0x02,0x08,0x0C,0x83,0x00,0x30,0x60,0x01,0x18,0x00,0x13,0x00,0x01,0x60,0x00,0x0C,0x00,0x03,0x80,0xC0,0x78,0x3C,0x0F,0x03,0x01,0x60,0x00,0x0E,0x00,0x08,0xE0,0x02,0x1E,0x00,0x81,0xF0,0x60,0x1F,0xF8,0x00,0xFC,0x00,
// '7'
0x37,0x08,0x12,0x17,0x00,0x12,
0x0C,0x00,0x0D,0xFF,0xF3,0x00,0x04,0xC0,0x02,0x30,0x00,0x8C,0x00,0x43,0x00,0x10,0xDC,0x08,0x3F,0x02,0x0E,0x81,0x00,0x60,0x40,0x10,0x20,0x0C,0x08,0x02,0x04,0x01,0x81,0x00,0x40,0x80,0x30,0x20,0x10,0x10,0x0F,0x04,0x03,0xF1,0x00,0x3F,0x40,0x03,0xE0,0x00,0x30,0x00,
// '8'
0x38,0x08,0x12,0x17,0x00,0x12,
0x01,0xF0,0x00,0x83,0x00,0xC0,0x20,0x20,0x08,0x10,0x01,0x0C,0x18,0x43,0x06,0x10,0xC0,0x04,0x38,0x01,0x0C,0x00,0x42,0x00,0x09,0x80,0x01,0xC0,0x00,0x70,0x3C,0x1C,0x0F,0x07,0x00,0x01,0xE0,0x00,0x9C,0x00,0x27,0x80,0x30,0xF8,0x38,0x1F,0xFC,0x01,0xFC,0x00,0x00,0x00,
// '9'
0x39,0x08,0x13,0x17,0x00,0x13,
0x01,0xF8,0x00,0xC0,0xC0,0x20,0x04,0x08,0x00,0x42,0x00,0x08,0xC0,0x00,0x90,0x18,0x16,0x07,0x81,0xC0,0x60,0x38,0x00,0x07,0x80,0x00,0xF0,0x00,0x17,0x00,0x02,0xF0,0x00,0x0F,0x80,0x10,0xE6,0x02,0x08,0x00,0x83,0x00,0x20,0x40,0x0C,0x10,0x03,0x06,0xC1,0xC0,0xFF,0xE0,0x1F,0xF0,0x00,
// ':'
0x3A,0x0E,0x09,0x11,0x00,0x09,
0x0E,0x10,0x90,0x38,0x1C,0x0F,0x07,0xC4,0xFC,0x3C,0x19,0x98,0x38,0x1C,0x0F,0x07,0xCC,0xFC,0x3C,0x00,
// ';'
0x3B,0x0F,0x09,0x13,0x00,0x09,
0x0E,0x10,0x98,0x38,0x1C,0x0F,0x07,0xC4,0xFC,0x3E,0x19,0x98,0x38,0x1C,0x0F,0x03,0xC4,0xE4,0x32,0x1E,0x0E,0x00,
// '<'
0x3C,0x0A,0x13,0x13,0x00,0x13,
0x00,0x00,0xC0,0x00,0x64,0x00,0x60,0x80,0x30,0x10,0x38,0x02,0x18,0x03,0x8C,0x01,0xE3,0x01,0xF0,0xE0,0xF8,0x1C,0x06,0x03,0x80,0x18,0x7E,0x00,0xCF,0xF0,0x06,0x7F,0xC0,0x43,0xFE,0x08,0x0F,0xF9,0x00,0x7F,0xE0,0x01,0xF8,0x00,0x0C,0x00,
// '='
0x3D,0x0D,0x14,0x0E,0x00,0x14,
0x3F,0xFF,0xE6,0x00,0x01,0xE0,0x00,0x1E,0x00,0x01,0xE0,0x00,0x1F,0xFF,0xFE,0xFF,0xFF,0xE6,0x00,0x01,0x60,0x00,0x1E,0x00,0x01,0xE0,0x00,0x1F,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xF8,
// '>'
0x3E,0x0A,0x13,0x13,0x00,0x13,
0x38,0x00,0x0C,0xC0,0x03,0x87,0x00,0x70,0x18,0x0E,0x00,0xE1,0xF8,0x03,0x3F,0xC0,0x19,0xFF,0x01,0x0F,0xF8,0x20,0x3C,0x04,0x0C,0x00,0x86,0x00,0xE3,0x00,0x78,0xC0,0x7C,0x38,0x3E,0x07,0x3E,0x00,0xFF,0x00,0x1F,0x00,0x03,0x80,0x00,0x00,
// '?'
0x3F,0x08,0x11,0x16,0x00,0x11,
0x00,0xF0,0x01,0x82,0x01,0x00,0x81,0x00,0x23,0x00,0x0B,0x00,0x05,0xC0,0x02,0xF8,0xC1,0x3F,0x40,0x87,0xE0,0x80,0xE0,0x40,0x30,0x40,0x18,0x20,0x0F,0xE0,0x07,0x30,0x03,0x04,0x03,0x02,0x01,0x81,0x00,0xE0,0x80,0x78,0x80,0x1F,0x80,0x07,0x80,
// '@'
0x40,0x09,0x16,0x16,0x00,0x16,
0x00,0x3F,0x00,0x06,0x03,0x00,0x23,0xFB,0x01,0x3F,0xFC,0x09,0x81,0xF8,0x48,0x7F,0xE2,0x44,0x13,0xD9,0x23,0x8F,0x41,0x1E,0x1F,0x2C,0x51,0x7C,0xE0,0xC5,0xF3,0x8B,0x06,0xCE,0x28,0x3B,0x38,0xE2,0xEE,0x71,0x4D,0x19,0xE3,0x88,0x73,0xFF,0xD1,0xE7,0x9F,0xA3,0xC7,0xF1,0x07,0xE0,0x38,0x07,0xFF,0x80,0x07,0xF8,0x00,
// 'A'
0x41,0x08,0x19,0x17,0x00,0x19,
0x00,0x0C,0x00,0x00,0x09,0x00,0x00,0x08,0x80,0x00,0x0C,0x20,0x00,0x04,0x08,0x00,0x06,0x04,0x00,0x02,0x01,0x00,0x03,0x00,0xC0,0x03,0x00,0x20,0x01,0x00,0x08,0x01,0x80,0x04,0x00,0x80,0x01,0x00,0xC0,0xC0,0x40,0xC0,0x60,0x20,0x40,0x00,0x08,0x60,0x00,0x06,0x40,0x00,0x00,0xF0,0x00,0x00,0xFE,0x1F,0xE1,0xCF,0xCF,0xF1,0x81,0xF4,0x1B,0x80,0x3E,0x0F,0x00,0x0E,0x06,0x00,
// 'B'
0x42,0x09,0x13,0x15,0x00,0x13,
0x3F,0xFC,0x0C,0x00,0x61,0xC0,0x06,0x38,0x00,0x43,0x00,0x04,0x60,0x60,0x8C,0x0C,0x11,0x81,0x02,0x30,0x00,0x46,0x00,0x08,0xC0,0x00,0x98,0x18,0x13,0x03,0x02,0x60,0x60,0x4C,0x00,0x09,0x80,0x01,0x30,0x00,0x44,0x00,0x11,0x80,0x0E,0x3F,0xFF,0x07,0xFF,0x80,
// 'C'
0x43,0x08,0x16,0x17,0x00,0x16,
0x00,0x7E,0x00,0x06,0x02,0x00,0x60,0x06,0x02,0x00,0x06,0x10,0x00,0x00,0xC0,0x00,0x22,0x00,0x01,0x18,0x0F,0x18,0x40,0x7E,0xC3,0x02,0x3E,0x0C,0x08,0xF0,0x30,0x21,0x80,0xC0,0x83,0x03,0x81,0x1A,0x0E,0x03,0xC4,0x18,0x00,0x08,0x70,0x00,0x19,0xE0,0x00,0x23,0xC0,0x01,0x87,0x80,0x1E,0x0F,0xC1,0xE0,0x0F,0xFE,0x00,0x0F,0xC0,0x00,
// 'D'
0x44,0x09,0x16,0x15,0xFF,0x15,
0x1F,0xFE,0x00,0x80,0x06,0x07,0x00,0x06,0x1C,0x00,0x0C,0x30,0x00,0x10,0xC0,0x00,0x23,0x00,0x00,0x8C,0x0F,0x01,0x30,0x3E,0x04,0xC0,0xF8,0x13,0x03,0xE0,0x4C,0x0F,0x01,0x30,0x00,0x04,0xC0,0x00,0x23,0x00,0x00,0x8C,0x00,0x04,0x30,0x00,0x20,0x80,0x01,0x06,0x00,0x18,0x1F,0xFF,0x80,0x3F,0xF0,0x00,
// 'E'
0x45,0x08,0x11,0x17,0x00,0x11,
0x00,0x01,0x0F,0xFF,0x48,0x00,0x2C,0x00,0x17,0x00,0x0B,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x1A,0x98,0x01,0x8C,0x00,0x86,0x00,0x43,0x00,0x31,0x80,0xD4,0xC0,0x02,0x60,0x01,0x30,0x00,0x98,0x00,0x4C,0x00,0x24,0x00,0x17,0xFF,0xEB,0xFF,0xF8,0x00,0x08,
// 'F'
0x46,0x08,0x11,0x16,0xFF,0x10,
0x00,0x01,0x0F,0xFF,0x48,0x00,0x2E,0x00,0x17,0x00,0x09,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x3A,0x98,0x01,0x8C,0x00,0xC6,0x00,0x43,0x00,0x21,0x81,0xD0,0xC0,0xF0,0x60,0x70,0x30,0x20,0x18,0x10,0x08,0x02,0x0C,0x01,0x07,0xFF,0x03,0xFF,0x00,
// 'G'
0x47,0x08,0x16,0x17,0x00,0x16,
0x00,0x7F,0x00,0x06,0x03,0x00,0x60,0x03,0x82,0x00,0x02,0x10,0x00,0x08,0xC0,0x00,0xC2,0x00,0x06,0x18,0x07,0x30,0x40,0x3C,0x83,0x01,0x3C,0x0C,0x04,0xFF,0xB0,0x14,0x02,0xC0,0x78,0x1B,0x80,0xE0,0x4E,0x01,0x81,0x18,0x00,0x04,0x70,0x00,0x11,0xE0,0x00,0x43,0xC0,0x01,0x07,0x80,0x18,0x0F,0x81,0xC0,0x1F,0xFC,0x00,0x0F,0xC0,0x00,
// 'H'
0x48,0x09,0x16,0x15,0x00,0x16,
0x3F,0xC7,0xF9,0x00,0xE0,0x1E,0x03,0xC0,0x98,0x0B,0x02,0x60,0x2C,0x09,0x80,0xF0,0x26,0x00,0x00,0x98,0x00,0x02,0x60,0x00,0x09,0x80,0x00,0x26,0x00,0x00,0x98,0x00,0x02,0x60,0x3C,0x09,0x80,0xF0,0x26,0x02,0xC0,0x98,0x0B,0x02,0x60,0x2C,0x09,0x00,0x20,0x1F,0xFF,0xFF,0xFF,0xF7,0xFC,0x00,0x00,0x00,
// 'I'
0x49,0x09,0x0B,0x15,0x00,0x0B,
0x3F,0xC8,0x07,0x81,0x70,0x26,0x04,0xC0,0x98,0x13,0x02,0x60,0x4C,0x09,0x81,0x30,0x26,0x04,0xC0,0x98,0x13,0x02,0x60,0x48,0x07,0x00,0xFF,0xEF,0xF8,
// 'J'
0x4A,0x09,0x0F,0x16,0x00,0x0F,
0x03,0xFC,0x08,0x04,0x38,0x08,0x70,0x10,0x60,0x20,0xC0,0x41,0x80,0x83,0x01,0x06,0x02,0x0C,0x04,0x18,0x08,0x30,0x10,0xA0,0x23,0x00,0x44,0x00,0x98,0x01,0x20,0x00,0xC0,0x09,0x00,0x27,0xC1,0x8F,0xFE,0x0F,0xF0,0x00,
// 'K'
0x4B,0x08,0x17,0x18,0x00,0x17,
0x00,0x01,0x80,0x7F,0xEE,0x81,0x80,0x38,0x87,0x81,0xE0,0x8F,0x03,0x80,0x86,0x06,0x00,0x8C,0x08,0x07,0x18,0x00,0x1C,0x30,0x00,0x70,0x60,0x01,0x00,0xC0,0x02,0x01,0x80,0x02,0x03,0x00,0x04,0x06,0x04,0x04,0x0C,0x0C,0x04,0x18,0x18,0x06,0x30,0x38,0x00,0x60,0x78,0x09,0x00,0x30,0x26,0x00,0x71,0x8F,0xFF,0xE4,0x0F,0xFC,0xD0,0x00,0x01,0xC0,0x00,0x00,0x00,
// 'L'
0x4C,0x09,0x11,0x16,0x00,0x11,
0x3F,0xF0,0x30,0x04,0x1C,0x06,0x0E,0x02,0x03,0x01,0x01,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x0C,0x04,0xC6,0x03,0xD3,0x00,0x09,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x00,0xB0,0x00,0x58,0x00,0x2F,0xFF,0xD7,0xFF,0xF0,0x00,0x30,
// 'M'
0x4D,0x09,0x20,0x16,0x00,0x1F,
0x00,0xF8,0x1F,0x00,0x01,0x84,0x30,0x80,0x01,0x82,0x61,0x00,0x01,0x82,0x40,0x00,0x01,0x81,0xC0,0x80,0x01,0x01,0x80,0x80,0x03,0x00,0x80,0x40,0x02,0x00,0x00,0x40,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x04,0x00,0x00,0x10,0x0C,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x18,0x08,0x08,0x08,0x10,0x18,0x18,0x08,0x30,0x1C,0x1C,0x04,0x60,0x3C,0x3C,0x02,0x70,0x2E,0x2E,0x06,0x7C,0x27,0x4E,0x3C,0x3F,0x27,0xC6,0xF0,0x07,0xC3,0x8F,0x80,0x01,0x83,0x06,0x00,
// 'N'
0x4E,0x09,0x17,0x15,0x00,0x17,
0x3F,0x07,0xFC,0xC1,0x10,0x07,0xC1,0x78,0x1F,0x81,0xF0,0x23,0x01,0xE0,0x46,0x01,0xC0,0x8C,0x01,0x81,0x18,0x01,0x02,0x30,0x00,0x04,0x60,0x00,0x08,0xC0,0x00,0x11,0x80,0x00,0x23,0x02,0x00,0x46,0x06,0x00,0x8C,0x0E,0x01,0x18,0x1E,0x02,0x30,0x3F,0x04,0x60,0x3F,0x0B,0x00,0x2F,0x17,0xFF,0x8F,0xEF,0xFE,0x0F,0x80,
// 'O'
0x4F,0x08,0x17,0x17,0x00,0x17,
0x00,0x7E,0x00,0x03,0x01,0x80,0x18,0x00,0x80,0x40,0x00,0x81,0x00,0x00,0x86,0x00,0x00,0x08,0x00,0x01,0x30,0x00,0x02,0x40,0x3C,0x03,0x80,0xFC,0x07,0x02,0x3C,0x0E,0x04,0x38,0x1C,0x08,0x30,0x3C,0x08,0x40,0x78,0x0F,0x01,0x30,0x00,0x02,0x70,0x00,0x08,0xF0,0x00,0x10,0xF0,0x00,0xC0,0xF0,0x03,0x00,0xFC,0x1C,0x00,0xFF,0xE0,0x00,0x3F,0x00,0x00,
// 'P'
0x50,0x09,0x13,0x15,0x00,0x13,
0x3F,0xFC,0x08,0x00,0x43,0x80,0x06,0x70,0x00,0x46,0x00,0x04,0xC0,0x00,0x18,0x00,0x0B,0x01,0x81,0x60,0x30,0x2C,0x04,0x05,0x80,0x00,0x30,0x00,0x26,0x00,0x08,0xC0,0x02,0x18,0x01,0x83,0x01,0xE0,0x60,0x30,0x08,0x04,0x03,0x00,0x80,0x7F,0xE0,0x07,0xF8,0x00,
// 'Q'
0x51,0x09,0x17,0x1C,0x00,0x17,
0x00,0x7E,0x00,0x03,0x01,0x00,0x18,0x00,0x80,0x40,0x00,0x81,0x00,0x00,0x86,0x00,0x01,0x08,0x00,0x01,0x30,0x1E,0x02,0x40,0x7E,0x03,0x81,0x1E,0x07,0x02,0x1C,0x0E,0x04,0x18,0x1C,0x04,0x20,0x3C,0x07,0x80,0x78,0x00,0x01,0x30,0x00,0x02,0x70,0x00,0x04,0xF0,0x00,0x10,0xF0,0x00,0x70,0xF0,0x00,0x00,0xFC,0x00,0x40,0xFF,0x81,0x00,0x3F,0x84,0x00,0x0F,0x10,0x00,0x06,0x40,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,
// 'R'
0x52,0x09,0x18,0x17,0x00,0x18,
0x3F,0xFE,0x00,0x60,0x01,0x80,0x70,0x00,0x40,0x70,0x00,0x20,0x30,0x00,0x20,0x30,0x00,0x10,0x30,0x10,0x10,0x30,0x18,0x10,0x30,0x10,0x10,0x30,0x00,0x10,0x30,0x00,0x20,0x30,0x00,0x20,0x30,0x00,0x10,0x30,0x00,0x1E,0x30,0x00,0x0A,0x30,0x18,0x06,0x30,0x1C,0x0C,0x20,0x0E,0x18,0x7F,0xFF,0x30,0x7F,0xE7,0x20,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x03,0x00,
// 'S'
0x53,0x07,0x11,0x19,0x00,0x11,
0x00,0x06,0x00,0x02,0x80,0x1E,0x40,0x10,0x20,0x30,0x10,0x30,0x08,0x10,0x04,0x18,0x01,0x08,0x00,0x8C,0x0F,0x46,0x07,0xA3,0x01,0xE1,0xC0,0xE1,0xE0,0x41,0x70,0x21,0x80,0x10,0xC0,0x08,0x70,0x08,0x38,0x04,0x0C,0x04,0x06,0x04,0x03,0x3C,0x01,0xFC,0x00,0xF0,0x00,0x30,0x00,0x00,
// 'T'
0x54,0x08,0x12,0x16,0x01,0x13,
0x30,0x01,0x93,0xFF,0xDC,0x00,0x07,0x00,0x01,0xC0,0x00,0x70,0x00,0x1C,0x00,0x07,0x00,0x01,0xCC,0x07,0x7F,0x01,0xFF,0xC0,0x79,0xB0,0x1C,0x0C,0x04,0x03,0x01,0x00,0xC0,0x40,0x30,0x10,0x0C,0x04,0x03,0x01,0x00,0xC0,0x60,0x60,0x08,0x1F,0xFC,0x07,0xFE,0x00,
// 'U'
0x55,0x09,0x19,0x16,0xFF,0x18,
0x1F,0xF1,0xFF,0x10,0x05,0x00,0x9C,0x07,0xC0,0xCE,0x02,0xE0,0x43,0x01,0x30,0x21,0x80,0x98,0x10,0xC0,0x4C,0x08,0x60,0x26,0x04,0x30,0x13,0x02,0x18,0x09,0x81,0x0C,0x04,0xC0,0x86,0x02,0x60,0x43,0x01,0x30,0x21,0xC0,0x70,0x10,0xE0,0x00,0x10,0x30,0x00,0x08,0x1C,0x00,0x08,0x0F,0x00,0x08,0x03,0xC0,0x08,0x00,0xFC,0x18,0x00,0x1F,0xF8,0x00,0x03,0xF0,0x00,
// 'V'
0x56,0x07,0x19,0x18,0x00,0x19,
0x00,0xC1,0xC0,0x01,0x91,0x98,0x03,0x18,0xC3,0x06,0x04,0x60,0x64,0x02,0x20,0x1F,0x00,0xB0,0x1B,0xC0,0x70,0x0C,0xF0,0x10,0x08,0x38,0x00,0x08,0x0E,0x00,0x04,0x07,0x00,0x04,0x01,0xC0,0x06,0x00,0xE0,0x02,0x00,0x38,0x02,0x00,0x1C,0x01,0x00,0x07,0x01,0x00,0x03,0x81,0x80,0x00,0xE0,0x80,0x00,0x30,0x80,0x00,0x1C,0x40,0x00,0x06,0x40,0x00,0x03,0xE0,0x00,0x00,0xE0,0x00,0x00,0x60,0x00,
// 'W'
0x57,0x07,0x20,0x18,0x00,0x20,
0x00,0x60,0x03,0x80,0x01,0x90,0x06,0x60,0x0E,0x10,0xC6,0x1C,0x38,0x11,0xA6,0x07,0x60,0x11,0x26,0x01,0x78,0x12,0x1C,0x06,0x78,0x0E,0x1C,0x04,0x3C,0x0C,0x08,0x08,0x1C,0x00,0x08,0x10,0x0C,0x00,0x00,0x10,0x0E,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x07,0x00,0x00,0x40,0x03,0x00,0x00,0x40,0x03,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x01,0xC0,0x81,0x00,0x01,0xC1,0xC0,0x00,0x00,0xE1,0xC2,0x00,0x00,0xE2,0xE4,0x00,0x00,0x74,0xE4,0x00,0x00,0x7C,0x78,0x00,0x00,0x38,0x78,0x00,0x00,0x30,0x30,0x00,
// 'X'
0x58,0x05,0x19,0x1D,0x00,0x18,
0x00,0x01,0x80,0x00,0x01,0x20,0x00,0x61,0x8C,0x00,0x48,0xC3,0x00,0x44,0x40,0x60,0x43,0x60,0x10,0xC0,0xE0,0x18,0xC0,0x30,0x1C,0xC0,0x00,0x18,0x7C,0x00,0x08,0x1F,0x00,0x08,0x03,0x80,0x08,0x00,0xE0,0x04,0x00,0x38,0x02,0x00,0x0C,0x01,0x80,0x04,0x00,0x60,0x06,0x00,0x10,0x02,0x00,0x07,0x03,0x00,0x00,0x41,0x01,0x00,0x63,0x00,0xC0,0x62,0x00,0xF0,0x63,0x80,0x7C,0x61,0xF0,0x4E,0x60,0x7C,0x63,0xE0,0x0F,0x91,0xE0,0x01,0xF0,0x40,0x00,0x70,0x00,0x00,0x00,0x00,0x00,
// 'Y'
0x59,0x06,0x19,0x1B,0x00,0x19,
0x00,0x00,0x60,0x00,0xC0,0x48,0x00,0x80,0x62,0x00,0x88,0x20,0xC0,0x82,0x30,0x11,0x80,0xB0,0x01,0x80,0x30,0x0D,0x80,0x00,0x0C,0xF8,0x00,0x08,0x3E,0x00,0x04,0x07,0x80,0x04,0x01,0xE0,0x04,0x00,0x78,0x04,0x00,0x1C,0x02,0x00,0x0C,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x00,0x06,0x01,0x00,0x0E,0x01,0x00,0x0C,0x01,0x00,0x07,0x01,0x00,0x03,0xC0,0x80,0x01,0xF0,0x80,0x00,0x3E,0x00,0x00,0x0F,0xC0,0x00,0x03,0xE0,0x00,0x00,0x40,0x00,0x00,
// 'Z'
0x5A,0x08,0x13,0x17,0xFF,0x12,
0x0C,0x00,0x02,0xFF,0xFC,0xC0,0x01,0x98,0x00,0x23,0x00,0x04,0x60,0x01,0x0C,0x00,0x21,0x80,0x08,0x37,0x01,0x07,0xE0,0x60,0xF8,0x08,0x03,0x01,0x00,0x40,0x70,0x18,0x0D,0x02,0x00,0x20,0xC0,0x04,0x18,0x00,0x86,0x00,0x10,0xC0,0x02,0x10,0x00,0x47,0xFF,0xE8,0xFF,0xFE,0x00,0x01,0x80,
// '['
0x5B,0x04,0x0B,0x20,0x00,0x0B,
0x00,0x40,0x19,0xFD,0x60,0x2C,0x05,0x80,0xB0,0x16,0x0E,0xC1,0xD8,0x33,0x04,0x60,0x8C,0x11,0x82,0x30,0x46,0x08,0xC1,0x18,0x23,0x04,0x60,0x8C,0x11,0x82,0xB0,0x76,0x02,0xC0,0x58,0x0B,0x01,0x60,0x2F,0xFD,0xFF,0x80,0x60,0x00,
// '\'
0x5C,0x09,0x11,0x18,0x00,0x11,
0x3F,0x00,0x30,0x40,0x38,0x10,0x1E,0x08,0x0F,0x04,0x03,0x81,0x01,0xE0,0x80,0x70,0x20,0x3C,0x10,0x1E,0x08,0x07,0x02,0x03,0xC1,0x00,0xE0,0x40,0x78,0x20,0x3C,0x08,0x0F,0x04,0x07,0x82,0x01,0xC0,0x80,0xF0,0x40,0x38,0x10,0x1E,0x08,0x0F,0xFC,0x03,0xFC,0x01,0xFC,
// ']'
0x5D,0x04,0x0C,0x1F,0xFF,0x0B,
0x30,0x02,0xFF,0x60,0x16,0x01,0x60,0x16,0x01,0x60,0x16,0xC1,0x7C,0x16,0xC1,0x6C,0x10,0xC1,0x0C,0x10,0xC1,0x0C,0x10,0xC1,0x0C,0x10,0xC1,0x0C,0x10,0xC1,0x0C,0x13,0xC1,0x6C,0x16,0x01,0x60,0x16,0x01,0x60,0x16,0x01,0x7F,0xE7,0xFE,0x60,0x00,
// '^'
0x5E,0x1E,0x00,0x00,0x00,0x09,
// '_'
0x5F,0x20,0x10,0x04,0x00,0x10,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
// '`'
0x60,0x00,0x0A,0x09,0x00,0x0B,
0x00,0x06,0x02,0x61,0x8C,0x60,0xBF,0x17,0xFC,0x3E,0x03,0x00,
// 'a'
0x61,0x08,0x19,0x17,0x00,0x19,
0x00,0x0C,0x00,0x00,0x09,0x00,0x00,0x08,0x80,0x00,0x0C,0x20,0x00,0x04,0x08,0x00,0x06,0x04,0x00,0x02,0x01,0x00,0x03,0x00,0xC0,0x03,0x00,0x20,0x01,0x00,0x08,0x01,0x80,0x04,0x00,0x80,0x01,0x00,0xC0,0xC0,0x40,0xC0,0x60,0x20,0x40,0x00,0x08,0x60,0x00,0x06,0x40,0x00,0x00,0xF0,0x00,0x00,0xFE,0x1F,0xE1,0xCF,0xCF,0xF1,0x81,0xF4,0x1B,0x80,0x3E,0x0F,0x00,0x0E,0x06,0x00,
// 'b'
0x62,0x09,0x13,0x15,0x00,0x13,
0x3F,0xFC,0x0C,0x00,0x61,0xC0,0x06,0x38,0x00,0x43,0x00,0x04,0x60,0x60,0x8C,0x0C,0x11,0x81,0x02,0x30,0x00,0x46,0x00,0x08,0xC0,0x00,0x98,0x18,0x13,0x03,0x02,0x60,0x60,0x4C,0x00,0x09,0x80,0x01,0x30,0x00,0x44,0x00,0x11,0x80,0x0E,0x3F,0xFF,0x07,0xFF,0x80,
// 'c'
0x63,0x08,0x16,0x17,0x00,0x16,
0x00,0x7E,0x00,0x06,0x02,0x00,0x60,0x06,0x02,0x00,0x06,0x10,0x00,0x00,0xC0,0x00,0x22,0x00,0x01,0x18,0x0F,0x18,0x40,0x7E,0xC3,0x02,0x3E,0x0C,0x08,0xF0,0x30,0x21,0x80,0xC0,0x83,0x03,0x81,0x1A,0x0E,0x03,0xC4,0x18,0x00,0x08,0x70,0x00,0x19,0xE0,0x00,0x23,0xC0,0x01,0x87,0x80,0x1E,0x0F,0xC1,0xE0,0x0F,0xFE,0x00,0x0F,0xC0,0x00,
// 'd'
0x64,0x09,0x16,0x15,0xFF,0x15,
0x1F,0xFE,0x00,0x80,0x06,0x07,0x00,0x06,0x1C,0x00,0x0C,0x30,0x00,0x10,0xC0,0x00,0x23,0x00,0x00,0x8C,0x0F,0x01,0x30,0x3E,0x04,0xC0,0xF8,0x13,0x03,0xE0,0x4C,0x0F,0x01,0x30,0x00,0x04,0xC0,0x00,0x23,0x00,0x00,0x8C,0x00,0x04,0x30,0x00,0x20,0x80,0x01,0x06,0x00,0x18,0x1F,0xFF,0x80,0x3F,0xF0,0x00,
// 'e'
0x65,0x08,0x11,0x17,0x00,0x11,
0x00,0x01,0x0F,0xFF,0x48,0x00,0x2C,0x00,0x17,0x00,0x0B,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x1A,0x98,0x01,0x8C,0x00,0x86,0x00,0x43,0x00,0x31,0x80,0xD4,0xC0,0x02,0x60,0x01,0x30,0x00,0x98,0x00,0x4C,0x00,0x24,0x00,0x17,0xFF,0xEB,0xFF,0xF8,0x00,0x08,
// 'f'
0x66,0x08,0x11,0x16,0xFF,0x10,
0x00,0x01,0x0F,0xFF,0x48,0x00,0x2E,0x00,0x17,0x00,0x09,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x3A,0x98,0x01,0x8C,0x00,0xC6,0x00,0x43,0x00,0x21,0x81,0xD0,0xC0,0xF0,0x60,0x70,0x30,0x20,0x18,0x10,0x08,0x02,0x0C,0x01,0x07,0xFF,0x03,0xFF,0x00,
// 'g'
0x67,0x08,0x16,0x17,0x00,0x16,
0x00,0x7F,0x00,0x06,0x03,0x00,0x60,0x03,0x82,0x00,0x02,0x10,0x00,0x08,0xC0,0x00,0xC2,0x00,0x06,0x18,0x07,0x30,0x40,0x3C,0x83,0x01,0x3C,0x0C,0x04,0xFF,0xB0,0x14,0x02,0xC0,0x78,0x1B,0x80,0xE0,0x4E,0x01,0x81,0x18,0x00,0x04,0x70,0x00,0x11,0xE0,0x00,0x43,0xC0,0x01,0x07,0x80,0x18,0x0F,0x81,0xC0,0x1F,0xFC,0x00,0x0F,0xC0,0x00,
// 'h'
0x68,0x09,0x16,0x15,0x00,0x16,
0x3F,0xC7,0xF9,0x00,0xE0,0x1E,0x03,0xC0,0x98,0x0B,0x02,0x60,0x2C,0x09,0x80,0xF0,0x26,0x00,0x00,0x98,0x00,0x02,0x60,0x00,0x09,0x80,0x00,0x26,0x00,0x00,0x98,0x00,0x02,0x60,0x3C,0x09,0x80,0xF0,0x26,0x02,0xC0,0x98,0x0B,0x02,0x60,0x2C,0x09,0x00,0x20,0x1F,0xFF,0xFF,0xFF,0xF7,0xFC,0x00,0x00,0x00,
// 'i'
0x69,0x09,0x0B,0x15,0x00,0x0B,
0x3F,0xC8,0x07,0x81,0x70,0x26,0x04,0xC0,0x98,0x13,0x02,0x60,0x4C,0x09,0x81,0x30,0x26,0x04,0xC0,0x98,0x13,0x02,0x60,0x48,0x07,0x00,0xFF,0xEF,0xF8,
// 'j'
0x6A,0x09,0x0F,0x16,0x00,0x0F,
0x03,0xFC,0x08,0x04,0x38,0x08,0x70,0x10,0x60,0x20,0xC0,0x41,0x80,0x83,0x01,0x06,0x02,0x0C,0x04,0x18,0x08,0x30,0x10,0xA0,0x23,0x00,0x44,0x00,0x98,0x01,0x20,0x00,0xC0,0x09,0x00,0x27,0xC1,0x8F,0xFE,0x0F,0xF0,0x00,
// 'k'
0x6B,0x08,0x17,0x18,0x00,0x17,
0x00,0x01,0x80,0x7F,0xEE,0x81,0x80,0x38,0x87,0x81,0xE0,0x8F,0x03,0x80,0x86,0x06,0x00,0x8C,0x08,0x07,0x18,0x00,0x1C,0x30,0x00,0x70,0x60,0x01,0x00,0xC0,0x02,0x01,0x80,0x02,0x03,0x00,0x04,0x06,0x04,0x04,0x0C,0x0C,0x04,0x18,0x18,0x06,0x30,0x38,0x00,0x60,0x78,0x09,0x00,0x30,0x26,0x00,0x71,0x8F,0xFF,0xE4,0x0F,0xFC,0xD0,0x00,0x01,0xC0,0x00,0x00,0x00,
// 'l'
0x6C,0x09,0x11,0x16,0x00,0x11,
0x3F,0xF0,0x30,0x04,0x1C,0x06,0x0E,0x02,0x03,0x01,0x01,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x0C,0x04,0xC6,0x03,0xD3,0x00,0x09,0x80,0x04,0xC0,0x02,0x60,0x01,0x30,0x00,0xB0,0x00,0x58,0x00,0x2F,0xFF,0xD7,0xFF,0xF0,0x00,0x30,
// 'm'
0x6D,0x09,0x20,0x16,0x00,0x1F,
0x00,0xF8,0x1F,0x00,0x01,0x84,0x30,0x80,0x01,0x82,0x61,0x00,0x01,0x82,0x40,0x00,0x01,0x81,0xC0,0x80,0x01,0x01,0x80,0x80,0x03,0x00,0x80,0x40,0x02,0x00,0x00,0x40,0x06,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x04,0x00,0x00,0x10,0x0C,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x18,0x08,0x08,0x08,0x10,0x18,0x18,0x08,0x30,0x1C,0x1C,0x04,0x60,0x3C,0x3C,0x02,0x70,0x2E,0x2E,0x06,0x7C,0x27,0x4E,0x3C,0x3F,0x27,0xC6,0xF0,0x07,0xC3,0x8F,0x80,0x01,0x83,0x06,0x00,
// 'n'
0x6E,0x09,0x17,0x15,0x00,0x17,
0x3F,0x07,0xFC,0xC1,0x10,0x07,0xC1,0x78,0x1F,0x81,0xF0,0x23,0x01,0xE0,0x46,0x01,0xC0,0x8C,0x01,0x81,0x18,0x01,0x02,0x30,0x00,0x04,0x60,0x00,0x08,0xC0,0x00,0x11,0x80,0x00,0x23,0x02,0x00,0x46,0x06,0x00,0x8C,0x0E,0x01,0x18,0x1E,0x02,0x30,0x3F,0x04,0x60,0x3F,0x0B,0x00,0x2F,0x17,0xFF,0x8F,0xEF,0xFE,0x0F,0x80,
// 'o'
0x6F,0x08,0x17,0x17,0x00,0x17,
0x00,0x7E,0x00,0x03,0x01,0x80,0x18,0x00,0x80,0x40,0x00,0x81,0x00,0x00,0x86,0x00,0x00,0x08,0x00,0x01,0x30,0x00,0x02,0x40,0x3C,0x03,0x80,0xFC,0x07,0x02,0x3C,0x0E,0x04,0x38,0x1C,0x08,0x30,0x3C,0x08,0x40,0x78,0x0F,0x01,0x30,0x00,0x02,0x70,0x00,0x08,0xF0,0x00,0x10,0xF0,0x00,0xC0,0xF0,0x03,0x00,0xFC,0x1C,0x00,0xFF,0xE0,0x00,0x3F,0x00,0x00,
// 'p'
0x70,0x09,0x13,0x15,0x00,0x13,
0x3F,0xFC,0x08,0x00,0x43,0x80,0x06,0x70,0x00,0x46,0x00,0x04,0xC0,0x00,0x18,0x00,0x0B,0x01,0x81,0x60,0x30,0x2C,0x04,0x05,0x80,0x00,0x30,0x00,0x26,0x00,0x08,0xC0,0x02,0x18,0x01,0x83,0x01,0xE0,0x60,0x30,0x08,0x04,0x03,0x00,0x80,0x7F,0xE0,0x07,0xF8,0x00,
// 'q'
0x71,0x09,0x17,0x1C,0x00,0x17,
0x00,0x7E,0x00,0x03,0x01,0x00,0x18,0x00,0x80,0x40,0x00,0x81,0x00,0x00,0x86,0x00,0x01,0x08,0x00,0x01,0x30,0x1E,0x02,0x40,0x7E,0x03,0x81,0x1E,0x07,0x02,0x1C,0x0E,0x04,0x18,0x1C,0x04,0x20,0x3C,0x07,0x80,0x78,0x00,0x01,0x30,0x00,0x02,0x70,0x00,0x04,0xF0,0x00,0x10,0xF0,0x00,0x70,0xF0,0x00,0x00,0xFC,0x00,0x40,0xFF,0x81,0x00,0x3F,0x84,0x00,0x0F,0x10,0x00,0x06,0x40,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,
// 'r'
0x72,0x09,0x18,0x17,0x00,0x18,
0x3F,0xFE,0x00,0x60,0x01,0x80,0x70,0x00,0x40,0x70,0x00,0x20,0x30,0x00,0x20,0x30,0x00,0x10,0x30,0x10,0x10,0x30,0x18,0x10,0x30,0x10,0x10,0x30,0x00,0x10,0x30,0x00,0x20,0x30,0x00,0x20,0x30,0x00,0x10,0x30,0x00,0x1E,0x30,0x00,0x0A,0x30,0x18,0x06,0x30,0x1C,0x0C,0x20,0x0E,0x18,0x7F,0xFF,0x30,0x7F,0xE7,0x20,0x00,0x03,0xC0,0x00,0x03,0x80,0x00,0x03,0x00,
// 's'
0x73,0x07,0x11,0x19,0x00,0x11,
0x00,0x06,0x00,0x02,0x80,0x1E,0x40,0x10,0x20,0x30,0x10,0x30,0x08,0x10,0x04,0x18,0x01,0x08,0x00,0x8C,0x0F,0x46,0x07,0xA3,0x01,0xE1,0xC0,0xE1,0xE0,0x41,0x70,0x21,0x80,0x10,0xC0,0x08,0x70,0x08,0x38,0x04,0x0C,0x04,0x06,0x04,0x03,0x3C,0x01,0xFC,0x00,0xF0,0x00,0x30,0x00,0x00,
// 't'
0x74,0x08,0x12,0x16,0x01,0x13,
0x30,0x01,0x93,0xFF,0xDC,0x00,0x07,0x00,0x01,0xC0,0x00,0x70,0x00,0x1C,0x00,0x07,0x00,0x01,0xCC,0x07,0x7F,0x01,0xFF,0xC0,0x79,0xB0,0x1C,0x0C,0x04,0x03,0x01,0x00,0xC0,0x40,0x30,0x10,0x0C,0x04,0x03,0x01,0x00,0xC0,0x60,0x60,0x08,0x1F,0xFC,0x07,0xFE,0x00,
// 'u'
0x75,0x09,0x19,0x16,0xFF,0x18,
0x1F,0xF1,0xFF,0x10,0x05,0x00,0x9C,0x07,0xC0,0xCE,0x02,0xE0,0x43,0x01,0x30,0x21,0x80,0x98,0x10,0xC0,0x4C,0x08,0x60,0x26,0x04,0x30,0x13,0x02,0x18,0x09,0x81,0x0C,0x04,0xC0,0x86,0x02,0x60,0x43,0x01,0x30,0x21,0xC0,0x70,0x10,0xE0,0x00,0x10,0x30,0x00,0x08,0x1C,0x00,0x08,0x0F,0x00,0x08,0x03,0xC0,0x08,0x00,0xFC,0x18,0x00,0x1F,0xF8,0x00,0x03,0xF0,0x00,
// 'v'
0x76,0x07,0x19,0x18,0x00,0x19,
0x00,0xC1,0xC0,0x01,0x91,0x98,0x03,0x18,0xC3,0x06,0x04,0x60,0x64,0x02,0x20,0x1F,0x00,0xB0,0x1B,0xC0,0x70,0x0C,0xF0,0x10,0x08,0x38,0x00,0x08,0x0E,0x00,0x04,0x07,0x00,0x04,0x01,0xC0,0x06,0x00,0xE0,0x02,0x00,0x38,0x02,0x00,0x1C,0x01,0x00,0x07,0x01,0x00,0x03,0x81,0x80,0x00,0xE0,0x80,0x00,0x30,0x80,0x00,0x1C,0x40,0x00,0x06,0x40,0x00,0x03,0xE0,0x00,0x00,0xE0,0x00,0x00,0x60,0x00,
// 'w'
0x77,0x07,0x20,0x18,0x00,0x20,
0x00,0x60,0x03,0x80,0x01,0x90,0x06,0x60,0x0E,0x10,0xC6,0x1C,0x38,0x11,0xA6,0x07,0x60,0x11,0x26,0x01,0x78,0x12,0x1C,0x06,0x78,0x0E,0x1C,0x04,0x3C,0x0C,0x08,0x08,0x1C,0x00,0x08,0x10,0x0C,0x00,0x00,0x10,0x0E,0x00,0x00,0x20,0x06,0x00,0x00,0x20,0x07,0x00,0x00,0x40,0x03,0x00,0x00,0x40,0x03,0x80,0x00,0x80,0x03,0x80,0x00,0x80,0x01,0xC0,0x81,0x00,0x01,0xC1,0xC0,0x00,0x00,0xE1,0xC2,0x00,0x00,0xE2,0xE4,0x00,0x00,0x74,0xE4,0x00,0x00,0x7C,0x78,0x00,0x00,0x38,0x78,0x00,0x00,0x30,0x30,0x00,
// 'x'
0x78,0x05,0x19,0x1D,0x00,0x18,
0x00,0x01,0x80,0x00,0x01,0x20,0x00,0x61,0x8C,0x00,0x48,0xC3,0x00,0x44,0x40,0x60,0x43,0x60,0x10,0xC0,0xE0,0x18,0xC0,0x30,0x1C,0xC0,0x00,0x18,0x7C,0x00,0x08,0x1F,0x00,0x08,0x03,0x80,0x08,0x00,0xE0,0x04,0x00,0x38,0x02,0x00,0x0C,0x01,0x80,0x04,0x00,0x60,0x06,0x00,0x10,0x02,0x00,0x07,0x03,0x00,0x00,0x41,0x01,0x00,0x63,0x00,0xC0,0x62,0x00,0xF0,0x63,0x80,0x7C,0x61,0xF0,0x4E,0x60,0x7C,0x63,0xE0,0x0F,0x91,0xE0,0x01,0xF0,0x40,0x00,0x70,0x00,0x00,0x00,0x00,0x00,
// 'y'
0x79,0x06,0x19,0x1B,0x00,0x19,
0x00,0x00,0x60,0x00,0xC0,0x48,0x00,0x80,0x62,0x00,0x88,0x20,0xC0,0x82,0x30,0x11,0x80,0xB0,0x01,0x80,0x30,0x0D,0x80,0x00,0x0C,0xF8,0x00,0x08,0x3E,0x00,0x04,0x07,0x80,0x04,0x01,0xE0,0x04,0x00,0x78,0x04,0x00,0x1C,0x02,0x00,0x0C,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x00,0x06,0x01,0x00,0x0E,0x01,0x00,0x0C,0x01,0x00,0x07,0x01,0x00,0x03,0xC0,0x80,0x01,0xF0,0x80,0x00,0x3E,0x00,0x00,0x0F,0xC0,0x00,0x03,0xE0,0x00,0x00,0x40,0x00,0x00,
// 'z'
0x7A,0x08,0x13,0x17,0xFF,0x12,
0x0C,0x00,0x02,0xFF,0xFC,0xC0,0x01,0x98,0x00,0x23,0x00,0x04,0x60,0x01,0x0C,0x00,0x21,0x80,0x08,0x37,0x01,0x07,0xE0,0x60,0xF8,0x08,0x03,0x01,0x00,0x40,0x70,0x18,0x0D,0x02,0x00,0x20,0xC0,0x04,0x18,0x00,0x86,0x00,0x10,0xC0,0x02,0x10,0x00,0x47,0xFF,0xE8,0xFF,0xFE,0x00,0x01,0x80,
// '{'
0x7B,0x05,0x0D,0x1F,0x01,0x0E,
0x00,0x10,0x0E,0x81,0x04,0x10,0x21,0x81,0x08,0x08,0xC0,0x46,0x0E,0x30,0x71,0x83,0x0C,0x10,0x60,0x84,0x04,0x60,0x23,0x02,0x18,0x08,0xC0,0x47,0x82,0x3C,0x10,0x60,0x83,0x05,0x18,0x38,0xC0,0x46,0x02,0x38,0x11,0xC0,0x87,0x84,0x1F,0xE0,0x7F,0x00,0x30,0x00,0x00,
// '|'
0x7C,0x1E,0x00,0x00,0x00,0x09,
// '}'
0x7D,0x04,0x0E,0x1F,0x00,0x0F,
0x30,0x00,0xBC,0x06,0x0C,0x18,0x08,0x60,0x21,0x80,0x46,0x01,0x1F,0x04,0x7C,0x11,0xB0,0x44,0xC1,0x03,0x04,0x0C,0x0C,0x30,0x10,0xE0,0x43,0x81,0x04,0x04,0x30,0x70,0xC1,0x03,0x04,0x0C,0x10,0xF0,0x46,0xC1,0x18,0x04,0x60,0x11,0x80,0x86,0x04,0x18,0x60,0x7F,0x81,0xF8,0x06,0x00,0x00,
// '~'
0x7E,0x1E,0x00,0x00,0x00,0x09,
// Terminator
0xFF
};

@ -1 +0,0 @@
Subproject commit a06a578356e0e6ad27b5efd1b815f9614a97f1bc