SPI based library for the ST7735 LCD controller.

Dependents:   RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more

Committer:
taylorza
Date:
Sat Sep 20 04:28:41 2014 +0000
Revision:
1:33ff5fad4320
Parent:
0:7b3fb3085867
Child:
3:451148656b76
Added support for:
; 1. Drawing ellipses and drawing filled ellipses.
; 2. Drawing a bitmap from a subsection of an existing bitmap

Who changed what in which revision?

UserRevisionLine numberNew 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 1:33ff5fad4320 19 _spi.frequency(15000000);
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 1:33ff5fad4320 134 void LCD_ST7735::drawEllipse(int x, int y, int rx, int ry, uint16_t color)
taylorza 1:33ff5fad4320 135 {
taylorza 1:33ff5fad4320 136 int a2 = rx * rx;
taylorza 1:33ff5fad4320 137 int b2 = ry * ry;
taylorza 1:33ff5fad4320 138 int fa2 = 4 * a2;
taylorza 1:33ff5fad4320 139 int fb2 = 4 * b2;
taylorza 1:33ff5fad4320 140
taylorza 1:33ff5fad4320 141 int ix, iy, sigma;
taylorza 1:33ff5fad4320 142 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 1:33ff5fad4320 143 {
taylorza 1:33ff5fad4320 144 setPixel(x + ix, y + iy, color);
taylorza 1:33ff5fad4320 145 setPixel(x - ix, y + iy, color);
taylorza 1:33ff5fad4320 146 setPixel(x + ix, y - iy, color);
taylorza 1:33ff5fad4320 147 setPixel(x - ix, y - iy, color);
taylorza 1:33ff5fad4320 148 if (sigma >= 0)
taylorza 1:33ff5fad4320 149 {
taylorza 1:33ff5fad4320 150 sigma+= fa2 * (1 - iy);
taylorza 1:33ff5fad4320 151 iy--;
taylorza 1:33ff5fad4320 152 }
taylorza 1:33ff5fad4320 153 sigma += b2 * ((4 * ix) + 6);
taylorza 1:33ff5fad4320 154 }
taylorza 1:33ff5fad4320 155
taylorza 1:33ff5fad4320 156 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 1:33ff5fad4320 157 {
taylorza 1:33ff5fad4320 158 setPixel(x + ix, y + iy, color);
taylorza 1:33ff5fad4320 159 setPixel(x - ix, y + iy, color);
taylorza 1:33ff5fad4320 160 setPixel(x + ix, y - iy, color);
taylorza 1:33ff5fad4320 161 setPixel(x - ix, y - iy, color);
taylorza 1:33ff5fad4320 162 if (sigma >= 0)
taylorza 1:33ff5fad4320 163 {
taylorza 1:33ff5fad4320 164 sigma+= fb2 * (1 - ix);
taylorza 1:33ff5fad4320 165 ix--;
taylorza 1:33ff5fad4320 166 }
taylorza 1:33ff5fad4320 167 sigma += a2 * ((4 * iy) + 6);
taylorza 1:33ff5fad4320 168 }
taylorza 1:33ff5fad4320 169 }
taylorza 1:33ff5fad4320 170
taylorza 0:7b3fb3085867 171 void LCD_ST7735::fillRect(int x1, int y1, int x2, int y2, uint16_t borderColor, uint16_t fillColor)
taylorza 0:7b3fb3085867 172 {
taylorza 0:7b3fb3085867 173 if (x1 > x2) swap(x1, x2);
taylorza 0:7b3fb3085867 174 if (y1 > y2) swap(y1, y2);
taylorza 0:7b3fb3085867 175
taylorza 0:7b3fb3085867 176 drawRect(x1, y1, x2, y2, borderColor);
taylorza 0:7b3fb3085867 177 clipRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1);
taylorza 0:7b3fb3085867 178 int c = ((x2-x1-2) * (y2-y1-2)) << 1;
taylorza 0:7b3fb3085867 179 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 180 while(c--)
taylorza 0:7b3fb3085867 181 {
taylorza 0:7b3fb3085867 182 writeBatchData(fillColor);
taylorza 0:7b3fb3085867 183 }
taylorza 0:7b3fb3085867 184 endBatchCommand();
taylorza 0:7b3fb3085867 185 }
taylorza 0:7b3fb3085867 186
taylorza 0:7b3fb3085867 187 void LCD_ST7735::fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor)
taylorza 0:7b3fb3085867 188 {
taylorza 0:7b3fb3085867 189 int ix = r;
taylorza 0:7b3fb3085867 190 int iy = 0;
taylorza 0:7b3fb3085867 191 int err = 1 - r;
taylorza 0:7b3fb3085867 192
taylorza 0:7b3fb3085867 193 while(ix >= iy)
taylorza 0:7b3fb3085867 194 {
taylorza 0:7b3fb3085867 195 setPixel(x - ix, y + iy, borderColor);
taylorza 0:7b3fb3085867 196 setPixel(x + ix, y + iy, borderColor);
taylorza 0:7b3fb3085867 197 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 198
taylorza 0:7b3fb3085867 199 setPixel(x - iy, y + ix, borderColor);
taylorza 0:7b3fb3085867 200 setPixel(x + iy, y + ix, borderColor);
taylorza 0:7b3fb3085867 201 drawHorizLine(x - iy + 1, y + ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 202
taylorza 0:7b3fb3085867 203 setPixel(x - ix, y - iy, borderColor);
taylorza 0:7b3fb3085867 204 setPixel(x + ix, y - iy, borderColor);
taylorza 0:7b3fb3085867 205 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 206
taylorza 0:7b3fb3085867 207 setPixel(x - iy, y - ix, borderColor);
taylorza 0:7b3fb3085867 208 setPixel(x + iy, y - ix, borderColor);
taylorza 0:7b3fb3085867 209 drawHorizLine(x - iy + 1, y - ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 210 iy++;
taylorza 0:7b3fb3085867 211 if (err < 0)
taylorza 0:7b3fb3085867 212 {
taylorza 0:7b3fb3085867 213 err += 2 * iy + 1;
taylorza 0:7b3fb3085867 214 }
taylorza 0:7b3fb3085867 215 else
taylorza 0:7b3fb3085867 216 {
taylorza 0:7b3fb3085867 217 ix--;
taylorza 0:7b3fb3085867 218 err += 2 * (iy - ix + 1);
taylorza 0:7b3fb3085867 219 }
taylorza 0:7b3fb3085867 220 }
taylorza 0:7b3fb3085867 221 }
taylorza 0:7b3fb3085867 222
taylorza 1:33ff5fad4320 223 void LCD_ST7735::fillEllipse(int x, int y, int rx, int ry, uint16_t borderColor, uint16_t fillColor)
taylorza 1:33ff5fad4320 224 {
taylorza 1:33ff5fad4320 225 int a2 = rx * rx;
taylorza 1:33ff5fad4320 226 int b2 = ry * ry;
taylorza 1:33ff5fad4320 227 int fa2 = 4 * a2;
taylorza 1:33ff5fad4320 228 int fb2 = 4 * b2;
taylorza 1:33ff5fad4320 229
taylorza 1:33ff5fad4320 230 int ix, iy, sigma;
taylorza 1:33ff5fad4320 231 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 1:33ff5fad4320 232 {
taylorza 1:33ff5fad4320 233 setPixel(x + ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 234 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 235 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 236
taylorza 1:33ff5fad4320 237 setPixel(x + ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 238 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 239 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 240
taylorza 1:33ff5fad4320 241 if (sigma >= 0)
taylorza 1:33ff5fad4320 242 {
taylorza 1:33ff5fad4320 243 sigma+= fa2 * (1 - iy);
taylorza 1:33ff5fad4320 244 iy--;
taylorza 1:33ff5fad4320 245 }
taylorza 1:33ff5fad4320 246 sigma += b2 * ((4 * ix) + 6);
taylorza 1:33ff5fad4320 247 }
taylorza 1:33ff5fad4320 248
taylorza 1:33ff5fad4320 249 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 1:33ff5fad4320 250 {
taylorza 1:33ff5fad4320 251 setPixel(x + ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 252 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 253 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 254
taylorza 1:33ff5fad4320 255 setPixel(x + ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 256 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 257 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 258 if (sigma >= 0)
taylorza 1:33ff5fad4320 259 {
taylorza 1:33ff5fad4320 260 sigma+= fb2 * (1 - ix);
taylorza 1:33ff5fad4320 261 ix--;
taylorza 1:33ff5fad4320 262 }
taylorza 1:33ff5fad4320 263 sigma += a2 * ((4 * iy) + 6);
taylorza 1:33ff5fad4320 264 }
taylorza 1:33ff5fad4320 265 }
taylorza 1:33ff5fad4320 266
taylorza 0:7b3fb3085867 267 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp)
taylorza 0:7b3fb3085867 268 {
taylorza 0:7b3fb3085867 269 int w = *pbmp++;
taylorza 0:7b3fb3085867 270 int h = *pbmp++;
taylorza 0:7b3fb3085867 271
taylorza 0:7b3fb3085867 272 clip(x, y, w, h);
taylorza 0:7b3fb3085867 273 int c = w * h;
taylorza 0:7b3fb3085867 274 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 275 while(c--)
taylorza 0:7b3fb3085867 276 {
taylorza 0:7b3fb3085867 277 writeBatchData(*pbmp++);
taylorza 0:7b3fb3085867 278 }
taylorza 0:7b3fb3085867 279 endBatchCommand();
taylorza 0:7b3fb3085867 280 }
taylorza 0:7b3fb3085867 281
taylorza 1:33ff5fad4320 282 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight)
taylorza 1:33ff5fad4320 283 {
taylorza 1:33ff5fad4320 284 int w = *pbmp++;
taylorza 1:33ff5fad4320 285 int h = *pbmp++;
taylorza 1:33ff5fad4320 286
taylorza 1:33ff5fad4320 287 clip(x, y, srcWidth, srcHeight);
taylorza 1:33ff5fad4320 288 beginBatchCommand(CMD_RAMWR);
taylorza 1:33ff5fad4320 289 const uint16_t *p = pbmp + srcX + (srcY * w);
taylorza 1:33ff5fad4320 290 for(int iy = 0; iy < srcHeight; ++iy)
taylorza 1:33ff5fad4320 291 {
taylorza 1:33ff5fad4320 292 for(int ix = 0; ix < srcWidth; ++ix)
taylorza 1:33ff5fad4320 293 {
taylorza 1:33ff5fad4320 294 writeBatchData(*(p + ix));
taylorza 1:33ff5fad4320 295 }
taylorza 1:33ff5fad4320 296 p += w;
taylorza 1:33ff5fad4320 297 }
taylorza 1:33ff5fad4320 298 endBatchCommand();
taylorza 1:33ff5fad4320 299 }
taylorza 1:33ff5fad4320 300
taylorza 0:7b3fb3085867 301 void LCD_ST7735::setForegroundColor(uint16_t color)
taylorza 0:7b3fb3085867 302 {
taylorza 0:7b3fb3085867 303 _foregroundColor = color;
taylorza 0:7b3fb3085867 304 }
taylorza 0:7b3fb3085867 305
taylorza 0:7b3fb3085867 306 void LCD_ST7735::setBackgroundColor(uint16_t color)
taylorza 0:7b3fb3085867 307 {
taylorza 0:7b3fb3085867 308 _backgroundColor = color;
taylorza 0:7b3fb3085867 309 }
taylorza 0:7b3fb3085867 310
taylorza 0:7b3fb3085867 311 void LCD_ST7735::drawString(const uint8_t *pFont, int x, int y, const char *pString)
taylorza 0:7b3fb3085867 312 {
taylorza 0:7b3fb3085867 313 char *p = (char*)pString;
taylorza 0:7b3fb3085867 314 while(*p != 0)
taylorza 0:7b3fb3085867 315 {
taylorza 0:7b3fb3085867 316 drawChar(pFont, x, y, *p++);
taylorza 0:7b3fb3085867 317 x += 8;
taylorza 0:7b3fb3085867 318 }
taylorza 0:7b3fb3085867 319 }
taylorza 0:7b3fb3085867 320
taylorza 0:7b3fb3085867 321 void LCD_ST7735::drawVertLine(int x1, int y1, int y2, uint16_t color)
taylorza 0:7b3fb3085867 322 {
taylorza 0:7b3fb3085867 323 clipRect(x1, y1, x1, y2);
taylorza 0:7b3fb3085867 324 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 325 for (int i = 0; i < (y2 - y1) * 2; ++i)
taylorza 0:7b3fb3085867 326 {
taylorza 0:7b3fb3085867 327 writeBatchData(color);
taylorza 0:7b3fb3085867 328 }
taylorza 0:7b3fb3085867 329 endBatchCommand();
taylorza 0:7b3fb3085867 330 }
taylorza 0:7b3fb3085867 331
taylorza 0:7b3fb3085867 332 void LCD_ST7735::drawHorizLine(int x1, int y1, int x2, uint16_t color)
taylorza 0:7b3fb3085867 333 {
taylorza 0:7b3fb3085867 334 clipRect(x1, y1, x2, y1);
taylorza 0:7b3fb3085867 335 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 336 for (int i = 0; i < (x2 - x1) * 2; ++i)
taylorza 0:7b3fb3085867 337 {
taylorza 0:7b3fb3085867 338 writeBatchData(color);
taylorza 0:7b3fb3085867 339 }
taylorza 0:7b3fb3085867 340 endBatchCommand();
taylorza 0:7b3fb3085867 341 }
taylorza 0:7b3fb3085867 342
taylorza 0:7b3fb3085867 343 void LCD_ST7735::drawChar(const uint8_t *pFont, int x, int y, char c)
taylorza 0:7b3fb3085867 344 {
taylorza 0:7b3fb3085867 345 const uint8_t *pChar = pFont + (c * 8);
taylorza 0:7b3fb3085867 346
taylorza 0:7b3fb3085867 347 clip(x, y, 8, 8);
taylorza 0:7b3fb3085867 348 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 349 for(int r = 0; r < 8; ++r)
taylorza 0:7b3fb3085867 350 {
taylorza 0:7b3fb3085867 351 uint8_t b = pChar[r];
taylorza 0:7b3fb3085867 352 for(int c = 0; c < 8; ++c)
taylorza 0:7b3fb3085867 353 {
taylorza 0:7b3fb3085867 354 if (b & 0x80)
taylorza 0:7b3fb3085867 355 writeBatchData(_foregroundColor);
taylorza 0:7b3fb3085867 356 else
taylorza 0:7b3fb3085867 357 writeBatchData(_backgroundColor);
taylorza 0:7b3fb3085867 358
taylorza 0:7b3fb3085867 359 b <<= 1;
taylorza 0:7b3fb3085867 360 }
taylorza 0:7b3fb3085867 361 }
taylorza 0:7b3fb3085867 362 endBatchCommand();
taylorza 0:7b3fb3085867 363 }
taylorza 0:7b3fb3085867 364
taylorza 0:7b3fb3085867 365 void LCD_ST7735::initDisplay()
taylorza 0:7b3fb3085867 366 {
taylorza 0:7b3fb3085867 367 reset();
taylorza 0:7b3fb3085867 368
taylorza 0:7b3fb3085867 369 write(CMD_SLPOUT);
taylorza 0:7b3fb3085867 370
taylorza 0:7b3fb3085867 371 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:7b3fb3085867 372 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:7b3fb3085867 373 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
taylorza 0:7b3fb3085867 374
taylorza 0:7b3fb3085867 375 write(CMD_INVCTR, (uint8_t[]){0x07}, 1);
taylorza 0:7b3fb3085867 376
taylorza 0:7b3fb3085867 377 write(CMD_PWCTR1, (uint8_t[]){0xa2, 0x02, 0x84}, 3);
taylorza 0:7b3fb3085867 378 write(CMD_PWCTR2, (uint8_t[]){0xc5}, 1);
taylorza 0:7b3fb3085867 379 write(CMD_PWCTR3, (uint8_t[]){0x0a, 0x00}, 2);
taylorza 0:7b3fb3085867 380 write(CMD_PWCTR4, (uint8_t[]){0x8a, 0x2a}, 2);
taylorza 0:7b3fb3085867 381 write(CMD_PWCTR5, (uint8_t[]){0x8a, 0xee}, 2);
taylorza 0:7b3fb3085867 382
taylorza 0:7b3fb3085867 383 write(CMD_VMCTR1, (uint8_t[]){0x0e}, 1);
taylorza 0:7b3fb3085867 384
taylorza 0:7b3fb3085867 385 write(CMD_MADCTL, (uint8_t[]){0xc8}, 1);
taylorza 0:7b3fb3085867 386
taylorza 0:7b3fb3085867 387 // Gama sequence
taylorza 0:7b3fb3085867 388 write(CMD_GAMCTRP1, (uint8_t[])
taylorza 0:7b3fb3085867 389 {
taylorza 0:7b3fb3085867 390 0x0f, 0x1a,
taylorza 0:7b3fb3085867 391 0x0f, 0x18,
taylorza 0:7b3fb3085867 392 0x2f, 0x28,
taylorza 0:7b3fb3085867 393 0x20, 0x22,
taylorza 0:7b3fb3085867 394 0x1f, 0x1b,
taylorza 0:7b3fb3085867 395 0x23, 0x37,
taylorza 0:7b3fb3085867 396 0x00, 0x07,
taylorza 0:7b3fb3085867 397 0x02, 0x10
taylorza 0:7b3fb3085867 398 }, 16);
taylorza 0:7b3fb3085867 399
taylorza 0:7b3fb3085867 400 write(CMD_GAMCTRN1, (uint8_t[])
taylorza 0:7b3fb3085867 401 {
taylorza 0:7b3fb3085867 402 0x0f, 0x1b,
taylorza 0:7b3fb3085867 403 0x0f, 0x17,
taylorza 0:7b3fb3085867 404 0x33, 0x2c,
taylorza 0:7b3fb3085867 405 0x29, 0x2e,
taylorza 0:7b3fb3085867 406 0x30, 0x30,
taylorza 0:7b3fb3085867 407 0x39, 0x3f,
taylorza 0:7b3fb3085867 408 0x00, 0x07,
taylorza 0:7b3fb3085867 409 0x03, 0x10
taylorza 0:7b3fb3085867 410 }, 16);
taylorza 0:7b3fb3085867 411
taylorza 0:7b3fb3085867 412 write(CMD_CASET, (uint8_t[]){0x00, 0x00, 0x00, 0x7f}, 4);
taylorza 0:7b3fb3085867 413 write(CMD_RASET, (uint8_t[]){0x00, 0x00, 0x00, 0x9f}, 4);
taylorza 0:7b3fb3085867 414
taylorza 0:7b3fb3085867 415 write(CMD_EXTCTRL, (uint8_t[]){0x01}, 1);
taylorza 0:7b3fb3085867 416
taylorza 0:7b3fb3085867 417 // Disable RAM power save
taylorza 0:7b3fb3085867 418 write(0xf6, (uint8_t[]){0x00}, 1);
taylorza 0:7b3fb3085867 419
taylorza 0:7b3fb3085867 420 // 65k color mode
taylorza 0:7b3fb3085867 421 write(CMD_COLMOD, (uint8_t[]){0x05}, 1);
taylorza 0:7b3fb3085867 422
taylorza 0:7b3fb3085867 423 // Enable display
taylorza 0:7b3fb3085867 424 write(CMD_DISPON);
taylorza 0:7b3fb3085867 425
taylorza 0:7b3fb3085867 426 setBacklight(true);
taylorza 0:7b3fb3085867 427 }
taylorza 0:7b3fb3085867 428
taylorza 0:7b3fb3085867 429 void LCD_ST7735::reset()
taylorza 0:7b3fb3085867 430 {
taylorza 0:7b3fb3085867 431 _reset = 0;
taylorza 0:7b3fb3085867 432 wait_us(100);
taylorza 0:7b3fb3085867 433 _reset = 1;
taylorza 0:7b3fb3085867 434 wait_us(100);
taylorza 0:7b3fb3085867 435 }
taylorza 0:7b3fb3085867 436
taylorza 0:7b3fb3085867 437 void LCD_ST7735::clip(int x, int y, int w, int h)
taylorza 0:7b3fb3085867 438 {
taylorza 0:7b3fb3085867 439 clipRect(x, y, (x + w) - 1, (y + h) - 1);
taylorza 0:7b3fb3085867 440 }
taylorza 0:7b3fb3085867 441
taylorza 0:7b3fb3085867 442 void LCD_ST7735::clipRect(int x1, int y1, int x2, int y2)
taylorza 0:7b3fb3085867 443 {
taylorza 0:7b3fb3085867 444 uint8_t x1l = (uint8_t)(x1 & 0xff);
taylorza 0:7b3fb3085867 445 uint8_t x1h = (uint8_t)((x1 >> 8) & 0xff);
taylorza 0:7b3fb3085867 446 uint8_t x2l = (uint8_t)(x2 & 0xff);
taylorza 0:7b3fb3085867 447 uint8_t x2h = (uint8_t)((x2 >> 8) & 0xff);
taylorza 0:7b3fb3085867 448 write(CMD_CASET, (uint8_t[]){x1h, x1l, x2h, x2l}, 4);
taylorza 0:7b3fb3085867 449
taylorza 0:7b3fb3085867 450 uint8_t y1l = (uint8_t)(y1 & 0xff);
taylorza 0:7b3fb3085867 451 uint8_t y1h = (uint8_t)((y1 >> 8) & 0xff);
taylorza 0:7b3fb3085867 452 uint8_t y2l = (uint8_t)(y2 & 0xff);
taylorza 0:7b3fb3085867 453 uint8_t y2h = (uint8_t)((y2 >> 8) & 0xff);
taylorza 0:7b3fb3085867 454 write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4);
taylorza 0:7b3fb3085867 455 }
taylorza 0:7b3fb3085867 456
taylorza 0:7b3fb3085867 457 void LCD_ST7735::write(uint8_t cmd)
taylorza 0:7b3fb3085867 458 {
taylorza 0:7b3fb3085867 459 write(cmd, NULL, 0);
taylorza 0:7b3fb3085867 460 }
taylorza 0:7b3fb3085867 461
taylorza 0:7b3fb3085867 462 void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen)
taylorza 0:7b3fb3085867 463 {
taylorza 0:7b3fb3085867 464 _ds = 0;
taylorza 0:7b3fb3085867 465 _cs = 0;
taylorza 0:7b3fb3085867 466 _spi.write(cmd);
taylorza 0:7b3fb3085867 467 if (data != NULL & dataLen > 0)
taylorza 0:7b3fb3085867 468 {
taylorza 0:7b3fb3085867 469 _ds = 1;
taylorza 0:7b3fb3085867 470 for(int i = 0; i < dataLen; ++i)
taylorza 0:7b3fb3085867 471 {
taylorza 0:7b3fb3085867 472 _spi.write(data[i]);
taylorza 0:7b3fb3085867 473 }
taylorza 0:7b3fb3085867 474 _ds = 0;
taylorza 0:7b3fb3085867 475 }
taylorza 0:7b3fb3085867 476 _cs = 1;
taylorza 0:7b3fb3085867 477 }
taylorza 0:7b3fb3085867 478
taylorza 0:7b3fb3085867 479 void LCD_ST7735::write(uint8_t cmd, uint16_t data)
taylorza 0:7b3fb3085867 480 {
taylorza 0:7b3fb3085867 481 _ds = 0;
taylorza 0:7b3fb3085867 482 _cs = 0;
taylorza 0:7b3fb3085867 483 _spi.write(cmd);
taylorza 0:7b3fb3085867 484 _ds = 1;
taylorza 0:7b3fb3085867 485 _spi.write((data >> 8) & 0xff);
taylorza 0:7b3fb3085867 486 _spi.write(data & 0xff);
taylorza 0:7b3fb3085867 487 _ds = 0;
taylorza 0:7b3fb3085867 488 _cs = 1;
taylorza 0:7b3fb3085867 489 }
taylorza 0:7b3fb3085867 490
taylorza 0:7b3fb3085867 491 void LCD_ST7735::writeData(uint8_t data)
taylorza 0:7b3fb3085867 492 {
taylorza 0:7b3fb3085867 493 _ds = 1;
taylorza 0:7b3fb3085867 494 _cs = 0;
taylorza 0:7b3fb3085867 495 _spi.write(data);
taylorza 0:7b3fb3085867 496 _ds = 0;
taylorza 0:7b3fb3085867 497 _cs = 1;
taylorza 0:7b3fb3085867 498 }
taylorza 0:7b3fb3085867 499
taylorza 0:7b3fb3085867 500 void LCD_ST7735::beginBatchCommand(uint8_t cmd)
taylorza 0:7b3fb3085867 501 {
taylorza 0:7b3fb3085867 502 _ds = 0;
taylorza 0:7b3fb3085867 503 _cs = 0;
taylorza 0:7b3fb3085867 504 _spi.write(cmd);
taylorza 0:7b3fb3085867 505 _ds = 1;
taylorza 0:7b3fb3085867 506 }
taylorza 0:7b3fb3085867 507
taylorza 0:7b3fb3085867 508 void LCD_ST7735::writeBatchData(uint8_t data)
taylorza 0:7b3fb3085867 509 {
taylorza 0:7b3fb3085867 510 _spi.write(data);
taylorza 0:7b3fb3085867 511 }
taylorza 0:7b3fb3085867 512
taylorza 0:7b3fb3085867 513 void LCD_ST7735::writeBatchData(uint16_t data)
taylorza 0:7b3fb3085867 514 {
taylorza 0:7b3fb3085867 515 _spi.write((data >> 8) & 0xff);
taylorza 0:7b3fb3085867 516 _spi.write(data & 0xff);
taylorza 0:7b3fb3085867 517 }
taylorza 0:7b3fb3085867 518
taylorza 0:7b3fb3085867 519 void LCD_ST7735::endBatchCommand()
taylorza 0:7b3fb3085867 520 {
taylorza 0:7b3fb3085867 521 _ds = 0;
taylorza 0:7b3fb3085867 522 _cs = 1;
taylorza 0:7b3fb3085867 523 }