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

Dependencies:   mbed

Nokia_Epson.cpp

Committer:
TimV
Date:
2010-05-25
Revision:
0:d6d054c554ae

File content as of revision 0:d6d054c554ae:

    /* 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); 
    }