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