Code for Nokia LCD (text ) based on Epson controller. This is on the new Sparkfun board with the two switches.sx

Dependencies:   mbed

Revision:
0:d6d054c554ae
diff -r 000000000000 -r d6d054c554ae Nokia_Epson.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Nokia_Epson.cpp	Tue May 25 23:02:44 2010 +0000
@@ -0,0 +1,320 @@
+    /* mbed Library - Nokia_Epson 
+     * Copyright (c) 2007, sford 
+     */ 
+      
+    #include "Nokia_Epson.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 Nokia_Epson::command(int value) { 
+        _spi.write(value & 0xFF); 
+    } 
+    
+    void Nokia_Epson::data(int value) { 
+        _spi.write(value | 0x100); 
+    } 
+    
+    void Nokia_Epson::_select() { 
+        _cs = 0;    
+    } 
+        
+    void Nokia_Epson::_deselect() { 
+        _cs = 1; 
+    } 
+    
+    int Nokia_Epson::width() { 
+        return _width; 
+    } 
+    
+    int Nokia_Epson::height() { 
+        return _height; 
+    } 
+    
+    int Nokia_Epson::columns() { 
+        return _columns; 
+    } 
+    
+    int Nokia_Epson::rows() { 
+        return _rows; 
+    } 
+    
+    void Nokia_Epson::foreground(int v) { 
+        _foreground = v; 
+    } 
+    
+    void Nokia_Epson::background(int v) { 
+        _background = v; 
+    } 
+    
+    void Nokia_Epson::locate(int column, int row) { 
+        _row = row; 
+        _column = column; 
+    } 
+        
+    void Nokia_Epson::newline() { 
+        _column = 0; 
+        _row++; 
+        if(_row >= _rows) { 
+            _row = 0; 
+        } 
+    } 
+    
+    /*************************************************************************/ 
+        
+     Nokia_Epson::Nokia_Epson(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 Nokia_Epson::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 Nokia_Epson::_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 Nokia_Epson::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 Nokia_Epson::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 Nokia_Epson::cls() { 
+        fill(0, 0, 130, 130, _background); 
+        _row = 0; 
+        _column = 0; 
+    }    
+            
+    int Nokia_Epson::_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 Nokia_Epson::pixel(int x, int y, int colour) { 
+        fill(x, y, 1, 1, colour); 
+    } 
+