Google_links

вторник, 20 января 2015 г.

LCD Color ili9341 driver 2.2inch 320x240 65k 262k SPI 10Mhz with STM32 ARM

LCD Color ili9341 driver 2.2inch 320x240 65k 262k 
- draw circle and filled circle
- draw line  and line circle
- draw rectangle  and rectanglecircle
- draw square  and  square  circle
- draw image for points
- draw scale voltage, current, etc.

Interface 
- SPI 
- Speed 10Mhz 

Controller  STM32L152 ARM




 * ILI9341  ---------STM32L152 ----STM32F4xx----DESCRIPTION
 *
 * SDO (MISO)-----PB14-------------PF8---------------Output from LCD for SPI. Not used, can be left
 * LED---------------3.3V--------------3.3V--------------Backlight
 * SCK---------------PB1---------------PF7---------------SPI clock
 * SDI (MOSI)------PB15-------------PF9---------------SPI master output
 * WRX or D/C-----PB11-------------PD13-------------Data/Command register
 * RESET------------PB3--------------PD12-------------Reset LCD
 * CS-----------------PB10-------------PC2---------------Chip select for SPI
 * GND--------------GND-------------GND--------------Ground
 * VCC---------------5V----------------5V----------------Positive power supply


MAIN
#include "stm32l1xx.h"
#include "stm32l1xx_conf.h" // add h (ADC, GPIO, TIM и т.д.)
#include "tm_stm32f4_spi.h"
#include "tm_stm32f4_ili9341.h"
#include "tm_stm32f4_fonts.h"
#include "logo.h"
#include <stdio.h>
#include <stdlib.h>


void InitPeriph(void);

void InitPeriph()
{
  RCC->CR |= RCC_CR_HSION; //Включаем тактовый генератор HSI
  while(!(RCC_CR_HSION)); //Ждем его стабилизации
  RCC->CFGR |= RCC_CFGR_SW_HSI; //Выбираем источником тактовой частоты SYSCLK генератор HSI
  RCC->CR &= ~RCC_CR_MSION; //Отключаем генератор MSI. 
  

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //Включаем тактирование порта А
  GPIOA->MODER |= GPIO_MODER_MODER5; //Аналоговый вход/выход линии PA5
  GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR5; //Отключаем подтягивающие резисторы


int main(void) 
      {     
        SystemInit();  //Initialize system 
        TM_ILI9341_Init(); //Initialize ILI9341
        TM_ILI9341_Rotate(TM_ILI9341_Orientation_Landscape_2);  //Rotate LCD for 90 degrees
        //TM_ILI9341_Fill(ILI9341_COLOR_MAGENTA);   //FIll lcd with color
        TM_ILI9341_Fill(ILI9341_COLOR_BLACK);
   
        TM_ILI9341_IMAGE(130, 10, 60, 50, Front3); // x, y, size x, size y, image   // Logo In Volt
        TM_ILI9341_DrawRectangle(310, 220, 280, 20, ILI9341_COLOR_WHITE); // Load
        TM_ILI9341_DrawLine(280, 40, 310, 40, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 60, 310, 60, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 80, 310, 80, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 100, 310, 100, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 120, 310, 120, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 140, 310, 140, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 160, 310, 160, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 180, 310, 180, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 200, 310, 200, ILI9341_COLOR_WHITE);
        TM_ILI9341_DrawLine(280, 220, 310, 220, ILI9341_COLOR_WHITE);
  //TM_ILI9341_Puts(275, 2, "200%", &TM_Font_11x18, ILI9341_COLOR_WHITE,  ILI9341_COLOR_BLACK);
  TM_ILI9341_Puts(275, 223, "Load", &TM_Font_11x18, ILI9341_COLOR_WHITE, ILI9341_COLOR_BLACK);
    
       Draw_Load(19); // тестирование при включении
       Draw_Load(0);  // тестирование при включении

        Init_Voltage_Range();       // нарисовать начальные рамки 
        Draw_Voltage_In_Range(400); // тестирование при включении
        Draw_Voltage_In_Range(0);   // тестирование при включении
        Draw_Voltage_Out_Range(400);// тестирование при включении
        Draw_Voltage_Out_Range(0);  // тестирование при включении
    

      TM_ILI9341_DrawFilledRectangle(20, 180, 26, 220, ILI9341_COLOR_GREEN);// грудусник 1
    TM_ILI9341_Puts(15, 170, "38C", &TM_Font_7x10, ILI9341_COLOR_GREEN, ILI9341_COLOR_BLACK);
    TM_ILI9341_DrawFilledCircle(23, 220, 8, ILI9341_COLOR_RED);  
    TM_ILI9341_Puts(17, 216, "t1", &TM_Font_7x10, ILI9341_COLOR_BLACK,  ILI9341_COLOR_RED);
   
    TM_ILI9341_DrawFilledRectangle(50, 180, 56, 220, ILI9341_COLOR_GREEN);// грудусник 2
    TM_ILI9341_Puts(45, 170, "49C", &TM_Font_7x10, ILI9341_COLOR_GREEN, ILI9341_COLOR_BLACK);
    TM_ILI9341_DrawFilledCircle(53, 220, 8, ILI9341_COLOR_RED); 
    TM_ILI9341_Puts(47, 216, "t2", &TM_Font_7x10, ILI9341_COLOR_BLACK, ILI9341_COLOR_RED);
    
    
    //Put string with black foreground color and blue background with 11x18px font
    TM_ILI9341_Puts(100, 200, " Warning 06", &TM_Font_11x18, ILI9341_COLOR_BLACK, ILI9341_COLOR_RED);
    TM_ILI9341_Puts(100, 222, " Low Input Voltage", &TM_Font_7x10, ILI9341_COLOR_BLACK, ILI9341_COLOR_RED);
    
   while (1) 
    {
      
     Draw_Voltage_In_Range(100);
     Draw_Voltage_Out_Range(220);
     Draw_Voltage_Out_Range(223);
     Draw_Voltage_In_Range(400);
     Draw_Voltage_Out_Range(221);
     Draw_Voltage_In_Range(270); 
     
     Draw_Load(19);
     Draw_Load(5);
     Draw_Load(11);
      
    /*  
     //Rotate LCD for 90 degrees
    TM_ILI9341_Rotate(TM_ILI9341_Orientation_Landscape_2);
    //FIll lcd with color
    TM_ILI9341_Fill(ILI9341_COLOR_MAGENTA);
    //TM_ILI9341_Fill(ILI9341_COLOR_BLACK); 
    //Rotate LCD for 90 degrees
    TM_ILI9341_Rotate(TM_ILI9341_Orientation_Landscape_2);
    //FIll lcd with color
    TM_ILI9341_Fill(ILI9341_COLOR_MAGENTA);
    //Draw white circle
    TM_ILI9341_DrawCircle(60, 60, 40, ILI9341_COLOR_GREEN);
    //Draw red filled circle
    TM_ILI9341_DrawFilledCircle(60, 60, 35, ILI9341_COLOR_RED);
    //Draw blue rectangle
    TM_ILI9341_DrawRectangle(120, 20, 220, 100, ILI9341_COLOR_BLUE);
    //Draw black filled rectangle
    TM_ILI9341_DrawFilledRectangle(130, 30, 210, 90, ILI9341_COLOR_BLACK);
    //Draw line with custom color 0x0005
    TM_ILI9341_DrawLine(10, 120, 310, 120, 0x0005);
    
    //Put string with black foreground color and blue background with 11x18px font
    TM_ILI9341_Puts(60, 130, "Poviste zarplatu", &TM_Font_11x18, ILI9341_COLOR_BLACK, ILI9341_COLOR_BLUE2);
    //Put string with black foreground color and blue background with 11x18px font
    TM_ILI9341_Puts(60, 150, "Grishe Anofrievu", &TM_Font_11x18, ILI9341_COLOR_BLACK, ILI9341_COLOR_BLUE2);
    //Put string with black foreground color and blue background with 11x18px font
    TM_ILI9341_Puts(100, 170, "Pojaluista!", &TM_Font_11x18, ILI9341_COLOR_RED, ILI9341_COLOR_BLUE2);
    //Put string with black foreground color and blue background with 11x18px font
    TM_ILI9341_Puts(40, 190, "I eshe premiyu $500", &TM_Font_11x18, ILI9341_COLOR_GREEN, ILI9341_COLOR_BLUE2);
    //Put string with black foreground color and red background with 11x18px font
    TM_ILI9341_Puts(180, 225, "www.on-line-test.com", &TM_Font_7x10, ILI9341_COLOR_BLACK, ILI9341_COLOR_ORANGE);
    
    TM_ILI9341_Delay(0x00FFFFFF); 
    
    TM_ILI9341_Fill(ILI9341_COLOR_BLACK); 
     
    TM_ILI9341_DrawRange(120, 200, 100, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 99, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 98, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 97, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 96, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 95, ILI9341_COLOR_GREEN); // мое )))
    TM_ILI9341_DrawRange(120, 200, 94, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 93, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 92, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 91, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 90, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 89, ILI9341_COLOR_BLUE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 88, ILI9341_COLOR_RED); // мое )))
    TM_ILI9341_DrawRange(120, 200, 87, ILI9341_COLOR_RED); // мое )))
    TM_ILI9341_DrawRange(120, 200, 86, ILI9341_COLOR_RED); // мое )))
    TM_ILI9341_DrawRange(120, 200, 85, ILI9341_COLOR_RED); // мое )))
    TM_ILI9341_DrawRange(120, 200, 84, ILI9341_COLOR_RED); // мое )))
    TM_ILI9341_DrawRange(120, 200, 83, ILI9341_COLOR_ORANGE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 82, ILI9341_COLOR_ORANGE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 81, ILI9341_COLOR_ORANGE); // мое )))
    TM_ILI9341_DrawRange(120, 200, 80, ILI9341_COLOR_ORANGE); // мое )))
    */
    }
}

tm_stm32f4_spi.c
#include "tm_stm32f4_spi.h"
uint8_t TM_SPI_Send(SPI_TypeDef* SPIx, uint8_t data) {
//Fill output buffer with data
SPIx->DR = data;
//Wait for transmission to complete
while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE));
//Wait for received data to complete
while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE));
//Wait for SPI to be ready
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY));
//Return data from buffer
return SPIx->DR;
}

void TM_SPI_SendMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint8_t *dataIn, uint16_t count) {
uint8_t i;
for (i = 0; i < count; i++) {
dataIn[i] = TM_SPI_Send(SPIx, dataOut[i]);
}
}

void TM_SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint16_t count) {
uint16_t i;
for (i = 0; i < count; i++) {
TM_SPI_Send(SPIx, dataOut[i]);
}
}

void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t *dataIn, uint8_t dummy, uint16_t count) {
uint16_t i;
for (i = 0; i < count; i++) {
dataIn[i] = TM_SPI_Send(SPIx, dummy);
}
}


tm_stm32f4_spi.h
#ifndef TM_SPI_H
#define TM_SPI_H 130
/**
 * Library dependencies
 * - STM32F4xx
 * - STM32F4xx RCC
 * - STM32F4xx GPIO
 * - STM32F4xx SPI
 * - defines.h
 */
/**
 * Includes
 */
#include "stm32l1xx_conf.h"
#include "stm32l1xx.h"
//#include "defines.h"

/**
 * Every SPIx has 2 pins for MISO, MOSI and SCK
 */
typedef enum {
TM_SPI_PinsPack_1,
TM_SPI_PinsPack_2,
TM_SPI_PinsPack_3
} TM_SPI_PinsPack_t;

/**
 * Every SPIx can work in 4 different modes
 */
typedef enum {
TM_SPI_Mode_0, //Clock polarity low, clock phase 1st edge
TM_SPI_Mode_1, //Clock polarity low, clock phase 2nd edge
TM_SPI_Mode_2, //Clock polarity high, clock phase 1st edge
TM_SPI_Mode_3 //Clock polarity high, clock phase 2nd edge
} TM_SPI_Mode_t;

//----- SPI1 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI1_PRESCALER
#define TM_SPI1_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI1_DATASIZE
#define TM_SPI1_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI1_FIRSTBIT
#define TM_SPI1_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI1_MASTERSLAVE
#define TM_SPI1_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI1_MODE
#define TM_SPI1_MODE TM_SPI_Mode_0
#endif
//----- SPI1 options end -------

//----- SPI2 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI2_PRESCALER
#define TM_SPI2_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI2_DATASIZE
#define TM_SPI2_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI2_FIRSTBIT
#define TM_SPI2_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI2_MASTERSLAVE
#define TM_SPI2_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI2_MODE
#define TM_SPI2_MODE TM_SPI_Mode_0
#endif
//----- SPI2 options end -------

