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 19:09:16 2014 +0000
Revision:
3:451148656b76
Parent:
1:33ff5fad4320
Child:
4:88d22437119c
Added support for setting the screen orientation and determining the screen width and height based on the orientation.

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 3:451148656b76 27 void LCD_ST7735::setOrientation(Orientation orientation, bool flip)
taylorza 3:451148656b76 28 {
taylorza 3:451148656b76 29 const static uint8_t my = 0x80;
taylorza 3:451148656b76 30 const static uint8_t mx = 0x40;
taylorza 3:451148656b76 31 const static uint8_t mv = 0x20;
taylorza 3:451148656b76 32
taylorza 3:451148656b76 33 uint8_t madctlData = 0x08;
taylorza 3:451148656b76 34 switch(orientation)
taylorza 3:451148656b76 35 {
taylorza 3:451148656b76 36 case Rotate0:
taylorza 3:451148656b76 37 _width = 128;
taylorza 3:451148656b76 38 _height = 160;
taylorza 3:451148656b76 39 madctlData |= flip ? mx : 0;
taylorza 3:451148656b76 40 break;
taylorza 3:451148656b76 41
taylorza 3:451148656b76 42 case Rotate90:
taylorza 3:451148656b76 43 _width = 160;
taylorza 3:451148656b76 44 _height = 128;
taylorza 3:451148656b76 45 madctlData |= flip ? my | mv | mx : mv | mx;
taylorza 3:451148656b76 46 break;
taylorza 3:451148656b76 47
taylorza 3:451148656b76 48 case Rotate180:
taylorza 3:451148656b76 49 _width = 128;
taylorza 3:451148656b76 50 _height = 160;
taylorza 3:451148656b76 51 madctlData |= flip ? my : mx | my;
taylorza 3:451148656b76 52 break;
taylorza 3:451148656b76 53
taylorza 3:451148656b76 54 case Rotate270:
taylorza 3:451148656b76 55 _width = 160;
taylorza 3:451148656b76 56 _height = 128;
taylorza 3:451148656b76 57 madctlData |= flip ? mv : mv | my;
taylorza 3:451148656b76 58 break;
taylorza 3:451148656b76 59 }
taylorza 3:451148656b76 60 write(CMD_MADCTL, (uint8_t[]){madctlData}, 1);
taylorza 3:451148656b76 61 }
taylorza 3:451148656b76 62
taylorza 3:451148656b76 63 int LCD_ST7735::getWidth()
taylorza 3:451148656b76 64 {
taylorza 3:451148656b76 65 return _width;
taylorza 3:451148656b76 66 }
taylorza 3:451148656b76 67
taylorza 3:451148656b76 68 int LCD_ST7735::getHeight()
taylorza 3:451148656b76 69 {
taylorza 3:451148656b76 70 return _height;
taylorza 3:451148656b76 71 }
taylorza 3:451148656b76 72
taylorza 0:7b3fb3085867 73 void LCD_ST7735::setBacklight(bool state)
taylorza 0:7b3fb3085867 74 {
taylorza 0:7b3fb3085867 75 _backlight = state ? 1 : 0;
taylorza 0:7b3fb3085867 76 }
taylorza 0:7b3fb3085867 77
taylorza 0:7b3fb3085867 78 void LCD_ST7735::clearScreen(uint16_t color)
taylorza 0:7b3fb3085867 79 {
taylorza 3:451148656b76 80 clipRect(0, 0, _width - 1, _height - 1);
taylorza 0:7b3fb3085867 81 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 82 for(int i = 0; i < 128 * 160 * 2; ++i)
taylorza 0:7b3fb3085867 83 {
taylorza 0:7b3fb3085867 84 writeBatchData(color);
taylorza 0:7b3fb3085867 85 }
taylorza 0:7b3fb3085867 86 endBatchCommand();
taylorza 0:7b3fb3085867 87 }
taylorza 0:7b3fb3085867 88
taylorza 0:7b3fb3085867 89 void LCD_ST7735::setPixel(int x, int y, uint16_t color)
taylorza 0:7b3fb3085867 90 {
taylorza 0:7b3fb3085867 91 write(CMD_CASET, (uint8_t[]){0, x, 0, x}, 4);
taylorza 0:7b3fb3085867 92 write(CMD_RASET, (uint8_t[]){0, y, 0, y}, 4);
taylorza 0:7b3fb3085867 93 write(CMD_RAMWR, color);
taylorza 0:7b3fb3085867 94 }
taylorza 0:7b3fb3085867 95
taylorza 0:7b3fb3085867 96 void LCD_ST7735::drawLine(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:7b3fb3085867 97 {
taylorza 0:7b3fb3085867 98 int dx = abs(x2 - x1);
taylorza 0:7b3fb3085867 99 int dy = abs(y2 - y1);
taylorza 0:7b3fb3085867 100
taylorza 0:7b3fb3085867 101 if (dx == 0)
taylorza 0:7b3fb3085867 102 {
taylorza 0:7b3fb3085867 103 drawVertLine(x1, y1, y2, color);
taylorza 0:7b3fb3085867 104 return;
taylorza 0:7b3fb3085867 105 }
taylorza 0:7b3fb3085867 106 else if(dy == 0)
taylorza 0:7b3fb3085867 107 {
taylorza 0:7b3fb3085867 108 drawHorizLine(x1, y1, x2, color);
taylorza 0:7b3fb3085867 109 return;
taylorza 0:7b3fb3085867 110 }
taylorza 0:7b3fb3085867 111
taylorza 0:7b3fb3085867 112 int sx = (x1 < x2) ? 1 : -1;
taylorza 0:7b3fb3085867 113 int sy = (y1 < y2) ? 1 : -1;
taylorza 0:7b3fb3085867 114 int err = dx - dy;
taylorza 0:7b3fb3085867 115 while(x1 != x2 || y1 != y2)
taylorza 0:7b3fb3085867 116 {
taylorza 0:7b3fb3085867 117 setPixel(x1, y1, color);
taylorza 0:7b3fb3085867 118 int e2 = err << 1;
taylorza 0:7b3fb3085867 119 if (e2 > -dy)
taylorza 0:7b3fb3085867 120 {
taylorza 0:7b3fb3085867 121 err -= dy;
taylorza 0:7b3fb3085867 122 x1 += sx;
taylorza 0:7b3fb3085867 123 }
taylorza 0:7b3fb3085867 124 if (e2 < dx)
taylorza 0:7b3fb3085867 125 {
taylorza 0:7b3fb3085867 126 err += dx;
taylorza 0:7b3fb3085867 127 y1 += sy;
taylorza 0:7b3fb3085867 128 }
taylorza 0:7b3fb3085867 129 }
taylorza 0:7b3fb3085867 130 setPixel(x2, y2, color);
taylorza 0:7b3fb3085867 131 }
taylorza 0:7b3fb3085867 132
taylorza 0:7b3fb3085867 133 void LCD_ST7735::swap(int &a, int &b)
taylorza 0:7b3fb3085867 134 {
taylorza 0:7b3fb3085867 135 int t = a;
taylorza 0:7b3fb3085867 136 a = b;
taylorza 0:7b3fb3085867 137 b = t;
taylorza 0:7b3fb3085867 138 }
taylorza 0:7b3fb3085867 139
taylorza 0:7b3fb3085867 140 void LCD_ST7735::drawRect(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:7b3fb3085867 141 {
taylorza 0:7b3fb3085867 142 if (x1 > x2) swap(x1, x2);
taylorza 0:7b3fb3085867 143 if (y1 > y2) swap(y1, y2);
taylorza 0:7b3fb3085867 144
taylorza 0:7b3fb3085867 145 drawHorizLine(x1, y1, x2, color);
taylorza 0:7b3fb3085867 146 drawHorizLine(x1, y2, x2, color);
taylorza 0:7b3fb3085867 147 drawVertLine(x1, y1, y2, color);
taylorza 0:7b3fb3085867 148 drawVertLine(x2, y1, y2, color);
taylorza 0:7b3fb3085867 149 }
taylorza 0:7b3fb3085867 150
taylorza 0:7b3fb3085867 151 void LCD_ST7735::drawCircle(int x, int y, int r, uint16_t color)
taylorza 0:7b3fb3085867 152 {
taylorza 0:7b3fb3085867 153 int ix = r;
taylorza 0:7b3fb3085867 154 int iy = 0;
taylorza 0:7b3fb3085867 155 int err = 1 - r;
taylorza 0:7b3fb3085867 156
taylorza 0:7b3fb3085867 157 while(ix >= iy)
taylorza 0:7b3fb3085867 158 {
taylorza 0:7b3fb3085867 159 setPixel(x + ix, y + iy, color);
taylorza 0:7b3fb3085867 160 setPixel(x + iy, y + ix, color);
taylorza 0:7b3fb3085867 161 setPixel(x - ix, y + iy, color);
taylorza 0:7b3fb3085867 162 setPixel(x - iy, y + ix, color);
taylorza 0:7b3fb3085867 163 setPixel(x - ix, y - iy, color);
taylorza 0:7b3fb3085867 164 setPixel(x - iy, y - ix, color);
taylorza 0:7b3fb3085867 165 setPixel(x + ix, y - iy, color);
taylorza 0:7b3fb3085867 166 setPixel(x + iy, y - ix, color);
taylorza 0:7b3fb3085867 167 iy++;
taylorza 0:7b3fb3085867 168 if (err < 0)
taylorza 0:7b3fb3085867 169 {
taylorza 0:7b3fb3085867 170 err += 2 * iy + 1;
taylorza 0:7b3fb3085867 171 }
taylorza 0:7b3fb3085867 172 else
taylorza 0:7b3fb3085867 173 {
taylorza 0:7b3fb3085867 174 ix--;
taylorza 0:7b3fb3085867 175 err += 2 * (iy - ix + 1);
taylorza 0:7b3fb3085867 176 }
taylorza 0:7b3fb3085867 177 }
taylorza 0:7b3fb3085867 178 }
taylorza 0:7b3fb3085867 179
taylorza 1:33ff5fad4320 180 void LCD_ST7735::drawEllipse(int x, int y, int rx, int ry, uint16_t color)
taylorza 1:33ff5fad4320 181 {
taylorza 1:33ff5fad4320 182 int a2 = rx * rx;
taylorza 1:33ff5fad4320 183 int b2 = ry * ry;
taylorza 1:33ff5fad4320 184 int fa2 = 4 * a2;
taylorza 1:33ff5fad4320 185 int fb2 = 4 * b2;
taylorza 1:33ff5fad4320 186
taylorza 1:33ff5fad4320 187 int ix, iy, sigma;
taylorza 1:33ff5fad4320 188 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 1:33ff5fad4320 189 {
taylorza 1:33ff5fad4320 190 setPixel(x + ix, y + iy, color);
taylorza 1:33ff5fad4320 191 setPixel(x - ix, y + iy, color);
taylorza 1:33ff5fad4320 192 setPixel(x + ix, y - iy, color);
taylorza 1:33ff5fad4320 193 setPixel(x - ix, y - iy, color);
taylorza 1:33ff5fad4320 194 if (sigma >= 0)
taylorza 1:33ff5fad4320 195 {
taylorza 1:33ff5fad4320 196 sigma+= fa2 * (1 - iy);
taylorza 1:33ff5fad4320 197 iy--;
taylorza 1:33ff5fad4320 198 }
taylorza 1:33ff5fad4320 199 sigma += b2 * ((4 * ix) + 6);
taylorza 1:33ff5fad4320 200 }
taylorza 1:33ff5fad4320 201
taylorza 1:33ff5fad4320 202 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 1:33ff5fad4320 203 {
taylorza 1:33ff5fad4320 204 setPixel(x + ix, y + iy, color);
taylorza 1:33ff5fad4320 205 setPixel(x - ix, y + iy, color);
taylorza 1:33ff5fad4320 206 setPixel(x + ix, y - iy, color);
taylorza 1:33ff5fad4320 207 setPixel(x - ix, y - iy, color);
taylorza 1:33ff5fad4320 208 if (sigma >= 0)
taylorza 1:33ff5fad4320 209 {
taylorza 1:33ff5fad4320 210 sigma+= fb2 * (1 - ix);
taylorza 1:33ff5fad4320 211 ix--;
taylorza 1:33ff5fad4320 212 }
taylorza 1:33ff5fad4320 213 sigma += a2 * ((4 * iy) + 6);
taylorza 1:33ff5fad4320 214 }
taylorza 1:33ff5fad4320 215 }
taylorza 1:33ff5fad4320 216
taylorza 0:7b3fb3085867 217 void LCD_ST7735::fillRect(int x1, int y1, int x2, int y2, uint16_t borderColor, uint16_t fillColor)
taylorza 0:7b3fb3085867 218 {
taylorza 0:7b3fb3085867 219 if (x1 > x2) swap(x1, x2);
taylorza 0:7b3fb3085867 220 if (y1 > y2) swap(y1, y2);
taylorza 0:7b3fb3085867 221
taylorza 0:7b3fb3085867 222 drawRect(x1, y1, x2, y2, borderColor);
taylorza 0:7b3fb3085867 223 clipRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1);
taylorza 0:7b3fb3085867 224 int c = ((x2-x1-2) * (y2-y1-2)) << 1;
taylorza 0:7b3fb3085867 225 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 226 while(c--)
taylorza 0:7b3fb3085867 227 {
taylorza 0:7b3fb3085867 228 writeBatchData(fillColor);
taylorza 0:7b3fb3085867 229 }
taylorza 0:7b3fb3085867 230 endBatchCommand();
taylorza 0:7b3fb3085867 231 }
taylorza 0:7b3fb3085867 232
taylorza 0:7b3fb3085867 233 void LCD_ST7735::fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor)
taylorza 0:7b3fb3085867 234 {
taylorza 0:7b3fb3085867 235 int ix = r;
taylorza 0:7b3fb3085867 236 int iy = 0;
taylorza 0:7b3fb3085867 237 int err = 1 - r;
taylorza 0:7b3fb3085867 238
taylorza 0:7b3fb3085867 239 while(ix >= iy)
taylorza 0:7b3fb3085867 240 {
taylorza 0:7b3fb3085867 241 setPixel(x - ix, y + iy, borderColor);
taylorza 0:7b3fb3085867 242 setPixel(x + ix, y + iy, borderColor);
taylorza 0:7b3fb3085867 243 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 244
taylorza 0:7b3fb3085867 245 setPixel(x - iy, y + ix, borderColor);
taylorza 0:7b3fb3085867 246 setPixel(x + iy, y + ix, borderColor);
taylorza 0:7b3fb3085867 247 drawHorizLine(x - iy + 1, y + ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 248
taylorza 0:7b3fb3085867 249 setPixel(x - ix, y - iy, borderColor);
taylorza 0:7b3fb3085867 250 setPixel(x + ix, y - iy, borderColor);
taylorza 0:7b3fb3085867 251 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 252
taylorza 0:7b3fb3085867 253 setPixel(x - iy, y - ix, borderColor);
taylorza 0:7b3fb3085867 254 setPixel(x + iy, y - ix, borderColor);
taylorza 0:7b3fb3085867 255 drawHorizLine(x - iy + 1, y - ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 256 iy++;
taylorza 0:7b3fb3085867 257 if (err < 0)
taylorza 0:7b3fb3085867 258 {
taylorza 0:7b3fb3085867 259 err += 2 * iy + 1;
taylorza 0:7b3fb3085867 260 }
taylorza 0:7b3fb3085867 261 else
taylorza 0:7b3fb3085867 262 {
taylorza 0:7b3fb3085867 263 ix--;
taylorza 0:7b3fb3085867 264 err += 2 * (iy - ix + 1);
taylorza 0:7b3fb3085867 265 }
taylorza 0:7b3fb3085867 266 }
taylorza 0:7b3fb3085867 267 }
taylorza 0:7b3fb3085867 268
taylorza 1:33ff5fad4320 269 void LCD_ST7735::fillEllipse(int x, int y, int rx, int ry, uint16_t borderColor, uint16_t fillColor)
taylorza 1:33ff5fad4320 270 {
taylorza 1:33ff5fad4320 271 int a2 = rx * rx;
taylorza 1:33ff5fad4320 272 int b2 = ry * ry;
taylorza 1:33ff5fad4320 273 int fa2 = 4 * a2;
taylorza 1:33ff5fad4320 274 int fb2 = 4 * b2;
taylorza 1:33ff5fad4320 275
taylorza 1:33ff5fad4320 276 int ix, iy, sigma;
taylorza 1:33ff5fad4320 277 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 1:33ff5fad4320 278 {
taylorza 1:33ff5fad4320 279 setPixel(x + ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 280 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 281 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 282
taylorza 1:33ff5fad4320 283 setPixel(x + ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 284 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 285 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 286
taylorza 1:33ff5fad4320 287 if (sigma >= 0)
taylorza 1:33ff5fad4320 288 {
taylorza 1:33ff5fad4320 289 sigma+= fa2 * (1 - iy);
taylorza 1:33ff5fad4320 290 iy--;
taylorza 1:33ff5fad4320 291 }
taylorza 1:33ff5fad4320 292 sigma += b2 * ((4 * ix) + 6);
taylorza 1:33ff5fad4320 293 }
taylorza 1:33ff5fad4320 294
taylorza 1:33ff5fad4320 295 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 1:33ff5fad4320 296 {
taylorza 1:33ff5fad4320 297 setPixel(x + ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 298 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 299 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 300
taylorza 1:33ff5fad4320 301 setPixel(x + ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 302 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 303 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 304 if (sigma >= 0)
taylorza 1:33ff5fad4320 305 {
taylorza 1:33ff5fad4320 306 sigma+= fb2 * (1 - ix);
taylorza 1:33ff5fad4320 307 ix--;
taylorza 1:33ff5fad4320 308 }
taylorza 1:33ff5fad4320 309 sigma += a2 * ((4 * iy) + 6);
taylorza 1:33ff5fad4320 310 }
taylorza 1:33ff5fad4320 311 }
taylorza 1:33ff5fad4320 312
taylorza 0:7b3fb3085867 313 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp)
taylorza 0:7b3fb3085867 314 {
taylorza 0:7b3fb3085867 315 int w = *pbmp++;
taylorza 0:7b3fb3085867 316 int h = *pbmp++;
taylorza 0:7b3fb3085867 317
taylorza 0:7b3fb3085867 318 clip(x, y, w, h);
taylorza 0:7b3fb3085867 319 int c = w * h;
taylorza 0:7b3fb3085867 320 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 321 while(c--)
taylorza 0:7b3fb3085867 322 {
taylorza 0:7b3fb3085867 323 writeBatchData(*pbmp++);
taylorza 0:7b3fb3085867 324 }
taylorza 0:7b3fb3085867 325 endBatchCommand();
taylorza 0:7b3fb3085867 326 }
taylorza 0:7b3fb3085867 327
taylorza 1:33ff5fad4320 328 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight)
taylorza 1:33ff5fad4320 329 {
taylorza 1:33ff5fad4320 330 int w = *pbmp++;
taylorza 1:33ff5fad4320 331 int h = *pbmp++;
taylorza 1:33ff5fad4320 332
taylorza 1:33ff5fad4320 333 clip(x, y, srcWidth, srcHeight);
taylorza 1:33ff5fad4320 334 beginBatchCommand(CMD_RAMWR);
taylorza 1:33ff5fad4320 335 const uint16_t *p = pbmp + srcX + (srcY * w);
taylorza 1:33ff5fad4320 336 for(int iy = 0; iy < srcHeight; ++iy)
taylorza 1:33ff5fad4320 337 {
taylorza 1:33ff5fad4320 338 for(int ix = 0; ix < srcWidth; ++ix)
taylorza 1:33ff5fad4320 339 {
taylorza 1:33ff5fad4320 340 writeBatchData(*(p + ix));
taylorza 1:33ff5fad4320 341 }
taylorza 1:33ff5fad4320 342 p += w;
taylorza 1:33ff5fad4320 343 }
taylorza 1:33ff5fad4320 344 endBatchCommand();
taylorza 1:33ff5fad4320 345 }
taylorza 1:33ff5fad4320 346
taylorza 0:7b3fb3085867 347 void LCD_ST7735::setForegroundColor(uint16_t color)
taylorza 0:7b3fb3085867 348 {
taylorza 0:7b3fb3085867 349 _foregroundColor = color;
taylorza 0:7b3fb3085867 350 }
taylorza 0:7b3fb3085867 351
taylorza 0:7b3fb3085867 352 void LCD_ST7735::setBackgroundColor(uint16_t color)
taylorza 0:7b3fb3085867 353 {
taylorza 0:7b3fb3085867 354 _backgroundColor = color;
taylorza 0:7b3fb3085867 355 }
taylorza 0:7b3fb3085867 356
taylorza 0:7b3fb3085867 357 void LCD_ST7735::drawString(const uint8_t *pFont, int x, int y, const char *pString)
taylorza 0:7b3fb3085867 358 {
taylorza 0:7b3fb3085867 359 char *p = (char*)pString;
taylorza 0:7b3fb3085867 360 while(*p != 0)
taylorza 0:7b3fb3085867 361 {
taylorza 0:7b3fb3085867 362 drawChar(pFont, x, y, *p++);
taylorza 0:7b3fb3085867 363 x += 8;
taylorza 0:7b3fb3085867 364 }
taylorza 0:7b3fb3085867 365 }
taylorza 0:7b3fb3085867 366
taylorza 0:7b3fb3085867 367 void LCD_ST7735::drawVertLine(int x1, int y1, int y2, uint16_t color)
taylorza 0:7b3fb3085867 368 {
taylorza 0:7b3fb3085867 369 clipRect(x1, y1, x1, y2);
taylorza 0:7b3fb3085867 370 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 371 for (int i = 0; i < (y2 - y1) * 2; ++i)
taylorza 0:7b3fb3085867 372 {
taylorza 0:7b3fb3085867 373 writeBatchData(color);
taylorza 0:7b3fb3085867 374 }
taylorza 0:7b3fb3085867 375 endBatchCommand();
taylorza 0:7b3fb3085867 376 }
taylorza 0:7b3fb3085867 377
taylorza 0:7b3fb3085867 378 void LCD_ST7735::drawHorizLine(int x1, int y1, int x2, uint16_t color)
taylorza 0:7b3fb3085867 379 {
taylorza 0:7b3fb3085867 380 clipRect(x1, y1, x2, y1);
taylorza 0:7b3fb3085867 381 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 382 for (int i = 0; i < (x2 - x1) * 2; ++i)
taylorza 0:7b3fb3085867 383 {
taylorza 0:7b3fb3085867 384 writeBatchData(color);
taylorza 0:7b3fb3085867 385 }
taylorza 0:7b3fb3085867 386 endBatchCommand();
taylorza 0:7b3fb3085867 387 }
taylorza 0:7b3fb3085867 388
taylorza 0:7b3fb3085867 389 void LCD_ST7735::drawChar(const uint8_t *pFont, int x, int y, char c)
taylorza 0:7b3fb3085867 390 {
taylorza 0:7b3fb3085867 391 const uint8_t *pChar = pFont + (c * 8);
taylorza 0:7b3fb3085867 392
taylorza 0:7b3fb3085867 393 clip(x, y, 8, 8);
taylorza 0:7b3fb3085867 394 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 395 for(int r = 0; r < 8; ++r)
taylorza 0:7b3fb3085867 396 {
taylorza 0:7b3fb3085867 397 uint8_t b = pChar[r];
taylorza 0:7b3fb3085867 398 for(int c = 0; c < 8; ++c)
taylorza 0:7b3fb3085867 399 {
taylorza 0:7b3fb3085867 400 if (b & 0x80)
taylorza 0:7b3fb3085867 401 writeBatchData(_foregroundColor);
taylorza 0:7b3fb3085867 402 else
taylorza 0:7b3fb3085867 403 writeBatchData(_backgroundColor);
taylorza 0:7b3fb3085867 404
taylorza 0:7b3fb3085867 405 b <<= 1;
taylorza 0:7b3fb3085867 406 }
taylorza 0:7b3fb3085867 407 }
taylorza 0:7b3fb3085867 408 endBatchCommand();
taylorza 0:7b3fb3085867 409 }
taylorza 0:7b3fb3085867 410
taylorza 0:7b3fb3085867 411 void LCD_ST7735::initDisplay()
taylorza 0:7b3fb3085867 412 {
taylorza 0:7b3fb3085867 413 reset();
taylorza 0:7b3fb3085867 414
taylorza 0:7b3fb3085867 415 write(CMD_SLPOUT);
taylorza 0:7b3fb3085867 416
taylorza 0:7b3fb3085867 417 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:7b3fb3085867 418 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:7b3fb3085867 419 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
taylorza 0:7b3fb3085867 420
taylorza 0:7b3fb3085867 421 write(CMD_INVCTR, (uint8_t[]){0x07}, 1);
taylorza 0:7b3fb3085867 422
taylorza 0:7b3fb3085867 423 write(CMD_PWCTR1, (uint8_t[]){0xa2, 0x02, 0x84}, 3);
taylorza 0:7b3fb3085867 424 write(CMD_PWCTR2, (uint8_t[]){0xc5}, 1);
taylorza 0:7b3fb3085867 425 write(CMD_PWCTR3, (uint8_t[]){0x0a, 0x00}, 2);
taylorza 0:7b3fb3085867 426 write(CMD_PWCTR4, (uint8_t[]){0x8a, 0x2a}, 2);
taylorza 0:7b3fb3085867 427 write(CMD_PWCTR5, (uint8_t[]){0x8a, 0xee}, 2);
taylorza 0:7b3fb3085867 428
taylorza 0:7b3fb3085867 429 write(CMD_VMCTR1, (uint8_t[]){0x0e}, 1);
taylorza 0:7b3fb3085867 430
taylorza 0:7b3fb3085867 431 write(CMD_MADCTL, (uint8_t[]){0xc8}, 1);
taylorza 0:7b3fb3085867 432
taylorza 0:7b3fb3085867 433 // Gama sequence
taylorza 0:7b3fb3085867 434 write(CMD_GAMCTRP1, (uint8_t[])
taylorza 0:7b3fb3085867 435 {
taylorza 0:7b3fb3085867 436 0x0f, 0x1a,
taylorza 0:7b3fb3085867 437 0x0f, 0x18,
taylorza 0:7b3fb3085867 438 0x2f, 0x28,
taylorza 0:7b3fb3085867 439 0x20, 0x22,
taylorza 0:7b3fb3085867 440 0x1f, 0x1b,
taylorza 0:7b3fb3085867 441 0x23, 0x37,
taylorza 0:7b3fb3085867 442 0x00, 0x07,
taylorza 0:7b3fb3085867 443 0x02, 0x10
taylorza 0:7b3fb3085867 444 }, 16);
taylorza 0:7b3fb3085867 445
taylorza 0:7b3fb3085867 446 write(CMD_GAMCTRN1, (uint8_t[])
taylorza 0:7b3fb3085867 447 {
taylorza 0:7b3fb3085867 448 0x0f, 0x1b,
taylorza 0:7b3fb3085867 449 0x0f, 0x17,
taylorza 0:7b3fb3085867 450 0x33, 0x2c,
taylorza 0:7b3fb3085867 451 0x29, 0x2e,
taylorza 0:7b3fb3085867 452 0x30, 0x30,
taylorza 0:7b3fb3085867 453 0x39, 0x3f,
taylorza 0:7b3fb3085867 454 0x00, 0x07,
taylorza 0:7b3fb3085867 455 0x03, 0x10
taylorza 0:7b3fb3085867 456 }, 16);
taylorza 0:7b3fb3085867 457
taylorza 0:7b3fb3085867 458 write(CMD_CASET, (uint8_t[]){0x00, 0x00, 0x00, 0x7f}, 4);
taylorza 0:7b3fb3085867 459 write(CMD_RASET, (uint8_t[]){0x00, 0x00, 0x00, 0x9f}, 4);
taylorza 0:7b3fb3085867 460
taylorza 0:7b3fb3085867 461 write(CMD_EXTCTRL, (uint8_t[]){0x01}, 1);
taylorza 0:7b3fb3085867 462
taylorza 0:7b3fb3085867 463 // Disable RAM power save
taylorza 0:7b3fb3085867 464 write(0xf6, (uint8_t[]){0x00}, 1);
taylorza 0:7b3fb3085867 465
taylorza 0:7b3fb3085867 466 // 65k color mode
taylorza 0:7b3fb3085867 467 write(CMD_COLMOD, (uint8_t[]){0x05}, 1);
taylorza 0:7b3fb3085867 468
taylorza 0:7b3fb3085867 469 // Enable display
taylorza 0:7b3fb3085867 470 write(CMD_DISPON);
taylorza 0:7b3fb3085867 471
taylorza 0:7b3fb3085867 472 setBacklight(true);
taylorza 0:7b3fb3085867 473 }
taylorza 0:7b3fb3085867 474
taylorza 0:7b3fb3085867 475 void LCD_ST7735::reset()
taylorza 0:7b3fb3085867 476 {
taylorza 0:7b3fb3085867 477 _reset = 0;
taylorza 0:7b3fb3085867 478 wait_us(100);
taylorza 0:7b3fb3085867 479 _reset = 1;
taylorza 0:7b3fb3085867 480 wait_us(100);
taylorza 0:7b3fb3085867 481 }
taylorza 0:7b3fb3085867 482
taylorza 0:7b3fb3085867 483 void LCD_ST7735::clip(int x, int y, int w, int h)
taylorza 0:7b3fb3085867 484 {
taylorza 0:7b3fb3085867 485 clipRect(x, y, (x + w) - 1, (y + h) - 1);
taylorza 0:7b3fb3085867 486 }
taylorza 0:7b3fb3085867 487
taylorza 0:7b3fb3085867 488 void LCD_ST7735::clipRect(int x1, int y1, int x2, int y2)
taylorza 0:7b3fb3085867 489 {
taylorza 0:7b3fb3085867 490 uint8_t x1l = (uint8_t)(x1 & 0xff);
taylorza 0:7b3fb3085867 491 uint8_t x1h = (uint8_t)((x1 >> 8) & 0xff);
taylorza 0:7b3fb3085867 492 uint8_t x2l = (uint8_t)(x2 & 0xff);
taylorza 0:7b3fb3085867 493 uint8_t x2h = (uint8_t)((x2 >> 8) & 0xff);
taylorza 0:7b3fb3085867 494 write(CMD_CASET, (uint8_t[]){x1h, x1l, x2h, x2l}, 4);
taylorza 0:7b3fb3085867 495
taylorza 0:7b3fb3085867 496 uint8_t y1l = (uint8_t)(y1 & 0xff);
taylorza 0:7b3fb3085867 497 uint8_t y1h = (uint8_t)((y1 >> 8) & 0xff);
taylorza 0:7b3fb3085867 498 uint8_t y2l = (uint8_t)(y2 & 0xff);
taylorza 0:7b3fb3085867 499 uint8_t y2h = (uint8_t)((y2 >> 8) & 0xff);
taylorza 0:7b3fb3085867 500 write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4);
taylorza 0:7b3fb3085867 501 }
taylorza 0:7b3fb3085867 502
taylorza 0:7b3fb3085867 503 void LCD_ST7735::write(uint8_t cmd)
taylorza 0:7b3fb3085867 504 {
taylorza 0:7b3fb3085867 505 write(cmd, NULL, 0);
taylorza 0:7b3fb3085867 506 }
taylorza 0:7b3fb3085867 507
taylorza 0:7b3fb3085867 508 void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen)
taylorza 0:7b3fb3085867 509 {
taylorza 0:7b3fb3085867 510 _ds = 0;
taylorza 0:7b3fb3085867 511 _cs = 0;
taylorza 0:7b3fb3085867 512 _spi.write(cmd);
taylorza 0:7b3fb3085867 513 if (data != NULL & dataLen > 0)
taylorza 0:7b3fb3085867 514 {
taylorza 0:7b3fb3085867 515 _ds = 1;
taylorza 0:7b3fb3085867 516 for(int i = 0; i < dataLen; ++i)
taylorza 0:7b3fb3085867 517 {
taylorza 0:7b3fb3085867 518 _spi.write(data[i]);
taylorza 0:7b3fb3085867 519 }
taylorza 0:7b3fb3085867 520 _ds = 0;
taylorza 0:7b3fb3085867 521 }
taylorza 0:7b3fb3085867 522 _cs = 1;
taylorza 0:7b3fb3085867 523 }
taylorza 0:7b3fb3085867 524
taylorza 0:7b3fb3085867 525 void LCD_ST7735::write(uint8_t cmd, uint16_t data)
taylorza 0:7b3fb3085867 526 {
taylorza 0:7b3fb3085867 527 _ds = 0;
taylorza 0:7b3fb3085867 528 _cs = 0;
taylorza 0:7b3fb3085867 529 _spi.write(cmd);
taylorza 0:7b3fb3085867 530 _ds = 1;
taylorza 0:7b3fb3085867 531 _spi.write((data >> 8) & 0xff);
taylorza 0:7b3fb3085867 532 _spi.write(data & 0xff);
taylorza 0:7b3fb3085867 533 _ds = 0;
taylorza 0:7b3fb3085867 534 _cs = 1;
taylorza 0:7b3fb3085867 535 }
taylorza 0:7b3fb3085867 536
taylorza 0:7b3fb3085867 537 void LCD_ST7735::writeData(uint8_t data)
taylorza 0:7b3fb3085867 538 {
taylorza 0:7b3fb3085867 539 _ds = 1;
taylorza 0:7b3fb3085867 540 _cs = 0;
taylorza 0:7b3fb3085867 541 _spi.write(data);
taylorza 0:7b3fb3085867 542 _ds = 0;
taylorza 0:7b3fb3085867 543 _cs = 1;
taylorza 0:7b3fb3085867 544 }
taylorza 0:7b3fb3085867 545
taylorza 0:7b3fb3085867 546 void LCD_ST7735::beginBatchCommand(uint8_t cmd)
taylorza 0:7b3fb3085867 547 {
taylorza 0:7b3fb3085867 548 _ds = 0;
taylorza 0:7b3fb3085867 549 _cs = 0;
taylorza 0:7b3fb3085867 550 _spi.write(cmd);
taylorza 0:7b3fb3085867 551 _ds = 1;
taylorza 0:7b3fb3085867 552 }
taylorza 0:7b3fb3085867 553
taylorza 0:7b3fb3085867 554 void LCD_ST7735::writeBatchData(uint8_t data)
taylorza 0:7b3fb3085867 555 {
taylorza 0:7b3fb3085867 556 _spi.write(data);
taylorza 0:7b3fb3085867 557 }
taylorza 0:7b3fb3085867 558
taylorza 0:7b3fb3085867 559 void LCD_ST7735::writeBatchData(uint16_t data)
taylorza 0:7b3fb3085867 560 {
taylorza 0:7b3fb3085867 561 _spi.write((data >> 8) & 0xff);
taylorza 0:7b3fb3085867 562 _spi.write(data & 0xff);
taylorza 0:7b3fb3085867 563 }
taylorza 0:7b3fb3085867 564
taylorza 0:7b3fb3085867 565 void LCD_ST7735::endBatchCommand()
taylorza 0:7b3fb3085867 566 {
taylorza 0:7b3fb3085867 567 _ds = 0;
taylorza 0:7b3fb3085867 568 _cs = 1;
taylorza 0:7b3fb3085867 569 }