Fixes for line numbers

Fork of AkiSpiLcd by Kazuki Yamamoto

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?

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 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 }