//----- SPI3 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI3_PRESCALER
#define TM_SPI3_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI3_DATASIZE
#define TM_SPI3_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI3_FIRSTBIT
#define TM_SPI3_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI3_MASTERSLAVE
#define TM_SPI3_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI3_MODE
#define TM_SPI3_MODE TM_SPI_Mode_0
#endif
//----- SPI3 options end -------

//----- SPI4 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI4_PRESCALER
#define TM_SPI4_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI4_DATASIZE
#define TM_SPI4_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI4_FIRSTBIT
#define TM_SPI4_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI4_MASTERSLAVE
#define TM_SPI4_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI4_MODE
#define TM_SPI4_MODE TM_SPI_Mode_0
#endif
//----- SPI4 options end -------

//----- SPI5 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI5_PRESCALER
#define TM_SPI5_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI5_DATASIZE
#define TM_SPI5_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI5_FIRSTBIT
#define TM_SPI5_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI5_MASTERSLAVE
#define TM_SPI5_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI5_MODE
#define TM_SPI5_MODE TM_SPI_Mode_0
#endif
//----- SPI5 options end -------

//----- SPI6 options start -------
//Options can be overwriten in defines.h file
#ifndef TM_SPI6_PRESCALER
#define TM_SPI6_PRESCALER SPI_BaudRatePrescaler_32
#endif
//Specify datasize
#ifndef TM_SPI6_DATASIZE
#define TM_SPI6_DATASIZE SPI_DataSize_8b
#endif
//Specify which bit is first
#ifndef TM_SPI6_FIRSTBIT
#define TM_SPI6_FIRSTBIT SPI_FirstBit_MSB
#endif
//Mode, master or slave
#ifndef TM_SPI6_MASTERSLAVE
#define TM_SPI6_MASTERSLAVE SPI_Mode_Master
#endif
//Specify mode of operation, clock polarity and clock phase
#ifndef TM_SPI6_MODE
#define TM_SPI6_MODE TM_SPI_Mode_0
#endif
//----- SPI6 options end -------


/**
 * Initialize each SPIx separately
 *
 */
/**
 * Initialize SPIx
 *
 * Parameters:
 * - SPI_TypeDef* SPIx:
 * SPI 1 - 6
 * - TM_SPI_PinsPack_t pinspack: select pins pack to use
 * - TM_SPI_PinsPack_1
 * - TM_SPI_PinsPack_2
 */
extern void TM_SPI_Init(SPI_TypeDef* SPIx, TM_SPI_PinsPack_t pinspack);


/**
 * SPI1 uses pins:
 * - Pins pack 1:
 * - MOSI: PA7 
 * - MISO: PA6
 * - SCK:  PA5
 * - Pins pack 2:
 * - MOSI: PB5
 * - MISO: PB4
 * - SCK:  PB3
 */
extern void TM_SPI1_Init(TM_SPI_PinsPack_t pinspack);

/**
 * SPI2 uses pins:
 * - Pins pack 1:
 * - MOSI: PC3
 * - MISO: PC2
 * - SCK:  PB10
 * - Pins pack 2:
 * - MOSI: PB15
 * - MISO: PB14
 * - SCK:  PB13
 * - Pins pack 3:
 * - MOSI: PI3
 * - MISO: PI2
 * - SCK:  PI0
 */
extern void TM_SPI2_Init(TM_SPI_PinsPack_t pinspack);

/**
 * SPI3 uses pins:
 * - Pins pack 1:
 * - MOSI: PB5
 * - MISO: PB4
 * - SCK:  PB3
 * - Pins pack 2:
 * - MOSI: PC12
 * - MISO: PC11
 * - SCK:  PC10
 */
extern void TM_SPI3_Init(TM_SPI_PinsPack_t pinspack);

/**
 * SPI4 uses pins:
 * - Pins pack 1:
 * - MOSI: PE6
 * - MISO: PE5
 * - SCK:  PE2
 * - Pins pack 2:
 * - MOSI: PE14
 * - MISO: PE13
 * - SCK:  PE12
 */
extern void TM_SPI4_Init(TM_SPI_PinsPack_t pinspack);

/**
 * SPI5 uses pins:
 * - Pins pack 1:
 * - MOSI: PF9
 * - MISO: PF8
 * - SCK:  PF7
 * - Pins pack 2:
 * - MOSI: PF11
 * - MISO: PH7
 * - SCK:  PH6
 */
extern void TM_SPI5_Init(TM_SPI_PinsPack_t pinspack);

/**
 * SPI6 uses pins:
 * - Pins pack 1:
 * - MOSI: PG14
 * - MISO: PG12
 * - SCK:  PG13
 */
extern void TM_SPI6_Init(TM_SPI_PinsPack_t pinspack);

/**
 * Send and receive data over SPI
 *
 * Parameters:
 * - SPI_TypeDef* SPIx: Select SPI which will operate with data
 * - uint8_t data: data to be sent
 *
 * Returns: Data returned from slave
 */
extern uint8_t TM_SPI_Send(SPI_TypeDef* SPIx, uint8_t data);

/**
 * Send and receive multiple data bytes over SPI
 *
 * Parameters:
 * - SPI_TypeDef* SPIx: Select SPI which will operate with data
 * - uint8_t dataOut: pointer to data to be sent out
 * - uint8_t dataIn: pointer to received data
 * - uint8_t count: number of bytes to send
 *
 * No returns
 */
extern void TM_SPI_SendMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint8_t *dataIn, uint16_t count);

/**
 * Write multiple data via SPI
 *
 * Parameters:
 * - SPI_TypeDef* SPIx: Select SPI which will operate with data
 * - uint8_t dataOut: pointer to data to be sent out
 * - uint8_t count: number of bytes to send
 *
 * No returns
 */
extern void TM_SPI_WriteMulti(SPI_TypeDef* SPIx, uint8_t *dataOut, uint16_t count);

/**
 * Send and receive multiple data bytes over SPI
 *
 * Parameters:
 * - SPI_TypeDef* SPIx: Select SPI which will operate with data
 * - uint8_t dataIn: pointer to received data
 * - uint8_t dummy: dummy byte to be sent to SPI
 * - uint8_t count: number of bytes to receive
 *
 * No returns
 */
extern void TM_SPI_ReadMulti(SPI_TypeDef* SPIx, uint8_t *dataIn, uint8_t dummy, uint16_t count);

#endif


tm_stm32f4_ili9341.c
#include "tm_stm32f4_ili9341.h"
#include "tm_stm32f4_fonts.h"
#include "stm32l1xx_conf.h" // подключить все хидеры (ADC, GPIO, TIM и т.д.)
//#include "stm32l1xx_gpio.h"
//#include "stm32l1xx_spi.h" 
#include <stdio.h>
#include <stdlib.h>

   
uint16_t ILI9341_x;
uint16_t ILI9341_y;
TM_ILI9341_Options_t ILI9341_Opts;
uint8_t ILI9341_INT_CalledFromPuts = 0;

void TM_ILI9341_Init() 
  {
   RCC->AHBENR |= RCC_AHBENR_GPIOBEN; //Включить тактирование порта B
   GPIOB->MODER = 0x00000000;
   //^^^  Настроить GPIOB, Pin3 - на выход RESET ILI9341
   GPIOB->MODER |= GPIO_MODER_MODER3_0;     // настроить линию на выход
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_3;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR3;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3;// Настроить скорость порта 40Мгц  
   
   //^^^  Настроить GPIOB, Pin10 - на выход D/C(WRX) ILI9341
   GPIOB->MODER |= GPIO_MODER_MODER10_0;     // настроить линию на выход
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_10;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR10;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;// Настроить скорость порта 40Мгц 
   
   //^^^  Настроить GPIOB, Pin11 - на выход CS ILI9341
   GPIOB->MODER |= GPIO_MODER_MODER11_0;     // настроить линию на выход
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_11;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR11;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11;// Настроить скорость порта 40Мгц 
   
   //Настроить SPI2 выходы 
   //^^^  Настроить GPIOB, Pin12 - просто на выход CS (нужно пробовать и тестировать) 
   //GPIOB->MODER |= GPIO_MODER_MODER12_0;     // настроить линию на выход
   //GPIOB->OTYPER &= ~GPIO_OTYPER_OT_12;      // Push-Pull (двухтактный выход) 
   //GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR12;      // подтягивающие резисторы отключены
   //GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;// Настроить скорость порта 40Мгц
  
   //^^^ Настроить GPIOB, Pin13 на выход SCK (SPI2)^^^
   GPIOB->MODER |= GPIO_MODER_MODER13_1;     // настроить как альтернативный выход AF
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_13;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR13;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13;// Настроить скорость порта 40Мгц
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //настроить(линия AF5) SPI2 на порт GPIOB pin13 
  
   //^^^  Настроить GPIOB, Pin14 - просто на вход MISI - DATA (SPI2)^^^ 
   GPIOB->MODER |= GPIO_MODER_MODER14_1;     // настроить линию на выход
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_14;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR14;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14;// Настроить скорость порта 40Мгц
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); //настроить(линия AF5) SPI2 на порт GPIOB pin14 
   
   //^^^ Настроить GPIOB, Pin15 на выход MOSI - DATA (SPI2)^^^ 
   GPIOB->MODER |= GPIO_MODER_MODER15_1;     // настроить как альтернативный выход AF
   GPIOB->OTYPER &= ~GPIO_OTYPER_OT_15;      // Push-Pull (двухтактный выход) 
   GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR15;      // подтягивающие резисторы отключены
   GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;// Настроить скорость порта 40Мгц
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //настроить(линия AF5) SPI2 на порт GPIOB pin15 
    
   //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;  // вкл. тактирование SPI2
   SPI_InitTypeDef   SPI_InitStructure; // структра для SPI
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;// назначаем контроллер Master`ом
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //настроить линию только на передачу 
   // выбор скорости передачи Fpclk/BaudRatePrescaler = 32MHz/32 = 1000kHz 
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
   // высокий уровень сигнала синхронизации на линии SCK в состоянии ожидания = 1
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        // как бы странно нужно уточнить
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;      // фаза для SCK
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;// первым передаеться страший бит MSB
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // формат данных 8 бит 
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // программное управление выводом NSS
   SPI_InitStructure.SPI_CRCPolynomial = 0; // отключить CRC ПРОВЕРИТЬ!
   SPI_Init(SPI2, &SPI_InitStructure); // через структуру записываем заначения для инициализации
   //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   SPI_Cmd(SPI2, ENABLE); // ВКЛ SPI
   
   
   

        //GPIO_InitTypeDef GPIO_InitDef;
//RCC_AHB1PeriphClockCmd(ILI9341_WRX_CLK, ENABLE);
 
//GPIO_InitDef.GPIO_Pin = ILI9341_WRX_PIN;
//GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
//GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
//GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
//GPIO_Init(ILI9341_WRX_PORT, &GPIO_InitDef);


//RCC_AHB1PeriphClockCmd(ILI9341_CS_CLK, ENABLE);
//GPIO_InitDef.GPIO_Pin = ILI9341_CS_PIN;
//GPIO_Init(ILI9341_CS_PORT, &GPIO_InitDef);
//RCC_AHB1PeriphClockCmd(ILI9341_RST_CLK, ENABLE);
//GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_UP;
//GPIO_InitDef.GPIO_Pin = ILI9341_RST_PIN;
//GPIO_Init(ILI9341_RST_PORT, &GPIO_InitDef);

ILI9341_CS_SET;
//TM_SPI_Init(ILI9341_SPI, ILI9341_SPI_PINS);
TM_ILI9341_InitLCD();
ILI9341_x = ILI9341_y = 0;
ILI9341_Opts.Width = ILI9341_WIDTH;
ILI9341_Opts.Height = ILI9341_HEIGHT;
ILI9341_Opts.orientation = TM_ILI9341_Portrait;
TM_ILI9341_Fill(ILI9341_COLOR_WHITE);
}

