Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Committer:
k4zuki
Date:
Thu Oct 02 18:13:05 2014 +0000
Revision:
14:812873f3a933
Parent:
12:30b31d87a30e
Child:
15:704dd6e688ab
many line number related bugfix

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 10:eed99ef09e63 7 //#include "Ser23K256.h"
k4zuki 11:16647ecd67ce 8 extern const uint8_t lcd_line[];
k4zuki 0:b3c8fdd01601 9
k4zuki 4:844693a617dc 10 AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl, PinName csr)
k4zuki 4:844693a617dc 11 :_spi(mosi, miso, sck), _csl(csl), _csr(csr)
k4zuki 0:b3c8fdd01601 12 {
k4zuki 3:f835b8daf9a0 13 _csl=0;
k4zuki 4:844693a617dc 14 _csr=1;
k4zuki 0:b3c8fdd01601 15 _spi.format(8,0);
k4zuki 14:812873f3a933 16 _spi.frequency(5000000);
k4zuki 14:812873f3a933 17 _comflag = _modeflag = _clearflag = 0;
k4zuki 12:30b31d87a30e 18
k4zuki 14:812873f3a933 19 // if(_csr != NULL) {
k4zuki 14:812873f3a933 20 // uint8_t data[240];
k4zuki 14:812873f3a933 21 // data[0]=0;
k4zuki 14:812873f3a933 22 // for(int i=1; i<=240; i++) {
k4zuki 14:812873f3a933 23 // data[i]=(uint8_t)lcd_line[i];
k4zuki 14:812873f3a933 24 // }
k4zuki 14:812873f3a933 25 // ram_write(RAMLINE_BASE,data,240);
k4zuki 14:812873f3a933 26 // }
k4zuki 14:812873f3a933 27 // uint8_t buffer[4] = {0,0,0,0};
k4zuki 14:812873f3a933 28 // ram_write(RAMMODE_BASE,buffer,4);
k4zuki 5:7061ce47a359 29
k4zuki 0:b3c8fdd01601 30 }
k4zuki 0:b3c8fdd01601 31
k4zuki 0:b3c8fdd01601 32 void AkiSpiLcd::cls()
k4zuki 0:b3c8fdd01601 33 {
k4zuki 14:812873f3a933 34 _modeflag=0;
k4zuki 14:812873f3a933 35 _clearflag=1;
k4zuki 0:b3c8fdd01601 36
k4zuki 3:f835b8daf9a0 37 _csl=1;
k4zuki 0:b3c8fdd01601 38 wait_us(5);
k4zuki 0:b3c8fdd01601 39
k4zuki 14:812873f3a933 40 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 0:b3c8fdd01601 41 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 42
k4zuki 0:b3c8fdd01601 43 wait_us(5);
k4zuki 3:f835b8daf9a0 44 _csl=0;
k4zuki 0:b3c8fdd01601 45
k4zuki 14:812873f3a933 46 cominvert();
k4zuki 0:b3c8fdd01601 47 }
k4zuki 0:b3c8fdd01601 48
k4zuki 12:30b31d87a30e 49 void AkiSpiLcd::cls_ram( int screen )
k4zuki 12:30b31d87a30e 50 {
k4zuki 12:30b31d87a30e 51 screen &=1;
k4zuki 12:30b31d87a30e 52 if(screen==SCREEN0) {
k4zuki 14:812873f3a933 53 _cls_ram( SCREEN0_BASE );
k4zuki 12:30b31d87a30e 54 } else {
k4zuki 14:812873f3a933 55 _cls_ram( SCREEN1_BASE );
k4zuki 12:30b31d87a30e 56 }
k4zuki 12:30b31d87a30e 57 }
k4zuki 12:30b31d87a30e 58
k4zuki 12:30b31d87a30e 59
k4zuki 3:f835b8daf9a0 60 void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data)
k4zuki 0:b3c8fdd01601 61 {
k4zuki 14:812873f3a933 62 _modeflag=1;
k4zuki 14:812873f3a933 63 _clearflag=0;
k4zuki 0:b3c8fdd01601 64
k4zuki 3:f835b8daf9a0 65 _csl=1;
k4zuki 11:16647ecd67ce 66 wait_us(1);
k4zuki 0:b3c8fdd01601 67
k4zuki 14:812873f3a933 68 if(line ==0)line=1;
k4zuki 14:812873f3a933 69
k4zuki 14:812873f3a933 70 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 12:30b31d87a30e 71 _spi.write((uint8_t)lcd_line[line]);
k4zuki 12:30b31d87a30e 72
k4zuki 0:b3c8fdd01601 73 for(int i=0; i<50; i++) {
k4zuki 0:b3c8fdd01601 74 _spi.write( *(data+i) );
k4zuki 0:b3c8fdd01601 75 }
k4zuki 0:b3c8fdd01601 76 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 77 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 78
k4zuki 0:b3c8fdd01601 79 wait_us(5);
k4zuki 3:f835b8daf9a0 80 _csl=0;
k4zuki 0:b3c8fdd01601 81
k4zuki 14:812873f3a933 82 cominvert();
k4zuki 0:b3c8fdd01601 83 }
k4zuki 0:b3c8fdd01601 84
k4zuki 3:f835b8daf9a0 85 void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data)
k4zuki 0:b3c8fdd01601 86 {
k4zuki 14:812873f3a933 87 _modeflag=1;
k4zuki 14:812873f3a933 88 _clearflag=0;
k4zuki 14:812873f3a933 89
k4zuki 14:812873f3a933 90 if(line==0)line=1;
k4zuki 0:b3c8fdd01601 91
k4zuki 0:b3c8fdd01601 92 if(length>0) {
k4zuki 3:f835b8daf9a0 93 _csl=1;
k4zuki 0:b3c8fdd01601 94 wait_us(5);
k4zuki 14:812873f3a933 95 for (int j=1; j<=length; j++) {
k4zuki 14:812873f3a933 96 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 11:16647ecd67ce 97 _spi.write((uint8_t)lcd_line[line]);
k4zuki 0:b3c8fdd01601 98 for(int i=0; i<50; i++) {
k4zuki 0:b3c8fdd01601 99 _spi.write( *(data+(50*j+i)) );//hogepic[50*j+i]
k4zuki 0:b3c8fdd01601 100 }
k4zuki 0:b3c8fdd01601 101 line+=1;
k4zuki 0:b3c8fdd01601 102 }
k4zuki 0:b3c8fdd01601 103 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 104 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 105 wait_us(5);
k4zuki 3:f835b8daf9a0 106 _csl=0;
k4zuki 0:b3c8fdd01601 107 }
k4zuki 14:812873f3a933 108 cominvert();
k4zuki 0:b3c8fdd01601 109 }
k4zuki 0:b3c8fdd01601 110
k4zuki 0:b3c8fdd01601 111 void AkiSpiLcd::cominvert()
k4zuki 0:b3c8fdd01601 112 {
k4zuki 14:812873f3a933 113 _modeflag=0;
k4zuki 14:812873f3a933 114 _clearflag=0;
k4zuki 0:b3c8fdd01601 115
k4zuki 3:f835b8daf9a0 116 _csl=1;
k4zuki 0:b3c8fdd01601 117
k4zuki 14:812873f3a933 118 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 0:b3c8fdd01601 119 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 120 wait_us(5);
k4zuki 3:f835b8daf9a0 121 _csl=0;
k4zuki 14:812873f3a933 122 if(_comflag == 0) {
k4zuki 14:812873f3a933 123 _comflag = 1;
k4zuki 0:b3c8fdd01601 124 } else {
k4zuki 14:812873f3a933 125 _comflag = 0;
k4zuki 0:b3c8fdd01601 126 }
k4zuki 0:b3c8fdd01601 127 }
k4zuki 14:812873f3a933 128
k4zuki 14:812873f3a933 129 /** Reads single line (16 + 400 bits = 52 bytes) from a screen
k4zuki 3:f835b8daf9a0 130 */
k4zuki 14:812873f3a933 131 void AkiSpiLcd::ramReadSingleLine(int line, uint8_t* buffer, int screen)
k4zuki 9:33d5888d1fb9 132 {
k4zuki 4:844693a617dc 133 screen &=1;
k4zuki 9:33d5888d1fb9 134 if(screen==SCREEN0) {
k4zuki 7:0c85f23a6568 135 screen=SCREEN0_BASE;
k4zuki 9:33d5888d1fb9 136 } else {
k4zuki 7:0c85f23a6568 137 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 138 }
k4zuki 14:812873f3a933 139
k4zuki 14:812873f3a933 140 line*=RAMLINE_LENGTH;
k4zuki 4:844693a617dc 141 int address=screen+line;
k4zuki 14:812873f3a933 142 ram_read(address,buffer,RAMLINE_LENGTH);
k4zuki 4:844693a617dc 143 }
k4zuki 4:844693a617dc 144
k4zuki 14:812873f3a933 145 /** Reads multi lines( (16 + 400) x N bits = 52 x N bytes) from a screen
k4zuki 9:33d5888d1fb9 146 */
k4zuki 14:812873f3a933 147 void AkiSpiLcd::ramReadMultiLine(int line, int length, uint8_t* buffer, int screen)
k4zuki 9:33d5888d1fb9 148 {
k4zuki 4:844693a617dc 149 screen &=1;
k4zuki 9:33d5888d1fb9 150 if(screen==SCREEN0) {
k4zuki 7:0c85f23a6568 151 screen=SCREEN0_BASE;
k4zuki 9:33d5888d1fb9 152 } else {
k4zuki 7:0c85f23a6568 153 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 154 }
k4zuki 14:812873f3a933 155 line*=RAMLINE_LENGTH;
k4zuki 4:844693a617dc 156 int address=screen+line;
k4zuki 14:812873f3a933 157 ram_read(address,buffer,RAMLINE_LENGTH*length);
k4zuki 4:844693a617dc 158 }
k4zuki 9:33d5888d1fb9 159
k4zuki 9:33d5888d1fb9 160 /** Writes single line (400 bits = 50 bytes) into a screen
k4zuki 9:33d5888d1fb9 161 */
k4zuki 14:812873f3a933 162 void AkiSpiLcd::ramWriteSingleLine(int line, uint8_t* data, int screen)
k4zuki 9:33d5888d1fb9 163 {
k4zuki 4:844693a617dc 164 screen &=1;
k4zuki 9:33d5888d1fb9 165 if(screen==SCREEN0) {
k4zuki 7:0c85f23a6568 166 screen=SCREEN0_BASE;
k4zuki 9:33d5888d1fb9 167 } else {
k4zuki 7:0c85f23a6568 168 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 169 }
k4zuki 14:812873f3a933 170 line--;
k4zuki 14:812873f3a933 171 line*=RAMLINE_LENGTH;
k4zuki 4:844693a617dc 172 int address=screen+line;
k4zuki 14:812873f3a933 173 ram_write(address,data,50);
k4zuki 14:812873f3a933 174 }
k4zuki 14:812873f3a933 175
k4zuki 14:812873f3a933 176 /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
k4zuki 14:812873f3a933 177 */
k4zuki 14:812873f3a933 178 void AkiSpiLcd::ramWriteMultiLine(int line, int length, uint8_t* data, int screen)
k4zuki 14:812873f3a933 179 {
k4zuki 14:812873f3a933 180 _modeflag=1;
k4zuki 14:812873f3a933 181 _clearflag=0;
k4zuki 14:812873f3a933 182 screen &=1;
k4zuki 14:812873f3a933 183 if(screen==SCREEN0) {
k4zuki 14:812873f3a933 184 screen=SCREEN0_BASE;
k4zuki 14:812873f3a933 185 } else {
k4zuki 14:812873f3a933 186 screen=SCREEN1_BASE;
k4zuki 14:812873f3a933 187 }
k4zuki 14:812873f3a933 188 // line--;
k4zuki 14:812873f3a933 189 // line*=RAMLINE_LENGTH;
k4zuki 14:812873f3a933 190
k4zuki 14:812873f3a933 191 int address=screen+line*RAMLINE_LENGTH;
k4zuki 14:812873f3a933 192 _ram_writeStatus(SEQUENTIAL_MODE);
k4zuki 14:812873f3a933 193 _ram_prepareCommand(WRITE, address);
k4zuki 14:812873f3a933 194 for(int i=0; i<length; i++) {
k4zuki 14:812873f3a933 195 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 14:812873f3a933 196 _spi.write( (uint8_t)lcd_line[line] );
k4zuki 14:812873f3a933 197 for(int j = 0; j < LINE_LENGTH; j++) {
k4zuki 14:812873f3a933 198 _spi.write(*data);
k4zuki 14:812873f3a933 199 data++;
k4zuki 4:844693a617dc 200 }
k4zuki 14:812873f3a933 201 line++;
k4zuki 4:844693a617dc 202 }
k4zuki 14:812873f3a933 203 _ram_deselect();
k4zuki 14:812873f3a933 204 _ram_writeStatus(BYTE_MODE);
k4zuki 14:812873f3a933 205 // ram_write(address,data,50*length);
k4zuki 4:844693a617dc 206 }
k4zuki 4:844693a617dc 207
k4zuki 9:33d5888d1fb9 208 /** copies whole data in screen into LCD
k4zuki 9:33d5888d1fb9 209 */
k4zuki 9:33d5888d1fb9 210 void AkiSpiLcd::ram2lcd(int startline, int length, int screen)
k4zuki 9:33d5888d1fb9 211 {
k4zuki 14:812873f3a933 212 _modeflag=1;
k4zuki 14:812873f3a933 213 _clearflag=0;
k4zuki 4:844693a617dc 214 screen &=1;
k4zuki 9:33d5888d1fb9 215 if(screen==SCREEN0) {
k4zuki 7:0c85f23a6568 216 screen=SCREEN0_BASE;
k4zuki 9:33d5888d1fb9 217 } else {
k4zuki 7:0c85f23a6568 218 screen=SCREEN1_BASE;
k4zuki 7:0c85f23a6568 219 }
k4zuki 14:812873f3a933 220 if(startline==0)startline=1;
k4zuki 14:812873f3a933 221
k4zuki 14:812873f3a933 222 if(length>0) {
k4zuki 14:812873f3a933 223
k4zuki 14:812873f3a933 224 int address=screen+startline*RAMLINE_LENGTH;
k4zuki 14:812873f3a933 225 // uint8_t dummy[RAMLINE_LENGTH+2];
k4zuki 14:812873f3a933 226 uint8_t dummy=0;
k4zuki 4:844693a617dc 227
k4zuki 14:812873f3a933 228 _ram_writeStatus(SEQUENTIAL_MODE);
k4zuki 14:812873f3a933 229 _ram_prepareCommand(READ,address);
k4zuki 14:812873f3a933 230 _csl=1;
k4zuki 14:812873f3a933 231 for(int j = 0; j <= length; j++) {
k4zuki 14:812873f3a933 232 // _csl=1;
k4zuki 14:812873f3a933 233 for(int k = 0; k < RAMLINE_LENGTH; k+=4) {
k4zuki 14:812873f3a933 234 dummy = _spi.write(0x55);
k4zuki 14:812873f3a933 235 dummy = _spi.write(0xde);
k4zuki 14:812873f3a933 236 dummy = _spi.write(0xad);
k4zuki 14:812873f3a933 237 // dummy = _spi.write(0xbe);
k4zuki 14:812873f3a933 238 // dummy = _spi.write(0xaf);
k4zuki 14:812873f3a933 239 dummy = _spi.write(0xaa);
k4zuki 14:812873f3a933 240 }
k4zuki 14:812873f3a933 241 // _csl = 0;
k4zuki 4:844693a617dc 242 }
k4zuki 4:844693a617dc 243 }
k4zuki 14:812873f3a933 244 _csl = 0;
k4zuki 14:812873f3a933 245 // _spi.write(0xde);
k4zuki 14:812873f3a933 246 // _spi.write(0xad);
k4zuki 14:812873f3a933 247 _ram_deselect();
k4zuki 14:812873f3a933 248 cominvert();
k4zuki 4:844693a617dc 249 }
k4zuki 9:33d5888d1fb9 250
k4zuki 9:33d5888d1fb9 251 uint8_t AkiSpiLcd::ram_read(int address)
k4zuki 9:33d5888d1fb9 252 {
k4zuki 14:812873f3a933 253 _ram_prepareCommand(READ, address);
k4zuki 9:33d5888d1fb9 254 int result = _spi.write(0);
k4zuki 14:812873f3a933 255 _ram_deselect();
k4zuki 9:33d5888d1fb9 256 return (uint8_t) result;
k4zuki 9:33d5888d1fb9 257 }
k4zuki 9:33d5888d1fb9 258
k4zuki 9:33d5888d1fb9 259 void AkiSpiLcd::ram_read(int address, uint8_t * buffer, int count)
k4zuki 9:33d5888d1fb9 260 {
k4zuki 14:812873f3a933 261 _ram_writeStatus(SEQUENTIAL_MODE);
k4zuki 14:812873f3a933 262 _ram_prepareCommand(READ, address);
k4zuki 9:33d5888d1fb9 263 for (int i = 0; i < count; i++) {
k4zuki 9:33d5888d1fb9 264 buffer[i] = _spi.write(0);
k4zuki 9:33d5888d1fb9 265 }
k4zuki 14:812873f3a933 266 _ram_deselect();
k4zuki 14:812873f3a933 267 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 268 }
k4zuki 9:33d5888d1fb9 269
k4zuki 9:33d5888d1fb9 270 void AkiSpiLcd::ram_write(int address, uint8_t byte)
k4zuki 9:33d5888d1fb9 271 {
k4zuki 14:812873f3a933 272 _ram_prepareCommand(WRITE, address);
k4zuki 9:33d5888d1fb9 273 _spi.write(byte);
k4zuki 14:812873f3a933 274 _ram_deselect();
k4zuki 9:33d5888d1fb9 275 }
k4zuki 9:33d5888d1fb9 276
k4zuki 9:33d5888d1fb9 277 void AkiSpiLcd::ram_write(int address, uint8_t * buffer, int count)
k4zuki 9:33d5888d1fb9 278 {
k4zuki 14:812873f3a933 279 _ram_writeStatus(SEQUENTIAL_MODE);
k4zuki 14:812873f3a933 280 _ram_prepareCommand(WRITE, address);
k4zuki 9:33d5888d1fb9 281 for (int i = 0; i < count; i++) {
k4zuki 9:33d5888d1fb9 282 _spi.write(buffer[i]);
k4zuki 9:33d5888d1fb9 283 }
k4zuki 14:812873f3a933 284 _ram_deselect();
k4zuki 14:812873f3a933 285 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 286 }
k4zuki 9:33d5888d1fb9 287
k4zuki 9:33d5888d1fb9 288 uint8_t AkiSpiLcd::ram_readStatus()
k4zuki 9:33d5888d1fb9 289 {
k4zuki 14:812873f3a933 290 _ram_select();
k4zuki 9:33d5888d1fb9 291 _spi.write(READ_STATUS);
k4zuki 9:33d5888d1fb9 292 uint8_t result = (uint8_t) _spi.write(0);
k4zuki 14:812873f3a933 293 _ram_deselect();
k4zuki 9:33d5888d1fb9 294 return result;
k4zuki 9:33d5888d1fb9 295 }
k4zuki 9:33d5888d1fb9 296
k4zuki 14:812873f3a933 297 void AkiSpiLcd::_ram_writeStatus(uint8_t status)
k4zuki 9:33d5888d1fb9 298 {
k4zuki 14:812873f3a933 299 _ram_select();
k4zuki 9:33d5888d1fb9 300 _spi.write(WRITE_STATUS);
k4zuki 9:33d5888d1fb9 301 _spi.write(status);
k4zuki 14:812873f3a933 302 _ram_deselect();
k4zuki 9:33d5888d1fb9 303 }
k4zuki 9:33d5888d1fb9 304
k4zuki 14:812873f3a933 305 void AkiSpiLcd::_ram_prepareCommand(uint8_t command, int address)
k4zuki 9:33d5888d1fb9 306 {
k4zuki 14:812873f3a933 307 _ram_select();
k4zuki 9:33d5888d1fb9 308 _spi.write(command);
k4zuki 9:33d5888d1fb9 309 _spi.write(address >> 8);
k4zuki 9:33d5888d1fb9 310 _spi.write(address & 0xFF);
k4zuki 9:33d5888d1fb9 311 }
k4zuki 9:33d5888d1fb9 312
k4zuki 14:812873f3a933 313 void AkiSpiLcd::_ram_select()
k4zuki 9:33d5888d1fb9 314 {
k4zuki 14:812873f3a933 315 _csr = 0;
k4zuki 14:812873f3a933 316 }
k4zuki 14:812873f3a933 317
k4zuki 14:812873f3a933 318 void AkiSpiLcd::_ram_deselect()
k4zuki 14:812873f3a933 319 {
k4zuki 14:812873f3a933 320 _csr = 1;
k4zuki 9:33d5888d1fb9 321 }
k4zuki 9:33d5888d1fb9 322
k4zuki 14:812873f3a933 323 void AkiSpiLcd::_cls_ram( int address )
k4zuki 9:33d5888d1fb9 324 {
k4zuki 14:812873f3a933 325 _modeflag=1;
k4zuki 14:812873f3a933 326 _clearflag=0;
k4zuki 14:812873f3a933 327 _ram_writeStatus(SEQUENTIAL_MODE);
k4zuki 14:812873f3a933 328 _ram_prepareCommand(WRITE, address);
k4zuki 14:812873f3a933 329 for (int i = 1; i <= (240); i++) {
k4zuki 14:812873f3a933 330 _spi.write( (_modeflag << 7) | (_comflag << 6) | (_clearflag << 5) );
k4zuki 14:812873f3a933 331 _spi.write( (uint8_t)lcd_line[i] );
k4zuki 14:812873f3a933 332 for(int j = 0; j < 50; j++) {
k4zuki 14:812873f3a933 333 _spi.write(0x00);
k4zuki 14:812873f3a933 334 }
k4zuki 14:812873f3a933 335
k4zuki 14:812873f3a933 336 }
k4zuki 14:812873f3a933 337 _ram_deselect();
k4zuki 14:812873f3a933 338 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 339 }