After decimating the enemy forces that have attacked your ship, you are charged with taking out as many of the remaining enemy fighters as possible. 3d space fighter game was initially written while I was testing some 3d routines I was implementing for a flight simulator, but my daughter started playing it and seemed to enjoy it so I added a few sound effects, explosions etc. and so this little game was born.

Dependencies:   mbed

Committer:
taylorza
Date:
Sun Feb 08 01:38:18 2015 +0000
Revision:
4:b857db213f10
Parent:
0:01829868570e
Removed duty lookup table

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taylorza 0:01829868570e 1 #include "mbed.h"
taylorza 0:01829868570e 2 #include "LCD_ST7735.h"
taylorza 0:01829868570e 3
taylorza 0:01829868570e 4 const uint16_t LCD_ST7735::DefaultPalette[] = {
taylorza 0:01829868570e 5 0x0000, // 0 - Black
taylorza 0:01829868570e 6 0x0019, // 1 - Blue
taylorza 0:01829868570e 7 0xc800, // 2 - Red
taylorza 0:01829868570e 8 0xc819, // 3 - Magenta
taylorza 0:01829868570e 9 0x0660, // 4 - Green
taylorza 0:01829868570e 10 0x0679, // 5 - Cyan
taylorza 0:01829868570e 11 0xce60, // 6 - Yellow
taylorza 0:01829868570e 12 0xce79, // 7 - White
taylorza 0:01829868570e 13 0x001f, // 8 - Bright Blue
taylorza 0:01829868570e 14 0xf800, // 9 - Bright Red
taylorza 0:01829868570e 15 0xf81f, // 10 - Bright Magenta
taylorza 0:01829868570e 16 0x07e0, // 11 - Bright Green
taylorza 0:01829868570e 17 0x07ff, // 12 - Bright Cyan
taylorza 0:01829868570e 18 0xffe0, // 13 - Bright Yellow
taylorza 0:01829868570e 19 0xffff, // 14 - Bright White
taylorza 0:01829868570e 20 };
taylorza 0:01829868570e 21
taylorza 0:01829868570e 22 LCD_ST7735::LCD_ST7735(
taylorza 0:01829868570e 23 PinName backlightPin,
taylorza 0:01829868570e 24 PinName resetPin,
taylorza 0:01829868570e 25 PinName dsPin,
taylorza 0:01829868570e 26 PinName mosiPin,
taylorza 0:01829868570e 27 PinName misoPin,
taylorza 0:01829868570e 28 PinName clkPin,
taylorza 0:01829868570e 29 PinName csPin,
taylorza 0:01829868570e 30 PanelColorFilter colorFilter
taylorza 0:01829868570e 31 ) :
taylorza 0:01829868570e 32 _colorFilter(colorFilter),
taylorza 0:01829868570e 33 _backlight(backlightPin, 0),
taylorza 0:01829868570e 34 _reset(resetPin, 1),
taylorza 0:01829868570e 35 _ds(dsPin, 0),
taylorza 0:01829868570e 36 _cs(csPin, 1),
taylorza 0:01829868570e 37 _spi(mosiPin, misoPin, clkPin)
taylorza 0:01829868570e 38 {
taylorza 0:01829868570e 39 _spi.format(8, 3);
taylorza 0:01829868570e 40 _spi.frequency(18000000);
taylorza 0:01829868570e 41
taylorza 0:01829868570e 42 initDisplay();
taylorza 0:01829868570e 43 clearScreen();
taylorza 0:01829868570e 44 setForegroundColor(0xffff);
taylorza 0:01829868570e 45 setBackgroundColor(0x0000);
taylorza 0:01829868570e 46
taylorza 0:01829868570e 47 _palette = (uint16_t*)DefaultPalette;
taylorza 0:01829868570e 48 }
taylorza 0:01829868570e 49
taylorza 0:01829868570e 50 void LCD_ST7735::setOrientation(Orientation orientation, bool flip)
taylorza 0:01829868570e 51 {
taylorza 0:01829868570e 52 const static uint8_t my = 0x80;
taylorza 0:01829868570e 53 const static uint8_t mx = 0x40;
taylorza 0:01829868570e 54 const static uint8_t mv = 0x20;
taylorza 0:01829868570e 55
taylorza 0:01829868570e 56 uint8_t madctlData = _colorFilter;
taylorza 0:01829868570e 57 switch(orientation)
taylorza 0:01829868570e 58 {
taylorza 0:01829868570e 59 case Rotate0:
taylorza 0:01829868570e 60 _width = 128;
taylorza 0:01829868570e 61 _height = 160;
taylorza 0:01829868570e 62 madctlData |= flip ? mx : 0;
taylorza 0:01829868570e 63 break;
taylorza 0:01829868570e 64
taylorza 0:01829868570e 65 case Rotate90:
taylorza 0:01829868570e 66 _width = 160;
taylorza 0:01829868570e 67 _height = 128;
taylorza 0:01829868570e 68 madctlData |= flip ? my | mv | mx : mv | mx;
taylorza 0:01829868570e 69 break;
taylorza 0:01829868570e 70
taylorza 0:01829868570e 71 case Rotate180:
taylorza 0:01829868570e 72 _width = 128;
taylorza 0:01829868570e 73 _height = 160;
taylorza 0:01829868570e 74 madctlData |= flip ? my : mx | my;
taylorza 0:01829868570e 75 break;
taylorza 0:01829868570e 76
taylorza 0:01829868570e 77 case Rotate270:
taylorza 0:01829868570e 78 _width = 160;
taylorza 0:01829868570e 79 _height = 128;
taylorza 0:01829868570e 80 madctlData |= flip ? mv : mv | my;
taylorza 0:01829868570e 81 break;
taylorza 0:01829868570e 82 }
taylorza 0:01829868570e 83 write(CMD_MADCTL, (uint8_t[]){madctlData}, 1);
taylorza 0:01829868570e 84 }
taylorza 0:01829868570e 85
taylorza 0:01829868570e 86 int LCD_ST7735::getWidth()
taylorza 0:01829868570e 87 {
taylorza 0:01829868570e 88 return _width;
taylorza 0:01829868570e 89 }
taylorza 0:01829868570e 90
taylorza 0:01829868570e 91 int LCD_ST7735::getHeight()
taylorza 0:01829868570e 92 {
taylorza 0:01829868570e 93 return _height;
taylorza 0:01829868570e 94 }
taylorza 0:01829868570e 95
taylorza 0:01829868570e 96 void LCD_ST7735::setBacklight(bool state)
taylorza 0:01829868570e 97 {
taylorza 0:01829868570e 98 _backlight = state ? 1 : 0;
taylorza 0:01829868570e 99 }
taylorza 0:01829868570e 100
taylorza 0:01829868570e 101 void LCD_ST7735::clearScreen(uint16_t color)
taylorza 0:01829868570e 102 {
taylorza 0:01829868570e 103 clipRect(0, 0, _width - 1, _height - 1);
taylorza 0:01829868570e 104 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 105 uint8_t colorHigh = color >> 8;
taylorza 0:01829868570e 106 uint8_t colorLow = color;
taylorza 0:01829868570e 107 for(int i = 0; i < 128 * 160 * 2; ++i)
taylorza 0:01829868570e 108 {
taylorza 0:01829868570e 109 writeBatchData(colorHigh, colorLow);
taylorza 0:01829868570e 110 }
taylorza 0:01829868570e 111 endBatchCommand();
taylorza 0:01829868570e 112 }
taylorza 0:01829868570e 113
taylorza 0:01829868570e 114 void LCD_ST7735::setPixel(int x, int y, uint16_t color)
taylorza 0:01829868570e 115 {
taylorza 0:01829868570e 116 write(CMD_CASET, (uint8_t[]){0, x, 0, x}, 4);
taylorza 0:01829868570e 117 write(CMD_RASET, (uint8_t[]){0, y, 0, y}, 4);
taylorza 0:01829868570e 118 write(CMD_RAMWR, color);
taylorza 0:01829868570e 119 }
taylorza 0:01829868570e 120
taylorza 0:01829868570e 121 void LCD_ST7735::drawLine(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:01829868570e 122 {
taylorza 0:01829868570e 123 int dx = abs(x2 - x1);
taylorza 0:01829868570e 124 int dy = abs(y2 - y1);
taylorza 0:01829868570e 125
taylorza 0:01829868570e 126 if (dx == 0)
taylorza 0:01829868570e 127 {
taylorza 0:01829868570e 128 if (y1 > y2) swap(y1, y2);
taylorza 0:01829868570e 129 drawVertLine(x1, y1, y2, color);
taylorza 0:01829868570e 130 return;
taylorza 0:01829868570e 131 }
taylorza 0:01829868570e 132 else if(dy == 0)
taylorza 0:01829868570e 133 {
taylorza 0:01829868570e 134 if (x1 > x2) swap(x1, x2);
taylorza 0:01829868570e 135 drawHorizLine(x1, y1, x2, color);
taylorza 0:01829868570e 136 return;
taylorza 0:01829868570e 137 }
taylorza 0:01829868570e 138
taylorza 0:01829868570e 139 int sx = (x1 < x2) ? 1 : -1;
taylorza 0:01829868570e 140 int sy = (y1 < y2) ? 1 : -1;
taylorza 0:01829868570e 141 int err = dx - dy;
taylorza 0:01829868570e 142 while(x1 != x2 || y1 != y2)
taylorza 0:01829868570e 143 {
taylorza 0:01829868570e 144 setPixel(x1, y1, color);
taylorza 0:01829868570e 145 int e2 = err << 1;
taylorza 0:01829868570e 146 if (e2 > -dy)
taylorza 0:01829868570e 147 {
taylorza 0:01829868570e 148 err -= dy;
taylorza 0:01829868570e 149 x1 += sx;
taylorza 0:01829868570e 150 }
taylorza 0:01829868570e 151 if (e2 < dx)
taylorza 0:01829868570e 152 {
taylorza 0:01829868570e 153 err += dx;
taylorza 0:01829868570e 154 y1 += sy;
taylorza 0:01829868570e 155 }
taylorza 0:01829868570e 156 }
taylorza 0:01829868570e 157 setPixel(x2, y2, color);
taylorza 0:01829868570e 158 }
taylorza 0:01829868570e 159
taylorza 0:01829868570e 160 void LCD_ST7735::swap(int &a, int &b)
taylorza 0:01829868570e 161 {
taylorza 0:01829868570e 162 int t = a;
taylorza 0:01829868570e 163 a = b;
taylorza 0:01829868570e 164 b = t;
taylorza 0:01829868570e 165 }
taylorza 0:01829868570e 166
taylorza 0:01829868570e 167 void LCD_ST7735::drawRect(int x1, int y1, int x2, int y2, uint16_t color)
taylorza 0:01829868570e 168 {
taylorza 0:01829868570e 169 if (x1 > x2) swap(x1, x2);
taylorza 0:01829868570e 170 if (y1 > y2) swap(y1, y2);
taylorza 0:01829868570e 171
taylorza 0:01829868570e 172 drawHorizLine(x1, y1, x2, color);
taylorza 0:01829868570e 173 drawHorizLine(x1, y2, x2, color);
taylorza 0:01829868570e 174 drawVertLine(x1, y1, y2, color);
taylorza 0:01829868570e 175 drawVertLine(x2, y1, y2, color);
taylorza 0:01829868570e 176 }
taylorza 0:01829868570e 177
taylorza 0:01829868570e 178 void LCD_ST7735::drawCircle(int x, int y, int r, uint16_t color)
taylorza 0:01829868570e 179 {
taylorza 0:01829868570e 180 int ix = r;
taylorza 0:01829868570e 181 int iy = 0;
taylorza 0:01829868570e 182 int err = 1 - r;
taylorza 0:01829868570e 183
taylorza 0:01829868570e 184 while(ix >= iy)
taylorza 0:01829868570e 185 {
taylorza 0:01829868570e 186 setPixel(x + ix, y + iy, color);
taylorza 0:01829868570e 187 setPixel(x + iy, y + ix, color);
taylorza 0:01829868570e 188 setPixel(x - ix, y + iy, color);
taylorza 0:01829868570e 189 setPixel(x - iy, y + ix, color);
taylorza 0:01829868570e 190 setPixel(x - ix, y - iy, color);
taylorza 0:01829868570e 191 setPixel(x - iy, y - ix, color);
taylorza 0:01829868570e 192 setPixel(x + ix, y - iy, color);
taylorza 0:01829868570e 193 setPixel(x + iy, y - ix, color);
taylorza 0:01829868570e 194 iy++;
taylorza 0:01829868570e 195 if (err < 0)
taylorza 0:01829868570e 196 {
taylorza 0:01829868570e 197 err += 2 * iy + 1;
taylorza 0:01829868570e 198 }
taylorza 0:01829868570e 199 else
taylorza 0:01829868570e 200 {
taylorza 0:01829868570e 201 ix--;
taylorza 0:01829868570e 202 err += 2 * (iy - ix + 1);
taylorza 0:01829868570e 203 }
taylorza 0:01829868570e 204 }
taylorza 0:01829868570e 205 }
taylorza 0:01829868570e 206
taylorza 0:01829868570e 207 void LCD_ST7735::drawEllipse(int x, int y, int rx, int ry, uint16_t color)
taylorza 0:01829868570e 208 {
taylorza 0:01829868570e 209 int a2 = rx * rx;
taylorza 0:01829868570e 210 int b2 = ry * ry;
taylorza 0:01829868570e 211 int fa2 = 4 * a2;
taylorza 0:01829868570e 212 int fb2 = 4 * b2;
taylorza 0:01829868570e 213
taylorza 0:01829868570e 214 int ix, iy, sigma;
taylorza 0:01829868570e 215 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 0:01829868570e 216 {
taylorza 0:01829868570e 217 setPixel(x + ix, y + iy, color);
taylorza 0:01829868570e 218 setPixel(x - ix, y + iy, color);
taylorza 0:01829868570e 219 setPixel(x + ix, y - iy, color);
taylorza 0:01829868570e 220 setPixel(x - ix, y - iy, color);
taylorza 0:01829868570e 221 if (sigma >= 0)
taylorza 0:01829868570e 222 {
taylorza 0:01829868570e 223 sigma+= fa2 * (1 - iy);
taylorza 0:01829868570e 224 iy--;
taylorza 0:01829868570e 225 }
taylorza 0:01829868570e 226 sigma += b2 * ((4 * ix) + 6);
taylorza 0:01829868570e 227 }
taylorza 0:01829868570e 228
taylorza 0:01829868570e 229 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 0:01829868570e 230 {
taylorza 0:01829868570e 231 setPixel(x + ix, y + iy, color);
taylorza 0:01829868570e 232 setPixel(x - ix, y + iy, color);
taylorza 0:01829868570e 233 setPixel(x + ix, y - iy, color);
taylorza 0:01829868570e 234 setPixel(x - ix, y - iy, color);
taylorza 0:01829868570e 235 if (sigma >= 0)
taylorza 0:01829868570e 236 {
taylorza 0:01829868570e 237 sigma+= fb2 * (1 - ix);
taylorza 0:01829868570e 238 ix--;
taylorza 0:01829868570e 239 }
taylorza 0:01829868570e 240 sigma += a2 * ((4 * iy) + 6);
taylorza 0:01829868570e 241 }
taylorza 0:01829868570e 242 }
taylorza 0:01829868570e 243 void LCD_ST7735::fillRect(int x1, int y1, int x2, int y2, uint16_t fillColor)
taylorza 0:01829868570e 244 {
taylorza 0:01829868570e 245 clipRect(x1, y1, x2, y2);
taylorza 0:01829868570e 246 int c = ((x2-x1) * (y2-y1)) << 1;
taylorza 0:01829868570e 247 uint8_t colorHigh = fillColor >> 8;
taylorza 0:01829868570e 248 uint8_t colorLow = fillColor;
taylorza 0:01829868570e 249 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 250 while(c--)
taylorza 0:01829868570e 251 {
taylorza 0:01829868570e 252 writeBatchData(colorHigh, colorLow);
taylorza 0:01829868570e 253 }
taylorza 0:01829868570e 254 endBatchCommand();
taylorza 0:01829868570e 255 }
taylorza 0:01829868570e 256
taylorza 0:01829868570e 257 void LCD_ST7735::fillRect(int x1, int y1, int x2, int y2, uint16_t borderColor, uint16_t fillColor)
taylorza 0:01829868570e 258 {
taylorza 0:01829868570e 259 if (x1 > x2) swap(x1, x2);
taylorza 0:01829868570e 260 if (y1 > y2) swap(y1, y2);
taylorza 0:01829868570e 261
taylorza 0:01829868570e 262 drawRect(x1, y1, x2, y2, borderColor);
taylorza 0:01829868570e 263 clipRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1);
taylorza 0:01829868570e 264 int c = ((x2-x1-2) * (y2-y1-2)) << 1;
taylorza 0:01829868570e 265 uint8_t colorHigh = fillColor >> 8;
taylorza 0:01829868570e 266 uint8_t colorLow = fillColor;
taylorza 0:01829868570e 267 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 268 while(c--)
taylorza 0:01829868570e 269 {
taylorza 0:01829868570e 270 writeBatchData(colorHigh, colorLow);
taylorza 0:01829868570e 271 }
taylorza 0:01829868570e 272 endBatchCommand();
taylorza 0:01829868570e 273 }
taylorza 0:01829868570e 274
taylorza 0:01829868570e 275 void LCD_ST7735::fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor)
taylorza 0:01829868570e 276 {
taylorza 0:01829868570e 277 int ix = r;
taylorza 0:01829868570e 278 int iy = 0;
taylorza 0:01829868570e 279 int err = 1 - r;
taylorza 0:01829868570e 280
taylorza 0:01829868570e 281 while(ix >= iy)
taylorza 0:01829868570e 282 {
taylorza 0:01829868570e 283 setPixel(x - ix, y + iy, borderColor);
taylorza 0:01829868570e 284 setPixel(x + ix, y + iy, borderColor);
taylorza 0:01829868570e 285 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 286
taylorza 0:01829868570e 287 setPixel(x - iy, y + ix, borderColor);
taylorza 0:01829868570e 288 setPixel(x + iy, y + ix, borderColor);
taylorza 0:01829868570e 289 drawHorizLine(x - iy + 1, y + ix, x + iy - 1, fillColor);
taylorza 0:01829868570e 290
taylorza 0:01829868570e 291 setPixel(x - ix, y - iy, borderColor);
taylorza 0:01829868570e 292 setPixel(x + ix, y - iy, borderColor);
taylorza 0:01829868570e 293 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 294
taylorza 0:01829868570e 295 setPixel(x - iy, y - ix, borderColor);
taylorza 0:01829868570e 296 setPixel(x + iy, y - ix, borderColor);
taylorza 0:01829868570e 297 drawHorizLine(x - iy + 1, y - ix, x + iy - 1, fillColor);
taylorza 0:01829868570e 298 iy++;
taylorza 0:01829868570e 299 if (err < 0)
taylorza 0:01829868570e 300 {
taylorza 0:01829868570e 301 err += 2 * iy + 1;
taylorza 0:01829868570e 302 }
taylorza 0:01829868570e 303 else
taylorza 0:01829868570e 304 {
taylorza 0:01829868570e 305 ix--;
taylorza 0:01829868570e 306 err += 2 * (iy - ix + 1);
taylorza 0:01829868570e 307 }
taylorza 0:01829868570e 308 }
taylorza 0:01829868570e 309 }
taylorza 0:01829868570e 310
taylorza 0:01829868570e 311 void LCD_ST7735::fillEllipse(int x, int y, int rx, int ry, uint16_t borderColor, uint16_t fillColor)
taylorza 0:01829868570e 312 {
taylorza 0:01829868570e 313 int a2 = rx * rx;
taylorza 0:01829868570e 314 int b2 = ry * ry;
taylorza 0:01829868570e 315 int fa2 = 4 * a2;
taylorza 0:01829868570e 316 int fb2 = 4 * b2;
taylorza 0:01829868570e 317
taylorza 0:01829868570e 318 int ix, iy, sigma;
taylorza 0:01829868570e 319 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 0:01829868570e 320 {
taylorza 0:01829868570e 321 setPixel(x + ix, y + iy, borderColor);
taylorza 0:01829868570e 322 setPixel(x - ix, y + iy, borderColor);
taylorza 0:01829868570e 323 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 324
taylorza 0:01829868570e 325 setPixel(x + ix, y - iy, borderColor);
taylorza 0:01829868570e 326 setPixel(x - ix, y - iy, borderColor);
taylorza 0:01829868570e 327 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 328
taylorza 0:01829868570e 329 if (sigma >= 0)
taylorza 0:01829868570e 330 {
taylorza 0:01829868570e 331 sigma+= fa2 * (1 - iy);
taylorza 0:01829868570e 332 iy--;
taylorza 0:01829868570e 333 }
taylorza 0:01829868570e 334 sigma += b2 * ((4 * ix) + 6);
taylorza 0:01829868570e 335 }
taylorza 0:01829868570e 336
taylorza 0:01829868570e 337 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 0:01829868570e 338 {
taylorza 0:01829868570e 339 setPixel(x + ix, y + iy, borderColor);
taylorza 0:01829868570e 340 setPixel(x - ix, y + iy, borderColor);
taylorza 0:01829868570e 341 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 342
taylorza 0:01829868570e 343 setPixel(x + ix, y - iy, borderColor);
taylorza 0:01829868570e 344 setPixel(x - ix, y - iy, borderColor);
taylorza 0:01829868570e 345 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:01829868570e 346 if (sigma >= 0)
taylorza 0:01829868570e 347 {
taylorza 0:01829868570e 348 sigma+= fb2 * (1 - ix);
taylorza 0:01829868570e 349 ix--;
taylorza 0:01829868570e 350 }
taylorza 0:01829868570e 351 sigma += a2 * ((4 * iy) + 6);
taylorza 0:01829868570e 352 }
taylorza 0:01829868570e 353 }
taylorza 0:01829868570e 354
taylorza 0:01829868570e 355 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp)
taylorza 0:01829868570e 356 {
taylorza 0:01829868570e 357 int w = *pbmp++;
taylorza 0:01829868570e 358 int h = *pbmp++;
taylorza 0:01829868570e 359
taylorza 0:01829868570e 360 drawBitmap(x, y, pbmp, 0, 0, w, h);
taylorza 0:01829868570e 361 }
taylorza 0:01829868570e 362
taylorza 0:01829868570e 363 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight)
taylorza 0:01829868570e 364 {
taylorza 0:01829868570e 365 // Clip if out of screen
taylorza 0:01829868570e 366 if ((x >= _width) || (x + srcWidth < 0) ||
taylorza 0:01829868570e 367 (y >= _height) || (y + srcHeight < 0))
taylorza 0:01829868570e 368 {
taylorza 0:01829868570e 369 return;
taylorza 0:01829868570e 370 }
taylorza 0:01829868570e 371
taylorza 0:01829868570e 372 // Clip X
taylorza 0:01829868570e 373 if (x < 0) { srcX += -x; srcWidth += x; x = 0; }
taylorza 0:01829868570e 374 if (x + srcWidth >= _width) { srcWidth += _width - (x + srcWidth); }
taylorza 0:01829868570e 375
taylorza 0:01829868570e 376 // Clip Y
taylorza 0:01829868570e 377 if (y < 0) {srcY += -y; srcHeight += y; y = 0; }
taylorza 0:01829868570e 378 if (y + srcHeight >= _height) { srcHeight += _height - (y + srcHeight); }
taylorza 0:01829868570e 379
taylorza 0:01829868570e 380 int w = *pbmp++;
taylorza 0:01829868570e 381 int h = *pbmp++;
taylorza 0:01829868570e 382
taylorza 0:01829868570e 383 clip(x, y, srcWidth, srcHeight);
taylorza 0:01829868570e 384 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 385 const uint16_t *p = pbmp + srcX + (srcY * w);
taylorza 0:01829868570e 386 for(int iy = 0; iy < srcHeight; ++iy)
taylorza 0:01829868570e 387 {
taylorza 0:01829868570e 388 for(int ix = 0; ix < srcWidth; ++ix)
taylorza 0:01829868570e 389 {
taylorza 0:01829868570e 390 writeBatchData(*(p + ix));
taylorza 0:01829868570e 391 }
taylorza 0:01829868570e 392 p += w;
taylorza 0:01829868570e 393 }
taylorza 0:01829868570e 394 endBatchCommand();
taylorza 0:01829868570e 395 }
taylorza 0:01829868570e 396
taylorza 0:01829868570e 397 void LCD_ST7735::drawBitmap(int x, int y, Bitmap4bpp &bmp, int srcX, int srcY, int srcWidth, int srcHeight)
taylorza 0:01829868570e 398 {
taylorza 0:01829868570e 399 // Clip if out of screen
taylorza 0:01829868570e 400 if ((x >= _width) || (x + srcWidth < 0) ||
taylorza 0:01829868570e 401 (y >= _height) || (y + srcHeight < 0))
taylorza 0:01829868570e 402 {
taylorza 0:01829868570e 403 return;
taylorza 0:01829868570e 404 }
taylorza 0:01829868570e 405
taylorza 0:01829868570e 406 // Clip X
taylorza 0:01829868570e 407 if (x < 0) { srcX += -x; srcWidth += x; x = 0; }
taylorza 0:01829868570e 408 if (x + srcWidth >= _width) { srcWidth += _width - (x + srcWidth); }
taylorza 0:01829868570e 409
taylorza 0:01829868570e 410 // Clip Y
taylorza 0:01829868570e 411 if (y < 0) {srcY += -y; srcHeight += y; y = 0; }
taylorza 0:01829868570e 412 if (y + srcHeight >= _height) { srcHeight += _height - (y + srcHeight); }
taylorza 0:01829868570e 413
taylorza 0:01829868570e 414 int stride = bmp.getStride();
taylorza 0:01829868570e 415
taylorza 0:01829868570e 416 bool oddStart = srcX & 0x01;
taylorza 0:01829868570e 417 bool oddWidth = srcWidth & 0x01;
taylorza 0:01829868570e 418 bool oddEnd = oddStart ^ oddWidth;
taylorza 0:01829868570e 419
taylorza 0:01829868570e 420 int startX = oddStart ? 1 : 0;
taylorza 0:01829868570e 421 int endX = (oddEnd ? srcWidth : srcWidth + 1) >> 1;
taylorza 0:01829868570e 422
taylorza 0:01829868570e 423 const uint8_t *p = bmp.getBitmapData() + (srcX >> 1) + (srcY * stride);
taylorza 0:01829868570e 424
taylorza 0:01829868570e 425 clip(x, y, srcWidth, srcHeight);
taylorza 0:01829868570e 426 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 427 for(int iy = 0; iy < srcHeight; ++iy, p += stride)
taylorza 0:01829868570e 428 {
taylorza 0:01829868570e 429 if (oddStart) writeBatchData(_palette[*p & 0x0f]);
taylorza 0:01829868570e 430 for(int ix = startX; ix < endX; ++ix)
taylorza 0:01829868570e 431 {
taylorza 0:01829868570e 432 uint8_t c = *(p + ix);
taylorza 0:01829868570e 433 writeBatchData(_palette[(c >> 4) & 0x0f]);
taylorza 0:01829868570e 434 writeBatchData(_palette[c & 0x0f]);
taylorza 0:01829868570e 435 }
taylorza 0:01829868570e 436 if (oddEnd) writeBatchData(_palette[(*(p + endX) >> 4) & 0x0f]);
taylorza 0:01829868570e 437 }
taylorza 0:01829868570e 438 endBatchCommand();
taylorza 0:01829868570e 439 }
taylorza 0:01829868570e 440
taylorza 0:01829868570e 441 void LCD_ST7735::drawBitmap(int x, int y, Bitmap1bpp &bmp, int srcX, int srcY, int srcWidth, int srcHeight, uint16_t foregroundColor, uint16_t backgroundColor)
taylorza 0:01829868570e 442 {
taylorza 0:01829868570e 443 // Clip if out of screen
taylorza 0:01829868570e 444 if ((x >= _width) || (x + srcWidth < 0) ||
taylorza 0:01829868570e 445 (y >= _height) || (y + srcHeight < 0))
taylorza 0:01829868570e 446 {
taylorza 0:01829868570e 447 return;
taylorza 0:01829868570e 448 }
taylorza 0:01829868570e 449
taylorza 0:01829868570e 450 // Clip X
taylorza 0:01829868570e 451 if (x < 0) { srcX += -x; srcWidth += x; x = 0; }
taylorza 0:01829868570e 452 if (x + srcWidth >= _width) { srcWidth += _width - (x + srcWidth); }
taylorza 0:01829868570e 453
taylorza 0:01829868570e 454 // Clip Y
taylorza 0:01829868570e 455 if (y < 0) {srcY += -y; srcHeight += y; y = 0; }
taylorza 0:01829868570e 456 if (y + srcHeight >= _height) { srcHeight += _height - (y + srcHeight); }
taylorza 0:01829868570e 457
taylorza 0:01829868570e 458 uint8_t fch = foregroundColor >> 8;
taylorza 0:01829868570e 459 uint8_t fcl = foregroundColor;
taylorza 0:01829868570e 460 uint8_t bch = backgroundColor >> 8;
taylorza 0:01829868570e 461 uint8_t bcl = backgroundColor;
taylorza 0:01829868570e 462
taylorza 0:01829868570e 463 clip(x, y, srcWidth, srcHeight);
taylorza 0:01829868570e 464
taylorza 0:01829868570e 465 int offset = (bmp.getStride() * srcY) + (srcX / 8);
taylorza 0:01829868570e 466 int startbits = srcX % 8;
taylorza 0:01829868570e 467
taylorza 0:01829868570e 468 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 469 for(int r = 0; r < srcHeight; ++r)
taylorza 0:01829868570e 470 {
taylorza 0:01829868570e 471 const uint8_t *p = bmp.getBitmapData() + offset;
taylorza 0:01829868570e 472
taylorza 0:01829868570e 473 uint8_t b = *p;
taylorza 0:01829868570e 474 for (int c = 0, shift = startbits; c < srcWidth; ++c, ++shift)
taylorza 0:01829868570e 475 {
taylorza 0:01829868570e 476 if (shift == 8)
taylorza 0:01829868570e 477 {
taylorza 0:01829868570e 478 shift = 0;
taylorza 0:01829868570e 479 b = *++p;
taylorza 0:01829868570e 480 }
taylorza 0:01829868570e 481
taylorza 0:01829868570e 482 if ((b << shift) & 0x80)
taylorza 0:01829868570e 483 {
taylorza 0:01829868570e 484 writeBatchData(fch, fcl);
taylorza 0:01829868570e 485 }
taylorza 0:01829868570e 486 else
taylorza 0:01829868570e 487 {
taylorza 0:01829868570e 488 writeBatchData(bch, bcl);
taylorza 0:01829868570e 489 }
taylorza 0:01829868570e 490 }
taylorza 0:01829868570e 491 offset += bmp.getStride();
taylorza 0:01829868570e 492 }
taylorza 0:01829868570e 493 endBatchCommand();
taylorza 0:01829868570e 494 }
taylorza 0:01829868570e 495
taylorza 0:01829868570e 496 void LCD_ST7735::drawBitmap(int x, int y, const uint8_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight, uint16_t foregroundColor, uint16_t backgroundColor)
taylorza 0:01829868570e 497 {
taylorza 0:01829868570e 498 // Clip if out of screen
taylorza 0:01829868570e 499 if ((x >= _width) || (x + srcWidth < 0) ||
taylorza 0:01829868570e 500 (y >= _height) || (y + srcHeight < 0))
taylorza 0:01829868570e 501 {
taylorza 0:01829868570e 502 return;
taylorza 0:01829868570e 503 }
taylorza 0:01829868570e 504
taylorza 0:01829868570e 505 // Clip X
taylorza 0:01829868570e 506 if (x < 0) { srcX += -x; srcWidth += x; x = 0; }
taylorza 0:01829868570e 507 if (x + srcWidth >= _width) { srcWidth += _width - (x + srcWidth); }
taylorza 0:01829868570e 508
taylorza 0:01829868570e 509 // Clip Y
taylorza 0:01829868570e 510 if (y < 0) {srcY += -y; srcHeight += y; y = 0; }
taylorza 0:01829868570e 511 if (y + srcHeight >= _height) { srcHeight += _height - (y + srcHeight); }
taylorza 0:01829868570e 512
taylorza 0:01829868570e 513 uint8_t fch = foregroundColor >> 8;
taylorza 0:01829868570e 514 uint8_t fcl = foregroundColor;
taylorza 0:01829868570e 515 uint8_t bch = backgroundColor >> 8;
taylorza 0:01829868570e 516 uint8_t bcl = backgroundColor;
taylorza 0:01829868570e 517
taylorza 0:01829868570e 518 uint16_t w = (*(pbmp + 1) << 8) | (*(pbmp + 0));
taylorza 0:01829868570e 519 pbmp += 4;
taylorza 0:01829868570e 520
taylorza 0:01829868570e 521 int stride = w / 8;
taylorza 0:01829868570e 522 clip(x, y, srcWidth, srcHeight);
taylorza 0:01829868570e 523
taylorza 0:01829868570e 524 int offset = (stride * srcY) + (srcX / 8);
taylorza 0:01829868570e 525 int startbits = srcX % 8;
taylorza 0:01829868570e 526
taylorza 0:01829868570e 527 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 528 for(int r = 0; r < srcHeight; ++r)
taylorza 0:01829868570e 529 {
taylorza 0:01829868570e 530 const uint8_t *p = pbmp + offset;
taylorza 0:01829868570e 531
taylorza 0:01829868570e 532 uint8_t b = *p;
taylorza 0:01829868570e 533 for (int c = 0, shift = startbits; c < srcWidth; ++c, ++shift)
taylorza 0:01829868570e 534 {
taylorza 0:01829868570e 535 if (shift == 8)
taylorza 0:01829868570e 536 {
taylorza 0:01829868570e 537 shift = 0;
taylorza 0:01829868570e 538 b = *++p;
taylorza 0:01829868570e 539 }
taylorza 0:01829868570e 540
taylorza 0:01829868570e 541 if ((b << shift) & 0x80)
taylorza 0:01829868570e 542 {
taylorza 0:01829868570e 543 writeBatchData(fch, fcl);
taylorza 0:01829868570e 544 }
taylorza 0:01829868570e 545 else
taylorza 0:01829868570e 546 {
taylorza 0:01829868570e 547 writeBatchData(bch, bcl);
taylorza 0:01829868570e 548 }
taylorza 0:01829868570e 549 }
taylorza 0:01829868570e 550 offset += stride;
taylorza 0:01829868570e 551 }
taylorza 0:01829868570e 552 endBatchCommand();
taylorza 0:01829868570e 553 }
taylorza 0:01829868570e 554
taylorza 0:01829868570e 555 void LCD_ST7735::setForegroundColor(uint16_t color)
taylorza 0:01829868570e 556 {
taylorza 0:01829868570e 557 _foregroundColorHigh = color >> 8;
taylorza 0:01829868570e 558 _foregroundColorLow = color;
taylorza 0:01829868570e 559 }
taylorza 0:01829868570e 560
taylorza 0:01829868570e 561 void LCD_ST7735::setBackgroundColor(uint16_t color)
taylorza 0:01829868570e 562 {
taylorza 0:01829868570e 563 _backgroundColorHigh = color >> 8;
taylorza 0:01829868570e 564 _backgroundColorLow = color;
taylorza 0:01829868570e 565 }
taylorza 0:01829868570e 566
taylorza 0:01829868570e 567 void LCD_ST7735::drawString(const uint8_t *pFont, int x, int y, const char *pString)
taylorza 0:01829868570e 568 {
taylorza 0:01829868570e 569 char *p = (char*)pString;
taylorza 0:01829868570e 570 while(*p != 0)
taylorza 0:01829868570e 571 {
taylorza 0:01829868570e 572 drawChar(pFont, x, y, *p++);
taylorza 0:01829868570e 573 x += 8;
taylorza 0:01829868570e 574 }
taylorza 0:01829868570e 575 }
taylorza 0:01829868570e 576
taylorza 0:01829868570e 577 void LCD_ST7735::selectDevice()
taylorza 0:01829868570e 578 {
taylorza 0:01829868570e 579 _spi.prepareFastSPI();
taylorza 0:01829868570e 580 }
taylorza 0:01829868570e 581
taylorza 0:01829868570e 582 void LCD_ST7735::drawVertLine(int x1, int y1, int y2, uint16_t color)
taylorza 0:01829868570e 583 {
taylorza 0:01829868570e 584 clipRect(x1, y1, x1, y2);
taylorza 0:01829868570e 585 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 586 int c = (y2 - y1) << 1;
taylorza 0:01829868570e 587 uint8_t colorHigh = color >> 8;
taylorza 0:01829868570e 588 uint8_t colorLow = color;
taylorza 0:01829868570e 589 for (int i = 0; i < c; ++i)
taylorza 0:01829868570e 590 {
taylorza 0:01829868570e 591 writeBatchData(colorHigh, colorLow);
taylorza 0:01829868570e 592 }
taylorza 0:01829868570e 593 endBatchCommand();
taylorza 0:01829868570e 594 }
taylorza 0:01829868570e 595
taylorza 0:01829868570e 596 void LCD_ST7735::drawHorizLine(int x1, int y1, int x2, uint16_t color)
taylorza 0:01829868570e 597 {
taylorza 0:01829868570e 598 clipRect(x1, y1, x2, y1);
taylorza 0:01829868570e 599 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 600 int c = (x2 - x1) << 1;
taylorza 0:01829868570e 601 uint8_t colorHigh = color >> 8;
taylorza 0:01829868570e 602 uint8_t colorLow = color;
taylorza 0:01829868570e 603 for (int i = 0; i < c; ++i)
taylorza 0:01829868570e 604 {
taylorza 0:01829868570e 605 writeBatchData(colorHigh, colorLow);
taylorza 0:01829868570e 606 }
taylorza 0:01829868570e 607 endBatchCommand();
taylorza 0:01829868570e 608 }
taylorza 0:01829868570e 609
taylorza 0:01829868570e 610 void LCD_ST7735::drawChar(const uint8_t *pFont, int x, int y, char c)
taylorza 0:01829868570e 611 {
taylorza 0:01829868570e 612 const uint8_t *pChar = pFont + (c * 8);
taylorza 0:01829868570e 613
taylorza 0:01829868570e 614 clip(x, y, 8, 8);
taylorza 0:01829868570e 615 beginBatchCommand(CMD_RAMWR);
taylorza 0:01829868570e 616 for(int r = 0; r < 8; ++r)
taylorza 0:01829868570e 617 {
taylorza 0:01829868570e 618 uint8_t b = pChar[r];
taylorza 0:01829868570e 619 for(int c = 0; c < 8; ++c)
taylorza 0:01829868570e 620 {
taylorza 0:01829868570e 621 if (b & 0x80)
taylorza 0:01829868570e 622 {
taylorza 0:01829868570e 623 writeBatchData(_foregroundColorHigh);
taylorza 0:01829868570e 624 writeBatchData(_foregroundColorLow);
taylorza 0:01829868570e 625 }
taylorza 0:01829868570e 626 else
taylorza 0:01829868570e 627 {
taylorza 0:01829868570e 628 writeBatchData(_backgroundColorHigh);
taylorza 0:01829868570e 629 writeBatchData(_backgroundColorLow);
taylorza 0:01829868570e 630 }
taylorza 0:01829868570e 631
taylorza 0:01829868570e 632 b <<= 1;
taylorza 0:01829868570e 633 }
taylorza 0:01829868570e 634 }
taylorza 0:01829868570e 635 endBatchCommand();
taylorza 0:01829868570e 636 }
taylorza 0:01829868570e 637
taylorza 0:01829868570e 638 void LCD_ST7735::initDisplay()
taylorza 0:01829868570e 639 {
taylorza 0:01829868570e 640 selectDevice();
taylorza 0:01829868570e 641 reset();
taylorza 0:01829868570e 642
taylorza 0:01829868570e 643 writeCommand(CMD_SLPOUT);
taylorza 0:01829868570e 644
taylorza 0:01829868570e 645 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:01829868570e 646 write(CMD_FRMCTR2, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 0:01829868570e 647 write(CMD_FRMCTR3, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
taylorza 0:01829868570e 648
taylorza 0:01829868570e 649 write(CMD_INVCTR, (uint8_t[]){0x07}, 1);
taylorza 0:01829868570e 650
taylorza 0:01829868570e 651 write(CMD_PWCTR1, (uint8_t[]){0xa2, 0x02, 0x84}, 3);
taylorza 0:01829868570e 652 write(CMD_PWCTR2, (uint8_t[]){0xc5}, 1);
taylorza 0:01829868570e 653 write(CMD_PWCTR3, (uint8_t[]){0x0a, 0x00}, 2);
taylorza 0:01829868570e 654 write(CMD_PWCTR4, (uint8_t[]){0x8a, 0x2a}, 2);
taylorza 0:01829868570e 655 write(CMD_PWCTR5, (uint8_t[]){0x8a, 0xee}, 2);
taylorza 0:01829868570e 656
taylorza 0:01829868570e 657 write(CMD_VMCTR1, (uint8_t[]){0x0e}, 1);
taylorza 0:01829868570e 658
taylorza 0:01829868570e 659 write(CMD_MADCTL, (uint8_t[]){0xc0 | _colorFilter}, 1);
taylorza 0:01829868570e 660
taylorza 0:01829868570e 661 // Gama sequence
taylorza 0:01829868570e 662 write(CMD_GAMCTRP1, (uint8_t[])
taylorza 0:01829868570e 663 {
taylorza 0:01829868570e 664 0x0f, 0x1a,
taylorza 0:01829868570e 665 0x0f, 0x18,
taylorza 0:01829868570e 666 0x2f, 0x28,
taylorza 0:01829868570e 667 0x20, 0x22,
taylorza 0:01829868570e 668 0x1f, 0x1b,
taylorza 0:01829868570e 669 0x23, 0x37,
taylorza 0:01829868570e 670 0x00, 0x07,
taylorza 0:01829868570e 671 0x02, 0x10
taylorza 0:01829868570e 672 }, 16);
taylorza 0:01829868570e 673
taylorza 0:01829868570e 674 write(CMD_GAMCTRN1, (uint8_t[])
taylorza 0:01829868570e 675 {
taylorza 0:01829868570e 676 0x0f, 0x1b,
taylorza 0:01829868570e 677 0x0f, 0x17,
taylorza 0:01829868570e 678 0x33, 0x2c,
taylorza 0:01829868570e 679 0x29, 0x2e,
taylorza 0:01829868570e 680 0x30, 0x30,
taylorza 0:01829868570e 681 0x39, 0x3f,
taylorza 0:01829868570e 682 0x00, 0x07,
taylorza 0:01829868570e 683 0x03, 0x10
taylorza 0:01829868570e 684 }, 16);
taylorza 0:01829868570e 685
taylorza 0:01829868570e 686 write(CMD_CASET, (uint8_t[]){0x00, 0x00, 0x00, 0x7f}, 4);
taylorza 0:01829868570e 687 write(CMD_RASET, (uint8_t[]){0x00, 0x00, 0x00, 0x9f}, 4);
taylorza 0:01829868570e 688
taylorza 0:01829868570e 689 write(CMD_EXTCTRL, (uint8_t[]){0x01}, 1);
taylorza 0:01829868570e 690
taylorza 0:01829868570e 691 // Disable RAM power save
taylorza 0:01829868570e 692 write(0xf6, (uint8_t[]){0x00}, 1);
taylorza 0:01829868570e 693
taylorza 0:01829868570e 694 // 65k color mode
taylorza 0:01829868570e 695 write(CMD_COLMOD, (uint8_t[]){0x05}, 1);
taylorza 0:01829868570e 696
taylorza 0:01829868570e 697 // Enable display
taylorza 0:01829868570e 698 writeCommand(CMD_DISPON);
taylorza 0:01829868570e 699
taylorza 0:01829868570e 700 setBacklight(true);
taylorza 0:01829868570e 701 }
taylorza 0:01829868570e 702
taylorza 0:01829868570e 703 void LCD_ST7735::reset()
taylorza 0:01829868570e 704 {
taylorza 0:01829868570e 705 _reset = 0;
taylorza 0:01829868570e 706 wait_us(100);
taylorza 0:01829868570e 707 _reset = 1;
taylorza 0:01829868570e 708 wait_us(100);
taylorza 0:01829868570e 709 }
taylorza 0:01829868570e 710
taylorza 0:01829868570e 711 void LCD_ST7735::clip(int x, int y, int w, int h)
taylorza 0:01829868570e 712 {
taylorza 0:01829868570e 713 clipRect(x, y, (x + w) - 1, (y + h) - 1);
taylorza 0:01829868570e 714 }
taylorza 0:01829868570e 715
taylorza 0:01829868570e 716 void LCD_ST7735::clipRect(int x1, int y1, int x2, int y2)
taylorza 0:01829868570e 717 {
taylorza 0:01829868570e 718 uint8_t x1l = (uint8_t)x1;
taylorza 0:01829868570e 719 //uint8_t x1h = (uint8_t)(x1 >> 8);
taylorza 0:01829868570e 720 uint8_t x2l = (uint8_t)x2;
taylorza 0:01829868570e 721 //uint8_t x2h = (uint8_t)(x2 >> 8);
taylorza 0:01829868570e 722 write(CMD_CASET, (uint8_t[]){0, x1l, 0, x2l}, 4);
taylorza 0:01829868570e 723
taylorza 0:01829868570e 724 uint8_t y1l = (uint8_t)y1;
taylorza 0:01829868570e 725 //uint8_t y1h = (uint8_t)(y1 >> 8);
taylorza 0:01829868570e 726 uint8_t y2l = (uint8_t)y2;
taylorza 0:01829868570e 727 //uint8_t y2h = (uint8_t)(y2 >> 8);
taylorza 0:01829868570e 728 write(CMD_RASET, (uint8_t[]){0, y1l, 0, y2l}, 4);
taylorza 0:01829868570e 729 }
taylorza 0:01829868570e 730
taylorza 0:01829868570e 731 void LCD_ST7735::writeCommand(uint8_t cmd)
taylorza 0:01829868570e 732 {
taylorza 0:01829868570e 733 _cs = 0;
taylorza 0:01829868570e 734 _ds = 0;
taylorza 0:01829868570e 735 _spi.fastWrite(cmd);
taylorza 0:01829868570e 736 _spi.waitWhileBusy();
taylorza 0:01829868570e 737 _spi.clearRx();
taylorza 0:01829868570e 738 _cs = 1;
taylorza 0:01829868570e 739 }
taylorza 0:01829868570e 740
taylorza 0:01829868570e 741 void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen)
taylorza 0:01829868570e 742 {
taylorza 0:01829868570e 743 _cs = 0;
taylorza 0:01829868570e 744 _ds = 0;
taylorza 0:01829868570e 745 _spi.fastWrite(cmd);
taylorza 0:01829868570e 746 _spi.waitWhileBusy();
taylorza 0:01829868570e 747 if (data != NULL & dataLen > 0)
taylorza 0:01829868570e 748 {
taylorza 0:01829868570e 749 _ds = 1;
taylorza 0:01829868570e 750 for(int i = 0; i < dataLen; ++i)
taylorza 0:01829868570e 751 {
taylorza 0:01829868570e 752 _spi.fastWrite(data[i]);
taylorza 0:01829868570e 753 }
taylorza 0:01829868570e 754 _spi.waitWhileBusy();
taylorza 0:01829868570e 755 _ds = 0;
taylorza 0:01829868570e 756 }
taylorza 0:01829868570e 757 _spi.clearRx();
taylorza 0:01829868570e 758 _cs = 1;
taylorza 0:01829868570e 759 }
taylorza 0:01829868570e 760
taylorza 0:01829868570e 761 void LCD_ST7735::write(uint8_t cmd, uint16_t data)
taylorza 0:01829868570e 762 {
taylorza 0:01829868570e 763 _cs = 0;
taylorza 0:01829868570e 764 _ds = 0;
taylorza 0:01829868570e 765 _spi.fastWrite(cmd);
taylorza 0:01829868570e 766 _spi.waitWhileBusy();
taylorza 0:01829868570e 767 _ds = 1;
taylorza 0:01829868570e 768 _spi.fastWrite(data >> 8);
taylorza 0:01829868570e 769 _spi.fastWrite(data);
taylorza 0:01829868570e 770 _spi.waitWhileBusy();
taylorza 0:01829868570e 771 _spi.clearRx();
taylorza 0:01829868570e 772 _ds = 0;
taylorza 0:01829868570e 773 _cs = 1;
taylorza 0:01829868570e 774 }
taylorza 0:01829868570e 775
taylorza 0:01829868570e 776 void LCD_ST7735::beginBatchCommand(uint8_t cmd)
taylorza 0:01829868570e 777 {
taylorza 0:01829868570e 778 _cs = 0;
taylorza 0:01829868570e 779 _ds = 0;
taylorza 0:01829868570e 780 _spi.fastWrite(cmd);
taylorza 0:01829868570e 781 _spi.waitWhileBusy();
taylorza 0:01829868570e 782 _ds = 1;
taylorza 0:01829868570e 783 }
taylorza 0:01829868570e 784
taylorza 0:01829868570e 785 void LCD_ST7735::writeBatchData(uint8_t data)
taylorza 0:01829868570e 786 {
taylorza 0:01829868570e 787 _spi.fastWrite(data);
taylorza 0:01829868570e 788 }
taylorza 0:01829868570e 789
taylorza 0:01829868570e 790 void LCD_ST7735::writeBatchData(uint8_t dataHigh, uint8_t dataLow)
taylorza 0:01829868570e 791 {
taylorza 0:01829868570e 792 _spi.fastWrite(dataHigh);
taylorza 0:01829868570e 793 _spi.fastWrite(dataLow);
taylorza 0:01829868570e 794 }
taylorza 0:01829868570e 795
taylorza 0:01829868570e 796
taylorza 0:01829868570e 797 void LCD_ST7735::writeBatchData(uint16_t data)
taylorza 0:01829868570e 798 {
taylorza 0:01829868570e 799 _spi.fastWrite(data >> 8);
taylorza 0:01829868570e 800 _spi.fastWrite(data);
taylorza 0:01829868570e 801 }
taylorza 0:01829868570e 802
taylorza 0:01829868570e 803 void LCD_ST7735::endBatchCommand()
taylorza 0:01829868570e 804 {
taylorza 0:01829868570e 805 _spi.waitWhileBusy();
taylorza 0:01829868570e 806 _spi.clearRx();
taylorza 0:01829868570e 807 _ds = 0;
taylorza 0:01829868570e 808 _cs = 1;
taylorza 0:01829868570e 809 }
taylorza 0:01829868570e 810
taylorza 0:01829868570e 811