void TM_ILI9341_InitLCD(void) {
ILI9341_RST_RESET;         // с раcкоментил
        TM_ILI9341_Delay(2000000); // я добавил 
ILI9341_RST_SET;
TM_ILI9341_SendCommand(ILI9341_RESET);
TM_ILI9341_Delay(2000000);
TM_ILI9341_SendCommand(ILI9341_POWERA);
TM_ILI9341_SendData(0x39);
TM_ILI9341_SendData(0x2C);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x34);
TM_ILI9341_SendData(0x02);
TM_ILI9341_SendCommand(ILI9341_POWERB);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0xC1);
TM_ILI9341_SendData(0x30);
TM_ILI9341_SendCommand(ILI9341_DTCA);
TM_ILI9341_SendData(0x85);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x78);
TM_ILI9341_SendCommand(ILI9341_DTCB);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendCommand(ILI9341_POWER_SEQ);
TM_ILI9341_SendData(0x64);
TM_ILI9341_SendData(0x03);
TM_ILI9341_SendData(0x12);
TM_ILI9341_SendData(0x81);
TM_ILI9341_SendCommand(ILI9341_PRC);
TM_ILI9341_SendData(0x20);
TM_ILI9341_SendCommand(ILI9341_POWER1);
TM_ILI9341_SendData(0x23);
TM_ILI9341_SendCommand(ILI9341_POWER2);
TM_ILI9341_SendData(0x10);
TM_ILI9341_SendCommand(ILI9341_VCOM1);
TM_ILI9341_SendData(0x3E);
TM_ILI9341_SendData(0x28);
TM_ILI9341_SendCommand(ILI9341_VCOM2);
TM_ILI9341_SendData(0x86);
TM_ILI9341_SendCommand(ILI9341_MAC);
TM_ILI9341_SendData(0x48);
TM_ILI9341_SendCommand(ILI9341_PIXEL_FORMAT);
TM_ILI9341_SendData(0x55);
TM_ILI9341_SendCommand(ILI9341_FRC);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x18);
TM_ILI9341_SendCommand(ILI9341_DFC);
TM_ILI9341_SendData(0x08);
TM_ILI9341_SendData(0x82);
TM_ILI9341_SendData(0x27);
TM_ILI9341_SendCommand(ILI9341_3GAMMA_EN);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendCommand(ILI9341_COLUMN_ADDR);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0xEF);
TM_ILI9341_SendCommand(ILI9341_PAGE_ADDR);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x01);
TM_ILI9341_SendData(0x3F);
TM_ILI9341_SendCommand(ILI9341_GAMMA);
TM_ILI9341_SendData(0x01);
TM_ILI9341_SendCommand(ILI9341_PGAMMA);
TM_ILI9341_SendData(0x0F);
TM_ILI9341_SendData(0x31);
TM_ILI9341_SendData(0x2B);
TM_ILI9341_SendData(0x0C);
TM_ILI9341_SendData(0x0E);
TM_ILI9341_SendData(0x08);
TM_ILI9341_SendData(0x4E);
TM_ILI9341_SendData(0xF1);
TM_ILI9341_SendData(0x37);
TM_ILI9341_SendData(0x07);
TM_ILI9341_SendData(0x10);
TM_ILI9341_SendData(0x03);
TM_ILI9341_SendData(0x0E);
TM_ILI9341_SendData(0x09);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendCommand(ILI9341_NGAMMA);
TM_ILI9341_SendData(0x00);
TM_ILI9341_SendData(0x0E);
TM_ILI9341_SendData(0x14);
TM_ILI9341_SendData(0x03);
TM_ILI9341_SendData(0x11);
TM_ILI9341_SendData(0x07);
TM_ILI9341_SendData(0x31);
TM_ILI9341_SendData(0xC1);
TM_ILI9341_SendData(0x48);
TM_ILI9341_SendData(0x08);
TM_ILI9341_SendData(0x0F);
TM_ILI9341_SendData(0x0C);
TM_ILI9341_SendData(0x31);
TM_ILI9341_SendData(0x36);
TM_ILI9341_SendData(0x0F);
TM_ILI9341_SendCommand(ILI9341_SLEEP_OUT);

TM_ILI9341_Delay(1000000);

TM_ILI9341_SendCommand(ILI9341_DISPLAY_ON);
TM_ILI9341_SendCommand(ILI9341_GRAM);
}


void TM_ILI9341_SendCommand(uint8_t data) {
ILI9341_WRX_RESET;
ILI9341_CS_RESET;
TM_SPI_Send(ILI9341_SPI, data);
ILI9341_CS_SET;
}

void TM_ILI9341_SendData(uint8_t data) {
ILI9341_WRX_SET;
ILI9341_CS_RESET;
TM_SPI_Send(ILI9341_SPI, data);
ILI9341_CS_SET;
}

void TM_ILI9341_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
TM_ILI9341_SetCursorPosition(x, y, x, y);

TM_ILI9341_SendCommand(ILI9341_GRAM);
TM_ILI9341_SendData(color >> 8);
TM_ILI9341_SendData(color & 0xFF);
}


void TM_ILI9341_SetCursorPosition(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
TM_ILI9341_SendCommand(ILI9341_COLUMN_ADDR);
TM_ILI9341_SendData(x1 >> 8);
TM_ILI9341_SendData(x1 & 0xFF);
TM_ILI9341_SendData(x2 >> 8);
TM_ILI9341_SendData(x2 & 0xFF);

TM_ILI9341_SendCommand(ILI9341_PAGE_ADDR);
TM_ILI9341_SendData(y1 >> 8);
TM_ILI9341_SendData(y1 & 0xFF);
TM_ILI9341_SendData(y2 >> 8);
TM_ILI9341_SendData(y2 & 0xFF);
}

void TM_ILI9341_Fill(uint16_t color) {
unsigned int n, i, j;
i = color >> 8;
j = color & 0xFF;
TM_ILI9341_SetCursorPosition(0, 0, ILI9341_Opts.Width - 1, ILI9341_Opts.Height - 1);

TM_ILI9341_SendCommand(ILI9341_GRAM);

for (n = 0; n < ILI9341_PIXEL; n++) {
TM_ILI9341_SendData(i);
TM_ILI9341_SendData(j);
}
}

void TM_ILI9341_IMAGE(uint16_t x11, uint16_t y11, uint16_t size_x, uint16_t size_y, uint16_t *color) 
    {
     unsigned int n, m, i, j, dt;
        
    // total_pixel = x11 * y11; // total_pixel
     for(m = 0; m < size_y; m++)
       {
        TM_ILI9341_SetCursorPosition(x11, y11 + m, ILI9341_Opts.Width - 1, ILI9341_Opts.Height - 1);
TM_ILI9341_SendCommand(ILI9341_GRAM);
        
for (n = 0; n < size_x; n++) 
          {
           i = color[n+dt] >> 8;
  j = color[n+dt] & 0xFF;
           TM_ILI9341_SendData(i);
           TM_ILI9341_SendData(j);          
 }
        dt += size_x;
        
       }
    }


void TM_ILI9341_Delay(volatile unsigned int delay) {
for (; delay != 0; delay--); 
}

void TM_ILI9341_Rotate(TM_ILI9341_Orientation_t orientation) {
TM_ILI9341_SendCommand(ILI9341_MAC);
if (orientation == TM_ILI9341_Orientation_Portrait_1) {
TM_ILI9341_SendData(0x58);
} else if (orientation == TM_ILI9341_Orientation_Portrait_2) {
TM_ILI9341_SendData(0x88);
} else if (orientation == TM_ILI9341_Orientation_Landscape_1) {
TM_ILI9341_SendData(0x28);
} else if (orientation == TM_ILI9341_Orientation_Landscape_2) {
TM_ILI9341_SendData(0xE8);
}
if (orientation == TM_ILI9341_Orientation_Portrait_1 || orientation == TM_ILI9341_Orientation_Portrait_2) {
ILI9341_Opts.Width = ILI9341_WIDTH;
ILI9341_Opts.Height = ILI9341_HEIGHT;
ILI9341_Opts.orientation = TM_ILI9341_Portrait;
} else {
ILI9341_Opts.Width = ILI9341_HEIGHT;
ILI9341_Opts.Height = ILI9341_WIDTH;
ILI9341_Opts.orientation = TM_ILI9341_Landscape;
}
}

void TM_ILI9341_Puts(uint16_t x, uint16_t y, char *str, TM_FontDef_t *font, uint16_t foreground, uint16_t background) {
uint16_t startX = x;
/* Set X and Y coordinates */
ILI9341_x = x;
ILI9341_y = y;
while (*str) {
//New line
if (*str == '\n') {
ILI9341_y += font->FontHeight + 1;
//if after \n is also \r, than go to the left of the screen
if (*(str + 1) == '\r') {
ILI9341_x = 0;
str++;
} else {
ILI9341_x = startX;
}
str++;
continue;
} else if (*str == '\r') {
str++;
continue;
}
TM_ILI9341_Putc(ILI9341_x, ILI9341_y, *str++, font, foreground, background);
}
}

void TM_ILI9341_GetStringSize(char *str, TM_FontDef_t *font, uint16_t *width, uint16_t *height) {
uint16_t w = 0;
*height = font->FontHeight;
while (*str++) {
w += font->FontWidth;
}
*width = w;
}

void TM_ILI9341_Putc(uint16_t x, uint16_t y, char c, TM_FontDef_t *font, uint16_t foreground, uint16_t background) {
uint32_t i, b, j;
/* Set coordinates */
ILI9341_x = x;
ILI9341_y = y;
if ((ILI9341_x + font->FontWidth) > ILI9341_Opts.Width) {
//If at the end of a line of display, go to new line and set x to 0 position
ILI9341_y += font->FontHeight;
ILI9341_x = 0;
}
for (i = 0; i < font->FontHeight; i++) {
b = font->data[(c - 32) * font->FontHeight + i];
for (j = 0; j < font->FontWidth; j++) {
if ((b << j) & 0x8000) {
TM_ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), foreground);
} else {
TM_ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), background);
}
}
}
ILI9341_x += font->FontWidth;
}


void TM_ILI9341_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
/* Code by dewoller: https://github.com/dewoller */
int16_t dx, dy, sx, sy, err, e2; 
/* Check for overflow */
if (x0 >= ILI9341_Opts.Width) {
x0 = ILI9341_Opts.Width - 1;
}
if (x1 >= ILI9341_Opts.Width) {
x1 = ILI9341_Opts.Width - 1;
}
if (y0 >= ILI9341_Opts.Height) {
y0 = ILI9341_Opts.Height - 1;
}
if (y1 >= ILI9341_Opts.Height) {
y1 = ILI9341_Opts.Height - 1;
}
dx = (x0 < x1) ? (x1 - x0) : (x0 - x1); 
dy = (y0 < y1) ? (y1 - y0) : (y0 - y1); 
sx = (x0 < x1) ? 1 : -1; 
sy = (y0 < y1) ? 1 : -1; 
err = ((dx > dy) ? dx : -dy) / 2; 

while (1) {
TM_ILI9341_DrawPixel(x0, y0, color); 
if (x0 == x1 && y0 == y1) {
break;
}
e2 = err; 
if (e2 > -dx) {
err -= dy;
x0 += sx;
if (e2 < dy) {
err += dx;
y0 += sy;
}
}

void TM_ILI9341_DrawRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
TM_ILI9341_DrawLine(x0, y0, x1, y0, color); //Top
TM_ILI9341_DrawLine(x0, y0, x0, y1, color); //Left
TM_ILI9341_DrawLine(x1, y0, x1, y1, color); //Right
TM_ILI9341_DrawLine(x0, y1, x1, y1, color); //Bottom
}

void TM_ILI9341_DrawFilledRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
for (; y0 < y1; y0++) {
TM_ILI9341_DrawLine(x0, y0, x1, y0, color);
}
}

void TM_ILI9341_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
int16_t f = 1 - r;
int16_t ddF_x = 1;
int16_t ddF_y = -2 * r;
int16_t x = 0;
int16_t y = r;

    TM_ILI9341_DrawPixel(x0, y0 + r, color);
    TM_ILI9341_DrawPixel(x0, y0 - r, color);
    TM_ILI9341_DrawPixel(x0 + r, y0, color);
    TM_ILI9341_DrawPixel(x0 - r, y0, color);

    while (x < y) {
        if (f >= 0) {
            y--;
            ddF_y += 2;
            f += ddF_y;
        }
        x++;
        ddF_x += 2;
        f += ddF_x;

        TM_ILI9341_DrawPixel(x0 + x, y0 + y, color);
        TM_ILI9341_DrawPixel(x0 - x, y0 + y, color);
        TM_ILI9341_DrawPixel(x0 + x, y0 - y, color);
        TM_ILI9341_DrawPixel(x0 - x, y0 - y, color);

        TM_ILI9341_DrawPixel(x0 + y, y0 + x, color);
        TM_ILI9341_DrawPixel(x0 - y, y0 + x, color);
        TM_ILI9341_DrawPixel(x0 + y, y0 - x, color);
        TM_ILI9341_DrawPixel(x0 - y, y0 - x, color);
    }
}


