PCD8544 multiscreen

Files at this revision

API Documentation at this revision

Comitter:
Wimpie
Date:
Fri Jun 15 18:37:00 2012 +0000
Commit message:

Changed in this revision

PCD8544MS.cpp Show annotated file Show diff for this revision Revisions of this file
PCD8544MS.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_16x20.cpp Show annotated file Show diff for this revision Revisions of this file
fonts/font_16x20.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_16x24.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_3x5.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_5x7.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_6x8.cpp Show annotated file Show diff for this revision Revisions of this file
fonts/font_6x8.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_8x12.cpp Show annotated file Show diff for this revision Revisions of this file
fonts/font_8x12.h Show annotated file Show diff for this revision Revisions of this file
fonts/font_8x8.cpp Show annotated file Show diff for this revision Revisions of this file
fonts/font_8x8.h Show annotated file Show diff for this revision Revisions of this file
stringman.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 61dcd2c0299a PCD8544MS.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCD8544MS.cpp	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,925 @@
+/* mbed PCD8544 - Graphic Library for driving monochrome displays based on
+ *  the PCD8544  48 x 84 pixels matrix LCD controller/driver
+ *  used in Nokia 3310, 3315, 3330, 3350, 3410, 3210,  5110, 5120, 5130, 5160, 6110, 6150
+ *
+ * Copyright (c) 2011, Wim De Roeve
+ * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links
+ * and by Petras Saduikis <petras@petras.co.uk>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the updaSoftware, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "PCD8544MS.h"
+
+#include "fonts/font_3x5.h"
+#include "fonts/font_5x7.h"
+#include "fonts/font_6x8.h"
+#include "fonts/font_8x8.h"
+#include "fonts/font_8x12.h"
+#include "fonts/font_16x20.h"
+#include "fonts/font_16x24.h"
+
+#include "DebugTrace.h"
+#include "sstream"
+#include "stdio.h"
+#include "stringman.h"
+
+#define GLCD_CS6_ON            0x01   //P0
+#define GLCD_RESET_ON          0x02   //P1
+#define GLCD_CS1_ON            0x04   //P2
+#define GLCD_CS5_ON            0x08   //P3
+#define GLCD_DC_ON             0x10   //P4
+#define GLCD_CS2_ON            0x20   //P5
+#define GLCD_CS3_ON            0x40   //P6
+#define GLCD_CS4_ON            0x80   //P7
+
+#define TLCD_RS_ON             0x1000 //P12
+#define TLCD_E1_ON             0x2000 //P13
+#define TLCD_E2_ON             0x4000 //P14
+#define TLCD_BACKLIGHT_ON      0x8000 //P15
+
+/* Display ON/OFF Control defines */
+#define DON                0x0F  //0b00001111  Display on 
+#define DOFF               0x0B  //0b00001011  Display off 
+#define CURSOR_ON          0x0F  //0b00001111  Cursor on 
+#define CURSOR_OFF         OxOD  //0b00001101  Cursor off 
+#define BLINK_ON           0x0F  //0b00001111  Cursor Blink 
+#define BLINK_OFF          0x0E  //0b00001110  Cursor No Blink 
+
+/* Cursor or Display Shift defines */
+#define SHIFT_CUR_LEFT     Ox13  //0b00010011  Cursor shifts to the left 
+#define SHIFT_CUR_RIGHT    Ox17  //0b00010111  Cursor shifts to the right 
+#define SHIFT_DISP_LEFT    Ox1B  //0b00011011  Display shifts to the left 
+#define SHIFT_DISP_RIGHT   0x1F  //0b00011111  Display shifts to the right 
+
+/* Function Set defines */
+#define EIGHT_BITMODE      0x03  //0b00000011  8-bit Interface D4-D7
+#define FOUR_BITMODE       0x02  //0b00000010  4-bit Interface D4-D7
+#define LINE_5X7           0x30  //0b00110000
+#define LINE_5X10          0x34  //0b00110100
+#define LINES_5X7          0x38  //0b00111000
+
+// Addtional define to support display mode
+
+#define DISP_FLIP_NONE     0x00  //0b00111100  No flip
+#define CLEAR_LCD          0x01  //0b00000001 
+
+/* Number of pixels on the LCD */
+
+#define HIGH  1
+#define LOW   0
+#define TRUE  1
+#define FALSE 0
+
+/* Display control command */
+#define EXTENDEDSET   0x21
+#define STANDARDSET   0x20
+#define DISPLAYOFF    0x08  // switch off display 
+#define ALL_SEG_ON    0x09  // switch on display and set to all pixels on
+#define NORMAL_MODE   0x0C  // NOREVERSE
+#define INVERSE_MODE  0x0D  // REVERSE
+
+#define SET_ADDRES_X  0x80
+#define SET_ADDRES_Y  0x40
+
+
+DebugTrace pc_PCD8544(ON, TO_SERIAL);
+
+/*
+       PCD8544 from Philips Semiconductors is
+       48 x 84 pixels monochrome matrix LCD controller/driver
+
+       generic for LPH7366, LPH7677, and LPH7779; no backlight
+
+       model name (of display)     type     used in cellphones
+       LPH 7366         2     Nokia 5110, 5120, 5130, 5160, 6110, 6150
+       LPH 7677         1     Nokia 3210
+       LPH 7779         1     Nokia 3310, 3315, 3330, 3350, 3410
+
+
+       +-------------------------+
+       |     1 2 3 4 5 6 7 8     |
+       |     # # # # # # # #     |
+       |  ===#=#=#=#=#=#=#=#===  |  Red     1 .. VDD  - chip power supply +3.3V
+       +--=====================--+  Green   2 .. SCLK - serial clock line of LCD
+       |                         |  Yellow  3 .. SI   - serial data input of LCD
+       |                         |  Gray    4 .. D/C  - command/data switch
+       |        rear view        |  Blue    5 .. /CS  - active low chip select
+       |  connector is visible   |  Black   6 .. GND  - for VDD
+       |                         |          7 .. Vout - output of display-internal dc/dc converter
+       |         LPH7779         |  White   8 .. /RES - active low reset
+       |                         |
+       +-------------------------+
+
+*/
+
+
+PCD8544MS::PCD8544MS(PinName mosi, PinName miso, PinName sclk, PinName sda, PinName scl,int i2cAddress, bool TextLCD, bool backlight):
+        _spi(mosi, miso, sclk),_i2c(sda, scl) {
+
+    _i2cAddress = i2cAddress;
+//   _type = type;
+
+    if (TextLCD) {
+        TLCD_reset();
+        _columns = 16;
+        _rows = 2;
+        _backlight=backlight;
+    }
+
+    GLCD_reset();
+}
+
+void PCD8544MS::writeI2CByte(int data) {
+    char cmd[2];
+    cmd[0] = (data & 0xFF);
+    cmd[1] = (data >> 8);
+    _i2c.write(_i2cAddress, cmd, 2);
+    // pc_PCD8544.traceOut("I2C=%i ",data);
+
+}
+
+// ############# TEXTLCD FUNCTIONS ###################
+
+void PCD8544MS::TLCD_reset() {
+    for (int i=0; i<3; i++) {
+        TLCD_writeNibble(EIGHT_BITMODE,false);
+        wait(0.00164);      // this command takes 1.64ms, so wait for it
+    }
+    TLCD_writeNibble(FOUR_BITMODE,false); // 4-bit mode
+
+    TLCD_writeCommand(0x28);    // Function set 001 BW N F - -
+    TLCD_writeCommand(0x0C);
+    TLCD_writeCommand(0x6);  //  Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
+}
+
+void PCD8544MS::TLCD_writeNibble(int data, bool rs) {
+
+    data = ((data & 0xF) << 8) || GLCD_RESET_ON || GLCD_CS1_ON ||  GLCD_CS2_ON || GLCD_CS3_ON || GLCD_CS4_ON || GLCD_CS5_ON || GLCD_CS6_ON ;
+
+    if (_backlight)
+        data= data  | TLCD_BACKLIGHT_ON;
+
+    if (rs) {
+        data = data | TLCD_RS_ON; // set rs bit
+    }
+
+    writeI2CByte(data | TLCD_E1_ON); // E=1
+
+    wait(0.000040f);
+    writeI2CByte(data);   // E=0
+
+    wait(0.000040f);
+    writeI2CByte(data | TLCD_E1_ON);  // E=1
+}
+
+
+void PCD8544MS::TLCD_writeByte(int data, bool rs) {
+    TLCD_writeNibble(data >> 4 , rs);
+    TLCD_writeNibble(data >> 0 , rs);
+}
+
+void PCD8544MS::TLCD_writeCommand(int command) {
+    // RS = 0;
+    TLCD_writeByte(command,false);
+}
+
+void PCD8544MS::TLCD_writeData(int data) {
+    //RS = 1
+    TLCD_writeByte(data,true);
+
+    _column++;
+    if (_column >= _columns) {
+        TLCD_newline();
+    }
+}
+
+int PCD8544MS::_putc(int value) {
+    if (value == '\n') {
+        TLCD_newline();
+    } else {
+        TLCD_writeData(value);
+    }
+    return value;
+}
+
+int PCD8544MS::_getc() {
+    return 0;
+}
+
+void PCD8544MS::TLCD_backlight(bool status) {
+    _backlight=status;
+    if (_backlight)
+        writeI2CByte(TLCD_BACKLIGHT_ON | TLCD_E1_ON | TLCD_E2_ON | GLCD_CS1_ON);
+    else
+        writeI2CByte(TLCD_E1_ON | TLCD_E2_ON | GLCD_CS1_ON);
+}
+
+
+void PCD8544MS::TLCD_newline() {
+    _column = 0;
+    _row++;
+    if (_row >= _rows) {
+        _row = 0;
+    }
+    TLCD_locate(_column, _row);
+}
+
+
+void PCD8544MS::TLCD_locate(int column, int row) {
+    if (column < 0 || column >= _columns || row < 0 || row >= _rows) {
+        error("locate(%d,%d) out of range on %dx%d display", column, row, _columns, _rows);
+        return;
+    }
+
+    _row = row;
+    _column = column;
+    int address = 0x80 + (_row * 40) + _column; // memory starts at 0x80, and is 40 chars long per row
+    // pc_LCD.traceOut("locate %dx%d\r\n", column, row);
+    TLCD_writeCommand(address);
+}
+
+
+void PCD8544MS::TLCD_cls() {
+    TLCD_writeCommand(0x01); // Clear Display
+    wait(0.00164f);     // This command takes 1.64 ms
+    TLCD_locate(0, 0);
+}
+
+
+
+// ############# GRAPHICLCD FUNCTIONS ###################
+
+void PCD8544MS::GLCD_reset() {
+
+    /* reset lcd
+
+      After reset, the LCD driver has the following state:
+      - Power-down mode (bit PD = 1)
+      - Horizontal addressing (bit V = 0)
+      - normal instruction set (bit H = 0)
+      - Display blank (bit E = D = 0)
+      - Address counter X6 to X0 = 0; Y2 to Y0 = 0
+      - Temperature control mode (TC1 TC0 = 0)
+      - Bias system (BS2 to BS0 = 0)
+      - VLCD is equal to 0, the HV generator is switched off
+       (VOP6 to VOP0 = 0)
+      - After power-on, the RAM contents are undefined.
+    */
+
+
+    GLCD_writeI2C(HIGH,LOW,HIGH,0); // all screens
+
+    _spi.format(8,0);
+    _spi.frequency(1000000);
+
+    pc_PCD8544.traceOut("\r\nreset GLCD ");
+
+    //_cs=HIGH;
+    //_reset=HIGH;
+
+
+    // for (int i=1;i<=maxscreen;i++) {
+
+    wait_ms(1);
+    //_reset=LOW;
+    GLCD_writeI2C(LOW,LOW,HIGH,0);
+
+    wait_ms(1);
+    //_reset = HIGH;
+    GLCD_writeI2C(HIGH,LOW,HIGH,0);
+
+    GLCD_writeCmd(EXTENDEDSET,1,0);   // folowing commands are extended ones
+    GLCD_writeCmd(0xc8,0,0);          // Set Voltage 0x80+value: set contrast
+    GLCD_writeCmd(0x06,0,0);          // set temp coefficient
+    GLCD_writeCmd(0x13,0,0);          // set BIAS mode 1:48
+    GLCD_writeCmd(STANDARDSET,0,0);   // STANDARDSET: following commands are standard ones
+
+    GLCD_writeCmd(NORMAL_MODE,2,0);
+    _LoMark = 0;
+    _HiMark = LCD_CACHE_SIZE - 1;
+
+    GLCD_cls(0,TRUE);
+}
+
+void PCD8544MS::GLCD_writeCmd(BYTE data, BYTE CF, int screen) {
+    //_cs = LOW;
+    //_dc = LOW;
+    // _spi.write(data);
+
+//    pc_PCD8544.traceOut("\r\n %i %i %i ",(CF & 1),data,(CF & 2));
+
+    if ((CF & 1)==1) {
+        GLCD_writeI2C(HIGH,LOW,LOW,screen);
+        wait_ms(1);
+    }
+
+    _spi.write(data);
+
+    if ((CF & 2)==2) {
+        GLCD_writeI2C(HIGH,LOW,HIGH,screen);
+    }
+
+    //_cs = HIGH;
+
+}
+
+void PCD8544MS::GLCD_writeData(BYTE data, BYTE CF, int screen) {
+    // _cs = LOW;
+    //_dc = HIGH;
+    //_spi.write(data);
+
+    if ((CF & 1)==1) {
+        GLCD_writeI2C(HIGH,HIGH,LOW,screen);
+        wait_ms(1);
+    }
+
+    _spi.write(data);
+
+    if ((CF & 2)==2) {
+        GLCD_writeI2C(HIGH,HIGH,HIGH,screen);
+    }
+
+    //  _cs = HIGH;
+
+}
+
+void PCD8544MS::GLCD_writeI2C(bool reset, bool dc, bool cs,int screen) {
+
+    int cb=TLCD_E1_ON | TLCD_E2_ON;  // prevent TextLCD for
+
+    if (reset==HIGH) cb = cb | GLCD_RESET_ON;
+    if (dc==HIGH) cb = cb | GLCD_DC_ON;
+
+    if (cs==HIGH) {
+        cb = cb | GLCD_CS1_ON |  GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON ;
+    } else {
+        switch (screen)  {
+            case 1: {
+                cb = cb | GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON;
+                break;
+            }
+            case 2: {
+                cb = cb | GLCD_CS1_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON;
+                break;
+            }
+            case 3: {
+                cb = cb | GLCD_CS1_ON |  GLCD_CS2_ON | GLCD_CS4_ON | GLCD_CS5_ON | GLCD_CS6_ON;
+                break;
+            }
+            case 4: {
+                cb = cb | GLCD_CS1_ON |  GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS5_ON | GLCD_CS6_ON;
+                break;
+            }
+            case 5: {
+                cb = cb | GLCD_CS1_ON |  GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS6_ON;
+                break;
+            }
+            case 6: {
+                cb = cb | GLCD_CS1_ON |  GLCD_CS2_ON | GLCD_CS3_ON | GLCD_CS4_ON | GLCD_CS5_ON;
+                break;
+            }
+            default: {
+                break;
+            }
+        }
+    }
+
+
+    writeI2CByte(cb);
+
+}
+
+void PCD8544MS::GLCD_close() {
+    GLCD_writeCmd(DISPLAYOFF,3,0);
+    GLCD_writeI2C(HIGH,HIGH,HIGH,0);
+//   _cs    = HIGH;
+//   _reset = HIGH;
+
+}
+
+//  GRAPHICAL functions
+
+void PCD8544MS::GLCD_cls(int screen,bool fupdate) {
+//    pc_PCD8544.traceOut("\r\ncls %i ",LCD_CACHE_SIZE);
+
+    for (int i = 0; i < LCD_CACHE_SIZE ; i++) {
+        //    pc_PCD8544.traceOut("%i",i);
+        LcdCache[i]=0x00;
+    }
+    _LoMark = 0;
+    _HiMark = LCD_CACHE_SIZE - 1;
+
+//     pc_PCD8544.traceOut("\r\nfupdate");
+    if (fupdate)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::GLCD_update(int screen) {
+//   pc_PCD8544.traceOut("\r\nupdate");
+    if ( _LoMark < 0 )
+        _LoMark = 0;
+    else if ( _LoMark >= LCD_CACHE_SIZE )
+        _LoMark = LCD_CACHE_SIZE - 1;
+    if ( _HiMark < 0 )
+        _HiMark = 0;
+    else if ( _HiMark >= LCD_CACHE_SIZE )
+        _HiMark = LCD_CACHE_SIZE - 1;
+
+    GLCD_writeCmd(SET_ADDRES_X | (_LoMark % LCD_X_RES),1,screen);
+    GLCD_writeCmd(SET_ADDRES_Y | (_LoMark / LCD_X_RES),2,screen);
+
+    GLCD_writeI2C(HIGH,HIGH,LOW,screen);
+    wait_ms(1);
+
+    for (int i = _LoMark; i <= _HiMark; i++ ) {
+        _spi.write(LcdCache[i]);
+        //writeData( );
+    }
+    GLCD_writeI2C(HIGH,HIGH,HIGH,screen);
+    _LoMark = LCD_CACHE_SIZE - 1;
+    _HiMark = 0;
+}
+
+
+
+void PCD8544MS::GLCD_locate(BYTE x0, BYTE y0) {
+    LcdCacheIdx = x0*LCD_BANKS + y0 * LCD_X_RES;
+}
+
+// Bitmap
+
+void PCD8544MS::GLCD_drawBitmap(BYTE x0, BYTE y0, const unsigned char* bitmap, BYTE bmpXSize, BYTE bmpYSize,BYTE fupdate,int screen) {
+    BYTE row;
+    //  pc_PCD8544.traceOut("\r\ndrawbitmap");
+
+    if (0 == bmpYSize % 8)
+        row = bmpYSize/8;
+    else
+        row = bmpYSize/8 + 1;
+
+    _LoMark= 0;
+    _HiMark= LCD_CACHE_SIZE - 1;
+
+    for (BYTE n = 0; n < row; n++) {
+        GLCD_locate(x0, y0);
+
+        for (BYTE i = 0; i < bmpXSize; i++) {
+            LcdCache[LcdCacheIdx+ i]=bitmap[i + (n * bmpXSize)];
+        }
+        y0++;
+    }
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::GLCD_writeString(BYTE x0, BYTE y0, char* string,  eFonts font,ePixelMode pmode,eDisplayMode dmode,eSpaceMode smode, BYTE fupdate,int screen) {
+
+//   pc_PCD8544.traceOut("\r\nwriteString");
+    GLCD_locate(x0, y0);
+    chooseFont(font);
+
+    while (*string) {
+        GLCD_writeChar(x0,y0,*string++,font,pmode, dmode, FALSE,screen);
+        x0+=_font_width;   // width +1;
+        if (smode==SPACE_NORMAL)
+            x0++;
+    }
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::chooseFont(eFonts font) {
+
+    switch (font) {
+
+        case VERYSMALLFONT: {
+            _font_width  = FONT3x5_WIDTH;
+            _font_height = FONT3x5_HEIGHT;
+            _font_start  = FONT3x5_START;
+            _font_end    = FONT3x5_END;
+            _font_bytes  = FONT3x5_BYTES;
+
+            _pFont = (unsigned char*) font_3x5;
+
+            break;
+        }
+        case TINYFONT: {
+            _font_width  = FONT5x7_WIDTH;
+            _font_height = FONT5x7_HEIGHT;
+            _font_start  = FONT5x7_START;
+            _font_end    = FONT5x7_END;
+            _font_bytes  = FONT5x7_BYTES;
+
+            _pFont = (unsigned char*) font_5x7;
+
+            break;
+        }
+
+        case SMALLFONT: {
+            _font_width  = FONT6x8_WIDTH;
+            _font_height = FONT6x8_HEIGHT;
+            _font_start  = FONT6x8_START;
+            _font_end    = FONT6x8_END;
+            _font_bytes  = FONT6x8_BYTES;
+
+            _pFont = (unsigned char*) font_6x8;
+
+            break;
+        }
+        case NORMALFONT: {
+            _font_width  = FONT8x8_WIDTH;
+            _font_height = FONT8x8_HEIGHT;
+            _font_start  = FONT8x8_START;
+            _font_end    = FONT8x8_END;
+            _font_bytes  = FONT8x8_BYTES;
+
+            _pFont = (unsigned char*) font_8x8;
+
+            break;
+        }
+        case BIGFONT: {
+            _font_width  = FONT8x12_WIDTH;
+            _font_height = FONT8x12_HEIGHT;
+            _font_start  = FONT8x12_START;
+            _font_end    = FONT8x12_END;
+            _font_bytes  = FONT8x12_BYTES;
+
+            _pFont = (unsigned char*) font_8x12;
+
+            break;
+        }
+
+        case TIMENUMBERFONT: {
+            _font_width  = FONT16x20_WIDTH;
+            _font_height = FONT16x20_HEIGHT;
+            _font_start  = FONT16x20_START;
+            _font_end    = FONT16x20_END;
+            _font_bytes  = FONT16x20_BYTES;
+
+            _pFont = (unsigned char*) font_16x20;
+
+            break;
+        }
+
+        case BIGNUMBERFONT: {
+            _font_width  = FONT16x24_WIDTH;
+            _font_height = FONT16x24_HEIGHT;
+            _font_start  = FONT16x24_START;
+            _font_end    = FONT16x24_END;
+            _font_bytes  = FONT16x24_BYTES;
+
+            _pFont = (unsigned char*) font_16x24;
+
+            break;
+        }
+    }
+}
+
+void PCD8544MS::GLCD_writeChar(BYTE x0, BYTE y0, BYTE ch,  eFonts font, ePixelMode pmode,eDisplayMode mode,BYTE fupdate,int screen) {
+    BYTE sendByte;
+
+    chooseFont(font);
+
+    if ((ch <= _font_start) || (ch > _font_end))
+        ch=_font_start;
+
+    ch -= _font_start;
+
+
+    /* for (BYTE i = 0; i < 3; i++) {
+         locate(x, y + i);
+
+         for (BYTE j = 0; j < 16; j++) {
+             sendByte =  *(pFont + ch*48 + i*16 + j);
+             writeData((mode == NORMAL)? sendByte : (sendByte^0xff));
+         }
+     }*/
+
+
+    for (int i = 0; i < _font_width; i++ ) {
+        for (int f=0; f<_font_bytes; f++) {
+            sendByte = *(_pFont + ch*_font_width*_font_bytes +f*_font_width+i);
+            sendByte = ((mode == DISPLAY_NORMAL)? sendByte:(sendByte ^ 0xff));
+
+            for (int j=0 ; j<_font_height; j++) {
+                if ((sendByte & 0x01) == 0x01) {
+                    GLCD_drawpixel(x0,y0+j+f*8,PIXEL_ON,FALSE,screen);
+                } else {
+                    GLCD_drawpixel(x0,y0+j+f*8,PIXEL_OFF,FALSE,screen);
+                }
+                sendByte=sendByte>>1;
+            }
+        }
+        x0++;
+    }
+
+
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+
+void PCD8544MS::GLCD_drawpixel(BYTE x0, BYTE  y0, ePixelMode mode,BYTE fupdate,int screen) {
+    uint16_t index;
+    BYTE offset;
+    BYTE data;
+
+    if ( x0 > LCD_X_RES-1 ) return;
+    if ( y0 > LCD_Y_RES-1 ) return;
+
+    index = ((y0 / 8) * LCD_X_RES) + x0;
+    offset = y0 - ((y0 / 8) * 8);
+
+    data = LcdCache[index];
+
+    if ( mode == PIXEL_OFF ) {
+        data &= (~(0x01 << offset));
+    } else if ( mode == PIXEL_ON ) {
+        data |= (0x01 << offset);
+    } else if ( mode == PIXEL_XOR ) {
+        data ^= (0x01 << offset);
+    }
+    LcdCache[index] = data;
+
+    if ( index < _LoMark ) {
+        _LoMark = index;
+    }
+    if ( index > _HiMark ) {
+        _HiMark = index;
+    }
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::GLCD_drawline(BYTE  x0, BYTE y0, BYTE x1, BYTE y1, ePixelMode mode,BYTE fupdate,int screen) {
+    int dx, dy, stepx, stepy, fraction;
+
+    dy = y1 - y0;
+    dx = x1 - x0;
+    if ( dy < 0 ) {
+        dy = -dy;
+        stepy = -1;
+    } else {
+        stepy = 1;
+    }
+    if ( dx < 0 ) {
+        dx = -dx;
+        stepx = -1;
+    } else {
+        stepx = 1;
+    }
+    dx <<= 1;
+    dy <<= 1;
+
+    GLCD_drawpixel( x0, y0, mode , FALSE,screen);
+    if ( dx > dy ) {
+        fraction = dy - (dx >> 1);
+        while ( x0 != x1 ) {
+            if ( fraction >= 0 ) {
+                y0 += stepy;
+                fraction -= dx;
+            }
+            x0 += stepx;
+            fraction += dy;
+            GLCD_drawpixel( x0, y0, mode , FALSE,screen);
+        }
+    } else {
+        fraction = dx - (dy >> 1);
+        while ( y0 != y1 ) {
+            if ( fraction >= 0 ) {
+                x0 += stepx;
+                fraction -= dy;
+            }
+            y0 += stepy;
+            fraction += dx;
+            GLCD_drawpixel( x0, y0, mode , FALSE,screen);
+        }
+    }
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::GLCD_drawrectangle(BYTE  x0, BYTE y0, BYTE x1, BYTE y1, eFillMode fill, ePixelMode mode,BYTE fupdate,int screen) {
+    if (fill==1) {
+        BYTE i, xmin, xmax, ymin, ymax;
+        if (x0 < x1) { // Find x min and max
+            xmin = x0;
+            xmax = x1;
+        } else {
+            xmin = x1;
+            xmax = x0;
+        }
+        if (y0 < y1) { // Find the y min and max
+            ymin = y0;
+            ymax = y1;
+        } else {
+            ymin = y1;
+            ymax = y0;
+        }
+        for (; xmin <= xmax; ++xmin) {
+            for (i=ymin; i<=ymax; ++i) {
+                GLCD_drawpixel(xmin, i, mode, FALSE,screen);
+            }
+        }
+    } else {
+        GLCD_drawline(x0, y0, x1, y0, mode, FALSE,screen); // Draw the 4 sides
+        GLCD_drawline(x0, y1, x1, y1, mode, FALSE,screen);
+        GLCD_drawline(x0, y0, x0, y1, mode, FALSE,screen);
+        GLCD_drawline(x1, y0, x1, y1, mode, FALSE,screen);
+    }
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+
+void  PCD8544MS::GLCD_drawcircle(BYTE x0, BYTE y0, BYTE radius, eFillMode fill, ePixelMode mode, BYTE fupdate,int screen) {
+    int err, x, y;
+
+    err = -radius;
+    x   = radius;
+    y   = 0;
+
+    while (x >= y) {
+        if (fill==1) {
+            GLCD_drawline(x0 - x, y0 + y, x0 + x, y0 + y, mode,FALSE,screen);
+            GLCD_drawline(x0 - x, y0 - y, x0 + x, y0 - y, mode,FALSE,screen);
+            GLCD_drawline(x0 - y, y0 + x, x0 + y, y0 + x, mode,FALSE,screen);
+            GLCD_drawline(x0 - y, y0 - x, x0 + y, y0 - x, mode,FALSE,screen);
+        } else {
+            GLCD_drawpixel(x0 + x, y0 + y, mode,FALSE,screen);
+            GLCD_drawpixel(x0 - x, y0 + y, mode,FALSE,screen);
+            GLCD_drawpixel(x0 + x, y0 - y, mode,FALSE,screen);
+            GLCD_drawpixel(x0 - x, y0 - y, mode,FALSE,screen);
+            GLCD_drawpixel(x0 + y, y0 + x, mode,FALSE,screen);
+            GLCD_drawpixel(x0 - y, y0 + x, mode,FALSE,screen);
+            GLCD_drawpixel(x0 + y, y0 - x, mode,FALSE,screen);
+            GLCD_drawpixel(x0 - y, y0 - x, mode,FALSE,screen);
+        }
+        err += y;
+        y++;
+        err += y;
+        if (err >= 0) {
+            x--;
+            err -= x;
+            err -= x;
+        }
+    }
+
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+
+}
+
+void PCD8544MS::GLCD_drawprogressbar(BYTE  x0, BYTE y0, BYTE w, BYTE h, BYTE percentage,BYTE fupdate,int screen) {
+    GLCD_drawrectangle(x0,y0,x0+w,y0+h,FILL_OFF,PIXEL_ON, FALSE,screen);
+    GLCD_drawrectangle(x0+2,y0+2,x0+w-2,y0+h-2,FILL_ON,PIXEL_OFF, FALSE,screen);
+    GLCD_drawrectangle(x0+2,y0+2,x0+2+(percentage*(w-4)/100),y0+h-2,FILL_ON,PIXEL_ON, FALSE,screen);
+    if (fupdate==TRUE)
+        GLCD_update(screen);
+}
+
+void PCD8544MS::GLCD_drawchart(BYTE  x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity,
+                               eRasterMode rMode, eChartMode cMode,eDrawMode dMode, int16_t * val, int size, int t,int screen)  {
+    int maxy;
+    int _scale=1;
+    int prescale=1;
+
+    signed char v1,v2;
+    char buffer[4];
+
+    if (size>w)
+        size=w;
+
+    // search maximum value to calculate scale
+    if (dMode==DRAW_OVERWRITE) {
+        maxy=0;
+        for (int i=0; i<size; i++) {
+            if (val[i]>maxy)
+                maxy=val[i];
+
+        }
+
+        if (maxy>h) {  //scale can be 1,2,5  *10i
+            prescale= ((maxy-1)/((h/unity)*unity));
+            _scale=1;
+            while (prescale>10) {
+                _scale=_scale*10;
+                prescale=prescale/10;
+            }
+            if (prescale>1)
+                _scale=_scale*5;
+            else if (prescale==1)
+                _scale  =_scale*2;
+
+
+        }
+        Scale=_scale;
+    }
+
+    if (dMode==DRAW_OVERWRITE) {
+        GLCD_drawrectangle(x0-11,y0-h,x0+w,y0+4+7,FILL_ON,PIXEL_OFF,FALSE,screen);
+        GLCD_drawline(x0,y0,x0,y0-h,PIXEL_ON,FALSE,screen);
+        GLCD_drawline(x0,y0,x0+w,y0,PIXEL_ON,FALSE,screen);
+
+        //drawrectangle(x0,y0-h,x0+w,y0,FILL_OFF,PIXEL_ON,FALSE);
+
+        for (int i=0; i<=h; i++) {
+            if ((i % unity) == 0) {
+                GLCD_drawpixel(x0-2,y0-i,PIXEL_ON,FALSE,screen);
+                //    drawpixel(x0+w+2,y0-i,PIXEL_ON,FALSE);
+
+                if (rMode==RASTER_ON) {
+                    for (int r=0; r<=w; r++) {
+                        if ((r % 2) ==0)
+                            GLCD_drawpixel(x0+r,y0-i,PIXEL_ON,FALSE,screen);
+                    }
+                }
+                // draw vertical axis labels
+
+                itostr(buffer,i*Scale);
+
+                //  pc_PCD8544.traceOut(" %i %s |",i*Scale,buffer);
+                GLCD_writeString(x0-11,y0-i+1,buffer,VERYSMALLFONT,PIXEL_OFF,DISPLAY_NORMAL,SPACE_NONE,FALSE,screen);
+
+            }
+            if ((i % 2) == 0) {
+                GLCD_drawpixel(x0-1,y0-i,PIXEL_ON,FALSE,screen);
+                //      drawpixel(x0+w+1,y0-i,PIXEL_ON,FALSE);
+            }
+        }
+
+        for (int i=0; i<=w; i++) {
+            if (((i+(t % unitx)) % unitx) == 0) {
+                GLCD_drawpixel(x0+i,y0+2,PIXEL_ON,FALSE,screen);
+
+                if (rMode==RASTER_ON) {
+                    for (int r=0; r<=h; r++) {
+                        if ((r % 2) ==0)
+                            GLCD_drawpixel(x0+i,y0-r,PIXEL_ON,FALSE,screen);
+                    }
+                }
+                if (((t-w+i)/unitx)>=0)
+                    snprintf(buffer,3,"%i",((t-w+i)/unitx));
+                else
+                    snprintf(buffer,3,"%i",24+((t-w+i)/unitx));
+
+                // pc_PCD8544.traceOut(" %i %s ",(t-w+i)/unitx,buffer);
+                GLCD_writeString(x0+i-3,y0+4,buffer,VERYSMALLFONT,PIXEL_OFF,DISPLAY_NORMAL,SPACE_NORMAL,FALSE,screen);
+            }
+            if ((i % 2) == 0) {
+                GLCD_drawpixel(x0+i,y0+1,PIXEL_ON,FALSE,screen);
+            }
+        }
+        //     update();
+    }
+
+    for (int i=0; i<size; i++) {
+        //   pc_PCD8544.traceOut(" %i ",val[i]);
+        v1 = val[i] / Scale;
+        if (v1>h)
+            v1=h;
+
+        if (i!=(size-1)) {
+            v2 = val[i+1] / Scale;
+            if (v2>h)
+                v2=h;
+        } else
+            v2=v1;
+
+
+        switch (cMode) {
+            case C_POINT: {
+                GLCD_drawpixel(x0+i,y0-v1,PIXEL_ON,FALSE,screen);
+                break;
+            }
+            case C_LINE: {
+                GLCD_drawline(x0+i,y0-v1,x0+i+1,y0-v2,PIXEL_ON,FALSE,screen);
+                break;
+            }
+            case C_VLINE: {
+                GLCD_drawline(x0+i,y0-v1,x0+i,y0,PIXEL_ON,FALSE,screen);
+                break;
+            }
+        }
+    }
+
+    GLCD_update(screen);
+}
+
diff -r 000000000000 -r 61dcd2c0299a PCD8544MS.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCD8544MS.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,288 @@
+/* mbed PCD8544MS - Graphic Library for driving multi monochrome displays based on PCD8544
+ *  used in Nokia 3310, 3315, 3330, 3350, 3410, 3210,  5110, 5120, 5130, 5160, 6110, 6150
+ *
+ * Copyright (c) 2011, Wim De Roeve
+ * partial port of the code found on http://serdisplib.sourceforge.net/ser/pcd8544.html#links
+ * and by Petras Saduikis <petras@petras.co.uk>
+ *
+ * it uses a PCF8574 / PCF8575 for control line handling (/CS RESET and DC)
+ * and SPI for data handling
+ * up to 6 screens
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef PCD8544MS_H
+#define PCD8544MS_H
+
+//  the Nokia 3310 has a resolution of 84 x 48
+//  the Nokia 3410 has a resolution of 102 x 72 officialy 84x64
+
+#include "mbed.h"
+
+#define LCD_X_RES  102   //84  
+#define LCD_Y_RES   72    //48
+#define LCD_BANKS (LCD_Y_RES / 8)
+
+#define LCD_CACHE_SIZE ((LCD_X_RES * LCD_Y_RES) / 8)
+
+#define MAX_ADR_X  (LCD_X_RES)-1
+#define MAX_ADR_Y  LCD_BANKS-1
+//#define MAXSCREENS 1
+
+typedef uint8_t BYTE;
+
+class PCD8544MS {
+
+    /* PCD8544 from Philips Semiconductors is
+        48 x 84 pixels monochrome matrix LCD controller/driver
+
+        The PCD8544 has a 504 byte memory with NO read function.
+        Each bit is a pixel
+        You can only write 1 byte at a time in vertical or horizontal mode.
+        There is no read functionality with the controller.
+        Caching a copy of the LCD-memory is the only solution to set one pixel at a time.
+
+
+     * wiring SPI
+     *  mosi // yellow
+     *  miso NC
+     *  sclk //green
+
+     * PCF8575/PCF8574  to  PCD8544 LCD
+     * ----------------------
+     * P0              -  CS1    //gray
+     * P1              -  DC     //blue
+     * P2              -  RESET  //white
+     * P3              -  CS2
+     * P4              -  CS3
+     * P5              -  CS4
+     * P6              -  CS5
+     * P7              -  CS6
+     *
+     */
+    // yellow    green      //gray //blue //white
+    // PCD8544MS lcd(p11,NC,p13,p15,p16,p17);  //mosi miso sclk cs dc reset
+
+
+public:
+
+    /** LCD panel format */
+    typedef enum {
+        PIXEL_OFF = 0,
+        PIXEL_ON = 1,
+        PIXEL_XOR = 2
+    }ePixelMode;
+
+    typedef enum {
+        FILL_OFF = 0,
+        FILL_ON = 1
+    }eFillMode;
+
+    typedef enum {
+        RASTER_OFF = 0,
+        RASTER_ON = 1
+    }eRasterMode;
+
+    typedef enum {
+        DRAW_OVERWRITE = 0,
+        DRAW_MERGE = 1
+    }eDrawMode;
+
+
+    typedef enum {
+        VERYSMALLFONT = 0, //3x5
+        TINYFONT =      1, //5x7
+        SMALLFONT =     2, //6x8
+        NORMALFONT =    3, //8x8
+        BIGFONT    =    4, //8x12&#65533;
+        TIMENUMBERFONT= 5, //16x20
+        BIGNUMBERFONT=  6
+    }eFonts;
+
+    typedef enum {
+        C_POINT          = 0, //point
+        C_LINE    =      1, //line
+        C_VLINE       =     2, //Vertical Line
+        C_HLINE       =    3, //Horizontal Line
+    }eChartMode;
+
+    typedef enum {
+        SPACE_NONE = 0,
+        SPACE_NORMAL = 1
+    }eSpaceMode;
+
+    enum eDisplayMode {DISPLAY_NORMAL, DISPLAY_HIGHLIGHT};
+
+    enum LCDType {
+        LCD3310,
+        LCD3410,
+        LCD6100,   /**< Nokia 6100, as found on sparkfun board (default) */
+        LCD6610,   /**< Nokia 6610, as found on olimex board */
+        PCF8833
+    };
+
+
+    PCD8544MS(PinName mosi, PinName miso, PinName sclk, PinName sda, PinName scl,int i2cAddress,bool TextLCD, bool backlight);
+
+    /** init()
+     *
+     * Initialise the device.
+     * @param PinName SPI mosi
+     * @param PinName SPI miso
+     * @param PinName SPI sclk
+     * @param PinName sda
+     * @param PinName sck
+     * @param PinName i2cAddress
+     * @param int maxscreens      // number of screens used
+    */
+
+#if 0 // Inhereted from Stream, for documentation only
+    /* Function: putc
+     *  Write a character
+     *
+     * Variables:
+     *  c - The character to write to the serial port
+     */
+    int putc(int c);
+
+    /* Function: printf
+     *  Write a formated string
+     *
+     * Variables:
+     *  format - A printf-style format string, followed by the
+     *      variables to use in formating the string.
+     */
+    int printf(const char* format, ...);
+#endif
+
+
+  virtual void TLCD_locate(int column, int row);
+
+    /* Function: cls
+     * Clear the screen, and locate to 0,0
+     */
+    virtual void TLCD_cls();
+
+      /* Function: backlight
+    * Sets the backlight on or off
+    *
+    * Variables:
+    *  on (true or false)
+    */
+   
+   
+     virtual void TLCD_backlight(bool on);
+
+
+    /** cls()
+     *  clears the cached copy of the screen
+     *  and the screen itself
+    */
+    void GLCD_cls(int screen,bool fupdate=true);
+
+    /** update()
+     *  copies the cached memory to the screen
+     *  use this to update the screen after
+     *  - drawBitmap
+    */
+    void GLCD_update(int screen);
+
+    /** close()
+     *  screen display OFF
+    */
+    void GLCD_close();
+
+    /** locate(x,y)
+     *  sets the cursor on position x,y
+    */
+    void GLCD_locate         (BYTE x0, BYTE y0);
+
+    void chooseFont(eFonts font);
+    void GLCD_writeString    (BYTE x0, BYTE y0, char* string,  eFonts font,ePixelMode pmode,eDisplayMode dmode,eSpaceMode smode, BYTE fupdate,int screen );
+    void GLCD_writeChar      (BYTE x0, BYTE y0, BYTE ch,  eFonts font,ePixelMode pmode,eDisplayMode mode, BYTE fupdate,int screen);
+
+    /** drawBitmap(x,y,bitmap,xsize,ysize)
+     *  draw a monochrome bitmap on position x,y
+     *  with size xsize,ysize
+    */
+    void GLCD_drawBitmap     (BYTE x0, BYTE y0, const unsigned char* bitmap, BYTE bmpXSize, BYTE bmpYSize, BYTE fupdate,int screen );
+
+    void GLCD_drawpixel      (BYTE x0, BYTE y0, ePixelMode pmode, BYTE fupdate,int screen );
+    void GLCD_drawline       (BYTE x0, BYTE y0, BYTE x1,BYTE y1, ePixelMode pmode, BYTE fupdate,int screen );
+    void GLCD_drawcircle     (BYTE x0, BYTE y0, BYTE radius, eFillMode fill,ePixelMode pmode, BYTE fupdate,int screen );
+    void GLCD_drawrectangle  (BYTE x0, BYTE y0, BYTE x1,BYTE y1, eFillMode fill, ePixelMode pmode, BYTE fupdate,int screen );
+    void GLCD_drawprogressbar(BYTE x0, BYTE y0, BYTE w, BYTE h, BYTE percentage, BYTE fupdate,int screen );
+    void GLCD_drawchart      (BYTE  x0, BYTE y0, BYTE w, BYTE h, BYTE unitx, BYTE unity,
+                         eRasterMode rMode, eChartMode cMode, eDrawMode dMode,int16_t * val,  int size, int t,int screen );
+
+private:
+
+    SPI _spi;
+    I2C _i2c;
+    int _i2cAddress;
+    //  LCDType _type;
+
+    // int _lcd_x_res,_lcd_y_res,_lcd_cache_size;
+
+
+    void TLCD_reset();
+    void TLCD_writeData(int data);
+    void TLCD_writeCommand(int command);
+    void TLCD_writeByte(int value, bool rs);
+    void TLCD_writeNibble(int value, bool rs);
+
+    void GLCD_reset();
+    void GLCD_writeCmd(BYTE data, BYTE CF,int screen);
+    void GLCD_writeData(BYTE data, BYTE CF,int screen);
+    void GLCD_writeI2C(bool reset, bool dc, bool cs,int screen );
+    
+    void writeI2CByte(int data);
+    int readI2C();
+    
+    virtual int _putc(int c);
+    virtual int _getc();
+    virtual void TLCD_newline();
+
+    int _row;
+    int _column;
+    int _columns;
+    int _rows;
+
+    bool _backlight;
+
+    //BYTE LcdCache[][_lcd_cache_size]; // __attribute__((section("AHBSRAM0")));
+    BYTE LcdCache[LCD_CACHE_SIZE]; // __attribute__((section("AHBSRAM0")));
+
+    int LcdCacheIdx;
+    int _LoMark;
+    int _HiMark;
+    int Scale;
+
+    BYTE _font_width;
+    BYTE _font_height;
+    BYTE _font_start;
+    BYTE _font_end;
+    BYTE _font_bytes;
+    unsigned char* _pFont;
+
+
+
+};
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 61dcd2c0299a fonts/font_16x20.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_16x20.cpp	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,29 @@
+#include "font_16x20.h"
+
+
+//0x20 - 0x3A
+const unsigned char font_16x20[] = 
+{
+  0xf4,0xbf,0xf8,0x7f,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0x1c,0xe0,0x0c,0xc0,0x1c,0xe0,0x00,0x00,0x04,0x80,
+  0x0c,0xc0,0x04,0x80,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf, // 0x30
+  0x04,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,
+  0x0c,0x00,0x04,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00, // 0x31
+  0xf4,0x3f,0xf8,0x7f,0x1c,0x00,0xec,0x1f,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0xf8,0x7f,0xf4,0x3f,
+  0x00,0xc0,0xf0,0xbf,0x00,0xe0,0x00,0xe0,0x00,0xe0,0x00,0xe0,0xe0,0xdf,0x00,0xe0,0xf8,0x7f,0xf0,0xbf, // 0x32
+  0xf4,0x3f,0xf8,0x7f,0x1c,0x00,0xec,0x1f,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0xf8,0x7f,0xf4,0x3f,
+  0x0c,0x00,0xf4,0x3f,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0xec,0x1f,0x1c,0x00,0xf8,0x7f,0xf4,0x3f, // 0x33
+  0x04,0x80,0x00,0x00,0x1c,0xe0,0x0c,0xc0,0x1c,0xe0,0x1c,0xe0,0x0c,0xc0,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf,
+  0x0c,0x00,0xf4,0x3f,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00, // 0x34
+  0xf0,0xbf,0xf8,0x7f,0x00,0xe0,0xe0,0xdf,0x00,0xe0,0x00,0xe0,0x00,0xc0,0x00,0xe0,0xf8,0x7f,0xf0,0xbf,
+  0x0c,0x00,0xf4,0x3f,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0xec,0x1f,0x1c,0x00,0xf8,0x7f,0xf4,0x3f, // 0x35
+  0xf0,0xbf,0xf8,0x7f,0x00,0xe0,0xe0,0xdf,0x00,0xe0,0x00,0xe0,0x00,0xc0,0x00,0xe0,0xf8,0x7f,0xf0,0xbf,
+  0x0c,0xc0,0xf4,0xbf,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf, // 0x36
+  0xf4,0x3f,0xf8,0x7f,0x1c,0x00,0xec,0x1f,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,
+  0x0c,0x00,0x04,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00, // 0x37
+  0xf4,0xbf,0xf8,0x7f,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0x1c,0xe0,0x0c,0xc0,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf,
+  0x0c,0xc0,0xf4,0xbf,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf, // 0x38
+  0xf4,0xbf,0xf8,0x7f,0x1c,0xe0,0xec,0xdf,0x1c,0xe0,0x1c,0xe0,0x0c,0xc0,0x1c,0xe0,0xf8,0x7f,0xf4,0xbf,
+  0x0c,0x00,0xf4,0x3f,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x1c,0x00,0x0c,0x00,0x1c,0x00,0x00,0x00,0x04,0x00, // 0x39
+  0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x0f,0x00,0x07,0x00,0x02,0x00,0x07,0x00,0x00,0x00,0x00,
+  0x00,0x02,0x00,0x00,0x80,0x0f,0x00,0x07,0x00,0x02,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  // 0x3a
+};
diff -r 000000000000 -r 61dcd2c0299a fonts/font_16x20.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_16x20.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,17 @@
+#ifndef _FONT_16x20_H_
+#define _FONT_16x20_H_
+
+
+//----- DEFINES -----
+#define FONT16x20_START                   0x30
+#define FONT16x20_END                     0x3A
+#define FONT16x20_WIDTH                   16
+#define FONT16x20_HEIGHT                  20
+#define FONT16x20_BYTES                   2
+
+
+//----- GLOBALS -----
+extern const unsigned char font_16x20[];
+
+
+#endif 
diff -r 000000000000 -r 61dcd2c0299a fonts/font_16x24.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_16x24.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,58 @@
+#ifndef _FONT_16x24_H_
+#define _FONT_16x24_H_
+
+//----- DEFINES -----
+#define FONT16x24_START                   0x20
+#define FONT16x24_END                     0x44
+#define FONT16x24_WIDTH                   11
+#define FONT16x24_HEIGHT                  24
+#define FONT16x24_BYTES                   3
+
+//used here for displaying numbers 0 - 9 and '+', '-', '.'
+
+unsigned char   font_16x24[36][3][11]  = 
+{
+
+  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  ,// 0x20
+  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  ,// 0x21
+  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  ,// 0x22
+  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  ,// 0x23
+  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  ,// 0x24
+  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  ,// 0x25
+  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  ,// 0x26
+  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  ,// 0x27
+  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  ,// 0x28
+  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  ,// 0x29
+  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  ,// 0x2A
+
+  0,0,0,0,0,0,0,0,0,0,0    ,    0,0,0,0,64,64,64,254,254,64,64 , 0,0,0,0,0,0,0,15,15,0,0   ,//'+'// 0x2B
+  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  ,// 0x2C
+ 
+  0,0,0,0,0,0,0,0,0,0,0    ,    0,64,64,64,64,64,64,0,0,0,0    , 0,0,0,0,0,0,0,0,0,0,0     , //'-'// 0x2D
+  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,60,60,60,0,0,0,0,0    , //'.'  // 0x2E
+  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  ,// 0x2F
+  
+  0,128,192,224,224,96,224,224,192,128,0  ,  112,255,255,1,0,0,0,0,255,255,254  ,  0,15,31,60,56,48,56,56,31,15,3  , //'0' 0x30
+  0,0,0,0,128,224,224,0,0,0,0  ,  0,0,3,3,3,255,255,0,0,0,0  ,  0,0,56,56,56,63,63,56,56,56,0    , //'1' 0x31
+  0,192,192,224,96,96,224,224,192,128,0    ,    0,1,0,0,128,192,224,249,63,31,0   ,    0,60,62,63,63,59,57,56,56,56,56    ,//'2' 0x32
+  0,192,224,224,96,96,224,224,192,192,0    ,    0,1,0,0,48,48,56,125,239,207,0    ,    0,28,56,56,48,48,56,60,31,15,1    ,//'3'0x33
+  0,0,0,0,0,128,192,224,224,0,0    ,    224,240,248,222,207,199,193,255,255,192,192   ,    0,0,0,0,0,0,0,63,63,0,0    ,//'4'0x34
+  0,224,224,224,224,224,224,224,224,224,224   ,    0,63,63,63,56,56,48,112,240,224,0  ,    0,28,56,56,48,48,56,60,31,15,1  , //'5'0x35
+  0,0,128,192,192,224,96,96,224,224,0    ,    224,254,255,55,57,24,24,56,240,240,192  ,    0,15,31,28,56,48,48,56,31,15,7  ,//'6'0x36
+  0,224,224,224,224,224,224,224,224,224,224  ,   0,0,0,0,128,224,248,126,31,7,1    ,  0,0,56,62,31,7,1,0,0,0,0    ,//'7'0x37
+  0,128,192,224,224,96,96,224,192,192,0    ,    0,207,255,127,56,48,112,112,255,239,199    ,    3,15,31,60,56,48,48,56,31,31,15  ,   //'8'0x38
+  0,128,192,224,224,96,224,224,192,128,0   ,    12,63,127,241,224,192,192,225,255,255,254  ,    0,0,56,48,48,56,56,30,15,7,0,     //'9'0x39
+  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  ,// 0x3A
+  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  ,// 0x3B
+  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  ,// 0x3C
+  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  ,// 0x3D
+  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  ,// 0x3E
+  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  ,// 0x3F
+  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  ,// 0x40
+  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  ,// 0x41
+  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  ,// 0x42
+  0,128,192,224,224,96,224,224,192,128,0  ,  112,112,112,1,0,0,0,0,112,112,112  ,  0,0,0,0,0,0,0,0,0,0,0    //'C' 0x43
+};
+
+#endif
+
diff -r 000000000000 -r 61dcd2c0299a fonts/font_3x5.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_3x5.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,103 @@
+/* *******************************************
+ * Only numbers in a 3x5 dot format 
+ ********************************************* */
+#define FONT3x5_START                    0x20
+#define FONT3x5_END                      0x78
+#define FONT3x5_WIDTH                    3
+#define FONT3x5_HEIGHT                   5
+#define FONT3x5_BYTES                    1
+
+static const char font_3x5[] = {
+
+    0x00, 0x00, 0x00,  // -  0x20
+    0x00, 0x00, 0x00,  // -  0x21
+    0x00, 0x00, 0x00,  // -  0x22
+    0x00, 0x00, 0x00,  // -  0x23
+    0x00, 0x00, 0x00,  // -  0x24
+    0x00, 0x00, 0x00,  // -  0x25
+    0x00, 0x00, 0x00,  // -  0x26
+    0x00, 0x00, 0x00,  // -  0x27
+    0x00, 0x00, 0x00,  // -  0x28
+    0x00, 0x00, 0x00,  // -  0x29
+    0x00, 0x00, 0x00,  // -  0x2A
+    0x00, 0x00, 0x00,  // -  0x2B
+    0x00, 0x00, 0x00,  // -  0x2C
+    0x04, 0x04, 0x04,  // -  0x2D
+    0x00, 0x04, 0x00,  // .  0x2E
+    0x01, 0x0E, 0x10,  // /  0x2F
+    0x1F, 0x11, 0x1F,  // 0  0x30
+    0x00, 0x1F, 0x00,  // 1  0x31
+    0x1D, 0x15, 0x17,  // 2  0x32
+    0x15, 0x15, 0x1F,  // 3  0x33
+    0x07, 0x04, 0x1F,  // 4  0x34
+    0x17, 0x15, 0x1D,  // 5  0x35
+    0x1F, 0x14, 0x1C,  // 6  0x36
+    0x01, 0x01, 0x1F,  // 7  0x37
+    0x1F, 0x15, 0x1F,  // 8  0x38
+    0x07, 0x05, 0x1F,  // 9  0x39
+    0x18, 0x17, 0x1C,  //    0x3A
+    0x18, 0x17, 0x1C,  //    0x3B
+    0x18, 0x17, 0x1C,  //    0x3C
+    0x18, 0x17, 0x1C,  //    0x3D
+    0x18, 0x17, 0x1C,  //    0x3E
+    0x18, 0x17, 0x1C,  //    0x3F
+    0x18, 0x17, 0x1C,  //    0x40
+    0x18, 0x17, 0x1C,  //    0x41
+    0x18, 0x17, 0x1C,  //    0x42
+    0x18, 0x17, 0x1C,  //    0x43
+    0x18, 0x17, 0x1C,  //    0x44
+    0x18, 0x17, 0x1C,  //    0x45
+    0x18, 0x17, 0x1C,  //    0x46
+    0x18, 0x17, 0x1C,  //    0x47
+    0x18, 0x17, 0x1C,  //    0x48
+    0x18, 0x17, 0x1C,  //    0x49
+    0x18, 0x17, 0x1C,  //    0x4A
+    0x18, 0x17, 0x1C,  //    0x4B
+    0x18, 0x17, 0x1C,  //    0x4C
+    0x18, 0x17, 0x1C,  //    0x4D
+    0x18, 0x17, 0x1C,  //    0x4E
+    0x18, 0x17, 0x1C,  //    0x4F
+    0x18, 0x17, 0x1C,  //    0x50
+    0x18, 0x17, 0x1C,  //    0x51
+    0x18, 0x17, 0x1C,  //    0x52
+    0x18, 0x17, 0x1C,  //    0x53
+    0x18, 0x17, 0x1C,  //    0x54
+    0x18, 0x17, 0x1C,  //    0x55
+    0x18, 0x17, 0x1C,  //    0x56
+    0x18, 0x17, 0x1C,  //    0x57
+    0x18, 0x17, 0x1C,  //    0x58
+    0x18, 0x17, 0x1C,  //    0x59
+    0x18, 0x17, 0x1C,  //    0x5A
+    0x18, 0x17, 0x1C,  //    0x5B
+    0x18, 0x17, 0x1C,  //    0x5C
+    0x18, 0x17, 0x1C,  //    0x5D
+    0x18, 0x17, 0x1C,  //    0x5E
+    0x18, 0x17, 0x1C,  //    0x5F
+    0x18, 0x17, 0x1C,  //    0x60
+    0x18, 0x17, 0x1C,  //    0x61
+    0x18, 0x17, 0x1C,  //    0x62
+    0x18, 0x17, 0x1C,  //    0x63
+    0x18, 0x17, 0x1C,  //    0x64
+    0x18, 0x17, 0x1C,  //    0x65
+    0x18, 0x17, 0x1C,  //    0x66
+    0x18, 0x17, 0x1C,  //    0x67
+    0x18, 0x17, 0x1C,  //    0x68
+    0x18, 0x17, 0x1C,  //    0x69
+    0x18, 0x17, 0x1C,  //    0x6A
+    0x1F, 0x04, 0x0B,  // k  0x6B
+    0x18, 0x17, 0x1C,  //    0x6C
+    0x18, 0x17, 0x1C,  //    0x6D
+    0x18, 0x17, 0x1C,  //    0x6E
+    0x18, 0x17, 0x1C,  //    0x6F
+    0x18, 0x17, 0x1C,  //    0x70
+    0x18, 0x17, 0x1C,  //    0x71
+    0x18, 0x17, 0x1C,  //    0x72
+    0x18, 0x17, 0x1C,  //    0x73
+    0x18, 0x17, 0x1C,  //    0x74
+    0x18, 0x17, 0x1C,  //    0x75
+    0x18, 0x17, 0x1C,  //    0x76
+    0x18, 0x17, 0x1C,  //    0x77
+    0x0A, 0x04, 0x0A   // x  0x78
+    
+    
+};
\ No newline at end of file
diff -r 000000000000 -r 61dcd2c0299a fonts/font_5x7.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_5x7.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,100 @@
+#define FONT5x7_START                    0x20
+#define FONT5x7_END                      0x7A
+#define FONT5x7_WIDTH                    5
+#define FONT5x7_HEIGHT                   7
+#define FONT5x7_BYTES                    1
+
+static const char font_5x7[][5] =
+{
+   { 0x00, 0x00, 0x00, 0x00, 0x00 },  // sp
+   { 0x00, 0x00, 0x2f, 0x00, 0x00 },  // !
+   { 0x00, 0x07, 0x00, 0x07, 0x00 },  // "
+   { 0x14, 0x7f, 0x14, 0x7f, 0x14 },  // #
+   { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },  // $
+   { 0xc4, 0xc8, 0x10, 0x26, 0x46 },  // %
+   { 0x36, 0x49, 0x55, 0x22, 0x50 },  // &
+   { 0x00, 0x05, 0x03, 0x00, 0x00 },  // '
+   { 0x00, 0x1c, 0x22, 0x41, 0x00 },  // (
+   { 0x00, 0x41, 0x22, 0x1c, 0x00 },  // )
+   { 0x14, 0x08, 0x3E, 0x08, 0x14 },  // *
+   { 0x08, 0x08, 0x3E, 0x08, 0x08 },  // +
+   { 0x00, 0x00, 0x50, 0x30, 0x00 },  // ,
+   { 0x10, 0x10, 0x10, 0x10, 0x10 },  // -
+   { 0x00, 0x60, 0x60, 0x00, 0x00 },  // .
+   { 0x20, 0x10, 0x08, 0x04, 0x02 },  // /
+   { 0x3E, 0x51, 0x49, 0x45, 0x3E },  // 0
+   { 0x00, 0x42, 0x7F, 0x40, 0x00 },  // 1
+   { 0x42, 0x61, 0x51, 0x49, 0x46 },  // 2
+   { 0x21, 0x41, 0x45, 0x4B, 0x31 },  // 3
+   { 0x18, 0x14, 0x12, 0x7F, 0x10 },  // 4
+   { 0x27, 0x45, 0x45, 0x45, 0x39 },  // 5
+   { 0x3C, 0x4A, 0x49, 0x49, 0x30 },  // 6
+   { 0x01, 0x71, 0x09, 0x05, 0x03 },  // 7
+   { 0x36, 0x49, 0x49, 0x49, 0x36 },  // 8
+   { 0x06, 0x49, 0x49, 0x29, 0x1E },  // 9
+   { 0x00, 0x36, 0x36, 0x00, 0x00 },  // :
+   { 0x00, 0x56, 0x36, 0x00, 0x00 },  // ;
+   { 0x08, 0x14, 0x22, 0x41, 0x00 },  // <
+   { 0x14, 0x14, 0x14, 0x14, 0x14 },  // =
+   { 0x00, 0x41, 0x22, 0x14, 0x08 },  // >
+   { 0x02, 0x01, 0x51, 0x09, 0x06 },  // ?
+   { 0x32, 0x49, 0x59, 0x51, 0x3E },  // @
+   { 0x7E, 0x11, 0x11, 0x11, 0x7E },  // A
+   { 0x7F, 0x49, 0x49, 0x49, 0x36 },  // B
+   { 0x3E, 0x41, 0x41, 0x41, 0x22 },  // C
+   { 0x7F, 0x41, 0x41, 0x22, 0x1C },  // D
+   { 0x7F, 0x49, 0x49, 0x49, 0x41 },  // E
+   { 0x7F, 0x09, 0x09, 0x09, 0x01 },  // F
+   { 0x3E, 0x41, 0x49, 0x49, 0x7A },  // G
+   { 0x7F, 0x08, 0x08, 0x08, 0x7F },  // H
+   { 0x00, 0x41, 0x7F, 0x41, 0x00 },  // I
+   { 0x20, 0x40, 0x41, 0x3F, 0x01 },  // J
+   { 0x7F, 0x08, 0x14, 0x22, 0x41 },  // K
+   { 0x7F, 0x40, 0x40, 0x40, 0x40 },  // L
+   { 0x7F, 0x02, 0x0C, 0x02, 0x7F },  // M
+   { 0x7F, 0x04, 0x08, 0x10, 0x7F },  // N
+   { 0x3E, 0x41, 0x41, 0x41, 0x3E },  // O
+   { 0x7F, 0x09, 0x09, 0x09, 0x06 },  // P
+   { 0x3E, 0x41, 0x51, 0x21, 0x5E },  // Q
+   { 0x7F, 0x09, 0x19, 0x29, 0x46 },  // R
+   { 0x46, 0x49, 0x49, 0x49, 0x31 },  // S
+   { 0x01, 0x01, 0x7F, 0x01, 0x01 },  // T
+   { 0x3F, 0x40, 0x40, 0x40, 0x3F },  // U
+   { 0x1F, 0x20, 0x40, 0x20, 0x1F },  // V
+   { 0x3F, 0x40, 0x38, 0x40, 0x3F },  // W
+   { 0x63, 0x14, 0x08, 0x14, 0x63 },  // X
+   { 0x07, 0x08, 0x70, 0x08, 0x07 },  // Y
+   { 0x61, 0x51, 0x49, 0x45, 0x43 },  // Z
+   { 0x00, 0x7F, 0x41, 0x41, 0x00 },  // [
+   { 0x55, 0x2A, 0x55, 0x2A, 0x55 },  // 55
+   { 0x00, 0x41, 0x41, 0x7F, 0x00 },  // ]
+   { 0x04, 0x02, 0x01, 0x02, 0x04 },  // ^
+   { 0x40, 0x40, 0x40, 0x40, 0x40 },  // _
+   { 0x00, 0x01, 0x02, 0x04, 0x00 },  // '
+   { 0x20, 0x54, 0x54, 0x54, 0x78 },  // a
+   { 0x7F, 0x48, 0x44, 0x44, 0x38 },  // b
+   { 0x38, 0x44, 0x44, 0x44, 0x20 },  // c
+   { 0x38, 0x44, 0x44, 0x48, 0x7F },  // d
+   { 0x38, 0x54, 0x54, 0x54, 0x18 },  // e
+   { 0x08, 0x7E, 0x09, 0x01, 0x02 },  // f
+   { 0x0C, 0x52, 0x52, 0x52, 0x3E },  // g
+   { 0x7F, 0x08, 0x04, 0x04, 0x78 },  // h
+   { 0x00, 0x44, 0x7D, 0x40, 0x00 },  // i
+   { 0x20, 0x40, 0x44, 0x3D, 0x00 },  // j
+   { 0x7F, 0x10, 0x28, 0x44, 0x00 },  // k
+   { 0x00, 0x41, 0x7F, 0x40, 0x00 },  // l
+   { 0x7C, 0x04, 0x18, 0x04, 0x78 },  // m
+   { 0x7C, 0x08, 0x04, 0x04, 0x78 },  // n
+   { 0x38, 0x44, 0x44, 0x44, 0x38 },  // o
+   { 0x7C, 0x14, 0x14, 0x14, 0x08 },  // p
+   { 0x08, 0x14, 0x14, 0x18, 0x7C },  // q
+   { 0x7C, 0x08, 0x04, 0x04, 0x08 },  // r
+   { 0x48, 0x54, 0x54, 0x54, 0x20 },  // s
+   { 0x04, 0x3F, 0x44, 0x40, 0x20 },  // t
+   { 0x3C, 0x40, 0x40, 0x20, 0x7C },  // u
+   { 0x1C, 0x20, 0x40, 0x20, 0x1C },  // v
+   { 0x3C, 0x40, 0x30, 0x40, 0x3C },  // w
+   { 0x44, 0x28, 0x10, 0x28, 0x44 },  // x
+   { 0x0C, 0x50, 0x50, 0x50, 0x3C },  // y
+   { 0x44, 0x64, 0x54, 0x4C, 0x44 }   // z
+};
\ No newline at end of file
diff -r 000000000000 -r 61dcd2c0299a fonts/font_6x8.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_6x8.cpp	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,99 @@
+#include "font_6x8.h"
+const unsigned char font_6x8[576] = {
+0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 20
+0x00,0x00,0x00,0x5F,0x00,0x00, // Symbol 21
+0x00,0x00,0x03,0x00,0x03,0x00, // Symbol 22
+0x22,0x7F,0x22,0x22,0x7F,0x22, // Symbol 23
+0x00,0x24,0x2A,0x6B,0x2A,0x12, // Symbol 24
+0x00,0x23,0x13,0x08,0x64,0x62, // Symbol 25
+0x00,0x3A,0x45,0x45,0x3A,0x28, // Symbol 26
+0x00,0x00,0x00,0x02,0x01,0x00, // Symbol 27
+0x00,0x00,0x3E,0x41,0x00,0x00, // Symbol 28
+0x00,0x00,0x41,0x3E,0x00,0x00, // Symbol 29
+0x00,0x2A,0x1C,0x1C,0x2A,0x00, // Symbol 2A
+0x00,0x08,0x08,0x3E,0x08,0x08, // Symbol 2B
+0x00,0x00,0x80,0x40,0x00,0x00, // Symbol 2C
+0x00,0x08,0x08,0x08,0x08,0x00, // Symbol 2D
+0x00,0x00,0x00,0x40,0x00,0x00, // Symbol 2E
+0x00,0x20,0x10,0x08,0x04,0x02, // Symbol 2F
+0x00,0x3E,0x51,0x49,0x45,0x3E, // Symbol 30
+0x00,0x00,0x42,0x7F,0x40,0x00, // Symbol 31
+0x00,0x62,0x51,0x51,0x51,0x4E, // Symbol 32
+0x00,0x21,0x41,0x45,0x45,0x3B, // Symbol 33
+0x00,0x18,0x16,0x11,0x7F,0x10, // Symbol 34
+0x00,0x27,0x45,0x45,0x45,0x39, // Symbol 35
+0x00,0x3E,0x49,0x49,0x49,0x32, // Symbol 36
+0x00,0x01,0x61,0x11,0x09,0x07, // Symbol 37
+0x00,0x36,0x49,0x49,0x49,0x36, // Symbol 38
+0x00,0x26,0x49,0x49,0x49,0x3E, // Symbol 39
+0x00,0x00,0x00,0x12,0x00,0x00, // Symbol 3A
+0x00,0x00,0x20,0x12,0x00,0x00, // Symbol 3B
+0x00,0x08,0x14,0x22,0x41,0x00, // Symbol 3C
+0x00,0x14,0x14,0x14,0x14,0x14, // Symbol 3D
+0x00,0x41,0x22,0x14,0x08,0x00, // Symbol 3E
+0x00,0x06,0x01,0x51,0x09,0x06, // Symbol 3F
+0x00,0x3E,0x41,0x4D,0x4D,0x2E, // Symbol 40
+0x00,0x78,0x16,0x11,0x16,0x78, // Symbol 41
+0x00,0x7F,0x49,0x49,0x49,0x36, // Symbol 42
+0x00,0x3E,0x41,0x41,0x41,0x22, // Symbol 43
+0x00,0x7F,0x41,0x41,0x41,0x3E, // Symbol 44
+0x00,0x7F,0x49,0x49,0x49,0x41, // Symbol 45
+0x00,0x7F,0x09,0x09,0x09,0x01, // Symbol 46
+0x00,0x3E,0x41,0x41,0x51,0x32, // Symbol 47
+0x00,0x7F,0x08,0x08,0x08,0x7F, // Symbol 48
+0x00,0x00,0x41,0x7F,0x41,0x00, // Symbol 49
+0x00,0x30,0x40,0x41,0x41,0x3F, // Symbol 4A
+0x00,0x7F,0x08,0x08,0x14,0x63, // Symbol 4B
+0x00,0x7F,0x40,0x40,0x40,0x60, // Symbol 4C
+0x00,0x7F,0x04,0x18,0x04,0x7F, // Symbol 4D
+0x00,0x7F,0x04,0x08,0x10,0x7F, // Symbol 4E
+0x00,0x3E,0x41,0x41,0x41,0x3E, // Symbol 4F
+0x00,0x7F,0x09,0x09,0x09,0x06, // Symbol 50
+0x00,0x3E,0x41,0x61,0x21,0x5E, // Symbol 51
+0x00,0x7F,0x09,0x09,0x19,0x66, // Symbol 52
+0x00,0x26,0x49,0x49,0x49,0x32, // Symbol 53
+0x00,0x01,0x01,0x7F,0x01,0x01, // Symbol 54
+0x00,0x3F,0x40,0x40,0x40,0x3F, // Symbol 55
+0x00,0x07,0x18,0x60,0x18,0x07, // Symbol 56
+0x00,0x1F,0x60,0x18,0x60,0x1F, // Symbol 57
+0x00,0x63,0x14,0x08,0x14,0x63, // Symbol 58
+0x00,0x03,0x04,0x78,0x04,0x03, // Symbol 59
+0x00,0x61,0x51,0x49,0x45,0x43, // Symbol 5A
+0x00,0x00,0x7F,0x41,0x00,0x00, // Symbol 5B
+0x00,0x02,0x04,0x08,0x10,0x20, // Symbol 5C
+0x00,0x00,0x41,0x7F,0x00,0x00, // Symbol 5D
+0x00,0x00,0x00,0x00,0x00,0x00, // Symbol 5E
+0x40,0x40,0x40,0x40,0x40,0x40, // Symbol 5F
+0x00,0x00,0x00,0x01,0x02,0x00, // Symbol 60
+0x00,0x20,0x54,0x54,0x54,0x78, // Symbol 61
+0x00,0x7E,0x48,0x48,0x48,0x30, // Symbol 62
+0x00,0x38,0x44,0x44,0x44,0x28, // Symbol 63
+0x00,0x30,0x48,0x48,0x48,0x7E, // Symbol 64
+0x00,0x38,0x54,0x54,0x54,0x18, // Symbol 65
+0x00,0x10,0x7C,0x12,0x02,0x04, // Symbol 66
+0x00,0x0C,0x52,0x52,0x3C,0x02, // Symbol 67
+0x00,0x7E,0x08,0x08,0x08,0x70, // Symbol 68
+0x00,0x00,0x00,0x74,0x00,0x00, // Symbol 69
+0x00,0x40,0x80,0x80,0x74,0x00, // Symbol 6A
+0x00,0x7E,0x10,0x10,0x10,0x6C, // Symbol 6B
+0x00,0x00,0x02,0x7E,0x00,0x00, // Symbol 6C
+0x00,0x7C,0x04,0x78,0x04,0x78, // Symbol 6D
+0x00,0x7C,0x04,0x04,0x04,0x78, // Symbol 6E
+0x00,0x38,0x44,0x44,0x44,0x38, // Symbol 6F
+0x00,0xFC,0x24,0x24,0x24,0x18, // Symbol 70
+0x00,0x18,0x24,0x24,0x24,0xFC, // Symbol 71
+0x00,0x7C,0x08,0x04,0x04,0x08, // Symbol 72
+0x00,0x48,0x54,0x54,0x54,0x20, // Symbol 73
+0x00,0x08,0x3E,0x48,0x40,0x00, // Symbol 74
+0x00,0x3C,0x40,0x40,0x40,0x3C, // Symbol 75
+0x00,0x1C,0x20,0x40,0x20,0x1C, // Symbol 76
+0x00,0x3C,0x40,0x30,0x40,0x3C, // Symbol 77
+0x00,0x44,0x28,0x10,0x28,0x44, // Symbol 78
+0x00,0x1C,0x20,0xA0,0xA0,0x7C, // Symbol 79
+0x00,0x44,0x64,0x54,0x4C,0x44, // Symbol 7A
+0x00,0x08,0x36,0x41,0x00,0x00, // Symbol 7B
+0x00,0x00,0x00,0x7F,0x00,0x00, // Symbol 7C
+0x00,0x00,0x41,0x36,0x08,0x00, // Symbol 7D
+0x02,0x01,0x01,0x02,0x02,0x01, // Symbol 7E
+0x00,0x7F,0x7F,0x7F,0x7F,0x7F  // Symbol 7F
+};
diff -r 000000000000 -r 61dcd2c0299a fonts/font_6x8.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_6x8.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,17 @@
+#ifndef _FONT_6X8_H_
+#define _FONT_6X8_H_
+
+
+//----- DEFINES -----
+#define FONT6x8_START            0x20
+#define FONT6x8_END              0x7A
+#define FONT6x8_WIDTH            6
+#define FONT6x8_HEIGHT           8
+#define FONT6x8_BYTES                    1
+
+
+//----- GLOBALS -----
+extern const unsigned char font_6x8[];
+
+
+#endif 
diff -r 000000000000 -r 61dcd2c0299a fonts/font_8x12.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_8x12.cpp	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,36 @@
+#include "font_8x12.h"
+
+
+//0x20 - 0xFF
+const unsigned char font_8x12[] = 
+{
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x20 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x21 */ 	          
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x22 */ 	            
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x23 */ 	           
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x24 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x25 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x26 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x27 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x28 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x29 */ 	     
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x2A */ 	          
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x2B */
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x2C */       
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 0x2D */      
+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,  /* 0x2F */         
+
+0x00,0xFC,0xFE,0x03,0x03,0x03,0xFE,0xFC, 0x00,0x03,0x07,0x0C,0x0C,0x0C,0x07,0x03, /* 0 */
+0x00,0x04,0x06,0xFF,0xFF,0x00,0x00,0x00, 0x00,0x00,0x0C,0x0F,0x0F,0x0C,0x00,0x00, /* 1 */
+0x00,0x0E,0x03,0x83,0xC3,0x63,0x3E,0x1C, 0x00,0x07,0x0F,0x0D,0x0C,0x0C,0x0E,0x0E, /* 2 */
+0x00,0x06,0x03,0x63,0x63,0x63,0xFE,0x9C, 0x00,0x06,0x0C,0x0C,0x0C,0x0C,0x07,0x03, /* 3 */
+0x00,0xE0,0xF0,0x98,0x8C,0xFE,0xFF,0x80, 0x00,0x01,0x01,0x01,0x01,0x0F,0x0F,0x01, /* 4 */
+0x00,0x3F,0x7F,0x63,0x63,0x63,0x63,0xC3, 0x00,0x0C,0x0C,0x0C,0x0C,0x0C,0x07,0x03, /* 5 */
+0x00,0xFE,0xFF,0x63,0x63,0x63,0x63,0xC2, 0x00,0x07,0x0F,0x0C,0x0C,0x0C,0x07,0x03, /* 6 */
+0x00,0x03,0x03,0x03,0xE3,0xFB,0x1F,0x07, 0x00,0x00,0x00,0x0F,0x0F,0x01,0x00,0x00, /* 7 */
+0x00,0x9C,0xFE,0x63,0x63,0x63,0xFE,0x9C, 0x00,0x03,0x07,0x0C,0x0C,0x0C,0x07,0x03, /* 8 */
+0x00,0x3C,0x7E,0xE7,0xC3,0x67,0xFE,0xFC, 0x00,0x06,0x0E,0x0C,0x0C,0x0E,0x07,0x03  /* 9 */
+
+
+};
diff -r 000000000000 -r 61dcd2c0299a fonts/font_8x12.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_8x12.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,17 @@
+#ifndef _FONT_8X12_H_
+#define _FONT_8X12_H_
+
+
+//----- DEFINES -----
+#define FONT8x12_START                    0x20
+#define FONT8x12_END                      0x39
+#define FONT8x12_WIDTH                    8
+#define FONT8x12_HEIGHT                   12
+#define FONT8x12_BYTES                    2
+
+
+//----- GLOBALS -----
+extern const unsigned char font_8x12[];
+
+
+#endif //_FONT_8X12_H_
diff -r 000000000000 -r 61dcd2c0299a fonts/font_8x8.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_8x8.cpp	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,231 @@
+#include "font_8x8.h"
+
+
+//0x20 - 0xFF
+const unsigned char font_8x8[] = 
+{
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x20
+  0x30,0x78,0x78,0x30,0x00,0x30,0x00,0x30, // 0x21
+  0x00,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00, // 0x22
+  0x6c,0xfe,0x6c,0x6c,0x00,0x6c,0x6c,0xfe, // 0x23
+  0x78,0xc0,0x7c,0x30,0x00,0x30,0xf8,0x0c, // 0x24
+  0x18,0xcc,0xc6,0x00,0x00,0xc6,0x66,0x30, // 0x25
+  0x76,0x38,0x6c,0x38,0x00,0x76,0xcc,0xdc, // 0x26
+  0x00,0xc0,0x60,0x60,0x00,0x00,0x00,0x00, // 0x27
+  0x60,0x60,0x30,0x18,0x00,0x18,0x30,0x60, // 0x28
+  0x18,0x18,0x30,0x60,0x00,0x60,0x30,0x18, // 0x29
+  0xff,0x3c,0x66,0x00,0x00,0x00,0x66,0x3c, // 0x2a
+  0xfc,0x30,0x30,0x00,0x00,0x00,0x30,0x30, // 0x2b
+  0x00,0x00,0x00,0x00,0x60,0x30,0x70,0x00, // 0x2c
+  0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0x2d
+  0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00, // 0x2e
+  0x30,0x18,0x0c,0x06,0x00,0x80,0xc0,0x60, // 0x2f
+  0xfc,0xdc,0xcc,0x78,0x00,0x78,0xcc,0xec, // 0x30
+  0x30,0x30,0xf0,0x30,0x00,0xfc,0x30,0x30, // 0x31
+  0x38,0x0c,0xcc,0x78,0x00,0xfc,0xcc,0x60, // 0x32
+  0x38,0x0c,0xcc,0x78,0x00,0x78,0xcc,0x0c, // 0x33
+  0xcc,0x6c,0x3c,0x1c,0x00,0x0c,0x0c,0xfe, // 0x34
+  0x0c,0xf8,0xc0,0xfc,0x00,0x78,0xcc,0x0c, // 0x35
+  0xf8,0xc0,0x60,0x38,0x00,0x78,0xcc,0xcc, // 0x36
+  0x18,0x0c,0xcc,0xfc,0x00,0x60,0x60,0x30, // 0x37
+  0x78,0xcc,0xcc,0x78,0x00,0x78,0xcc,0xcc, // 0x38
+  0x7c,0xcc,0xcc,0x78,0x00,0x70,0x18,0x0c, // 0x39
+  0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00, // 0x3a
+  0x30,0x30,0x00,0x00,0x60,0x30,0x70,0x00, // 0x3b
+  0xc0,0x60,0x30,0x18,0x00,0x18,0x30,0x60, // 0x3c
+  0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0xfc, // 0x3d
+  0x0c,0x18,0x30,0x60,0x00,0x60,0x30,0x18, // 0x3e
+  0x18,0x0c,0xcc,0x78,0x00,0x30,0x00,0x30, // 0x3f
+  0xde,0xde,0xc6,0x7c,0x00,0x78,0xc0,0xde, // 0x40
+  0xcc,0xcc,0x78,0x30,0x00,0xcc,0xcc,0xfc, // 0x41
+  0x7c,0x66,0x66,0xfc,0x00,0xfc,0x66,0x66, // 0x42
+  0xc0,0xc0,0x66,0x3c,0x00,0x3c,0x66,0xc0, // 0x43
+  0x66,0x66,0x6c,0xfc,0x00,0xfc,0x6c,0x66, // 0x44
+  0x78,0x68,0x62,0xfe,0x00,0xfe,0x62,0x68, // 0x45
+  0x78,0x68,0x62,0xfe,0x00,0xf0,0x60,0x68, // 0x46
+  0xc0,0xc0,0x66,0x3c,0x00,0x3e,0x66,0xce, // 0x47
+  0xfc,0xcc,0xcc,0xcc,0x00,0xcc,0xcc,0xcc, // 0x48
+  0x30,0x30,0x30,0x78,0x00,0x78,0x30,0x30, // 0x49
+  0x0c,0x0c,0x0c,0x1e,0x00,0x78,0xcc,0xcc, // 0x4a
+  0x78,0x6c,0x66,0xe6,0x00,0xe6,0x66,0x6c, // 0x4b
+  0x60,0x60,0x60,0xf0,0x00,0xfe,0x66,0x62, // 0x4c
+  0xd6,0xfe,0xee,0xc6,0x00,0xc6,0xc6,0xc6, // 0x4d
+  0xde,0xf6,0xe6,0xc6,0x00,0xc6,0xc6,0xce, // 0x4e
+  0xc6,0xc6,0x6c,0x38,0x00,0x38,0x6c,0xc6, // 0x4f
+  0x7c,0x66,0x66,0xfc,0x00,0xf0,0x60,0x60, // 0x50
+  0xcc,0xcc,0xcc,0x78,0x00,0x1c,0x78,0xdc, // 0x51
+  0x7c,0x66,0x66,0xfc,0x00,0xe6,0x6c,0x78, // 0x52
+  0x38,0xe0,0xcc,0x78,0x00,0x78,0xcc,0x1c, // 0x53
+  0x30,0x30,0xb4,0xfc,0x00,0x78,0x30,0x30, // 0x54
+  0xcc,0xcc,0xcc,0xcc,0x00,0xfc,0xcc,0xcc, // 0x55
+  0xcc,0xcc,0xcc,0xcc,0x00,0x30,0x78,0xcc, // 0x56
+  0xd6,0xc6,0xc6,0xc6,0x00,0xc6,0xee,0xfe, // 0x57
+  0x38,0x6c,0xc6,0xc6,0x00,0xc6,0xc6,0x6c, // 0x58
+  0x78,0xcc,0xcc,0xcc,0x00,0x78,0x30,0x30, // 0x59
+  0x30,0x98,0xcc,0xfe,0x00,0xfe,0xc6,0x62, // 0x5a
+  0x60,0x60,0x60,0x78,0x00,0x78,0x60,0x60, // 0x5b
+  0x18,0x30,0x60,0xc0,0x00,0x02,0x06,0x0c, // 0x5c
+  0x18,0x18,0x18,0x78,0x00,0x78,0x18,0x18, // 0x5d
+  0xc6,0x6c,0x38,0x10,0x00,0x00,0x00,0x00, // 0x5e
+  0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, // 0x5f
+  0x00,0x18,0x30,0x30,0x00,0x00,0x00,0x00, // 0x60
+  0x0c,0x78,0x00,0x00,0x00,0x76,0xcc,0x7c, // 0x61
+  0x66,0x7c,0x60,0xe0,0x00,0xbc,0x66,0x66, // 0x62
+  0xcc,0x78,0x00,0x00,0x00,0x78,0xcc,0xc0, // 0x63
+  0x7c,0x0c,0x0c,0x1c,0x00,0x76,0xcc,0xcc, // 0x64
+  0xcc,0x78,0x00,0x00,0x00,0x78,0xc0,0xfc, // 0x65
+  0xf0,0x60,0x6c,0x38,0x00,0xf0,0x60,0x60, // 0x66
+  0xcc,0x76,0x00,0x00,0xf8,0x0c,0x7c,0xcc, // 0x67
+  0x76,0x6c,0x60,0xe0,0x00,0xe6,0x66,0x66, // 0x68
+  0x30,0x70,0x00,0x30,0x00,0x78,0x30,0x30, // 0x69
+  0x18,0x78,0x00,0x18,0x70,0xd8,0x18,0x18, // 0x6a
+  0x6c,0x66,0x60,0xe0,0x00,0xe6,0x6c,0x78, // 0x6b
+  0x30,0x30,0x30,0x70,0x00,0x78,0x30,0x30, // 0x6c
+  0xfe,0xec,0x00,0x00,0x00,0xc6,0xc6,0xd6, // 0x6d
+  0xcc,0xf8,0x00,0x00,0x00,0xcc,0xcc,0xcc, // 0x6e
+  0xcc,0x78,0x00,0x00,0x00,0x78,0xcc,0xcc, // 0x6f
+  0x66,0xdc,0x00,0x00,0xf0,0x60,0x7c,0x66, // 0x70
+  0xcc,0x76,0x00,0x00,0x1e,0x0c,0x7c,0xcc, // 0x71
+  0x6c,0xd8,0x00,0x00,0x00,0xf0,0x60,0x6c, // 0x72
+  0xc0,0x7c,0x00,0x00,0x00,0xf8,0x0c,0x78, // 0x73
+  0x30,0x7c,0x30,0x10,0x00,0x18,0x34,0x30, // 0x74
+  0xcc,0xcc,0x00,0x00,0x00,0x76,0xcc,0xcc, // 0x75
+  0xcc,0xcc,0x00,0x00,0x00,0x30,0x78,0xcc, // 0x76
+  0xc6,0xc6,0x00,0x00,0x00,0x6c,0xfe,0xd6, // 0x77
+  0x6c,0xc6,0x00,0x00,0x00,0xc6,0x6c,0x38, // 0x78
+  0xcc,0xcc,0x00,0x00,0xf8,0x0c,0x7c,0xcc, // 0x79
+  0x98,0xfc,0x00,0x00,0x00,0xfc,0x64,0x30, // 0x7a
+  0xe0,0x30,0x30,0x1c,0x00,0x1c,0x30,0x30, // 0x7b
+  0x00,0x18,0x18,0x18,0x00,0x18,0x18,0x18, // 0x7c
+  0x1c,0x30,0x30,0xe0,0x00,0xe0,0x30,0x30, // 0x7d
+  0x00,0x00,0xdc,0x76,0x00,0x00,0x00,0x00, // 0x7e
+  0xc6,0x6c,0x38,0x10,0x00,0xfe,0xc6,0xc6, // 0x7f
+  0xc0,0xc0,0xcc,0x78,0x60,0x30,0x78,0xcc, // 0x80
+  0xcc,0x00,0xcc,0x00,0x00,0x7e,0xcc,0xcc, // 0x81
+  0xcc,0x78,0x30,0x18,0x00,0x78,0xc0,0xfc, // 0x82
+  0x06,0x3c,0xc3,0x7e,0x00,0x3f,0x66,0x3e, // 0x83
+  0x0c,0x78,0x00,0xcc,0x00,0x7e,0xcc,0x7c, // 0x84
+  0x0c,0x78,0x30,0x60,0x00,0x7e,0xcc,0x7c, // 0x85
+  0x06,0x3c,0x66,0x3c,0x00,0x3f,0x66,0x3e, // 0x86
+  0xc0,0xcc,0x78,0x00,0x60,0x30,0x78,0xcc, // 0x87
+  0x66,0x3c,0xc3,0x7e,0x00,0x3c,0x60,0x7e, // 0x88
+  0xcc,0x78,0x00,0xcc,0x00,0x78,0xc0,0xfc, // 0x89
+  0xcc,0x78,0x30,0x60,0x00,0x78,0xc0,0xfc, // 0x8a
+  0x30,0x70,0x00,0xcc,0x00,0x78,0x30,0x30, // 0x8b
+  0x18,0x38,0xc6,0x7c,0x00,0x3c,0x18,0x18, // 0x8c
+  0x30,0x70,0x30,0x60,0x00,0x78,0x30,0x30, // 0x8d
+  0xcc,0x78,0x30,0xcc,0x00,0xcc,0xfc,0xcc, // 0x8e
+  0x78,0x30,0x48,0x30,0x00,0xcc,0xfc,0xcc, // 0x8f
+  0x60,0xfc,0x30,0x18,0x00,0xfc,0x60,0x78, // 0x90
+  0x0c,0x7f,0x00,0x00,0x00,0x7f,0xcc,0x7f, // 0x91
+  0xfe,0xcc,0x6c,0x3e,0x00,0xce,0xcc,0xcc, // 0x92
+  0x78,0x00,0xcc,0x78,0x00,0x78,0xcc,0xcc, // 0x93
+  0x78,0x00,0xcc,0x00,0x00,0x78,0xcc,0xcc, // 0x94
+  0x78,0x00,0x30,0x60,0x00,0x78,0xcc,0xcc, // 0x95
+  0xcc,0x00,0xcc,0x78,0x00,0x7e,0xcc,0xcc, // 0x96
+  0xcc,0x00,0x30,0x60,0x00,0x7e,0xcc,0xcc, // 0x97
+  0xcc,0x00,0xcc,0x00,0xf8,0x0c,0xfc,0xcc, // 0x98
+  0xc6,0x7c,0x00,0xc6,0x00,0x7c,0xc6,0xc6, // 0x99
+  0xcc,0xcc,0x00,0xcc,0x00,0x78,0xcc,0xcc, // 0x9a
+  0xce,0x7c,0x00,0x00,0x00,0x7c,0xe6,0xd6, // 0x9b
+  0xf0,0x64,0x6c,0x38,0x00,0xfc,0xe6,0x60, // 0x9c
+  0xd6,0xce,0x6c,0x3a,0x00,0xb8,0x6c,0xe6, // 0x9d
+  0x78,0xcc,0x00,0x00,0x00,0xcc,0x78,0x30, // 0x9e
+  0x7e,0x18,0x1b,0x0e,0x70,0xd8,0x18,0x18, // 0x9f
+  0x0c,0x78,0x30,0x18,0x00,0x7e,0xcc,0x7c, // 0xa0
+  0x30,0x70,0x30,0x18,0x00,0x78,0x30,0x30, // 0xa1
+  0x78,0x00,0x18,0x0c,0x00,0x78,0xcc,0xcc, // 0xa2
+  0xcc,0x00,0x18,0x0c,0x00,0x7e,0xcc,0xcc, // 0xa3
+  0xf8,0x00,0xdc,0x76,0x00,0xcc,0xcc,0xcc, // 0xa4
+  0xec,0x00,0xdc,0x76,0x00,0xcc,0xdc,0xfc, // 0xa5
+  0x3e,0x6c,0x6c,0x3c,0x00,0x00,0x7e,0x00, // 0xa6
+  0x3c,0x66,0x66,0x3c,0x00,0x00,0x7e,0x00, // 0xa7
+  0x60,0x30,0x00,0x30,0x00,0x78,0xcc,0xc0, // 0xa8
+  0xb9,0xa5,0x5a,0x3c,0x00,0x3c,0x66,0xa9, // 0xa9
+  0xfc,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c, // 0xaa
+  0x7e,0x78,0x6c,0xe6,0x1f,0x98,0xce,0x63, // 0xab
+  0x73,0x78,0x6c,0xe6,0x03,0x9f,0xcd,0x67, // 0xac
+  0x18,0x00,0x18,0x00,0x18,0x3c,0x3c,0x18, // 0xad
+  0xcc,0x66,0x33,0x00,0x00,0x00,0x33,0x66, // 0xae
+  0x33,0x66,0xcc,0x00,0x00,0x00,0xcc,0x66, // 0xaf
+  0x88,0x22,0x88,0x22,0x88,0x22,0x88,0x22, // 0xb0
+  0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55, // 0xb1
+  0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd, // 0xb2
+  0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 0xb3
+  0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8, // 0xb4
+  0x78,0x30,0x18,0x0c,0x00,0xcc,0xfc,0xcc, // 0xb5
+  0x78,0x30,0x84,0x78,0x00,0xcc,0xfc,0xcc, // 0xb6
+  0x78,0x30,0x60,0xc0,0x00,0xcc,0xfc,0xcc, // 0xb7
+  0xa1,0xb9,0x42,0x3c,0x00,0x3c,0x42,0xb9, // 0xb8
+  0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0xf6, // 0xb9
+  0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, // 0xba
+  0x06,0xfe,0x00,0x00,0x36,0x36,0x36,0xf6, // 0xbb
+  0x06,0xf6,0x36,0x36,0x00,0x00,0x00,0xfe, // 0xbc
+  0xc0,0x7e,0x18,0x18,0x18,0x18,0x7e,0xc0, // 0xbd
+  0xfc,0x78,0xcc,0xcc,0x30,0x30,0xfc,0x30, // 0xbe
+  0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xf8, // 0xbf
+  0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x1f, // 0xc0
+  0x18,0x18,0x18,0x18,0x00,0x00,0x00,0xff, // 0xc1
+  0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xff, // 0xc2
+  0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f, // 0xc3
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff, // 0xc4
+  0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff, // 0xc5
+  0x0c,0x78,0xdc,0x76,0x00,0x7e,0xcc,0x7c, // 0xc6
+  0x78,0x30,0xdc,0x76,0x00,0xcc,0xfc,0xcc, // 0xc7
+  0x30,0x37,0x36,0x36,0x00,0x00,0x00,0x3f, // 0xc8
+  0x30,0x3f,0x00,0x00,0x36,0x36,0x36,0x37, // 0xc9
+  0x00,0xf7,0x36,0x36,0x00,0x00,0x00,0xff, // 0xca
+  0x00,0xff,0x00,0x00,0x36,0x36,0x36,0xf7, // 0xcb
+  0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x37, // 0xcc
+  0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xff, // 0xcd
+  0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0xf7, // 0xce
+  0x6c,0xfe,0x82,0x00,0x00,0x82,0xfe,0x6c, // 0xcf
+  0x0c,0xd8,0x70,0xd8,0x00,0x38,0x6c,0x3c, // 0xd0
+  0xf6,0x66,0x6c,0xfc,0x00,0xfc,0x6c,0x66, // 0xd1
+  0x60,0xfc,0x84,0x78,0x00,0xfc,0x60,0x78, // 0xd2
+  0x60,0xfc,0x00,0xcc,0x00,0xfc,0x60,0x78, // 0xd3
+  0x60,0xfc,0x30,0x60,0x00,0xfc,0x60,0x78, // 0xd4
+  0xe0,0x40,0xc0,0x00,0x00,0x00,0x00,0x00, // 0xd5
+  0x30,0x78,0x30,0x18,0x00,0x78,0x30,0x30, // 0xd6
+  0x30,0x78,0x84,0x78,0x00,0x78,0x30,0x30, // 0xd7
+  0x30,0x78,0x00,0xcc,0x00,0x78,0x30,0x30, // 0xd8
+  0x18,0x18,0x18,0x18,0x00,0x00,0x00,0xf8, // 0xd9
+  0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x1f, // 0xda
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xdb
+  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, // 0xdc
+  0x00,0x18,0x18,0x18,0x00,0x18,0x18,0x18, // 0xdd
+  0x30,0x78,0x30,0x60,0x00,0x78,0x30,0x30, // 0xde
+  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, // 0xdf
+  0xc6,0x7c,0x30,0x18,0x00,0x7c,0xc6,0xc6, // 0xe0
+  0xf8,0xcc,0x78,0x00,0xc0,0xc0,0xf8,0xcc, // 0xe1
+  0xc6,0x7c,0x82,0x7c,0x00,0x7c,0xc6,0xc6, // 0xe2
+  0xc6,0x7c,0x18,0x30,0x00,0x7c,0xc6,0xc6, // 0xe3
+  0x78,0x00,0xdc,0x76,0x00,0x78,0xcc,0xcc, // 0xe4
+  0xc6,0x7c,0xdc,0x76,0x00,0x7c,0xc6,0xc6, // 0xe5
+  0x66,0x66,0x66,0x00,0xc0,0x60,0x7c,0x66, // 0xe6
+  0x6c,0x78,0xe0,0x00,0x00,0xf0,0x60,0x78, // 0xe7
+  0x66,0x7c,0x60,0xf0,0x00,0xf0,0x60,0x7c, // 0xe8
+  0xcc,0xcc,0x30,0x18,0x00,0x78,0xcc,0xcc, // 0xe9
+  0xcc,0x00,0x84,0x78,0x00,0x78,0xcc,0xcc, // 0xea
+  0xcc,0xcc,0x30,0x60,0x00,0x78,0xcc,0xcc, // 0xeb
+  0xcc,0x00,0x30,0x18,0xf8,0x0c,0xfc,0xcc, // 0xec
+  0xcc,0xcc,0x30,0x18,0x00,0x78,0x30,0x78, // 0xed
+  0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, // 0xee
+  0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00, // 0xef
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc, // 0xf0
+  0x30,0xfc,0x30,0x30,0x00,0xfc,0x00,0x30, // 0xf1
+  0xfc,0x00,0x00,0x00,0x00,0x00,0xfc,0x00, // 0xf2
+  0x33,0x78,0x2c,0xe6,0x03,0x9f,0xcd,0xe7, // 0xf3
+  0x7b,0xdb,0xdb,0x7f,0x00,0x1b,0x1b,0x1b, // 0xf4
+  0xcc,0x78,0xc3,0x7e,0xf8,0x8c,0x78,0xcc, // 0xf5
+  0xfc,0x00,0x30,0x30,0x00,0x30,0x30,0x00, // 0xf6
+  0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00, // 0xf7
+  0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00, // 0xf8
+  0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00, // 0xf9
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, // 0xfa
+  0x18,0x18,0x78,0x38,0x00,0x00,0x00,0x7e, // 0xfb
+  0x3c,0x38,0x30,0x00,0x00,0x30,0x38,0x3c, // 0xfc //play
+  0x66,0x66,0x66,0x00,0x00,0x66,0x66,0x66, // 0xfd //buf
+  0x7e,0x7e,0x7e,0x00,0x00,0x7e,0x7e,0x7e, // 0xfe //stop
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  // 0xff
+};
diff -r 000000000000 -r 61dcd2c0299a fonts/font_8x8.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fonts/font_8x8.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,17 @@
+#ifndef _FONT_8X8_H_
+#define _FONT_8X8_H_
+
+
+//----- DEFINES -----
+#define FONT8x8_START                    0x20
+#define FONT8x8_END                      0xFF
+#define FONT8x8_WIDTH                    8
+#define FONT8x8_HEIGHT                   8
+#define FONT8x8_BYTES                    1
+
+
+//----- GLOBALS -----
+extern const unsigned char font_8x8[];
+
+
+#endif //_FONT_8X8_H_
diff -r 000000000000 -r 61dcd2c0299a stringman.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stringman.h	Fri Jun 15 18:37:00 2012 +0000
@@ -0,0 +1,37 @@
+void itostr(char* buffer, int v) {
+   char temp[3];
+  
+   //temp="";
+   
+    if (v>99999) {
+
+        snprintf(buffer,4,"%3i",v);
+    } else
+
+        if (v>9999) {
+            snprintf(buffer,4,"%3i",v);
+             snprintf(temp,2,"k");
+             buffer[3] = temp[1];
+            
+        } else
+
+            if (v>999) {
+                
+                snprintf(buffer,4,"%3i",v);
+                buffer[3] = buffer[2];
+                snprintf(temp,2,"k");
+                buffer[2] = temp[1];
+            } else
+                if (v>99) {
+                    snprintf(buffer,4,"%3i",v);
+
+                } else
+                    if (v>9) {
+                        snprintf(buffer,4,"%3i",v);
+
+                    } else {
+                        snprintf(buffer,4,"%3i",v);
+
+                    }
+
+}
\ No newline at end of file