For Nokia Mobile LCD

Dependents:   PE_08-08_MobileLCD

Files at this revision

API Documentation at this revision

Comitter:
robt
Date:
Fri Sep 28 15:06:16 2012 +0000
Commit message:
[mbed] converted /mbed_08c_MobileLCD/MobileLCD

Changed in this revision

MobileLCD.cpp Show annotated file Show diff for this revision Revisions of this file
MobileLCD.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 39daa30e0eb3 MobileLCD.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MobileLCD.cpp	Fri Sep 28 15:06:16 2012 +0000
@@ -0,0 +1,320 @@
+/* mbed Library - MobileLCD
+ * Copyright (c) 2007, sford
+ */
+ 
+#include "MobileLCD.h"
+
+#include "mbed.h"
+
+using namespace mbed;
+
+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
+
+void MobileLCD::command(int value) {
+    _spi.write(value & 0xFF);
+}
+
+void MobileLCD::data(int value) {
+    _spi.write(value | 0x100);
+}
+
+void MobileLCD::_select() {
+    _cs = 0;    
+}
+    
+void MobileLCD::_deselect() {
+    _cs = 1;
+}
+
+int MobileLCD::width() { 
+    return _width; 
+}
+
+int MobileLCD::height() { 
+    return _height; 
+}
+
+int MobileLCD::columns() { 
+    return _columns; 
+}
+
+int MobileLCD::rows() { 
+    return _rows; 
+}
+
+void MobileLCD::foreground(int v) {
+    _foreground = v;
+}
+
+void MobileLCD::background(int v) {
+    _background = v;
+}
+
+void MobileLCD::locate(int column, int row) {
+    _row = row;
+    _column = column;
+}
+    
+void MobileLCD::newline() {
+    _column = 0;
+    _row++;
+    if(_row >= _rows) {
+        _row = 0;
+    }
+}
+
+/*************************************************************************/
+    
+MobileLCD::MobileLCD(PinName mosi, PinName miso, PinName clk, PinName cs, PinName rst) 
+    : _spi(mosi, miso, clk)
+    , _rst(rst)
+    , _cs(cs) {
+
+    _row = 0;
+    _column = 0;
+    _rows = 16;
+    _columns = 16;
+    _width = 130;
+    _height = 130;
+    foreground(0xFFFFFF);
+    background(0x000000);
+    reset();
+}
+    
+void MobileLCD::reset() {
+
+    _cs = 1;
+    _rst = 0;
+    _spi.format(9);
+    _spi.frequency(5000000);
+    
+    wait_ms(1);
+
+    _rst = 1;
+
+    wait_ms(1);
+
+    _select();
+
+    command(0xCA); // display control  
+    data(0x0);
+      data(31);
+     data(0x0);
+     
+    command(0xBB);  // scan
+    data(0x1);
+    
+      command(0xD1); // oscillator on
+      command(0x94); // sleep out
+    command(0x20); // power control
+      data(0x0F); 
+
+      command(0xA7); // invert display
+
+    command(0x81); // Voltage control
+       data(39);      // contrast setting: 0..63
+       data(3);       // resistance ratio
+
+    wait_ms(1);
+
+    command(0xBC); // data control
+    data(0x0); // scan dirs
+      data(0x0); // RGB
+      data(0x2); // grayscale
+
+    command(0xAF);  // turn on the display
+              
+    _deselect();    
+    
+    cls();
+}
+                 
+void MobileLCD::_window(int x, int y, int width, int height) {
+    int x1, x2, y1, y2;
+    x1 = x + 0;
+    y1 = y + 2;
+    x2 = x1 + width - 1;
+    y2 = y1 + height - 1;        
+    command(0x15); // column
+    data(x1);       
+    data(x2); 
+    command(0x75); // page
+      data(y1);            
+      data(y2);
+       command(0x5C); // start write to ram
+}
+
+void MobileLCD::fill(int x, int y, int width, int height, int colour) {
+    _select();
+    _window(x, y, width, height);
+
+    int r4 = (colour >> (16 + 4)) & 0xF;
+    int g4 = (colour >> (8 + 4)) & 0xF;
+    int b4 = (colour >> (0 + 4)) & 0xF;
+    
+    int d1 = (r4 << 4) | g4;
+    int d2 = (b4 << 4) | r4;
+    int d3 = (g4 << 4) | b4;
+    
+    for(int i=0; i<(width*height+1)/2; i++) {
+        data(d1); 
+        data(d2); 
+        data(d3); 
+    }
+     _deselect();        
+} 
+
+void MobileLCD::bitblit(int x, int y, int width, int height, const char* bitstream) {
+    _select();
+    _window(x, y, width, height);
+    for(int i=0; i<height*width/2; i++) {
+    int byte1 = (i*2) / 8;
+    int bit1 = (i*2) % 8;    
+    int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background;
+    int byte2 = (i*2+1) / 8;
+    int bit2 = (i*2+1) % 8;    
+    int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background;
+
+    int r41 = (colour1 >> (16 + 4)) & 0xF;
+    int g41 = (colour1 >> (8 + 4)) & 0xF;
+    int b41 = (colour1 >> (0 + 4)) & 0xF;
+    
+    int r42 = (colour2 >> (16 + 4)) & 0xF;
+    int g42 = (colour2 >> (8 + 4)) & 0xF;
+    int b42 = (colour2 >> (0 + 4)) & 0xF;    
+    int d1 = (r41 << 4) | g41;
+    int d2 = (b41 << 4) | r42;
+    int d3 = (g42 << 4) | b42;                
+        data(d1); 
+        data(d2); 
+        data(d3); 
+    }
+    _deselect();
+}
+
+void MobileLCD::cls() {
+    fill(0, 0, 130, 130, _background);
+    _row = 0;
+    _column = 0;
+}    
+        
+int MobileLCD::_putc(int value) { 
+    int x = _column * 8;  // FIXME: Char sizes
+    int y = _row * 8;
+    bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
+    
+    _column++;
+
+    if(_column >= _columns) {
+        _row++;
+        _column = 0;
+    }
+        
+    if(_row >= _rows) {
+        _row = 0;
+    }            
+
+    return value;
+}
+     
+void MobileLCD::pixel(int x, int y, int colour) {
+    fill(x, y, 1, 1, colour);
+}
+    
\ No newline at end of file
diff -r 000000000000 -r 39daa30e0eb3 MobileLCD.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MobileLCD.h	Fri Sep 28 15:06:16 2012 +0000
@@ -0,0 +1,53 @@
+/* mbed Library - MobileLCD - test for MOD-NOKIA6610 (Epson 15G00)
+ * Copyright (c) 2007/8, sford
+ */
+
+#ifndef MBED_MOBILELCD_H
+#define MBED_MOBILELCD_H
+ 
+#include "mbed.h"
+
+class MobileLCD : public Stream {
+
+public:
+
+    MobileLCD(PinName mosi, PinName miso, PinName clk, PinName cs, PinName rst);
+
+    void foreground(int v);
+    void background(int v);
+    void locate(int column, int row);
+    virtual void reset();
+    void fill(int x, int y, int width, int height, int colour);
+    void cls();
+    int width();
+    int height();
+    int columns();
+    int rows();
+    void pixel(int x, int y, int colour);
+
+protected:
+
+    virtual void _select();
+    virtual void _deselect();
+    virtual void _window(int x, int y, int width, int height);
+     void command(int value);
+     void data(int value);
+     void newline();
+     virtual int _putc(int c);
+     virtual int _getc() { return 0; }
+    SPI _spi;
+    DigitalOut _rst;
+    DigitalOut _cs;    
+    void bitblit(int x, int y, int width, int height, const char* bitstream);
+    void blit(int x, int y, int width, int height, const int* colour);
+    void putp(int v);
+    void window(int x, int y, int width, int height);
+//    void pixel(int x, int y, int colour);
+    int _row, _column, _rows, _columns, _foreground, _background, _width, _height;
+};
+
+
+
+#endif
+    
+