void TM_ILI9341_DrawRange(int16_t X1, int16_t Y1, int16_t R, uint16_t color) 
{
  int x = 0;
   int y = R-1;
   int delta = 1 - 2 * R;
   int error = 0;
   while (y >= 0)
   {
       //TM_ILI9341_DrawPixel(X1 + x, Y1 + y, color);
       //TM_ILI9341_DrawPixel(X1 + x, Y1 - y, color);
       //TM_ILI9341_DrawPixel(X1 - x, Y1 + y, color);
       TM_ILI9341_DrawPixel(X1 - y, Y1 - x, color);
       TM_ILI9341_Delay(0x00000FFF); 
       
       error = 2 * (delta + y) - 1;
       if ((delta < 0) && (error <= 0))
          {
           delta += 2 * ++x + 1;
           continue;
          }
       error = 2 * (delta - x) - 1;
       if ((delta > 0) && (error > 0))
          {
           delta += 1 - 2 * --y;
           continue;
          }
       x++;
       delta += 2 * (x - y);
       y--;
   }
  
   x = 0;
   y = R;
   delta = 1 - 2 * R;
   error = 0;
   while (y >= 0)
   {
       //TM_ILI9341_DrawPixel(X1 + x, Y1 + y, color);
       TM_ILI9341_DrawPixel(X1 + x, Y1 - y, color);
       //TM_ILI9341_DrawPixel(X1 - x, Y1 + y, color);
       //TM_ILI9341_DrawPixel(X1 - x, Y1 - y, color);
       TM_ILI9341_Delay(0x00000FFF); 
       error = 2 * (delta + y) - 1;
       if ((delta < 0) && (error <= 0))
          {
           delta += 2 * ++x + 1;
           continue;
          }
       error = 2 * (delta - x) - 1;
       if ((delta > 0) && (error > 0))
          {
           delta += 1 - 2 * --y;
           continue;
          }
       x++;
       delta += 2 * (x - y);
       y--;
   }
  
  /*
int16_t f = 1 - r;
int16_t ddF_x = 1;
int16_t ddF_y = -2 * r;
int16_t x = 0;
int16_t y = r;

   
    TM_ILI9341_DrawPixel(x0 - r, y0, color);

    while(1) //(x < y) 
    {
        if (f >= 0) 
           {
            y--;
            ddF_y += 2;
            f += ddF_y;
           }
        x++;
        ddF_x += 2;
        f += ddF_x;


        TM_ILI9341_DrawPixel(x0 - y, y0 - x, color);
    }
  */
}

void TM_ILI9341_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
int16_t f = 1 - r;
int16_t ddF_x = 1;
int16_t ddF_y = -2 * r;
int16_t x = 0;
int16_t y = r;

    TM_ILI9341_DrawPixel(x0, y0 + r, color);
    TM_ILI9341_DrawPixel(x0, y0 - r, color);
    TM_ILI9341_DrawPixel(x0 + r, y0, color);
    TM_ILI9341_DrawPixel(x0 - r, y0, color);
    TM_ILI9341_DrawLine(x0 - r, y0, x0 + r, y0, color);

    while (x < y) {
        if (f >= 0) {
            y--;
            ddF_y += 2;
            f += ddF_y;
        }
        x++;
        ddF_x += 2;
        f += ddF_x;

        TM_ILI9341_DrawLine(x0 - x, y0 + y, x0 + x, y0 + y, color);
        TM_ILI9341_DrawLine(x0 + x, y0 - y, x0 - x, y0 - y, color);

        TM_ILI9341_DrawLine(x0 + y, y0 + x, x0 - y, y0 + x, color);
        TM_ILI9341_DrawLine(x0 + y, y0 - x, x0 - y, y0 - x, color);
    }
}


/******************************************************************************
   Load Current 0-200% Value 0 - 19
******************************************************************************/
void Draw_Load(int16_t step0)
 if(step0 >= 20) step0 = 20;     // перестраховка,если знач. больше 20, то присвоить ему 20
 int procent;
 char strLoad[4];  

 if(step0 < 19) TM_ILI9341_DrawFilledRectangle(282, 22, 308, 30, ILI9341_COLOR_BLACK);// затереть 19
 if(step0 < 18) TM_ILI9341_DrawFilledRectangle(282, 31, 308, 39, ILI9341_COLOR_BLACK);// затереть 18     
 if(step0 < 17) TM_ILI9341_DrawFilledRectangle(282, 42, 308, 50, ILI9341_COLOR_BLACK);// затереть 17    
 if(step0 < 16) TM_ILI9341_DrawFilledRectangle(282, 51, 308, 59, ILI9341_COLOR_BLACK);// затереть 16    
 if(step0 < 15) TM_ILI9341_DrawFilledRectangle(282, 62, 308, 70, ILI9341_COLOR_BLACK);// затереть 15   
 if(step0 < 14) TM_ILI9341_DrawFilledRectangle(282, 71, 308, 79, ILI9341_COLOR_BLACK);// затереть 14
 if(step0 < 13) TM_ILI9341_DrawFilledRectangle(282, 82, 308, 90, ILI9341_COLOR_BLACK);// затереть 13    
 if(step0 < 12) TM_ILI9341_DrawFilledRectangle(282, 91, 308, 99, ILI9341_COLOR_BLACK);// затереть 12    
 if(step0 < 11) TM_ILI9341_DrawFilledRectangle(282, 102, 308, 110, ILI9341_COLOR_BLACK);// затереть 11     
 if(step0 < 10) TM_ILI9341_DrawFilledRectangle(282, 111, 308, 119, ILI9341_COLOR_BLACK);// затереть 10   
 if(step0 < 9) TM_ILI9341_DrawFilledRectangle(282, 122, 308, 130, ILI9341_COLOR_BLACK);// затереть 9 
 if(step0 < 8) TM_ILI9341_DrawFilledRectangle(282, 131, 308, 139, ILI9341_COLOR_BLACK);// затереть 8    
 if(step0 < 7) TM_ILI9341_DrawFilledRectangle(282, 142, 308, 150, ILI9341_COLOR_BLACK);// затереть 7    
 if(step0 < 6) TM_ILI9341_DrawFilledRectangle(282, 151, 308, 159, ILI9341_COLOR_BLACK);// затереть 6 
 if(step0 < 5) TM_ILI9341_DrawFilledRectangle(282, 162, 308, 170, ILI9341_COLOR_BLACK);// затереть 5   
 if(step0 < 4) TM_ILI9341_DrawFilledRectangle(282, 171, 308, 179, ILI9341_COLOR_BLACK);// затереть 4    
 if(step0 < 3) TM_ILI9341_DrawFilledRectangle(282, 162, 308, 170, ILI9341_COLOR_BLACK);// затереть 3     
 if(step0 < 2) TM_ILI9341_DrawFilledRectangle(282, 191, 308, 199, ILI9341_COLOR_BLACK);// затереть 2    
 if(step0 < 1) TM_ILI9341_DrawFilledRectangle(282, 202, 308, 210, ILI9341_COLOR_BLACK);// затереть 1    
 if(step0 < 0) TM_ILI9341_DrawFilledRectangle(282, 211, 308, 219, ILI9341_COLOR_BLACK);// затереть  0

 if(step0 >= 0) TM_ILI9341_DrawFilledRectangle(282, 211, 308, 219, ILI9341_COLOR_GREEN);// засветить 0
 if(step0 >= 1) TM_ILI9341_DrawFilledRectangle(282, 202, 308, 210, ILI9341_COLOR_GREEN);// засветить 1
 if(step0 >= 2) TM_ILI9341_DrawFilledRectangle(282, 191, 308, 199, ILI9341_COLOR_GREEN);// засветить 2
 if(step0 >= 3) TM_ILI9341_DrawFilledRectangle(282, 182, 308, 190, ILI9341_COLOR_GREEN);// засветить 3
 if(step0 >= 4) TM_ILI9341_DrawFilledRectangle(282, 171, 308, 179, ILI9341_COLOR_GREEN);// засветить 4
 if(step0 >= 5) TM_ILI9341_DrawFilledRectangle(282, 162, 308, 170, ILI9341_COLOR_GREEN);// засветить 5
 if(step0 >= 6) TM_ILI9341_DrawFilledRectangle(282, 151, 308, 159, ILI9341_COLOR_GREEN);// засветить 6 
 if(step0 >= 7) TM_ILI9341_DrawFilledRectangle(282, 142, 308, 150, ILI9341_COLOR_GREEN);// засветить 7
 if(step0 >= 8) TM_ILI9341_DrawFilledRectangle(282, 131, 308, 139, ILI9341_COLOR_GREEN);// засветить 8
 if(step0 >= 9) TM_ILI9341_DrawFilledRectangle(282, 122, 308, 130, ILI9341_COLOR_GREEN);// засветить 9 // зеленый диапазон 0- 100% 
 if(step0 >= 10) TM_ILI9341_DrawFilledRectangle(282, 111, 308, 119, ILI9341_COLOR_ORANGE);// засветить 10
 if(step0 >= 11) TM_ILI9341_DrawFilledRectangle(282, 102, 308, 110, ILI9341_COLOR_ORANGE);// засветить 11
 if(step0 >= 12) TM_ILI9341_DrawFilledRectangle(282, 91, 308, 99, ILI9341_COLOR_ORANGE);// засветить 12
 if(step0 >= 13) TM_ILI9341_DrawFilledRectangle(282, 82, 308, 90, ILI9341_COLOR_ORANGE);// засветить 13
 if(step0 >= 14) TM_ILI9341_DrawFilledRectangle(282, 71, 308, 79, ILI9341_COLOR_ORANGE);// засветить 14}
 if(step0 >= 15) TM_ILI9341_DrawFilledRectangle(282, 62, 308, 70, ILI9341_COLOR_RED);// засветить 15
 if(step0 >= 16) TM_ILI9341_DrawFilledRectangle(282, 51, 308, 59, ILI9341_COLOR_RED);// засветить 16
 if(step0 >= 17) TM_ILI9341_DrawFilledRectangle(282, 42, 308, 50, ILI9341_COLOR_RED);// засветить 17
 if(step0 >= 18) TM_ILI9341_DrawFilledRectangle(282, 31, 308, 39, ILI9341_COLOR_RED);// засветить 18
 if(step0 >= 19) TM_ILI9341_DrawFilledRectangle(282, 22, 308, 30, ILI9341_COLOR_RED);// засветить 19

 procent = (step0+1)*10;
 sprintf(strLoad, "%03d%", procent);
 TM_ILI9341_Puts(275, 2, strLoad, &TM_Font_11x18, ILI9341_COLOR_WHITE, ILI9341_COLOR_BLACK); // интикация в %
}



/******************************************************************************
  Voltage Output 0-400V |||||||||||| Нарисовать начальные рамкм      
******************************************************************************/
void Init_Voltage_Range(void) 
{
   TM_ILI9341_Puts(10, 60, "Input Voltage", &TM_Font_7x10, ILI9341_COLOR_YELLOW, ILI9341_COLOR_BLACK); 
   TM_ILI9341_DrawRectangle(207, 100, 4, 70, ILI9341_COLOR_YELLOW);
   
   TM_ILI9341_Puts(10, 110, "Output Voltage", &TM_Font_7x10, ILI9341_COLOR_GREEN, ILI9341_COLOR_BLACK);
   TM_ILI9341_DrawRectangle(207, 150, 4, 120, ILI9341_COLOR_GREEN);
}


 /******************************************************************************
   Voltage Input 0-400V  ||||||||||||  
******************************************************************************/
 void Draw_Voltage_In_Range(int16_t volt1)
 {
   char strVolt1[4];   
   sprintf(strVolt1, "%03dV", volt1); 
   TM_ILI9341_Puts(213, 78, strVolt1, &TM_Font_11x18, ILI9341_COLOR_YELLOW, ILI9341_COLOR_BLACK);
   if(volt1 > 400) volt1 = 399; // если привешено 400V
   volt1 = volt1/2; // отмаштабировать под шкалу
   Draw_Voltage(6, 72, 26, volt1, ILI9341_COLOR_YELLOW); // x, y, h, % - шкала напряжения
 }
   
/******************************************************************************
   Voltage Output 0-400V  |||||||||||| 
******************************************************************************/
 void Draw_Voltage_Out_Range(int16_t volt2)
 {
   char strVolt2[4];   
   sprintf(strVolt2, "%03dV", volt2); 
   TM_ILI9341_Puts(213, 128, strVolt2, &TM_Font_11x18, ILI9341_COLOR_GREEN, ILI9341_COLOR_BLACK);
   if(volt2 > 400) volt2 = 399; // если привешено 400V
   volt2 = volt2/2; // отмаштабировать под шкалу
   Draw_Voltage(6, 122, 26, volt2, ILI9341_COLOR_GREEN2); // x, y, h, % - шкала напряжения
 }

