From f0a6c3b4eb9b545dfb42b768da28b23b9d3eba03 Mon Sep 17 00:00:00 2001 From: id101010 Date: Mon, 27 Apr 2015 21:03:43 +0200 Subject: [PATCH 1/5] Implemented init functions for gpio, fsmc and display --- common/.gitignore | 2 + common/lowlevel/ll_tft.h | 13 ++ discovery/src/ll_tft.c | 335 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 338 insertions(+), 12 deletions(-) create mode 100644 common/.gitignore diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..8b4d5d4 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,2 @@ +# Temporary files +*.swp diff --git a/common/lowlevel/ll_tft.h b/common/lowlevel/ll_tft.h index 8815d63..14996cb 100644 --- a/common/lowlevel/ll_tft.h +++ b/common/lowlevel/ll_tft.h @@ -1,7 +1,20 @@ #include #include +// init functions bool ll_tft_init(); +bool ll_fsmc_init(); +bool ll_gpio_init(); + +// display control functions +void ll_tft_write_reg(uint8_t reg_adr, uint16_t reg_value); +uint16_t ll_tft_read_reg(uint8_t reg_adr); + +// fsmc functions + +// gpio functions + +// draw functions void ll_tft_clear(uint16_t color); void ll_tft_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color); diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index 05bed62..f5fb128 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -1,35 +1,346 @@ +/* TFT lowlevel functions + * + * Pinout: + * ---------------------------------------- + * PB0 -> LCD_Backlight PE3 -> LCD_RS + * PD0 -> LCD_DB2 PE7 -> LCD_DB4 + * PD1 -> LCD_DB3 PE8 -> LCD_DB5 + * PD4 -> LCD_RD PE9 -> LCD_DB6 + * PD5 -> LCD_WR PE10 -> LCD_DB7 + * PD7 -> LCD_CS PE11 -> LCD_DB10 + * PD8 -> LCD_DB15 PE12 -> LCD_DB11 + * PD9 -> LCD_DB16 PE13 -> LCD_DB12 + * PD10 -> LCD_DB17 PE14 -> LCD_DB13 + * PD14 -> LCD_DB0 PE15 -> LCD_DB14 + * PD15 -> LCD_DB1 + * ---------------------------------------- + */ #include "ll_tft.h" +#include "system.h" +#include "stm32f4xx.h" +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_fsmc.h" -bool ll_tft_init() { - return false; +/* + * ---------------------- defines and makros ------------------------------------------------------ + */ +// Colors +#define DISPLAY_COLOR_BLACK 0x0000 +#define DISPLAY_COLOR_BLUE 0x001F +#define DISPLAY_COLOR_GREEN 0x07E0 +#define DISPLAY_COLOR_RED 0xF800 +#define DISPLAY_COLOR_WHITE 0xFFFF +#define DISPLAY_COLOR_CYAN 0x07FF +#define DISPLAY_COLOR_MAGENTA 0xF81F +#define DISPLAY_COLOR_YELLOW 0xFFE0 +#define DISPLAY_COLOR_GREY 0xF7DE + +// FSMC adresses +#define TFT_REG (*((volatile unsigned short *) 0x60000000)) // RS = 0 +#define TFT_RAM (*((volatile unsigned short *) 0x60100000)) // RS = 1 +#define TFT_RAM_ADR 0x60100000 // RAM adress + +// Display defines +#define TFT_SSD1289_ID1 0x1289 // ID -> SSD1289 (New) +#define TFT_SSD1289_ID2 0x8989 // ID -> SSD1289 (Old) +#define TFT_MAXX 240 // Number of pixels x axis +#define TFT_MAXY 320 // Number of pixels y axis +#define TFT_PIXEL TFT_MAXX*TFT_MAXY // Total number of pixels +#define TFT_SSD1289_FSMC_AST 15 // AdressSetupTime (AST >= 9) +#define TFT_SSD1289_FSMC_DST 15 // DataSetupTime (DST >= 7) +#define TFT_SSD1289_PORTRAIT 0x6830 // Mode = Portrait +#define TFT_SSD1289_LANDSCAPE 0x6838 // Mode = Landscape +#define CURRENT_MODE TFT_SSD1289_LANDSCAPE + +// Display controller adresses +#define TFT_SSD1289_REG_00 0x00 // Display-ID register +#define TFT_SSD1289_REG_11 0x11 // Display-Mode register +#define TFT_SSD1289_REG_4E 0x4E // Cursor-Pos (x) register +#define TFT_SSD1289_REG_4F 0x4F // Cursor-Pos (y) register +#define TFT_SSD1289_REG_22 0x22 // RAM start register +#define TFT_SSD1289_REG_44 0x44 // X-start+end register +#define TFT_SSD1289_REG_45 0x45 // Y-start register +#define TFT_SSD1289_REG_46 0x46 // Y-end register + +// Timeouts +#define TFT_INIT_TIMEOUT 1 // 1ms timeout + +/* + * ---------------------- init functions ---------------------------------------------------------- + */ + +bool ll_tft_init() +{ + ll_tft_write_reg(0x0007,0x0021); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0000,0x0001); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0007,0x0023); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0010,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0007,0x0033); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(TFT_SSD1289_REG_11,CURRENT_MODE); // set mode (landscape, portrait) + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0002,0x0600); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0012,0x6CEB); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0003,0xA8A4); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x000C,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x000D,0x080C); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x000E,0x2B00); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x001E,0x00B0); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0001,0x2b3F); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0005,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0006,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0016,0xEF1C); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0017,0x0103); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x000B,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x000F,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0041,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0042,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0048,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0049,0x013F); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x004A,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x004B,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0044,0xEF00); // horizontal start and end + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0045,0x0000); // vertical start + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0046,0x013F); // vertical end + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0030,0x0707); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0031,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0032,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0033,0x0502); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0034,0x0507); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0035,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0036,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0037,0x0502); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x003A,0x0302); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x002F,0x12BE); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x003B,0x0302); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0023,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0024,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0025,0x8000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x004f,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x004e,0x0000); + system_delay(TFT_INIT_TIMEOUT); + + return true; } -void ll_tft_clear(uint16_t color) { +bool ll_fsmc_init() +{ + // generate init structures + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure; + // clock enable + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + // prepare timing struct + FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = TFT_SSD1289_FSMC_AST; + FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 1; + FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = TFT_SSD1289_FSMC_DST; + FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0; + FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A; + // Bank-1 / PSRAM-1 + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure; + // config FSMC + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + // enable Bank-1 / PSRAM-1 + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); + return true; } -void ll_tft_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { +bool ll_gpio_init() +{ + // generate init structure + GPIO_InitTypeDef GPIO_InitStructure; + // clock enable PORT_B, PORT_D, PORT_E + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); + + // PORT_B init ------------------------------------------------------------------------------------- + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + // configure PORT_B + GPIO_Init(GPIOB, &GPIO_InitStructure); + + // PORT_D init ------------------------------------------------------------------------------------- + GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC); // PD0=FSMC_D2 -> DB2 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC); // PD1=FSMC_D3 -> DB3 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC); // PD4=FSMC_NOE -> RD + GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC); // PD5=FSMC_NWE -> WR + GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC); // PD7=FSMC_NE1 -> CS + GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC); // PD8=FSMC_D13 -> DB15 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC); // PD9=FSMC_D14 -> DB16 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC); // PD10=FSMC_D15 -> DB17 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC); // PD14=FSMC_D0 -> DB0 + GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC); // PD15=FSMC_D1 -> DB1 + // PORT_D struct + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | + GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | + GPIO_Pin_14 | GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + // configure PORT_D + GPIO_Init(GPIOD, &GPIO_InitStructure); + + // PORT_E init -------------------------------------------------------------------------------------- + GPIO_PinAFConfig(GPIOE, GPIO_PinSource3, GPIO_AF_FSMC); // PE3=FSMC_A19 -> RS + GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC); // PE7=FSMC_D4 -> DB4 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC); // PE8=FSMC_D5 -> DB5 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC); // PE9=FSMC_D6 -> DB6 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC); // PE10=FSMC_D7 -> DB7 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC); // PE11=FSMC_D8 -> DB10 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC); // PE12=FSMC_D9 -> DB11 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC); // PE13=FSMC_D10 -> DB12 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC); // PE14=FSMC_D11 -> DB13 + GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC); // PE15=FSMC_D12 -> DB14 + // PORT_E struct + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | + GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | + GPIO_Pin_14 | GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + // configure PORT_E + GPIO_Init(GPIOE, &GPIO_InitStructure); + + return true; } -void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color) { +/* + * ---------------------- GPIO control functions ---------------------------------------------------------- + */ +// TODO + +/* + * ---------------------- display control functions ------------------------------------------------------- + */ + +void ll_tft_set_backlight(bool state) +{ + if(state){ + GPIOB->BSRRH = GPIO_Pin_0; + } else { + GPIOB->BSRRL = GPIO_Pin_0; + } } -void ll_tft_draw_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) { - +void ll_tft_clear(uint16_t color) +{ + // TODO } -void ll_tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) { - +void ll_tft_write_reg(uint8_t reg_adr, uint16_t reg_value) +{ + TFT_REG = reg_adr; + TFT_RAM = reg_value; } -void ll_tft_draw_bitmap_unscaled(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* dat) { - +uint16_t ll_tft_read_reg(uint8_t reg_adr) +{ + TFT_REG = reg_adr; + return TFT_RAM; } -void ll_tft_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) { +/* + * ---------------------- draw functions ----------------------------------------------------------- + */ +void ll_tft_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) +{ + // TODO +} + +void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color) +{ + // TODO +} + +void ll_tft_draw_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) +{ + // TODO +} + +void ll_tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) +{ + // TODO +} + +void ll_tft_draw_bitmap_unscaled(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* dat) +{ + // TODO +} + +void ll_tft_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) +{ + // TODO } From 0b61f21e7b919e8996ef662e3dcd46389b6f69c6 Mon Sep 17 00:00:00 2001 From: id101010 Date: Mon, 27 Apr 2015 21:26:20 +0200 Subject: [PATCH 2/5] Fixed misplacement of prototypes in ll_tft.h and implemented a propper init function. --- common/lowlevel/ll_tft.h | 10 ---------- discovery/src/ll_system.c | 9 --------- discovery/src/ll_tft.c | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/common/lowlevel/ll_tft.h b/common/lowlevel/ll_tft.h index 14996cb..3353b83 100644 --- a/common/lowlevel/ll_tft.h +++ b/common/lowlevel/ll_tft.h @@ -3,16 +3,6 @@ // init functions bool ll_tft_init(); -bool ll_fsmc_init(); -bool ll_gpio_init(); - -// display control functions -void ll_tft_write_reg(uint8_t reg_adr, uint16_t reg_value); -uint16_t ll_tft_read_reg(uint8_t reg_adr); - -// fsmc functions - -// gpio functions // draw functions void ll_tft_clear(uint16_t color); diff --git a/discovery/src/ll_system.c b/discovery/src/ll_system.c index b666ff9..5858d64 100644 --- a/discovery/src/ll_system.c +++ b/discovery/src/ll_system.c @@ -8,14 +8,10 @@ #include "usbh_core.h" #include "usbh_msc_core.h" - - - USB_OTG_CORE_HANDLE USB_OTG_Core; USBH_HOST USB_Host; RCC_ClocksTypeDef RCC_Clocks; - void SysTick_Handler(void) { USBH_LL_systick(); @@ -26,13 +22,11 @@ void TIM2_IRQHandler(void) USB_OTG_BSP_TimerIRQ(); } - void OTG_FS_IRQHandler(void) { USBH_OTG_ISR_Handler(&USB_OTG_Core); } - bool ll_system_init(void) { /* Initialize LEDS */ @@ -59,13 +53,10 @@ void ll_system_process() { USBH_Process(&USB_OTG_Core, &USB_Host); } - - void ll_system_delay(uint32_t msec) { USB_OTG_BSP_mDelay(msec); } - void ll_system_toggle_led() { STM_EVAL_LEDToggle(LED6); } diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index f5fb128..e648d6e 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -22,9 +22,23 @@ #include "stm32f4xx_rcc.h" #include "stm32f4xx_fsmc.h" +/* + * ---------------------- prototypes -------------------------------------------------------------- + */ + +// init functions +bool ll_fsmc_init(); +bool ll_gpio_init(); +bool ll_display_init(); + +// display control functions +void ll_tft_write_reg(uint8_t reg_adr, uint16_t reg_value); +uint16_t ll_tft_read_reg(uint8_t reg_adr); + /* * ---------------------- defines and makros ------------------------------------------------------ */ + // Colors #define DISPLAY_COLOR_BLACK 0x0000 #define DISPLAY_COLOR_BLUE 0x001F @@ -70,7 +84,25 @@ * ---------------------- init functions ---------------------------------------------------------- */ -bool ll_tft_init() +bool ll_tft_init() +{ + bool gpio, fsmc, display; + + // init gpio + gpio = ll_gpio_init(); + // delay + system_delay(TFT_INIT_TIMEOUT); + // init fsmc + fsmc = ll_fsmc_init(); + // delay + system_delay(TFT_INIT_TIMEOUT); + // init display + display = ll_display_init(); + + return (gpio & fsmc & display); +} + +bool ll_display_init() { ll_tft_write_reg(0x0007,0x0021); system_delay(TFT_INIT_TIMEOUT); From a41359173ae66c9a8dcd6abff4600fc56c29a179 Mon Sep 17 00:00:00 2001 From: id101010 Date: Tue, 28 Apr 2015 23:31:14 +0200 Subject: [PATCH 3/5] Implemented ll_tft_fill_rectange and ll_tft_set_window --- discovery/src/ll_tft.c | 46 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index e648d6e..90de3d3 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -315,6 +315,14 @@ bool ll_gpio_init() * ---------------------- display control functions ------------------------------------------------------- */ +void ll_tft_set_cursor(uint16_t xpos, uint16_t ypos) +{ + // set cursor + ll_tft_write_reg(TFT_SSD1289_REG_4E, xpos); + ll_tft_write_reg(TFT_SSD1289_REG_4F, ypos); + TFT_REG = TFT_SSD1289_REG_22; +} + void ll_tft_set_backlight(bool state) { if(state){ @@ -326,7 +334,14 @@ void ll_tft_set_backlight(bool state) void ll_tft_clear(uint16_t color) { - // TODO + uint32_t n = 0; + + // set cursor to 0 + ll_tft_set_cursor(0,0); + + for(n = 0; n < TFT_PIXEL; n++) { + TFT_RAM = color; + } } void ll_tft_write_reg(uint8_t reg_adr, uint16_t reg_value) @@ -341,6 +356,20 @@ uint16_t ll_tft_read_reg(uint8_t reg_adr) return TFT_RAM; } +void ll_tft_set_window(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend) +{ + uint16_t start,end; + uint16_t xstart_end; + + start = (xstart & 0x00FF); + end = ((xend & 0x00FF) << 8); + xstart_end = (start | end); + + ll_tft_write_reg(TFT_SSD1289_REG_44, xstart_end); + ll_tft_write_reg(TFT_SSD1289_REG_45, ystart); + ll_tft_write_reg(TFT_SSD1289_REG_46, yend); +} + /* * ---------------------- draw functions ----------------------------------------------------------- */ @@ -362,7 +391,20 @@ void ll_tft_draw_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint void ll_tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) { - // TODO + uint16_t area; + uint32_t n; + + // set window + ll_tft_set_window(x1, y1, x2, y2); + ll_tft_set_cursor(x1, y1); + + // calculate area + area = (x2 - x1 + 1) * (y2 - y1 + 1); + + // fill area + for(n = 0; n < area; n++) { + TFT_RAM = color; + } } void ll_tft_draw_bitmap_unscaled(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* dat) From c224d40bbf72daf4309dd8aad9d84b40690247d4 Mon Sep 17 00:00:00 2001 From: id101010 Date: Mon, 4 May 2015 22:04:29 +0200 Subject: [PATCH 4/5] Changed display init --- common/tft/tft.h | 2 +- discovery/src/ll_tft.c | 146 ++++++++++++++++++++++++++++++++++------- 2 files changed, 125 insertions(+), 23 deletions(-) diff --git a/common/tft/tft.h b/common/tft/tft.h index ef25c58..032b9d7 100644 --- a/common/tft/tft.h +++ b/common/tft/tft.h @@ -6,7 +6,7 @@ #define RED RGB(255,0,0) #define GREEN RGB(0,255,0) #define BLUE RGB(0,0,255) -#define WHITE RGB(255,255,255) +#define WHITE 0xF7BE #define BLACK RGB(0,0,0) #define HEX(h) (RGB(((h)>>16),((h)>>8),(h))) diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index 90de3d3..5c05488 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -104,6 +104,10 @@ bool ll_tft_init() bool ll_display_init() { + ll_tft_reset(true); // toggle reset + system_delay(TFT_INIT_TIMEOUT); + ll_tft_reset(false); + ll_tft_write_reg(0x0007,0x0021); system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x0000,0x0001); @@ -114,11 +118,11 @@ bool ll_display_init() system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x0007,0x0033); system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(TFT_SSD1289_REG_11,CURRENT_MODE); // set mode (landscape, portrait) + ll_tft_write_reg(TFT_SSD1289_REG_11,0x6018); // set mode (landscape, portrait) system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x0002,0x0600); system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0012,0x6CEB); + //ll_tft_write_reg(0x0012,0x6CEB); system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x0003,0xA8A4); system_delay(TFT_INIT_TIMEOUT); @@ -180,7 +184,7 @@ bool ll_display_init() system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x003A,0x0302); system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x002F,0x12BE); + //ll_tft_write_reg(0x002F,0x12BE); system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x003B,0x0302); system_delay(TFT_INIT_TIMEOUT); @@ -194,6 +198,90 @@ bool ll_display_init() system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x004e,0x0000); system_delay(TFT_INIT_TIMEOUT); +/* + ll_tft_write_reg(0x00,0x0001); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x03,0xA8A4); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0C,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0D,0x080C); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0E,0x2B00); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x1E,0x00B7); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x01,0x2B3F); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x02,0x0600); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x10,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x11,0x6018); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x05,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x06,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x16,0xEF1C); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x17,0x0003); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x07,0x0233); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0B,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x0F,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x41,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x42,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x48,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x49,0x013F); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x4A,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x4B,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x44,0xEF00); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x45,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x46,0x013F); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x30,0x0707); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x31,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x32,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x33,0x0502); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x34,0x0507); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x35,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x36,0x0204); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x37,0x0502); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x3A,0x0302); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x3B,0x0302); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x23,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x24,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x25,0x8000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x4f,0x0000); + system_delay(TFT_INIT_TIMEOUT); + ll_tft_write_reg(0x4e,0x0000); +*/ + TFT_REG = TFT_SSD1289_REG_22; return true; } @@ -248,11 +336,11 @@ bool ll_gpio_init() RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); // PORT_B init ------------------------------------------------------------------------------------- - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // configure PORT_B GPIO_Init(GPIOB, &GPIO_InitStructure); @@ -318,8 +406,8 @@ bool ll_gpio_init() void ll_tft_set_cursor(uint16_t xpos, uint16_t ypos) { // set cursor - ll_tft_write_reg(TFT_SSD1289_REG_4E, xpos); - ll_tft_write_reg(TFT_SSD1289_REG_4F, ypos); + ll_tft_write_reg(TFT_SSD1289_REG_4E, ypos); + ll_tft_write_reg(TFT_SSD1289_REG_4F, 319-xpos); TFT_REG = TFT_SSD1289_REG_22; } @@ -332,6 +420,15 @@ void ll_tft_set_backlight(bool state) } } +void ll_tft_reset(bool state) +{ + if(state){ + GPIOB->BSRRH = GPIO_Pin_0; + } else { + GPIOB->BSRRL = GPIO_Pin_0; + } +} + void ll_tft_clear(uint16_t color) { uint32_t n = 0; @@ -359,15 +456,23 @@ uint16_t ll_tft_read_reg(uint8_t reg_adr) void ll_tft_set_window(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend) { uint16_t start,end; - uint16_t xstart_end; + uint16_t ystart_end; - start = (xstart & 0x00FF); - end = ((xend & 0x00FF) << 8); - xstart_end = (start | end); + start = (ystart & 0x00FF); + end = ((yend & 0x00FF) << 8); + ystart_end = (start | end); - ll_tft_write_reg(TFT_SSD1289_REG_44, xstart_end); - ll_tft_write_reg(TFT_SSD1289_REG_45, ystart); - ll_tft_write_reg(TFT_SSD1289_REG_46, yend); + + // _tftCmdData(0x44,(y2<<8)+y1); + // _tftCmdData(0x45,319-x2); + // _tftCmdData(0x46,319-x1); + // _tftSetXYQM(x1,y1); + + + + ll_tft_write_reg(TFT_SSD1289_REG_44, ystart_end); + ll_tft_write_reg(TFT_SSD1289_REG_45, 319-xend); + ll_tft_write_reg(TFT_SSD1289_REG_46, 319-xstart); } /* @@ -381,7 +486,8 @@ void ll_tft_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16 void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color) { - // TODO + ll_tft_set_cursor(x,y); + TFT_RAM = color; } void ll_tft_draw_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) @@ -416,7 +522,3 @@ void ll_tft_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) { // TODO } - - - - From 21fddc32ea381298a0afe593dd23004c0684c7ac Mon Sep 17 00:00:00 2001 From: id101010 Date: Mon, 11 May 2015 20:40:43 +0200 Subject: [PATCH 5/5] Implemented new functions --- common/app/app.c | 4 +- discovery/src/font.c | 243 +++++++++++++++++++++++++++++++ discovery/src/font.h | 3 + discovery/src/ll_tft.c | 322 +++++++++++++++++++++++++++-------------- 4 files changed, 459 insertions(+), 113 deletions(-) create mode 100644 discovery/src/font.c create mode 100644 discovery/src/font.h diff --git a/common/app/app.c b/common/app/app.c index cb7bcf9..28df33c 100644 --- a/common/app/app.c +++ b/common/app/app.c @@ -2,7 +2,7 @@ #include "tft.h" #include "system.h" #include "touch.h" -#include "screen_main.h" +#include "screen_guitest.h" void app_init() { @@ -10,7 +10,7 @@ void app_init() { tft_init(); touch_init(); - gui_screen_navigate(get_screen_main()); + gui_screen_navigate(get_screen_guitest()); } diff --git a/discovery/src/font.c b/discovery/src/font.c new file mode 100644 index 0000000..76f5b38 --- /dev/null +++ b/discovery/src/font.c @@ -0,0 +1,243 @@ +#include + +// SmallFont.c +// Font Size : 8x12 +// Memory usage : 1216 bytes +// # characters : 101 +const char small_font[1216] = { +0x08,0x0C,0x20,0x65, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // +0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, // ! +0x00,0x28,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // " +0x00,0x00,0x28,0x28,0xFC,0x28,0x50,0xFC,0x50,0x50,0x00,0x00, // # +0x00,0x20,0x78,0xA8,0xA0,0x60,0x30,0x28,0xA8,0xF0,0x20,0x00, // $ +0x00,0x00,0x48,0xA8,0xB0,0x50,0x28,0x34,0x54,0x48,0x00,0x00, // % +0x00,0x00,0x20,0x50,0x50,0x78,0xA8,0xA8,0x90,0x6C,0x00,0x00, // & +0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x00, // ( +0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00, // ) +0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00, // * +0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00,0x00, // + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, // , +0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, // - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, // . +0x00,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, // / +0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // 0 +0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // 1 +0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00, // 2 +0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00, // 3 +0x00,0x00,0x10,0x30,0x50,0x50,0x90,0x78,0x10,0x18,0x00,0x00, // 4 +0x00,0x00,0xF8,0x80,0x80,0xF0,0x08,0x08,0x88,0x70,0x00,0x00, // 5 +0x00,0x00,0x70,0x90,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00, // 6 +0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x20,0x20,0x20,0x00,0x00, // 7 +0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, // 8 +0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x48,0x70,0x00,0x00, // 9 +0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0x00, // : +0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00, // ; +0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, // < +0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, // = +0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, // > +0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, // ? +0x00,0x00,0x70,0x88,0x98,0xA8,0xA8,0xB8,0x80,0x78,0x00,0x00, // @ +0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00, // A +0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00, // B +0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00, // C +0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00, // D +0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00, // E +0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00, // F +0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00, // G +0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00, // H +0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // I +0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0,0x00, // J +0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x50,0x48,0xEC,0x00,0x00, // K +0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00, // L +0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // M +0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00, // N +0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // O +0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00, // P +0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00, // Q +0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00, // R +0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00, // S +0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // T +0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00, // U +0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00, // V +0x00,0x00,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x50,0x00,0x00, // W +0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00, // X +0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x20,0x20,0x70,0x00,0x00, // Y +0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00, // Z +0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, // [ +0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x00,0x00, // +0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, // ] +0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, // _ +0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00, // a +0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, // b +0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x40,0x38,0x00,0x00, // c +0x00,0x00,0x18,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00, // d +0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, // e +0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00, // f +0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x78,0x44,0x38, // g +0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00, // h +0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00, // i +0x00,0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0, // j +0x00,0x00,0xC0,0x40,0x40,0x5C,0x50,0x70,0x48,0xEC,0x00,0x00, // k +0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00, // l +0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00, // m +0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00, // n +0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, // o +0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0, // p +0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C, // q +0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00, // r +0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00, // s +0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x18,0x00,0x00, // t +0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00, // u +0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x00,0x00, // v +0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00, // w +0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00, // x +0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x20,0xC0, // y +0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00, // z +0x00,0x18,0x10,0x10,0x10,0x20,0x10,0x10,0x10,0x10,0x18,0x00, // { +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, // | +0x00,0x60,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00, // } +0x40,0xA4,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~ +0x50,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00, // Ä +0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, // Ö +0x48,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00, // Ü +0x00,0x00,0x00,0x48,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00, // ä +0x00,0x00,0x00,0x48,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, // ö +0x00,0x00,0x00,0x48,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00 // ü +}; + +// BigFont.c (C)2010 by Henning Karlsen +// Font Size : 16x16 +// Memory usage : 3236 bytes +// # characters : 101 +const char big_font[3236] = { +0x10,0x10,0x20,0x65, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // +0x00,0x00,0x00,0x00,0x07,0x00,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x0F,0x80,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00, // ! +0x00,0x00,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x06,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // " +0x00,0x00,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x7F,0xFE,0x7F,0xFE,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x7F,0xFE,0x7F,0xFE,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00, // # +0x00,0x00,0x02,0x40,0x02,0x40,0x0F,0xF8,0x1F,0xF8,0x1A,0x40,0x1A,0x40,0x1F,0xF0,0x0F,0xF8,0x02,0x58,0x02,0x58,0x1F,0xF8,0x1F,0xF0,0x02,0x40,0x02,0x40,0x00,0x00, // $ +0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x10,0x0E,0x30,0x0E,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x70,0x0C,0x70,0x08,0x70,0x00,0x00,0x00,0x00,0x00,0x00, // % +0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x08,0x0F,0x98,0x19,0xF8,0x18,0xF0,0x18,0xE0,0x19,0xF0,0x0F,0x98,0x00,0x00,0x00,0x00, // & +0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x00,0x00,0x00,0x00,0xF0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xF0,0x00,0x00,0x00,0x00, // ( +0x00,0x00,0x00,0x00,0x0F,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x0F,0x00,0x00,0x00,0x00,0x00, // ) +0x00,0x00,0x00,0x00,0x01,0x80,0x11,0x88,0x09,0x90,0x07,0xE0,0x07,0xE0,0x3F,0xFC,0x3F,0xFC,0x07,0xE0,0x07,0xE0,0x09,0x90,0x11,0x88,0x01,0x80,0x00,0x00,0x00,0x00, // * +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x0E,0x00,0x00,0x00, // , +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00, // , +0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, // / + +0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x78,0x1C,0xF8,0x1C,0xF8,0x1D,0xB8,0x1D,0xB8,0x1F,0x38,0x1F,0x38,0x1E,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 0 +0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x80,0x1F,0x80,0x1F,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x1F,0xF0,0x00,0x00,0x00,0x00, // 1 +0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x38,0x1C,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // 2 +0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x38,0x00,0x38,0x00,0x70,0x03,0xC0,0x03,0xC0,0x00,0x70,0x00,0x38,0x1C,0x38,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // 3 +0x00,0x00,0x00,0x00,0x00,0xE0,0x01,0xE0,0x03,0xE0,0x06,0xE0,0x0C,0xE0,0x18,0xE0,0x1F,0xF8,0x1F,0xF8,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x03,0xF8,0x00,0x00,0x00,0x00, // 4 +0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xE0,0x1F,0xF0,0x00,0x78,0x00,0x38,0x1C,0x38,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // 5 +0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xF0,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 6 +0x00,0x00,0x00,0x00,0x1F,0xFC,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00, // 7 +0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0x38,0x07,0xE0,0x07,0xE0,0x1C,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // 8 +0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0xF8,0x0F,0xF8,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x07,0xC0,0x00,0x00,0x00,0x00, // 9 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // : +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ; +0x00,0x00,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x00, // < +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // = +0x00,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00, // > +0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1E,0x78,0x18,0x38,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00, // ? + +0x00,0x00,0x0F,0xF8,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0xFC,0x1C,0xFC,0x1C,0xFC,0x1C,0xFC,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1F,0xF0,0x07,0xF8,0x00,0x00, // @ +0x00,0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00, // A +0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1F,0xF0,0x00,0x00,0x00,0x00, // B +0x00,0x00,0x00,0x00,0x07,0xF0,0x0E,0x38,0x1C,0x38,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x38,0x0E,0x38,0x07,0xF0,0x00,0x00,0x00,0x00, // C +0x00,0x00,0x00,0x00,0x1F,0xE0,0x0E,0x70,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x70,0x1F,0xE0,0x00,0x00,0x00,0x00, // D +0x00,0x00,0x00,0x00,0x1F,0xF8,0x0E,0x18,0x0E,0x08,0x0E,0x00,0x0E,0x30,0x0F,0xF0,0x0F,0xF0,0x0E,0x30,0x0E,0x00,0x0E,0x08,0x0E,0x18,0x1F,0xF8,0x00,0x00,0x00,0x00, // E +0x00,0x00,0x00,0x00,0x1F,0xF8,0x0E,0x18,0x0E,0x08,0x0E,0x00,0x0E,0x30,0x0F,0xF0,0x0F,0xF0,0x0E,0x30,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // F +0x00,0x00,0x00,0x00,0x07,0xF0,0x0E,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0xF8,0x1C,0x38,0x1C,0x38,0x0E,0x38,0x07,0xF8,0x00,0x00,0x00,0x00, // G +0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1F,0xF0,0x1F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // H +0x00,0x00,0x00,0x00,0x0F,0xE0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x0F,0xE0,0x00,0x00,0x00,0x00, // I +0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x38,0x70,0x38,0x70,0x38,0x70,0x38,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // J +0x00,0x00,0x00,0x00,0x1E,0x38,0x0E,0x38,0x0E,0x70,0x0E,0xE0,0x0F,0xC0,0x0F,0x80,0x0F,0x80,0x0F,0xC0,0x0E,0xE0,0x0E,0x70,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // K +0x00,0x00,0x00,0x00,0x1F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x08,0x0E,0x18,0x0E,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // L +0x00,0x00,0x00,0x00,0x1C,0x1C,0x1E,0x3C,0x1F,0x7C,0x1F,0xFC,0x1F,0xFC,0x1D,0xDC,0x1C,0x9C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00, // M +0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1E,0x1C,0x1F,0x1C,0x1F,0x9C,0x1D,0xDC,0x1C,0xFC,0x1C,0x7C,0x1C,0x3C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00, // N +0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00, // O + +0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // P +0x00,0x00,0x00,0x00,0x03,0xE0,0x0F,0x78,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x7C,0x1C,0xFC,0x0F,0xF8,0x0F,0xF8,0x00,0x38,0x00,0xFC,0x00,0x00, // Q +0x00,0x00,0x00,0x00,0x1F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0F,0xF0,0x0E,0x70,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // R +0x00,0x00,0x00,0x00,0x0F,0xF0,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x00,0x0F,0xE0,0x07,0xF0,0x00,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x0F,0xF0,0x00,0x00,0x00,0x00, // S +0x00,0x00,0x00,0x00,0x1F,0xFC,0x19,0xCC,0x11,0xC4,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x07,0xF0,0x00,0x00,0x00,0x00, // T +0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // U +0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00, // V +0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x0F,0xF8,0x0F,0xF8,0x07,0x70,0x07,0x70,0x00,0x00,0x00,0x00, // W +0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x03,0x80,0x07,0xC0,0x0E,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // X +0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x0F,0xE0,0x00,0x00,0x00,0x00, // Y +0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x38,0x18,0x38,0x10,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x08,0x1C,0x18,0x1C,0x38,0x1F,0xF8,0x00,0x00,0x00,0x00, // Z +0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0xF0,0x00,0x00,0x00,0x00, // [ +0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x07,0x00,0x00,0x00,0x00, // +0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x07,0xF0,0x00,0x00,0x00,0x00, // ] +0x00,0x00,0x01,0x80,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0x7F,0xFF, // _ + +0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x70,0x00,0x70,0x0F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // a +0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0F,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1B,0xF0,0x00,0x00,0x00,0x00, // b +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x00,0x1C,0x00,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // c +0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x70,0x00,0x70,0x00,0x70,0x0F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // d +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1F,0xF0,0x1C,0x00,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // e +0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0x70,0x07,0x70,0x07,0x00,0x07,0x00,0x1F,0xE0,0x1F,0xE0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00, // f +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xD8,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xF0,0x07,0xF0,0x00,0x70,0x1C,0x70,0x0F,0xE0, // g +0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0xF0,0x0F,0x38,0x0F,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // h +0x00,0x00,0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x0F,0xF8,0x00,0x00,0x00,0x00, // i +0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x03,0xF0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x1C,0x70,0x0C,0xF0,0x07,0xE0, // j +0x00,0x00,0x00,0x00,0x1E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x38,0x0E,0x70,0x0E,0xE0,0x0F,0xC0,0x0E,0xE0,0x0E,0x70,0x0E,0x38,0x1E,0x38,0x00,0x00,0x00,0x00, // k +0x00,0x00,0x00,0x00,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x0F,0xF8,0x00,0x00,0x00,0x00, // l +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x1C,0x9C,0x00,0x00,0x00,0x00, // m +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00, // n +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // o + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0xF0,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0F,0xF0,0x0E,0x00,0x0E,0x00,0x1F,0x00, // p +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xB0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x1F,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xF0, // q +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xF0,0x0F,0xF8,0x0F,0x38,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,0x00,0x00, // r +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1C,0x30,0x1C,0x30,0x0F,0x80,0x03,0xE0,0x18,0x70,0x18,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // s +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x1F,0xF0,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x70,0x07,0x70,0x03,0xE0,0x00,0x00,0x00,0x00, // t +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // u +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00, // v +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x9C,0x1C,0x9C,0x0F,0xF8,0x07,0x70,0x07,0x70,0x00,0x00,0x00,0x00, // w +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xE0,0x1C,0xE0,0x0F,0xC0,0x07,0x80,0x07,0x80,0x0F,0xC0,0x1C,0xE0,0x1C,0xE0,0x00,0x00,0x00,0x00, // x +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0xE0,0x01,0xC0,0x1F,0x80, // y +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x18,0xE0,0x11,0xC0,0x03,0x80,0x07,0x00,0x0E,0x20,0x1C,0x60,0x1F,0xE0,0x00,0x00,0x00,0x00, // z +0x00,0x00,0x00,0x00,0x01,0xF8,0x03,0x80,0x03,0x80,0x03,0x80,0x07,0x00,0x1C,0x00,0x1C,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0xF8,0x00,0x00,0x00,0x00, // { +0x00,0x00,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00, // | +0x00,0x00,0x00,0x00,0x1F,0x80,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x38,0x00,0x38,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00, // } +0x00,0x00,0x00,0x00,0x1F,0x1C,0x3B,0x9C,0x39,0xDC,0x38,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~ +0x0C,0x30,0x0C,0x30,0x03,0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1F,0xF8,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00, // Ä + +0x0C,0x18,0x0C,0x18,0x03,0xE0,0x07,0xF0,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0E,0x38,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00, // Ö +0x0C,0x60,0x0C,0x60,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // Ü +0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x0C,0x60,0x00,0x00,0x0F,0xE0,0x00,0x70,0x00,0x70,0x0F,0xF0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00, // ä +0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x0C,0x60,0x00,0x00,0x0F,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xE0,0x00,0x00,0x00,0x00, // o +0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x60,0x0C,0x60,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x0F,0xD8,0x00,0x00,0x00,0x00 // u +}; + +// SevenSegNumFont.c +// Font Size : 32x50 +// Memory usage : 2004 bytes +// # characters : 10 +const char seven_seg_num_font[2004] = { +0x20,0x32,0x30,0x0A, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x38,0x00,0x00,0x18,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x00,0x3E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0C,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x01,0xFF,0xFE,0x18,0x03,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x00,0x00,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x0C,0xFF,0xFE,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x39,0xFF,0xFE,0x00,0x23,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x00,0xFF,0xFE,0xF0,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x27,0xFF,0xFF,0xC0,0x39,0xFF,0xFF,0x18,0x3E,0x00,0x00,0x78,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x1E,0x00,0x00,0xF0,0x0C,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x60,0x0C,0xFF,0xFE,0xF0,0x1E,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3F,0x00,0x01,0xF8,0x3E,0x00,0x00,0x78,0x39,0xFF,0xFE,0x18,0x23,0xFF,0xFF,0x88,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0xF0,0x00,0xFF,0xFE,0x60,0x01,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9 +}; diff --git a/discovery/src/font.h b/discovery/src/font.h new file mode 100644 index 0000000..ca0035a --- /dev/null +++ b/discovery/src/font.h @@ -0,0 +1,3 @@ +const char small_font[1216]; +const char big_font[3236]; +const char seven_seg_num_font[2004]; diff --git a/discovery/src/ll_tft.c b/discovery/src/ll_tft.c index e0edc8d..812ee32 100644 --- a/discovery/src/ll_tft.c +++ b/discovery/src/ll_tft.c @@ -16,8 +16,11 @@ * ---------------------------------------- */ #include "ll_tft.h" +#include "tft.h" #include "system.h" #include "stm32f4xx.h" +#include "font.h" +#include "stdlib.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_fsmc.h" @@ -198,89 +201,6 @@ bool ll_display_init() system_delay(TFT_INIT_TIMEOUT); ll_tft_write_reg(0x004e,0x0000); system_delay(TFT_INIT_TIMEOUT); -/* - ll_tft_write_reg(0x00,0x0001); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x03,0xA8A4); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0C,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0D,0x080C); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0E,0x2B00); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x1E,0x00B7); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x01,0x2B3F); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x02,0x0600); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x10,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x11,0x6018); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x05,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x06,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x16,0xEF1C); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x17,0x0003); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x07,0x0233); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0B,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x0F,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x41,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x42,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x48,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x49,0x013F); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x4A,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x4B,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x44,0xEF00); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x45,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x46,0x013F); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x30,0x0707); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x31,0x0204); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x32,0x0204); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x33,0x0502); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x34,0x0507); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x35,0x0204); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x36,0x0204); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x37,0x0502); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x3A,0x0302); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x3B,0x0302); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x23,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x24,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x25,0x8000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x4f,0x0000); - system_delay(TFT_INIT_TIMEOUT); - ll_tft_write_reg(0x4e,0x0000); -*/ TFT_REG = TFT_SSD1289_REG_22; return true; @@ -462,26 +382,111 @@ void ll_tft_set_window(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t end = ((yend & 0x00FF) << 8); ystart_end = (start | end); - - // _tftCmdData(0x44,(y2<<8)+y1); - // _tftCmdData(0x45,319-x2); - // _tftCmdData(0x46,319-x1); - // _tftSetXYQM(x1,y1); - - - ll_tft_write_reg(TFT_SSD1289_REG_44, ystart_end); ll_tft_write_reg(TFT_SSD1289_REG_45, 319-xend); ll_tft_write_reg(TFT_SSD1289_REG_46, 319-xstart); } +void ll_tft_reset_window() +{ + ll_tft_write_reg(0x44,239<<8); + ll_tft_write_reg(0x45,0); + ll_tft_write_reg(0x46,319); +} + /* * ---------------------- draw functions ----------------------------------------------------------- */ void ll_tft_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { - // TODO + + if(y1==y2){ + if(x2 abs(y2-y1)) + { + //Without floating point! + int deltax = ((int)x2-(int)x1); + int deltay = ((int)y2-(int)y1)<<1; // multiple by 2 to make it easier to round + int x = 0; + if (x1>x2) + { + do + { + //y = mx + b (math theory, linear functions) + ll_tft_set_cursor(x1+x,y1+ (((long)deltay*(long)x/deltax+1)>>1)); // Add 1 and divde by 2 = +0.5 + TFT_RAM = color; + } + while(x--!=deltax); + } + else + { + do + { + ll_tft_set_cursor(x1+x,y1+ (((long)deltay*(long)x/deltax+1)>>1)); + TFT_RAM = color; + } + while(x++!=deltax); + } + } + else + { + int deltax = ((int)x2-(int)x1)<<1; + int deltay = ((int)y2-(int)y1); + int y = 0; + if (y1>y2) + { + do + { + ll_tft_set_cursor(x1+ (((long)deltax*(long)y/deltay+1)>>1),y1+ y); + TFT_RAM = color; + } + while(y--!=deltay); + } + else + { + do + { + ll_tft_set_cursor(x1+ (((long)deltax*(long)y/deltay+1)>>1),y1+ y); + TFT_RAM = color; + } + while(y++!=deltay); + } + } + } } void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color) @@ -490,26 +495,44 @@ void ll_tft_draw_pixel(uint16_t x,uint16_t y,uint16_t color) TFT_RAM = color; } -uint8_t ll_tft_num_fonts() { - return 1; -} - -uint8_t ll_tft_font_height(uint8_t fontnum) { - return 8; -} - -uint8_t ll_tft_font_width(uint8_t fontnum) { - return 5; -} - -void ll_tft_draw_char(uint16_t x, uint16_t y, uint16_t color, uint16_t bgcolor, uint8_t font, char c) { - - -} - -void ll_tft_draw_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) +void ll_tft_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { - // TODO + unsigned int tmp; + unsigned int i; + + if(x1 > x2){ + tmp = x1; + x1 = x2; + x2 = tmp; + } + + if(y1 > y2){ + tmp = y1; + y1 = y2; + y2 = tmp; + } + + i = x1; + + ll_tft_set_cursor(x1, y1); + + while(i++ != x2) TFT_RAM = color; + + ll_tft_set_cursor(x1,y2); + + while(i-- != x1) TFT_RAM = color; + + i = y1; + + ll_tft_write_reg(0x11,0x6030); // Change adresspointer direction + ll_tft_set_cursor(x2, y1); + + while(i++ != y2) TFT_RAM = color; + + ll_tft_set_cursor(x1, y1); + + while(i-- != y1) TFT_RAM = color; + ll_tft_write_reg(0x11,0x6018); // Set adresspointer direction normal again } void ll_tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint16_t color) @@ -528,6 +551,8 @@ void ll_tft_fill_rectangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint for(n = 0; n < area; n++) { TFT_RAM = color; } + + ll_tft_reset_window(); } void ll_tft_draw_bitmap_unscaled(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* dat) @@ -539,3 +564,78 @@ void ll_tft_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) { // TODO } + +const char *get_font(uint8_t font) +{ + switch(font){ + case 0: return small_font; + case 1: return big_font; + case 2: return seven_seg_num_font; + } +} + +uint8_t ll_tft_num_fonts() +{ + return 3; +} + +uint8_t ll_tft_font_height(uint8_t fontnum) { + const char *font = get_font(fontnum); + return (uint8_t) font[1]; +} + +uint8_t ll_tft_font_width(uint8_t fontnum) { + const char *font = get_font(fontnum); + return (uint8_t) font[0]; +} + +void ll_tft_draw_char(uint16_t x, uint16_t y, uint16_t color, uint16_t bgcolor, uint8_t fontnum, char c) +{ + + const char *font = get_font(fontnum); + unsigned char width = (uint8_t) font[0]; + unsigned char height = (uint8_t) font[1]; + unsigned char offset = (uint8_t) font[2]; + unsigned int ind = ((c-offset) * ((width / 8) * height)) + 4; + unsigned int cnt = 0; + unsigned char bitm = 0; + + bool bgIsTrans = (bgcolor == TRANSPARENT); + bool enTrans = 0; + + ll_tft_set_window(x, y, x + width - 1, y + height - 1); + + for(cnt = (width / 8) * height; cnt > 0; cnt--){ + for(bitm = 0x80; bitm > 0; bitm >>= 1){ + if((font[ind]) & bitm){ + if(enTrans){ + enTrans = 0; + ll_tft_write_reg(0x23,0x0000); + ll_tft_write_reg(0x24,0x0000); + TFT_REG = TFT_SSD1289_REG_22; + } + + TFT_RAM = color; + + } else { + if(bgIsTrans && !enTrans){ + enTrans = 1; + ll_tft_write_reg(0x23,0xFFFF); + ll_tft_write_reg(0x24,0xFFFF); + TFT_REG = TFT_SSD1289_REG_22; + } + + TFT_RAM = bgcolor; + } + } + + ind++; + } + + if(enTrans){ + ll_tft_write_reg(0x23,0x0000); + ll_tft_write_reg(0x24,0x0000); + } + + ll_tft_reset_window(); +}