Basic library for SHARP LCD LS027B4DH01/LS027B7DH01
Dependents: AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example
AkiSpiLcd.cpp@12:30b31d87a30e, 2014-09-29 (annotated)
- Committer:
- k4zuki
- Date:
- Mon Sep 29 02:23:41 2014 +0000
- Revision:
- 12:30b31d87a30e
- Parent:
- 11:16647ecd67ce
- Child:
- 14:812873f3a933
added cls_ram( int screen )
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 | 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 | 9:33d5888d1fb9 | 13 | // Ser23K256 _ram(_spi,csr); |
k4zuki | 3:f835b8daf9a0 | 14 | _csl=0; |
k4zuki | 4:844693a617dc | 15 | _csr=1; |
k4zuki | 0:b3c8fdd01601 | 16 | _spi.format(8,0); |
k4zuki | 10:eed99ef09e63 | 17 | _spi.frequency(10000000); |
k4zuki | 0:b3c8fdd01601 | 18 | comflag = modeflag = clearflag = 0; |
k4zuki | 12:30b31d87a30e | 19 | |
k4zuki | 10:eed99ef09e63 | 20 | uint8_t data[240]; |
k4zuki | 9:33d5888d1fb9 | 21 | for(int i=0; i<240; i++) { |
k4zuki | 11:16647ecd67ce | 22 | data[i]=(uint8_t)lcd_line[i]; |
k4zuki | 11:16647ecd67ce | 23 | /*( ( (i+1) & 0x01 ) << 7 )| |
k4zuki | 10:eed99ef09e63 | 24 | ( ( (i+1) & 0x02 ) << 5 )| |
k4zuki | 10:eed99ef09e63 | 25 | ( ( (i+1) & 0x04 ) << 3 )| |
k4zuki | 10:eed99ef09e63 | 26 | ( ( (i+1) & 0x08 ) << 1 )| |
k4zuki | 10:eed99ef09e63 | 27 | ( ( (i+1) & 0x10 ) >> 1 )| |
k4zuki | 10:eed99ef09e63 | 28 | ( ( (i+1) & 0x20 ) >> 3 )| |
k4zuki | 10:eed99ef09e63 | 29 | ( ( (i+1) & 0x40 ) >> 5 )| |
k4zuki | 10:eed99ef09e63 | 30 | ( ( (i+1) & 0x80 ) >> 7 ); |
k4zuki | 12:30b31d87a30e | 31 | */ |
k4zuki | 4:844693a617dc | 32 | } |
k4zuki | 10:eed99ef09e63 | 33 | ram_write(RAMLINE_BASE,data,240); |
k4zuki | 10:eed99ef09e63 | 34 | uint8_t buffer[4] = {0,0,0,0}; |
k4zuki | 10:eed99ef09e63 | 35 | ram_write(RAMMODE_BASE,buffer,4); |
k4zuki | 5:7061ce47a359 | 36 | |
k4zuki | 0:b3c8fdd01601 | 37 | } |
k4zuki | 0:b3c8fdd01601 | 38 | |
k4zuki | 0:b3c8fdd01601 | 39 | void AkiSpiLcd::cls() |
k4zuki | 0:b3c8fdd01601 | 40 | { |
k4zuki | 0:b3c8fdd01601 | 41 | modeflag=0; |
k4zuki | 0:b3c8fdd01601 | 42 | clearflag=1; |
k4zuki | 0:b3c8fdd01601 | 43 | |
k4zuki | 3:f835b8daf9a0 | 44 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 45 | wait_us(5); |
k4zuki | 0:b3c8fdd01601 | 46 | |
k4zuki | 0:b3c8fdd01601 | 47 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 0:b3c8fdd01601 | 48 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 49 | |
k4zuki | 0:b3c8fdd01601 | 50 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 51 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 52 | |
k4zuki | 0:b3c8fdd01601 | 53 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 54 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 55 | } else { |
k4zuki | 0:b3c8fdd01601 | 56 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 57 | } |
k4zuki | 0:b3c8fdd01601 | 58 | } |
k4zuki | 0:b3c8fdd01601 | 59 | |
k4zuki | 12:30b31d87a30e | 60 | void AkiSpiLcd::cls_ram( int screen ) |
k4zuki | 12:30b31d87a30e | 61 | { |
k4zuki | 12:30b31d87a30e | 62 | screen &=1; |
k4zuki | 12:30b31d87a30e | 63 | if(screen==SCREEN0) { |
k4zuki | 12:30b31d87a30e | 64 | screen=SCREEN0_BASE; |
k4zuki | 12:30b31d87a30e | 65 | } else { |
k4zuki | 12:30b31d87a30e | 66 | screen=SCREEN1_BASE; |
k4zuki | 12:30b31d87a30e | 67 | } |
k4zuki | 12:30b31d87a30e | 68 | |
k4zuki | 12:30b31d87a30e | 69 | ram_writeStatus(SEQUENTIAL_MODE); |
k4zuki | 12:30b31d87a30e | 70 | ram_prepareCommand(WRITE, screen); |
k4zuki | 12:30b31d87a30e | 71 | for (int i = 0; i < (50*240); i++) { |
k4zuki | 12:30b31d87a30e | 72 | _spi.write(0x00); |
k4zuki | 12:30b31d87a30e | 73 | } |
k4zuki | 12:30b31d87a30e | 74 | ram_deselect(); |
k4zuki | 12:30b31d87a30e | 75 | ram_writeStatus(BYTE_MODE); |
k4zuki | 12:30b31d87a30e | 76 | } |
k4zuki | 12:30b31d87a30e | 77 | |
k4zuki | 12:30b31d87a30e | 78 | |
k4zuki | 3:f835b8daf9a0 | 79 | void AkiSpiLcd::directUpdateSingle(int line, uint8_t* data) |
k4zuki | 0:b3c8fdd01601 | 80 | { |
k4zuki | 0:b3c8fdd01601 | 81 | modeflag=1; |
k4zuki | 0:b3c8fdd01601 | 82 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 83 | |
k4zuki | 3:f835b8daf9a0 | 84 | _csl=1; |
k4zuki | 11:16647ecd67ce | 85 | wait_us(1); |
k4zuki | 0:b3c8fdd01601 | 86 | |
k4zuki | 0:b3c8fdd01601 | 87 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 12:30b31d87a30e | 88 | _spi.write((uint8_t)lcd_line[line]); |
k4zuki | 12:30b31d87a30e | 89 | /* |
k4zuki | 12:30b31d87a30e | 90 | _spi.write( |
k4zuki | 12:30b31d87a30e | 91 | ( ( (line+1) & 0x01 ) << 7 )| |
k4zuki | 12:30b31d87a30e | 92 | ( ( (line+1) & 0x02 ) << 5 )| |
k4zuki | 12:30b31d87a30e | 93 | ( ( (line+1) & 0x04 ) << 3 )| |
k4zuki | 12:30b31d87a30e | 94 | ( ( (line+1) & 0x08 ) << 1 )| |
k4zuki | 12:30b31d87a30e | 95 | ( ( (line+1) & 0x10 ) >> 1 )| |
k4zuki | 12:30b31d87a30e | 96 | ( ( (line+1) & 0x20 ) >> 3 )| |
k4zuki | 12:30b31d87a30e | 97 | ( ( (line+1) & 0x40 ) >> 5 )| |
k4zuki | 12:30b31d87a30e | 98 | ( ( (line+1) & 0x80 ) >> 7 ) |
k4zuki | 12:30b31d87a30e | 99 | );*/ |
k4zuki | 12:30b31d87a30e | 100 | |
k4zuki | 0:b3c8fdd01601 | 101 | for(int i=0; i<50; i++) { |
k4zuki | 0:b3c8fdd01601 | 102 | _spi.write( *(data+i) ); |
k4zuki | 0:b3c8fdd01601 | 103 | } |
k4zuki | 0:b3c8fdd01601 | 104 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 105 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 106 | |
k4zuki | 0:b3c8fdd01601 | 107 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 108 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 109 | |
k4zuki | 0:b3c8fdd01601 | 110 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 111 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 112 | } else { |
k4zuki | 0:b3c8fdd01601 | 113 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 114 | } |
k4zuki | 0:b3c8fdd01601 | 115 | } |
k4zuki | 0:b3c8fdd01601 | 116 | |
k4zuki | 3:f835b8daf9a0 | 117 | void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t* data) |
k4zuki | 0:b3c8fdd01601 | 118 | { |
k4zuki | 0:b3c8fdd01601 | 119 | modeflag=1; |
k4zuki | 0:b3c8fdd01601 | 120 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 121 | |
k4zuki | 0:b3c8fdd01601 | 122 | if(length>0) { |
k4zuki | 3:f835b8daf9a0 | 123 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 124 | wait_us(5); |
k4zuki | 0:b3c8fdd01601 | 125 | for (int j=0; j<length; j++) { |
k4zuki | 0:b3c8fdd01601 | 126 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 11:16647ecd67ce | 127 | _spi.write((uint8_t)lcd_line[line]); |
k4zuki | 12:30b31d87a30e | 128 | /* _spi.write( |
k4zuki | 12:30b31d87a30e | 129 | ( ( (line+1) & 0x01 ) << 7 )| |
k4zuki | 12:30b31d87a30e | 130 | ( ( (line+1) & 0x02 ) << 5 )| |
k4zuki | 12:30b31d87a30e | 131 | ( ( (line+1) & 0x04 ) << 3 )| |
k4zuki | 12:30b31d87a30e | 132 | ( ( (line+1) & 0x08 ) << 1 )| |
k4zuki | 12:30b31d87a30e | 133 | ( ( (line+1) & 0x10 ) >> 1 )| |
k4zuki | 12:30b31d87a30e | 134 | ( ( (line+1) & 0x20 ) >> 3 )| |
k4zuki | 12:30b31d87a30e | 135 | ( ( (line+1) & 0x40 ) >> 5 )| |
k4zuki | 12:30b31d87a30e | 136 | ( ( (line+1) & 0x80 ) >> 7 ) |
k4zuki | 12:30b31d87a30e | 137 | ); |
k4zuki | 12:30b31d87a30e | 138 | */ |
k4zuki | 0:b3c8fdd01601 | 139 | for(int i=0; i<50; i++) { |
k4zuki | 0:b3c8fdd01601 | 140 | _spi.write( *(data+(50*j+i)) );//hogepic[50*j+i] |
k4zuki | 0:b3c8fdd01601 | 141 | } |
k4zuki | 0:b3c8fdd01601 | 142 | line+=1; |
k4zuki | 0:b3c8fdd01601 | 143 | } |
k4zuki | 0:b3c8fdd01601 | 144 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 145 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 146 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 147 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 148 | } |
k4zuki | 0:b3c8fdd01601 | 149 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 150 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 151 | } else { |
k4zuki | 0:b3c8fdd01601 | 152 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 153 | } |
k4zuki | 0:b3c8fdd01601 | 154 | } |
k4zuki | 0:b3c8fdd01601 | 155 | |
k4zuki | 0:b3c8fdd01601 | 156 | void AkiSpiLcd::cominvert() |
k4zuki | 0:b3c8fdd01601 | 157 | { |
k4zuki | 0:b3c8fdd01601 | 158 | modeflag=0; |
k4zuki | 0:b3c8fdd01601 | 159 | clearflag=0; |
k4zuki | 0:b3c8fdd01601 | 160 | |
k4zuki | 3:f835b8daf9a0 | 161 | _csl=1; |
k4zuki | 0:b3c8fdd01601 | 162 | |
k4zuki | 0:b3c8fdd01601 | 163 | _spi.write( (modeflag << 7) | (comflag << 6) | (clearflag << 5) ); |
k4zuki | 0:b3c8fdd01601 | 164 | _spi.write(0x00); |
k4zuki | 0:b3c8fdd01601 | 165 | wait_us(5); |
k4zuki | 3:f835b8daf9a0 | 166 | _csl=0; |
k4zuki | 0:b3c8fdd01601 | 167 | if(comflag == 0) { |
k4zuki | 0:b3c8fdd01601 | 168 | comflag = 1; |
k4zuki | 0:b3c8fdd01601 | 169 | } else { |
k4zuki | 0:b3c8fdd01601 | 170 | comflag = 0; |
k4zuki | 0:b3c8fdd01601 | 171 | } |
k4zuki | 0:b3c8fdd01601 | 172 | } |
k4zuki | 3:f835b8daf9a0 | 173 | /* |
k4zuki | 0:b3c8fdd01601 | 174 | void AkiSpiLcd::dispOn(bool disp) |
k4zuki | 0:b3c8fdd01601 | 175 | { |
k4zuki | 0:b3c8fdd01601 | 176 | if(disp) { |
k4zuki | 3:f835b8daf9a0 | 177 | _csr=1; |
k4zuki | 0:b3c8fdd01601 | 178 | } else { |
k4zuki | 3:f835b8daf9a0 | 179 | _csr=0; |
k4zuki | 0:b3c8fdd01601 | 180 | } |
k4zuki | 0:b3c8fdd01601 | 181 | } |
k4zuki | 3:f835b8daf9a0 | 182 | */ |
k4zuki | 4:844693a617dc | 183 | |
k4zuki | 9:33d5888d1fb9 | 184 | /** Reads single line (400 bits = 50 bytes) from a screen |
k4zuki | 9:33d5888d1fb9 | 185 | */ |
k4zuki | 9:33d5888d1fb9 | 186 | void AkiSpiLcd::ramReadSingle(int line, uint8_t* buffer, int screen) |
k4zuki | 9:33d5888d1fb9 | 187 | { |
k4zuki | 4:844693a617dc | 188 | screen &=1; |
k4zuki | 9:33d5888d1fb9 | 189 | if(screen==SCREEN0) { |
k4zuki | 7:0c85f23a6568 | 190 | screen=SCREEN0_BASE; |
k4zuki | 9:33d5888d1fb9 | 191 | } else { |
k4zuki | 7:0c85f23a6568 | 192 | screen=SCREEN1_BASE; |
k4zuki | 7:0c85f23a6568 | 193 | } |
k4zuki | 4:844693a617dc | 194 | // uint8_t buffer[50]; |
k4zuki | 4:844693a617dc | 195 | line*=50; |
k4zuki | 4:844693a617dc | 196 | int address=screen+line; |
k4zuki | 9:33d5888d1fb9 | 197 | ram_read(address,buffer,50); |
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 i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 204 | *(buffer+i)=_spi.write(0xaa); |
k4zuki | 4:844693a617dc | 205 | } |
k4zuki | 4:844693a617dc | 206 | _csr=1; |
k4zuki | 5:7061ce47a359 | 207 | */ |
k4zuki | 4:844693a617dc | 208 | // return buffer; |
k4zuki | 4:844693a617dc | 209 | } |
k4zuki | 4:844693a617dc | 210 | |
k4zuki | 9:33d5888d1fb9 | 211 | /** Reads multi lines(400 x N bits = 50 x N bytes) from a screen |
k4zuki | 9:33d5888d1fb9 | 212 | */ |
k4zuki | 9:33d5888d1fb9 | 213 | void AkiSpiLcd::ramReadMulti(int line, int length, uint8_t* buffer, int screen) |
k4zuki | 9:33d5888d1fb9 | 214 | { |
k4zuki | 4:844693a617dc | 215 | screen &=1; |
k4zuki | 9:33d5888d1fb9 | 216 | if(screen==SCREEN0) { |
k4zuki | 7:0c85f23a6568 | 217 | screen=SCREEN0_BASE; |
k4zuki | 9:33d5888d1fb9 | 218 | } else { |
k4zuki | 7:0c85f23a6568 | 219 | screen=SCREEN1_BASE; |
k4zuki | 7:0c85f23a6568 | 220 | } |
k4zuki | 4:844693a617dc | 221 | line*=50; |
k4zuki | 4:844693a617dc | 222 | int address=screen+line; |
k4zuki | 5:7061ce47a359 | 223 | // for(int j=0;j<length;j++){ |
k4zuki | 9:33d5888d1fb9 | 224 | ram_read(address,buffer,50*length); |
k4zuki | 5:7061ce47a359 | 225 | // } |
k4zuki | 5:7061ce47a359 | 226 | /* |
k4zuki | 4:844693a617dc | 227 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 228 | _spi.write(0x03); |
k4zuki | 4:844693a617dc | 229 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 230 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 231 | for(int j=0;j<length;j++){ |
k4zuki | 4:844693a617dc | 232 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 233 | *(buffer+i)=_spi.write(0xaa); |
k4zuki | 4:844693a617dc | 234 | } |
k4zuki | 4:844693a617dc | 235 | } |
k4zuki | 4:844693a617dc | 236 | _csr=1; |
k4zuki | 5:7061ce47a359 | 237 | */ |
k4zuki | 4:844693a617dc | 238 | // return buffer; |
k4zuki | 4:844693a617dc | 239 | } |
k4zuki | 9:33d5888d1fb9 | 240 | |
k4zuki | 9:33d5888d1fb9 | 241 | /** Writes single line (400 bits = 50 bytes) into a screen |
k4zuki | 9:33d5888d1fb9 | 242 | */ |
k4zuki | 9:33d5888d1fb9 | 243 | void AkiSpiLcd::ramWriteSingle(int line, uint8_t* data, int screen) |
k4zuki | 9:33d5888d1fb9 | 244 | { |
k4zuki | 4:844693a617dc | 245 | screen &=1; |
k4zuki | 9:33d5888d1fb9 | 246 | if(screen==SCREEN0) { |
k4zuki | 7:0c85f23a6568 | 247 | screen=SCREEN0_BASE; |
k4zuki | 9:33d5888d1fb9 | 248 | } else { |
k4zuki | 7:0c85f23a6568 | 249 | screen=SCREEN1_BASE; |
k4zuki | 7:0c85f23a6568 | 250 | } |
k4zuki | 4:844693a617dc | 251 | line*=50; |
k4zuki | 4:844693a617dc | 252 | int address=screen+line; |
k4zuki | 9:33d5888d1fb9 | 253 | ram_write(address,data,50); |
k4zuki | 9:33d5888d1fb9 | 254 | |
k4zuki | 4:844693a617dc | 255 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 256 | _spi.write(0x02); |
k4zuki | 4:844693a617dc | 257 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 258 | _spi.write(address&0xff); |
k4zuki | 9:33d5888d1fb9 | 259 | for(int i=0; i<50; i++) { |
k4zuki | 4:844693a617dc | 260 | _spi.write(*(data+i)); |
k4zuki | 4:844693a617dc | 261 | } |
k4zuki | 4:844693a617dc | 262 | _csr=1; |
k4zuki | 4:844693a617dc | 263 | } |
k4zuki | 4:844693a617dc | 264 | |
k4zuki | 9:33d5888d1fb9 | 265 | /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen |
k4zuki | 9:33d5888d1fb9 | 266 | */ |
k4zuki | 9:33d5888d1fb9 | 267 | void AkiSpiLcd::ramWriteMulti(int line, int length, uint8_t* data, int screen) |
k4zuki | 9:33d5888d1fb9 | 268 | { |
k4zuki | 4:844693a617dc | 269 | screen &=1; |
k4zuki | 9:33d5888d1fb9 | 270 | if(screen==SCREEN0) { |
k4zuki | 7:0c85f23a6568 | 271 | screen=SCREEN0_BASE; |
k4zuki | 9:33d5888d1fb9 | 272 | } else { |
k4zuki | 7:0c85f23a6568 | 273 | screen=SCREEN1_BASE; |
k4zuki | 7:0c85f23a6568 | 274 | } |
k4zuki | 4:844693a617dc | 275 | line*=50; |
k4zuki | 9:33d5888d1fb9 | 276 | |
k4zuki | 4:844693a617dc | 277 | int address=screen+line; |
k4zuki | 9:33d5888d1fb9 | 278 | ram_write(address,data,50*length); |
k4zuki | 5:7061ce47a359 | 279 | /* |
k4zuki | 4:844693a617dc | 280 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 281 | _spi.write(0x02); |
k4zuki | 4:844693a617dc | 282 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 283 | _spi.write(address&0xff); |
k4zuki | 4:844693a617dc | 284 | for(int j=0;j<length;j++){ |
k4zuki | 4:844693a617dc | 285 | for(int i=0;i<50;i++){ |
k4zuki | 4:844693a617dc | 286 | _spi.write(*(data+j*50+i)); |
k4zuki | 4:844693a617dc | 287 | } |
k4zuki | 4:844693a617dc | 288 | } |
k4zuki | 4:844693a617dc | 289 | _csr=1; |
k4zuki | 5:7061ce47a359 | 290 | */ |
k4zuki | 4:844693a617dc | 291 | } |
k4zuki | 4:844693a617dc | 292 | |
k4zuki | 9:33d5888d1fb9 | 293 | /** copies whole data in screen into LCD |
k4zuki | 9:33d5888d1fb9 | 294 | */ |
k4zuki | 9:33d5888d1fb9 | 295 | void AkiSpiLcd::ram2lcd(int startline, int length, int screen) |
k4zuki | 9:33d5888d1fb9 | 296 | { |
k4zuki | 4:844693a617dc | 297 | screen &=1; |
k4zuki | 9:33d5888d1fb9 | 298 | if(screen==SCREEN0) { |
k4zuki | 7:0c85f23a6568 | 299 | screen=SCREEN0_BASE; |
k4zuki | 9:33d5888d1fb9 | 300 | } else { |
k4zuki | 7:0c85f23a6568 | 301 | screen=SCREEN1_BASE; |
k4zuki | 7:0c85f23a6568 | 302 | } |
k4zuki | 7:0c85f23a6568 | 303 | // screen<<=7; |
k4zuki | 4:844693a617dc | 304 | |
k4zuki | 7:0c85f23a6568 | 305 | int address=screen+length*50; |
k4zuki | 7:0c85f23a6568 | 306 | uint8_t dummy[50]; |
k4zuki | 5:7061ce47a359 | 307 | /* |
k4zuki | 4:844693a617dc | 308 | _csr=0; //select VRAM |
k4zuki | 4:844693a617dc | 309 | _spi.write(0x03); |
k4zuki | 4:844693a617dc | 310 | _spi.write(address>>8); |
k4zuki | 4:844693a617dc | 311 | _spi.write(address&0xff); |
k4zuki | 5:7061ce47a359 | 312 | */ |
k4zuki | 9:33d5888d1fb9 | 313 | ram_write(RAMMODE_BASE,(modeflag << 7) | (comflag << 6) | (clearflag << 5)); |
k4zuki | 9:33d5888d1fb9 | 314 | _csl=1; |
k4zuki | 9:33d5888d1fb9 | 315 | for(int j=0; j<length; j++) { |
k4zuki | 9:33d5888d1fb9 | 316 | ram_read(RAMMODE_BASE); |
k4zuki | 9:33d5888d1fb9 | 317 | ram_read(RAMLINE_BASE+startline); |
k4zuki | 9:33d5888d1fb9 | 318 | ram_read(address+50*j,dummy,50); |
k4zuki | 9:33d5888d1fb9 | 319 | ram_read(RAMMODE_BASE+2,dummy,2); |
k4zuki | 5:7061ce47a359 | 320 | wait_us(5); |
k4zuki | 5:7061ce47a359 | 321 | _csl=0; |
k4zuki | 5:7061ce47a359 | 322 | if(comflag == 0) { |
k4zuki | 5:7061ce47a359 | 323 | comflag = 1; |
k4zuki | 5:7061ce47a359 | 324 | } else { |
k4zuki | 5:7061ce47a359 | 325 | comflag = 0; |
k4zuki | 4:844693a617dc | 326 | } |
k4zuki | 4:844693a617dc | 327 | } |
k4zuki | 4:844693a617dc | 328 | _csl=0; |
k4zuki | 4:844693a617dc | 329 | } |
k4zuki | 9:33d5888d1fb9 | 330 | |
k4zuki | 9:33d5888d1fb9 | 331 | uint8_t AkiSpiLcd::ram_read(int address) |
k4zuki | 9:33d5888d1fb9 | 332 | { |
k4zuki | 9:33d5888d1fb9 | 333 | ram_prepareCommand(READ, address); |
k4zuki | 9:33d5888d1fb9 | 334 | int result = _spi.write(0); |
k4zuki | 9:33d5888d1fb9 | 335 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 336 | return (uint8_t) result; |
k4zuki | 9:33d5888d1fb9 | 337 | } |
k4zuki | 9:33d5888d1fb9 | 338 | |
k4zuki | 9:33d5888d1fb9 | 339 | void AkiSpiLcd::ram_read(int address, uint8_t * buffer, int count) |
k4zuki | 9:33d5888d1fb9 | 340 | { |
k4zuki | 9:33d5888d1fb9 | 341 | ram_writeStatus(SEQUENTIAL_MODE); |
k4zuki | 9:33d5888d1fb9 | 342 | ram_prepareCommand(READ, address); |
k4zuki | 9:33d5888d1fb9 | 343 | for (int i = 0; i < count; i++) { |
k4zuki | 9:33d5888d1fb9 | 344 | buffer[i] = _spi.write(0); |
k4zuki | 9:33d5888d1fb9 | 345 | } |
k4zuki | 9:33d5888d1fb9 | 346 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 347 | ram_writeStatus(BYTE_MODE); |
k4zuki | 9:33d5888d1fb9 | 348 | } |
k4zuki | 9:33d5888d1fb9 | 349 | |
k4zuki | 9:33d5888d1fb9 | 350 | void AkiSpiLcd::ram_write(int address, uint8_t byte) |
k4zuki | 9:33d5888d1fb9 | 351 | { |
k4zuki | 9:33d5888d1fb9 | 352 | ram_prepareCommand(WRITE, address); |
k4zuki | 9:33d5888d1fb9 | 353 | _spi.write(byte); |
k4zuki | 9:33d5888d1fb9 | 354 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 355 | } |
k4zuki | 9:33d5888d1fb9 | 356 | |
k4zuki | 9:33d5888d1fb9 | 357 | void AkiSpiLcd::ram_write(int address, uint8_t * buffer, int count) |
k4zuki | 9:33d5888d1fb9 | 358 | { |
k4zuki | 9:33d5888d1fb9 | 359 | ram_writeStatus(SEQUENTIAL_MODE); |
k4zuki | 9:33d5888d1fb9 | 360 | ram_prepareCommand(WRITE, address); |
k4zuki | 9:33d5888d1fb9 | 361 | for (int i = 0; i < count; i++) { |
k4zuki | 9:33d5888d1fb9 | 362 | _spi.write(buffer[i]); |
k4zuki | 9:33d5888d1fb9 | 363 | } |
k4zuki | 9:33d5888d1fb9 | 364 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 365 | ram_writeStatus(BYTE_MODE); |
k4zuki | 9:33d5888d1fb9 | 366 | } |
k4zuki | 9:33d5888d1fb9 | 367 | |
k4zuki | 9:33d5888d1fb9 | 368 | uint8_t AkiSpiLcd::ram_readStatus() |
k4zuki | 9:33d5888d1fb9 | 369 | { |
k4zuki | 9:33d5888d1fb9 | 370 | ram_select(); |
k4zuki | 9:33d5888d1fb9 | 371 | _spi.write(READ_STATUS); |
k4zuki | 9:33d5888d1fb9 | 372 | uint8_t result = (uint8_t) _spi.write(0); |
k4zuki | 9:33d5888d1fb9 | 373 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 374 | return result; |
k4zuki | 9:33d5888d1fb9 | 375 | } |
k4zuki | 9:33d5888d1fb9 | 376 | |
k4zuki | 9:33d5888d1fb9 | 377 | void AkiSpiLcd::ram_writeStatus(uint8_t status) |
k4zuki | 9:33d5888d1fb9 | 378 | { |
k4zuki | 9:33d5888d1fb9 | 379 | ram_select(); |
k4zuki | 9:33d5888d1fb9 | 380 | _spi.write(WRITE_STATUS); |
k4zuki | 9:33d5888d1fb9 | 381 | _spi.write(status); |
k4zuki | 9:33d5888d1fb9 | 382 | ram_deselect(); |
k4zuki | 9:33d5888d1fb9 | 383 | } |
k4zuki | 9:33d5888d1fb9 | 384 | |
k4zuki | 9:33d5888d1fb9 | 385 | void AkiSpiLcd::ram_prepareCommand(uint8_t command, int address) |
k4zuki | 9:33d5888d1fb9 | 386 | { |
k4zuki | 9:33d5888d1fb9 | 387 | ram_select(); |
k4zuki | 9:33d5888d1fb9 | 388 | _spi.write(command); |
k4zuki | 9:33d5888d1fb9 | 389 | _spi.write(address >> 8); |
k4zuki | 9:33d5888d1fb9 | 390 | _spi.write(address & 0xFF); |
k4zuki | 9:33d5888d1fb9 | 391 | } |
k4zuki | 9:33d5888d1fb9 | 392 | |
k4zuki | 9:33d5888d1fb9 | 393 | void AkiSpiLcd::ram_select() |
k4zuki | 9:33d5888d1fb9 | 394 | { |
k4zuki | 9:33d5888d1fb9 | 395 | _csr=0; |
k4zuki | 9:33d5888d1fb9 | 396 | } |
k4zuki | 9:33d5888d1fb9 | 397 | |
k4zuki | 9:33d5888d1fb9 | 398 | void AkiSpiLcd::ram_deselect() |
k4zuki | 9:33d5888d1fb9 | 399 | { |
k4zuki | 9:33d5888d1fb9 | 400 | _csr=1; |
k4zuki | 9:33d5888d1fb9 | 401 | } |