SPI based library for the ST7735 LCD controller.
Dependents: RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more
LCD_ST7735.cpp@0:7b3fb3085867, 2014-09-19 (annotated)
- Committer:
- taylorza
- Date:
- Fri Sep 19 02:43:29 2014 +0000
- Revision:
- 0:7b3fb3085867
- Child:
- 1:33ff5fad4320
Initial commit of the library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
taylorza | 0:7b3fb3085867 | 1 | #include "mbed.h" |
taylorza | 0:7b3fb3085867 | 2 | #include "LCD_ST7735.h" |
taylorza | 0:7b3fb3085867 | 3 | |
taylorza | 0:7b3fb3085867 | 4 | LCD_ST7735::LCD_ST7735( |
taylorza | 0:7b3fb3085867 | 5 | PinName backlightPin, |
taylorza | 0:7b3fb3085867 | 6 | PinName resetPin, |
taylorza | 0:7b3fb3085867 | 7 | PinName dsPin, |
taylorza | 0:7b3fb3085867 | 8 | PinName mosiPin, |
taylorza | 0:7b3fb3085867 | 9 | PinName misoPin, |
taylorza | 0:7b3fb3085867 | 10 | PinName clkPin, |
taylorza | 0:7b3fb3085867 | 11 | PinName csPin) : |
taylorza | 0:7b3fb3085867 | 12 | _backlight(backlightPin, 0), |
taylorza | 0:7b3fb3085867 | 13 | _reset(resetPin, 1), |
taylorza | 0:7b3fb3085867 | 14 | _ds(dsPin, 0), |
taylorza | 0:7b3fb3085867 | 15 | _cs(csPin, 1), |
taylorza | 0:7b3fb3085867 | 16 | _spi(mosiPin, misoPin, clkPin) |
taylorza | 0:7b3fb3085867 | 17 | { |
taylorza | 0:7b3fb3085867 | 18 | _spi.format(8, 3); |
taylorza | 0:7b3fb3085867 | 19 | _spi.frequency(12000000); |
taylorza | 0:7b3fb3085867 | 20 | |
taylorza | 0:7b3fb3085867 | 21 | initDisplay(); |
taylorza | 0:7b3fb3085867 | 22 | clearScreen(); |
taylorza | 0:7b3fb3085867 | 23 | setForegroundColor(0xffff); |
taylorza | 0:7b3fb3085867 | 24 | setBackgroundColor(0x0000); |
taylorza | 0:7b3fb3085867 | 25 | } |
taylorza | 0:7b3fb3085867 | 26 | |
taylorza | 0:7b3fb3085867 | 27 | void LCD_ST7735::setBacklight(bool state) |
taylorza | 0:7b3fb3085867 | 28 | { |
taylorza | 0:7b3fb3085867 | 29 | _backlight = state ? 1 : 0; |
taylorza | 0:7b3fb3085867 | 30 | } |
taylorza | 0:7b3fb3085867 | 31 | |
taylorza | 0:7b3fb3085867 | 32 | void LCD_ST7735::clearScreen(uint16_t color) |
taylorza | 0:7b3fb3085867 | 33 | { |
taylorza | 0:7b3fb3085867 | 34 | clipRect(0, 0, 127, 159); |
taylorza | 0:7b3fb3085867 | 35 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 36 | for(int i = 0; i < 128 * 160 * 2; ++i) |
taylorza | 0:7b3fb3085867 | 37 | { |
taylorza | 0:7b3fb3085867 | 38 | writeBatchData(color); |
taylorza | 0:7b3fb3085867 | 39 | } |
taylorza | 0:7b3fb3085867 | 40 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 41 | } |
taylorza | 0:7b3fb3085867 | 42 | |
taylorza | 0:7b3fb3085867 | 43 | void LCD_ST7735::setPixel(int x, int y, uint16_t color) |
taylorza | 0:7b3fb3085867 | 44 | { |
taylorza | 0:7b3fb3085867 | 45 | write(CMD_CASET, (uint8_t[]){0, x, 0, x}, 4); |
taylorza | 0:7b3fb3085867 | 46 | write(CMD_RASET, (uint8_t[]){0, y, 0, y}, 4); |
taylorza | 0:7b3fb3085867 | 47 | write(CMD_RAMWR, color); |
taylorza | 0:7b3fb3085867 | 48 | } |
taylorza | 0:7b3fb3085867 | 49 | |
taylorza | 0:7b3fb3085867 | 50 | void LCD_ST7735::drawLine(int x1, int y1, int x2, int y2, uint16_t color) |
taylorza | 0:7b3fb3085867 | 51 | { |
taylorza | 0:7b3fb3085867 | 52 | int dx = abs(x2 - x1); |
taylorza | 0:7b3fb3085867 | 53 | int dy = abs(y2 - y1); |
taylorza | 0:7b3fb3085867 | 54 | |
taylorza | 0:7b3fb3085867 | 55 | if (dx == 0) |
taylorza | 0:7b3fb3085867 | 56 | { |
taylorza | 0:7b3fb3085867 | 57 | drawVertLine(x1, y1, y2, color); |
taylorza | 0:7b3fb3085867 | 58 | return; |
taylorza | 0:7b3fb3085867 | 59 | } |
taylorza | 0:7b3fb3085867 | 60 | else if(dy == 0) |
taylorza | 0:7b3fb3085867 | 61 | { |
taylorza | 0:7b3fb3085867 | 62 | drawHorizLine(x1, y1, x2, color); |
taylorza | 0:7b3fb3085867 | 63 | return; |
taylorza | 0:7b3fb3085867 | 64 | } |
taylorza | 0:7b3fb3085867 | 65 | |
taylorza | 0:7b3fb3085867 | 66 | int sx = (x1 < x2) ? 1 : -1; |
taylorza | 0:7b3fb3085867 | 67 | int sy = (y1 < y2) ? 1 : -1; |
taylorza | 0:7b3fb3085867 | 68 | int err = dx - dy; |
taylorza | 0:7b3fb3085867 | 69 | while(x1 != x2 || y1 != y2) |
taylorza | 0:7b3fb3085867 | 70 | { |
taylorza | 0:7b3fb3085867 | 71 | setPixel(x1, y1, color); |
taylorza | 0:7b3fb3085867 | 72 | int e2 = err << 1; |
taylorza | 0:7b3fb3085867 | 73 | if (e2 > -dy) |
taylorza | 0:7b3fb3085867 | 74 | { |
taylorza | 0:7b3fb3085867 | 75 | err -= dy; |
taylorza | 0:7b3fb3085867 | 76 | x1 += sx; |
taylorza | 0:7b3fb3085867 | 77 | } |
taylorza | 0:7b3fb3085867 | 78 | if (e2 < dx) |
taylorza | 0:7b3fb3085867 | 79 | { |
taylorza | 0:7b3fb3085867 | 80 | err += dx; |
taylorza | 0:7b3fb3085867 | 81 | y1 += sy; |
taylorza | 0:7b3fb3085867 | 82 | } |
taylorza | 0:7b3fb3085867 | 83 | } |
taylorza | 0:7b3fb3085867 | 84 | setPixel(x2, y2, color); |
taylorza | 0:7b3fb3085867 | 85 | } |
taylorza | 0:7b3fb3085867 | 86 | |
taylorza | 0:7b3fb3085867 | 87 | void LCD_ST7735::swap(int &a, int &b) |
taylorza | 0:7b3fb3085867 | 88 | { |
taylorza | 0:7b3fb3085867 | 89 | int t = a; |
taylorza | 0:7b3fb3085867 | 90 | a = b; |
taylorza | 0:7b3fb3085867 | 91 | b = t; |
taylorza | 0:7b3fb3085867 | 92 | } |
taylorza | 0:7b3fb3085867 | 93 | |
taylorza | 0:7b3fb3085867 | 94 | void LCD_ST7735::drawRect(int x1, int y1, int x2, int y2, uint16_t color) |
taylorza | 0:7b3fb3085867 | 95 | { |
taylorza | 0:7b3fb3085867 | 96 | if (x1 > x2) swap(x1, x2); |
taylorza | 0:7b3fb3085867 | 97 | if (y1 > y2) swap(y1, y2); |
taylorza | 0:7b3fb3085867 | 98 | |
taylorza | 0:7b3fb3085867 | 99 | drawHorizLine(x1, y1, x2, color); |
taylorza | 0:7b3fb3085867 | 100 | drawHorizLine(x1, y2, x2, color); |
taylorza | 0:7b3fb3085867 | 101 | drawVertLine(x1, y1, y2, color); |
taylorza | 0:7b3fb3085867 | 102 | drawVertLine(x2, y1, y2, color); |
taylorza | 0:7b3fb3085867 | 103 | } |
taylorza | 0:7b3fb3085867 | 104 | |
taylorza | 0:7b3fb3085867 | 105 | void LCD_ST7735::drawCircle(int x, int y, int r, uint16_t color) |
taylorza | 0:7b3fb3085867 | 106 | { |
taylorza | 0:7b3fb3085867 | 107 | int ix = r; |
taylorza | 0:7b3fb3085867 | 108 | int iy = 0; |
taylorza | 0:7b3fb3085867 | 109 | int err = 1 - r; |
taylorza | 0:7b3fb3085867 | 110 | |
taylorza | 0:7b3fb3085867 | 111 | while(ix >= iy) |
taylorza | 0:7b3fb3085867 | 112 | { |
taylorza | 0:7b3fb3085867 | 113 | setPixel(x + ix, y + iy, color); |
taylorza | 0:7b3fb3085867 | 114 | setPixel(x + iy, y + ix, color); |
taylorza | 0:7b3fb3085867 | 115 | setPixel(x - ix, y + iy, color); |
taylorza | 0:7b3fb3085867 | 116 | setPixel(x - iy, y + ix, color); |
taylorza | 0:7b3fb3085867 | 117 | setPixel(x - ix, y - iy, color); |
taylorza | 0:7b3fb3085867 | 118 | setPixel(x - iy, y - ix, color); |
taylorza | 0:7b3fb3085867 | 119 | setPixel(x + ix, y - iy, color); |
taylorza | 0:7b3fb3085867 | 120 | setPixel(x + iy, y - ix, color); |
taylorza | 0:7b3fb3085867 | 121 | iy++; |
taylorza | 0:7b3fb3085867 | 122 | if (err < 0) |
taylorza | 0:7b3fb3085867 | 123 | { |
taylorza | 0:7b3fb3085867 | 124 | err += 2 * iy + 1; |
taylorza | 0:7b3fb3085867 | 125 | } |
taylorza | 0:7b3fb3085867 | 126 | else |
taylorza | 0:7b3fb3085867 | 127 | { |
taylorza | 0:7b3fb3085867 | 128 | ix--; |
taylorza | 0:7b3fb3085867 | 129 | err += 2 * (iy - ix + 1); |
taylorza | 0:7b3fb3085867 | 130 | } |
taylorza | 0:7b3fb3085867 | 131 | } |
taylorza | 0:7b3fb3085867 | 132 | } |
taylorza | 0:7b3fb3085867 | 133 | |
taylorza | 0:7b3fb3085867 | 134 | void LCD_ST7735::fillRect(int x1, int y1, int x2, int y2, uint16_t borderColor, uint16_t fillColor) |
taylorza | 0:7b3fb3085867 | 135 | { |
taylorza | 0:7b3fb3085867 | 136 | if (x1 > x2) swap(x1, x2); |
taylorza | 0:7b3fb3085867 | 137 | if (y1 > y2) swap(y1, y2); |
taylorza | 0:7b3fb3085867 | 138 | |
taylorza | 0:7b3fb3085867 | 139 | drawRect(x1, y1, x2, y2, borderColor); |
taylorza | 0:7b3fb3085867 | 140 | clipRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1); |
taylorza | 0:7b3fb3085867 | 141 | int c = ((x2-x1-2) * (y2-y1-2)) << 1; |
taylorza | 0:7b3fb3085867 | 142 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 143 | while(c--) |
taylorza | 0:7b3fb3085867 | 144 | { |
taylorza | 0:7b3fb3085867 | 145 | writeBatchData(fillColor); |
taylorza | 0:7b3fb3085867 | 146 | } |
taylorza | 0:7b3fb3085867 | 147 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 148 | } |
taylorza | 0:7b3fb3085867 | 149 | |
taylorza | 0:7b3fb3085867 | 150 | void LCD_ST7735::fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor) |
taylorza | 0:7b3fb3085867 | 151 | { |
taylorza | 0:7b3fb3085867 | 152 | int ix = r; |
taylorza | 0:7b3fb3085867 | 153 | int iy = 0; |
taylorza | 0:7b3fb3085867 | 154 | int err = 1 - r; |
taylorza | 0:7b3fb3085867 | 155 | |
taylorza | 0:7b3fb3085867 | 156 | while(ix >= iy) |
taylorza | 0:7b3fb3085867 | 157 | { |
taylorza | 0:7b3fb3085867 | 158 | setPixel(x - ix, y + iy, borderColor); |
taylorza | 0:7b3fb3085867 | 159 | setPixel(x + ix, y + iy, borderColor); |
taylorza | 0:7b3fb3085867 | 160 | drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor); |
taylorza | 0:7b3fb3085867 | 161 | |
taylorza | 0:7b3fb3085867 | 162 | setPixel(x - iy, y + ix, borderColor); |
taylorza | 0:7b3fb3085867 | 163 | setPixel(x + iy, y + ix, borderColor); |
taylorza | 0:7b3fb3085867 | 164 | drawHorizLine(x - iy + 1, y + ix, x + iy - 1, fillColor); |
taylorza | 0:7b3fb3085867 | 165 | |
taylorza | 0:7b3fb3085867 | 166 | setPixel(x - ix, y - iy, borderColor); |
taylorza | 0:7b3fb3085867 | 167 | setPixel(x + ix, y - iy, borderColor); |
taylorza | 0:7b3fb3085867 | 168 | drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor); |
taylorza | 0:7b3fb3085867 | 169 | |
taylorza | 0:7b3fb3085867 | 170 | setPixel(x - iy, y - ix, borderColor); |
taylorza | 0:7b3fb3085867 | 171 | setPixel(x + iy, y - ix, borderColor); |
taylorza | 0:7b3fb3085867 | 172 | drawHorizLine(x - iy + 1, y - ix, x + iy - 1, fillColor); |
taylorza | 0:7b3fb3085867 | 173 | iy++; |
taylorza | 0:7b3fb3085867 | 174 | if (err < 0) |
taylorza | 0:7b3fb3085867 | 175 | { |
taylorza | 0:7b3fb3085867 | 176 | err += 2 * iy + 1; |
taylorza | 0:7b3fb3085867 | 177 | } |
taylorza | 0:7b3fb3085867 | 178 | else |
taylorza | 0:7b3fb3085867 | 179 | { |
taylorza | 0:7b3fb3085867 | 180 | ix--; |
taylorza | 0:7b3fb3085867 | 181 | err += 2 * (iy - ix + 1); |
taylorza | 0:7b3fb3085867 | 182 | } |
taylorza | 0:7b3fb3085867 | 183 | } |
taylorza | 0:7b3fb3085867 | 184 | } |
taylorza | 0:7b3fb3085867 | 185 | |
taylorza | 0:7b3fb3085867 | 186 | void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp) |
taylorza | 0:7b3fb3085867 | 187 | { |
taylorza | 0:7b3fb3085867 | 188 | int w = *pbmp++; |
taylorza | 0:7b3fb3085867 | 189 | int h = *pbmp++; |
taylorza | 0:7b3fb3085867 | 190 | |
taylorza | 0:7b3fb3085867 | 191 | clip(x, y, w, h); |
taylorza | 0:7b3fb3085867 | 192 | int c = w * h; |
taylorza | 0:7b3fb3085867 | 193 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 194 | while(c--) |
taylorza | 0:7b3fb3085867 | 195 | { |
taylorza | 0:7b3fb3085867 | 196 | writeBatchData(*pbmp++); |
taylorza | 0:7b3fb3085867 | 197 | } |
taylorza | 0:7b3fb3085867 | 198 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 199 | } |
taylorza | 0:7b3fb3085867 | 200 | |
taylorza | 0:7b3fb3085867 | 201 | void LCD_ST7735::setForegroundColor(uint16_t color) |
taylorza | 0:7b3fb3085867 | 202 | { |
taylorza | 0:7b3fb3085867 | 203 | _foregroundColor = color; |
taylorza | 0:7b3fb3085867 | 204 | } |
taylorza | 0:7b3fb3085867 | 205 | |
taylorza | 0:7b3fb3085867 | 206 | void LCD_ST7735::setBackgroundColor(uint16_t color) |
taylorza | 0:7b3fb3085867 | 207 | { |
taylorza | 0:7b3fb3085867 | 208 | _backgroundColor = color; |
taylorza | 0:7b3fb3085867 | 209 | } |
taylorza | 0:7b3fb3085867 | 210 | |
taylorza | 0:7b3fb3085867 | 211 | void LCD_ST7735::drawString(const uint8_t *pFont, int x, int y, const char *pString) |
taylorza | 0:7b3fb3085867 | 212 | { |
taylorza | 0:7b3fb3085867 | 213 | char *p = (char*)pString; |
taylorza | 0:7b3fb3085867 | 214 | while(*p != 0) |
taylorza | 0:7b3fb3085867 | 215 | { |
taylorza | 0:7b3fb3085867 | 216 | drawChar(pFont, x, y, *p++); |
taylorza | 0:7b3fb3085867 | 217 | x += 8; |
taylorza | 0:7b3fb3085867 | 218 | } |
taylorza | 0:7b3fb3085867 | 219 | } |
taylorza | 0:7b3fb3085867 | 220 | |
taylorza | 0:7b3fb3085867 | 221 | void LCD_ST7735::drawVertLine(int x1, int y1, int y2, uint16_t color) |
taylorza | 0:7b3fb3085867 | 222 | { |
taylorza | 0:7b3fb3085867 | 223 | clipRect(x1, y1, x1, y2); |
taylorza | 0:7b3fb3085867 | 224 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 225 | for (int i = 0; i < (y2 - y1) * 2; ++i) |
taylorza | 0:7b3fb3085867 | 226 | { |
taylorza | 0:7b3fb3085867 | 227 | writeBatchData(color); |
taylorza | 0:7b3fb3085867 | 228 | } |
taylorza | 0:7b3fb3085867 | 229 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 230 | } |
taylorza | 0:7b3fb3085867 | 231 | |
taylorza | 0:7b3fb3085867 | 232 | void LCD_ST7735::drawHorizLine(int x1, int y1, int x2, uint16_t color) |
taylorza | 0:7b3fb3085867 | 233 | { |
taylorza | 0:7b3fb3085867 | 234 | clipRect(x1, y1, x2, y1); |
taylorza | 0:7b3fb3085867 | 235 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 236 | for (int i = 0; i < (x2 - x1) * 2; ++i) |
taylorza | 0:7b3fb3085867 | 237 | { |
taylorza | 0:7b3fb3085867 | 238 | writeBatchData(color); |
taylorza | 0:7b3fb3085867 | 239 | } |
taylorza | 0:7b3fb3085867 | 240 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 241 | } |
taylorza | 0:7b3fb3085867 | 242 | |
taylorza | 0:7b3fb3085867 | 243 | void LCD_ST7735::drawChar(const uint8_t *pFont, int x, int y, char c) |
taylorza | 0:7b3fb3085867 | 244 | { |
taylorza | 0:7b3fb3085867 | 245 | const uint8_t *pChar = pFont + (c * 8); |
taylorza | 0:7b3fb3085867 | 246 | |
taylorza | 0:7b3fb3085867 | 247 | clip(x, y, 8, 8); |
taylorza | 0:7b3fb3085867 | 248 | beginBatchCommand(CMD_RAMWR); |
taylorza | 0:7b3fb3085867 | 249 | for(int r = 0; r < 8; ++r) |
taylorza | 0:7b3fb3085867 | 250 | { |
taylorza | 0:7b3fb3085867 | 251 | uint8_t b = pChar[r]; |
taylorza | 0:7b3fb3085867 | 252 | for(int c = 0; c < 8; ++c) |
taylorza | 0:7b3fb3085867 | 253 | { |
taylorza | 0:7b3fb3085867 | 254 | if (b & 0x80) |
taylorza | 0:7b3fb3085867 | 255 | writeBatchData(_foregroundColor); |
taylorza | 0:7b3fb3085867 | 256 | else |
taylorza | 0:7b3fb3085867 | 257 | writeBatchData(_backgroundColor); |
taylorza | 0:7b3fb3085867 | 258 | |
taylorza | 0:7b3fb3085867 | 259 | b <<= 1; |
taylorza | 0:7b3fb3085867 | 260 | } |
taylorza | 0:7b3fb3085867 | 261 | } |
taylorza | 0:7b3fb3085867 | 262 | endBatchCommand(); |
taylorza | 0:7b3fb3085867 | 263 | } |
taylorza | 0:7b3fb3085867 | 264 | |
taylorza | 0:7b3fb3085867 | 265 | void LCD_ST7735::initDisplay() |
taylorza | 0:7b3fb3085867 | 266 | { |
taylorza | 0:7b3fb3085867 | 267 | reset(); |
taylorza | 0:7b3fb3085867 | 268 | |
taylorza | 0:7b3fb3085867 | 269 | write(CMD_SLPOUT); |
taylorza | 0:7b3fb3085867 | 270 | |
taylorza | 0:7b3fb3085867 | 271 | write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3); |
taylorza | 0:7b3fb3085867 | 272 | write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3); |
taylorza | 0:7b3fb3085867 | 273 | write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6); |
taylorza | 0:7b3fb3085867 | 274 | |
taylorza | 0:7b3fb3085867 | 275 | write(CMD_INVCTR, (uint8_t[]){0x07}, 1); |
taylorza | 0:7b3fb3085867 | 276 | |
taylorza | 0:7b3fb3085867 | 277 | write(CMD_PWCTR1, (uint8_t[]){0xa2, 0x02, 0x84}, 3); |
taylorza | 0:7b3fb3085867 | 278 | write(CMD_PWCTR2, (uint8_t[]){0xc5}, 1); |
taylorza | 0:7b3fb3085867 | 279 | write(CMD_PWCTR3, (uint8_t[]){0x0a, 0x00}, 2); |
taylorza | 0:7b3fb3085867 | 280 | write(CMD_PWCTR4, (uint8_t[]){0x8a, 0x2a}, 2); |
taylorza | 0:7b3fb3085867 | 281 | write(CMD_PWCTR5, (uint8_t[]){0x8a, 0xee}, 2); |
taylorza | 0:7b3fb3085867 | 282 | |
taylorza | 0:7b3fb3085867 | 283 | write(CMD_VMCTR1, (uint8_t[]){0x0e}, 1); |
taylorza | 0:7b3fb3085867 | 284 | |
taylorza | 0:7b3fb3085867 | 285 | write(CMD_MADCTL, (uint8_t[]){0xc8}, 1); |
taylorza | 0:7b3fb3085867 | 286 | |
taylorza | 0:7b3fb3085867 | 287 | // Gama sequence |
taylorza | 0:7b3fb3085867 | 288 | write(CMD_GAMCTRP1, (uint8_t[]) |
taylorza | 0:7b3fb3085867 | 289 | { |
taylorza | 0:7b3fb3085867 | 290 | 0x0f, 0x1a, |
taylorza | 0:7b3fb3085867 | 291 | 0x0f, 0x18, |
taylorza | 0:7b3fb3085867 | 292 | 0x2f, 0x28, |
taylorza | 0:7b3fb3085867 | 293 | 0x20, 0x22, |
taylorza | 0:7b3fb3085867 | 294 | 0x1f, 0x1b, |
taylorza | 0:7b3fb3085867 | 295 | 0x23, 0x37, |
taylorza | 0:7b3fb3085867 | 296 | 0x00, 0x07, |
taylorza | 0:7b3fb3085867 | 297 | 0x02, 0x10 |
taylorza | 0:7b3fb3085867 | 298 | }, 16); |
taylorza | 0:7b3fb3085867 | 299 | |
taylorza | 0:7b3fb3085867 | 300 | write(CMD_GAMCTRN1, (uint8_t[]) |
taylorza | 0:7b3fb3085867 | 301 | { |
taylorza | 0:7b3fb3085867 | 302 | 0x0f, 0x1b, |
taylorza | 0:7b3fb3085867 | 303 | 0x0f, 0x17, |
taylorza | 0:7b3fb3085867 | 304 | 0x33, 0x2c, |
taylorza | 0:7b3fb3085867 | 305 | 0x29, 0x2e, |
taylorza | 0:7b3fb3085867 | 306 | 0x30, 0x30, |
taylorza | 0:7b3fb3085867 | 307 | 0x39, 0x3f, |
taylorza | 0:7b3fb3085867 | 308 | 0x00, 0x07, |
taylorza | 0:7b3fb3085867 | 309 | 0x03, 0x10 |
taylorza | 0:7b3fb3085867 | 310 | }, 16); |
taylorza | 0:7b3fb3085867 | 311 | |
taylorza | 0:7b3fb3085867 | 312 | write(CMD_CASET, (uint8_t[]){0x00, 0x00, 0x00, 0x7f}, 4); |
taylorza | 0:7b3fb3085867 | 313 | write(CMD_RASET, (uint8_t[]){0x00, 0x00, 0x00, 0x9f}, 4); |
taylorza | 0:7b3fb3085867 | 314 | |
taylorza | 0:7b3fb3085867 | 315 | write(CMD_EXTCTRL, (uint8_t[]){0x01}, 1); |
taylorza | 0:7b3fb3085867 | 316 | |
taylorza | 0:7b3fb3085867 | 317 | // Disable RAM power save |
taylorza | 0:7b3fb3085867 | 318 | write(0xf6, (uint8_t[]){0x00}, 1); |
taylorza | 0:7b3fb3085867 | 319 | |
taylorza | 0:7b3fb3085867 | 320 | // 65k color mode |
taylorza | 0:7b3fb3085867 | 321 | write(CMD_COLMOD, (uint8_t[]){0x05}, 1); |
taylorza | 0:7b3fb3085867 | 322 | |
taylorza | 0:7b3fb3085867 | 323 | // Enable display |
taylorza | 0:7b3fb3085867 | 324 | write(CMD_DISPON); |
taylorza | 0:7b3fb3085867 | 325 | |
taylorza | 0:7b3fb3085867 | 326 | setBacklight(true); |
taylorza | 0:7b3fb3085867 | 327 | } |
taylorza | 0:7b3fb3085867 | 328 | |
taylorza | 0:7b3fb3085867 | 329 | void LCD_ST7735::reset() |
taylorza | 0:7b3fb3085867 | 330 | { |
taylorza | 0:7b3fb3085867 | 331 | _reset = 0; |
taylorza | 0:7b3fb3085867 | 332 | wait_us(100); |
taylorza | 0:7b3fb3085867 | 333 | _reset = 1; |
taylorza | 0:7b3fb3085867 | 334 | wait_us(100); |
taylorza | 0:7b3fb3085867 | 335 | } |
taylorza | 0:7b3fb3085867 | 336 | |
taylorza | 0:7b3fb3085867 | 337 | void LCD_ST7735::clip(int x, int y, int w, int h) |
taylorza | 0:7b3fb3085867 | 338 | { |
taylorza | 0:7b3fb3085867 | 339 | clipRect(x, y, (x + w) - 1, (y + h) - 1); |
taylorza | 0:7b3fb3085867 | 340 | } |
taylorza | 0:7b3fb3085867 | 341 | |
taylorza | 0:7b3fb3085867 | 342 | void LCD_ST7735::clipRect(int x1, int y1, int x2, int y2) |
taylorza | 0:7b3fb3085867 | 343 | { |
taylorza | 0:7b3fb3085867 | 344 | uint8_t x1l = (uint8_t)(x1 & 0xff); |
taylorza | 0:7b3fb3085867 | 345 | uint8_t x1h = (uint8_t)((x1 >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 346 | uint8_t x2l = (uint8_t)(x2 & 0xff); |
taylorza | 0:7b3fb3085867 | 347 | uint8_t x2h = (uint8_t)((x2 >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 348 | write(CMD_CASET, (uint8_t[]){x1h, x1l, x2h, x2l}, 4); |
taylorza | 0:7b3fb3085867 | 349 | |
taylorza | 0:7b3fb3085867 | 350 | uint8_t y1l = (uint8_t)(y1 & 0xff); |
taylorza | 0:7b3fb3085867 | 351 | uint8_t y1h = (uint8_t)((y1 >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 352 | uint8_t y2l = (uint8_t)(y2 & 0xff); |
taylorza | 0:7b3fb3085867 | 353 | uint8_t y2h = (uint8_t)((y2 >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 354 | write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4); |
taylorza | 0:7b3fb3085867 | 355 | } |
taylorza | 0:7b3fb3085867 | 356 | |
taylorza | 0:7b3fb3085867 | 357 | void LCD_ST7735::write(uint8_t cmd) |
taylorza | 0:7b3fb3085867 | 358 | { |
taylorza | 0:7b3fb3085867 | 359 | write(cmd, NULL, 0); |
taylorza | 0:7b3fb3085867 | 360 | } |
taylorza | 0:7b3fb3085867 | 361 | |
taylorza | 0:7b3fb3085867 | 362 | void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen) |
taylorza | 0:7b3fb3085867 | 363 | { |
taylorza | 0:7b3fb3085867 | 364 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 365 | _cs = 0; |
taylorza | 0:7b3fb3085867 | 366 | _spi.write(cmd); |
taylorza | 0:7b3fb3085867 | 367 | if (data != NULL & dataLen > 0) |
taylorza | 0:7b3fb3085867 | 368 | { |
taylorza | 0:7b3fb3085867 | 369 | _ds = 1; |
taylorza | 0:7b3fb3085867 | 370 | for(int i = 0; i < dataLen; ++i) |
taylorza | 0:7b3fb3085867 | 371 | { |
taylorza | 0:7b3fb3085867 | 372 | _spi.write(data[i]); |
taylorza | 0:7b3fb3085867 | 373 | } |
taylorza | 0:7b3fb3085867 | 374 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 375 | } |
taylorza | 0:7b3fb3085867 | 376 | _cs = 1; |
taylorza | 0:7b3fb3085867 | 377 | } |
taylorza | 0:7b3fb3085867 | 378 | |
taylorza | 0:7b3fb3085867 | 379 | void LCD_ST7735::write(uint8_t cmd, uint16_t data) |
taylorza | 0:7b3fb3085867 | 380 | { |
taylorza | 0:7b3fb3085867 | 381 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 382 | _cs = 0; |
taylorza | 0:7b3fb3085867 | 383 | _spi.write(cmd); |
taylorza | 0:7b3fb3085867 | 384 | _ds = 1; |
taylorza | 0:7b3fb3085867 | 385 | _spi.write((data >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 386 | _spi.write(data & 0xff); |
taylorza | 0:7b3fb3085867 | 387 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 388 | _cs = 1; |
taylorza | 0:7b3fb3085867 | 389 | } |
taylorza | 0:7b3fb3085867 | 390 | |
taylorza | 0:7b3fb3085867 | 391 | void LCD_ST7735::writeData(uint8_t data) |
taylorza | 0:7b3fb3085867 | 392 | { |
taylorza | 0:7b3fb3085867 | 393 | _ds = 1; |
taylorza | 0:7b3fb3085867 | 394 | _cs = 0; |
taylorza | 0:7b3fb3085867 | 395 | _spi.write(data); |
taylorza | 0:7b3fb3085867 | 396 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 397 | _cs = 1; |
taylorza | 0:7b3fb3085867 | 398 | } |
taylorza | 0:7b3fb3085867 | 399 | |
taylorza | 0:7b3fb3085867 | 400 | void LCD_ST7735::beginBatchCommand(uint8_t cmd) |
taylorza | 0:7b3fb3085867 | 401 | { |
taylorza | 0:7b3fb3085867 | 402 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 403 | _cs = 0; |
taylorza | 0:7b3fb3085867 | 404 | _spi.write(cmd); |
taylorza | 0:7b3fb3085867 | 405 | _ds = 1; |
taylorza | 0:7b3fb3085867 | 406 | } |
taylorza | 0:7b3fb3085867 | 407 | |
taylorza | 0:7b3fb3085867 | 408 | void LCD_ST7735::writeBatchData(uint8_t data) |
taylorza | 0:7b3fb3085867 | 409 | { |
taylorza | 0:7b3fb3085867 | 410 | _spi.write(data); |
taylorza | 0:7b3fb3085867 | 411 | } |
taylorza | 0:7b3fb3085867 | 412 | |
taylorza | 0:7b3fb3085867 | 413 | void LCD_ST7735::writeBatchData(uint16_t data) |
taylorza | 0:7b3fb3085867 | 414 | { |
taylorza | 0:7b3fb3085867 | 415 | _spi.write((data >> 8) & 0xff); |
taylorza | 0:7b3fb3085867 | 416 | _spi.write(data & 0xff); |
taylorza | 0:7b3fb3085867 | 417 | } |
taylorza | 0:7b3fb3085867 | 418 | |
taylorza | 0:7b3fb3085867 | 419 | void LCD_ST7735::endBatchCommand() |
taylorza | 0:7b3fb3085867 | 420 | { |
taylorza | 0:7b3fb3085867 | 421 | _ds = 0; |
taylorza | 0:7b3fb3085867 | 422 | _cs = 1; |
taylorza | 0:7b3fb3085867 | 423 | } |