/******************************************************************************
   Шкала ||||||||||||
   x22, y22 - координаты верхней левой точки шкалы
   h22 - высота шкалы
   Value - значение шкалы 0 - 199
******************************************************************************/
 void Draw_Voltage(int16_t x22, int16_t y22, int16_t h22, int16_t value22, uint16_t color22)
    {
     int16_t j1, y10;
     y10 = y22 + h22; // высота столбика 
     
     for(j1 = 199; j1 > value22; j1--)
        {
         TM_ILI9341_DrawLine(x22+j1, y22, x22+j1, y10, ILI9341_COLOR_BLACK);
        } 
     
     for(j1 = 0; j1 < value22; j1++)
        {
         TM_ILI9341_DrawLine(x22+j1, y22, x22+j1, y10, color22);
        }   
    }


tm_stm32f4_ili9341.h
#ifndef TM_ILI9341_H
#define TM_ILI9341_H 100
/**
 * Library dependencies
 * - STM32F4xx
 * - STM32F4xx RCC
 * - STM32F4xx GPIO
 * - defines.h
 * - TM SPI
 * - TM FONTS
 */

/**
 * Includes
 */
#include "stm32l1xx.h"
#include "stm32l1xx_conf.h" // подключить все хидеры (ADC, GPIO, TIM и т.д.)   
//#include "defines.h"
#include "tm_stm32f4_spi.h"
#include "tm_stm32f4_fonts.h"

//SPI used
//This SPI pins are used on STM32F429 Discovery board
//#ifndef ILI9341_SPI
//#define ILI9341_SPI SPI5
//#define ILI9341_SPI_PINS TM_SPI_PinsPack_1
//#endif

//This SPI pins are used on STM32L152 Discovery board
#ifndef ILI9341_SPI
#define ILI9341_SPI SPI2
//#define ILI9341_SPI_PINS TM_SPI_PinsPack_1 // тут вопрос?????
#endif

//#ifndef ILI9341_CS_PIN
//This pin is used on STM32F429 discovery board
//#define ILI9341_CS_CLK RCC_AHB1Periph_GPIOC
//#define ILI9341_CS_PORT GPIOC
//#define ILI9341_CS_PIN GPIO_Pin_2
//#endif

#ifndef ILI9341_CS_PIN
//This pin is used on STM32L152 discovery board
//#define ILI9341_CS_CLK RCC_AHB1Periph_GPIOB
#define ILI9341_CS_PORT GPIOB
#define ILI9341_CS_PIN GPIO_Pin_10
#endif

//#ifndef ILI9341_WRX_PIN
//This pin is used on STM32F429 discovery board
//#define ILI9341_WRX_CLK RCC_AHB1Periph_GPIOD
//#define ILI9341_WRX_PORT GPIOD
//#define ILI9341_WRX_PIN GPIO_Pin_13
//#endif

#ifndef ILI9341_WRX_PIN
//This pin is used on STM32L152 discovery board
//#define ILI9341_WRX_CLK RCC_AHB1Periph_GPIOD
#define ILI9341_WRX_PORT GPIOB
#define ILI9341_WRX_PIN GPIO_Pin_11
#endif

//Reset pin
//#ifndef ILI9341_RST_PIN
//Reset pin
//#define ILI9341_RST_CLK RCC_AHB1Periph_GPIOD
//#define ILI9341_RST_PORT GPIOD
//#define ILI9341_RST_PIN GPIO_Pin_12
//#endif

//Reset pin
#ifndef ILI9341_RST_PIN
//Reset pin  is used on STM32L152 discovery board
//#define ILI9341_RST_CLK RCC_AHB1Periph_GPIOD
#define ILI9341_RST_PORT GPIOB
#define ILI9341_RST_PIN GPIO_Pin_3
#endif

#define ILI9341_RST_SET GPIO_SetBits(ILI9341_RST_PORT, ILI9341_RST_PIN)
#define ILI9341_RST_RESET GPIO_ResetBits(ILI9341_RST_PORT, ILI9341_RST_PIN)
#define ILI9341_CS_SET GPIO_SetBits(ILI9341_CS_PORT, ILI9341_CS_PIN)
#define ILI9341_CS_RESET GPIO_ResetBits(ILI9341_CS_PORT, ILI9341_CS_PIN)
#define ILI9341_WRX_SET GPIO_SetBits(ILI9341_WRX_PORT, ILI9341_WRX_PIN)
#define ILI9341_WRX_RESET GPIO_ResetBits(ILI9341_WRX_PORT, ILI9341_WRX_PIN)

//LCD settings
#define ILI9341_WIDTH 240
#define ILI9341_HEIGHT 320
#define ILI9341_PIXEL 76800

//Colors
#define ILI9341_COLOR_WHITE 0xFFFF
#define ILI9341_COLOR_BLACK 0x0000
#define ILI9341_COLOR_RED 0xF800
#define ILI9341_COLOR_GREEN 0x07E0
#define ILI9341_COLOR_GREEN2 0xB723
#define ILI9341_COLOR_GREEN3 0x8000
#define ILI9341_COLOR_BLUE 0x001F
#define ILI9341_COLOR_BLUE2 0x051D
#define ILI9341_COLOR_YELLOW 0xFFE0
#define ILI9341_COLOR_ORANGE 0xFBE4
#define ILI9341_COLOR_CYAN 0x07FF
#define ILI9341_COLOR_MAGENTA 0xA254
#define ILI9341_COLOR_GRAY 0x7BEF //1111 0111 1101 1110
#define ILI9341_COLOR_BROWN 0xBBCA

//Commands
#define ILI9341_RESET 0x01
#define ILI9341_SLEEP_OUT 0x11
#define ILI9341_GAMMA 0x26
#define ILI9341_DISPLAY_OFF 0x28
#define ILI9341_DISPLAY_ON 0x29
#define ILI9341_COLUMN_ADDR 0x2A
#define ILI9341_PAGE_ADDR 0x2B
#define ILI9341_GRAM 0x2C
#define ILI9341_MAC 0x36
#define ILI9341_PIXEL_FORMAT 0x3A
#define ILI9341_WDB 0x51
#define ILI9341_WCD 0x53
#define ILI9341_RGB_INTERFACE 0xB0
#define ILI9341_FRC 0xB1
#define ILI9341_BPC 0xB5
#define ILI9341_DFC 0xB6
#define ILI9341_POWER1 0xC0
#define ILI9341_POWER2 0xC1
#define ILI9341_VCOM1 0xC5
#define ILI9341_VCOM2 0xC7
#define ILI9341_POWERA 0xCB
#define ILI9341_POWERB 0xCF
#define ILI9341_PGAMMA 0xE0
#define ILI9341_NGAMMA 0xE1
#define ILI9341_DTCA 0xE8
#define ILI9341_DTCB 0xEA
#define ILI9341_POWER_SEQ 0xED
#define ILI9341_3GAMMA_EN 0xF2
#define ILI9341_INTERFACE 0xF6
#define ILI9341_PRC 0xF7

/**
 * Public enum
 *
 * Select orientation for LCD
 */
typedef enum {
TM_ILI9341_Orientation_Portrait_1,
TM_ILI9341_Orientation_Portrait_2,
TM_ILI9341_Orientation_Landscape_1,
TM_ILI9341_Orientation_Landscape_2
} TM_ILI9341_Orientation_t;

/**
 * Orientation
 * Used private
 */
typedef enum {
TM_ILI9341_Landscape,
TM_ILI9341_Portrait
} TM_ILI9341_Orientation;

/**
 * LCD options
 * Used private
 */
typedef struct {
uint16_t Width;
uint16_t Height;
TM_ILI9341_Orientation orientation; // 1 = portrait; 0 = landscape
} TM_ILI9341_Options_t;


/**
 * Select font
 */
extern TM_FontDef_t TM_Font_7x10;
extern TM_FontDef_t TM_Font_11x18;
extern TM_FontDef_t TM_Font_16x26;

/**
 * Initialize ILI9341 LCD
 *
 */
extern void TM_ILI9341_Init(void);

/**
 * Init LCD pins
 *
 * Called private
 */
extern void TM_ILI9341_InitLCD(void);

/**
 * Send data to LCD via SPI
 *
 * Called private
 *
 * Parameters:
 * - uint8_t data: data to be sent
 */
extern void TM_ILI9341_SendData(uint8_t data);

/**
 * Send command to LCD via SPI
 *
 * Called private
 *
 * Parameters:
 * - uint8_t data: data to be sent
 */
extern void TM_ILI9341_SendCommand(uint8_t data);

/**
 * Simple delay
 *
 * Parameters:
 * - volatile unsigned int delay: clock cycles
 */
extern void TM_ILI9341_Delay(volatile unsigned int delay);

/**
 * Set cursor position
 *
 * Called private
 */
extern void TM_ILI9341_SetCursorPosition(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);

/**
 * Draw single pixel to LCD
 *
 * Parameters:
 * - uint16_t x: X position for pixel
 * - uint16_t y: Y position for pixel
 * - uint16_t color: color of pixel
 */
extern void TM_ILI9341_DrawPixel(uint16_t x, uint16_t y, uint16_t color);

/**
 * Fill entire LCD with color
 *
 * Parameters:
 * - uint16_t color: Color to be used in fill
 */
extern void TM_ILI9341_Fill(uint16_t color);

/**
 * Rotate LCD
 * Select orientation
 *
 * Parameters:
 * - TM_ILI9341_Orientation_t orientation
 * - TM_ILI9341_Orientation_Portrait_1: no rotation
 * - TM_ILI9341_Orientation_Portrait_2: rotate 180deg
 * - TM_ILI9341_Orientation_Landscape_1: rotate 90deg
 * - TM_ILI9341_Orientation_Landscape_2: rotate -90deg
 */
extern void TM_ILI9341_Rotate(TM_ILI9341_Orientation_t orientation);

/**
 * Put single character to LCD
 *
 * Parameters:
 * - uint16_t x: X position of top left corner
 * - uint16_t y: Y position of top left corner
 * - char c: character to be displayed
 * - TM_FontDef_t *font: pointer to used font
 * - uint16_t foreground: color for char
 * - uint16_t background: color for char background
 */
extern void TM_ILI9341_Putc(uint16_t x, uint16_t y, char c, TM_FontDef_t *font, uint16_t foreground, uint16_t background);

/**
 * Put string to LCD
 *
 * Parameters:
 * - uint16_t x: X position of top left corner of first character in string
 * - uint16_t y: Y position of top left corner of first character in string
 * - char *str: pointer to first character
 * - TM_FontDef_t *font: pointer to used font
 * - uint16_t foreground: color for string
 * - uint16_t background: color for string background
 */
extern void TM_ILI9341_Puts(uint16_t x, uint16_t y, char *str, TM_FontDef_t *font, uint16_t foreground, uint16_t background);

/**
 * Get width and height of box with text
 *
 * Parameters:
 * - char *str: pointer to first character
 * - TM_FontDef_t *font: pointer to used font
 * - uint16_t *width: Pointer to variable to store width
 * - uint16_t *height: ointer to variable to store height
 */
extern void TM_ILI9341_GetStringSize(char *str, TM_FontDef_t *font, uint16_t *width, uint16_t *height);

/**
 * Draw line to LCD
 *
 * Parameters:
 * - uint16_t x0: X coordinate of starting point
 * - uint16_t y0: Y coordinate of starting point
 * - uint16_t x1: X coordinate of ending point
 * - uint16_t y1: Y coordinate of ending point
 * - uint16_t color: line color
 */
extern void TM_ILI9341_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);

/**
 * Draw rectangle on LCD
 *
 * Parameters:
 * - uint16_t x0: X coordinate of top left point
 * - uint16_t y0: Y coordinate of top left point
 * - uint16_t x1: X coordinate of bottom right point
 * - uint16_t y1: Y coordinate of bottom right point
 * - uint16_t color: rectangle color
 */
extern void TM_ILI9341_DrawRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);

/**
 * Draw filled rectangle on LCD
 *
 * Parameters:
 * - uint16_t x0: X coordinate of top left point
 * - uint16_t y0: Y coordinate of top left point
 * - uint16_t x1: X coordinate of bottom right point
 * - uint16_t y1: Y coordinate of bottom right point
 * - uint16_t color: rectangle color
 */
extern void TM_ILI9341_DrawFilledRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);

/**
 * Draw circle on LCD
 *
 * Parameters:
 * - int16_t x0: X coordinate of center circle point
 * - int16_t y0: Y coordinate of center circle point
 * - int16_t r: circle radius
 * - uint16_t color: circle color
 */
extern void TM_ILI9341_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);

