Platform game written for the GHI/OutrageousCircuits RETRO game device. Navigate the caves collecting all the pickups and avoiding the creatures and haunted mine carts that patrol the caves. Oh and remember to watch out for the poisonous plants... This game demonstrates the ability to have multiple animated sprites where the sprites can overlap the background environment. See how the player moves past the fence and climbs the wall in the 3rd screen.

Dependencies:   mbed

Committer:
taylorza
Date:
Mon Feb 16 03:46:57 2015 +0000
Revision:
16:f9227904afc4
Parent:
4:45ff7fc8a431
Added a 4th game screen

Who changed what in which revision?

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