/* mbed Nokia LCD Library * Atsu */ #include "delay.h" #include "SpiLcd.h" #include #define LCD_ROWS 15 #define LCD_COLS 16 #define LCD_WIDTH 128 #define LCD_HEIGHT 160 #define LCD_FREQUENCY 20000000 //MARY Pin Assign //#define LCD_VCC_ON C21 //#define LCD_CS C33 //#define LCD_RES C31 //LPCXpresso pin Assign (MARMEX-SLOT1) //#define LCD_VCC_ON P0_7 //#define LCD_CS P0_2 //#define LCD_RES P0_1 SPILCD slcd; SPILCD::SPILCD() { this->LCD_VCC_ON = C21; this->LCD_CS = C33; this->LCD_RES = C31; this->device = ST7735; port = marySSP0; _row = 0; _column = 0; _foreground = 0x00FFFFFF; _background = 0x00000000; } SPILCD::~SPILCD() { } void SPILCD::reset(SSP_PORT port) { this->port = port; if(port==LPCXSSP0) //LPCXpresso 1114 + MAPLE { this->LCD_VCC_ON = P0_7; this->LCD_CS = P0_2; this->LCD_RES = P0_1; } pinMode(LCD_VCC_ON,OUTPUT); pinMode(LCD_RES,OUTPUT); pinMode(LCD_CS,OUTPUT); digitalWrite(LCD_RES,HIGH); digitalWrite(LCD_VCC_ON,LOW); reset(); return; } void SPILCD::reset() { command(0x11);//Sleep out delay(120); //ST7735R Frame Rate command(0xB1); data(0x01); data(0x2C); data(0x2D); command(0xB2); data(0x01); data(0x2C); data(0x2D); command(0xB3); data(0x01); data(0x2C); data(0x2D); data(0x01); data(0x2C); data(0x2D); //------------------------------------End ST7735R Frame Rate-----------------------------------------// command(0xB4);//Column inversion data(0x07); //------------------------------------ST7735R Power Sequence-----------------------------------------// command(0xC0); data(0xA2); data(0x02); data(0x84); command(0xC1); data(0xC5); command(0xC2); data(0x0A); data(0x00); command(0xC3); data(0x8A); data(0x2A); command(0xC4); data(0x8A); data(0xEE); //---------------------------------End ST7735R Power Sequence-------------------------------------// command(0xC5);//VCOM data(0x0E); command(0x36);//MX, MY, RGB mode data(0xC8); //------------------------------------ST7735R Gamma Sequence-----------------------------------------// command(0xe0); data(0x02); data(0x1c); data(0x07); data(0x12); data(0x37); data(0x32); data(0x29); data(0x2d); data(0x29); data(0x25); data(0x2b); data(0x39); data(0x00); data(0x01); data(0x03); data(0x10); command(0xe1); data(0x03); data(0x1d); data(0x07); data(0x06); data(0x2e); data(0x2c); data(0x29); data(0x2d); data(0x2e); data(0x2e); data(0x37); data(0x3f); data(0x00); data(0x00); data(0x02); data(0x10); command(0x2A); data(0x00); data(0x02); data(0x00); data(0x81); command(0x2B); data(0x00); data(0x01); data(0x00); data(0xA0); //------------------------------------End ST7735R Gamma Sequence-----------------------------------------// command(0x3A); data(0x05); //command(0x3A);//65k mode //data(0x05); command(0x29);//Display on } void SPILCD::command(int value) { digitalWrite(LCD_CS, LOW); digitalWrite(LCD_RES, LOW); SPI.transfer(value & 0xff); digitalWrite(LCD_CS,HIGH); } void SPILCD::data(int value) { digitalWrite(LCD_CS,LOW); digitalWrite(LCD_RES,HIGH); SPI.transfer(value & 0xff); digitalWrite(LCD_CS, HIGH); } void SPILCD::_window( int x, int y, int width, int height ) { int x1 = x + 0; int y1 = y + 0; int x2 = x1 + width - 1; int y2 = y1 + height - 1; // TODO: fix this frame-Command new // command( SET_COLUMN_ADDRESS ); // data( x1 ); // data( x2 ); // command( SET_ROW_ADDRESS ); // data( y1 ); // data( y2 ); // command( WRITE_RAM_COMMAND ); } void SPILCD::WindowReset(void) { command( SET_COLUMN_ADDRESS ); data( 0 ); data( 127 ); command( SET_ROW_ADDRESS ); data( 0 ); data( 127 ); command( WRITE_RAM_COMMAND ); } 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 SPILCD::locate(int column, int row) { _column = column; _row = row; } void SPILCD::newline() { _column = 0; _row++; if (_row >= rows() ) { _row = 0; } } void SPILCD::_putp( int colour ) { /*int cnv = 0; cnv = (colour >> 8) & 0xf800; cnv |= (colour >> 5) & 0x07e0; cnv |= (colour >> 3) & 0x001f; data( cnv >> 8); data( cnv ); */ unsigned long data1, data2; data1 = ((colour >> 8) & 0xff) | 0x100; data2 = (colour & 0x0ff) | 0x100; data(data1); data(data2); } int SPILCD::_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 >= SPILCD_COLS) { _row++; _column = 0; } if (_row >= SPILCD_ROWS) { _row = 0; } return value; } void SPILCD::cls( void ) { fill( 0, 0, SPILCD_WIDTH , SPILCD_HEIGHT, _background ); _row = 0; _column = 0; } void SPILCD::window(int x, int y, int width, int height) { // digitalWrite( LCD_CS, LOW ); _window(x, y, width, height); //digitalWrite( LCD_CS, HIGH ); } void SPILCD::putp(int colour) { //digitalWrite( LCD_CS, LOW ); _putp(colour); //digitalWrite( LCD_CS, HIGH ); } void SPILCD::pixel(int x, int y, int colour) { //digitalWrite( LCD_CS, LOW ); _window(x, y, 1, 1); _putp(colour); //digitalWrite( LCD_CS, HIGH ); } void SPILCD::fill( int x, int y, int width, int height, int colour ) { digitalWrite( LCD_CS, LOW ); _window( x, y, width, height ); for (int i = 0; i < width * height; i++ ) { _putp( colour ); } _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); digitalWrite( LCD_CS, HIGH ); } void SPILCD::blit( int x, int y, int width, int height, const int* colour ) { digitalWrite( LCD_CS, LOW ); _window( x, y, width, height ); for (int i = 0; i < width * height; i++ ) { _putp( colour[i] ); } _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); digitalWrite( LCD_CS, HIGH ); } void SPILCD::bitblit( int x, int y, int width, int height, const char* bitstream ) { digitalWrite( LCD_CS, LOW ); _window( x, y, width, height ); for (int i = 0; i < height * width; i++ ) { int byte = i / 8; int bit = i % 8; int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; _putp( colour ); } _window( 0, 0, _width, _height ); digitalWrite( LCD_CS, HIGH ); } void SPILCD::foreground(int c) { _foreground = c; return; } void SPILCD::background(int c) { _background = c; return; } int SPILCD::width() { return SPILCD_WIDTH; } int SPILCD::height() { return SPILCD_HEIGHT; } int SPILCD::columns() { return SPILCD_COLS; } int SPILCD::rows() { return SPILCD_ROWS; }