/**
 * Draw filled on LCD
 *
 * Parameters:
 * - int16_t x0: X coordinate of center circle point
 * - int16_t y0: Y coordinate of center circle point
 * - int16_t r: circle radius
 * - uint16_t color: circle color
 */
   
extern void TM_ILI9341_DrawRange(int16_t X1, int16_t Y1, int16_t R, uint16_t color);   
   
extern void TM_ILI9341_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);

extern void Draw_Load(int16_t step0);

//extern void TM_ILI9341_IMAGE(uint16_t x11, uint16_t y11, uint16_t size_x, uint16_t size_y, uint16_t *color);

extern void Draw_Voltage(int16_t x22, int16_t y22, int16_t h22, int16_t value22, uint16_t color22);

extern void Draw_Voltage_In_Range(int16_t volt1);

extern void Draw_Voltage_Out_Range(int16_t volt2);

extern void Init_Range(void);

extern void Init_Voltage_Range(void);

#endif


tm_stm32f4_fonts.c
#include "tm_stm32f4_fonts.h"

const uint16_t TM_Font7x10 [] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // sp
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000,  // !
0x2800, 0x2800, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // "
0x2400, 0x2400, 0x7C00, 0x2400, 0x4800, 0x7C00, 0x4800, 0x4800, 0x0000, 0x0000,  // #
0x3800, 0x5400, 0x5000, 0x3800, 0x1400, 0x5400, 0x5400, 0x3800, 0x1000, 0x0000,  // $
0x2000, 0x5400, 0x5800, 0x3000, 0x2800, 0x5400, 0x1400, 0x0800, 0x0000, 0x0000,  // %
0x1000, 0x2800, 0x2800, 0x1000, 0x3400, 0x4800, 0x4800, 0x3400, 0x0000, 0x0000,  // &
0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // '
0x0800, 0x1000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1000, 0x0800,  // (
0x2000, 0x1000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x1000, 0x2000,  // )
0x1000, 0x3800, 0x1000, 0x2800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // *
0x0000, 0x0000, 0x1000, 0x1000, 0x7C00, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000,  // +
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000,  // ,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3800, 0x0000, 0x0000, 0x0000, 0x0000,  // -
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000,  // .
0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000,  // /
0x3800, 0x4400, 0x4400, 0x5400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // 0
0x1000, 0x3000, 0x5000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // 1
0x3800, 0x4400, 0x4400, 0x0400, 0x0800, 0x1000, 0x2000, 0x7C00, 0x0000, 0x0000,  // 2
0x3800, 0x4400, 0x0400, 0x1800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000,  // 3
0x0800, 0x1800, 0x2800, 0x2800, 0x4800, 0x7C00, 0x0800, 0x0800, 0x0000, 0x0000,  // 4
0x7C00, 0x4000, 0x4000, 0x7800, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000,  // 5
0x3800, 0x4400, 0x4000, 0x7800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // 6
0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000,  // 7
0x3800, 0x4400, 0x4400, 0x3800, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // 8
0x3800, 0x4400, 0x4400, 0x4400, 0x3C00, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000,  // 9
0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000,  // :
0x0000, 0x0000, 0x0000, 0x1000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0x1000,  // ;
0x0000, 0x0000, 0x0C00, 0x3000, 0x4000, 0x3000, 0x0C00, 0x0000, 0x0000, 0x0000,  // <
0x0000, 0x0000, 0x0000, 0x7C00, 0x0000, 0x7C00, 0x0000, 0x0000, 0x0000, 0x0000,  // =
0x0000, 0x0000, 0x6000, 0x1800, 0x0400, 0x1800, 0x6000, 0x0000, 0x0000, 0x0000,  // >
0x3800, 0x4400, 0x0400, 0x0800, 0x1000, 0x1000, 0x0000, 0x1000, 0x0000, 0x0000,  // ?
0x3800, 0x4400, 0x4C00, 0x5400, 0x5C00, 0x4000, 0x4000, 0x3800, 0x0000, 0x0000,  // @
0x1000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7C00, 0x4400, 0x4400, 0x0000, 0x0000,  // A
0x7800, 0x4400, 0x4400, 0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x0000, 0x0000,  // B
0x3800, 0x4400, 0x4000, 0x4000, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000,  // C
0x7000, 0x4800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4800, 0x7000, 0x0000, 0x0000,  // D
0x7C00, 0x4000, 0x4000, 0x7C00, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000,  // E
0x7C00, 0x4000, 0x4000, 0x7800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000,  // F
0x3800, 0x4400, 0x4000, 0x4000, 0x5C00, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // G
0x4400, 0x4400, 0x4400, 0x7C00, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000,  // H
0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3800, 0x0000, 0x0000,  // I
0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000,  // J
0x4400, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000,  // K
0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7C00, 0x0000, 0x0000,  // L
0x4400, 0x6C00, 0x6C00, 0x5400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000,  // M
0x4400, 0x6400, 0x6400, 0x5400, 0x5400, 0x4C00, 0x4C00, 0x4400, 0x0000, 0x0000,  // N
0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // O
0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000,  // P
0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x5400, 0x3800, 0x0400, 0x0000,  // Q
0x7800, 0x4400, 0x4400, 0x4400, 0x7800, 0x4800, 0x4800, 0x4400, 0x0000, 0x0000,  // R
0x3800, 0x4400, 0x4000, 0x3000, 0x0800, 0x0400, 0x4400, 0x3800, 0x0000, 0x0000,  // S
0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // T
0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // U
0x4400, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x1000, 0x0000, 0x0000,  // V
0x4400, 0x4400, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000,  // W
0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000,  // X
0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // Y
0x7C00, 0x0400, 0x0800, 0x1000, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000,  // Z
0x1800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1800,  // [
0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000,  /* \ */
0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x3000,  // ]
0x1000, 0x2800, 0x2800, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // ^
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00,  // _
0x2000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // `
0x0000, 0x0000, 0x3800, 0x4400, 0x3C00, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000,  // a
0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x0000, 0x0000,  // b
0x0000, 0x0000, 0x3800, 0x4400, 0x4000, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000,  // c
0x0400, 0x0400, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000,  // d
0x0000, 0x0000, 0x3800, 0x4400, 0x7C00, 0x4000, 0x4400, 0x3800, 0x0000, 0x0000,  // e
0x0C00, 0x1000, 0x7C00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // f
0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x7800,  // g
0x4000, 0x4000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000,  // h
0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // i
0x1000, 0x0000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xE000,  // j
0x4000, 0x4000, 0x4800, 0x5000, 0x6000, 0x5000, 0x4800, 0x4400, 0x0000, 0x0000,  // k
0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000,  // l
0x0000, 0x0000, 0x7800, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x0000, 0x0000,  // m
0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x4400, 0x4400, 0x0000, 0x0000,  // n
0x0000, 0x0000, 0x3800, 0x4400, 0x4400, 0x4400, 0x4400, 0x3800, 0x0000, 0x0000,  // o
0x0000, 0x0000, 0x5800, 0x6400, 0x4400, 0x4400, 0x6400, 0x5800, 0x4000, 0x4000,  // p
0x0000, 0x0000, 0x3400, 0x4C00, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0400, 0x0400,  // q
0x0000, 0x0000, 0x5800, 0x6400, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000,  // r
0x0000, 0x0000, 0x3800, 0x4400, 0x3000, 0x0800, 0x4400, 0x3800, 0x0000, 0x0000,  // s
0x2000, 0x2000, 0x7800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x0000, 0x0000,  // t
0x0000, 0x0000, 0x4400, 0x4400, 0x4400, 0x4400, 0x4C00, 0x3400, 0x0000, 0x0000,  // u
0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x2800, 0x1000, 0x0000, 0x0000,  // v
0x0000, 0x0000, 0x5400, 0x5400, 0x5400, 0x6C00, 0x2800, 0x2800, 0x0000, 0x0000,  // w
0x0000, 0x0000, 0x4400, 0x2800, 0x1000, 0x1000, 0x2800, 0x4400, 0x0000, 0x0000,  // x
0x0000, 0x0000, 0x4400, 0x4400, 0x2800, 0x2800, 0x1000, 0x1000, 0x1000, 0x6000,  // y
0x0000, 0x0000, 0x7C00, 0x0800, 0x1000, 0x2000, 0x4000, 0x7C00, 0x0000, 0x0000,  // z
0x1800, 0x1000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0x1000, 0x1800,  // {
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,  // |
0x3000, 0x1000, 0x1000, 0x1000, 0x0800, 0x0800, 0x1000, 0x1000, 0x1000, 0x3000,  // }
0x0000, 0x0000, 0x0000, 0x7400, 0x4C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // ~
};

