SPI based library for the ST7735 LCD controller.

Dependents:   RayCastingEngine RETRO_LCD_PerformanceTest RETRO_loop_test RETRO_RickGame ... more

Committer:
taylorza
Date:
Sun Mar 01 16:30:42 2015 +0000
Revision:
15:516f15979b53
Parent:
14:c94d0a2c2ba0
Fixed a bug in fill rectangle that excluded the last pixels when the rectangle had a height of 2 pixels.

Who changed what in which revision?

UserRevisionLine numberNew 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 15:516f15979b53 227 int c = (((x2 - x1) + 1) * ((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 14:c94d0a2c2ba0 246 {
taylorza 15:516f15979b53 247 int c = (((x2 - x1) + 1) * ((y2 - y1) + 1));
taylorza 14:c94d0a2c2ba0 248
taylorza 14:c94d0a2c2ba0 249 clipRect(x1, y1, x2, y2);
taylorza 12:146a55dccb22 250 uint8_t colorHigh = fillColor >> 8;
taylorza 12:146a55dccb22 251 uint8_t colorLow = fillColor;
taylorza 12:146a55dccb22 252 beginBatchCommand(CMD_RAMWR);
taylorza 12:146a55dccb22 253 while(c--)
taylorza 12:146a55dccb22 254 {
taylorza 12:146a55dccb22 255 writeBatchData(colorHigh, colorLow);
taylorza 12:146a55dccb22 256 }
taylorza 12:146a55dccb22 257 endBatchCommand();
taylorza 0:7b3fb3085867 258 }
taylorza 0:7b3fb3085867 259 }
taylorza 0:7b3fb3085867 260
taylorza 0:7b3fb3085867 261 void LCD_ST7735::fillCircle(int x, int y, int r, uint16_t borderColor, uint16_t fillColor)
taylorza 0:7b3fb3085867 262 {
taylorza 0:7b3fb3085867 263 int ix = r;
taylorza 0:7b3fb3085867 264 int iy = 0;
taylorza 0:7b3fb3085867 265 int err = 1 - r;
taylorza 0:7b3fb3085867 266
taylorza 0:7b3fb3085867 267 while(ix >= iy)
taylorza 0:7b3fb3085867 268 {
taylorza 9:7ecd74dcb8ef 269 setPixel(x - ix, y + iy, borderColor);
taylorza 9:7ecd74dcb8ef 270 setPixel(x + ix, y + iy, borderColor);
taylorza 0:7b3fb3085867 271 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 272
taylorza 9:7ecd74dcb8ef 273 setPixel(x - iy, y + ix, borderColor);
taylorza 9:7ecd74dcb8ef 274 setPixel(x + iy, y + ix, borderColor);
taylorza 0:7b3fb3085867 275 drawHorizLine(x - iy + 1, y + ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 276
taylorza 9:7ecd74dcb8ef 277 setPixel(x - ix, y - iy, borderColor);
taylorza 9:7ecd74dcb8ef 278 setPixel(x + ix, y - iy, borderColor);
taylorza 0:7b3fb3085867 279 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 0:7b3fb3085867 280
taylorza 9:7ecd74dcb8ef 281 setPixel(x - iy, y - ix, borderColor);
taylorza 9:7ecd74dcb8ef 282 setPixel(x + iy, y - ix, borderColor);
taylorza 0:7b3fb3085867 283 drawHorizLine(x - iy + 1, y - ix, x + iy - 1, fillColor);
taylorza 0:7b3fb3085867 284 iy++;
taylorza 0:7b3fb3085867 285 if (err < 0)
taylorza 0:7b3fb3085867 286 {
taylorza 0:7b3fb3085867 287 err += 2 * iy + 1;
taylorza 0:7b3fb3085867 288 }
taylorza 0:7b3fb3085867 289 else
taylorza 0:7b3fb3085867 290 {
taylorza 0:7b3fb3085867 291 ix--;
taylorza 0:7b3fb3085867 292 err += 2 * (iy - ix + 1);
taylorza 0:7b3fb3085867 293 }
taylorza 0:7b3fb3085867 294 }
taylorza 0:7b3fb3085867 295 }
taylorza 0:7b3fb3085867 296
taylorza 1:33ff5fad4320 297 void LCD_ST7735::fillEllipse(int x, int y, int rx, int ry, uint16_t borderColor, uint16_t fillColor)
taylorza 1:33ff5fad4320 298 {
taylorza 1:33ff5fad4320 299 int a2 = rx * rx;
taylorza 1:33ff5fad4320 300 int b2 = ry * ry;
taylorza 1:33ff5fad4320 301 int fa2 = 4 * a2;
taylorza 1:33ff5fad4320 302 int fb2 = 4 * b2;
taylorza 1:33ff5fad4320 303
taylorza 1:33ff5fad4320 304 int ix, iy, sigma;
taylorza 1:33ff5fad4320 305 for (ix = 0, iy = ry, sigma = 2 * b2 + a2 * (1 - 2 * ry); b2 * ix <= a2 * iy; ix++)
taylorza 1:33ff5fad4320 306 {
taylorza 9:7ecd74dcb8ef 307 setPixel(x + ix, y + iy, borderColor);
taylorza 9:7ecd74dcb8ef 308 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 309 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 310
taylorza 9:7ecd74dcb8ef 311 setPixel(x + ix, y - iy, borderColor);
taylorza 9:7ecd74dcb8ef 312 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 313 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 314
taylorza 1:33ff5fad4320 315 if (sigma >= 0)
taylorza 1:33ff5fad4320 316 {
taylorza 1:33ff5fad4320 317 sigma+= fa2 * (1 - iy);
taylorza 1:33ff5fad4320 318 iy--;
taylorza 1:33ff5fad4320 319 }
taylorza 1:33ff5fad4320 320 sigma += b2 * ((4 * ix) + 6);
taylorza 1:33ff5fad4320 321 }
taylorza 1:33ff5fad4320 322
taylorza 1:33ff5fad4320 323 for (ix = rx, iy = 0, sigma = 2 * a2 + b2 * (1 - 2 * rx); a2 * iy <= b2 * ix; iy++)
taylorza 1:33ff5fad4320 324 {
taylorza 9:7ecd74dcb8ef 325 setPixel(x + ix, y + iy, borderColor);
taylorza 9:7ecd74dcb8ef 326 setPixel(x - ix, y + iy, borderColor);
taylorza 1:33ff5fad4320 327 drawHorizLine(x - ix + 1, y + iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 328
taylorza 9:7ecd74dcb8ef 329 setPixel(x + ix, y - iy, borderColor);
taylorza 9:7ecd74dcb8ef 330 setPixel(x - ix, y - iy, borderColor);
taylorza 1:33ff5fad4320 331 drawHorizLine(x - ix + 1, y - iy, x + ix - 1, fillColor);
taylorza 1:33ff5fad4320 332 if (sigma >= 0)
taylorza 1:33ff5fad4320 333 {
taylorza 1:33ff5fad4320 334 sigma+= fb2 * (1 - ix);
taylorza 1:33ff5fad4320 335 ix--;
taylorza 1:33ff5fad4320 336 }
taylorza 1:33ff5fad4320 337 sigma += a2 * ((4 * iy) + 6);
taylorza 1:33ff5fad4320 338 }
taylorza 1:33ff5fad4320 339 }
taylorza 1:33ff5fad4320 340
taylorza 0:7b3fb3085867 341 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp)
taylorza 0:7b3fb3085867 342 {
taylorza 0:7b3fb3085867 343 int w = *pbmp++;
taylorza 0:7b3fb3085867 344 int h = *pbmp++;
taylorza 0:7b3fb3085867 345
taylorza 0:7b3fb3085867 346 clip(x, y, w, h);
taylorza 0:7b3fb3085867 347 int c = w * h;
taylorza 0:7b3fb3085867 348 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 349 while(c--)
taylorza 0:7b3fb3085867 350 {
taylorza 0:7b3fb3085867 351 writeBatchData(*pbmp++);
taylorza 0:7b3fb3085867 352 }
taylorza 0:7b3fb3085867 353 endBatchCommand();
taylorza 0:7b3fb3085867 354 }
taylorza 0:7b3fb3085867 355
taylorza 1:33ff5fad4320 356 void LCD_ST7735::drawBitmap(int x, int y, const uint16_t *pbmp, int srcX, int srcY, int srcWidth, int srcHeight)
taylorza 1:33ff5fad4320 357 {
taylorza 1:33ff5fad4320 358 int w = *pbmp++;
taylorza 1:33ff5fad4320 359 int h = *pbmp++;
taylorza 1:33ff5fad4320 360
taylorza 1:33ff5fad4320 361 clip(x, y, srcWidth, srcHeight);
taylorza 1:33ff5fad4320 362 beginBatchCommand(CMD_RAMWR);
taylorza 1:33ff5fad4320 363 const uint16_t *p = pbmp + srcX + (srcY * w);
taylorza 1:33ff5fad4320 364 for(int iy = 0; iy < srcHeight; ++iy)
taylorza 1:33ff5fad4320 365 {
taylorza 1:33ff5fad4320 366 for(int ix = 0; ix < srcWidth; ++ix)
taylorza 1:33ff5fad4320 367 {
taylorza 1:33ff5fad4320 368 writeBatchData(*(p + ix));
taylorza 1:33ff5fad4320 369 }
taylorza 1:33ff5fad4320 370 p += w;
taylorza 1:33ff5fad4320 371 }
taylorza 1:33ff5fad4320 372 endBatchCommand();
taylorza 1:33ff5fad4320 373 }
taylorza 1:33ff5fad4320 374
taylorza 0:7b3fb3085867 375 void LCD_ST7735::setForegroundColor(uint16_t color)
taylorza 0:7b3fb3085867 376 {
taylorza 4:88d22437119c 377 _foregroundColorHigh = color >> 8;
taylorza 4:88d22437119c 378 _foregroundColorLow = color;
taylorza 0:7b3fb3085867 379 }
taylorza 0:7b3fb3085867 380
taylorza 0:7b3fb3085867 381 void LCD_ST7735::setBackgroundColor(uint16_t color)
taylorza 0:7b3fb3085867 382 {
taylorza 4:88d22437119c 383 _backgroundColorHigh = color >> 8;
taylorza 4:88d22437119c 384 _backgroundColorLow = color;
taylorza 0:7b3fb3085867 385 }
taylorza 0:7b3fb3085867 386
taylorza 0:7b3fb3085867 387 void LCD_ST7735::drawString(const uint8_t *pFont, int x, int y, const char *pString)
taylorza 0:7b3fb3085867 388 {
taylorza 13:a559617cdf94 389 uint8_t w = *pFont;
taylorza 13:a559617cdf94 390 uint8_t h = *(pFont + 1);
taylorza 13:a559617cdf94 391 uint8_t offset = *(pFont + 2);
taylorza 13:a559617cdf94 392 uint8_t leftPad = *(pFont + 3);
taylorza 13:a559617cdf94 393 uint8_t rightPad = *(pFont + 4);
taylorza 13:a559617cdf94 394 uint8_t topPad = *(pFont + 5);
taylorza 13:a559617cdf94 395 uint8_t bottomPad = *(pFont + 6);
taylorza 13:a559617cdf94 396
taylorza 14:c94d0a2c2ba0 397 if (y + topPad + h + bottomPad < 0) return;
taylorza 14:c94d0a2c2ba0 398 if (y >= _height) return;
taylorza 14:c94d0a2c2ba0 399 if (x + leftPad + w + rightPad < 0) return;
taylorza 14:c94d0a2c2ba0 400
taylorza 0:7b3fb3085867 401 char *p = (char*)pString;
taylorza 0:7b3fb3085867 402 while(*p != 0)
taylorza 14:c94d0a2c2ba0 403 {
taylorza 14:c94d0a2c2ba0 404 if (x >= _width) return;
taylorza 13:a559617cdf94 405 drawChar(pFont, x, y, *p++, w, h, offset, leftPad, rightPad, topPad, bottomPad);
taylorza 13:a559617cdf94 406 x += (w + leftPad + rightPad);
taylorza 0:7b3fb3085867 407 }
taylorza 0:7b3fb3085867 408 }
taylorza 0:7b3fb3085867 409
taylorza 14:c94d0a2c2ba0 410 void LCD_ST7735::measureString(const uint8_t *pFont, const char *pString, uint8_t &width, uint8_t &height)
taylorza 13:a559617cdf94 411 {
taylorza 13:a559617cdf94 412 uint8_t w = *pFont;
taylorza 13:a559617cdf94 413 uint8_t h = *(pFont + 1);
taylorza 13:a559617cdf94 414 uint8_t leftPad = *(pFont + 3);
taylorza 13:a559617cdf94 415 uint8_t rightPad = *(pFont + 4);
taylorza 13:a559617cdf94 416 uint8_t topPad = *(pFont + 5);
taylorza 13:a559617cdf94 417 uint8_t bottomPad = *(pFont + 6);
taylorza 13:a559617cdf94 418
taylorza 13:a559617cdf94 419 width = (w + leftPad + rightPad) * strlen(pString);
taylorza 13:a559617cdf94 420 height = (h + topPad + bottomPad);
taylorza 13:a559617cdf94 421 }
taylorza 13:a559617cdf94 422
taylorza 8:12f16befa7e1 423 void LCD_ST7735::selectDevice()
taylorza 8:12f16befa7e1 424 {
taylorza 8:12f16befa7e1 425 _spi.prepareFastSPI();
taylorza 8:12f16befa7e1 426 }
taylorza 8:12f16befa7e1 427
taylorza 0:7b3fb3085867 428 void LCD_ST7735::drawVertLine(int x1, int y1, int y2, uint16_t color)
taylorza 0:7b3fb3085867 429 {
taylorza 0:7b3fb3085867 430 clipRect(x1, y1, x1, y2);
taylorza 0:7b3fb3085867 431 beginBatchCommand(CMD_RAMWR);
taylorza 4:88d22437119c 432 int c = (y2 - y1) << 1;
taylorza 4:88d22437119c 433 uint8_t colorHigh = color >> 8;
taylorza 4:88d22437119c 434 uint8_t colorLow = color;
taylorza 4:88d22437119c 435 for (int i = 0; i < c; ++i)
taylorza 0:7b3fb3085867 436 {
taylorza 4:88d22437119c 437 writeBatchData(colorHigh, colorLow);
taylorza 0:7b3fb3085867 438 }
taylorza 0:7b3fb3085867 439 endBatchCommand();
taylorza 0:7b3fb3085867 440 }
taylorza 0:7b3fb3085867 441
taylorza 0:7b3fb3085867 442 void LCD_ST7735::drawHorizLine(int x1, int y1, int x2, uint16_t color)
taylorza 0:7b3fb3085867 443 {
taylorza 0:7b3fb3085867 444 clipRect(x1, y1, x2, y1);
taylorza 0:7b3fb3085867 445 beginBatchCommand(CMD_RAMWR);
taylorza 4:88d22437119c 446 int c = (x2 - x1) << 1;
taylorza 4:88d22437119c 447 uint8_t colorHigh = color >> 8;
taylorza 4:88d22437119c 448 uint8_t colorLow = color;
taylorza 4:88d22437119c 449 for (int i = 0; i < c; ++i)
taylorza 0:7b3fb3085867 450 {
taylorza 4:88d22437119c 451 writeBatchData(colorHigh, colorLow);
taylorza 0:7b3fb3085867 452 }
taylorza 0:7b3fb3085867 453 endBatchCommand();
taylorza 0:7b3fb3085867 454 }
taylorza 0:7b3fb3085867 455
taylorza 13:a559617cdf94 456 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 457 {
taylorza 13:a559617cdf94 458 const uint8_t *pChar = (pFont + 7) + ((c - offset) * h);
taylorza 13:a559617cdf94 459
taylorza 13:a559617cdf94 460 clip(x, y, w + leftPad + rightPad, h + topPad + bottomPad);
taylorza 13:a559617cdf94 461
taylorza 13:a559617cdf94 462 beginBatchCommand(CMD_RAMWR);
taylorza 0:7b3fb3085867 463
taylorza 13:a559617cdf94 464 // Render top spacing
taylorza 13:a559617cdf94 465 for (int r = 0; r < topPad; ++r)
taylorza 13:a559617cdf94 466 {
taylorza 13:a559617cdf94 467 for (int c = 0; c < w + leftPad + rightPad; ++c)
taylorza 13:a559617cdf94 468 {
taylorza 13:a559617cdf94 469 writeBatchData(_backgroundColorHigh);
taylorza 13:a559617cdf94 470 writeBatchData(_backgroundColorLow);
taylorza 13:a559617cdf94 471 }
taylorza 13:a559617cdf94 472 }
taylorza 13:a559617cdf94 473
taylorza 13:a559617cdf94 474 // Render character
taylorza 13:a559617cdf94 475 for(int r = 0; r < h; ++r)
taylorza 0:7b3fb3085867 476 {
taylorza 0:7b3fb3085867 477 uint8_t b = pChar[r];
taylorza 13:a559617cdf94 478
taylorza 13:a559617cdf94 479 // Render left spacing
taylorza 13:a559617cdf94 480 for (int c = 0; c < leftPad; ++c)
taylorza 13:a559617cdf94 481 {
taylorza 13:a559617cdf94 482 writeBatchData(_backgroundColorHigh);
taylorza 13:a559617cdf94 483 writeBatchData(_backgroundColorLow);
taylorza 13:a559617cdf94 484 }
taylorza 13:a559617cdf94 485 for(int c = 0; c < w; ++c)
taylorza 0:7b3fb3085867 486 {
taylorza 0:7b3fb3085867 487 if (b & 0x80)
taylorza 4:88d22437119c 488 {
taylorza 4:88d22437119c 489 writeBatchData(_foregroundColorHigh);
taylorza 4:88d22437119c 490 writeBatchData(_foregroundColorLow);
taylorza 4:88d22437119c 491 }
taylorza 0:7b3fb3085867 492 else
taylorza 4:88d22437119c 493 {
taylorza 4:88d22437119c 494 writeBatchData(_backgroundColorHigh);
taylorza 4:88d22437119c 495 writeBatchData(_backgroundColorLow);
taylorza 4:88d22437119c 496 }
taylorza 0:7b3fb3085867 497
taylorza 0:7b3fb3085867 498 b <<= 1;
taylorza 0:7b3fb3085867 499 }
taylorza 13:a559617cdf94 500
taylorza 13:a559617cdf94 501 for (int c = 0; c < rightPad; ++c)
taylorza 13:a559617cdf94 502 {
taylorza 13:a559617cdf94 503 writeBatchData(_backgroundColorHigh);
taylorza 13:a559617cdf94 504 writeBatchData(_backgroundColorLow);
taylorza 13:a559617cdf94 505 }
taylorza 13:a559617cdf94 506 }
taylorza 13:a559617cdf94 507
taylorza 13:a559617cdf94 508 // Render bottom spacing
taylorza 13:a559617cdf94 509 for (int r = 0; r < bottomPad; ++r)
taylorza 13:a559617cdf94 510 {
taylorza 13:a559617cdf94 511 for (int c = 0; c < w + leftPad + rightPad; ++c)
taylorza 13:a559617cdf94 512 {
taylorza 13:a559617cdf94 513 writeBatchData(_backgroundColorHigh);
taylorza 13:a559617cdf94 514 writeBatchData(_backgroundColorLow);
taylorza 13:a559617cdf94 515 }
taylorza 0:7b3fb3085867 516 }
taylorza 0:7b3fb3085867 517 endBatchCommand();
taylorza 0:7b3fb3085867 518 }
taylorza 0:7b3fb3085867 519
taylorza 0:7b3fb3085867 520 void LCD_ST7735::initDisplay()
taylorza 0:7b3fb3085867 521 {
taylorza 8:12f16befa7e1 522 selectDevice();
taylorza 0:7b3fb3085867 523 reset();
taylorza 0:7b3fb3085867 524
taylorza 5:21c987ee68d2 525 writeCommand(CMD_SLPOUT);
taylorza 0:7b3fb3085867 526
taylorza 0:7b3fb3085867 527 write(CMD_FRMCTR1, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 5:21c987ee68d2 528 write(CMD_FRMCTR2, (uint8_t[]){0x01, 0x2c, 0x2d}, 3);
taylorza 5:21c987ee68d2 529 write(CMD_FRMCTR3, (uint8_t[]){0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d}, 6);
taylorza 0:7b3fb3085867 530
taylorza 0:7b3fb3085867 531 write(CMD_INVCTR, (uint8_t[]){0x07}, 1);
taylorza 0:7b3fb3085867 532
taylorza 0:7b3fb3085867 533 write(CMD_PWCTR1, (uint8_t[]){0xa2, 0x02, 0x84}, 3);
taylorza 0:7b3fb3085867 534 write(CMD_PWCTR2, (uint8_t[]){0xc5}, 1);
taylorza 0:7b3fb3085867 535 write(CMD_PWCTR3, (uint8_t[]){0x0a, 0x00}, 2);
taylorza 0:7b3fb3085867 536 write(CMD_PWCTR4, (uint8_t[]){0x8a, 0x2a}, 2);
taylorza 0:7b3fb3085867 537 write(CMD_PWCTR5, (uint8_t[]){0x8a, 0xee}, 2);
taylorza 0:7b3fb3085867 538
taylorza 0:7b3fb3085867 539 write(CMD_VMCTR1, (uint8_t[]){0x0e}, 1);
taylorza 0:7b3fb3085867 540
taylorza 8:12f16befa7e1 541 write(CMD_MADCTL, (uint8_t[]){0xc0 | _colorFilter}, 1);
taylorza 0:7b3fb3085867 542
taylorza 0:7b3fb3085867 543 // Gama sequence
taylorza 0:7b3fb3085867 544 write(CMD_GAMCTRP1, (uint8_t[])
taylorza 0:7b3fb3085867 545 {
taylorza 0:7b3fb3085867 546 0x0f, 0x1a,
taylorza 0:7b3fb3085867 547 0x0f, 0x18,
taylorza 0:7b3fb3085867 548 0x2f, 0x28,
taylorza 0:7b3fb3085867 549 0x20, 0x22,
taylorza 0:7b3fb3085867 550 0x1f, 0x1b,
taylorza 0:7b3fb3085867 551 0x23, 0x37,
taylorza 0:7b3fb3085867 552 0x00, 0x07,
taylorza 0:7b3fb3085867 553 0x02, 0x10
taylorza 0:7b3fb3085867 554 }, 16);
taylorza 0:7b3fb3085867 555
taylorza 0:7b3fb3085867 556 write(CMD_GAMCTRN1, (uint8_t[])
taylorza 0:7b3fb3085867 557 {
taylorza 0:7b3fb3085867 558 0x0f, 0x1b,
taylorza 0:7b3fb3085867 559 0x0f, 0x17,
taylorza 0:7b3fb3085867 560 0x33, 0x2c,
taylorza 0:7b3fb3085867 561 0x29, 0x2e,
taylorza 0:7b3fb3085867 562 0x30, 0x30,
taylorza 0:7b3fb3085867 563 0x39, 0x3f,
taylorza 0:7b3fb3085867 564 0x00, 0x07,
taylorza 0:7b3fb3085867 565 0x03, 0x10
taylorza 0:7b3fb3085867 566 }, 16);
taylorza 0:7b3fb3085867 567
taylorza 0:7b3fb3085867 568 write(CMD_CASET, (uint8_t[]){0x00, 0x00, 0x00, 0x7f}, 4);
taylorza 0:7b3fb3085867 569 write(CMD_RASET, (uint8_t[]){0x00, 0x00, 0x00, 0x9f}, 4);
taylorza 0:7b3fb3085867 570
taylorza 0:7b3fb3085867 571 write(CMD_EXTCTRL, (uint8_t[]){0x01}, 1);
taylorza 0:7b3fb3085867 572
taylorza 0:7b3fb3085867 573 // Disable RAM power save
taylorza 0:7b3fb3085867 574 write(0xf6, (uint8_t[]){0x00}, 1);
taylorza 0:7b3fb3085867 575
taylorza 0:7b3fb3085867 576 // 65k color mode
taylorza 0:7b3fb3085867 577 write(CMD_COLMOD, (uint8_t[]){0x05}, 1);
taylorza 0:7b3fb3085867 578
taylorza 0:7b3fb3085867 579 // Enable display
taylorza 5:21c987ee68d2 580 writeCommand(CMD_DISPON);
taylorza 0:7b3fb3085867 581
taylorza 0:7b3fb3085867 582 setBacklight(true);
taylorza 0:7b3fb3085867 583 }
taylorza 0:7b3fb3085867 584
taylorza 0:7b3fb3085867 585 void LCD_ST7735::reset()
taylorza 0:7b3fb3085867 586 {
taylorza 0:7b3fb3085867 587 _reset = 0;
taylorza 0:7b3fb3085867 588 wait_us(100);
taylorza 0:7b3fb3085867 589 _reset = 1;
taylorza 0:7b3fb3085867 590 wait_us(100);
taylorza 0:7b3fb3085867 591 }
taylorza 0:7b3fb3085867 592
taylorza 0:7b3fb3085867 593 void LCD_ST7735::clip(int x, int y, int w, int h)
taylorza 0:7b3fb3085867 594 {
taylorza 0:7b3fb3085867 595 clipRect(x, y, (x + w) - 1, (y + h) - 1);
taylorza 0:7b3fb3085867 596 }
taylorza 0:7b3fb3085867 597
taylorza 0:7b3fb3085867 598 void LCD_ST7735::clipRect(int x1, int y1, int x2, int y2)
taylorza 0:7b3fb3085867 599 {
taylorza 4:88d22437119c 600 uint8_t x1l = (uint8_t)x1;
taylorza 4:88d22437119c 601 uint8_t x1h = (uint8_t)(x1 >> 8);
taylorza 4:88d22437119c 602 uint8_t x2l = (uint8_t)x2;
taylorza 4:88d22437119c 603 uint8_t x2h = (uint8_t)(x2 >> 8);
taylorza 0:7b3fb3085867 604 write(CMD_CASET, (uint8_t[]){x1h, x1l, x2h, x2l}, 4);
taylorza 0:7b3fb3085867 605
taylorza 4:88d22437119c 606 uint8_t y1l = (uint8_t)y1;
taylorza 4:88d22437119c 607 uint8_t y1h = (uint8_t)(y1 >> 8);
taylorza 4:88d22437119c 608 uint8_t y2l = (uint8_t)y2;
taylorza 4:88d22437119c 609 uint8_t y2h = (uint8_t)(y2 >> 8);
taylorza 0:7b3fb3085867 610 write(CMD_RASET, (uint8_t[]){y1h, y1l, y2h, y2l}, 4);
taylorza 0:7b3fb3085867 611 }
taylorza 5:21c987ee68d2 612
taylorza 5:21c987ee68d2 613 void LCD_ST7735::writeCommand(uint8_t cmd)
taylorza 0:7b3fb3085867 614 {
taylorza 5:21c987ee68d2 615 _cs = 0;
taylorza 5:21c987ee68d2 616 _ds = 0;
taylorza 5:21c987ee68d2 617 _spi.fastWrite(cmd);
taylorza 5:21c987ee68d2 618 _spi.waitWhileBusy();
taylorza 5:21c987ee68d2 619 _spi.clearRx();
taylorza 5:21c987ee68d2 620 _cs = 1;
taylorza 0:7b3fb3085867 621 }
taylorza 0:7b3fb3085867 622
taylorza 0:7b3fb3085867 623 void LCD_ST7735::write(uint8_t cmd, uint8_t data[], int dataLen)
taylorza 0:7b3fb3085867 624 {
taylorza 0:7b3fb3085867 625 _cs = 0;
taylorza 5:21c987ee68d2 626 _ds = 0;
taylorza 5:21c987ee68d2 627 _spi.fastWrite(cmd);
taylorza 5:21c987ee68d2 628 _spi.waitWhileBusy();
taylorza 0:7b3fb3085867 629 if (data != NULL & dataLen > 0)
taylorza 0:7b3fb3085867 630 {
taylorza 0:7b3fb3085867 631 _ds = 1;
taylorza 0:7b3fb3085867 632 for(int i = 0; i < dataLen; ++i)
taylorza 0:7b3fb3085867 633 {
taylorza 5:21c987ee68d2 634 _spi.fastWrite(data[i]);
taylorza 0:7b3fb3085867 635 }
taylorza 5:21c987ee68d2 636 _spi.waitWhileBusy();
taylorza 0:7b3fb3085867 637 _ds = 0;
taylorza 0:7b3fb3085867 638 }
taylorza 5:21c987ee68d2 639 _spi.clearRx();
taylorza 5:21c987ee68d2 640 _cs = 1;
taylorza 0:7b3fb3085867 641 }
taylorza 0:7b3fb3085867 642
taylorza 0:7b3fb3085867 643 void LCD_ST7735::write(uint8_t cmd, uint16_t data)
taylorza 0:7b3fb3085867 644 {
taylorza 5:21c987ee68d2 645 _cs = 0;
taylorza 5:21c987ee68d2 646 _ds = 0;
taylorza 5:21c987ee68d2 647 _spi.fastWrite(cmd);
taylorza 5:21c987ee68d2 648 _spi.waitWhileBusy();
taylorza 5:21c987ee68d2 649 _ds = 1;
taylorza 5:21c987ee68d2 650 _spi.fastWrite(data >> 8);
taylorza 5:21c987ee68d2 651 _spi.fastWrite(data);
taylorza 5:21c987ee68d2 652 _spi.waitWhileBusy();
taylorza 5:21c987ee68d2 653 _spi.clearRx();
taylorza 5:21c987ee68d2 654 _ds = 0;
taylorza 0:7b3fb3085867 655 _cs = 1;
taylorza 0:7b3fb3085867 656 }
taylorza 0:7b3fb3085867 657
taylorza 0:7b3fb3085867 658 void LCD_ST7735::beginBatchCommand(uint8_t cmd)
taylorza 0:7b3fb3085867 659 {
taylorza 0:7b3fb3085867 660 _cs = 0;
taylorza 5:21c987ee68d2 661 _ds = 0;
taylorza 5:21c987ee68d2 662 _spi.fastWrite(cmd);
taylorza 5:21c987ee68d2 663 _spi.waitWhileBusy();
taylorza 0:7b3fb3085867 664 _ds = 1;
taylorza 0:7b3fb3085867 665 }
taylorza 0:7b3fb3085867 666
taylorza 0:7b3fb3085867 667 void LCD_ST7735::writeBatchData(uint8_t data)
taylorza 0:7b3fb3085867 668 {
taylorza 5:21c987ee68d2 669 _spi.fastWrite(data);
taylorza 0:7b3fb3085867 670 }
taylorza 0:7b3fb3085867 671
taylorza 4:88d22437119c 672 void LCD_ST7735::writeBatchData(uint8_t dataHigh, uint8_t dataLow)
taylorza 4:88d22437119c 673 {
taylorza 5:21c987ee68d2 674 _spi.fastWrite(dataHigh);
taylorza 5:21c987ee68d2 675 _spi.fastWrite(dataLow);
taylorza 4:88d22437119c 676 }
taylorza 4:88d22437119c 677
taylorza 4:88d22437119c 678
taylorza 0:7b3fb3085867 679 void LCD_ST7735::writeBatchData(uint16_t data)
taylorza 0:7b3fb3085867 680 {
taylorza 5:21c987ee68d2 681 _spi.fastWrite(data >> 8);
taylorza 5:21c987ee68d2 682 _spi.fastWrite(data);
taylorza 0:7b3fb3085867 683 }
taylorza 0:7b3fb3085867 684
taylorza 0:7b3fb3085867 685 void LCD_ST7735::endBatchCommand()
taylorza 0:7b3fb3085867 686 {
taylorza 5:21c987ee68d2 687 _spi.waitWhileBusy();
taylorza 5:21c987ee68d2 688 _spi.clearRx();
taylorza 0:7b3fb3085867 689 _ds = 0;
taylorza 0:7b3fb3085867 690 _cs = 1;
taylorza 4:88d22437119c 691 }
taylorza 7:f39c980a589c 692