SPI based library for the ST7735 LCD controller.

Dependents:   RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more

Committer:
taylorza
Date:
Sun Sep 21 07:01:15 2014 +0000
Revision:
4:88d22437119c
Parent:
3:451148656b76
Child:
5:21c987ee68d2
Some minor code clean-up and performance enhancements. Added an additional fillRect that does not have a border

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