const uint16_t TM_Font11x18 [] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // sp
0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // !
0x0000, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // "
0x0000, 0x1980, 0x1980, 0x1980, 0x1980, 0x7FC0, 0x7FC0, 0x1980, 0x3300, 0x7FC0, 0x7FC0, 0x3300, 0x3300, 0x3300, 0x3300, 0x0000, 0x0000, 0x0000,   // #
0x0000, 0x1E00, 0x3F00, 0x7580, 0x6580, 0x7400, 0x3C00, 0x1E00, 0x0700, 0x0580, 0x6580, 0x6580, 0x7580, 0x3F00, 0x1E00, 0x0400, 0x0400, 0x0000,   // $
0x0000, 0x7000, 0xD800, 0xD840, 0xD8C0, 0xD980, 0x7300, 0x0600, 0x0C00, 0x1B80, 0x36C0, 0x66C0, 0x46C0, 0x06C0, 0x0380, 0x0000, 0x0000, 0x0000,   // %
0x0000, 0x1E00, 0x3F00, 0x3300, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x3CC0, 0x66C0, 0x6380, 0x6180, 0x6380, 0x3EC0, 0x1C80, 0x0000, 0x0000, 0x0000,   // &
0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // '
0x0080, 0x0100, 0x0300, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0300, 0x0100, 0x0080,   // (
0x2000, 0x1000, 0x1800, 0x0C00, 0x0C00, 0x0400, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0400, 0x0C00, 0x0C00, 0x1800, 0x1000, 0x2000,   // )
0x0000, 0x0C00, 0x2D00, 0x3F00, 0x1E00, 0x3300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // *
0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // +
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800,   // ,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x1E00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // -
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // .
0x0000, 0x0300, 0x0300, 0x0300, 0x0600, 0x0600, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000,   // /
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6D80, 0x6D80, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 0
0x0000, 0x0600, 0x0E00, 0x1E00, 0x3600, 0x2600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000,   // 1
0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000,   // 2
0x0000, 0x1C00, 0x3E00, 0x6300, 0x6300, 0x0300, 0x0E00, 0x0E00, 0x0300, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 3
0x0000, 0x0600, 0x0E00, 0x0E00, 0x1E00, 0x1E00, 0x1600, 0x3600, 0x3600, 0x6600, 0x7F80, 0x7F80, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000,   // 4
0x0000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x6380, 0x0180, 0x0180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 5
0x0000, 0x1E00, 0x3F00, 0x3380, 0x6180, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x3380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 6
0x0000, 0x7F80, 0x7F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0600, 0x0C00, 0x0C00, 0x0C00, 0x0800, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000, 0x0000,   // 7
0x0000, 0x1E00, 0x3F00, 0x6380, 0x6180, 0x6180, 0x2100, 0x1E00, 0x3F00, 0x6180, 0x6180, 0x6180, 0x6180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 8
0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6180, 0x7300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // 9
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // :
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C00, 0x0C00, 0x0400, 0x0400, 0x0800,   // ;
0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0380, 0x0E00, 0x3800, 0x6000, 0x3800, 0x0E00, 0x0380, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // <
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // =
0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x7000, 0x1C00, 0x0700, 0x0180, 0x0700, 0x1C00, 0x7000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // >
0x0000, 0x1F00, 0x3F80, 0x71C0, 0x60C0, 0x00C0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0000, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // ?
0x0000, 0x1E00, 0x3F00, 0x3180, 0x7180, 0x6380, 0x6F80, 0x6D80, 0x6D80, 0x6F80, 0x6780, 0x6000, 0x3200, 0x3E00, 0x1C00, 0x0000, 0x0000, 0x0000,   // @
0x0000, 0x0E00, 0x0E00, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x3180, 0x3180, 0x3F80, 0x3F80, 0x3180, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000,   // A
0x0000, 0x7C00, 0x7E00, 0x6300, 0x6300, 0x6300, 0x6300, 0x7E00, 0x7E00, 0x6300, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x0000, 0x0000, 0x0000,   // B
0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // C
0x0000, 0x7C00, 0x7F00, 0x6300, 0x6380, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6300, 0x6300, 0x7E00, 0x7C00, 0x0000, 0x0000, 0x0000,   // D
0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000,   // E
0x0000, 0x7F80, 0x7F80, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F00, 0x7F00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000,   // F
0x0000, 0x1E00, 0x3F00, 0x3180, 0x6180, 0x6000, 0x6000, 0x6000, 0x6380, 0x6380, 0x6180, 0x6180, 0x3180, 0x3F80, 0x1E00, 0x0000, 0x0000, 0x0000,   // G
0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7F80, 0x7F80, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000,   // H
0x0000, 0x3F00, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3F00, 0x3F00, 0x0000, 0x0000, 0x0000,   // I
0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // J
0x0000, 0x60C0, 0x6180, 0x6300, 0x6600, 0x6600, 0x6C00, 0x7800, 0x7C00, 0x6600, 0x6600, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000,   // K
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000,   // L
0x0000, 0x71C0, 0x71C0, 0x7BC0, 0x7AC0, 0x6AC0, 0x6AC0, 0x6EC0, 0x64C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x60C0, 0x0000, 0x0000, 0x0000,   // M
0x0000, 0x7180, 0x7180, 0x7980, 0x7980, 0x7980, 0x6D80, 0x6D80, 0x6D80, 0x6580, 0x6780, 0x6780, 0x6780, 0x6380, 0x6380, 0x0000, 0x0000, 0x0000,   // N
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // O
0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000,   // P
0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6580, 0x6780, 0x3300, 0x3F80, 0x1E40, 0x0000, 0x0000, 0x0000,   // Q
0x0000, 0x7E00, 0x7F00, 0x6380, 0x6180, 0x6180, 0x6380, 0x7F00, 0x7E00, 0x6600, 0x6300, 0x6300, 0x6180, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000,   // R
0x0000, 0x0E00, 0x1F00, 0x3180, 0x3180, 0x3000, 0x3800, 0x1E00, 0x0700, 0x0380, 0x6180, 0x6180, 0x3180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // S
0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // T
0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // U
0x0000, 0x60C0, 0x60C0, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x0400, 0x0000, 0x0000, 0x0000,   // V
0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xCCC0, 0x4C80, 0x4C80, 0x5E80, 0x5280, 0x5280, 0x7380, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000,   // W
0x0000, 0xC0C0, 0x6080, 0x6180, 0x3300, 0x3B00, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x1F00, 0x3B00, 0x7180, 0x6180, 0xC0C0, 0x0000, 0x0000, 0x0000,   // X
0x0000, 0xC0C0, 0x6180, 0x6180, 0x3300, 0x3300, 0x1E00, 0x1E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // Y
0x0000, 0x3F80, 0x3F80, 0x0180, 0x0300, 0x0300, 0x0600, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x6000, 0x7F80, 0x7F80, 0x0000, 0x0000, 0x0000,   // Z
0x0F00, 0x0F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0F00, 0x0F00,   // [
0x0000, 0x1800, 0x1800, 0x1800, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, 0x0300, 0x0000, 0x0000, 0x0000,   /* \ */
0x1E00, 0x1E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x1E00, 0x1E00,   // ]
0x0000, 0x0C00, 0x0C00, 0x1E00, 0x1200, 0x3300, 0x3300, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // ^
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFE0, 0x0000,   // _
0x0000, 0x3800, 0x1800, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // `
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1F00, 0x3F80, 0x6180, 0x0180, 0x1F80, 0x3F80, 0x6180, 0x6380, 0x7F80, 0x38C0, 0x0000, 0x0000, 0x0000,   // a
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x0000, 0x0000, 0x0000,   // b
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6000, 0x6000, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // c
0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0000, 0x0000, 0x0000,   // d
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7300, 0x6180, 0x7F80, 0x7F80, 0x6000, 0x7180, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // e
0x0000, 0x07C0, 0x0FC0, 0x0C00, 0x0C00, 0x7F80, 0x7F80, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000,   // f
0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x6380, 0x7F00, 0x3E00,   // g
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000,   // h
0x0000, 0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000,   // i
0x0600, 0x0600, 0x0000, 0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x4600, 0x7E00, 0x3C00,   // j
0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6180, 0x6300, 0x6600, 0x6C00, 0x7C00, 0x7600, 0x6300, 0x6300, 0x6180, 0x60C0, 0x0000, 0x0000, 0x0000,   // k
0x0000, 0x3E00, 0x3E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000,   // l
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xFFC0, 0xCEC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0xCCC0, 0x0000, 0x0000, 0x0000,   // m
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6F00, 0x7F80, 0x7180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x0000, 0x0000, 0x0000,   // n
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // o
0x0000, 0x0000, 0x0000, 0x0000, 0x6E00, 0x7F00, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x7F00, 0x6E00, 0x6000, 0x6000, 0x6000, 0x6000,   // p
0x0000, 0x0000, 0x0000, 0x0000, 0x1D80, 0x3F80, 0x7380, 0x6180, 0x6180, 0x6180, 0x6180, 0x7380, 0x3F80, 0x1D80, 0x0180, 0x0180, 0x0180, 0x0180,   // q
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6700, 0x3F80, 0x3900, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000, 0x0000,   // r
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1E00, 0x3F80, 0x6180, 0x6000, 0x7F00, 0x3F80, 0x0180, 0x6180, 0x7F00, 0x1E00, 0x0000, 0x0000, 0x0000,   // s
0x0000, 0x0000, 0x0800, 0x1800, 0x1800, 0x7F00, 0x7F00, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1F80, 0x0F80, 0x0000, 0x0000, 0x0000,   // t
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6180, 0x6380, 0x7F80, 0x3D80, 0x0000, 0x0000, 0x0000,   // u
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60C0, 0x3180, 0x3180, 0x3180, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0600, 0x0000, 0x0000, 0x0000,   // v
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDD80, 0xDD80, 0xDD80, 0x5500, 0x5500, 0x5500, 0x7700, 0x7700, 0x2200, 0x2200, 0x0000, 0x0000, 0x0000,   // w
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x3300, 0x3300, 0x1E00, 0x0C00, 0x0C00, 0x1E00, 0x3300, 0x3300, 0x6180, 0x0000, 0x0000, 0x0000,   // x
0x0000, 0x0000, 0x0000, 0x0000, 0x6180, 0x6180, 0x3180, 0x3300, 0x3300, 0x1B00, 0x1B00, 0x1B00, 0x0E00, 0x0E00, 0x0E00, 0x1C00, 0x7C00, 0x7000,   // y
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FC0, 0x7FC0, 0x0180, 0x0300, 0x0600, 0x0C00, 0x1800, 0x3000, 0x7FC0, 0x7FC0, 0x0000, 0x0000, 0x0000,   // z
0x0380, 0x0780, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0E00, 0x1C00, 0x1C00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0780, 0x0380,   // {
0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,   // |
0x3800, 0x3C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0E00, 0x0700, 0x0700, 0x0E00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x3C00, 0x3800,   // }
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3880, 0x7F80, 0x4700, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   // ~
};

