library for Sharp memory LCD (LS027B4DH01)

Dependents:   Sharp_Memory_LCD_Test Sharp_Memory_LCD_Test

Files at this revision

API Documentation at this revision

Comitter:
masato
Date:
Sat May 10 15:32:38 2014 +0000
Child:
1:f8ba3b236d12
Commit message:
working

Changed in this revision

GraphicsDisplay.cpp Show annotated file Show diff for this revision Revisions of this file
GraphicsDisplay.h Show annotated file Show diff for this revision Revisions of this file
Small_7.h Show annotated file Show diff for this revision Revisions of this file
TextDisplay.cpp Show annotated file Show diff for this revision Revisions of this file
TextDisplay.h Show annotated file Show diff for this revision Revisions of this file
sharp_mlcd.cpp Show annotated file Show diff for this revision Revisions of this file
sharp_mlcd.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GraphicsDisplay.cpp	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,176 @@
+/* mbed GraphicsDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+ 
+#include "GraphicsDisplay.h"
+
+const unsigned char FONT8x8[97][8] = {
+0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
+0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
+0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
+0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
+0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
+0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
+0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
+0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
+0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
+0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
+0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
+0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
+0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
+0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
+0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
+0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
+0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
+0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
+0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
+0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
+0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
+0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
+0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
+0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
+0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
+0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
+0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
+0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
+0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
+0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
+0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
+0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
+0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
+0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
+0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
+0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
+0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
+0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
+0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
+0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
+0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
+0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
+0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
+0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
+0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
+0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
+0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
+0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
+0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
+0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
+0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
+0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
+0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
+0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
+0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
+0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
+0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
+0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
+0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
+0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
+0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
+0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
+0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
+0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
+0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
+0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
+0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
+0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
+0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
+0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
+0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
+0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
+0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
+0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
+0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
+0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
+0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
+0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
+0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
+0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
+0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
+0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
+0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
+0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
+0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
+0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
+0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
+0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
+0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
+0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
+0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
+0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
+0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
+0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}; // DEL
+    
+GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) {
+    foreground(0xFFFF);
+    background(0x0000);
+}
+    
+void GraphicsDisplay::character(int column, int row, int value) { 
+    blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
+}
+
+void GraphicsDisplay::window(int x, int y, int w, int h) {
+    // current pixel location
+    _x = x;
+    _y = y;
+    // window settings
+    _x1 = x;
+    _x2 = x + w - 1;
+    _y1 = y;
+    _y2 = y + h - 1;
+}
+    
+void GraphicsDisplay::putp(int colour) {
+    // put pixel at current pixel location
+    pixel(_x, _y, colour);
+    // update pixel location based on window settings
+    _x++;
+    if(_x > _x2) {
+        _x = _x1;
+        _y++;
+        if(_y > _y2) {
+            _y = _y1;
+        }
+    }
+}
+
+void GraphicsDisplay::fill(int x, int y, int w, int h, int colour) { 
+    window(x, y, w, h);
+    for(int i=0; i<w*h; i++) {
+        putp(colour);
+    }
+}
+    
+void GraphicsDisplay::cls() {
+    fill(0, 0, width(), height(), _background);
+}
+    
+void GraphicsDisplay::blit(int x, int y, int w, int h, const int *colour) { 
+    window(x, y, w, h);
+    for(int i=0; i<w*h; i++) {
+        putp(colour[i]);
+    }
+}
+    
+void GraphicsDisplay::blitbit(int x, int y, int w, int h, const char* colour) {
+    window(x, y, w, h);
+    for(int i = 0; i < w*h; i++) {
+        char byte = colour[i >> 3];
+        int offset = i & 0x7;
+        int c = ((byte << offset) & 0x80) ? _foreground : _background;
+        putp(c);
+    }
+}
+    
+int GraphicsDisplay::columns() { 
+    return width() / 8; 
+}
+
+int GraphicsDisplay::rows() { 
+    return height() / 8; 
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GraphicsDisplay.h	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,55 @@
+/* mbed GraphicsDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * A library for providing a common base class for Graphics displays
+ * To port a new display, derive from this class and implement
+ * the constructor (setup the display), pixel (put a pixel
+ * at a location), width and height functions. Everything else
+ * (locate, printf, putc, cls, window, putp, fill, blit, blitbit) 
+ * will come for free. You can also provide a specialised implementation
+ * of window and putp to speed up the results
+ */
+
+#ifndef MBED_GRAPHICSDISPLAY_H
+#define MBED_GRAPHICSDISPLAY_H
+
+#include "TextDisplay.h"
+
+class GraphicsDisplay : public TextDisplay {
+
+public:         
+          
+    GraphicsDisplay(const char* name);
+     
+    virtual void pixel(int x, int y, int colour) = 0;
+    virtual int width() = 0;
+    virtual int height() = 0;
+        
+    virtual void window(int x, int y, int w, int h);
+    virtual void putp(int colour);
+    
+    virtual void cls();
+    virtual void fill(int x, int y, int w, int h, int colour);
+    virtual void blit(int x, int y, int w, int h, const int *colour);    
+    virtual void blitbit(int x, int y, int w, int h, const char* colour);
+    
+    virtual void character(int column, int row, int value);
+    virtual int columns();
+    virtual int rows();
+    
+protected:
+
+    // pixel location
+    short _x;
+    short _y;
+    
+    // window location
+    short _x1;
+    short _x2;
+    short _y1;
+    short _y2;
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Small_7.h	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,104 @@
+#ifndef small_7
+#define small_7
+
+const unsigned char Small_7[] = {
+        19,9,9,2,                                    // Length,horz,vert,byte/vert    
+        0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char  
+        0x02, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
+        0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
+        0x06, 0x00, 0x00, 0x50, 0x00, 0xF8, 0x00, 0x50, 0x00, 0xF8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char #
+        0x06, 0x00, 0x00, 0x8C, 0x00, 0x92, 0x00, 0xFE, 0x01, 0xA2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char $
+        0x07, 0x1E, 0x00, 0x92, 0x00, 0x5E, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x94, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char %
+        0x07, 0x00, 0x00, 0x64, 0x00, 0x9A, 0x00, 0xAA, 0x00, 0xCC, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char &
+        0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
+        0x03, 0x00, 0x00, 0x7C, 0x00, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
+        0x03, 0x00, 0x00, 0x83, 0x01, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
+        0x04, 0x00, 0x00, 0x30, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
+        0x05, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char +
+        0x02, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
+        0x04, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
+        0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
+        0x04, 0x00, 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
+        0x05, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
+        0x05, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
+        0x05, 0x00, 0x00, 0x84, 0x00, 0xC2, 0x00, 0xA2, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
+        0x05, 0x00, 0x00, 0x82, 0x00, 0x92, 0x00, 0x92, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
+        0x05, 0x00, 0x00, 0x38, 0x00, 0x2C, 0x00, 0x22, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
+        0x05, 0x00, 0x00, 0x9E, 0x00, 0x92, 0x00, 0x92, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
+        0x05, 0x00, 0x00, 0x7C, 0x00, 0x92, 0x00, 0x92, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
+        0x05, 0x00, 0x00, 0x02, 0x00, 0xC2, 0x00, 0x32, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
+        0x05, 0x00, 0x00, 0x6C, 0x00, 0x92, 0x00, 0x92, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
+        0x05, 0x00, 0x00, 0x9C, 0x00, 0x92, 0x00, 0x92, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
+        0x02, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
+        0x02, 0x00, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
+        0x05, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char <
+        0x05, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char =
+        0x05, 0x00, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char >
+        0x05, 0x00, 0x00, 0x02, 0x00, 0xB2, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
+        0x09, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x01, 0x72, 0x01, 0x4A, 0x01, 0x4A, 0x01, 0x7A, 0x01, 0x42, 0x00, 0x3C, 0x00,  // Code for char @
+        0x06, 0x00, 0x00, 0xF8, 0x00, 0x24, 0x00, 0x22, 0x00, 0x24, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char A
+        0x06, 0x00, 0x00, 0xFE, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char B
+        0x06, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char C
+        0x06, 0x00, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC6, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char D
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char E
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char F
+        0x06, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0x82, 0x00, 0x92, 0x00, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char G
+        0x06, 0x00, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char H
+        0x02, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char I
+        0x04, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char J
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x2C, 0x00, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char K
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char L
+        0x08, 0x00, 0x00, 0xFE, 0x00, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x06, 0x00, 0xFE, 0x00, 0x00, 0x00,  // Code for char M
+        0x06, 0x00, 0x00, 0xFE, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char N
+        0x06, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char O
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char P
+        0x07, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC2, 0x00, 0xFC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char Q
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x12, 0x00, 0x12, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char R
+        0x05, 0x00, 0x00, 0xCC, 0x00, 0x92, 0x00, 0x92, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char S
+        0x06, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char T
+        0x06, 0x00, 0x00, 0x7E, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char U
+        0x07, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char V
+        0x06, 0x00, 0x00, 0x1E, 0x00, 0xE0, 0x00, 0x3E, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char W
+        0x06, 0x00, 0x00, 0x82, 0x00, 0x64, 0x00, 0x38, 0x00, 0x6C, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char X
+        0x06, 0x00, 0x00, 0x02, 0x00, 0x0C, 0x00, 0xF0, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Y
+        0x06, 0x00, 0x00, 0x82, 0x00, 0xE2, 0x00, 0x92, 0x00, 0x8E, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Z
+        0x03, 0x00, 0x00, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
+        0x04, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char BackSlash
+        0x02, 0x01, 0x01, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
+        0x04, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ^
+        0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char _
+        0x03, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
+        0x05, 0x00, 0x00, 0xE8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char a
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char b
+        0x05, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char c
+        0x05, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char d
+        0x05, 0x00, 0x00, 0x70, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char e
+        0x04, 0x08, 0x00, 0xFE, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
+        0x05, 0x00, 0x00, 0x30, 0x00, 0x48, 0x01, 0x48, 0x01, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char g
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char h
+        0x02, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
+        0x02, 0x00, 0x01, 0xFA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
+        0x05, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x00, 0x50, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char k
+        0x02, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
+        0x06, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char m
+        0x05, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char n
+        0x05, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char o
+        0x05, 0x00, 0x00, 0xF8, 0x01, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char p
+        0x05, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char q
+        0x04, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char r
+        0x04, 0x00, 0x00, 0x98, 0x00, 0xA8, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char s
+        0x04, 0x00, 0x00, 0x08, 0x00, 0xFC, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
+        0x05, 0x00, 0x00, 0x78, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char u
+        0x04, 0x00, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char v
+        0x06, 0x00, 0x00, 0x78, 0x00, 0xC0, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char w
+        0x05, 0x00, 0x00, 0x88, 0x00, 0x70, 0x00, 0x70, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char x
+        0x05, 0x00, 0x00, 0x38, 0x00, 0x40, 0x01, 0x40, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char y
+        0x05, 0x00, 0x00, 0xC8, 0x00, 0xE8, 0x00, 0xB8, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char z
+        0x04, 0x10, 0x00, 0x38, 0x00, 0xEF, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char {
+        0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
+        0x04, 0x01, 0x01, 0xC7, 0x01, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
+        0x05, 0x0C, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ~
+        0x03, 0xFE, 0x01, 0x02, 0x01, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char 
+        };
+        
+#endif        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextDisplay.cpp	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,77 @@
+/* mbed TextDisplay Display Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+ 
+#include "TextDisplay.h"
+
+TextDisplay::TextDisplay(const char *name) : Stream(name){
+    _row = 0;
+    _column = 0;
+    if (name == NULL) {
+        _path = NULL;
+    } else {
+        _path = new char[strlen(name) + 2];
+        sprintf(_path, "/%s", name);
+    }
+}
+    
+int TextDisplay::_putc(int value) {
+    if(value == '\n') {
+        _column = 0;
+        _row++;
+        if(_row >= rows()) {
+            _row = 0;
+        }
+    } else {
+        character(_column, _row, value);
+        _column++;
+        if(_column >= columns()) {
+            _column = 0;
+            _row++;
+            if(_row >= rows()) {
+                _row = 0;
+            }
+        }
+    }
+    return value;
+}
+
+// crude cls implementation, should generally be overwritten in derived class
+void TextDisplay::cls() {
+    locate(0, 0);
+    for(int i=0; i<columns()*rows(); i++) {
+        putc(' ');
+    }
+}
+
+void TextDisplay::locate(int column, int row) {
+    _column = column;
+    _row = row;
+}
+
+int TextDisplay::_getc() {
+    return -1;
+}
+        
+void TextDisplay::foreground(uint16_t colour) {
+    _foreground = colour;
+}
+
+void TextDisplay::background(uint16_t colour) {
+    _background = colour;
+}
+
+bool TextDisplay::claim (FILE *stream) {
+    if ( _path == NULL) {
+        fprintf(stderr, "claim requires a name to be given in the instantioator of the TextDisplay instance!\r\n");
+        return false;
+    }
+    if (freopen(_path, "w", stream) == NULL) {
+        // Failed, should not happen
+        return false;
+    }
+    // make sure we use line buffering
+    setvbuf(stdout, NULL, _IOLBF, columns());
+    return true;
+} 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextDisplay.h	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,80 @@
+/* mbed TextDisplay Library Base Class
+ * Copyright (c) 2007-2009 sford
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * A common base class for Text displays
+ * To port a new display, derive from this class and implement
+ * the constructor (setup the display), character (put a character
+ * at a location), rows and columns (number of rows/cols) functions.
+ * Everything else (locate, printf, putc, cls) will come for free
+ *
+ * The model is the display will wrap at the right and bottom, so you can
+ * keep writing and will always get valid characters. The location is 
+ * maintained internally to the class to make this easy
+ */
+
+#ifndef MBED_TEXTDISPLAY_H
+#define MBED_TEXTDISPLAY_H
+
+#include "mbed.h"
+
+class TextDisplay : public Stream {
+public:
+
+  // functions needing implementation in derived implementation class
+  /** Create a TextDisplay interface
+     *
+     * @param name The name used in the path to access the strean through the filesystem
+     */
+    TextDisplay(const char *name = NULL);
+
+    /** output a character at the given position
+     *
+     * @param column column where charater must be written
+     * @param  row where character must be written
+     * @param c the character to be written to the TextDisplay
+     */
+    virtual void character(int column, int row, int c) = 0;
+
+    /** return number if rows on TextDisplay
+     * @result number of rows
+     */
+    virtual int rows() = 0;
+
+    /** return number if columns on TextDisplay
+    * @result number of rows
+    */
+    virtual int columns() = 0;
+    
+    // functions that come for free, but can be overwritten
+
+    /** redirect output from a stream (stoud, sterr) to  display
+    * @param stream stream that shall be redirected to the TextDisplay
+    */
+    virtual bool claim (FILE *stream);
+
+    /** clear screen
+    */
+    virtual void cls();
+    virtual void locate(int column, int row);
+    virtual void foreground(uint16_t colour);
+    virtual void background(uint16_t colour);
+    // putc (from Stream)
+    // printf (from Stream)
+    
+protected:
+
+    virtual int _putc(int value);
+    virtual int _getc();
+
+    // character location
+    uint16_t _column;
+    uint16_t _row;
+
+    // colours
+    uint16_t _foreground;
+    uint16_t _background;
+    char *_path;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sharp_mlcd.cpp	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,497 @@
+/*
+ * mbed library for the Sharp memory LCD LS027BDH01 / LS013B4DN04
+ * derived from C12832_lcd
+ * Copyright (c) 2014 Masato YAMANISHI
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+
+/* mbed library for the mbed Lab Board  128*32 pixel LCD
+ * use C12832 controller
+ * Copyright (c) 2012 Peter Drescher - DC2PD
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * 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.
+ */
+
+// 13.10.12    initial design
+// 25.10.12    add autorefresh of screen
+// 25.10.12    add standart font
+// 20.12.12    add bitmap graphics
+
+// optional defines :
+// #define debug_lcd  1
+
+// #include "mbed.h"
+#include "sharp_mlcd.h"
+#include "stdio.h"
+#include "Small_7.h"
+
+sharp_mlcd::sharp_mlcd(const char* name)
+  : _spi(D11,NC,D13),_EXTCOM(D9),_DISP(D8),_CS(D10), GraphicsDisplay(name) // for nucleo L152RE or other
+{
+  draw_mode = NORMAL;
+  char_x = 0;
+  lcd_reset();
+}
+
+int sharp_mlcd::width()
+{
+  return WIDTH;
+}
+
+int sharp_mlcd::height()
+{
+  return HEIGHT; // 32;
+}
+
+// write command to lcd controller
+
+
+// reset and init the lcd controller
+
+void sharp_mlcd::lcd_reset()
+{
+  _CS = 0;
+  _spi.format(8, 0);                 // 8 bit spi mode 0
+  _spi.frequency(2000000);          // 2 Mhz SPI clock
+  _DISP = 1;
+  flip = 0;
+  // timer.attach(attime, 0.5); // 1KHz
+
+  _CS = 1;
+  wait_us(4);
+  _spi.write(0x20); // 0x20:clear 0x00:run
+  _spi.write(0); // dummy
+  wait_us(2);
+  _CS = 0;
+
+  // clear and update LCD
+  cls();
+  // memset(buffer,0xff,BUFFER_SIZE);  // clear display buffer
+  // copy_to_lcd();
+  auto_up = 1;              // switch on auto update
+  // dont do this by default. Make the user call
+  //claim(stdout);           // redirekt printf to lcd
+  locate(0,0);
+  set_font((unsigned char*)Small_7);  // standart font
+}
+
+// set one pixel in buffer
+
+void sharp_mlcd::pixel(int x, int y, int color)
+{
+  // first check parameter
+  if(x > WIDTH || y > HEIGHT || x < 0 || y < 0) return;
+
+  if(draw_mode == NORMAL) {
+    if(color == 0)
+      buffer[x/8 + (y*WIDTH/8)] &= ~(1 << (7-(x%8)));  // set pixel
+    else
+      buffer[x/8 + (y*WIDTH/8)] |= (1 << (7-(x%8)));   // erase pixel
+  } else { // XOR mode
+    if(color == 1)
+      buffer[x/8 + (y*WIDTH/8)] ^= (1 << (7-(x%8)));   // xor pixel
+  }
+}
+
+// update lcd
+
+void sharp_mlcd::attime() {
+  flip = !flip;
+  _EXTCOM = flip;
+}
+
+unsigned char sharp_mlcd::bit_reverse(unsigned char c) {
+  unsigned char u=0; // c = TESTVALUE;
+  int i;
+
+  for (i=0 ; i<4 ; i++)
+    u |= ((c & (1 << i)) << (7-2*i)) | ((c & (1 << 7-i)) >> (7-2*i));
+  return u;
+}
+
+void sharp_mlcd::copy_to_lcd(void)
+{
+  const int start = 0;
+  int x, y;
+  unsigned char *p = (unsigned char*)buffer; // image;
+    
+  _CS = 1;
+  wait_us(4); // min 3us
+  //
+  for (y = 0; y < HEIGHT; y++) {
+    _spi.write(0x80); // update mode (multi line)
+    _spi.write(bit_reverse((y + 1 + start) % HEIGHT)); // set gate line address
+    for (x = 0; x < (WIDTH / 8); x++) {
+      _spi.write(*p++); // (((y / 8) + x + mode) % 2)? 0xff: 0);
+    }
+  }
+  //
+  wait_us(2); // min 1us
+  _CS = 0;
+}
+
+void sharp_mlcd::cls(void)
+{
+  memset(buffer,0x00,BUFFER_SIZE);  // clear display buffer
+  copy_to_lcd();
+}
+
+
+void sharp_mlcd::line(int x0, int y0, int x1, int y1, int color)
+{
+  int   dx = 0, dy = 0;
+  int   dx_sym = 0, dy_sym = 0;
+  int   dx_x2 = 0, dy_x2 = 0;
+  int   di = 0;
+
+  dx = x1-x0;
+  dy = y1-y0;
+
+  //  if (dx == 0) {        /* vertical line */
+  //      if (y1 > y0) vline(x0,y0,y1,color);
+  //      else vline(x0,y1,y0,color);
+  //      return;
+  //  }
+
+  if (dx > 0) {
+    dx_sym = 1;
+  } else {
+    dx_sym = -1;
+  }
+  //  if (dy == 0) {        /* horizontal line */
+  //      if (x1 > x0) hline(x0,x1,y0,color);
+  //      else  hline(x1,x0,y0,color);
+  //      return;
+  //  }
+
+  if (dy > 0) {
+    dy_sym = 1;
+  } else {
+    dy_sym = -1;
+  }
+
+  dx = dx_sym*dx;
+  dy = dy_sym*dy;
+
+  dx_x2 = dx*2;
+  dy_x2 = dy*2;
+
+  if (dx >= dy) {
+    di = dy_x2 - dx;
+    while (x0 != x1) {
+
+      pixel(x0, y0, color);
+      x0 += dx_sym;
+      if (di<0) {
+        di += dy_x2;
+      } else {
+        di += dy_x2 - dx_x2;
+        y0 += dy_sym;
+      }
+    }
+    pixel(x0, y0, color);
+  } else {
+    di = dx_x2 - dy;
+    while (y0 != y1) {
+      pixel(x0, y0, color);
+      y0 += dy_sym;
+      if (di < 0) {
+        di += dx_x2;
+      } else {
+        di += dx_x2 - dy_x2;
+        x0 += dx_sym;
+      }
+    }
+    pixel(x0, y0, color);
+  }
+  if(auto_up) copy_to_lcd();
+}
+
+void sharp_mlcd::rect(int x0, int y0, int x1, int y1, int color)
+{
+
+  if (x1 > x0) line(x0,y0,x1,y0,color);
+  else  line(x1,y0,x0,y0,color);
+
+  if (y1 > y0) line(x0,y0,x0,y1,color);
+  else line(x0,y1,x0,y0,color);
+
+  if (x1 > x0) line(x0,y1,x1,y1,color);
+  else  line(x1,y1,x0,y1,color);
+
+  if (y1 > y0) line(x1,y0,x1,y1,color);
+  else line(x1,y1,x1,y0,color);
+
+  if(auto_up) copy_to_lcd();
+}
+
+void sharp_mlcd::fillrect(int x0, int y0, int x1, int y1, int color)
+{
+  int l,c,i;
+  if(x0 > x1) {
+    i = x0;
+    x0 = x1;
+    x1 = i;
+  }
+
+  if(y0 > y1) {
+    i = y0;
+    y0 = y1;
+    y1 = i;
+  }
+
+  for(l = x0; l<= x1; l ++) {
+    for(c = y0; c<= y1; c++) {
+      pixel(l,c,color);
+    }
+  }
+  if(auto_up) copy_to_lcd();
+}
+
+
+
+void sharp_mlcd::circle(int x0, int y0, int r, int color)
+{
+
+  int draw_x0, draw_y0;
+  int draw_x1, draw_y1;
+  int draw_x2, draw_y2;
+  int draw_x3, draw_y3;
+  int draw_x4, draw_y4;
+  int draw_x5, draw_y5;
+  int draw_x6, draw_y6;
+  int draw_x7, draw_y7;
+  int xx, yy;
+  int di;
+  //WindowMax();
+  if (r == 0) {       /* no radius */
+    return;
+  }
+
+  draw_x0 = draw_x1 = x0;
+  draw_y0 = draw_y1 = y0 + r;
+  if (draw_y0 < height()) {
+    pixel(draw_x0, draw_y0, color);     /* 90 degree */
+  }
+
+  draw_x2 = draw_x3 = x0;
+  draw_y2 = draw_y3 = y0 - r;
+  if (draw_y2 >= 0) {
+    pixel(draw_x2, draw_y2, color);    /* 270 degree */
+  }
+
+  draw_x4 = draw_x6 = x0 + r;
+  draw_y4 = draw_y6 = y0;
+  if (draw_x4 < width()) {
+    pixel(draw_x4, draw_y4, color);     /* 0 degree */
+  }
+
+  draw_x5 = draw_x7 = x0 - r;
+  draw_y5 = draw_y7 = y0;
+  if (draw_x5>=0) {
+    pixel(draw_x5, draw_y5, color);     /* 180 degree */
+  }
+
+  if (r == 1) {
+    return;
+  }
+
+  di = 3 - 2*r;
+  xx = 0;
+  yy = r;
+  while (xx < yy) {
+
+    if (di < 0) {
+      di += 4*xx + 6;
+    } else {
+      di += 4*(xx - yy) + 10;
+      yy--;
+      draw_y0--;
+      draw_y1--;
+      draw_y2++;
+      draw_y3++;
+      draw_x4--;
+      draw_x5++;
+      draw_x6--;
+      draw_x7++;
+    }
+    xx++;
+    draw_x0++;
+    draw_x1--;
+    draw_x2++;
+    draw_x3--;
+    draw_y4++;
+    draw_y5++;
+    draw_y6--;
+    draw_y7--;
+
+    if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
+      pixel(draw_x0, draw_y0, color);
+    }
+
+    if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
+      pixel(draw_x1, draw_y1, color);
+    }
+
+    if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
+      pixel(draw_x2, draw_y2, color);
+    }
+
+    if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
+      pixel(draw_x3, draw_y3, color);
+    }
+
+    if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
+      pixel(draw_x4, draw_y4, color);
+    }
+
+    if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
+      pixel(draw_x5, draw_y5, color);
+    }
+    if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
+      pixel(draw_x6, draw_y6, color);
+    }
+    if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
+      pixel(draw_x7, draw_y7, color);
+    }
+  }
+  if(auto_up) copy_to_lcd();
+}
+
+void sharp_mlcd::fillcircle(int x, int y, int r, int color)
+{
+  int i,up;
+  up = auto_up;
+  auto_up = 0;   // off
+  for (i = 0; i <= r; i++)
+    circle(x,y,i,color);
+  auto_up = up;
+  if(auto_up) copy_to_lcd();
+}
+
+void sharp_mlcd::setmode(int mode)
+{
+  draw_mode = mode;
+}
+
+void sharp_mlcd::locate(int x, int y)
+{
+  char_x = x;
+  char_y = y;
+}
+
+
+
+int sharp_mlcd::columns()
+{
+  return width() / font[1];
+}
+
+
+
+int sharp_mlcd::rows()
+{
+  return height() / font[2];
+}
+
+
+
+int sharp_mlcd::_putc(int value)
+{
+  if (value == '\n') {    // new line
+    char_x = 0;
+    char_y = char_y + font[2];
+    if (char_y >= height() - font[2]) {
+      char_y = 0;
+    }
+  } else {
+    character(char_x, char_y, value);
+    if(auto_up) copy_to_lcd();
+  }
+  return value;
+}
+
+void sharp_mlcd::character(int x, int y, int c)
+{
+  unsigned int hor,vert,offset,bpl,j,i,b;
+  unsigned char* zeichen;
+  unsigned char z,w;
+
+  if ((c < 31) || (c > 127)) return;   // test char range
+
+  // read font parameter from start of array
+  offset = font[0];                    // bytes / char
+  hor = font[1];                       // get hor size of font
+  vert = font[2];                      // get vert size of font
+  bpl = font[3];                       // bytes per line
+
+  if (char_x + hor > width()) {
+    char_x = 0;
+    char_y = char_y + vert;
+    if (char_y >= height() - font[2]) {
+      char_y = 0;
+    }
+  }
+
+  zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
+  w = zeichen[0];                          // width of actual char
+  // construct the char into the buffer
+  for (j=0; j<vert; j++) {  //  vert line
+    for (i=0; i<hor; i++) {   //  horz line
+      z =  zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
+      b = 1 << (j & 0x07);
+      if (( z & b ) == 0x00) {
+        pixel(x+i,y+j,0);
+      } else {
+        pixel(x+i,y+j,1);
+      }
+
+    }
+  }
+
+  char_x += w;
+}
+
+void sharp_mlcd::set_font(unsigned char* f)
+{
+  font = f;
+}
+
+void sharp_mlcd::set_auto_up(unsigned int up)
+{
+  if(up ) auto_up = 1;
+  else auto_up = 0;
+}
+
+unsigned int sharp_mlcd::get_auto_up(void)
+{
+  return (auto_up);
+}
+
+void sharp_mlcd::print_bm(Bitmap bm, int x, int y)
+{
+  int h,v,b;
+  char d;
+
+  for(v=0; v < bm.ySize; v++) {   // lines
+    for(h=0; h < bm.xSize; h++) { // pixel
+      if(h + x > WIDTH-1) break;
+      if(v + y > HEIGHT-1) break;
+      d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
+      b = 0x80 >> (h & 0x07);
+      if((d & b) == 0) {
+        pixel(x+h,y+v,0);
+      } else {
+        pixel(x+h,y+v,1);
+      }
+    }
+  }
+}
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sharp_mlcd.h	Sat May 10 15:32:38 2014 +0000
@@ -0,0 +1,291 @@
+/*
+ * mbed library for the Sharp memory LCD LS027BDH01 / LS013B4DN04
+ * derived from C12832_lcd
+ * Copyright (c) 2014 Masato YAMANISHI
+ * Released under the MIT License: http://mbed.org/license/mit
+ */
+
+/* mbed library for the mbed Lab Board  128*32 pixel LCD
+ * use C12832 controller
+ * Copyright (c) 2012 Peter Drescher - DC2PD
+ * Released under the MIT License: http://mbed.org/license/mit
+ *
+ * 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 SHARP_MLCD_H
+#define SHARP_MLCD_H
+
+#include "mbed.h"
+#include "GraphicsDisplay.h"
+
+/** optional Defines :
+ * #define debug_lcd  1  enable infos to PC_USB
+ */
+  
+#define BPP    1       // Bits per pixel
+#define WIDTH  400 // 96
+#define HEIGHT 240 // 96
+#define PAGES (HEIGHT/8) // 6
+#define BUFFER_SIZE (WIDTH*HEIGHT/8)
+
+
+/** Draw mode
+ * NORMAl
+ * XOR set pixel by xor the screen
+ */
+enum {NORMAL,XOR};
+
+/** Bitmap
+ */
+struct Bitmap{
+  int xSize;
+  int ySize;
+  int Byte_in_Line;
+  char* data;
+};
+
+class sharp_mlcd : public GraphicsDisplay
+{
+ public:
+  /** Create a aqm1248a object connected to SPI1
+   *
+   */
+
+  sharp_mlcd(const char* name = "LCD");
+
+  /** Get the width of the screen in pixel
+   *
+   * @param
+   * @returns width of screen in pixel
+   *
+   */
+  virtual int width();
+
+  /** Get the height of the screen in pixel
+   *
+   * @returns height of screen in pixel
+   *
+   */
+  virtual int height();
+
+  /** Draw a pixel at x,y black or white
+   *
+   * @param x horizontal position
+   * @param y vertical position
+   * @param colour ,1 set pixel ,0 erase pixel
+   */
+  virtual void pixel(int x, int y,int colour);
+
+  /** draw a circle
+   *
+   * @param x0,y0 center
+   * @param r radius
+   * @param colour ,1 set pixel ,0 erase pixel
+   *
+   */
+  void circle(int x, int y, int r, int colour);
+
+  /** draw a filled circle
+   *
+   * @param x0,y0 center
+   * @param r radius
+   * @param color ,1 set pixel ,0 erase pixel
+   *
+   * use circle with different radius,
+   * can miss some pixel
+   */
+  void fillcircle(int x, int y, int r, int colour);
+
+  /** draw a 1 pixel line
+   *
+   * @param x0,y0 start point
+   * @param x1,y1 stop point
+   * @param color ,1 set pixel ,0 erase pixel
+   *
+   */
+  void line(int x0, int y0, int x1, int y1, int colour);
+
+  /** draw a rect
+   *
+   * @param x0,y0 top left corner
+   * @param x1,y1 down right corner
+   * @param color 1 set pixel ,0 erase pixel
+   *                                                   *
+   */
+  void rect(int x0, int y0, int x1, int y1, int colour);
+
+  /** draw a filled rect
+   *
+   * @param x0,y0 top left corner
+   * @param x1,y1 down right corner
+   * @param color 1 set pixel ,0 erase pixel
+   *
+   */
+  void fillrect(int x0, int y0, int x1, int y1, int colour);
+
+  /** copy display buffer to lcd
+   *
+   */
+
+  void copy_to_lcd(void);
+
+  /** clear the screen
+   *
+   */
+  virtual void cls(void);
+
+  /** set the drawing mode
+   *
+   * @param mode NORMAl or XOR
+   */
+
+  void setmode(int mode);
+
+  virtual int columns(void);
+
+  /** calculate the max number of columns
+   *
+   * @returns max column
+   * depends on actual font size
+   *
+   */
+  virtual int rows(void);
+
+  /** put a char on the screen
+   *
+   * @param value char to print
+   * @returns printed char
+   *
+   */
+  virtual int _putc(int value);
+
+  /** draw a character on given position out of the active font to the LCD
+   *
+   * @param x x-position of char (top left)
+   * @param y y-position
+   * @param c char to print
+   *
+   */
+  virtual void character(int x, int y, int c);
+
+  /** setup cursor position
+   *
+   * @param x x-position (top left)
+   * @param y y-position
+   */
+  virtual void locate(int x, int y);
+    
+  /** setup auto update of screen 
+   *
+   * @param up 1 = on , 0 = off
+   * if switched off the program has to call copy_to_lcd() 
+   * to update screen from framebuffer
+   */
+  void set_auto_up(unsigned int up);
+
+  /** get status of the auto update function
+   *
+   *  @returns if auto update is on
+   */
+  unsigned int get_auto_up(void);
+
+  /** Vars     */
+  SPI _spi;
+  // DigitalOut _reset;
+  // DigitalOut _A0;
+  DigitalOut _EXTCOM;
+  DigitalOut _DISP;
+  DigitalOut _CS;
+  unsigned char* font;
+  unsigned int draw_mode;
+
+  // Ticker timer;
+
+  /** select the font to use
+   *
+   * @param f pointer to font array
+   *
+   *   font array can created with GLCD Font Creator from http://www.mikroe.com
+   *   you have to add 4 parameter at the beginning of the font array to use:
+   *   - the number of byte / char
+   *   - the vertial size in pixel
+   *   - the horizontal size in pixel
+   *   - the number of byte per vertical line
+   *   you also have to change the array to char[]
+   *
+   */
+  void set_font(unsigned char* f);
+    
+  /** print bitmap to buffer
+   *
+   * @param bm Bitmap in flash
+   * @param x  x start
+   * @param y  y start 
+   *
+   */
+
+  void print_bm(Bitmap bm, int x, int y);
+  void attime();
+
+ protected:
+
+  /** draw a horizontal line
+   *
+   * @param x0 horizontal start
+   * @param x1 horizontal stop
+   * @param y vertical position
+   * @param ,1 set pixel ,0 erase pixel
+   *
+   */
+  void hline(int x0, int x1, int y, int colour);
+
+  /** draw a vertical line
+   *
+   * @param x horizontal position
+   * @param y0 vertical start
+   * @param y1 vertical stop
+   * @param ,1 set pixel ,0 erase pixel
+   */
+  void vline(int y0, int y1, int x, int colour);
+
+  /** Init the C12832 LCD controller
+   *
+   */
+  void lcd_reset();
+
+  /** Write data to the LCD controller
+   *
+   * @param dat data written to LCD controller
+   *
+   */
+  void wr_dat(unsigned char value);
+
+  /** Write a command the LCD controller
+   *
+   * @param cmd: command to be written
+   *
+   */
+  void wr_cmd(unsigned char value);
+
+  void wr_cnt(unsigned char cmd);
+
+  // unsigned int orientation;
+  unsigned int char_x;
+  unsigned int char_y;
+  unsigned char buffer[BUFFER_SIZE];
+  unsigned int contrast;
+  unsigned int auto_up;
+
+  unsigned int flip;
+
+  unsigned char bit_reverse(unsigned char c);
+};
+
+#endif
\ No newline at end of file