Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Committer:
k4zuki
Date:
Thu Aug 28 10:10:37 2014 +0000
Revision:
5:7061ce47a359
Parent:
4:844693a617dc
Child:
7:0c85f23a6568
simplified code using Ser26K256 library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 1:57de84d2025c 1 /** this is for SHARP LCD LS027B4DH01
k4zuki 2:01979b296ab5 2 * by Kazuki Yamamoto, or _K4ZUKI_
k4zuki 0:b3c8fdd01601 3 */
k4zuki 0:b3c8fdd01601 4
k4zuki 0:b3c8fdd01601 5 #include "mbed.h"
k4zuki 0:b3c8fdd01601 6 #include "AkiSpiLcd.h"
k4zuki 0:b3c8fdd01601 7
k4zuki 4:844693a617dc 8 AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr)
k4zuki 4:844693a617dc 9 :_spi(mosi, miso, sck), _csl(csl), _csr(csr)
k4zuki 0:b3c8fdd01601 10 {
k4zuki 5:7061ce47a359 11 _ram= new Ser23K256::Ser23K256(_spi,csr);
k4zuki 3:f835b8daf9a0 12 _csl=0;
k4zuki 4:844693a617dc 13 _csr=1;
k4zuki 0:b3c8fdd01601 14 _spi.format(8,0);
k4zuki 0:b3c8fdd01601 15 _spi.frequency(2000000);
k4zuki 0:b3c8fdd01601 16 comflag = modeflag = clearflag = 0;
k4zuki 5:7061ce47a359 17
k4zuki 5:7061ce47a359 18 int data=0;
k4zuki 5:7061ce47a359 19 for(int i=0;i<240;i++){
k4zuki 5:7061ce47a359 20 data=( ( i & 0x01 ) << 7 )|
k4zuki 5:7061ce47a359 21 ( ( i & 0x02 ) << 5 )|
k4zuki 5:7061ce47a359 22 ( ( i & 0x04 ) << 3 )|
k4zuki 5:7061ce47a359 23 ( ( i & 0x08 ) << 1 )|
k4zuki 5:7061ce47a359 24 ( ( i & 0x10 ) >> 1 )|
k4zuki 5:7061ce47a359 25 ( ( i & 0x20 ) >> 3 )|
k4zuki 5:7061ce47a359 26 ( ( i & 0x40 ) >> 5 )|
k4zuki 5:7061ce47a359 27 ( ( i & 0x80 ) >> 7 );
k4zuki 5:7061ce47a359 28
k4zuki 5:7061ce47a359 29 _ram->write(RAMLINE_BASE+i,(uint8_t)data);
k4zuki 4:844693a617dc 30 }
k4zuki 5:7061ce47a359 31 _ram->write(RAMMODE_BASE,0x00000000);
k4zuki 5:7061ce47a359 32
k4zuki 0:b3c8fdd01601 33 }
k4zuki 0:b3c8fdd01601 34
k4zuki 0:b3c8fdd01601 35 void AkiSpiLcd::cls()
k4zuki 0:b3c8fdd01601 36 {
k4zuki 0:b3c8fdd01601 37 modeflag=0;
k4zuki 0:b3c8fdd01601 38 clearflag=1;
k4zuki 0:b3c8fdd01601 39
k4zuki 3:f835b8daf9a0 40 _csl=1;
k4zuki 0:b3c8fdd01601 41 wait_us(5);
k4zuki 0:b3c8fdd01601 42
k4zuki 0:b3c8fdd01601 43 _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
k4zuki 0:b3c8fdd01601 44 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 45
k4zuki 0:b3c8fdd01601 46 wait_us(5);
k4zuki 3:f835b8daf9a0 47 _csl=0;
k4zuki 0:b3c8fdd01601 48
k4zuki 0:b3c8fdd01601 49 if(comflag == 0) {
k4zuki 0:b3c8fdd01601 50 comflag = 1;
k4zuki 0:b3c8fdd01601 51 } else {
k4zuki 0:b3c8fdd01601 52 comflag = 0;
k4zuki 0:b3c8fdd01601 53 }
k4zuki 0:b3c8fdd01601 54 }
k4zuki 0:b3c8fdd01601 55
k4zuki 3:f835b8daf9a0 56 void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data)
k4zuki 0:b3c8fdd01601 57 {
k4zuki 0:b3c8fdd01601 58 modeflag=1;
k4zuki 0:b3c8fdd01601 59 clearflag=0;
k4zuki 0:b3c8fdd01601 60
k4zuki 3:f835b8daf9a0 61 _csl=1;
k4zuki 0:b3c8fdd01601 62 wait_us(5);
k4zuki 0:b3c8fdd01601 63
k4zuki 0:b3c8fdd01601 64 _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
k4zuki 3:f835b8daf9a0 65
k4zuki 0:b3c8fdd01601 66 _spi.write(
k4zuki 0:b3c8fdd01601 67 ( ( (line+1) & 0x01 ) << 7 )|
k4zuki 0:b3c8fdd01601 68 ( ( (line+1) & 0x02 ) << 5 )|
k4zuki 0:b3c8fdd01601 69 ( ( (line+1) & 0x04 ) << 3 )|
k4zuki 0:b3c8fdd01601 70 ( ( (line+1) & 0x08 ) << 1 )|
k4zuki 0:b3c8fdd01601 71 ( ( (line+1) & 0x10 ) >> 1 )|
k4zuki 0:b3c8fdd01601 72 ( ( (line+1) & 0x20 ) >> 3 )|
k4zuki 0:b3c8fdd01601 73 ( ( (line+1) & 0x40 ) >> 5 )|
k4zuki 0:b3c8fdd01601 74 ( ( (line+1) & 0x80 ) >> 7 )
k4zuki 0:b3c8fdd01601 75 );
k4zuki 0:b3c8fdd01601 76 for(int i=0; i<50; i++) {
k4zuki 0:b3c8fdd01601 77 _spi.write( *(data+i) );
k4zuki 0:b3c8fdd01601 78 }
k4zuki 0:b3c8fdd01601 79 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 80 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 81
k4zuki 0:b3c8fdd01601 82 wait_us(5);
k4zuki 3:f835b8daf9a0 83 _csl=0;
k4zuki 0:b3c8fdd01601 84
k4zuki 0:b3c8fdd01601 85 if(comflag == 0) {
k4zuki 0:b3c8fdd01601 86 comflag = 1;
k4zuki 0:b3c8fdd01601 87 } else {
k4zuki 0:b3c8fdd01601 88 comflag = 0;
k4zuki 0:b3c8fdd01601 89 }
k4zuki 0:b3c8fdd01601 90 }
k4zuki 0:b3c8fdd01601 91
k4zuki 3:f835b8daf9a0 92 void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data)
k4zuki 0:b3c8fdd01601 93 {
k4zuki 0:b3c8fdd01601 94 modeflag=1;
k4zuki 0:b3c8fdd01601 95 clearflag=0;
k4zuki 0:b3c8fdd01601 96
k4zuki 0:b3c8fdd01601 97 if(length>0) {
k4zuki 3:f835b8daf9a0 98 _csl=1;
k4zuki 0:b3c8fdd01601 99 wait_us(5);
k4zuki 0:b3c8fdd01601 100 for (int j=0; j<length; j++) {
k4zuki 0:b3c8fdd01601 101 _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
k4zuki 0:b3c8fdd01601 102 _spi.write(
k4zuki 5:7061ce47a359 103 ( ( (line) & 0x01 ) << 7 )|
k4zuki 5:7061ce47a359 104 ( ( (line) & 0x02 ) << 5 )|
k4zuki 5:7061ce47a359 105 ( ( (line) & 0x04 ) << 3 )|
k4zuki 5:7061ce47a359 106 ( ( (line) & 0x08 ) << 1 )|
k4zuki 5:7061ce47a359 107 ( ( (line) & 0x10 ) >> 1 )|
k4zuki 5:7061ce47a359 108 ( ( (line) & 0x20 ) >> 3 )|
k4zuki 5:7061ce47a359 109 ( ( (line) & 0x40 ) >> 5 )|
k4zuki 5:7061ce47a359 110 ( ( (line) & 0x80 ) >> 7 )
k4zuki 0:b3c8fdd01601 111 );
k4zuki 0:b3c8fdd01601 112
k4zuki 0:b3c8fdd01601 113 for(int i=0; i<50; i++) {
k4zuki 0:b3c8fdd01601 114 _spi.write( *(data+(50*j+i)) );//hogepic[50*j+i]
k4zuki 0:b3c8fdd01601 115 }
k4zuki 0:b3c8fdd01601 116 line+=1;
k4zuki 0:b3c8fdd01601 117 }
k4zuki 0:b3c8fdd01601 118 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 119 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 120 wait_us(5);
k4zuki 3:f835b8daf9a0 121 _csl=0;
k4zuki 0:b3c8fdd01601 122 }
k4zuki 0:b3c8fdd01601 123 if(comflag == 0) {
k4zuki 0:b3c8fdd01601 124 comflag = 1;
k4zuki 0:b3c8fdd01601 125 } else {
k4zuki 0:b3c8fdd01601 126 comflag = 0;
k4zuki 0:b3c8fdd01601 127 }
k4zuki 0:b3c8fdd01601 128 }
k4zuki 0:b3c8fdd01601 129
k4zuki 0:b3c8fdd01601 130 void AkiSpiLcd::cominvert()
k4zuki 0:b3c8fdd01601 131 {
k4zuki 0:b3c8fdd01601 132 modeflag=0;
k4zuki 0:b3c8fdd01601 133 clearflag=0;
k4zuki 0:b3c8fdd01601 134
k4zuki 3:f835b8daf9a0 135 _csl=1;
k4zuki 0:b3c8fdd01601 136
k4zuki 0:b3c8fdd01601 137 _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) );
k4zuki 0:b3c8fdd01601 138 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 139 wait_us(5);
k4zuki 3:f835b8daf9a0 140 _csl=0;
k4zuki 0:b3c8fdd01601 141 if(comflag == 0) {
k4zuki 0:b3c8fdd01601 142 comflag = 1;
k4zuki 0:b3c8fdd01601 143 } else {
k4zuki 0:b3c8fdd01601 144 comflag = 0;
k4zuki 0:b3c8fdd01601 145 }
k4zuki 0:b3c8fdd01601 146 }
k4zuki 3:f835b8daf9a0 147 /*
k4zuki 0:b3c8fdd01601 148 void AkiSpiLcd::dispOn(bool disp)
k4zuki 0:b3c8fdd01601 149 {
k4zuki 0:b3c8fdd01601 150 if(disp) {
k4zuki 3:f835b8daf9a0 151 _csr=1;
k4zuki 0:b3c8fdd01601 152 } else {
k4zuki 3:f835b8daf9a0 153 _csr=0;
k4zuki 0:b3c8fdd01601 154 }
k4zuki 0:b3c8fdd01601 155 }
k4zuki 3:f835b8daf9a0 156 */
k4zuki 4:844693a617dc 157
k4zuki 4:844693a617dc 158 /** Reads single line (400 bits = 50 bytes) from a screen
k4zuki 4:844693a617dc 159 */
k4zuki 4:844693a617dc 160 void AkiSpiLcd::ramReadSingle(int line, uint8_t* buffer, int screen){
k4zuki 4:844693a617dc 161 screen &=1;
k4zuki 4:844693a617dc 162 screen<<=7;
k4zuki 4:844693a617dc 163 // uint8_t buffer[50];
k4zuki 4:844693a617dc 164 line*=50;
k4zuki 4:844693a617dc 165 int address=screen+line;
k4zuki 5:7061ce47a359 166 _ram->read(address,buffer,50);
k4zuki 5:7061ce47a359 167 /*
k4zuki 4:844693a617dc 168 _csr=0; //select VRAM
k4zuki 4:844693a617dc 169 _spi.write(0x03);
k4zuki 4:844693a617dc 170 _spi.write(address>>8);
k4zuki 4:844693a617dc 171 _spi.write(address&0xff);
k4zuki 4:844693a617dc 172 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 173 *(buffer+i)=_spi.write(0xaa);
k4zuki 4:844693a617dc 174 }
k4zuki 4:844693a617dc 175 _csr=1;
k4zuki 5:7061ce47a359 176 */
k4zuki 4:844693a617dc 177 // return buffer;
k4zuki 4:844693a617dc 178 }
k4zuki 4:844693a617dc 179
k4zuki 4:844693a617dc 180 /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
k4zuki 4:844693a617dc 181 */
k4zuki 4:844693a617dc 182 void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen){
k4zuki 4:844693a617dc 183 screen &=1;
k4zuki 4:844693a617dc 184 screen<<=7;
k4zuki 4:844693a617dc 185 line*=50;
k4zuki 4:844693a617dc 186 int address=screen+line;
k4zuki 5:7061ce47a359 187 // for(int j=0;j<length;j++){
k4zuki 5:7061ce47a359 188 _ram->read(address,buffer,50*length);
k4zuki 5:7061ce47a359 189 // }
k4zuki 5:7061ce47a359 190 /*
k4zuki 4:844693a617dc 191 _csr=0; //select VRAM
k4zuki 4:844693a617dc 192 _spi.write(0x03);
k4zuki 4:844693a617dc 193 _spi.write(address>>8);
k4zuki 4:844693a617dc 194 _spi.write(address&0xff);
k4zuki 4:844693a617dc 195 for(int j=0;j<length;j++){
k4zuki 4:844693a617dc 196 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 197 *(buffer+i)=_spi.write(0xaa);
k4zuki 4:844693a617dc 198 }
k4zuki 4:844693a617dc 199 }
k4zuki 4:844693a617dc 200 _csr=1;
k4zuki 5:7061ce47a359 201 */
k4zuki 4:844693a617dc 202 // return buffer;
k4zuki 4:844693a617dc 203 }
k4zuki 4:844693a617dc 204
k4zuki 4:844693a617dc 205 /** Writes single line (400 bits = 50 bytes) into a screen
k4zuki 4:844693a617dc 206 */
k4zuki 4:844693a617dc 207 void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen){
k4zuki 4:844693a617dc 208 screen &=1;
k4zuki 4:844693a617dc 209 screen<<=7;
k4zuki 4:844693a617dc 210 line*=50;
k4zuki 4:844693a617dc 211 int address=screen+line;
k4zuki 5:7061ce47a359 212 _ram->write(address,data,50);
k4zuki 5:7061ce47a359 213
k4zuki 4:844693a617dc 214 _csr=0; //select VRAM
k4zuki 4:844693a617dc 215 _spi.write(0x02);
k4zuki 4:844693a617dc 216 _spi.write(address>>8);
k4zuki 4:844693a617dc 217 _spi.write(address&0xff);
k4zuki 4:844693a617dc 218 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 219 _spi.write(*(data+i));
k4zuki 4:844693a617dc 220 }
k4zuki 4:844693a617dc 221 _csr=1;
k4zuki 4:844693a617dc 222 }
k4zuki 4:844693a617dc 223
k4zuki 4:844693a617dc 224 /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
k4zuki 4:844693a617dc 225 */
k4zuki 4:844693a617dc 226 void AkiSpiLcd::ramWriteMulti(int line, int length, uint8_t* data, int screen){
k4zuki 4:844693a617dc 227 screen &=1;
k4zuki 4:844693a617dc 228 screen<<=7;
k4zuki 4:844693a617dc 229 line*=50;
k4zuki 4:844693a617dc 230
k4zuki 4:844693a617dc 231 int address=screen+line;
k4zuki 5:7061ce47a359 232 _ram->write(address,data,50*length);
k4zuki 5:7061ce47a359 233 /*
k4zuki 4:844693a617dc 234 _csr=0; //select VRAM
k4zuki 4:844693a617dc 235 _spi.write(0x02);
k4zuki 4:844693a617dc 236 _spi.write(address>>8);
k4zuki 4:844693a617dc 237 _spi.write(address&0xff);
k4zuki 4:844693a617dc 238 for(int j=0;j<length;j++){
k4zuki 4:844693a617dc 239 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 240 _spi.write(*(data+j*50+i));
k4zuki 4:844693a617dc 241 }
k4zuki 4:844693a617dc 242 }
k4zuki 4:844693a617dc 243 _csr=1;
k4zuki 5:7061ce47a359 244 */
k4zuki 4:844693a617dc 245 }
k4zuki 4:844693a617dc 246
k4zuki 4:844693a617dc 247 /** copies whole data in screen into LCD
k4zuki 4:844693a617dc 248 */
k4zuki 4:844693a617dc 249 void AkiSpiLcd::ram2lcd(int screen){
k4zuki 4:844693a617dc 250 screen &=1;
k4zuki 4:844693a617dc 251 screen<<=7;
k4zuki 4:844693a617dc 252
k4zuki 4:844693a617dc 253 int address=screen;
k4zuki 5:7061ce47a359 254 uint8_t* dummy;
k4zuki 5:7061ce47a359 255 /*
k4zuki 4:844693a617dc 256 _csr=0; //select VRAM
k4zuki 4:844693a617dc 257 _spi.write(0x03);
k4zuki 4:844693a617dc 258 _spi.write(address>>8);
k4zuki 4:844693a617dc 259 _spi.write(address&0xff);
k4zuki 5:7061ce47a359 260 */
k4zuki 4:844693a617dc 261 for(int j=0;j<240;j++){
k4zuki 5:7061ce47a359 262 _ram->write(RAMMODE_BASE,(modeflag << 7) | (comflag << 6) | (clearflag << 5));
k4zuki 5:7061ce47a359 263 _csl=1;
k4zuki 5:7061ce47a359 264 _ram->read(RAMMODE_BASE,dummy,2);
k4zuki 4:844693a617dc 265 for(int i=0;i<50;i++){
k4zuki 5:7061ce47a359 266 _ram->read(address,dummy,50);
k4zuki 5:7061ce47a359 267 }
k4zuki 5:7061ce47a359 268 _ram->read(RAMMODE_BASE+2,dummy,2);
k4zuki 5:7061ce47a359 269 wait_us(5);
k4zuki 5:7061ce47a359 270 _csl=0;
k4zuki 5:7061ce47a359 271 if(comflag == 0) {
k4zuki 5:7061ce47a359 272 comflag = 1;
k4zuki 5:7061ce47a359 273 } else {
k4zuki 5:7061ce47a359 274 comflag = 0;
k4zuki 4:844693a617dc 275 }
k4zuki 4:844693a617dc 276 }
k4zuki 4:844693a617dc 277 _csl=0;
k4zuki 4:844693a617dc 278 }