source: arduino-1-6-7/trunk/fuentes/arduino-ide-amd64/libraries/TFT/src/utility/Adafruit_ST7735.cpp @ 46

Last change on this file since 46 was 46, checked in by jrpelegrina, 4 years ago

First release to Xenial

File size: 21.2 KB
Line 
1/***************************************************
2  This is a library for the Adafruit 1.8" SPI display.
3  This library works with the Adafruit 1.8" TFT Breakout w/SD card
4  ----> http://www.adafruit.com/products/358
5  as well as Adafruit raw 1.8" TFT display
6  ----> http://www.adafruit.com/products/618
7 
8  Check out the links above for our tutorials and wiring diagrams
9  These displays use SPI to communicate, 4 or 5 pins are required to
10  interface (RST is optional)
11  Adafruit invests time and resources providing this open source code,
12  please support Adafruit and open-source hardware by purchasing
13  products from Adafruit!
14
15  Written by Limor Fried/Ladyada for Adafruit Industries.
16  MIT license, all text above must be included in any redistribution
17 ****************************************************/
18
19#include "Adafruit_ST7735.h"
20#include <avr/pgmspace.h>
21#include <limits.h>
22#include "pins_arduino.h"
23#include "wiring_private.h"
24#include <SPI.h>
25
26inline uint16_t swapcolor(uint16_t x) { 
27  return (x << 11) | (x & 0x07E0) | (x >> 11);
28}
29
30
31// Constructor when using software SPI.  All output pins are configurable.
32Adafruit_ST7735::Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t sid,
33 uint8_t sclk, uint8_t rst) : Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) 
34{
35  _cs   = cs;
36  _rs   = rs;
37  _sid  = sid;
38  _sclk = sclk;
39  _rst  = rst;
40  hwSPI = false;
41}
42
43
44// Constructor when using hardware SPI.  Faster, but must use SPI pins
45// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
46Adafruit_ST7735::Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t rst) : 
47Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) 
48{
49  _cs   = cs;
50  _rs   = rs;
51  _rst  = rst;
52  hwSPI = true;
53  _sid  = _sclk = 0;
54}
55
56
57inline void Adafruit_ST7735::spiwrite(uint8_t c) {
58
59  //Serial.println(c, HEX);
60
61  if (hwSPI) {
62    SPI.transfer(c);
63  } else {
64    // Fast SPI bitbang swiped from LPD8806 library
65    for(uint8_t bit = 0x80; bit; bit >>= 1) {
66      if(c & bit) *dataport |=  datapinmask;
67      else        *dataport &= ~datapinmask;
68      *clkport |=  clkpinmask;
69      *clkport &= ~clkpinmask;
70    }
71  }
72}
73
74
75void Adafruit_ST7735::writecommand(uint8_t c) {
76#ifdef SPI_HAS_TRANSACTION
77  if (hwSPI) SPI.beginTransaction(spisettings);
78#endif
79  *rsport &= ~rspinmask;
80  *csport &= ~cspinmask;
81
82  //Serial.print("C ");
83  spiwrite(c);
84
85  *csport |= cspinmask;
86#ifdef SPI_HAS_TRANSACTION
87  if (hwSPI) SPI.endTransaction();
88#endif
89}
90
91
92void Adafruit_ST7735::writedata(uint8_t c) {
93#ifdef SPI_HAS_TRANSACTION
94  if (hwSPI) SPI.beginTransaction(spisettings);
95#endif
96  *rsport |=  rspinmask;
97  *csport &= ~cspinmask;
98   
99  //Serial.print("D ");
100  spiwrite(c);
101
102  *csport |= cspinmask;
103#ifdef SPI_HAS_TRANSACTION
104  if (hwSPI) SPI.endTransaction();
105#endif
106}
107
108
109// Rather than a bazillion writecommand() and writedata() calls, screen
110// initialization commands and arguments are organized in these tables
111// stored in PROGMEM.  The table may look bulky, but that's mostly the
112// formatting -- storage-wise this is hundreds of bytes more compact
113// than the equivalent code.  Companion function follows.
114#define DELAY 0x80
115PROGMEM const static unsigned char
116  Bcmd[] = {                  // Initialization commands for 7735B screens
117    18,                       // 18 commands in list:
118    ST7735_SWRESET,   DELAY,  //  1: Software reset, no args, w/delay
119      50,                     //     50 ms delay
120    ST7735_SLPOUT ,   DELAY,  //  2: Out of sleep mode, no args, w/delay
121      255,                    //     255 = 500 ms delay
122    ST7735_COLMOD , 1+DELAY,  //  3: Set color mode, 1 arg + delay:
123      0x05,                   //     16-bit color
124      10,                     //     10 ms delay
125    ST7735_FRMCTR1, 3+DELAY,  //  4: Frame rate control, 3 args + delay:
126      0x00,                   //     fastest refresh
127      0x06,                   //     6 lines front porch
128      0x03,                   //     3 lines back porch
129      10,                     //     10 ms delay
130    ST7735_MADCTL , 1      ,  //  5: Memory access ctrl (directions), 1 arg:
131      0x08,                   //     Row addr/col addr, bottom to top refresh
132    ST7735_DISSET5, 2      ,  //  6: Display settings #5, 2 args, no delay:
133      0x15,                   //     1 clk cycle nonoverlap, 2 cycle gate
134                              //     rise, 3 cycle osc equalize
135      0x02,                   //     Fix on VTL
136    ST7735_INVCTR , 1      ,  //  7: Display inversion control, 1 arg:
137      0x0,                    //     Line inversion
138    ST7735_PWCTR1 , 2+DELAY,  //  8: Power control, 2 args + delay:
139      0x02,                   //     GVDD = 4.7V
140      0x70,                   //     1.0uA
141      10,                     //     10 ms delay
142    ST7735_PWCTR2 , 1      ,  //  9: Power control, 1 arg, no delay:
143      0x05,                   //     VGH = 14.7V, VGL = -7.35V
144    ST7735_PWCTR3 , 2      ,  // 10: Power control, 2 args, no delay:
145      0x01,                   //     Opamp current small
146      0x02,                   //     Boost frequency
147    ST7735_VMCTR1 , 2+DELAY,  // 11: Power control, 2 args + delay:
148      0x3C,                   //     VCOMH = 4V
149      0x38,                   //     VCOML = -1.1V
150      10,                     //     10 ms delay
151    ST7735_PWCTR6 , 2      ,  // 12: Power control, 2 args, no delay:
152      0x11, 0x15,
153    ST7735_GMCTRP1,16      ,  // 13: Magical unicorn dust, 16 args, no delay:
154      0x09, 0x16, 0x09, 0x20, //     (seriously though, not sure what
155      0x21, 0x1B, 0x13, 0x19, //      these config values represent)
156      0x17, 0x15, 0x1E, 0x2B,
157      0x04, 0x05, 0x02, 0x0E,
158    ST7735_GMCTRN1,16+DELAY,  // 14: Sparkles and rainbows, 16 args + delay:
159      0x0B, 0x14, 0x08, 0x1E, //     (ditto)
160      0x22, 0x1D, 0x18, 0x1E,
161      0x1B, 0x1A, 0x24, 0x2B,
162      0x06, 0x06, 0x02, 0x0F,
163      10,                     //     10 ms delay
164    ST7735_CASET  , 4      ,  // 15: Column addr set, 4 args, no delay:
165      0x00, 0x02,             //     XSTART = 2
166      0x00, 0x81,             //     XEND = 129
167    ST7735_RASET  , 4      ,  // 16: Row addr set, 4 args, no delay:
168      0x00, 0x02,             //     XSTART = 1
169      0x00, 0x81,             //     XEND = 160
170    ST7735_NORON  ,   DELAY,  // 17: Normal display on, no args, w/delay
171      10,                     //     10 ms delay
172    ST7735_DISPON ,   DELAY,  // 18: Main screen turn on, no args, w/delay
173      255 },                  //     255 = 500 ms delay
174
175  Rcmd1[] = {                 // Init for 7735R, part 1 (red or green tab)
176    15,                       // 15 commands in list:
177    ST7735_SWRESET,   DELAY,  //  1: Software reset, 0 args, w/delay
178      150,                    //     150 ms delay
179    ST7735_SLPOUT ,   DELAY,  //  2: Out of sleep mode, 0 args, w/delay
180      255,                    //     500 ms delay
181    ST7735_FRMCTR1, 3      ,  //  3: Frame rate ctrl - normal mode, 3 args:
182      0x01, 0x2C, 0x2D,       //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
183    ST7735_FRMCTR2, 3      ,  //  4: Frame rate control - idle mode, 3 args:
184      0x01, 0x2C, 0x2D,       //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
185    ST7735_FRMCTR3, 6      ,  //  5: Frame rate ctrl - partial mode, 6 args:
186      0x01, 0x2C, 0x2D,       //     Dot inversion mode
187      0x01, 0x2C, 0x2D,       //     Line inversion mode
188    ST7735_INVCTR , 1      ,  //  6: Display inversion ctrl, 1 arg, no delay:
189      0x07,                   //     No inversion
190    ST7735_PWCTR1 , 3      ,  //  7: Power control, 3 args, no delay:
191      0xA2,
192      0x02,                   //     -4.6V
193      0x84,                   //     AUTO mode
194    ST7735_PWCTR2 , 1      ,  //  8: Power control, 1 arg, no delay:
195      0xC5,                   //     VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
196    ST7735_PWCTR3 , 2      ,  //  9: Power control, 2 args, no delay:
197      0x0A,                   //     Opamp current small
198      0x00,                   //     Boost frequency
199    ST7735_PWCTR4 , 2      ,  // 10: Power control, 2 args, no delay:
200      0x8A,                   //     BCLK/2, Opamp current small & Medium low
201      0x2A, 
202    ST7735_PWCTR5 , 2      ,  // 11: Power control, 2 args, no delay:
203      0x8A, 0xEE,
204    ST7735_VMCTR1 , 1      ,  // 12: Power control, 1 arg, no delay:
205      0x0E,
206    ST7735_INVOFF , 0      ,  // 13: Don't invert display, no args, no delay
207    ST7735_MADCTL , 1      ,  // 14: Memory access control (directions), 1 arg:
208      0xC8,                   //     row addr/col addr, bottom to top refresh
209    ST7735_COLMOD , 1      ,  // 15: set color mode, 1 arg, no delay:
210      0x05 },                 //     16-bit color
211
212  Rcmd2green[] = {            // Init for 7735R, part 2 (green tab only)
213    2,                        //  2 commands in list:
214    ST7735_CASET  , 4      ,  //  1: Column addr set, 4 args, no delay:
215      0x00, 0x02,             //     XSTART = 0
216      0x00, 0x7F+0x02,        //     XEND = 127
217    ST7735_RASET  , 4      ,  //  2: Row addr set, 4 args, no delay:
218      0x00, 0x01,             //     XSTART = 0
219      0x00, 0x9F+0x01 },      //     XEND = 159
220  Rcmd2red[] = {              // Init for 7735R, part 2 (red tab only)
221    2,                        //  2 commands in list:
222    ST7735_CASET  , 4      ,  //  1: Column addr set, 4 args, no delay:
223      0x00, 0x00,             //     XSTART = 0
224      0x00, 0x7F,             //     XEND = 127
225    ST7735_RASET  , 4      ,  //  2: Row addr set, 4 args, no delay:
226      0x00, 0x00,             //     XSTART = 0
227      0x00, 0x9F },           //     XEND = 159
228
229  Rcmd3[] = {                 // Init for 7735R, part 3 (red or green tab)
230    4,                        //  4 commands in list:
231    ST7735_GMCTRP1, 16      , //  1: Magical unicorn dust, 16 args, no delay:
232      0x02, 0x1c, 0x07, 0x12,
233      0x37, 0x32, 0x29, 0x2d,
234      0x29, 0x25, 0x2B, 0x39,
235      0x00, 0x01, 0x03, 0x10,
236    ST7735_GMCTRN1, 16      , //  2: Sparkles and rainbows, 16 args, no delay:
237      0x03, 0x1d, 0x07, 0x06,
238      0x2E, 0x2C, 0x29, 0x2D,
239      0x2E, 0x2E, 0x37, 0x3F,
240      0x00, 0x00, 0x02, 0x10,
241    ST7735_NORON  ,    DELAY, //  3: Normal display on, no args, w/delay
242      10,                     //     10 ms delay
243    ST7735_DISPON ,    DELAY, //  4: Main screen turn on, no args w/delay
244      100 },                  //     100 ms delay
245  Gcmd[] = {                  // Initialization commands for 7735B screens
246    19,                       // 18 commands in list:
247    ST7735_SWRESET,   DELAY,  //  1: Software reset, no args, w/delay
248      50,                     //     50 ms delay
249    ST7735_SLPOUT ,   DELAY,  //  2: Out of sleep mode, no args, w/delay
250      100,                    //     255 = 500 ms delay
251    0x26 , 1,                   // 3: Set default gamma
252      0x04,                     //     16-bit color
253    0xb1, 2,                    // 4: Frame Rate
254      0x0b,
255      0x14,
256    0xc0, 2,                    // 5: VRH1[4:0] & VC[2:0]
257      0x08,
258      0x00,
259    0xc1, 1,                    // 6: BT[2:0]
260      0x05,
261    0xc5, 2,                    // 7: VMH[6:0] & VML[6:0]
262      0x41,
263      0x30,
264    0xc7, 1,                    // 8: LCD Driving control
265      0xc1,
266    0xEC, 1,                    // 9: Set pumping color freq
267      0x1b,
268    0x3a , 1 + DELAY,           // 10: Set color format
269      0x55,                     //     16-bit color
270      100,
271    0x2a, 4,                    // 11: Set Column Address
272      0x00,
273      0x00,
274      0x00,
275      0x7f,
276    0x2b, 4,                    // 12: Set Page Address
277      0x00,
278      0x00,
279      0x00,
280      0x9f,
281    0x36, 1,                    // 12+1: Set Scanning Direction
282      0xc8,
283    0xb7, 1,                    // 14: Set Source Output Direciton
284      0x00,
285    0xf2, 1,                    // 15: Enable Gamma bit
286      0x00,
287    0xe0, 15 + DELAY,           // 16: magic
288      0x28, 0x24, 0x22, 0x31,
289      0x2b, 0x0e, 0x53, 0xa5,
290      0x42, 0x16, 0x18, 0x12,
291      0x1a, 0x14, 0x03,
292      50,
293    0xe1, 15 + DELAY,           // 17: more magic
294      0x17, 0x1b, 0x1d, 0x0e,
295      0x14, 0x11, 0x2c, 0xa5,
296      0x3d, 0x09, 0x27, 0x2d,
297      0x25, 0x2b, 0x3c, 
298      50, 
299    ST7735_NORON  ,   DELAY,  // 17: Normal display on, no args, w/delay
300      10,                     //     10 ms delay
301    ST7735_DISPON ,   DELAY,  // 18: Main screen turn on, no args, w/delay
302      255 };                  //     255 = 500 ms delay
303
304
305
306// Companion code to the above tables.  Reads and issues
307// a series of LCD commands stored in PROGMEM byte array.
308void Adafruit_ST7735::commandList(const uint8_t *addr) {
309
310  uint8_t  numCommands, numArgs;
311  uint16_t ms;
312
313  numCommands = pgm_read_byte(addr++);   // Number of commands to follow
314  while(numCommands--) {                 // For each command...
315    writecommand(pgm_read_byte(addr++)); //   Read, issue command
316    numArgs  = pgm_read_byte(addr++);    //   Number of args to follow
317    ms       = numArgs & DELAY;          //   If hibit set, delay follows args
318    numArgs &= ~DELAY;                   //   Mask out delay bit
319    while(numArgs--) {                   //   For each argument...
320      writedata(pgm_read_byte(addr++));  //     Read, issue argument
321    }
322
323    if(ms) {
324      ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
325      if(ms == 255) ms = 500;     // If 255, delay for 500 ms
326      delay(ms);
327    }
328  }
329}
330
331
332// Initialization code common to both 'B' and 'R' type displays
333void Adafruit_ST7735::commonInit(const uint8_t *cmdList) {
334
335  colstart  = rowstart = 0; // May be overridden in init func
336
337  pinMode(_rs, OUTPUT);
338  pinMode(_cs, OUTPUT);
339  csport    = portOutputRegister(digitalPinToPort(_cs));
340  cspinmask = digitalPinToBitMask(_cs);
341  rsport    = portOutputRegister(digitalPinToPort(_rs));
342  rspinmask = digitalPinToBitMask(_rs);
343
344  if(hwSPI) { // Using hardware SPI
345    SPI.begin();
346#ifdef SPI_HAS_TRANSACTION
347    spisettings = SPISettings(4000000L, MSBFIRST, SPI_MODE0);
348#else
349#if defined(ARDUINO_ARCH_SAM)
350    SPI.setClockDivider(24); // 4 MHz (half speed)
351#else
352    SPI.setClockDivider(SPI_CLOCK_DIV4); // 4 MHz (half speed)
353#endif
354    SPI.setBitOrder(MSBFIRST);
355    SPI.setDataMode(SPI_MODE0);
356#endif // SPI_HAS_TRANSACTION
357  } else {
358    pinMode(_sclk, OUTPUT);
359    pinMode(_sid , OUTPUT);
360    clkport     = portOutputRegister(digitalPinToPort(_sclk));
361    clkpinmask  = digitalPinToBitMask(_sclk);
362    dataport    = portOutputRegister(digitalPinToPort(_sid));
363    datapinmask = digitalPinToBitMask(_sid);
364    *clkport   &= ~clkpinmask;
365    *dataport  &= ~datapinmask;
366  }
367
368  // toggle RST low to reset; CS low so it'll listen to us
369  *csport &= ~cspinmask;
370  if (_rst) {
371    pinMode(_rst, OUTPUT);
372    digitalWrite(_rst, HIGH);
373    delay(500);
374    digitalWrite(_rst, LOW);
375    delay(500);
376    digitalWrite(_rst, HIGH);
377    delay(500);
378  }
379
380  if(cmdList) commandList(cmdList);
381}
382
383
384// Initialization for ST7735B screens
385void Adafruit_ST7735::initB(void) {
386  commonInit(Bcmd);
387}
388
389
390// Initialization for ST7735B screens
391void Adafruit_ST7735::initG(void) {
392  commonInit(Gcmd);
393}
394
395
396// Initialization for ST7735R screens (green or red tabs)
397void Adafruit_ST7735::initR(uint8_t options) {
398  commonInit(Rcmd1);
399  if(options == INITR_GREENTAB) {
400    commandList(Rcmd2green);
401    colstart = 2;
402    rowstart = 1;
403  } else {
404    // colstart, rowstart left at default '0' values
405    commandList(Rcmd2red);
406  }
407  commandList(Rcmd3);
408  tabcolor = options;
409}
410
411
412void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1,
413 uint8_t y1) {
414
415  writecommand(ST7735_CASET); // Column addr set
416  writedata(0x00);
417  writedata(x0+colstart);     // XSTART
418  writedata(0x00);
419  writedata(x1+colstart);     // XEND
420
421  writecommand(ST7735_RASET); // Row addr set
422  writedata(0x00);
423  writedata(y0+rowstart);     // YSTART
424  writedata(0x00);
425  writedata(y1+rowstart);     // YEND
426
427  writecommand(ST7735_RAMWR); // write to RAM
428}
429
430
431void Adafruit_ST7735::pushColor(uint16_t color) {
432#ifdef SPI_HAS_TRANSACTION
433  if (hwSPI) SPI.beginTransaction(spisettings);
434#endif
435  *rsport |=  rspinmask;
436  *csport &= ~cspinmask;
437
438  if (tabcolor == INITR_BLACKTAB)   color = swapcolor(color);
439  spiwrite(color >> 8);
440  spiwrite(color);
441
442  *csport |= cspinmask;
443#ifdef SPI_HAS_TRANSACTION
444  if (hwSPI) SPI.endTransaction();
445#endif
446}
447
448void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
449
450  if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
451
452  setAddrWindow(x,y,x+1,y+1);
453
454#ifdef SPI_HAS_TRANSACTION
455  if (hwSPI) SPI.beginTransaction(spisettings);
456#endif
457  *rsport |=  rspinmask;
458  *csport &= ~cspinmask;
459
460  if (tabcolor == INITR_BLACKTAB)   color = swapcolor(color);
461
462  spiwrite(color >> 8);
463  spiwrite(color);
464
465  *csport |= cspinmask;
466#ifdef SPI_HAS_TRANSACTION
467  if (hwSPI) SPI.endTransaction();
468#endif
469}
470
471
472void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h,
473 uint16_t color) {
474
475  // Rudimentary clipping
476  if((x >= _width) || (y >= _height)) return;
477  if((y+h-1) >= _height) h = _height-y;
478  setAddrWindow(x, y, x, y+h-1);
479
480  if (tabcolor == INITR_BLACKTAB)   color = swapcolor(color);
481
482  uint8_t hi = color >> 8, lo = color;
483#ifdef SPI_HAS_TRANSACTION
484  if (hwSPI) SPI.beginTransaction(spisettings);
485#endif
486  *rsport |=  rspinmask;
487  *csport &= ~cspinmask;
488  while (h--) {
489    spiwrite(hi);
490    spiwrite(lo);
491  }
492  *csport |= cspinmask;
493#ifdef SPI_HAS_TRANSACTION
494  if (hwSPI) SPI.endTransaction();
495#endif
496}
497
498
499void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w,
500  uint16_t color) {
501
502  // Rudimentary clipping
503  if((x >= _width) || (y >= _height)) return;
504  if((x+w-1) >= _width)  w = _width-x;
505  setAddrWindow(x, y, x+w-1, y);
506
507  if (tabcolor == INITR_BLACKTAB)   color = swapcolor(color);
508
509  uint8_t hi = color >> 8, lo = color;
510#ifdef SPI_HAS_TRANSACTION
511  if (hwSPI) SPI.beginTransaction(spisettings);
512#endif
513  *rsport |=  rspinmask;
514  *csport &= ~cspinmask;
515  while (w--) {
516    spiwrite(hi);
517    spiwrite(lo);
518  }
519  *csport |= cspinmask;
520#ifdef SPI_HAS_TRANSACTION
521  if (hwSPI) SPI.endTransaction();
522#endif
523}
524
525
526
527void Adafruit_ST7735::fillScreen(uint16_t color) {
528  fillRect(0, 0,  _width, _height, color);
529}
530
531
532
533// fill a rectangle
534void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
535  uint16_t color) {
536
537  // rudimentary clipping (drawChar w/big text requires this)
538  if((x >= _width) || (y >= _height)) return;
539  if((x + w - 1) >= _width)  w = _width  - x;
540  if((y + h - 1) >= _height) h = _height - y;
541
542  if (tabcolor == INITR_BLACKTAB)   color = swapcolor(color);
543
544  setAddrWindow(x, y, x+w-1, y+h-1);
545
546  uint8_t hi = color >> 8, lo = color;
547#ifdef SPI_HAS_TRANSACTION
548  if (hwSPI) SPI.beginTransaction(spisettings);
549#endif
550  *rsport |=  rspinmask;
551  *csport &= ~cspinmask;
552  for(y=h; y>0; y--) {
553    for(x=w; x>0; x--) {
554      spiwrite(hi);
555      spiwrite(lo);
556    }
557  }
558
559  *csport |= cspinmask;
560#ifdef SPI_HAS_TRANSACTION
561  if (hwSPI) SPI.endTransaction();
562#endif
563}
564
565
566#define MADCTL_MY  0x80
567#define MADCTL_MX  0x40
568#define MADCTL_MV  0x20
569#define MADCTL_ML  0x10
570#define MADCTL_RGB 0x08
571#define MADCTL_MH  0x04
572
573void Adafruit_ST7735::setRotation(uint8_t m) {
574
575  writecommand(ST7735_MADCTL);
576  rotation = m % 4; // can't be higher than 3
577  switch (rotation) {
578   case 0:
579    writedata(MADCTL_MX | MADCTL_MY | MADCTL_RGB);
580    _width  = ST7735_TFTWIDTH;
581    _height = ST7735_TFTHEIGHT;
582    break;
583   case 1:
584    writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB);
585    _width  = ST7735_TFTHEIGHT;
586    _height = ST7735_TFTWIDTH;
587    break;
588   case 2:
589    writedata(MADCTL_RGB);
590    _width  = ST7735_TFTWIDTH;
591    _height = ST7735_TFTHEIGHT;
592    break;
593   case 3:
594    writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB);
595    _width  = ST7735_TFTHEIGHT;
596    _height = ST7735_TFTWIDTH;
597    break;
598  }
599}
600
601
602void Adafruit_ST7735::invertDisplay(boolean i) {
603  writecommand(i ? ST7735_INVON : ST7735_INVOFF);
604}
605
606
607////////// stuff not actively being used, but kept for posterity
608/*
609
610 uint8_t Adafruit_ST7735::spiread(void) {
611 uint8_t r = 0;
612 if (_sid > 0) {
613 r = shiftIn(_sid, _sclk, MSBFIRST);
614 } else {
615 //SID_DDR &= ~_BV(SID);
616 //int8_t i;
617 //for (i=7; i>=0; i--) {
618 //  SCLK_PORT &= ~_BV(SCLK);
619 //  r <<= 1;
620 //  r |= (SID_PIN >> SID) & 0x1;
621 //  SCLK_PORT |= _BV(SCLK);
622 //}
623 //SID_DDR |= _BV(SID);
624 
625 }
626 return r;
627 }
628 
629 
630 void Adafruit_ST7735::dummyclock(void) {
631 
632 if (_sid > 0) {
633 digitalWrite(_sclk, LOW);
634 digitalWrite(_sclk, HIGH);
635 } else {
636 // SCLK_PORT &= ~_BV(SCLK);
637 //SCLK_PORT |= _BV(SCLK);
638 }
639 }
640 uint8_t Adafruit_ST7735::readdata(void) {
641 *portOutputRegister(rsport) |= rspin;
642 
643 *portOutputRegister(csport) &= ~ cspin;
644 
645 uint8_t r = spiread();
646 
647 *portOutputRegister(csport) |= cspin;
648 
649 return r;
650 
651 }
652 
653 uint8_t Adafruit_ST7735::readcommand8(uint8_t c) {
654 digitalWrite(_rs, LOW);
655 
656 *portOutputRegister(csport) &= ~ cspin;
657 
658 spiwrite(c);
659 
660 digitalWrite(_rs, HIGH);
661 pinMode(_sid, INPUT); // input!
662 digitalWrite(_sid, LOW); // low
663 spiread();
664 uint8_t r = spiread();
665 
666 
667 *portOutputRegister(csport) |= cspin;
668 
669 
670 pinMode(_sid, OUTPUT); // back to output
671 return r;
672 }
673 
674 
675 uint16_t Adafruit_ST7735::readcommand16(uint8_t c) {
676 digitalWrite(_rs, LOW);
677 if (_cs)
678 digitalWrite(_cs, LOW);
679 
680 spiwrite(c);
681 pinMode(_sid, INPUT); // input!
682 uint16_t r = spiread();
683 r <<= 8;
684 r |= spiread();
685 if (_cs)
686 digitalWrite(_cs, HIGH);
687 
688 pinMode(_sid, OUTPUT); // back to output
689 return r;
690 }
691 
692 uint32_t Adafruit_ST7735::readcommand32(uint8_t c) {
693 digitalWrite(_rs, LOW);
694 if (_cs)
695 digitalWrite(_cs, LOW);
696 spiwrite(c);
697 pinMode(_sid, INPUT); // input!
698 
699 dummyclock();
700 dummyclock();
701 
702 uint32_t r = spiread();
703 r <<= 8;
704 r |= spiread();
705 r <<= 8;
706 r |= spiread();
707 r <<= 8;
708 r |= spiread();
709 if (_cs)
710 digitalWrite(_cs, HIGH);
711 
712 pinMode(_sid, OUTPUT); // back to output
713 return r;
714 }
715 
716 */
Note: See TracBrowser for help on using the repository browser.