Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Files at this revision

API Documentation at this revision

Comitter:
k4zuki
Date:
Thu Oct 02 18:13:05 2014 +0000
Parent:
13:20ba395cbf2a
Child:
15:704dd6e688ab
Commit message:
many line number related bugfix

Changed in this revision

AkiSpiLcd.cpp Show annotated file Show diff for this revision Revisions of this file
AkiSpiLcd.h Show annotated file Show diff for this revision Revisions of this file
--- a/AkiSpiLcd.cpp	Mon Sep 29 04:47:43 2014 +0000
+++ b/AkiSpiLcd.cpp	Thu Oct 02 18:13:05 2014 +0000
@@ -10,93 +10,65 @@
 AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr)
     :_spi(mosi, miso, sck), _csl(csl), _csr(csr)
 {
-//    Ser23K256 _ram(_spi,csr);
     _csl=0;
     _csr=1;
     _spi.format(8,0);
-    _spi.frequency(10000000);
-    comflag = modeflag = clearflag = 0;
+    _spi.frequency(5000000);
+    _comflag = _modeflag = _clearflag = 0;
 
-    uint8_t data[240];
-    for(int i=0; i<240; i++) {
-        data[i]=(uint8_t)lcd_line[i];
-        /*( ( (i+1) & 0x01 ) << 7 )|
-             ( ( (i+1) & 0x02 ) << 5 )|
-             ( ( (i+1) & 0x04 ) << 3 )|
-             ( ( (i+1) & 0x08 ) << 1 )|
-             ( ( (i+1) & 0x10 ) >> 1 )|
-             ( ( (i+1) & 0x20 ) >> 3 )|
-             ( ( (i+1) & 0x40 ) >> 5 )|
-             ( ( (i+1) & 0x80 ) >> 7 );
-        */
-    }
-    ram_write(RAMLINE_BASE,data,240);
-    uint8_t buffer[4] = {0,0,0,0};
-    ram_write(RAMMODE_BASE,buffer,4);
+//    if(_csr != NULL) {
+//        uint8_t data[240];
+//        data[0]=0;
+//        for(int i=1; i<=240; i++) {
+//            data[i]=(uint8_t)lcd_line[i];
+//        }
+//        ram_write(RAMLINE_BASE,data,240);
+//    }
+//    uint8_t buffer[4] = {0,0,0,0};
+//    ram_write(RAMMODE_BASE,buffer,4);
 
 }
 
 void AkiSpiLcd::cls()
 {
-    modeflag=0;
-    clearflag=1;
+    _modeflag=0;
+    _clearflag=1;
 
     _csl=1;
     wait_us(5);
 
-    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
+    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
     _spi.write(0x00);
 
     wait_us(5);
     _csl=0;
 
-    if(comflag == 0) {
-        comflag = 1;
-    } else {
-        comflag = 0;
-    }
+    cominvert();
 }
 
 void AkiSpiLcd::cls_ram( int screen )
 {
     screen &=1;
     if(screen==SCREEN0) {
-        screen=SCREEN0_BASE;
+        _cls_ram( SCREEN0_BASE );
     } else {
-        screen=SCREEN1_BASE;
+        _cls_ram( SCREEN1_BASE );
     }
-
-    ram_writeStatus(SEQUENTIAL_MODE);
-    ram_prepareCommand(WRITE, screen);
-    for (int i = 0; i < (50*240); i++) {
-        _spi.write(0x00);
-    }
-    ram_deselect();
-    ram_writeStatus(BYTE_MODE);
 }
 
 
 void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data)
 {
-    modeflag=1;
-    clearflag=0;
+    _modeflag=1;
+    _clearflag=0;
 
     _csl=1;
     wait_us(1);
 
-    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
+    if(line ==0)line=1;
+
+    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
     _spi.write((uint8_t)lcd_line[line]);
-    /*
-        _spi.write(
-            ( ( (line+1) & 0x01 ) << 7 )|
-            ( ( (line+1) & 0x02 ) << 5 )|
-            ( ( (line+1) & 0x04 ) << 3 )|
-            ( ( (line+1) & 0x08 ) << 1 )|
-            ( ( (line+1) & 0x10 ) >> 1 )|
-            ( ( (line+1) & 0x20 ) >> 3 )|
-            ( ( (line+1) & 0x40 ) >> 5 )|
-            ( ( (line+1) & 0x80 ) >> 7 )
-        );*/
 
     for(int i=0; i<50; i++) {
         _spi.write( *(data+i) );
@@ -107,35 +79,22 @@
     wait_us(5);
     _csl=0;
 
-    if(comflag == 0) {
-        comflag = 1;
-    } else {
-        comflag = 0;
-    }
+    cominvert();
 }
 
 void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data)
 {
-    modeflag=1;
-    clearflag=0;
+    _modeflag=1;
+    _clearflag=0;
+
+    if(line==0)line=1;
 
     if(length>0) {
         _csl=1;
         wait_us(5);
-        for (int j=0; j<length; j++) {
-            _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
+        for (int j=1; j<=length; j++) {
+            _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
             _spi.write((uint8_t)lcd_line[line]);
-            /*            _spi.write(
-                            ( ( (line+1) & 0x01 ) << 7 )|
-                            ( ( (line+1) & 0x02 ) << 5 )|
-                            ( ( (line+1) & 0x04 ) << 3 )|
-                            ( ( (line+1) & 0x08 ) << 1 )|
-                            ( ( (line+1) & 0x10 ) >> 1 )|
-                            ( ( (line+1) & 0x20 ) >> 3 )|
-                            ( ( (line+1) & 0x40 ) >> 5 )|
-                            ( ( (line+1) & 0x80 ) >> 7 )
-                        );
-            */
             for(int i=0; i<50; i++) {
                 _spi.write( *(data+(50*j+i)) );//hogepic[50*j+i]
             }
@@ -146,44 +105,30 @@
         wait_us(5);
         _csl=0;
     }
-    if(comflag == 0) {
-        comflag = 1;
-    } else {
-        comflag = 0;
-    }
+    cominvert();
 }
 
 void AkiSpiLcd::cominvert()
 {
-    modeflag=0;
-    clearflag=0;
+    _modeflag=0;
+    _clearflag=0;
 
     _csl=1;
 
-    _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
+    _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
     _spi.write(0x00);
     wait_us(5);
     _csl=0;
-    if(comflag == 0) {
-        comflag = 1;
+    if(_comflag == 0) {
+        _comflag = 1;
     } else {
-        comflag = 0;
+        _comflag = 0;
     }
 }
-/*
-void AkiSpiLcd::dispOn(bool disp)
-{
-    if(disp) {
-        _csr=1;
-    } else {
-        _csr=0;
-    }
-}
+
+/** Reads single line (16 + 400 bits = 52 bytes) from a screen
 */
-
-/** Reads single line (400 bits = 50 bytes) from a screen
-*/
-void AkiSpiLcd::ramReadSingle(int line, uint8_t* buffer, int screen)
+void AkiSpiLcd::ramReadSingleLine(int line, uint8_t* buffer, int screen)
 {
     screen &=1;
     if(screen==SCREEN0) {
@@ -191,26 +136,15 @@
     } else {
         screen=SCREEN1_BASE;
     }
-//    uint8_t buffer[50];
-    line*=50;
+
+    line*=RAMLINE_LENGTH;
     int address=screen+line;
-    ram_read(address,buffer,50);
-    /*
-    _csr=0; //select VRAM
-    _spi.write(0x03);
-    _spi.write(address>>8);
-    _spi.write(address&0xff);
-    for(int i=0;i<50;i++){
-        *(buffer+i)=_spi.write(0xaa);
-    }
-    _csr=1;
-    */
-//    return buffer;
+    ram_read(address,buffer,RAMLINE_LENGTH);
 }
 
-/** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
+/** Reads multi lines( (16 + 400) x N bits = 52 x N bytes) from a screen
 */
-void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen)
+void AkiSpiLcd::ramReadMultiLine(int line, int length, uint8_t* buffer, int screen)
 {
     screen &=1;
     if(screen==SCREEN0) {
@@ -218,53 +152,14 @@
     } else {
         screen=SCREEN1_BASE;
     }
-    line*=50;
+    line*=RAMLINE_LENGTH;
     int address=screen+line;
-//    for(int j=0;j<length;j++){
-    ram_read(address,buffer,50*length);
-//    }
-    /*
-    _csr=0; //select VRAM
-    _spi.write(0x03);
-    _spi.write(address>>8);
-    _spi.write(address&0xff);
-    for(int j=0;j<length;j++){
-        for(int i=0;i<50;i++){
-            *(buffer+i)=_spi.write(0xaa);
-        }
-    }
-    _csr=1;
-    */
-//    return buffer;
+    ram_read(address,buffer,RAMLINE_LENGTH*length);
 }
 
 /** Writes single line (400 bits = 50 bytes) into a screen
 */
-void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen)
-{
-    screen &=1;
-    if(screen==SCREEN0) {
-        screen=SCREEN0_BASE;
-    } else {
-        screen=SCREEN1_BASE;
-    }
-    line*=50;
-    int address=screen+line;
-    ram_write(address,data,50);
-
-    _csr=0; //select VRAM
-    _spi.write(0x02);
-    _spi.write(address>>8);
-    _spi.write(address&0xff);
-    for(int i=0; i<50; i++) {
-        _spi.write(*(data+i));
-    }
-    _csr=1;
-}
-
-/** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
-*/
-void AkiSpiLcd::ramWriteMulti(int line, int length, uint8_t* data, int screen)
+void AkiSpiLcd::ramWriteSingleLine(int line, uint8_t* data, int screen)
 {
     screen &=1;
     if(screen==SCREEN0) {
@@ -272,130 +167,173 @@
     } else {
         screen=SCREEN1_BASE;
     }
-    line*=50;
-
+    line--;
+    line*=RAMLINE_LENGTH;
     int address=screen+line;
-    ram_write(address,data,50*length);
-    /*
-    _csr=0; //select VRAM
-    _spi.write(0x02);
-    _spi.write(address>>8);
-    _spi.write(address&0xff);
-    for(int j=0;j<length;j++){
-        for(int i=0;i<50;i++){
-            _spi.write(*(data+j*50+i));
+    ram_write(address,data,50);
+}
+
+/** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
+*/
+void AkiSpiLcd::ramWriteMultiLine(int line, int length, uint8_t* data, int screen)
+{
+    _modeflag=1;
+    _clearflag=0;
+    screen &=1;
+    if(screen==SCREEN0) {
+        screen=SCREEN0_BASE;
+    } else {
+        screen=SCREEN1_BASE;
+    }
+//    line--;
+//    line*=RAMLINE_LENGTH;
+
+    int address=screen+line*RAMLINE_LENGTH;
+    _ram_writeStatus(SEQUENTIAL_MODE);
+    _ram_prepareCommand(WRITE, address);
+    for(int i=0; i<length; i++) {
+        _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
+        _spi.write( (uint8_t)lcd_line[line] );
+        for(int j = 0; j < LINE_LENGTH; j++) {
+            _spi.write(*data);
+            data++;
         }
+        line++;
     }
-    _csr=1;
-    */
+    _ram_deselect();
+    _ram_writeStatus(BYTE_MODE);
+//    ram_write(address,data,50*length);
 }
 
 /** copies whole data in screen into LCD
 */
 void AkiSpiLcd::ram2lcd(int startline, int length, int screen)
 {
+    _modeflag=1;
+    _clearflag=0;
     screen &=1;
     if(screen==SCREEN0) {
         screen=SCREEN0_BASE;
     } else {
         screen=SCREEN1_BASE;
     }
-//    screen<<=7;
+    if(startline==0)startline=1;
+
+    if(length>0) {
+
+        int address=screen+startline*RAMLINE_LENGTH;
+//    uint8_t dummy[RAMLINE_LENGTH+2];
+        uint8_t dummy=0;
 
-    int address=screen+length*50;
-    uint8_t dummy[50];
-    /*
-    _csr=0; //select VRAM
-    _spi.write(0x03);
-    _spi.write(address>>8);
-    _spi.write(address&0xff);
-    */
-    ram_write(RAMMODE_BASE,(modeflag << 7) | (comflag << 6) | (clearflag << 5));
-    _csl=1;
-    for(int j=0; j<length; j++) {
-        ram_read(RAMMODE_BASE);
-        ram_read(RAMLINE_BASE+startline);
-        ram_read(address+50*j,dummy,50);
-        ram_read(RAMMODE_BASE+2,dummy,2);
-        wait_us(5);
-        _csl=0;
-        if(comflag == 0) {
-            comflag = 1;
-        } else {
-            comflag = 0;
+        _ram_writeStatus(SEQUENTIAL_MODE);
+        _ram_prepareCommand(READ,address);
+        _csl=1;
+        for(int j = 0; j <= length; j++) {
+//        _csl=1;
+            for(int k = 0; k < RAMLINE_LENGTH; k+=4) {
+                dummy = _spi.write(0x55);
+                dummy = _spi.write(0xde);
+                dummy = _spi.write(0xad);
+//            dummy = _spi.write(0xbe);
+//            dummy = _spi.write(0xaf);
+                dummy = _spi.write(0xaa);
+            }
+//        _csl = 0;
         }
     }
-    _csl=0;
+    _csl = 0;
+//    _spi.write(0xde);
+//    _spi.write(0xad);
+    _ram_deselect();
+    cominvert();
 }
 
 uint8_t AkiSpiLcd::ram_read(int address)
 {
-    ram_prepareCommand(READ, address);
+    _ram_prepareCommand(READ, address);
     int result = _spi.write(0);
-    ram_deselect();
+    _ram_deselect();
     return (uint8_t) result;
 }
 
 void AkiSpiLcd::ram_read(int address, uint8_t * buffer, int count)
 {
-    ram_writeStatus(SEQUENTIAL_MODE);
-    ram_prepareCommand(READ, address);
+    _ram_writeStatus(SEQUENTIAL_MODE);
+    _ram_prepareCommand(READ, address);
     for (int i = 0; i < count; i++) {
         buffer[i] = _spi.write(0);
     }
-    ram_deselect();
-    ram_writeStatus(BYTE_MODE);
+    _ram_deselect();
+    _ram_writeStatus(BYTE_MODE);
 }
 
 void AkiSpiLcd::ram_write(int address, uint8_t byte)
 {
-    ram_prepareCommand(WRITE, address);
+    _ram_prepareCommand(WRITE, address);
     _spi.write(byte);
-    ram_deselect();
+    _ram_deselect();
 }
 
 void AkiSpiLcd::ram_write(int address, uint8_t * buffer, int count)
 {
-    ram_writeStatus(SEQUENTIAL_MODE);
-    ram_prepareCommand(WRITE, address);
+    _ram_writeStatus(SEQUENTIAL_MODE);
+    _ram_prepareCommand(WRITE, address);
     for (int i = 0; i < count; i++) {
         _spi.write(buffer[i]);
     }
-    ram_deselect();
-    ram_writeStatus(BYTE_MODE);
+    _ram_deselect();
+    _ram_writeStatus(BYTE_MODE);
 }
 
 uint8_t AkiSpiLcd::ram_readStatus()
 {
-    ram_select();
+    _ram_select();
     _spi.write(READ_STATUS);
     uint8_t result = (uint8_t) _spi.write(0);
-    ram_deselect();
+    _ram_deselect();
     return result;
 }
 
-void AkiSpiLcd::ram_writeStatus(uint8_t status)
+void AkiSpiLcd::_ram_writeStatus(uint8_t status)
 {
-    ram_select();
+    _ram_select();
     _spi.write(WRITE_STATUS);
     _spi.write(status);
-    ram_deselect();
+    _ram_deselect();
 }
 
-void AkiSpiLcd::ram_prepareCommand(uint8_t command, int address)
+void AkiSpiLcd::_ram_prepareCommand(uint8_t command, int address)
 {
-    ram_select();
+    _ram_select();
     _spi.write(command);
     _spi.write(address >> 8);
     _spi.write(address & 0xFF);
 }
 
-void AkiSpiLcd::ram_select()
+void AkiSpiLcd::_ram_select()
 {
-    _csr=0;
+    _csr = 0;
+}
+
+void AkiSpiLcd::_ram_deselect()
+{
+    _csr = 1;
 }
 
-void AkiSpiLcd::ram_deselect()
+void AkiSpiLcd::_cls_ram( int address )
 {
-    _csr=1;
+    _modeflag=1;
+    _clearflag=0;
+    _ram_writeStatus(SEQUENTIAL_MODE);
+    _ram_prepareCommand(WRITE, address);
+    for (int i = 1; i <= (240); i++) {
+        _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
+        _spi.write( (uint8_t)lcd_line[i] );
+        for(int j = 0; j < 50; j++) {
+            _spi.write(0x00);
+        }
+
+    }
+    _ram_deselect();
+    _ram_writeStatus(BYTE_MODE);
 }
--- a/AkiSpiLcd.h	Mon Sep 29 04:47:43 2014 +0000
+++ b/AkiSpiLcd.h	Thu Oct 02 18:13:05 2014 +0000
@@ -7,28 +7,8 @@
 
 #include "mbed.h"
 
-#define SCREEN0 0
-#define SCREEN1 1
-
-const uint8_t lcd_line[240]= {0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,0x08,
-                              0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,0x04,
-                              0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,0x0C,
-                              0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,0x02,
-                              0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,0x0A,
-                              0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,0x06,
-                              0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,0x0E,
-                              0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,0x01,
-                              0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,0x09,
-                              0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,0x05,
-                              0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,0x0D,
-                              0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,0x03,
-                              0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,0x0B,
-                              0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,0x07,
-                              0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,0x0F,
-                             };
-
-/** AkiSpiLcd
- * mbed library for SHARP LCD LS027B4DH01
+/** \class AkiSpiLcd
+ * \brief mbed library for SHARP LCD LS027B4DH01
  *
  * Example:
  * @code
@@ -54,37 +34,52 @@
  * }
  * @endcode
  */
+
+#define SCREEN0 0
+#define SCREEN1 1
+#define LINE_LENGTH 50
+#define RAMLINE_LENGTH 52
+
+const uint8_t lcd_line[256]= {
+    0x00,
+    0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,0x08,
+    0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,0x04,
+    0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,0x0C,
+    0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,0x02,
+    0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,0x0A,
+    0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,0x06,
+    0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,0x0E,
+    0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,0x01,
+    0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,0x09,
+    0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,0x05,
+    0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,0x0D,
+    0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,0x03,
+    0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,0x0B,
+    0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,0x07,
+    0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,0x0F,
+};
+
 class AkiSpiLcd
 {
 public:
-    //! base address list for 23K256
+    /** \enum BASE_ADDR
+        \brief base address list for 23K256
+        @param SCREEN0_BASE = 0x0000,
+        @param SCREEN1_BASE = 0x3000,
+        @param RAMLINE_BASE = 0x6000,
+    */
     enum BASE_ADDR {
-        RAMLINE_BASE = 0x6000,
-        RAMMODE_BASE = 0x6100,
         SCREEN0_BASE = 0x0000,
-        SCREEN1_BASE = 0x3000
-    };
-
-    //! mode codes for 23K256
-    enum MODE {
-        BYTE_MODE = 0x00,
-        SEQUENTIAL_MODE = 0x40
-    };
-
-    //! command codes for 23K256
-    enum COMMAND {
-        READ = 0x03,
-        WRITE = 0x02,
-        READ_STATUS = 0x05, // called RDSR in datasheet
-        WRITE_STATUS = 0x01 // called WRSR in datasheet
+        SCREEN1_BASE = 0x3000,
+        RAMLINE_BASE = 0x6000,
     };
 
     /** Constructor
-    * @param mosi SPI data input
-    * @param mosi SPI data output
-    * @param sck SPI clock input
-    * @param cs HIGH-active chip enable input
-    * @param disp HIGH-active display enable input
+    * @param mosi SPI data output from mbed
+    * @param mosi SPI data input from slave
+    * @param sck SPI clock output from mbed
+    * @param csl HIGH-active chip select input for LCD
+    * @param csr LOW-active chip select input for SRAM
     */
     AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr);
 
@@ -93,8 +88,17 @@
     void cls();
 
     /** Clear screen of SRAM
+    * @param screen screen number (0 or 1)
     */
     void cls_ram( int screen );
+    
+    /** place a dot pixel
+    * @param x x position
+    * @param y y position
+    */
+//    virtual void pixel(int x, int y, int colour);
+//    virtual int width() = 0;
+//    virtual int height() = 0;
 
     /** Writes single line(400 bits = 50 bytes)
     * @param line line number(1-240)
@@ -118,7 +122,7 @@
     * @param buffer pointer to buffer(50 bytes)
     * @param screen screen to read from(0 or 1)
     */
-    void ramReadSingle(int line, uint8_t* buffer, int screen);
+    void ramReadSingleLine(int line, uint8_t* buffer, int screen);
 
     /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
     * @param startline starting line number(1-240)
@@ -126,14 +130,14 @@
     * @param *buffer pointer to buffer
     * @param screen screen to read from(0 or 1)
     */
-    void ramReadMulti(int startline, int length, uint8_t* buffer, int screen);
+    void ramReadMultiLine(int startline, int length, uint8_t* buffer, int screen);
 
     /** Writes single line (400 bits = 50 bytes) into a screen
     * @param line line number(1-240)
     * @param *data pointer to data to write(50 bytes)
     * @param screen screen to read from(0 or 1)
     */
-    void ramWriteSingle(int line, uint8_t* data, int screen);
+    void ramWriteSingleLine(int line, uint8_t* data, int screen);
 
     /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
     * @param startline starting line number(1-240)
@@ -141,37 +145,32 @@
     * @param *data pointer to data to write
     * @param screen screen to read from(0 or 1)
     */
-    void ramWriteMulti(int startline, int length, uint8_t* data, int screen);
+    void ramWriteMultiLine(int startline, int length, uint8_t* data, int screen);
 
     /** copies whole data in screen into LCD
     * @param screen screen to copy (0 or 1)
     */
     void ram2lcd(int startline, int length, int screen);
 
-//    /** Enables/disables display. internal memory will not flushed
-//    * @param disp true = display is on / false = display is off
-//    */
-//    void dispOn(bool disp);
-
     /** read a byte from SRAM (copied from Ser23K256)
     * @param address    The address to read from
-    * @return the uint8_tacter at that address
+    * @return the character at that address
     */
     uint8_t ram_read(int address);
-    
+
     /** read multiple bytes from SRAM into a buffer (copied from Ser23K256)
     * @param address    The SRAM address to read from
     * @param buffer     The buffer to read into (must be big enough!)
     * @param count      The number of bytes to read
     */
     void ram_read(int address, uint8_t * buffer, int count);
-    
+
     /** write a byte to SRAM (copied from Ser23K256)
-    * @param address    The address SRAM to write to
+    * @param address    The SRAM address to write to
     * @param byte       The byte to write there
     */
     void ram_write(int address, uint8_t byte);
-    
+
     /** write multiple bytes to SRAM from a buffer (copied from Ser23K256)
     * @param address    The SRAM address write to
     * @param buffer     The buffer to write from
@@ -181,17 +180,31 @@
 
 private:
 //    Ser23K256 _ram;
-    int comflag;
-    int modeflag;
-    int clearflag;
+
+    enum MODE {
+        BYTE_MODE = 0x00,
+        SEQUENTIAL_MODE = 0x40
+    };
+
+    enum COMMAND {
+        READ = 0x03,
+        WRITE = 0x02,
+        READ_STATUS = 0x05, // called RDSR in datasheet
+        WRITE_STATUS = 0x01 // called WRSR in datasheet
+    };
+
+    int _comflag;
+    int _modeflag;
+    int _clearflag;
     SPI _spi;
     DigitalOut _csl;
     DigitalOut _csr;
 
+    void _cls_ram( int address );
     uint8_t ram_readStatus();
-    void ram_writeStatus(uint8_t status);
-    void ram_prepareCommand(uint8_t command, int address);
-    void ram_select();
-    void ram_deselect();
+    void _ram_writeStatus(uint8_t status);
+    void _ram_prepareCommand(uint8_t command, int address);
+    void _ram_select();
+    void _ram_deselect();
 };
 #endif