Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Committer:
k4zuki
Date:
Thu Aug 28 17:23:43 2014 +0000
Revision:
7:0c85f23a6568
Parent:
5:7061ce47a359
Child:
9:33d5888d1fb9
.

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 7:0c85f23a6568 162 if(screen==0){
k4zuki 7:0c85f23a6568 163 screen=SCREEN0_BASE;
k4zuki 7:0c85f23a6568 164 }else{
k4zuki 7:0c85f23a6568 165 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 166 }
k4zuki 4:844693a617dc 167 // uint8_t buffer[50];
k4zuki 4:844693a617dc 168 line*=50;
k4zuki 4:844693a617dc 169 int address=screen+line;
k4zuki 5:7061ce47a359 170 _ram->read(address,buffer,50);
k4zuki 5:7061ce47a359 171 /*
k4zuki 4:844693a617dc 172 _csr=0; //select VRAM
k4zuki 4:844693a617dc 173 _spi.write(0x03);
k4zuki 4:844693a617dc 174 _spi.write(address>>8);
k4zuki 4:844693a617dc 175 _spi.write(address&0xff);
k4zuki 4:844693a617dc 176 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 177 *(buffer+i)=_spi.write(0xaa);
k4zuki 4:844693a617dc 178 }
k4zuki 4:844693a617dc 179 _csr=1;
k4zuki 5:7061ce47a359 180 */
k4zuki 4:844693a617dc 181 // return buffer;
k4zuki 4:844693a617dc 182 }
k4zuki 4:844693a617dc 183
k4zuki 4:844693a617dc 184 /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen
k4zuki 4:844693a617dc 185 */
k4zuki 4:844693a617dc 186 void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen){
k4zuki 4:844693a617dc 187 screen &=1;
k4zuki 7:0c85f23a6568 188 if(screen==0){
k4zuki 7:0c85f23a6568 189 screen=SCREEN0_BASE;
k4zuki 7:0c85f23a6568 190 }else{
k4zuki 7:0c85f23a6568 191 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 192 }
k4zuki 4:844693a617dc 193 line*=50;
k4zuki 4:844693a617dc 194 int address=screen+line;
k4zuki 5:7061ce47a359 195 // for(int j=0;j<length;j++){
k4zuki 5:7061ce47a359 196 _ram->read(address,buffer,50*length);
k4zuki 5:7061ce47a359 197 // }
k4zuki 5:7061ce47a359 198 /*
k4zuki 4:844693a617dc 199 _csr=0; //select VRAM
k4zuki 4:844693a617dc 200 _spi.write(0x03);
k4zuki 4:844693a617dc 201 _spi.write(address>>8);
k4zuki 4:844693a617dc 202 _spi.write(address&0xff);
k4zuki 4:844693a617dc 203 for(int j=0;j<length;j++){
k4zuki 4:844693a617dc 204 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 205 *(buffer+i)=_spi.write(0xaa);
k4zuki 4:844693a617dc 206 }
k4zuki 4:844693a617dc 207 }
k4zuki 4:844693a617dc 208 _csr=1;
k4zuki 5:7061ce47a359 209 */
k4zuki 4:844693a617dc 210 // return buffer;
k4zuki 4:844693a617dc 211 }
k4zuki 4:844693a617dc 212
k4zuki 4:844693a617dc 213 /** Writes single line (400 bits = 50 bytes) into a screen
k4zuki 4:844693a617dc 214 */
k4zuki 4:844693a617dc 215 void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen){
k4zuki 4:844693a617dc 216 screen &=1;
k4zuki 7:0c85f23a6568 217 if(screen==0){
k4zuki 7:0c85f23a6568 218 screen=SCREEN0_BASE;
k4zuki 7:0c85f23a6568 219 }else{
k4zuki 7:0c85f23a6568 220 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 221 }
k4zuki 4:844693a617dc 222 line*=50;
k4zuki 4:844693a617dc 223 int address=screen+line;
k4zuki 5:7061ce47a359 224 _ram->write(address,data,50);
k4zuki 5:7061ce47a359 225
k4zuki 4:844693a617dc 226 _csr=0; //select VRAM
k4zuki 4:844693a617dc 227 _spi.write(0x02);
k4zuki 4:844693a617dc 228 _spi.write(address>>8);
k4zuki 4:844693a617dc 229 _spi.write(address&0xff);
k4zuki 4:844693a617dc 230 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 231 _spi.write(*(data+i));
k4zuki 4:844693a617dc 232 }
k4zuki 4:844693a617dc 233 _csr=1;
k4zuki 4:844693a617dc 234 }
k4zuki 4:844693a617dc 235
k4zuki 4:844693a617dc 236 /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
k4zuki 4:844693a617dc 237 */
k4zuki 4:844693a617dc 238 void AkiSpiLcd::ramWriteMulti(int line, int length, uint8_t* data, int screen){
k4zuki 4:844693a617dc 239 screen &=1;
k4zuki 7:0c85f23a6568 240 if(screen==0){
k4zuki 7:0c85f23a6568 241 screen=SCREEN0_BASE;
k4zuki 7:0c85f23a6568 242 }else{
k4zuki 7:0c85f23a6568 243 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 244 }
k4zuki 4:844693a617dc 245 line*=50;
k4zuki 4:844693a617dc 246
k4zuki 4:844693a617dc 247 int address=screen+line;
k4zuki 5:7061ce47a359 248 _ram->write(address,data,50*length);
k4zuki 5:7061ce47a359 249 /*
k4zuki 4:844693a617dc 250 _csr=0; //select VRAM
k4zuki 4:844693a617dc 251 _spi.write(0x02);
k4zuki 4:844693a617dc 252 _spi.write(address>>8);
k4zuki 4:844693a617dc 253 _spi.write(address&0xff);
k4zuki 4:844693a617dc 254 for(int j=0;j<length;j++){
k4zuki 4:844693a617dc 255 for(int i=0;i<50;i++){
k4zuki 4:844693a617dc 256 _spi.write(*(data+j*50+i));
k4zuki 4:844693a617dc 257 }
k4zuki 4:844693a617dc 258 }
k4zuki 4:844693a617dc 259 _csr=1;
k4zuki 5:7061ce47a359 260 */
k4zuki 4:844693a617dc 261 }
k4zuki 4:844693a617dc 262
k4zuki 4:844693a617dc 263 /** copies whole data in screen into LCD
k4zuki 4:844693a617dc 264 */
k4zuki 7:0c85f23a6568 265 void AkiSpiLcd::ram2lcd(int startline, int length, int screen){
k4zuki 4:844693a617dc 266 screen &=1;
k4zuki 7:0c85f23a6568 267 if(screen==0){
k4zuki 7:0c85f23a6568 268 screen=SCREEN0_BASE;
k4zuki 7:0c85f23a6568 269 }else{
k4zuki 7:0c85f23a6568 270 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 271 }
k4zuki 7:0c85f23a6568 272 // screen<<=7;
k4zuki 4:844693a617dc 273
k4zuki 7:0c85f23a6568 274 int address=screen+length*50;
k4zuki 7:0c85f23a6568 275 uint8_t dummy[50];
k4zuki 5:7061ce47a359 276 /*
k4zuki 4:844693a617dc 277 _csr=0; //select VRAM
k4zuki 4:844693a617dc 278 _spi.write(0x03);
k4zuki 4:844693a617dc 279 _spi.write(address>>8);
k4zuki 4:844693a617dc 280 _spi.write(address&0xff);
k4zuki 5:7061ce47a359 281 */
k4zuki 4:844693a617dc 282 for(int j=0;j<240;j++){
k4zuki 5:7061ce47a359 283 _ram->write(RAMMODE_BASE,(modeflag << 7) | (comflag << 6) | (clearflag << 5));
k4zuki 5:7061ce47a359 284 _csl=1;
k4zuki 7:0c85f23a6568 285 _ram->read(RAMMODE_BASE);
k4zuki 7:0c85f23a6568 286 _ram->read(RAMLINE_BASE+startline);
k4zuki 7:0c85f23a6568 287 _ram->read(address+50*j,dummy,50);
k4zuki 5:7061ce47a359 288 _ram->read(RAMMODE_BASE+2,dummy,2);
k4zuki 5:7061ce47a359 289 wait_us(5);
k4zuki 5:7061ce47a359 290 _csl=0;
k4zuki 5:7061ce47a359 291 if(comflag == 0) {
k4zuki 5:7061ce47a359 292 comflag = 1;
k4zuki 5:7061ce47a359 293 } else {
k4zuki 5:7061ce47a359 294 comflag = 0;
k4zuki 4:844693a617dc 295 }
k4zuki 4:844693a617dc 296 }
k4zuki 4:844693a617dc 297 _csl=0;
k4zuki 4:844693a617dc 298 }