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 Aug 28 06:26:48 2014 +0000
Parent:
3:f835b8daf9a0
Child:
5:7061ce47a359
Commit message:
VRAM usable (Microchip 23K256)

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	Thu Aug 28 01:51:04 2014 +0000
+++ b/AkiSpiLcd.cpp	Thu Aug 28 06:26:48 2014 +0000
@@ -5,14 +5,32 @@
 #include "mbed.h"
 #include "AkiSpiLcd.h"
 
-AkiSpiLcd::AkiSpiLcd(PinName mosi,PinName sck, PinName csl, PinName csr)
-    :_spi(mosi,NC,sck), _csl(csl), _csr(csr)
+AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr)
+    :_spi(mosi, miso, sck), _csl(csl), _csr(csr)
 {
     _csl=0;
+    _csr=1;
     _spi.format(8,0);
     _spi.frequency(2000000);
     comflag = modeflag = clearflag = 0;
-    _csr=0;
+    _csr=0; //select VRAM
+    _spi.write(0x02);
+    _spi.write(0x60);
+    _spi.write(0x00);
+    for(int i=1;i<241;i++){
+        //write swapped i into RAM
+        _spi.write(
+        ( ( i & 0x01 ) << 7 )|
+        ( ( i & 0x02 ) << 5 )|
+        ( ( i & 0x04 ) << 3 )|
+        ( ( i & 0x08 ) << 1 )|
+        ( ( i & 0x10 ) >> 1 )|
+        ( ( i & 0x20 ) >> 3 )|
+        ( ( i & 0x40 ) >> 5 )|
+        ( ( i & 0x80 ) >> 7 )
+        );
+    _csr=1;
+    }
 }
 
 void AkiSpiLcd::cls()
@@ -137,3 +155,106 @@
     }
 }
 */
+
+    /** Reads single line (400 bits = 50 bytes) from a screen
+    */
+void AkiSpiLcd::ramReadSingle(int line, uint8_t* buffer, int screen){
+    screen &=1;
+    screen<<=7;
+//    uint8_t buffer[50];
+    line*=50;
+    int address=screen+line;
+    _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;
+}
+
+    /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
+    */
+void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen){
+    screen &=1;
+    screen<<=7;
+    line*=50;
+    int address=screen+line;
+    _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;
+}
+    
+    /** Writes single line (400 bits = 50 bytes) into a screen
+    */
+void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen){
+    screen &=1;
+    screen<<=7;
+    line*=50;
+    int address=screen+line;
+    _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){
+    screen &=1;
+    screen<<=7;
+    line*=50;
+    
+    int address=screen+line;
+    
+    _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));
+        }
+    }
+    _csr=1;
+}
+
+    /** copies whole data in screen into LCD
+    */
+void AkiSpiLcd::ram2lcd(int screen){
+    screen &=1;
+    screen<<=7;
+
+    int address=screen;
+    int dummy=0;
+    
+    _csl=1;
+    _csr=0; //select VRAM
+    _spi.write(0x03);
+    _spi.write(address>>8);
+    _spi.write(address&0xff);
+    for(int j=0;j<240;j++){
+        for(int i=0;i<50;i++){
+            dummy=_spi.write(0xaa);
+        }
+    }
+    _spi.write(0x00);
+    _spi.write(0x00);
+    _csr=1;
+    wait_us(5);
+    _csl=0;
+}
--- a/AkiSpiLcd.h	Thu Aug 28 01:51:04 2014 +0000
+++ b/AkiSpiLcd.h	Thu Aug 28 06:26:48 2014 +0000
@@ -37,12 +37,13 @@
 public:
     /** 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
     */
 //    AkiSpiLcd(PinName mosi,PinName sck, PinName cs, PinName disp);
-    AkiSpiLcd(PinName mosi,PinName sck, PinName csl, PinName csr);
+    AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr);
 
     /** Clear screen
     */
@@ -59,15 +60,31 @@
     * @param length number of line to write
     * @param *data pointer to data
     */
-    void directUpdateMulti(int line, int length, uint8_t* data);
+    void directUpdateMulti(int startline, int length, uint8_t* data);
 
     /** Inverting internal COM signal
     */
     void cominvert();
     
-    /** Writes single line (400 bits = 50 bytes) into VRAM
+    /** Reads single line (400 bits = 50 bytes) from a screen
+    */
+    void ramReadSingle(int line, uint8_t* buffer, int screen);
+
+    /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
+    */
+    void ramReadMulti(int startline, int length, uint8_t* buffer, int screen);
     
+    /** Writes single line (400 bits = 50 bytes) into a screen
     */
+    void ramWriteSingle(int line, uint8_t* data, int screen);
+
+    /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
+    */
+    void ramWriteMulti(int startline, int length, uint8_t* data, int screen);
+    
+    /** copies whole data in screen into LCD
+    */
+    void ram2lcd(int screen);
 
 //    /** Enables/disables display. internal memory will not flushed
 //    * @param disp true = display is on / false = display is off