Basic library for SHARP LCD LS027B4DH01/LS027B7DH01
Dependents: AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example
Revision 4:844693a617dc, committed 2014-08-28
- 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