const uint16_t TM_Font16x26 [] = {
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [ ]
0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x03C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [!]
0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x1E3C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = ["]
0x01CE,0x03CE,0x03DE,0x039E,0x039C,0x079C,0x3FFF,0x7FFF,0x0738,0x0F38,0x0F78,0x0F78,0x0E78,0xFFFF,0xFFFF,0x1EF0,0x1CF0,0x1CE0,0x3CE0,0x3DE0,0x39E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [#]
0x03FC,0x0FFE,0x1FEE,0x1EE0,0x1EE0,0x1EE0,0x1EE0,0x1FE0,0x0FE0,0x07E0,0x03F0,0x01FC,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x01FE,0x3DFE,0x3FFC,0x0FF0,0x01E0,0x01E0,0x0000,0x0000,0x0000, // Ascii = [$]
0x3E03,0xF707,0xE78F,0xE78E,0xE39E,0xE3BC,0xE7B8,0xE7F8,0xF7F0,0x3FE0,0x01C0,0x03FF,0x07FF,0x07F3,0x0FF3,0x1EF3,0x3CF3,0x38F3,0x78F3,0xF07F,0xE03F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [%]
0x07E0,0x0FF8,0x0F78,0x1F78,0x1F78,0x1F78,0x0F78,0x0FF0,0x0FE0,0x1F80,0x7FC3,0xFBC3,0xF3E7,0xF1F7,0xF0F7,0xF0FF,0xF07F,0xF83E,0x7C7F,0x3FFF,0x1FEF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [&]
0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [']
0x003F,0x007C,0x01F0,0x01E0,0x03C0,0x07C0,0x0780,0x0780,0x0F80,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F00,0x0F80,0x0780,0x0780,0x07C0,0x03C0,0x01E0,0x01F0,0x007C,0x003F,0x000F,0x0000, // Ascii = [(]
0x7E00,0x1F00,0x07C0,0x03C0,0x01E0,0x01F0,0x00F0,0x00F0,0x00F8,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x00F8,0x00F0,0x00F0,0x01F0,0x01E0,0x03C0,0x07C0,0x1F00,0x7E00,0x7800,0x0000, // Ascii = [)]
0x03E0,0x03C0,0x01C0,0x39CE,0x3FFF,0x3F7F,0x0320,0x0370,0x07F8,0x0F78,0x1F3C,0x0638,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [*]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0xFFFF,0xFFFF,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [+]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x01C0,0x0380, // Ascii = [,]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [-]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [.]
0x000F,0x000F,0x001E,0x001E,0x003C,0x003C,0x0078,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0780,0x0F00,0x0F00,0x1E00,0x1E00,0x3C00,0x3C00,0x7800,0x7800,0xF000,0x0000, // Ascii = [/]
0x07F0,0x0FF8,0x1F7C,0x3E3E,0x3C1E,0x7C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x7C1F,0x3C1E,0x3E3E,0x1F7C,0x0FF8,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [0]
0x00F0,0x07F0,0x3FF0,0x3FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [1]
0x0FE0,0x3FF8,0x3C7C,0x003C,0x003E,0x003E,0x003E,0x003C,0x003C,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0780,0x0F00,0x1E00,0x3E00,0x3C00,0x3FFE,0x3FFE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [2]
0x0FF0,0x1FF8,0x1C7C,0x003E,0x003E,0x003E,0x003C,0x003C,0x00F8,0x0FF0,0x0FF8,0x007C,0x003E,0x001E,0x001E,0x001E,0x001E,0x003E,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [3]
0x0078,0x00F8,0x00F8,0x01F8,0x03F8,0x07F8,0x07F8,0x0F78,0x1E78,0x1E78,0x3C78,0x7878,0x7878,0xFFFF,0xFFFF,0x0078,0x0078,0x0078,0x0078,0x0078,0x0078,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [4]
0x1FFC,0x1FFC,0x1FFC,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FE0,0x1FF8,0x00FC,0x007C,0x003E,0x003E,0x001E,0x003E,0x003E,0x003C,0x1C7C,0x1FF8,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [5]
0x01FC,0x07FE,0x0F8E,0x1F00,0x1E00,0x3E00,0x3C00,0x3C00,0x3DF8,0x3FFC,0x7F3E,0x7E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3E0F,0x1E1F,0x1F3E,0x0FFC,0x03F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [6]
0x3FFF,0x3FFF,0x3FFF,0x000F,0x001E,0x001E,0x003C,0x0038,0x0078,0x00F0,0x00F0,0x01E0,0x01E0,0x03C0,0x03C0,0x0780,0x0F80,0x0F80,0x0F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [7]
0x07F8,0x0FFC,0x1F3E,0x1E1E,0x3E1E,0x3E1E,0x1E1E,0x1F3C,0x0FF8,0x07F0,0x0FF8,0x1EFC,0x3E3E,0x3C1F,0x7C1F,0x7C0F,0x7C0F,0x3C1F,0x3F3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [8]
0x07F0,0x0FF8,0x1E7C,0x3C3E,0x3C1E,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x3C1F,0x3E3F,0x1FFF,0x07EF,0x001F,0x001E,0x001E,0x003E,0x003C,0x38F8,0x3FF0,0x1FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [9]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [:]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03E0,0x03E0,0x03E0,0x03E0,0x01E0,0x01E0,0x01E0,0x03C0,0x0380, // Ascii = [;]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0003,0x000F,0x003F,0x00FC,0x03F0,0x0FC0,0x3F00,0xFE00,0x3F00,0x0FC0,0x03F0,0x00FC,0x003F,0x000F,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [<]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [=]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xE000,0xF800,0x7E00,0x1F80,0x07E0,0x01F8,0x007E,0x001F,0x007E,0x01F8,0x07E0,0x1F80,0x7E00,0xF800,0xE000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [>]
0x1FF0,0x3FFC,0x383E,0x381F,0x381F,0x001E,0x001E,0x003C,0x0078,0x00F0,0x01E0,0x03C0,0x03C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [?]
0x03F8,0x0FFE,0x1F1E,0x3E0F,0x3C7F,0x78FF,0x79EF,0x73C7,0xF3C7,0xF38F,0xF38F,0xF38F,0xF39F,0xF39F,0x73FF,0x7BFF,0x79F7,0x3C00,0x1F1C,0x0FFC,0x03F8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [@]
0x0000,0x0000,0x0000,0x03E0,0x03E0,0x07F0,0x07F0,0x07F0,0x0F78,0x0F78,0x0E7C,0x1E3C,0x1E3C,0x3C3E,0x3FFE,0x3FFF,0x781F,0x780F,0xF00F,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [A]
0x0000,0x0000,0x0000,0x3FF8,0x3FFC,0x3C3E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7C,0x3FF0,0x3FF8,0x3C7E,0x3C1F,0x3C1F,0x3C0F,0x3C0F,0x3C1F,0x3FFE,0x3FF8,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [B]
0x0000,0x0000,0x0000,0x01FF,0x07FF,0x1F87,0x3E00,0x3C00,0x7C00,0x7800,0x7800,0x7800,0x7800,0x7800,0x7C00,0x7C00,0x3E00,0x3F00,0x1F83,0x07FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [C]
0x0000,0x0000,0x0000,0x7FF0,0x7FFC,0x787E,0x781F,0x781F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x780F,0x781F,0x781E,0x787E,0x7FF8,0x7FE0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [D]
0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFE,0x3FFE,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [E]
0x0000,0x0000,0x0000,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1FFF,0x1FFF,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x1E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [F]
0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x7C00,0x7C00,0x7800,0xF800,0xF800,0xF87F,0xF87F,0x780F,0x7C0F,0x7C0F,0x3E0F,0x1F8F,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [G]
0x0000,0x0000,0x0000,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7FFF,0x7FFF,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x7C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [H]
0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [I]
0x0000,0x0000,0x0000,0x1FFC,0x1FFC,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x007C,0x0078,0x0078,0x38F8,0x3FF0,0x3FC0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [J]
0x0000,0x0000,0x0000,0x3C1F,0x3C1E,0x3C3C,0x3C78,0x3CF0,0x3DE0,0x3FE0,0x3FC0,0x3F80,0x3FC0,0x3FE0,0x3DF0,0x3CF0,0x3C78,0x3C7C,0x3C3E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [K]
0x0000,0x0000,0x0000,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3FFF,0x3FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [L]
0x0000,0x0000,0x0000,0xF81F,0xFC1F,0xFC1F,0xFE3F,0xFE3F,0xFE3F,0xFF7F,0xFF77,0xFF77,0xF7F7,0xF7E7,0xF3E7,0xF3E7,0xF3C7,0xF007,0xF007,0xF007,0xF007,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [M]
0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7E0F,0x7F0F,0x7F0F,0x7F8F,0x7F8F,0x7FCF,0x7BEF,0x79EF,0x79FF,0x78FF,0x78FF,0x787F,0x783F,0x783F,0x781F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [N]
0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [O]
0x0000,0x0000,0x0000,0x3FFC,0x3FFF,0x3E1F,0x3E0F,0x3E0F,0x3E0F,0x3E0F,0x3E1F,0x3E3F,0x3FFC,0x3FF0,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x3E00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [P]
0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x7C1F,0x780F,0x780F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0xF80F,0x780F,0x780F,0x7C1F,0x3E3E,0x1FFC,0x07F8,0x007C,0x003F,0x000F,0x0003,0x0000, // Ascii = [Q]
0x0000,0x0000,0x0000,0x3FF0,0x3FFC,0x3C7E,0x3C3E,0x3C1E,0x3C1E,0x3C3E,0x3C3C,0x3CFC,0x3FF0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1E,0x3C1F,0x3C0F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [R]
0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x3E0E,0x3C00,0x3C00,0x3C00,0x3E00,0x1FC0,0x0FF8,0x03FE,0x007F,0x001F,0x000F,0x000F,0x201F,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [S]
0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [T]
0x0000,0x0000,0x0000,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x7C0F,0x3C1E,0x3C1E,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [U]
0x0000,0x0000,0x0000,0xF007,0xF007,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1F3C,0x1F78,0x0F78,0x0FF8,0x07F0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [V]
0x0000,0x0000,0x0000,0xE003,0xF003,0xF003,0xF007,0xF3E7,0xF3E7,0xF3E7,0x73E7,0x7BF7,0x7FF7,0x7FFF,0x7F7F,0x7F7F,0x7F7E,0x3F7E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [W]
0x0000,0x0000,0x0000,0xF807,0x7C0F,0x3E1E,0x3E3E,0x1F3C,0x0FF8,0x07F0,0x07E0,0x03E0,0x03E0,0x07F0,0x0FF8,0x0F7C,0x1E7C,0x3C3E,0x781F,0x780F,0xF00F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [X]
0x0000,0x0000,0x0000,0xF807,0x7807,0x7C0F,0x3C1E,0x3E1E,0x1F3C,0x0F78,0x0FF8,0x07F0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Y]
0x0000,0x0000,0x0000,0x7FFF,0x7FFF,0x000F,0x001F,0x003E,0x007C,0x00F8,0x00F0,0x01E0,0x03E0,0x07C0,0x0F80,0x0F00,0x1E00,0x3E00,0x7C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [Z]
0x07FF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07FF,0x07FF,0x0000, // Ascii = [[]
0x7800,0x7800,0x3C00,0x3C00,0x1E00,0x1E00,0x0F00,0x0F00,0x0780,0x0780,0x03C0,0x03C0,0x01E0,0x01E0,0x00F0,0x00F0,0x0078,0x0078,0x003C,0x003C,0x001E,0x001E,0x000F,0x000F,0x0007,0x0000, // Ascii = [\]
0x7FF0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x00F0,0x7FF0,0x7FF0,0x0000, // Ascii = []]
0x00C0,0x01C0,0x01C0,0x03E0,0x03E0,0x07F0,0x07F0,0x0778,0x0F78,0x0F38,0x1E3C,0x1E3C,0x3C1E,0x3C1E,0x380F,0x780F,0x7807,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [^]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0000, // Ascii = [_]
0x00F0,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [`]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0FF8,0x3FFC,0x3C7C,0x003E,0x003E,0x003E,0x07FE,0x1FFE,0x3E3E,0x7C3E,0x783E,0x7C3E,0x7C7E,0x3FFF,0x1FCF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [a]
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3C1E,0x3F3E,0x3FFC,0x3BF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [b]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03FE,0x0FFF,0x1F87,0x3E00,0x3E00,0x3C00,0x7C00,0x7C00,0x7C00,0x3C00,0x3E00,0x3E00,0x1F87,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [c]
0x001F,0x001F,0x001F,0x001F,0x001F,0x001F,0x07FF,0x1FFF,0x3E3F,0x3C1F,0x7C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [d]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x03F8,0x0FFC,0x1F3E,0x3E1E,0x3C1F,0x7C1F,0x7FFF,0x7FFF,0x7C00,0x7C00,0x3C00,0x3E00,0x1F07,0x0FFF,0x03FE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [e]
0x01FF,0x03E1,0x03C0,0x07C0,0x07C0,0x07C0,0x7FFF,0x7FFF,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x07C0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [f]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EF,0x1FFF,0x3E7F,0x3C1F,0x7C1F,0x7C1F,0x781F,0x781F,0x781F,0x7C1F,0x7C1F,0x3C3F,0x3E7F,0x1FFF,0x0FDF,0x001E,0x001E,0x001E,0x387C,0x3FF8, // Ascii = [g]
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [h]
0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x7FE0,0x7FE0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [i]
0x00F8,0x00F8,0x0000,0x0000,0x0000,0x0000,0x3FF8,0x3FF8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F8,0x00F0,0x71F0,0x7FE0, // Ascii = [j]
0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00,0x3C1F,0x3C3E,0x3C7C,0x3CF8,0x3DF0,0x3DE0,0x3FC0,0x3FC0,0x3FE0,0x3DF0,0x3CF8,0x3C7C,0x3C3E,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [k]
0x7FF0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x01F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [l]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF79E,0xFFFF,0xFFFF,0xFFFF,0xFBE7,0xF9E7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0xF1C7,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [m]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DFC,0x3FFE,0x3F9E,0x3F1F,0x3E1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x3C1F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [n]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07F0,0x1FFC,0x3E3E,0x3C1F,0x7C1F,0x780F,0x780F,0x780F,0x780F,0x780F,0x7C1F,0x3C1F,0x3E3E,0x1FFC,0x07F0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [o]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3DF8,0x3FFE,0x3F3E,0x3E1F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C0F,0x3C1F,0x3E1E,0x3F3E,0x3FFC,0x3FF8,0x3C00,0x3C00,0x3C00,0x3C00,0x3C00, // Ascii = [p]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07EE,0x1FFE,0x3E7E,0x3C1E,0x7C1E,0x781E,0x781E,0x781E,0x781E,0x781E,0x7C1E,0x7C3E,0x3E7E,0x1FFE,0x0FDE,0x001E,0x001E,0x001E,0x001E,0x001E, // Ascii = [q]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F7F,0x1FFF,0x1FE7,0x1FC7,0x1F87,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x1F00,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [r]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FC,0x1FFE,0x1E0E,0x3E00,0x3E00,0x3F00,0x1FE0,0x07FC,0x00FE,0x003E,0x001E,0x001E,0x3C3E,0x3FFC,0x1FF0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [s]
0x0000,0x0000,0x0000,0x0780,0x0780,0x0780,0x7FFF,0x7FFF,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x0780,0x07C0,0x03FF,0x01FF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [t]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C1E,0x3C3E,0x3C7E,0x3EFE,0x1FFE,0x0FDE,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [u]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF007,0x780F,0x780F,0x3C1E,0x3C1E,0x3E1E,0x1E3C,0x1E3C,0x0F78,0x0F78,0x0FF0,0x07F0,0x07F0,0x03E0,0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [v]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF003,0xF1E3,0xF3E3,0xF3E7,0xF3F7,0xF3F7,0x7FF7,0x7F77,0x7F7F,0x7F7F,0x7F7F,0x3E3E,0x3E3E,0x3E3E,0x3E3E,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [w]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7C0F,0x3E1E,0x3E3C,0x1F3C,0x0FF8,0x07F0,0x07F0,0x03E0,0x07F0,0x07F8,0x0FF8,0x1E7C,0x3E3E,0x3C1F,0x781F,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [x]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xF807,0x780F,0x7C0F,0x3C1E,0x3C1E,0x1E3C,0x1E3C,0x1F3C,0x0F78,0x0FF8,0x07F0,0x07F0,0x03E0,0x03E0,0x03C0,0x03C0,0x03C0,0x0780,0x0F80,0x7F00, // Ascii = [y]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3FFF,0x3FFF,0x001F,0x003E,0x007C,0x00F8,0x01F0,0x03E0,0x07C0,0x0F80,0x1F00,0x1E00,0x3C00,0x7FFF,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [z]
0x01FE,0x03E0,0x03C0,0x03C0,0x03C0,0x03C0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x3F80,0x3F80,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x03C0,0x03C0,0x03C0,0x03C0,0x03E0,0x01FE,0x007E,0x0000, // Ascii = [{]
0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x01C0,0x0000, // Ascii = [|]
0x3FC0,0x03E0,0x01E0,0x01E0,0x01E0,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x00FE,0x00FE,0x01E0,0x01C0,0x03C0,0x03C0,0x01C0,0x01E0,0x01E0,0x01E0,0x01E0,0x03E0,0x3FC0,0x3F00,0x0000, // Ascii = [}]
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3F07,0x7FC7,0x73E7,0xF1FF,0xF07E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // Ascii = [~]
};


TM_FontDef_t TM_Font_7x10 = {
7,
10,
TM_Font7x10
};

TM_FontDef_t TM_Font_11x18 = {
11,
18,
TM_Font11x18
};

TM_FontDef_t TM_Font_16x26 = {
16,
26,
TM_Font16x26
};

tm_stm32f4_fonts.h
#ifndef TM_FONTS_H
#define TM_FONTS_H

#include "stm32l1xx.h"
//#include "defines.h"
/**
 * Font struct
 */
typedef struct {
uint8_t FontWidth;
uint8_t FontHeight;
const uint16_t *data;
} TM_FontDef_t;

#endif


Комментариев нет:

Отправить комментарий