Basic library for SHARP LCD LS027B4DH01/LS027B7DH01
Dependents: AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example
AkiSpiLcd.cpp@4:844693a617dc, 2014-08-28 (annotated)
- Committer:
- k4zuki
- Date:
- Thu Aug 28 06:26:48 2014 +0000
- Revision:
- 4:844693a617dc
- Parent:
- 3:f835b8daf9a0
- Child:
- 5:7061ce47a359
VRAM usable (Microchip 23K256)
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:f835b8daf9a0 | 11 | _csl=0; |
k4zuki | 4:844693a617dc | 12 | _csr=1; |
k4zuki | 0:b3c8fdd01601 | 13 | _spi.format(8,0); |
k4zuki | 0:b3c8fdd01601 | 14 | _spi.frequency(2000000); |
k4zuki | 0:b3c8fdd01601 | 15 | comflag = modeflag = clearflag = 0; |
k4zuki | 4:844693a617dc | 16 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 17 | _spi.write(0x02); |
k4zuki | 4:844693a617dc | 18 | _spi.write(0x60); |
k4zuki | 4:844693a617dc | 19 | _spi.write(0x00); |
k4zuki | 4:844693a617dc | 20 | for(int i=1;i<241;i++){ |
k4zuki | 4:844693a617dc | 21 | //write swapped i into RAM |
k4zuki | 4:844693a617dc | 22 | _spi.write( |
k4zuki | 4:844693a617dc | 23 | ( ( i & 0x01 ) << 7 )| |
k4zuki | 4:844693a617dc | 24 | ( ( i & 0x02 ) << 5 )| |
k4zuki | 4:844693a617dc | 25 | ( ( i & 0x04 ) << 3 )| |
k4zuki | 4:844693a617dc | 26 | ( ( i & 0x08 ) << 1 )| |
k4zuki | 4:844693a617dc | 27 | ( ( i & 0x10 ) >> 1 )| |
k4zuki | 4:844693a617dc | 28 | ( ( i & 0x20 ) >> 3 )| |
k4zuki | 4:844693a617dc | 29 | ( ( i & 0x40 ) >> 5 )| |
k4zuki | 4:844693a617dc | 30 | ( ( i & 0x80 ) >> 7 ) |
k4zuki | 4:844693a617dc | 31 | ); |
k4zuki | 4:844693a617dc | 32 | _csr=1; |
k4zuki | 4:844693a617dc | 33 | } |
k4zuki | 0:b3c8fdd01601 | 34 | } |
k4zuki | 0:b3c8fdd01601 | 35 | |
k4zuki | 0:b3c8fdd01601 | 36 | void AkiSpiLcd::cls() |
k4zuki | 0:b3c8fdd01601 | 37 | { |
k4zuki | 0:b3c8fdd01601 | 38 | modeflag=0; |
k4zuki | 0:b3c8fdd01601 | 39 | clearflag=1; |
k4zuki | 0:b3c8fdd01601 | 40 | |
k4zuki | 3:f835b8daf9a0 | 41 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 42 | wait_us(5); |
k4zuki | 0:b3c8fdd01601 | 43 | |
k4zuki | 0:b3c8fdd01601 | 44 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 0:b3c8fdd01601 | 45 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 46 | |
k4zuki | 0:b3c8fdd01601 | 47 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 48 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 49 | |
k4zuki | 0:b3c8fdd01601 | 50 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 51 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 52 | } else { |
k4zuki | 0:b3c8fdd01601 | 53 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 54 | } |
k4zuki | 0:b3c8fdd01601 | 55 | } |
k4zuki | 0:b3c8fdd01601 | 56 | |
k4zuki | 3:f835b8daf9a0 | 57 | void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data) |
k4zuki | 0:b3c8fdd01601 | 58 | { |
k4zuki | 0:b3c8fdd01601 | 59 | modeflag=1; |
k4zuki | 0:b3c8fdd01601 | 60 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 61 | |
k4zuki | 3:f835b8daf9a0 | 62 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 63 | wait_us(5); |
k4zuki | 0:b3c8fdd01601 | 64 | |
k4zuki | 0:b3c8fdd01601 | 65 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 3:f835b8daf9a0 | 66 | |
k4zuki | 0:b3c8fdd01601 | 67 | _spi.write( |
k4zuki | 0:b3c8fdd01601 | 68 | ( ( (line+1) & 0x01 ) << 7 )| |
k4zuki | 0:b3c8fdd01601 | 69 | ( ( (line+1) & 0x02 ) << 5 )| |
k4zuki | 0:b3c8fdd01601 | 70 | ( ( (line+1) & 0x04 ) << 3 )| |
k4zuki | 0:b3c8fdd01601 | 71 | ( ( (line+1) & 0x08 ) << 1 )| |
k4zuki | 0:b3c8fdd01601 | 72 | ( ( (line+1) & 0x10 ) >> 1 )| |
k4zuki | 0:b3c8fdd01601 | 73 | ( ( (line+1) & 0x20 ) >> 3 )| |
k4zuki | 0:b3c8fdd01601 | 74 | ( ( (line+1) & 0x40 ) >> 5 )| |
k4zuki | 0:b3c8fdd01601 | 75 | ( ( (line+1) & 0x80 ) >> 7 ) |
k4zuki | 0:b3c8fdd01601 | 76 | ); |
k4zuki | 0:b3c8fdd01601 | 77 | for(int i=0; i<50; i++) { |
k4zuki | 0:b3c8fdd01601 | 78 | _spi.write( *(data+i) ); |
k4zuki | 0:b3c8fdd01601 | 79 | } |
k4zuki | 0:b3c8fdd01601 | 80 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 81 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 82 | |
k4zuki | 0:b3c8fdd01601 | 83 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 84 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 85 | |
k4zuki | 0:b3c8fdd01601 | 86 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 87 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 88 | } else { |
k4zuki | 0:b3c8fdd01601 | 89 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 90 | } |
k4zuki | 0:b3c8fdd01601 | 91 | } |
k4zuki | 0:b3c8fdd01601 | 92 | |
k4zuki | 3:f835b8daf9a0 | 93 | void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data) |
k4zuki | 0:b3c8fdd01601 | 94 | { |
k4zuki | 0:b3c8fdd01601 | 95 | modeflag=1; |
k4zuki | 0:b3c8fdd01601 | 96 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 97 | |
k4zuki | 0:b3c8fdd01601 | 98 | if(length>0) { |
k4zuki | 3:f835b8daf9a0 | 99 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 100 | wait_us(5); |
k4zuki | 0:b3c8fdd01601 | 101 | for (int j=0; j<length; j++) { |
k4zuki | 0:b3c8fdd01601 | 102 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 0:b3c8fdd01601 | 103 | _spi.write( |
k4zuki | 0:b3c8fdd01601 | 104 | ( ( (line+1) & 0x01 ) << 7 )| |
k4zuki | 0:b3c8fdd01601 | 105 | ( ( (line+1) & 0x02 ) << 5 )| |
k4zuki | 0:b3c8fdd01601 | 106 | ( ( (line+1) & 0x04 ) << 3 )| |
k4zuki | 0:b3c8fdd01601 | 107 | ( ( (line+1) & 0x08 ) << 1 )| |
k4zuki | 0:b3c8fdd01601 | 108 | ( ( (line+1) & 0x10 ) >> 1 )| |
k4zuki | 0:b3c8fdd01601 | 109 | ( ( (line+1) & 0x20 ) >> 3 )| |
k4zuki | 0:b3c8fdd01601 | 110 | ( ( (line+1) & 0x40 ) >> 5 )| |
k4zuki | 0:b3c8fdd01601 | 111 | ( ( (line+1) & 0x80 ) >> 7 ) |
k4zuki | 0:b3c8fdd01601 | 112 | ); |
k4zuki | 0:b3c8fdd01601 | 113 | |
k4zuki | 0:b3c8fdd01601 | 114 | for(int i=0; i<50; i++) { |
k4zuki | 0:b3c8fdd01601 | 115 | _spi.write( *(data+(50*j+i)) );//hogepic[50*j+i] |
k4zuki | 0:b3c8fdd01601 | 116 | } |
k4zuki | 0:b3c8fdd01601 | 117 | line+=1; |
k4zuki | 0:b3c8fdd01601 | 118 | } |
k4zuki | 0:b3c8fdd01601 | 119 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 120 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 121 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 122 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 123 | } |
k4zuki | 0:b3c8fdd01601 | 124 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 125 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 126 | } else { |
k4zuki | 0:b3c8fdd01601 | 127 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 128 | } |
k4zuki | 0:b3c8fdd01601 | 129 | } |
k4zuki | 0:b3c8fdd01601 | 130 | |
k4zuki | 0:b3c8fdd01601 | 131 | void AkiSpiLcd::cominvert() |
k4zuki | 0:b3c8fdd01601 | 132 | { |
k4zuki | 0:b3c8fdd01601 | 133 | modeflag=0; |
k4zuki | 0:b3c8fdd01601 | 134 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 135 | |
k4zuki | 3:f835b8daf9a0 | 136 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 137 | |
k4zuki | 0:b3c8fdd01601 | 138 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 0:b3c8fdd01601 | 139 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 140 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 141 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 142 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 143 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 144 | } else { |
k4zuki | 0:b3c8fdd01601 | 145 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 146 | } |
k4zuki | 0:b3c8fdd01601 | 147 | } |
k4zuki | 3:f835b8daf9a0 | 148 | /* |
k4zuki | 0:b3c8fdd01601 | 149 | void AkiSpiLcd::dispOn(bool disp) |
k4zuki | 0:b3c8fdd01601 | 150 | { |
k4zuki | 0:b3c8fdd01601 | 151 | if(disp) { |
k4zuki | 3:f835b8daf9a0 | 152 | _csr=1; |
k4zuki | 0:b3c8fdd01601 | 153 | } else { |
k4zuki | 3:f835b8daf9a0 | 154 | _csr=0; |
k4zuki | 0:b3c8fdd01601 | 155 | } |
k4zuki | 0:b3c8fdd01601 | 156 | } |
k4zuki | 3:f835b8daf9a0 | 157 | */ |
k4zuki | 4:844693a617dc | 158 | |
k4zuki | 4:844693a617dc | 159 | /** Reads single line (400 bits = 50 bytes) from a screen |
k4zuki | 4:844693a617dc | 160 | */ |
k4zuki | 4:844693a617dc | 161 | void AkiSpiLcd::ramReadSingle(int line, uint8_t* buffer, int screen){ |
k4zuki | 4:844693a617dc | 162 | screen &=1; |
k4zuki | 4:844693a617dc | 163 | screen<<=7; |
k4zuki | 4:844693a617dc | 164 | // uint8_t buffer[50]; |
k4zuki | 4:844693a617dc | 165 | line*=50; |
k4zuki | 4:844693a617dc | 166 | int address=screen+line; |
k4zuki | 4:844693a617dc | 167 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 168 | _spi.write(0x03); |
k4zuki | 4:844693a617dc | 169 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 170 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 171 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 172 | *(buffer+i)=_spi.write(0xaa); |
k4zuki | 4:844693a617dc | 173 | } |
k4zuki | 4:844693a617dc | 174 | _csr=1; |
k4zuki | 4:844693a617dc | 175 | // return buffer; |
k4zuki | 4:844693a617dc | 176 | } |
k4zuki | 4:844693a617dc | 177 | |
k4zuki | 4:844693a617dc | 178 | /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen |
k4zuki | 4:844693a617dc | 179 | */ |
k4zuki | 4:844693a617dc | 180 | void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen){ |
k4zuki | 4:844693a617dc | 181 | screen &=1; |
k4zuki | 4:844693a617dc | 182 | screen<<=7; |
k4zuki | 4:844693a617dc | 183 | line*=50; |
k4zuki | 4:844693a617dc | 184 | int address=screen+line; |
k4zuki | 4:844693a617dc | 185 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 186 | _spi.write(0x03); |
k4zuki | 4:844693a617dc | 187 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 188 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 189 | for(int j=0;j<length;j++){ |
k4zuki | 4:844693a617dc | 190 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 191 | *(buffer+i)=_spi.write(0xaa); |
k4zuki | 4:844693a617dc | 192 | } |
k4zuki | 4:844693a617dc | 193 | } |
k4zuki | 4:844693a617dc | 194 | _csr=1; |
k4zuki | 4:844693a617dc | 195 | // return buffer; |
k4zuki | 4:844693a617dc | 196 | } |
k4zuki | 4:844693a617dc | 197 | |
k4zuki | 4:844693a617dc | 198 | /** Writes single line (400 bits = 50 bytes) into a screen |
k4zuki | 4:844693a617dc | 199 | */ |
k4zuki | 4:844693a617dc | 200 | void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen){ |
k4zuki | 4:844693a617dc | 201 | screen &=1; |
k4zuki | 4:844693a617dc | 202 | screen<<=7; |
k4zuki | 4:844693a617dc | 203 | line*=50; |
k4zuki | 4:844693a617dc | 204 | int address=screen+line; |
k4zuki | 4:844693a617dc | 205 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 206 | _spi.write(0x02); |
k4zuki | 4:844693a617dc | 207 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 208 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 209 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 210 | _spi.write(*(data+i)); |
k4zuki | 4:844693a617dc | 211 | } |
k4zuki | 4:844693a617dc | 212 | _csr=1; |
k4zuki | 4:844693a617dc | 213 | } |
k4zuki | 4:844693a617dc | 214 | |
k4zuki | 4:844693a617dc | 215 | /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen |
k4zuki | 4:844693a617dc | 216 | */ |
k4zuki | 4:844693a617dc | 217 | void AkiSpiLcd::ramWriteMulti(int line, int length, uint8_t* data, int screen){ |
k4zuki | 4:844693a617dc | 218 | screen &=1; |
k4zuki | 4:844693a617dc | 219 | screen<<=7; |
k4zuki | 4:844693a617dc | 220 | line*=50; |
k4zuki | 4:844693a617dc | 221 | |
k4zuki | 4:844693a617dc | 222 | int address=screen+line; |
k4zuki | 4:844693a617dc | 223 | |
k4zuki | 4:844693a617dc | 224 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 225 | _spi.write(0x02); |
k4zuki | 4:844693a617dc | 226 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 227 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 228 | for(int j=0;j<length;j++){ |
k4zuki | 4:844693a617dc | 229 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 230 | _spi.write(*(data+j*50+i)); |
k4zuki | 4:844693a617dc | 231 | } |
k4zuki | 4:844693a617dc | 232 | } |
k4zuki | 4:844693a617dc | 233 | _csr=1; |
k4zuki | 4:844693a617dc | 234 | } |
k4zuki | 4:844693a617dc | 235 | |
k4zuki | 4:844693a617dc | 236 | /** copies whole data in screen into LCD |
k4zuki | 4:844693a617dc | 237 | */ |
k4zuki | 4:844693a617dc | 238 | void AkiSpiLcd::ram2lcd(int screen){ |
k4zuki | 4:844693a617dc | 239 | screen &=1; |
k4zuki | 4:844693a617dc | 240 | screen<<=7; |
k4zuki | 4:844693a617dc | 241 | |
k4zuki | 4:844693a617dc | 242 | int address=screen; |
k4zuki | 4:844693a617dc | 243 | int dummy=0; |
k4zuki | 4:844693a617dc | 244 | |
k4zuki | 4:844693a617dc | 245 | _csl=1; |
k4zuki | 4:844693a617dc | 246 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 247 | _spi.write(0x03); |
k4zuki | 4:844693a617dc | 248 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 249 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 250 | for(int j=0;j<240;j++){ |
k4zuki | 4:844693a617dc | 251 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 252 | dummy=_spi.write(0xaa); |
k4zuki | 4:844693a617dc | 253 | } |
k4zuki | 4:844693a617dc | 254 | } |
k4zuki | 4:844693a617dc | 255 | _spi.write(0x00); |
k4zuki | 4:844693a617dc | 256 | _spi.write(0x00); |
k4zuki | 4:844693a617dc | 257 | _csr=1; |
k4zuki | 4:844693a617dc | 258 | wait_us(5); |
k4zuki | 4:844693a617dc | 259 | _csl=0; |
k4zuki | 4:844693a617dc | 260 | } |