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