Basic library for SHARP LCD LS027B4DH01/LS027B7DH01

Dependents:   AkiSpiLcd_demo AkiSpiLcd_demo2 LCDRAM AkiSpiLcd_example

Committer:
Kazuki Yamamoto
Date:
Sun Oct 23 02:27:02 2016 +0900
Revision:
31:7c7faf88edcc
Parent:
30:d5c18e268866
Child:
32:7e37fd2ddaa4
Declare license (MIT)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kazuki Yamamoto 31:7c7faf88edcc 1 /*
Kazuki Yamamoto 31:7c7faf88edcc 2 Copyright (c) 2016 Kazuki Yamamoto <k.yamamoto.08136891@gmail.com>
Kazuki Yamamoto 31:7c7faf88edcc 3 Permission is hereby granted, free of charge, to any person obtaining
Kazuki Yamamoto 31:7c7faf88edcc 4 a copy of this software and associated documentation files
Kazuki Yamamoto 31:7c7faf88edcc 5 (the "Software"), to deal in the Software without restriction,
Kazuki Yamamoto 31:7c7faf88edcc 6 including without limitation the rights to use, copy, modify, merge,
Kazuki Yamamoto 31:7c7faf88edcc 7 publish, distribute, sublicense, and/or sell copies of the Software,
Kazuki Yamamoto 31:7c7faf88edcc 8 and to permit persons to whom the Software is furnished to do so,
Kazuki Yamamoto 31:7c7faf88edcc 9 subject to the following conditions:
Kazuki Yamamoto 31:7c7faf88edcc 10 The above copyright notice and this permission notice shall be
Kazuki Yamamoto 31:7c7faf88edcc 11 included in all copies or substantial portions of the Software.
Kazuki Yamamoto 31:7c7faf88edcc 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Kazuki Yamamoto 31:7c7faf88edcc 13 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Kazuki Yamamoto 31:7c7faf88edcc 14 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Kazuki Yamamoto 31:7c7faf88edcc 15 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
Kazuki Yamamoto 31:7c7faf88edcc 16 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Kazuki Yamamoto 31:7c7faf88edcc 17 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Kazuki Yamamoto 31:7c7faf88edcc 18 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Kazuki Yamamoto 31:7c7faf88edcc 19 */
k4zuki 1:57de84d2025c 20 /** this is for SHARP LCD LS027B4DH01
Kazuki Yamamoto 30:d5c18e268866 21 * (c) Kazuki Yamamoto, or _K4ZUKI_
k4zuki 0:b3c8fdd01601 22 */
k4zuki 0:b3c8fdd01601 23
Kazuki Yamamoto 30:d5c18e268866 24 #include "AkiSpiLcd.h"
k4zuki 0:b3c8fdd01601 25 #include "mbed.h"
Kazuki Yamamoto 30:d5c18e268866 26 // #include "Ser23K256.h"
k4zuki 11:16647ecd67ce 27 extern const uint8_t lcd_line[];
k4zuki 0:b3c8fdd01601 28
Kazuki Yamamoto 30:d5c18e268866 29 AkiSpiLcd::AkiSpiLcd(PinName mosi, PinName miso, PinName sck, PinName csl,
Kazuki Yamamoto 30:d5c18e268866 30 PinName csr)
Kazuki Yamamoto 30:d5c18e268866 31 : _spi(mosi, miso, sck), _csl(csl), _csr(csr) {
Kazuki Yamamoto 30:d5c18e268866 32 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 33 _csr = 1;
Kazuki Yamamoto 30:d5c18e268866 34 _spi.format(8, 0);
Kazuki Yamamoto 30:d5c18e268866 35 _spi.frequency(10000000);
Kazuki Yamamoto 30:d5c18e268866 36 _comflag = _modeflag = _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 37 }
Kazuki Yamamoto 30:d5c18e268866 38
Kazuki Yamamoto 30:d5c18e268866 39 void AkiSpiLcd::cls() {
Kazuki Yamamoto 30:d5c18e268866 40 _modeflag = 0;
Kazuki Yamamoto 30:d5c18e268866 41 _clearflag = 1;
Kazuki Yamamoto 30:d5c18e268866 42
Kazuki Yamamoto 30:d5c18e268866 43 _csl = 1;
Kazuki Yamamoto 30:d5c18e268866 44 wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 45
Kazuki Yamamoto 30:d5c18e268866 46 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 47 _spi.write(0x00);
Kazuki Yamamoto 30:d5c18e268866 48
Kazuki Yamamoto 30:d5c18e268866 49 wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 50 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 51
Kazuki Yamamoto 30:d5c18e268866 52 cominvert();
k4zuki 0:b3c8fdd01601 53 }
k4zuki 0:b3c8fdd01601 54
Kazuki Yamamoto 30:d5c18e268866 55 void AkiSpiLcd::cls_ram(int screen) {
Kazuki Yamamoto 30:d5c18e268866 56 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 57 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 58 _cls_ram(SCREEN0_BASE);
Kazuki Yamamoto 30:d5c18e268866 59 } else {
Kazuki Yamamoto 30:d5c18e268866 60 _cls_ram(SCREEN1_BASE);
Kazuki Yamamoto 30:d5c18e268866 61 }
Kazuki Yamamoto 30:d5c18e268866 62 }
Kazuki Yamamoto 30:d5c18e268866 63
Kazuki Yamamoto 30:d5c18e268866 64 void AkiSpiLcd::directUpdateSingle(int line, uint8_t *data) {
Kazuki Yamamoto 30:d5c18e268866 65 _modeflag = 1;
Kazuki Yamamoto 30:d5c18e268866 66 _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 67
Kazuki Yamamoto 30:d5c18e268866 68 _csl = 1;
Kazuki Yamamoto 30:d5c18e268866 69 wait_us(1);
Kazuki Yamamoto 30:d5c18e268866 70
Kazuki Yamamoto 30:d5c18e268866 71 if (line == 0)
Kazuki Yamamoto 30:d5c18e268866 72 line = 1;
k4zuki 0:b3c8fdd01601 73
Kazuki Yamamoto 30:d5c18e268866 74 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 75 _spi.write((uint8_t)lcd_line[line]);
Kazuki Yamamoto 30:d5c18e268866 76
Kazuki Yamamoto 30:d5c18e268866 77 for (int i = 0; i < 50; i++) {
Kazuki Yamamoto 30:d5c18e268866 78 _spi.write(*(data + i));
Kazuki Yamamoto 30:d5c18e268866 79 }
Kazuki Yamamoto 30:d5c18e268866 80 _spi.write(0x00);
Kazuki Yamamoto 30:d5c18e268866 81 _spi.write(0x00);
Kazuki Yamamoto 30:d5c18e268866 82
Kazuki Yamamoto 30:d5c18e268866 83 wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 84 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 85
Kazuki Yamamoto 30:d5c18e268866 86 cominvert();
Kazuki Yamamoto 30:d5c18e268866 87 }
Kazuki Yamamoto 30:d5c18e268866 88
Kazuki Yamamoto 30:d5c18e268866 89 void AkiSpiLcd::directUpdateMulti(int line, int length, uint8_t *data) {
Kazuki Yamamoto 30:d5c18e268866 90 _modeflag = 1;
Kazuki Yamamoto 30:d5c18e268866 91 _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 92
Kazuki Yamamoto 30:d5c18e268866 93 if (line == 0)
Kazuki Yamamoto 30:d5c18e268866 94 line = 1;
Kazuki Yamamoto 30:d5c18e268866 95
Kazuki Yamamoto 30:d5c18e268866 96 if (length > 0) {
k4zuki 18:e3f59b23dd3a 97 _csl = 1;
k4zuki 0:b3c8fdd01601 98 wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 99 for (int j = 1; j <= length; j++) {
Kazuki Yamamoto 30:d5c18e268866 100 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 101 _spi.write((uint8_t)lcd_line[line]);
Kazuki Yamamoto 30:d5c18e268866 102 for (int i = 0; i < 50; i++) {
Kazuki Yamamoto 30:d5c18e268866 103 _spi.write(*(data + (50 * j + i))); // hogepic[50*j+i]
Kazuki Yamamoto 30:d5c18e268866 104 }
Kazuki Yamamoto 30:d5c18e268866 105 line += 1;
k4zuki 0:b3c8fdd01601 106 }
k4zuki 0:b3c8fdd01601 107 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 108 _spi.write(0x00);
k4zuki 0:b3c8fdd01601 109 wait_us(5);
k4zuki 18:e3f59b23dd3a 110 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 111 }
Kazuki Yamamoto 30:d5c18e268866 112 cominvert();
k4zuki 0:b3c8fdd01601 113 }
k4zuki 0:b3c8fdd01601 114
Kazuki Yamamoto 30:d5c18e268866 115 void AkiSpiLcd::cominvert() {
Kazuki Yamamoto 30:d5c18e268866 116 _modeflag = 0;
Kazuki Yamamoto 30:d5c18e268866 117 _clearflag = 0;
k4zuki 14:812873f3a933 118
Kazuki Yamamoto 30:d5c18e268866 119 _csl = 1;
k4zuki 0:b3c8fdd01601 120
Kazuki Yamamoto 30:d5c18e268866 121 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 122 _spi.write(0x00);
Kazuki Yamamoto 30:d5c18e268866 123 // wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 124 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 125 if (_comflag == 0) {
Kazuki Yamamoto 30:d5c18e268866 126 _comflag = 1;
Kazuki Yamamoto 30:d5c18e268866 127 } else {
Kazuki Yamamoto 30:d5c18e268866 128 _comflag = 0;
Kazuki Yamamoto 30:d5c18e268866 129 }
k4zuki 0:b3c8fdd01601 130 }
k4zuki 14:812873f3a933 131
k4zuki 14:812873f3a933 132 /** Reads single line (16 + 400 bits = 52 bytes) from a screen
k4zuki 3:f835b8daf9a0 133 */
Kazuki Yamamoto 30:d5c18e268866 134 void AkiSpiLcd::ramReadSingleLine(int line, uint8_t *buffer, int screen) {
Kazuki Yamamoto 30:d5c18e268866 135 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 136 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 137 screen = SCREEN0_BASE;
Kazuki Yamamoto 30:d5c18e268866 138 } else {
Kazuki Yamamoto 30:d5c18e268866 139 screen = SCREEN1_BASE;
Kazuki Yamamoto 30:d5c18e268866 140 }
k4zuki 14:812873f3a933 141
Kazuki Yamamoto 30:d5c18e268866 142 line *= RAMLINE_LENGTH;
Kazuki Yamamoto 30:d5c18e268866 143 int address = screen + line;
Kazuki Yamamoto 30:d5c18e268866 144 ram_read(address, buffer, RAMLINE_LENGTH);
k4zuki 4:844693a617dc 145 }
k4zuki 4:844693a617dc 146
k4zuki 14:812873f3a933 147 /** Reads multi lines( (16 + 400) x N bits = 52 x N bytes) from a screen
k4zuki 9:33d5888d1fb9 148 */
Kazuki Yamamoto 30:d5c18e268866 149 void AkiSpiLcd::ramReadMultiLine(int line, int length, uint8_t *buffer,
Kazuki Yamamoto 30:d5c18e268866 150 int screen) {
Kazuki Yamamoto 30:d5c18e268866 151 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 152 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 153 screen = SCREEN0_BASE;
Kazuki Yamamoto 30:d5c18e268866 154 } else {
Kazuki Yamamoto 30:d5c18e268866 155 screen = SCREEN1_BASE;
Kazuki Yamamoto 30:d5c18e268866 156 }
Kazuki Yamamoto 30:d5c18e268866 157 line *= RAMLINE_LENGTH;
Kazuki Yamamoto 30:d5c18e268866 158 int address = screen + line;
Kazuki Yamamoto 30:d5c18e268866 159 ram_read(address, buffer, RAMLINE_LENGTH * length);
k4zuki 4:844693a617dc 160 }
k4zuki 9:33d5888d1fb9 161
k4zuki 9:33d5888d1fb9 162 /** Writes single line (400 bits = 50 bytes) into a screen
k4zuki 9:33d5888d1fb9 163 */
Kazuki Yamamoto 30:d5c18e268866 164 void AkiSpiLcd::ramWriteSingleLine(int line, uint8_t *data, int screen) {
Kazuki Yamamoto 30:d5c18e268866 165 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 166 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 167 screen = SCREEN0_BASE;
Kazuki Yamamoto 30:d5c18e268866 168 } else {
Kazuki Yamamoto 30:d5c18e268866 169 screen = SCREEN1_BASE;
Kazuki Yamamoto 30:d5c18e268866 170 }
Kazuki Yamamoto 30:d5c18e268866 171 line--;
Kazuki Yamamoto 30:d5c18e268866 172 line *= RAMLINE_LENGTH;
Kazuki Yamamoto 30:d5c18e268866 173 int address = screen + line;
Kazuki Yamamoto 30:d5c18e268866 174 ram_write(address, data, 50);
k4zuki 14:812873f3a933 175 }
k4zuki 14:812873f3a933 176
k4zuki 14:812873f3a933 177 /** Writes multi lines(400 x N bits = 50 x N bytes) into a screen
k4zuki 14:812873f3a933 178 */
Kazuki Yamamoto 30:d5c18e268866 179 void AkiSpiLcd::ramWriteMultiLine(int line, int length, uint8_t *data,
Kazuki Yamamoto 30:d5c18e268866 180 int screen) {
Kazuki Yamamoto 30:d5c18e268866 181 _modeflag = 1;
Kazuki Yamamoto 30:d5c18e268866 182 _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 183 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 184 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 185 screen = SCREEN0_BASE;
Kazuki Yamamoto 30:d5c18e268866 186 } else {
Kazuki Yamamoto 30:d5c18e268866 187 screen = SCREEN1_BASE;
Kazuki Yamamoto 30:d5c18e268866 188 }
Kazuki Yamamoto 30:d5c18e268866 189 // line--;
Kazuki Yamamoto 30:d5c18e268866 190 // line*=RAMLINE_LENGTH;
k4zuki 14:812873f3a933 191
Kazuki Yamamoto 30:d5c18e268866 192 int address = screen + line * RAMLINE_LENGTH;
Kazuki Yamamoto 30:d5c18e268866 193 _ram_writeStatus(SEQUENTIAL_MODE);
Kazuki Yamamoto 30:d5c18e268866 194 _ram_prepareCommand(WRITE, address);
Kazuki Yamamoto 30:d5c18e268866 195 for (int i = 0; i < length; i++) {
Kazuki Yamamoto 30:d5c18e268866 196 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 197 _spi.write((uint8_t)lcd_line[line]);
Kazuki Yamamoto 30:d5c18e268866 198 for (int j = 0; j < LINE_LENGTH; j++) {
Kazuki Yamamoto 30:d5c18e268866 199 _spi.write(*data);
Kazuki Yamamoto 30:d5c18e268866 200 data++;
k4zuki 4:844693a617dc 201 }
Kazuki Yamamoto 30:d5c18e268866 202 line++;
Kazuki Yamamoto 30:d5c18e268866 203 }
Kazuki Yamamoto 30:d5c18e268866 204 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 205 _ram_writeStatus(BYTE_MODE);
Kazuki Yamamoto 30:d5c18e268866 206 // ram_write(address,data,50*length);
k4zuki 4:844693a617dc 207 }
k4zuki 4:844693a617dc 208
k4zuki 9:33d5888d1fb9 209 /** copies whole data in screen into LCD
k4zuki 9:33d5888d1fb9 210 */
Kazuki Yamamoto 30:d5c18e268866 211 void AkiSpiLcd::ram2lcd(int startline, int length, int screen) {
Kazuki Yamamoto 30:d5c18e268866 212 _modeflag = 1;
Kazuki Yamamoto 30:d5c18e268866 213 _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 214 screen &= 1;
Kazuki Yamamoto 30:d5c18e268866 215 if (screen == SCREEN0) {
Kazuki Yamamoto 30:d5c18e268866 216 screen = SCREEN0_BASE;
Kazuki Yamamoto 30:d5c18e268866 217 } else {
Kazuki Yamamoto 30:d5c18e268866 218 screen = SCREEN1_BASE;
Kazuki Yamamoto 30:d5c18e268866 219 }
Kazuki Yamamoto 30:d5c18e268866 220 if (startline == 0)
Kazuki Yamamoto 30:d5c18e268866 221 startline = 1;
k4zuki 14:812873f3a933 222
Kazuki Yamamoto 30:d5c18e268866 223 if (length > 0) {
k4zuki 14:812873f3a933 224
Kazuki Yamamoto 30:d5c18e268866 225 int address = screen + startline * RAMLINE_LENGTH;
Kazuki Yamamoto 30:d5c18e268866 226 // uint8_t dummy[RAMLINE_LENGTH+2];
Kazuki Yamamoto 30:d5c18e268866 227 int dummy = 0;
k4zuki 4:844693a617dc 228
Kazuki Yamamoto 30:d5c18e268866 229 _ram_writeStatus(SEQUENTIAL_MODE);
Kazuki Yamamoto 30:d5c18e268866 230 _ram_prepareCommand(READ, address);
Kazuki Yamamoto 30:d5c18e268866 231 _spi.format(16, 0);
Kazuki Yamamoto 30:d5c18e268866 232 _csl = 1;
Kazuki Yamamoto 30:d5c18e268866 233 // wait_us(5);
k4zuki 18:e3f59b23dd3a 234
Kazuki Yamamoto 30:d5c18e268866 235 for (int j = 0; j <= length; j++) {
Kazuki Yamamoto 30:d5c18e268866 236 // _csl=1;
Kazuki Yamamoto 30:d5c18e268866 237 for (int k = 0; k < RAMLINE_LENGTH; k += 4) {
Kazuki Yamamoto 30:d5c18e268866 238 dummy = _spi.write(0x55de);
Kazuki Yamamoto 30:d5c18e268866 239 // dummy = _spi.write(0xde);
Kazuki Yamamoto 30:d5c18e268866 240 dummy = _spi.write(0xadaa);
Kazuki Yamamoto 30:d5c18e268866 241 // dummy = _spi.write(0xbe);
Kazuki Yamamoto 30:d5c18e268866 242 // dummy = _spi.write(0xaf);
Kazuki Yamamoto 30:d5c18e268866 243 // dummy = _spi.write(0xaa);
Kazuki Yamamoto 30:d5c18e268866 244 }
Kazuki Yamamoto 30:d5c18e268866 245 // _csl = 0;
k4zuki 4:844693a617dc 246 }
Kazuki Yamamoto 30:d5c18e268866 247 }
Kazuki Yamamoto 30:d5c18e268866 248 _spi.write(0xdead);
Kazuki Yamamoto 30:d5c18e268866 249 // wait_us(5);
Kazuki Yamamoto 30:d5c18e268866 250 _csl = 0;
Kazuki Yamamoto 30:d5c18e268866 251 // _spi.write(0xde);
Kazuki Yamamoto 30:d5c18e268866 252 // _spi.write(0xad);
Kazuki Yamamoto 30:d5c18e268866 253 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 254 _spi.format(8, 0);
Kazuki Yamamoto 30:d5c18e268866 255 cominvert();
k4zuki 4:844693a617dc 256 }
k4zuki 9:33d5888d1fb9 257
k4zuki 16:fa277cbcc890 258 /** copies whole data in screen into LCD
k4zuki 16:fa277cbcc890 259 */
Kazuki Yamamoto 30:d5c18e268866 260 void AkiSpiLcd::ram2lcd(int screen) {
Kazuki Yamamoto 30:d5c18e268866 261 uint8_t lineBuffer[RAMLINE_LENGTH];
Kazuki Yamamoto 30:d5c18e268866 262 for (int y = 0; y < 240; y++) {
Kazuki Yamamoto 30:d5c18e268866 263 ram_read(y * RAMLINE_LENGTH + 2, lineBuffer, RAMLINE_LENGTH);
Kazuki Yamamoto 30:d5c18e268866 264 directUpdateSingle(y + 1, lineBuffer);
Kazuki Yamamoto 30:d5c18e268866 265 }
k4zuki 16:fa277cbcc890 266 }
Kazuki Yamamoto 30:d5c18e268866 267 uint8_t AkiSpiLcd::ram_read(int address) {
Kazuki Yamamoto 30:d5c18e268866 268 _ram_prepareCommand(READ, address);
Kazuki Yamamoto 30:d5c18e268866 269 int result = _spi.write(0);
Kazuki Yamamoto 30:d5c18e268866 270 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 271 return (uint8_t)result;
k4zuki 9:33d5888d1fb9 272 }
k4zuki 9:33d5888d1fb9 273
Kazuki Yamamoto 30:d5c18e268866 274 void AkiSpiLcd::ram_read(int address, uint8_t *buffer, int count) {
Kazuki Yamamoto 30:d5c18e268866 275 _ram_writeStatus(SEQUENTIAL_MODE);
Kazuki Yamamoto 30:d5c18e268866 276 _ram_prepareCommand(READ, address);
Kazuki Yamamoto 30:d5c18e268866 277 for (int i = 0; i < count; i++) {
Kazuki Yamamoto 30:d5c18e268866 278 buffer[i] = _spi.write(0x00);
Kazuki Yamamoto 30:d5c18e268866 279 }
Kazuki Yamamoto 30:d5c18e268866 280 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 281 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 282 }
k4zuki 9:33d5888d1fb9 283
Kazuki Yamamoto 30:d5c18e268866 284 void AkiSpiLcd::ram_write(int address, uint8_t byte) {
Kazuki Yamamoto 30:d5c18e268866 285 _ram_prepareCommand(WRITE, address);
Kazuki Yamamoto 30:d5c18e268866 286 _spi.write(byte);
Kazuki Yamamoto 30:d5c18e268866 287 _ram_deselect();
k4zuki 9:33d5888d1fb9 288 }
k4zuki 9:33d5888d1fb9 289
Kazuki Yamamoto 30:d5c18e268866 290 void AkiSpiLcd::ram_write(int address, uint8_t *buffer, int count) {
Kazuki Yamamoto 30:d5c18e268866 291 _ram_writeStatus(SEQUENTIAL_MODE);
Kazuki Yamamoto 30:d5c18e268866 292 _ram_prepareCommand(WRITE, address);
Kazuki Yamamoto 30:d5c18e268866 293 for (int i = 0; i < count; i++) {
Kazuki Yamamoto 30:d5c18e268866 294 _spi.write(buffer[i]);
Kazuki Yamamoto 30:d5c18e268866 295 }
Kazuki Yamamoto 30:d5c18e268866 296 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 297 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 298 }
k4zuki 9:33d5888d1fb9 299
Kazuki Yamamoto 30:d5c18e268866 300 uint8_t AkiSpiLcd::ram_readStatus() {
Kazuki Yamamoto 30:d5c18e268866 301 _ram_select();
Kazuki Yamamoto 30:d5c18e268866 302 _spi.write(READ_STATUS);
Kazuki Yamamoto 30:d5c18e268866 303 uint8_t result = (uint8_t)_spi.write(0);
Kazuki Yamamoto 30:d5c18e268866 304 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 305 return result;
k4zuki 9:33d5888d1fb9 306 }
k4zuki 9:33d5888d1fb9 307
Kazuki Yamamoto 30:d5c18e268866 308 void AkiSpiLcd::_ram_writeStatus(uint8_t status) {
Kazuki Yamamoto 30:d5c18e268866 309 _ram_select();
Kazuki Yamamoto 30:d5c18e268866 310 _spi.write(WRITE_STATUS);
Kazuki Yamamoto 30:d5c18e268866 311 _spi.write(status);
Kazuki Yamamoto 30:d5c18e268866 312 _ram_deselect();
k4zuki 9:33d5888d1fb9 313 }
k4zuki 9:33d5888d1fb9 314
Kazuki Yamamoto 30:d5c18e268866 315 void AkiSpiLcd::_ram_prepareCommand(uint8_t command, int address) {
Kazuki Yamamoto 30:d5c18e268866 316 _ram_select();
Kazuki Yamamoto 30:d5c18e268866 317 _spi.write(command);
Kazuki Yamamoto 30:d5c18e268866 318 _spi.write(address >> 8);
Kazuki Yamamoto 30:d5c18e268866 319 _spi.write(address & 0xFF);
k4zuki 9:33d5888d1fb9 320 }
k4zuki 9:33d5888d1fb9 321
Kazuki Yamamoto 30:d5c18e268866 322 void AkiSpiLcd::_ram_select() { _csr = 0; }
Kazuki Yamamoto 30:d5c18e268866 323
Kazuki Yamamoto 30:d5c18e268866 324 void AkiSpiLcd::_ram_deselect() { _csr = 1; }
k4zuki 14:812873f3a933 325
Kazuki Yamamoto 30:d5c18e268866 326 void AkiSpiLcd::_cls_ram(int address) {
Kazuki Yamamoto 30:d5c18e268866 327 _modeflag = 1;
Kazuki Yamamoto 30:d5c18e268866 328 _clearflag = 0;
Kazuki Yamamoto 30:d5c18e268866 329 _ram_writeStatus(SEQUENTIAL_MODE);
Kazuki Yamamoto 30:d5c18e268866 330 _ram_prepareCommand(WRITE, address);
Kazuki Yamamoto 30:d5c18e268866 331 for (int i = 1; i <= (240); i++) {
Kazuki Yamamoto 30:d5c18e268866 332 _spi.write((_modeflag << 7) | (_comflag << 6) | (_clearflag << 5));
Kazuki Yamamoto 30:d5c18e268866 333 _spi.write((uint8_t)lcd_line[i]);
Kazuki Yamamoto 30:d5c18e268866 334 for (int j = 0; j < 50; j++) {
Kazuki Yamamoto 30:d5c18e268866 335 _spi.write(0x00);
k4zuki 14:812873f3a933 336 }
Kazuki Yamamoto 30:d5c18e268866 337 }
Kazuki Yamamoto 30:d5c18e268866 338 _ram_deselect();
Kazuki Yamamoto 30:d5c18e268866 339 _ram_writeStatus(BYTE_MODE);
k4zuki 9:33d5888d1fb9 340 }