Class Module for EA DOGS102 Graphic LCD display SPI Interface
Dependents: mDotEVBM2X MTDOT-EVB-LinkCheck-AL MTDOT-EVBDemo-DRH MTDOT_BOX_EVB_LCD_Helloworld ... more
Revision 0:f40dbeaefe69, committed 2015-07-06
- Comitter:
- falingtrea
- Date:
- Mon Jul 06 19:37:13 2015 +0000
- Child:
- 1:3b02b7fb79c9
- Commit message:
- Initial release
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DOGS102.cpp Mon Jul 06 19:37:13 2015 +0000
@@ -0,0 +1,346 @@
+/**
+ * @file DOGS102.cpp
+ * @brief Device driver - DOGS102 102x64 pixel Graphic LCD display W/RTOS Support
+ * @author Tim Barr
+ * @version 1.0
+ * @see http://www.lcd-module.com/eng/pdf/grafik/dogs102-6e.pdf
+ * @see http://www.lcd-module.com/eng/pdf/zubehoer/uc1701.pdf
+ *
+ * Copyright (c) 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "DOGS102.h"
+#include "mbed_debug.h"
+#include "rtos.h"
+
+// macro to make sure x falls into range from low to high (inclusive)
+#define CLIP(x, low, high) { if ( (x) < (low) ) x = (low); if ( (x) > (high) ) x = (high); } while (0);
+
+DOGS102::DOGS102(SPI &spi, DigitalOut &lcd_cs, DigitalOut &cmnd_data)
+{
+ _spi = &spi;
+ _lcd_cs = &lcd_cs;
+ _cmnd_data = &cmnd_data;
+
+ DOGS102::init();
+
+ return;
+}
+uint8_t DOGS102::setCursor(uint8_t xcur, uint8_t ycur)
+{
+ uint8_t ypage;
+ uint8_t y_shift;
+
+ CLIP(xcur, 0, LCDWIDTH-1);
+ ypage = ycur/8;
+ CLIP(ypage, 0, LCDPAGES-1);
+ y_shift = ycur % 8;
+ DOGS102::writeCommand(SETPGADDR,ypage);
+ DOGS102::writeCommand(SETCOLADDRMSB,xcur>>4);
+ DOGS102::writeCommand(SETCOLADDRLSB,xcur);
+ return y_shift;
+ }
+
+void DOGS102::clearBuffer(void)
+{
+ memset(_lcdbuffer, 0, sizeof(_lcdbuffer));
+
+ if (!_update_flag)
+ {
+ DOGS102::sendBuffer(_lcdbuffer);
+ }
+
+}
+
+void DOGS102::writeText(uint8_t column, uint8_t page, const uint8_t *font_address, const char *text, const uint8_t size)
+{
+ // Position of character data in memory array
+ uint16_t pos_array;
+ // temporary column, page address, and column_cnt are used
+ // to stay inside display area
+ uint8_t i,y, column_cnt = 0;
+
+ // font information, needed for calculation
+ uint8_t start_code, last_code, width, page_height, bytes_p_char;
+
+ uint8_t *txtbuffer;
+
+ start_code = font_address[2]; // get first defined character
+ last_code = font_address[3]; // get last defined character
+ width = font_address[4]; // width in pixel of one char
+ page_height = font_address[6]; // page count per char
+ bytes_p_char = font_address[7]; // bytes per char
+
+ if(page_height + page > LCDPAGES) //stay inside display area
+ page_height = LCDPAGES - page;
+
+ // The string is displayed character after character. If the font has more then one page,
+ // the top page is printed first, then the next page and so on
+ for(y = 0; y < page_height; y++)
+ {
+ txtbuffer = &_lcdbuffer[page*LCDWIDTH + column];
+ column_cnt = 0; // clear column_cnt start point
+ i = 0;
+ while(( i < size) && ((column_cnt + column) < LCDWIDTH))
+ {
+ if(text[i] < start_code || (uint8_t)text[i] > last_code) //make sure data is valid
+ i++;
+ else
+ {
+ // calculate position of ASCII character in font array
+ // bytes for header + (ASCII - startcode) * bytes per char)
+ pos_array = 8 + (uint8_t)(text[i++] - start_code) * bytes_p_char;
+
+ // get the dot pattern for the part of the char to print
+ pos_array += y*width;
+
+ // stay inside display area
+ if((column_cnt + width + column) > LCDWIDTH)
+ column_cnt = LCDWIDTH-width;
+
+ // copy character data to buffer
+ memcpy (txtbuffer+column_cnt,font_address+pos_array,width);
+ }
+
+ column_cnt += width;
+ }
+ if (!_update_flag)
+ {
+ setCursor(column,(page+y)*8); // set start position x and y
+ DOGS102::writeData(txtbuffer,column_cnt);
+ }
+ }
+}
+
+void DOGS102::writeBitmap(uint8_t column, uint8_t page, const uint8_t *bm_address)
+{
+ uint8_t width, page_cnt, bm_pntr;
+
+ width = bm_address[0];
+ page_cnt = (bm_address[1] + 7) / 8; //height in pages, add 7 and divide by 8 for getting the used pages (byte boundaries)
+
+ if(width + column > LCDWIDTH) //stay inside display area
+ width = LCDWIDTH - column;
+ if(page_cnt + page > LCDPAGES)
+ page_cnt = LCDPAGES - page;
+
+ for (uint8_t i=0;i < page_cnt;i++ )
+ {
+ bm_pntr = 2+i*width;
+ memcpy(_lcdbuffer+column+((i+page)*LCDWIDTH),bm_address+bm_pntr, width);
+ }
+
+ if (_update_flag == 0)
+ {
+ DOGS102::sendBuffer(_lcdbuffer);
+ }
+}
+
+void DOGS102::startUpdate(void)
+{
+ _update_flag++;
+}
+
+void DOGS102::endUpdate(void)
+{
+ _update_flag--;
+
+ // fix boundary issue
+ if (_update_flag < 0)
+ _update_flag = 0;
+
+ if (_update_flag == 0)
+ {
+ DOGS102::sendBuffer(_lcdbuffer);
+ }
+}
+
+uint8_t DOGS102::getUpdateState(void)
+{
+ return _update_flag;
+}
+
+uint8_t DOGS102::init(void)
+{
+ uint8_t result = 0;
+
+ _spi->frequency(4000000);
+ _spi->format(8,3); // 8bit transfers, SPI mode 3
+ _lcd_cs->write(1); // initialize chip select pin
+ _cmnd_data->write(1); // initialize command/data pin
+ _update_flag = 0; // initialize update semaphore
+
+ // Reset all registers to POR values
+// result = DOGS102::writeCommand(SOFTRESET);
+ osDelay(50);
+
+ // send initial setup commands to power up the display
+ result |= DOGS102::writeCommand(SETSCROLLLINE,0x00); // set scroll line to 0
+ result |= DOGS102::writeCommand(SETSEGDIR,0x01); // set reverse seg direction
+ result |= DOGS102::writeCommand(SETCOMDIR,0x00); // set normal com direction
+ result |= DOGS102::writeCommand(SETALLPIXELON,0x00); // disable all pixel on mode
+ result |= DOGS102::writeCommand(SETINVDISP,0x00); // Turn display inverse off
+ result |= DOGS102::writeCommand(SETLCDBIAS,0x00); // set bias ratio to 1/9
+ result |= DOGS102::writeCommand(SETPWRCTRL,0x07); // turn on booster,regulator and follower
+ result |= DOGS102::writeCommand(SETVLCDRESRATIO,0x07); // Set resistor ratio tomax
+ result |= DOGS102::writeCommand(SETELECVOL,0x10); // set contrast to 32 out of 63
+ result |= DOGS102::writeCommand(SETAPROGCTRL,0x83); // enable wrap around bits
+ result |= DOGS102::writeCommand(SETDISPEN,0x01); // set display enable bit
+
+ DOGS102::clearBuffer();
+
+ if(result != 0)
+ {
+ debug("%s %d: ILS29011:init failed\n\r", __FILE__, __LINE__);
+ }
+
+ return result;
+}
+
+uint8_t DOGS102::writeCommand(uint8_t const reg, uint8_t const data) const
+{
+ uint8_t buf;
+ uint8_t result = 0;
+
+ switch (reg) // setup data byte for specific command register write
+ {
+ case SETCOLADDRLSB :
+ // use COLMASK for data
+ buf = SETCOLADDRLSB | (data & COLMASK);
+ break;
+ case SETCOLADDRMSB :
+ // use COLMASK for data
+ buf = SETCOLADDRMSB | (data & COLMASK);
+ break;
+ case SETPWRCTRL :
+ // use PCMASK for data
+ buf = SETPWRCTRL | (data & PCMASK);
+ break;
+ case SETSCROLLLINE :
+ // use SLMASK for data
+ buf = SETSCROLLLINE | (data & SLMASK);
+ break;
+ case SETPGADDR :
+ // use COLMASK for data
+ buf = SETPGADDR | (data & COLMASK);
+ break;
+ case SETVLCDRESRATIO :
+ // use PCMASK for data
+ buf = SETVLCDRESRATIO | (data & PCMASK);
+ break;
+ case SETELECVOL :
+ // double byte command use SLMASK for data
+ buf = data & SLMASK;
+ break;
+ case SETALLPIXELON :
+ // use LSBMASK for data
+ buf = SETALLPIXELON | (data & LSBMASK);
+ break;
+ case SETINVDISP :
+ // use LSBMASK for data
+ buf = SETINVDISP | (data & LSBMASK);
+ break;
+ case SETDISPEN :
+ // use LSBMASK for data
+ buf = SETDISPEN | (data & LSBMASK);
+ break;
+ case SETSEGDIR :
+ // use LSBMASK for data
+ buf = SETSEGDIR | (data & LSBMASK);
+ break;
+ case SETLCDBIAS :
+ // use LSBMASK for data
+ buf = SETLCDBIAS | (data & LSBMASK);
+ break;
+ case SETCOMDIR :
+ // use LC1MASK for data
+ buf = SETCOMDIR | ((data << 3) & COLMASK);
+ break;
+ case SOFTRESET :
+ // no data mask needed
+ buf = SOFTRESET;
+ break;
+ case SETAPROGCTRL :
+ // Double byte command use WAMASK and TCMASK for data
+ buf = data & (COLMASK | TCMASK);
+ break;
+ default :
+ debug("Command Register not valid\n\r");
+ result = 1;
+ }
+
+ if (result == 0)
+ {
+ _spi->frequency(4000000);
+ _spi->format(8,3); // 8bit transfers, SPI mode 3
+
+ _lcd_cs->write (0); // enable LCD SPI interface
+ _cmnd_data->write(0); // set to command mode
+
+ switch (reg) // send first byte of double byte command for these register
+ {
+ case SETELECVOL :
+ case SETAPROGCTRL :
+ _spi->write(reg);
+ break;
+ }
+
+ _spi->write(buf); // send command register
+
+ _cmnd_data->write(1); // set back to data mode
+ _lcd_cs->write(1); // disable LCD SPI Interface
+
+ }
+
+ if(result != 0)
+ {
+ debug("DOGS102:writeCommand failed\n\r");
+ }
+
+ return result;
+}
+
+void DOGS102::writeData(const uint8_t* data, uint8_t count) const
+{
+ uint8_t result = 0;
+ uint8_t i;
+
+ _spi->frequency(4000000);
+ _spi->format(8,3); // 8bit transfers, SPI mode 3
+
+ _lcd_cs->write(0); // enable LCD SPI interface
+ i = 0; // initialize transfer counter
+
+ do
+ {
+ _spi->write(data[i]);
+ i++;
+ } while ((result == 0) && (i <= count)) ;
+
+ _lcd_cs->write(1); // disable LCD SPI interface
+
+ return;
+}
+
+void DOGS102::sendBuffer(const uint8_t* buffer)
+{
+ //debug("Sending LCD Buffer\n");
+ for (int i=0; i<LCDPAGES; i++)
+ {
+ DOGS102::setCursor(0,i*8);
+ DOGS102::writeData(buffer + i*LCDWIDTH, LCDWIDTH);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DOGS102.h Mon Jul 06 19:37:13 2015 +0000
@@ -0,0 +1,201 @@
+/**
+ * @file DOGS102.h
+ * @brief Device driver - DOGS102 102x64 pixel Graphic LCD display W/RTOS support
+ * @author Tim Barr
+ * @version 1.0
+ * @see http://www.lcd-module.com/eng/pdf/grafik/dogs102-6e.pdf
+ * @see http://www.lcd-module.com/eng/pdf/zubehoer/uc1701.pdf
+ *
+ * Copyright (c) 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef DOGS102_H
+#define DOGS102_H
+
+#include "mbed.h"
+
+/** Using the Multitech MTDOT-EVB
+ *
+ * Example:
+ * @code
+ * #include "mbed.h"
+ * #include "DOGS102.h"
+ *
+
+ *
+ * int main()
+ * {
+
+ * }
+ * @endcode
+ */
+
+/**
+ * @class DOGS102
+ * @brief API abstraction for the DOGS102 Liquid Crystal Graphics Display
+ * initial version will be polling only. Interrupt service will
+ * be added at a later point
+ */
+#define LCDWIDTH 102
+#define LCDHEIGHT 64
+#define LCDPAGES 8 // LCDHEIGHT/8
+/*
+
+ Each page is 8 lines, one byte per column
+
+ Col0
+ +---+--
+ | 0 |
+Page 0 | 1 |
+ | 2 |
+ | 3 |
+ | 4 |
+ | 5 |
+ | 6 |
+ | 7 |
+ +---+--
+*/
+
+class DOGS102
+{
+public:
+
+ /**
+ * @enum DATAMASKS
+ * @brief collection of data masks for commands
+ */
+
+ enum DATAMASKS
+ {
+ LSBMASK = 0x01,
+ WAMASK = 0x03,
+ PCMASK = 0x07,
+ LC1MASK = 0x08,
+ COLMASK = 0x0F,
+ SLMASK = 0x3F,
+ TCMASK = 0x80
+ };
+
+ /**
+ * @enum COMMANDS
+ * @brief The device command register map
+ */
+
+ enum COMMANDs
+ {
+ SETCOLADDRLSB = 0x00, // use COLMASK for data
+ SETCOLADDRMSB = 0x10, // use COLMASK for data
+ SETPWRCTRL = 0x28, // use PCMASK for data
+ SETSCROLLLINE = 0X40, // use SLMASK for data
+ SETPGADDR = 0xB0, // use COLMASK for data
+ SETVLCDRESRATIO = 0x20, // use PCMASK for data
+ SETELECVOL = 0x81, // double byte command use SLMASK for data
+ SETALLPIXELON = 0xA4, // use LSBMASK for data
+ SETINVDISP = 0xA6, // use LSBMASK for data
+ SETDISPEN = 0xAE, // use LSBMASK for data
+ SETSEGDIR = 0xA0, // use LSBMASK for data
+ SETCOMDIR = 0xC0, // use LC1MASK for data
+ SOFTRESET = 0xE2, // no data mask needed
+ SETLCDBIAS = 0xA2, // use LSBMASK for data
+ SETAPROGCTRL = 0xFA // Double byte command use WAMASK and TCMASK for data
+ };
+
+ /** Create the DOGS102 object
+ * @param spi - A defined SPI object
+ * @param spi_cs - a defined DigitalOut connected to CS pin of LCD
+ * @param cmnd_data - a defined Digitalout connected to Command/Data pin of LCD
+ */
+ DOGS102(SPI &spi, DigitalOut &spi_cs, DigitalOut &cmnd_data );
+
+ /** Clears the buffer memory
+ * This commands clears the display buffer if Update flag is set
+ * it clears the display directly if Update flagis cleared
+ */
+ void clearBuffer(void);
+
+ /*
+ * Writes text to display using specified font table
+ * @column - bit column where write starts
+ * @page - Page that write starts (0-7 valid) A page is 8 pixels vertical on display.
+ * @*font_address - address pointer to font table to use
+ * @*str - pointer to string array to display
+ * @size - size of data in str
+ */
+ void writeText(uint8_t column, uint8_t page, const uint8_t *font_address, const char *str, const uint8_t size);
+
+ /*
+ *Writes text to display using specified font table
+ * @column - bit column where write starts
+ * @page - Page that write starts (0-7 valid). A page is 8 pixels vertical on display.
+ * @*bm_address - pointer to uint8_t array with bitmap data to display
+ */
+ void writeBitmap(uint8_t column, uint8_t page, const uint8_t *bm_address);
+
+ /*
+ * Allows LCD buffer to be update without changing LCD
+ * Each call increments the Update semaphore and required a matching endUpdate
+ */
+ void startUpdate(void);
+
+ /*
+ * Enables direct updates to LCD and sends buffer to LCD
+ * Each call decrements the Update semephore. If the Update semaphore is cleared,
+ * the LCD is updated.
+ */
+ void endUpdate(void);
+
+ /** Gets state of update semaphore
+ * @return update semaphore flag state 0 = direct update of LCD >0 is update LCD buffer only
+ */
+ uint8_t getUpdateState(void);
+
+
+private:
+
+ SPI *_spi;
+ DigitalOut *_lcd_cs;
+ DigitalOut *_cmnd_data;
+ uint8_t _lcdbuffer[LCDWIDTH*LCDPAGES];
+ uint8_t _update_flag;
+
+ uint8_t init(void);
+
+ void sendBuffer(const uint8_t* buffer);
+
+ /** Write to a command register
+ * @param reg - The register to be written
+ * @param data - pointer to char data buffer
+ * @param count - size of char data buffer, default 1 if not defined
+ */
+ uint8_t writeCommand(uint8_t const reg, uint8_t const data = 0) const;
+
+ /** Write data to LCD screen buffer (exposed for debugging reasons)
+ * @param count - Size of the char data buffer
+ * @param data - pointer to char data buffer
+ * @return The status
+ */
+ void writeData(const uint8_t* data, uint8_t count) const;
+
+ /** Sets the cursor location
+ * @param xcur - x-cursor location in pixels. value is clipped if outside display size
+ * @param ycur - y-cursor location in pixels. value is clipped if outside display size
+ * @return - modulus of page that data needs to be shifted
+ */
+ uint8_t setCursor(uint8_t xcur, uint8_t ycur);
+
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MultiTech_Logo.h Mon Jul 06 19:37:13 2015 +0000
@@ -0,0 +1,35 @@
+/* File 'C:\Users\tab\Documents\LORA RF\mDot-EVB Gamgee\MultiTech_Logo_Black_1bit.bmp' as include
+
+ TAB 6/22/2015 - Modified for mbed compiler
+
+ the array starts with a 2 byte header:
+ 1th Byte: Width of image in dots
+ 2th Byte: Height of image in dots
+ After that image data will follow */
+
+#define MultiTech_Logo_LEN 308
+
+const uint8_t MultiTech_Logo[MultiTech_Logo_LEN] =
+{
+ 102, 21,
+ 240,240,240,224,192,128,192,224,240,240,240, 0, 0,240,240,240,
+ 0, 0, 0, 0,240,240,240, 0, 0,240,240,240, 0, 0, 0,112,
+ 112,112,240,240,240,112,112,112, 0,240,240,240, 0, 48, 48, 48,
+ 240,240, 48, 48, 48, 0,240,240, 48, 48, 48, 48, 48, 0,128,192,
+ 224,112, 48, 48, 48, 48,112, 96, 0,240,240, 0, 0, 0, 0, 0,
+ 240,240, 0,192,240,248,124,190,222,239,247,247,247,247,247,239,
+ 222,190,124,248,240,192,127,127,127, 7, 15, 31, 15, 7,127,127,
+ 127, 0, 0, 31, 63,127,112, 96, 96,112,127, 63, 31, 0, 0,127,
+ 127,127,112,112,112,112, 0, 0,127,127,127, 0, 0, 0, 0,127,
+ 127,127, 0, 0, 0, 0,127,127, 0, 0, 0, 0,127,127, 98, 98,
+ 98, 98, 98, 0, 15, 31, 56,112, 96, 96, 96, 96,112, 48, 0,127,
+ 127, 2, 2, 2, 2, 2,127,127, 0, 31,127,255,240,239,223,191,
+ 127,127,127,127,127,191,223,239,240,255,127, 31, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 3, 3, 7, 7, 7, 7, 7, 7, 7, 3, 3, 1, 0,
+ 0, 0
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/font_6x8.h Mon Jul 06 19:37:13 2015 +0000
@@ -0,0 +1,120 @@
+/*File '6X8.FV' as include
+The font was generated with EA FontEditor. Please contact ELECTRONIC ASSEMBLY
+for more details (techik@lcd-module.de)
+
+ TAB 6/22/2015 - Modified for mbed compiler
+
+ the array starts with a 8 byte header:
+ 1st Byte: 'F' first 2 bytes are always FV
+ 2nd Byte: 'V' for FONT VERTICAL
+ 3rd Byte: First code to define
+ 4th Byte: Last code to define
+ 5th Byte: Width of character in dots
+ 6th Byte: Height of character in dots
+ 7th Byte: Height of character in bytes
+ 8th Byte: Bytes needed for each character (1..255)
+ or 0 for big fonts calculate WidthInDots * HeightInBytes
+ After that font data will follow */
+
+#define FONT_6X8_LEN 584
+
+const uint8_t font_6x8[FONT_6X8_LEN] =
+{
+ 70, 86, 32,127, 6, 8, 1, 6,
+ 0, 0, 0, 0, 0, 0,
+ 0, 0, 95, 0, 0, 0,
+ 0, 7, 0, 7, 0, 0,
+ 20,127, 20,127, 20, 0,
+ 36, 42,127, 42, 18, 0,
+ 35, 19, 8,100, 98, 0,
+ 54, 73, 86, 32, 80, 0,
+ 0, 8, 7, 3, 0, 0,
+ 0, 28, 34, 65, 0, 0,
+ 0, 65, 34, 28, 0, 0,
+ 42, 28,127, 28, 42, 0,
+ 8, 8, 62, 8, 8, 0,
+ 0,128,112, 48, 0, 0,
+ 8, 8, 8, 8, 8, 0,
+ 0, 0, 96, 96, 0, 0,
+ 32, 16, 8, 4, 2, 0,
+ 62, 81, 73, 69, 62, 0,
+ 0, 66,127, 64, 0, 0,
+ 66, 97, 81, 73, 70, 0,
+ 33, 65, 73, 77, 51, 0,
+ 24, 20, 18,127, 16, 0,
+ 39, 69, 69, 69, 57, 0,
+ 60, 74, 73, 73, 48, 0,
+ 65, 33, 17, 9, 7, 0,
+ 54, 73, 73, 73, 54, 0,
+ 6, 73, 73, 41, 30, 0,
+ 0, 0, 20, 0, 0, 0,
+ 0, 64, 52, 0, 0, 0,
+ 0, 8, 20, 34, 65, 0,
+ 20, 20, 20, 20, 20, 0,
+ 0, 65, 34, 20, 8, 0,
+ 2, 1, 81, 9, 6, 0,
+ 62, 65, 93, 89, 78, 0,
+ 124, 18, 17, 18,124, 0,
+ 127, 73, 73, 73, 54, 0,
+ 62, 65, 65, 65, 34, 0,
+ 127, 65, 65, 65, 62, 0,
+ 127, 73, 73, 73, 65, 0,
+ 127, 9, 9, 9, 1, 0,
+ 62, 65, 73, 73,122, 0,
+ 127, 8, 8, 8,127, 0,
+ 0, 65,127, 65, 0, 0,
+ 32, 64, 65, 63, 1, 0,
+ 127, 8, 20, 34, 65, 0,
+ 127, 64, 64, 64, 64, 0,
+ 127, 2, 28, 2,127, 0,
+ 127, 4, 8, 16,127, 0,
+ 62, 65, 65, 65, 62, 0,
+ 127, 9, 9, 9, 6, 0,
+ 62, 65, 81, 33, 94, 0,
+ 127, 9, 25, 41, 70, 0,
+ 38, 73, 73, 73, 50, 0,
+ 1, 1,127, 1, 1, 0,
+ 63, 64, 64, 64, 63, 0,
+ 31, 32, 64, 32, 31, 0,
+ 63, 64, 56, 64, 63, 0,
+ 99, 20, 8, 20, 99, 0,
+ 3, 4,120, 4, 3, 0,
+ 97, 81, 73, 69, 67, 0,
+ 0,127, 65, 65, 65, 0,
+ 2, 4, 8, 16, 32, 0,
+ 0, 65, 65, 65,127, 0,
+ 4, 2, 1, 2, 4, 0,
+ 64, 64, 64, 64, 64, 0,
+ 0, 3, 7, 8, 0, 0,
+ 32, 84, 84, 84,120, 0,
+ 127, 40, 68, 68, 56, 0,
+ 56, 68, 68, 68, 40, 0,
+ 56, 68, 68, 40,127, 0,
+ 56, 84, 84, 84, 24, 0,
+ 0, 8,126, 9, 2, 0,
+ 24,164,164,164,124, 0,
+ 127, 8, 4, 4,120, 0,
+ 0, 68,125, 64, 0, 0,
+ 32, 64, 64, 61, 0, 0,
+ 127, 16, 40, 68, 0, 0,
+ 0, 65,127, 64, 0, 0,
+ 124, 4,120, 4,120, 0,
+ 124, 8, 4, 4,120, 0,
+ 56, 68, 68, 68, 56, 0,
+ 252, 24, 36, 36, 24, 0,
+ 24, 36, 36, 24,252, 0,
+ 124, 8, 4, 4, 8, 0,
+ 72, 84, 84, 84, 36, 0,
+ 4, 4, 63, 68, 36, 0,
+ 60, 64, 64, 32,124, 0,
+ 28, 32, 64, 32, 28, 0,
+ 60, 64, 48, 64, 60, 0,
+ 68, 40, 16, 40, 68, 0,
+ 76,144,144,144,124, 0,
+ 68,100, 84, 76, 68, 0,
+ 0, 8, 54, 65, 0, 0,
+ 0, 0,119, 0, 0, 0,
+ 0, 65, 54, 8, 0, 0,
+ 2, 1, 2, 4, 2, 0,
+ 60, 38, 35, 38, 60, 0
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/font_8x8.h Mon Jul 06 19:37:13 2015 +0000
@@ -0,0 +1,120 @@
+/* File '8X8.FV' as include
+The font was generated with EA FontEditor. Please contact ELECTRONIC ASSEMBLY
+for more details (techik@lcd-module.de)
+
+ TAB 6/22/2015 - Modified for mbed compiler
+
+ the array starts with a 8 byte header:
+ 1st Byte: 'F' first 2 bytes are always FV
+ 2nd Byte: 'V' for FONT VERTICAL
+ 3rd Byte: First code to define
+ 4th Byte: Last code to define
+ 5th Byte: Width of character in dots
+ 6th Byte: Height of character in dots
+ 7th Byte: Height of character in bytes
+ 8th Byte: Bytes needed for each character (1..255)
+ or 0 for big fonts calculate WidthInDots * HeightInBytes
+ After that font data will follow */
+
+#define FONT_8X8_LEN 776
+
+const byte font_8x8[FONT_8X8_LEN] =
+{
+ 70, 86, 32,127, 8, 8, 1, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 95, 95, 0, 0, 0,
+ 0, 7, 7, 0, 0, 7, 7, 0,
+ 36,126,126, 36,126,126, 36, 0,
+ 0, 36, 46,107,107, 58, 18, 0,
+ 0,102, 54, 24, 12,102, 98, 0,
+ 48,122, 79, 93, 55,114, 80, 0,
+ 0, 0, 0, 7, 7, 0, 0, 0,
+ 0, 0, 0, 62,127, 99, 65, 0,
+ 0, 65, 99,127, 62, 0, 0, 0,
+ 8, 42, 62, 28, 28, 62, 42, 8,
+ 0, 8, 8, 62, 62, 8, 8, 0,
+ 0,128,224, 96, 0, 0, 0, 0,
+ 0, 8, 8, 8, 8, 8, 8, 0,
+ 0, 0, 0, 96, 96, 0, 0, 0,
+ 0, 96, 48, 24, 12, 6, 3, 0,
+ 0, 62,127, 73, 69,127, 62, 0,
+ 0, 64, 66,127,127, 64, 64, 0,
+ 0, 66, 99,113, 89, 79, 70, 0,
+ 0, 33, 97, 69, 79,123, 49, 0,
+ 0, 24, 28, 22,127,127, 16, 0,
+ 0, 39,103, 69, 69,125, 57, 0,
+ 0, 62,127, 73, 73,121, 48, 0,
+ 0, 1,113,121, 13, 7, 3, 0,
+ 0, 54,127, 73, 73,127, 54, 0,
+ 0, 6, 79, 73,105, 63, 30, 0,
+ 0, 0, 0, 54, 54, 0, 0, 0,
+ 0, 0, 64,118, 54, 0, 0, 0,
+ 0, 0, 8, 28, 54, 99, 65, 0,
+ 0, 36, 36, 36, 36, 36, 36, 0,
+ 0, 65, 99, 54, 28, 8, 0, 0,
+ 0, 2, 3, 81, 89, 15, 6, 0,
+ 0, 62,127, 65, 93, 87, 94, 0,
+ 0,124,126, 19, 19,126,124, 0,
+ 0,127,127, 73, 73,127, 54, 0,
+ 0, 62,127, 65, 65, 99, 34, 0,
+ 0,127,127, 65, 99, 62, 28, 0,
+ 0,127,127, 73, 73, 73, 65, 0,
+ 0,127,127, 9, 9, 9, 1, 0,
+ 0, 62,127, 65, 73,121,121, 0,
+ 0,127,127, 8, 8,127,127, 0,
+ 0, 0, 65,127,127, 65, 0, 0,
+ 0, 32, 96, 64, 64,127, 63, 0,
+ 0,127,127, 28, 54, 99, 65, 0,
+ 0,127,127, 64, 64, 64, 64, 0,
+ 127,127, 6, 12, 6,127,127, 0,
+ 0,127,127, 14, 28,127,127, 0,
+ 0, 62,127, 65, 65,127, 62, 0,
+ 0,127,127, 9, 9, 15, 6, 0,
+ 0, 62,127, 81, 33,127, 94, 0,
+ 0,127,127, 9, 25,127,102, 0,
+ 0, 38,111, 73, 73,123, 50, 0,
+ 0, 1, 1,127,127, 1, 1, 0,
+ 0, 63,127, 64, 64,127,127, 0,
+ 0, 31, 63, 96, 96, 63, 31, 0,
+ 127,127, 48, 24, 48,127,127, 0,
+ 0, 99,119, 28, 28,119, 99, 0,
+ 0, 7, 15,120,120, 15, 7, 0,
+ 0, 97,113, 89, 77, 71, 67, 0,
+ 0, 0, 0,127,127, 65, 65, 0,
+ 0, 3, 6, 12, 24, 48, 96, 0,
+ 0, 65, 65,127,127, 0, 0, 0,
+ 8, 12, 6, 3, 6, 12, 8, 0,
+ 64, 64, 64, 64, 64, 64, 64, 0,
+ 2, 6, 12, 8, 0, 0, 0, 0,
+ 0, 32,116, 84, 84,124,120, 0,
+ 0,127,127, 68, 68,124, 56, 0,
+ 0, 56,124, 68, 68, 68, 0, 0,
+ 0, 56,124, 68, 68,127,127, 0,
+ 0, 56,124, 84, 84, 92, 24, 0,
+ 0, 4,126,127, 5, 5, 0, 0,
+ 0,152,188,164,164,252,124, 0,
+ 0,127,127, 4, 4,124,120, 0,
+ 0, 0, 68,125,125, 64, 0, 0,
+ 0,128,128,253,125, 0, 0, 0,
+ 0,127,127, 16, 56,108, 68, 0,
+ 0, 0, 65,127,127, 64, 0, 0,
+ 124,124, 12, 24, 12,124,120, 0,
+ 0,124,124, 4, 4,124,120, 0,
+ 0, 56,124, 68, 68,124, 56, 0,
+ 0,252,252, 68, 68,124, 56, 0,
+ 0, 56,124, 68, 68,252,252, 0,
+ 0,124,124, 4, 4, 12, 8, 0,
+ 0, 72, 92, 84, 84,116, 36, 0,
+ 0, 4, 4, 62,126, 68, 68, 0,
+ 0, 60,124, 64, 64,124,124, 0,
+ 0, 28, 60, 96, 96, 60, 28, 0,
+ 28,124, 96, 48, 96,124, 28, 0,
+ 0, 68,108, 56, 56,108, 68, 0,
+ 0,156,188,160,160,252,124, 0,
+ 0, 68,100,116, 92, 76, 68, 0,
+ 0, 0, 8, 62,119, 65, 65, 0,
+ 0, 0, 0,255,255, 0, 0, 0,
+ 0, 65, 65,119, 62, 8, 0, 0,
+ 12, 6, 6, 12, 24, 24, 12, 0,
+ 0, 96,120, 94, 70, 88, 96, 0
+};