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

Files at this revision

API Documentation at this revision

Comitter:
falingtrea
Date:
Mon Jul 06 19:37:13 2015 +0000
Child:
1:3b02b7fb79c9
Commit message:
Initial release

Changed in this revision

DOGS102.cpp Show annotated file Show diff for this revision Revisions of this file
DOGS102.h Show annotated file Show diff for this revision Revisions of this file
MultiTech_Logo.h Show annotated file Show diff for this revision Revisions of this file
font_6x8.h Show annotated file Show diff for this revision Revisions of this file
font_8x8.h Show annotated file Show diff for this revision Revisions of this file
--- /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
+};