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