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.
LCD_ST7735/LCD_ST7735.cpp@4:b857db213f10, 2015-02-08 (annotated)
- 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?
User | Revision | Line number | New 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 |