Adafruit RA8875 Arduino Library
Adafruit_RA8875.h
Go to the documentation of this file.
1 /**************************************************************************/
20 /**************************************************************************/
21 
22 #if ARDUINO >= 100
23 #include "Arduino.h"
24 #include "Print.h"
25 #else
26 #include "WProgram.h"
27 #endif
28 
29 #ifdef __AVR
30 #include <avr/pgmspace.h>
31 #elif defined(ESP8266)
32 #include <pgmspace.h>
33 #endif
34 
36 #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega1280__) || \
37  defined(__AVR_ATmega2560__) || defined(ESP8266) || defined(ESP32) || \
38  defined(DOXYGEN)
39 #define EEPROM_SUPPORTED
41 #endif
43 
45 #include <Adafruit_GFX.h>
46 
47 #ifndef _ADAFRUIT_RA8875_H
48 #define _ADAFRUIT_RA8875_H
49 
50 // Touchscreen Calibration and EEPROM Storage Defines
51 #define CFG_EEPROM_TOUCHSCREEN_CAL_AN 0
52 #define CFG_EEPROM_TOUCHSCREEN_CAL_BN 4
53 #define CFG_EEPROM_TOUCHSCREEN_CAL_CN 8
54 #define CFG_EEPROM_TOUCHSCREEN_CAL_DN 12
55 #define CFG_EEPROM_TOUCHSCREEN_CAL_EN 16
56 #define CFG_EEPROM_TOUCHSCREEN_CAL_FN 20
57 #define CFG_EEPROM_TOUCHSCREEN_CAL_DIVIDER 24
58 #define CFG_EEPROM_TOUCHSCREEN_CALIBRATED 28
59 
60 #if defined(EEPROM_SUPPORTED)
62 #if defined(__AVR_ATmega328P__)
63 #define EEPROMSIZE 1024
65 #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
67 #define EEPROMSIZE 4096
69 #else
71 #define EEPROMSIZE 512
73 #endif
75 #endif
76 // Sizes!
78 
79 /**************************************************************************/
83 /**************************************************************************/
89 };
90 
91 /**************************************************************************/
101 /**************************************************************************/
102 typedef struct Point {
103  int32_t x;
104  int32_t y;
105 } tsPoint_t;
106 
107 /**************************************************************************/
127 /**************************************************************************/
128 typedef struct // Matrix
129 {
130  int32_t An, Bn, Cn, Dn, En, Fn, Divider;
131 } tsMatrix_t;
132 
133 /**************************************************************************/
138 /**************************************************************************/
139 class Adafruit_RA8875 : public Adafruit_GFX {
140 public:
141  Adafruit_RA8875(uint8_t cs, uint8_t rst);
142 
143  boolean begin(enum RA8875sizes s);
144  void softReset(void);
145  void displayOn(boolean on);
146  void sleep(boolean sleep);
147 
148  /* Text functions */
149  void textMode(void);
150  void textSetCursor(uint16_t x, uint16_t y);
151  void textColor(uint16_t foreColor, uint16_t bgColor);
152  void textTransparent(uint16_t foreColor);
153  void textEnlarge(uint8_t scale);
154  void textWrite(const char *buffer, uint16_t len = 0);
155  void cursorBlink(uint8_t rate);
156 
157  /* Graphics functions */
158  void graphicsMode(void);
159  void setXY(uint16_t x, uint16_t y);
160  void pushPixels(uint32_t num, uint16_t p);
161  void fillRect(void);
162 
163  /* Adafruit_GFX functions */
164  void drawPixel(int16_t x, int16_t y, uint16_t color);
165  void drawPixels(uint16_t *p, uint32_t count, int16_t x, int16_t y);
166  void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
167  void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
168 
169  /* HW accelerated wrapper functions (override Adafruit_GFX prototypes) */
170  void fillScreen(uint16_t color);
171  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
172  void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
173  void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
174  void drawCircle(int16_t x, int16_t y, int16_t r, uint16_t color);
175  void fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color);
176  void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
177  int16_t y2, uint16_t color);
178  void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
179  int16_t y2, uint16_t color);
180  void drawEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis,
181  int16_t shortAxis, uint16_t color);
182  void fillEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis,
183  int16_t shortAxis, uint16_t color);
184  void drawCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis,
185  int16_t shortAxis, uint8_t curvePart, uint16_t color);
186  void fillCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis,
187  int16_t shortAxis, uint8_t curvePart, uint16_t color);
188  void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
189  uint16_t color);
190  void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
191  uint16_t color);
192 
193  /* Scroll */
194  void setScrollWindow(int16_t x, int16_t y, int16_t w, int16_t h,
195  uint8_t mode);
196  void scrollX(int16_t dist);
197  void scrollY(int16_t dist);
198 
199  /* Backlight */
200  void GPIOX(boolean on);
201  void PWM1config(boolean on, uint8_t clock);
202  void PWM2config(boolean on, uint8_t clock);
203  void PWM1out(uint8_t p);
204  void PWM2out(uint8_t p);
205 
206  /* Touch screen */
207  void touchEnable(boolean on);
208  boolean touched(void);
209  boolean touchRead(uint16_t *x, uint16_t *y);
210 
212 #if defined(EEPROM_SUPPORTED)
213  /* Touch screen calibration persistence*/
215  uint32_t eepromReadS32(int location);
216  void eepromWriteS32(int location, int32_t value);
217  bool readCalibration(int location, tsMatrix_t *matrixPtr);
218  void writeCalibration(int location, tsMatrix_t *matrixPtr);
220 #endif
221 
223  /* Low level access */
224  void writeReg(uint8_t reg, uint8_t val);
225  uint8_t readReg(uint8_t reg);
226  void writeData(uint8_t d);
227  uint8_t readData(void);
228  void writeCommand(uint8_t d);
229  uint8_t readStatus(void);
230  boolean waitPoll(uint8_t r, uint8_t f);
231  uint16_t width(void);
232  uint16_t height(void);
233  void setRotation(int8_t rotation);
234  int8_t getRotation(void);
235 
236 #ifndef USE_ADAFRUIT_GFX_FONTS
237  /**************************************************************************/
245  /**************************************************************************/
246  virtual size_t write(uint8_t b) {
247  textWrite((const char *)&b, 1);
248  return 1;
249  }
250 
251  /**************************************************************************/
260  /**************************************************************************/
261  virtual size_t write(const uint8_t *buffer, size_t size) {
262  textWrite((const char *)buffer, size);
263  return size;
264  }
265 #endif
266 
267 private:
268  void PLLinit(void);
269  void initialize(void);
270 
271  /* GFX Helper Functions */
272  void circleHelper(int16_t x, int16_t y, int16_t r, uint16_t color,
273  bool filled);
274  void rectHelper(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color,
275  bool filled);
276  void triangleHelper(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
277  int16_t x2, int16_t y2, uint16_t color, bool filled);
278  void ellipseHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis,
279  int16_t shortAxis, uint16_t color, bool filled);
280  void curveHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis,
281  int16_t shortAxis, uint8_t curvePart, uint16_t color,
282  bool filled);
283  void roundRectHelper(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
284  uint16_t color, bool filled);
285 
286  /* Rotation Functions */
287  int16_t applyRotationX(int16_t x);
288  int16_t applyRotationY(int16_t y);
289 
290  void swap(int16_t &x, int16_t &y) {
291  int16_t temp = x;
292  x = y;
293  y = temp;
294  }
295 
296  uint8_t _cs, _rst;
297  uint16_t _width, _height;
298  uint8_t _textScale;
299  uint8_t _rotation;
300  uint8_t _voffset;
301  enum RA8875sizes _size;
302 };
303 
304 // Colors (RGB565)
305 #define RA8875_BLACK 0x0000
306 #define RA8875_BLUE 0x001F
307 #define RA8875_RED 0xF800
308 #define RA8875_GREEN 0x07E0
309 #define RA8875_CYAN 0x07FF
310 #define RA8875_MAGENTA 0xF81F
311 #define RA8875_YELLOW 0xFFE0
312 #define RA8875_WHITE 0xFFFF
313 
314 // Command/Data pins for SPI
315 #define RA8875_DATAWRITE 0x00
316 #define RA8875_DATAREAD 0x40
317 #define RA8875_CMDWRITE 0x80
318 #define RA8875_CMDREAD 0xC0
319 
320 // Registers & bits
321 #define RA8875_PWRR 0x01
322 #define RA8875_PWRR_DISPON 0x80
323 #define RA8875_PWRR_DISPOFF 0x00
324 #define RA8875_PWRR_SLEEP 0x02
325 #define RA8875_PWRR_NORMAL 0x00
326 #define RA8875_PWRR_SOFTRESET 0x01
327 
328 #define RA8875_MRWC 0x02
329 
330 #define RA8875_GPIOX 0xC7
331 
332 #define RA8875_PLLC1 0x88
333 #define RA8875_PLLC1_PLLDIV2 0x80
334 #define RA8875_PLLC1_PLLDIV1 0x00
335 
336 #define RA8875_PLLC2 0x89
337 #define RA8875_PLLC2_DIV1 0x00
338 #define RA8875_PLLC2_DIV2 0x01
339 #define RA8875_PLLC2_DIV4 0x02
340 #define RA8875_PLLC2_DIV8 0x03
341 #define RA8875_PLLC2_DIV16 0x04
342 #define RA8875_PLLC2_DIV32 0x05
343 #define RA8875_PLLC2_DIV64 0x06
344 #define RA8875_PLLC2_DIV128 0x07
345 
346 #define RA8875_SYSR 0x10
347 #define RA8875_SYSR_8BPP 0x00
348 #define RA8875_SYSR_16BPP 0x0C
349 #define RA8875_SYSR_MCU8 0x00
350 #define RA8875_SYSR_MCU16 0x03
351 
352 #define RA8875_PCSR 0x04
353 #define RA8875_PCSR_PDATR 0x00
354 #define RA8875_PCSR_PDATL 0x80
355 #define RA8875_PCSR_CLK 0x00
356 #define RA8875_PCSR_2CLK 0x01
357 #define RA8875_PCSR_4CLK 0x02
358 #define RA8875_PCSR_8CLK 0x03
359 
360 #define RA8875_HDWR 0x14
361 
362 #define RA8875_HNDFTR 0x15
363 #define RA8875_HNDFTR_DE_HIGH 0x00
364 #define RA8875_HNDFTR_DE_LOW 0x80
365 
366 #define RA8875_HNDR 0x16
367 #define RA8875_HSTR 0x17
368 #define RA8875_HPWR 0x18
369 #define RA8875_HPWR_LOW 0x00
370 #define RA8875_HPWR_HIGH 0x80
371 
372 #define RA8875_VDHR0 0x19
373 #define RA8875_VDHR1 0x1A
374 #define RA8875_VNDR0 0x1B
375 #define RA8875_VNDR1 0x1C
376 #define RA8875_VSTR0 0x1D
377 #define RA8875_VSTR1 0x1E
378 #define RA8875_VPWR 0x1F
379 #define RA8875_VPWR_LOW 0x00
380 #define RA8875_VPWR_HIGH 0x80
381 
382 #define RA8875_HSAW0 0x30
383 #define RA8875_HSAW1 0x31
384 #define RA8875_VSAW0 0x32
385 #define RA8875_VSAW1 0x33
386 
387 #define RA8875_HEAW0 0x34
388 #define RA8875_HEAW1 0x35
389 #define RA8875_VEAW0 0x36
390 #define RA8875_VEAW1 0x37
391 
392 #define RA8875_MCLR 0x8E
393 #define RA8875_MCLR_START 0x80
394 #define RA8875_MCLR_STOP 0x00
395 #define RA8875_MCLR_READSTATUS 0x80
396 #define RA8875_MCLR_FULL 0x00
397 #define RA8875_MCLR_ACTIVE 0x40
398 
399 #define RA8875_DCR 0x90
400 #define RA8875_DCR_LINESQUTRI_START 0x80
401 #define RA8875_DCR_LINESQUTRI_STOP 0x00
402 #define RA8875_DCR_LINESQUTRI_STATUS 0x80
403 #define RA8875_DCR_CIRCLE_START 0x40
404 #define RA8875_DCR_CIRCLE_STATUS 0x40
405 #define RA8875_DCR_CIRCLE_STOP 0x00
406 #define RA8875_DCR_FILL 0x20
407 #define RA8875_DCR_NOFILL 0x00
408 #define RA8875_DCR_DRAWLINE 0x00
409 #define RA8875_DCR_DRAWTRIANGLE 0x01
410 #define RA8875_DCR_DRAWSQUARE 0x10
411 
412 #define RA8875_ELLIPSE 0xA0
413 #define RA8875_ELLIPSE_STATUS 0x80
414 
415 #define RA8875_MWCR0 0x40
416 #define RA8875_MWCR0_GFXMODE 0x00
417 #define RA8875_MWCR0_TXTMODE 0x80
418 #define RA8875_MWCR0_CURSOR 0x40
419 #define RA8875_MWCR0_BLINK 0x20
420 
421 #define RA8875_MWCR0_DIRMASK 0x0C
422 #define RA8875_MWCR0_LRTD 0x00
423 #define RA8875_MWCR0_RLTD 0x04
424 #define RA8875_MWCR0_TDLR 0x08
425 #define RA8875_MWCR0_DTLR 0x0C
426 
427 #define RA8875_BTCR 0x44
428 #define RA8875_CURH0 0x46
429 #define RA8875_CURH1 0x47
430 #define RA8875_CURV0 0x48
431 #define RA8875_CURV1 0x49
432 
433 #define RA8875_P1CR 0x8A
434 #define RA8875_P1CR_ENABLE 0x80
435 #define RA8875_P1CR_DISABLE 0x00
436 #define RA8875_P1CR_CLKOUT 0x10
437 #define RA8875_P1CR_PWMOUT 0x00
438 
439 #define RA8875_P1DCR 0x8B
440 
441 #define RA8875_P2CR 0x8C
442 #define RA8875_P2CR_ENABLE 0x80
443 #define RA8875_P2CR_DISABLE 0x00
444 #define RA8875_P2CR_CLKOUT 0x10
445 #define RA8875_P2CR_PWMOUT 0x00
446 
447 #define RA8875_P2DCR 0x8D
448 
449 #define RA8875_PWM_CLK_DIV1 0x00
450 #define RA8875_PWM_CLK_DIV2 0x01
451 #define RA8875_PWM_CLK_DIV4 0x02
452 #define RA8875_PWM_CLK_DIV8 0x03
453 #define RA8875_PWM_CLK_DIV16 0x04
454 #define RA8875_PWM_CLK_DIV32 0x05
455 #define RA8875_PWM_CLK_DIV64 0x06
456 #define RA8875_PWM_CLK_DIV128 0x07
457 #define RA8875_PWM_CLK_DIV256 0x08
458 #define RA8875_PWM_CLK_DIV512 0x09
459 #define RA8875_PWM_CLK_DIV1024 0x0A
460 #define RA8875_PWM_CLK_DIV2048 0x0B
461 #define RA8875_PWM_CLK_DIV4096 0x0C
462 #define RA8875_PWM_CLK_DIV8192 0x0D
463 #define RA8875_PWM_CLK_DIV16384 0x0E
464 #define RA8875_PWM_CLK_DIV32768 0x0F
465 
466 #define RA8875_TPCR0 0x70
467 #define RA8875_TPCR0_ENABLE 0x80
468 #define RA8875_TPCR0_DISABLE 0x00
469 #define RA8875_TPCR0_WAIT_512CLK 0x00
470 #define RA8875_TPCR0_WAIT_1024CLK 0x10
471 #define RA8875_TPCR0_WAIT_2048CLK 0x20
472 #define RA8875_TPCR0_WAIT_4096CLK 0x30
473 #define RA8875_TPCR0_WAIT_8192CLK 0x40
474 #define RA8875_TPCR0_WAIT_16384CLK 0x50
475 #define RA8875_TPCR0_WAIT_32768CLK 0x60
476 #define RA8875_TPCR0_WAIT_65536CLK 0x70
477 #define RA8875_TPCR0_WAKEENABLE 0x08
478 #define RA8875_TPCR0_WAKEDISABLE 0x00
479 #define RA8875_TPCR0_ADCCLK_DIV1 0x00
480 #define RA8875_TPCR0_ADCCLK_DIV2 0x01
481 #define RA8875_TPCR0_ADCCLK_DIV4 0x02
482 #define RA8875_TPCR0_ADCCLK_DIV8 0x03
483 #define RA8875_TPCR0_ADCCLK_DIV16 0x04
484 #define RA8875_TPCR0_ADCCLK_DIV32 0x05
485 #define RA8875_TPCR0_ADCCLK_DIV64 0x06
486 #define RA8875_TPCR0_ADCCLK_DIV128 0x07
487 
488 #define RA8875_TPCR1 0x71
489 #define RA8875_TPCR1_AUTO 0x00
490 #define RA8875_TPCR1_MANUAL 0x40
491 #define RA8875_TPCR1_VREFINT 0x00
492 #define RA8875_TPCR1_VREFEXT 0x20
493 #define RA8875_TPCR1_DEBOUNCE 0x04
494 #define RA8875_TPCR1_NODEBOUNCE 0x00
495 #define RA8875_TPCR1_IDLE 0x00
496 #define RA8875_TPCR1_WAIT 0x01
497 #define RA8875_TPCR1_LATCHX 0x02
498 #define RA8875_TPCR1_LATCHY 0x03
499 
500 #define RA8875_TPXH 0x72
501 #define RA8875_TPYH 0x73
502 #define RA8875_TPXYL 0x74
503 
504 #define RA8875_INTC1 0xF0
505 #define RA8875_INTC1_KEY 0x10
506 #define RA8875_INTC1_DMA 0x08
507 #define RA8875_INTC1_TP 0x04
508 #define RA8875_INTC1_BTE 0x02
509 
510 #define RA8875_INTC2 0xF1
511 #define RA8875_INTC2_KEY 0x10
512 #define RA8875_INTC2_DMA 0x08
513 #define RA8875_INTC2_TP 0x04
514 #define RA8875_INTC2_BTE 0x02
515 
516 #define RA8875_SCROLL_BOTH 0x00
517 #define RA8875_SCROLL_LAYER1 0x40
518 #define RA8875_SCROLL_LAYER2 0x80
519 #define RA8875_SCROLL_BUFFER 0xC0
520 
521 #endif
Definition: Adafruit_RA8875.h:128
Definition: Adafruit_RA8875.h:85
int32_t x
Definition: Adafruit_RA8875.h:103
struct Point tsPoint_t
Nameless struct variable!
Definition: Adafruit_RA8875.h:102
Class that stores state and functions for interacting with the RA8875 display controller.
Definition: Adafruit_RA8875.h:139
Definition: Adafruit_RA8875.h:86
virtual size_t write(const uint8_t *buffer, size_t size)
Definition: Adafruit_RA8875.h:261
int32_t Fn
Definition: Adafruit_RA8875.h:130
virtual size_t write(uint8_t b)
Definition: Adafruit_RA8875.h:246
int32_t y
Definition: Adafruit_RA8875.h:104
Definition: Adafruit_RA8875.h:87
Definition: Adafruit_RA8875.h:88
RA8875sizes
Definition: Adafruit_RA8875.h:84