Fork of https://os.mbed.com/users/sebastiken/code/Adafruit_RA8875/ ; Adapted for use with K64F and in the process of adding more functions.

Dependencies:   mbed BNO055

Committer:
BugraTufan
Date:
Tue May 28 23:22:51 2019 +0000
Revision:
4:51bfa333200c
Parent:
3:4a3e169866a2
deneme1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sebastiken 0:66c1aa3d198e 1 /**************************************************************************/
sebastiken 0:66c1aa3d198e 2 /*!
sebastiken 0:66c1aa3d198e 3 @file Adafruit_RA8875.cpp
sebastiken 0:66c1aa3d198e 4 @author Limor Friend/Ladyada, K.Townsend/KTOWN for Adafruit Industries
sebastiken 0:66c1aa3d198e 5 @license BSD license, all text above and below must be included in
sebastiken 0:66c1aa3d198e 6 any redistribution
sebastiken 0:66c1aa3d198e 7
sebastiken 0:66c1aa3d198e 8 This is the library for the Adafruit RA8875 Driver board for TFT displays
sebastiken 0:66c1aa3d198e 9 ---------------> http://www.adafruit.com/products/1590
sebastiken 0:66c1aa3d198e 10 The RA8875 is a TFT driver for up to 800x480 dotclock'd displays
sebastiken 0:66c1aa3d198e 11 It is tested to work with displays in the Adafruit shop. Other displays
sebastiken 0:66c1aa3d198e 12 may need timing adjustments and are not guanteed to work.
el16jh 3:4a3e169866a2 13
sebastiken 0:66c1aa3d198e 14 Adafruit invests time and resources providing this open
sebastiken 0:66c1aa3d198e 15 source code, please support Adafruit and open-source hardware
sebastiken 0:66c1aa3d198e 16 by purchasing products from Adafruit!
el16jh 3:4a3e169866a2 17
sebastiken 0:66c1aa3d198e 18 Written by Limor Fried/Ladyada for Adafruit Industries.
sebastiken 0:66c1aa3d198e 19 BSD license, check license.txt for more information.
sebastiken 0:66c1aa3d198e 20 All text above must be included in any redistribution.
sebastiken 0:66c1aa3d198e 21
sebastiken 0:66c1aa3d198e 22 @section HISTORY
el16jh 3:4a3e169866a2 23
sebastiken 0:66c1aa3d198e 24 v1.0 - First release
sebastiken 0:66c1aa3d198e 25
sebastiken 0:66c1aa3d198e 26 Code migrated to Mbed.
sebastiken 0:66c1aa3d198e 27 */
sebastiken 0:66c1aa3d198e 28 /**************************************************************************/
sebastiken 0:66c1aa3d198e 29 #include "RA8875.h"
sebastiken 0:66c1aa3d198e 30
sebastiken 0:66c1aa3d198e 31 #if defined (ARDUINO_ARCH_ARC32)
el16jh 3:4a3e169866a2 32 uint32_t spi_speed = 12000000;
sebastiken 0:66c1aa3d198e 33 #else
el16jh 3:4a3e169866a2 34 uint32_t spi_speed = 4000000;
sebastiken 0:66c1aa3d198e 35 #endif
sebastiken 0:66c1aa3d198e 36
sebastiken 0:66c1aa3d198e 37 // NOTE: MBed use transactions inside SPI class itself
sebastiken 0:66c1aa3d198e 38 //// If the SPI library has transaction support, these functions
sebastiken 0:66c1aa3d198e 39 //// establish settings and protect from interference from other
sebastiken 0:66c1aa3d198e 40 //// libraries. Otherwise, they simply do nothing.
sebastiken 0:66c1aa3d198e 41 //#ifdef SPI_HAS_TRANSACTION
sebastiken 0:66c1aa3d198e 42 // static inline void spi_begin(void) __attribute__((always_inline));
sebastiken 0:66c1aa3d198e 43 // static inline void spi_begin(void) {
sebastiken 0:66c1aa3d198e 44 // // max speed!
sebastiken 0:66c1aa3d198e 45 // SPI.beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
sebastiken 0:66c1aa3d198e 46 // }
sebastiken 0:66c1aa3d198e 47 // static inline void spi_end(void) __attribute__((always_inline));
sebastiken 0:66c1aa3d198e 48 // static inline void spi_end(void) {
sebastiken 0:66c1aa3d198e 49 // SPI.endTransaction();
sebastiken 0:66c1aa3d198e 50 // }
sebastiken 0:66c1aa3d198e 51 //#else
sebastiken 0:66c1aa3d198e 52 // #define spi_begin()
sebastiken 0:66c1aa3d198e 53 // #define spi_end()
sebastiken 0:66c1aa3d198e 54 //#endif
sebastiken 0:66c1aa3d198e 55
sebastiken 0:66c1aa3d198e 56
sebastiken 0:66c1aa3d198e 57 /**************************************************************************/
sebastiken 0:66c1aa3d198e 58 /*!
sebastiken 0:66c1aa3d198e 59 Constructor for a new RA8875 instance
el16jh 3:4a3e169866a2 60
sebastiken 0:66c1aa3d198e 61 @args CS[in] Location of the SPI chip select pin
sebastiken 0:66c1aa3d198e 62 @args RST[in] Location of the reset pin
sebastiken 0:66c1aa3d198e 63 */
sebastiken 0:66c1aa3d198e 64 /**************************************************************************/
sebastiken 0:66c1aa3d198e 65 Adafruit_RA8875::Adafruit_RA8875(PinName MOSI, PinName MISO, PinName SCLK,
el16jh 3:4a3e169866a2 66 PinName CS, PinName RST)
sebastiken 0:66c1aa3d198e 67 : //Adafruit_GFX(800, 480)
el16jh 3:4a3e169866a2 68 _cs(CS)
sebastiken 0:66c1aa3d198e 69 , _rst(RST)
sebastiken 0:66c1aa3d198e 70 , spi(MOSI, MISO, SCLK)
sebastiken 0:66c1aa3d198e 71 {
sebastiken 0:66c1aa3d198e 72 }
sebastiken 0:66c1aa3d198e 73
sebastiken 0:66c1aa3d198e 74 /**************************************************************************/
sebastiken 0:66c1aa3d198e 75 /*!
sebastiken 0:66c1aa3d198e 76 Initialises the LCD driver and any HW required by the display
el16jh 3:4a3e169866a2 77
sebastiken 0:66c1aa3d198e 78 @args s[in] The display size, which can be either:
sebastiken 0:66c1aa3d198e 79 'RA8875_480x272' (4.3" displays) r
sebastiken 0:66c1aa3d198e 80 'RA8875_800x480' (5" and 7" displays)
sebastiken 0:66c1aa3d198e 81 */
sebastiken 0:66c1aa3d198e 82 /**************************************************************************/
el16jh 3:4a3e169866a2 83 bool Adafruit_RA8875::begin(enum RA8875sizes s)
el16jh 3:4a3e169866a2 84 {
el16jh 3:4a3e169866a2 85 _size = s;
sebastiken 0:66c1aa3d198e 86
sebastiken 0:66c1aa3d198e 87 if (_size == RA8875_480x272) {
el16jh 3:4a3e169866a2 88 _width = 480;
el16jh 3:4a3e169866a2 89 _height = 272;
el16jh 3:4a3e169866a2 90 } else if (_size == RA8875_800x480) {
el16jh 3:4a3e169866a2 91 _width = 800;
el16jh 3:4a3e169866a2 92 _height = 480;
el16jh 3:4a3e169866a2 93 } else {
el16jh 3:4a3e169866a2 94 return false;
sebastiken 0:66c1aa3d198e 95 }
el16jh 3:4a3e169866a2 96
sebastiken 0:66c1aa3d198e 97 _cs = 1;
sebastiken 0:66c1aa3d198e 98
sebastiken 0:66c1aa3d198e 99 _rst = 0;
sebastiken 0:66c1aa3d198e 100 wait_ms(100);
sebastiken 0:66c1aa3d198e 101 _rst = 1;
sebastiken 0:66c1aa3d198e 102 wait_ms(100);
sebastiken 0:66c1aa3d198e 103
sebastiken 0:66c1aa3d198e 104 // Setting format
sebastiken 0:66c1aa3d198e 105 spi.format(8, 0);
sebastiken 0:66c1aa3d198e 106
sebastiken 0:66c1aa3d198e 107 // Configure SPI frequency
sebastiken 2:040a687cea93 108 spi_speed = 1000000;
sebastiken 0:66c1aa3d198e 109 spi.frequency(spi_speed);
sebastiken 0:66c1aa3d198e 110
sebastiken 0:66c1aa3d198e 111 uint8_t x = readReg(0);
sebastiken 0:66c1aa3d198e 112 if (x != 0x75) {
sebastiken 0:66c1aa3d198e 113 return false;
sebastiken 0:66c1aa3d198e 114 }
sebastiken 0:66c1aa3d198e 115
sebastiken 0:66c1aa3d198e 116
sebastiken 0:66c1aa3d198e 117
el16jh 3:4a3e169866a2 118 initialize();
sebastiken 0:66c1aa3d198e 119
sebastiken 0:66c1aa3d198e 120 #ifdef SPI_HAS_TRANSACTION
el16jh 3:4a3e169866a2 121 #if defined (ARDUINO_ARCH_ARC32)
el16jh 3:4a3e169866a2 122 spi_speed = 12000000L;
el16jh 3:4a3e169866a2 123 #else
el16jh 3:4a3e169866a2 124 spi_speed = 4000000L;
el16jh 3:4a3e169866a2 125 #endif
sebastiken 0:66c1aa3d198e 126 #else
el16jh 3:4a3e169866a2 127 #ifdef __AVR__
el16jh 3:4a3e169866a2 128 SPI.setClockDivider(SPI_CLOCK_DIV4);
sebastiken 0:66c1aa3d198e 129 #endif
el16jh 3:4a3e169866a2 130 #endif
el16jh 3:4a3e169866a2 131
el16jh 3:4a3e169866a2 132 return true;
sebastiken 0:66c1aa3d198e 133 }
sebastiken 0:66c1aa3d198e 134
sebastiken 0:66c1aa3d198e 135 /************************* Initialization *********************************/
sebastiken 0:66c1aa3d198e 136
sebastiken 0:66c1aa3d198e 137 /**************************************************************************/
sebastiken 0:66c1aa3d198e 138 /*!
sebastiken 0:66c1aa3d198e 139 Performs a SW-based reset of the RA8875
sebastiken 0:66c1aa3d198e 140 */
sebastiken 0:66c1aa3d198e 141 /**************************************************************************/
el16jh 3:4a3e169866a2 142 void Adafruit_RA8875::softReset(void)
el16jh 3:4a3e169866a2 143 {
el16jh 3:4a3e169866a2 144 writeCommand(RA8875_PWRR);
el16jh 3:4a3e169866a2 145 writeData(RA8875_PWRR_SOFTRESET);
el16jh 3:4a3e169866a2 146 writeData(RA8875_PWRR_NORMAL);
el16jh 3:4a3e169866a2 147 wait_ms(1);
sebastiken 0:66c1aa3d198e 148 }
sebastiken 0:66c1aa3d198e 149
sebastiken 0:66c1aa3d198e 150 /**************************************************************************/
sebastiken 0:66c1aa3d198e 151 /*!
sebastiken 0:66c1aa3d198e 152 Initialise the PLL
sebastiken 0:66c1aa3d198e 153 */
sebastiken 0:66c1aa3d198e 154 /**************************************************************************/
el16jh 3:4a3e169866a2 155 void Adafruit_RA8875::PLLinit(void)
el16jh 3:4a3e169866a2 156 {
el16jh 3:4a3e169866a2 157 if (_size == RA8875_480x272) {
el16jh 3:4a3e169866a2 158 writeReg(RA8875_PLLC1, RA8875_PLLC1_PLLDIV1 + 10);
el16jh 3:4a3e169866a2 159 wait_ms(1);
el16jh 3:4a3e169866a2 160 writeReg(RA8875_PLLC2, RA8875_PLLC2_DIV4);
el16jh 3:4a3e169866a2 161 wait_ms(1);
el16jh 3:4a3e169866a2 162 } else { /* (_size == RA8875_800x480) */
el16jh 3:4a3e169866a2 163 writeReg(RA8875_PLLC1, RA8875_PLLC1_PLLDIV1 + 10);
el16jh 3:4a3e169866a2 164 wait_ms(1);
el16jh 3:4a3e169866a2 165 writeReg(RA8875_PLLC2, RA8875_PLLC2_DIV4);
el16jh 3:4a3e169866a2 166 wait_ms(1);
el16jh 3:4a3e169866a2 167 }
sebastiken 0:66c1aa3d198e 168 }
sebastiken 0:66c1aa3d198e 169
sebastiken 0:66c1aa3d198e 170 /**************************************************************************/
sebastiken 0:66c1aa3d198e 171 /*!
sebastiken 0:66c1aa3d198e 172 Initialises the driver IC (clock setup, etc.)
sebastiken 0:66c1aa3d198e 173 */
sebastiken 0:66c1aa3d198e 174 /**************************************************************************/
el16jh 3:4a3e169866a2 175 void Adafruit_RA8875::initialize(void)
el16jh 3:4a3e169866a2 176 {
el16jh 3:4a3e169866a2 177 PLLinit();
el16jh 3:4a3e169866a2 178 writeReg(RA8875_SYSR, RA8875_SYSR_16BPP | RA8875_SYSR_MCU8);
el16jh 3:4a3e169866a2 179
el16jh 3:4a3e169866a2 180 /* Timing values */
el16jh 3:4a3e169866a2 181 uint8_t pixclk;
el16jh 3:4a3e169866a2 182 uint8_t hsync_start;
el16jh 3:4a3e169866a2 183 uint8_t hsync_pw;
el16jh 3:4a3e169866a2 184 uint8_t hsync_finetune;
el16jh 3:4a3e169866a2 185 uint8_t hsync_nondisp;
el16jh 3:4a3e169866a2 186 uint8_t vsync_pw;
el16jh 3:4a3e169866a2 187 uint16_t vsync_nondisp;
el16jh 3:4a3e169866a2 188 uint16_t vsync_start;
sebastiken 0:66c1aa3d198e 189
el16jh 3:4a3e169866a2 190 /* Set the correct values for the display being used */
el16jh 3:4a3e169866a2 191 if (_size == RA8875_480x272) {
el16jh 3:4a3e169866a2 192 pixclk = RA8875_PCSR_PDATL | RA8875_PCSR_4CLK;
el16jh 3:4a3e169866a2 193 hsync_nondisp = 10;
el16jh 3:4a3e169866a2 194 hsync_start = 8;
el16jh 3:4a3e169866a2 195 hsync_pw = 48;
el16jh 3:4a3e169866a2 196 hsync_finetune = 0;
el16jh 3:4a3e169866a2 197 vsync_nondisp = 3;
el16jh 3:4a3e169866a2 198 vsync_start = 8;
el16jh 3:4a3e169866a2 199 vsync_pw = 10;
el16jh 3:4a3e169866a2 200 } else { // (_size == RA8875_800x480)
el16jh 3:4a3e169866a2 201 pixclk = RA8875_PCSR_PDATL | RA8875_PCSR_2CLK;
el16jh 3:4a3e169866a2 202 hsync_nondisp = 26;
el16jh 3:4a3e169866a2 203 hsync_start = 32;
el16jh 3:4a3e169866a2 204 hsync_pw = 96;
el16jh 3:4a3e169866a2 205 hsync_finetune = 0;
el16jh 3:4a3e169866a2 206 vsync_nondisp = 32;
el16jh 3:4a3e169866a2 207 vsync_start = 23;
el16jh 3:4a3e169866a2 208 vsync_pw = 2;
el16jh 3:4a3e169866a2 209 }
sebastiken 0:66c1aa3d198e 210
el16jh 3:4a3e169866a2 211 writeReg(RA8875_PCSR, pixclk);
el16jh 3:4a3e169866a2 212 wait_ms(1);
el16jh 3:4a3e169866a2 213
el16jh 3:4a3e169866a2 214 /* Horizontal settings registers */
el16jh 3:4a3e169866a2 215 writeReg(RA8875_HDWR, (_width / 8) - 1); // H width: (HDWR + 1) * 8 = 480
el16jh 3:4a3e169866a2 216 writeReg(RA8875_HNDFTR, RA8875_HNDFTR_DE_HIGH + hsync_finetune);
el16jh 3:4a3e169866a2 217 writeReg(RA8875_HNDR, (hsync_nondisp - hsync_finetune - 2)/8); // H non-display: HNDR * 8 + HNDFTR + 2 = 10
el16jh 3:4a3e169866a2 218 writeReg(RA8875_HSTR, hsync_start/8 - 1); // Hsync start: (HSTR + 1)*8
el16jh 3:4a3e169866a2 219 writeReg(RA8875_HPWR, RA8875_HPWR_LOW + (hsync_pw/8 - 1)); // HSync pulse width = (HPWR+1) * 8
sebastiken 0:66c1aa3d198e 220
el16jh 3:4a3e169866a2 221 /* Vertical settings registers */
el16jh 3:4a3e169866a2 222 writeReg(RA8875_VDHR0, (uint16_t)(_height - 1) & 0xFF);
el16jh 3:4a3e169866a2 223 writeReg(RA8875_VDHR1, (uint16_t)(_height - 1) >> 8);
el16jh 3:4a3e169866a2 224 writeReg(RA8875_VNDR0, vsync_nondisp-1); // V non-display period = VNDR + 1
el16jh 3:4a3e169866a2 225 writeReg(RA8875_VNDR1, vsync_nondisp >> 8);
el16jh 3:4a3e169866a2 226 writeReg(RA8875_VSTR0, vsync_start-1); // Vsync start position = VSTR + 1
el16jh 3:4a3e169866a2 227 writeReg(RA8875_VSTR1, vsync_start >> 8);
el16jh 3:4a3e169866a2 228 writeReg(RA8875_VPWR, RA8875_VPWR_LOW + vsync_pw - 1); // Vsync pulse width = VPWR + 1
el16jh 3:4a3e169866a2 229
el16jh 3:4a3e169866a2 230 /* Set active window X */
el16jh 3:4a3e169866a2 231 writeReg(RA8875_HSAW0, 0); // horizontal start point
el16jh 3:4a3e169866a2 232 writeReg(RA8875_HSAW1, 0);
el16jh 3:4a3e169866a2 233 writeReg(RA8875_HEAW0, (uint16_t)(_width - 1) & 0xFF); // horizontal end point
el16jh 3:4a3e169866a2 234 writeReg(RA8875_HEAW1, (uint16_t)(_width - 1) >> 8);
el16jh 3:4a3e169866a2 235
el16jh 3:4a3e169866a2 236 /* Set active window Y */
el16jh 3:4a3e169866a2 237 writeReg(RA8875_VSAW0, 0); // vertical start point
el16jh 3:4a3e169866a2 238 writeReg(RA8875_VSAW1, 0);
el16jh 3:4a3e169866a2 239 writeReg(RA8875_VEAW0, (uint16_t)(_height - 1) & 0xFF); // horizontal end point
el16jh 3:4a3e169866a2 240 writeReg(RA8875_VEAW1, (uint16_t)(_height - 1) >> 8);
el16jh 3:4a3e169866a2 241
el16jh 3:4a3e169866a2 242 /* ToDo: Setup touch panel? */
el16jh 3:4a3e169866a2 243
el16jh 3:4a3e169866a2 244 /* Clear the entire window */
el16jh 3:4a3e169866a2 245 writeReg(RA8875_MCLR, RA8875_MCLR_START | RA8875_MCLR_FULL);
el16jh 3:4a3e169866a2 246 wait_ms(500);
sebastiken 0:66c1aa3d198e 247 }
sebastiken 0:66c1aa3d198e 248
sebastiken 0:66c1aa3d198e 249 /**************************************************************************/
sebastiken 0:66c1aa3d198e 250 /*!
sebastiken 0:66c1aa3d198e 251 Returns the display width in pixels
el16jh 3:4a3e169866a2 252
sebastiken 0:66c1aa3d198e 253 @returns The 1-based display width in pixels
sebastiken 0:66c1aa3d198e 254 */
sebastiken 0:66c1aa3d198e 255 /**************************************************************************/
el16jh 3:4a3e169866a2 256 uint16_t Adafruit_RA8875::width(void)
el16jh 3:4a3e169866a2 257 {
el16jh 3:4a3e169866a2 258 return _width;
el16jh 3:4a3e169866a2 259 }
sebastiken 0:66c1aa3d198e 260
sebastiken 0:66c1aa3d198e 261 /**************************************************************************/
sebastiken 0:66c1aa3d198e 262 /*!
sebastiken 0:66c1aa3d198e 263 Returns the display height in pixels
sebastiken 0:66c1aa3d198e 264
sebastiken 0:66c1aa3d198e 265 @returns The 1-based display height in pixels
sebastiken 0:66c1aa3d198e 266 */
sebastiken 0:66c1aa3d198e 267 /**************************************************************************/
el16jh 3:4a3e169866a2 268 uint16_t Adafruit_RA8875::height(void)
el16jh 3:4a3e169866a2 269 {
el16jh 3:4a3e169866a2 270 return _height;
el16jh 3:4a3e169866a2 271 }
sebastiken 0:66c1aa3d198e 272
sebastiken 0:66c1aa3d198e 273 /************************* Text Mode ***********************************/
sebastiken 0:66c1aa3d198e 274
sebastiken 0:66c1aa3d198e 275 /**************************************************************************/
sebastiken 0:66c1aa3d198e 276 /*!
sebastiken 0:66c1aa3d198e 277 Sets the display in text mode (as opposed to graphics mode)
sebastiken 0:66c1aa3d198e 278 */
sebastiken 0:66c1aa3d198e 279 /**************************************************************************/
el16jh 3:4a3e169866a2 280 void Adafruit_RA8875::textMode(void)
sebastiken 0:66c1aa3d198e 281 {
el16jh 3:4a3e169866a2 282 /* Set text mode */
el16jh 3:4a3e169866a2 283 writeCommand(RA8875_MWCR0);
el16jh 3:4a3e169866a2 284 uint8_t temp = readData();
el16jh 3:4a3e169866a2 285 temp |= RA8875_MWCR0_TXTMODE; // Set bit 7
el16jh 3:4a3e169866a2 286 writeData(temp);
el16jh 3:4a3e169866a2 287
el16jh 3:4a3e169866a2 288 /* Select the internal (ROM) font */
el16jh 3:4a3e169866a2 289 writeCommand(0x21);
el16jh 3:4a3e169866a2 290 temp = readData();
el16jh 3:4a3e169866a2 291 temp &= ~((1<<7) | (1<<5)); // Clear bits 7 and 5
el16jh 3:4a3e169866a2 292 writeData(temp);
sebastiken 0:66c1aa3d198e 293 }
sebastiken 0:66c1aa3d198e 294
sebastiken 0:66c1aa3d198e 295 /**************************************************************************/
sebastiken 0:66c1aa3d198e 296 /*!
sebastiken 0:66c1aa3d198e 297 Sets the display in text mode (as opposed to graphics mode)
el16jh 3:4a3e169866a2 298
sebastiken 0:66c1aa3d198e 299 @args x[in] The x position of the cursor (in pixels, 0..1023)
sebastiken 0:66c1aa3d198e 300 @args y[in] The y position of the cursor (in pixels, 0..511)
sebastiken 0:66c1aa3d198e 301 */
sebastiken 0:66c1aa3d198e 302 /**************************************************************************/
el16jh 3:4a3e169866a2 303 void Adafruit_RA8875::textSetCursor(uint16_t x, uint16_t y)
sebastiken 0:66c1aa3d198e 304 {
el16jh 3:4a3e169866a2 305 /* Set cursor location */
el16jh 3:4a3e169866a2 306 writeCommand(0x2A);
el16jh 3:4a3e169866a2 307 writeData(x & 0xFF);
el16jh 3:4a3e169866a2 308 writeCommand(0x2B);
el16jh 3:4a3e169866a2 309 writeData(x >> 8);
el16jh 3:4a3e169866a2 310 writeCommand(0x2C);
el16jh 3:4a3e169866a2 311 writeData(y & 0xFF);
el16jh 3:4a3e169866a2 312 writeCommand(0x2D);
el16jh 3:4a3e169866a2 313 writeData(y >> 8);
sebastiken 0:66c1aa3d198e 314 }
sebastiken 0:66c1aa3d198e 315
sebastiken 0:66c1aa3d198e 316 /**************************************************************************/
sebastiken 0:66c1aa3d198e 317 /*!
sebastiken 0:66c1aa3d198e 318 Sets the fore and background color when rendering text
el16jh 3:4a3e169866a2 319
sebastiken 0:66c1aa3d198e 320 @args foreColor[in] The RGB565 color to use when rendering the text
sebastiken 0:66c1aa3d198e 321 @args bgColor[in] The RGB565 colot to use for the background
sebastiken 0:66c1aa3d198e 322 */
sebastiken 0:66c1aa3d198e 323 /**************************************************************************/
sebastiken 0:66c1aa3d198e 324 void Adafruit_RA8875::textColor(uint16_t foreColor, uint16_t bgColor)
sebastiken 0:66c1aa3d198e 325 {
el16jh 3:4a3e169866a2 326 if (foreColor == 0) {
el16jh 3:4a3e169866a2 327 // Sets the ForeColor to white //
el16jh 3:4a3e169866a2 328 writeCommand(0x63);
el16jh 3:4a3e169866a2 329 writeData((WHITE & 0xf800) >> 11);
el16jh 3:4a3e169866a2 330 writeCommand(0x64);
el16jh 3:4a3e169866a2 331 writeData((WHITE & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 332 writeCommand(0x65);
el16jh 3:4a3e169866a2 333 writeData((WHITE & 0x001f));
el16jh 3:4a3e169866a2 334 } else {
el16jh 3:4a3e169866a2 335 /* Set Fore Color */
el16jh 3:4a3e169866a2 336 writeCommand(0x63);
el16jh 3:4a3e169866a2 337 writeData((foreColor & 0xf800) >> 11);
el16jh 3:4a3e169866a2 338 writeCommand(0x64);
el16jh 3:4a3e169866a2 339 writeData((foreColor & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 340 writeCommand(0x65);
el16jh 3:4a3e169866a2 341 writeData((foreColor & 0x001f));
el16jh 3:4a3e169866a2 342 }
el16jh 3:4a3e169866a2 343
el16jh 3:4a3e169866a2 344 if (bgColor == 0) {
el16jh 3:4a3e169866a2 345 /* Set Background Color to black */
el16jh 3:4a3e169866a2 346 writeCommand(0x60);
el16jh 3:4a3e169866a2 347 writeData((BLACK & 0xf800) >> 11);
el16jh 3:4a3e169866a2 348 writeCommand(0x61);
el16jh 3:4a3e169866a2 349 writeData((BLACK & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 350 writeCommand(0x62);
el16jh 3:4a3e169866a2 351 writeData((BLACK & 0x001f));
el16jh 3:4a3e169866a2 352 } else {
el16jh 3:4a3e169866a2 353 /* Set Background Color */
el16jh 3:4a3e169866a2 354 writeCommand(0x60);
el16jh 3:4a3e169866a2 355 writeData((bgColor & 0xf800) >> 11);
el16jh 3:4a3e169866a2 356 writeCommand(0x61);
el16jh 3:4a3e169866a2 357 writeData((bgColor & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 358 writeCommand(0x62);
el16jh 3:4a3e169866a2 359 writeData((bgColor & 0x001f));
el16jh 3:4a3e169866a2 360 }
el16jh 3:4a3e169866a2 361
el16jh 3:4a3e169866a2 362
el16jh 3:4a3e169866a2 363 /* Clear transparency flag */
el16jh 3:4a3e169866a2 364 writeCommand(0x22);
el16jh 3:4a3e169866a2 365 uint8_t temp = readData();
el16jh 3:4a3e169866a2 366 temp &= ~(1<<6); // Clear bit 6
el16jh 3:4a3e169866a2 367 writeData(temp);
sebastiken 0:66c1aa3d198e 368 }
sebastiken 0:66c1aa3d198e 369
sebastiken 0:66c1aa3d198e 370 /**************************************************************************/
sebastiken 0:66c1aa3d198e 371 /*!
sebastiken 0:66c1aa3d198e 372 Sets the fore color when rendering text with a transparent bg
el16jh 3:4a3e169866a2 373
sebastiken 0:66c1aa3d198e 374 @args foreColor[in] The RGB565 color to use when rendering the text
sebastiken 0:66c1aa3d198e 375 */
sebastiken 0:66c1aa3d198e 376 /**************************************************************************/
sebastiken 0:66c1aa3d198e 377 void Adafruit_RA8875::textTransparent(uint16_t foreColor)
sebastiken 0:66c1aa3d198e 378 {
el16jh 3:4a3e169866a2 379 /* Set Fore Color */
el16jh 3:4a3e169866a2 380 writeCommand(0x63);
el16jh 3:4a3e169866a2 381 writeData((foreColor & 0xf800) >> 11);
el16jh 3:4a3e169866a2 382 writeCommand(0x64);
el16jh 3:4a3e169866a2 383 writeData((foreColor & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 384 writeCommand(0x65);
el16jh 3:4a3e169866a2 385 writeData((foreColor & 0x001f));
sebastiken 0:66c1aa3d198e 386
el16jh 3:4a3e169866a2 387 /* Set transparency flag */
el16jh 3:4a3e169866a2 388 writeCommand(0x22);
el16jh 3:4a3e169866a2 389 uint8_t temp = readData();
el16jh 3:4a3e169866a2 390 temp |= (1<<6); // Set bit 6
el16jh 3:4a3e169866a2 391 writeData(temp);
sebastiken 0:66c1aa3d198e 392 }
sebastiken 2:040a687cea93 393
el16jh 3:4a3e169866a2 394 /**************************************************************************/
el16jh 3:4a3e169866a2 395 /*!
el16jh 3:4a3e169866a2 396 Sets the text enlarge settings, using one of the following values:
el16jh 3:4a3e169866a2 397
el16jh 3:4a3e169866a2 398 0 = 1x zoom
el16jh 3:4a3e169866a2 399 1 = 2x zoom
el16jh 3:4a3e169866a2 400 2 = 3x zoom
el16jh 3:4a3e169866a2 401 3 = 4x zoom
el16jh 3:4a3e169866a2 402
el16jh 3:4a3e169866a2 403 @args scale[in] The zoom factor (0..3 for 1-4x zoom)
el16jh 3:4a3e169866a2 404 */
el16jh 3:4a3e169866a2 405 /**************************************************************************/
el16jh 3:4a3e169866a2 406 void Adafruit_RA8875::textEnlarge(uint8_t scale) {
el16jh 3:4a3e169866a2 407 if (scale > 3) scale = 3;
el16jh 3:4a3e169866a2 408
el16jh 3:4a3e169866a2 409 /* Set font size flags */
el16jh 3:4a3e169866a2 410 writeCommand(0x22);
el16jh 3:4a3e169866a2 411 uint8_t temp = readData();
el16jh 3:4a3e169866a2 412 temp &= ~(0xF); // Clears bits 0..3
el16jh 3:4a3e169866a2 413 temp |= scale << 2;
el16jh 3:4a3e169866a2 414 temp |= scale;
el16jh 3:4a3e169866a2 415 writeData(temp);
el16jh 3:4a3e169866a2 416
el16jh 3:4a3e169866a2 417 _textScale = scale;
el16jh 3:4a3e169866a2 418 }
el16jh 3:4a3e169866a2 419
el16jh 3:4a3e169866a2 420 /**************************************************************************/
el16jh 3:4a3e169866a2 421 /*!
el16jh 3:4a3e169866a2 422 Renders some text on the screen when in text mode
el16jh 3:4a3e169866a2 423
el16jh 3:4a3e169866a2 424 @args buffer[in] The buffer containing the characters to render
el16jh 3:4a3e169866a2 425 @args len[in] The size of the buffer in bytes
el16jh 3:4a3e169866a2 426 */
el16jh 3:4a3e169866a2 427 /**************************************************************************/
el16jh 3:4a3e169866a2 428 void Adafruit_RA8875::textWrite(const char* buffer, uint16_t len) {
el16jh 3:4a3e169866a2 429 if (len == 0) len = strlen(buffer);
el16jh 3:4a3e169866a2 430 writeCommand(RA8875_MRWC);
el16jh 3:4a3e169866a2 431 for (uint16_t i=0; i<len; i++) {
el16jh 3:4a3e169866a2 432 writeData(buffer[i]);
el16jh 3:4a3e169866a2 433 #if defined(__AVR__)
el16jh 3:4a3e169866a2 434 if (_textScale > 1) wait_ms(1);
el16jh 3:4a3e169866a2 435 #elif defined(__arm__)
el16jh 3:4a3e169866a2 436 // This wait_ms is needed with textEnlarge(1) because
el16jh 3:4a3e169866a2 437 // Teensy 3.X is much faster than Arduino Uno
el16jh 3:4a3e169866a2 438 if (_textScale > 0) wait_ms(1);
el16jh 3:4a3e169866a2 439 #endif
el16jh 3:4a3e169866a2 440 }
el16jh 3:4a3e169866a2 441 }
sebastiken 0:66c1aa3d198e 442
el16jh 3:4a3e169866a2 443 void Adafruit_RA8875::textWritePro(uint16_t x, uint16_t y, uint16_t foreColor, uint16_t bgColor, const char* buffer, uint16_t len) {
el16jh 3:4a3e169866a2 444 textMode();
el16jh 3:4a3e169866a2 445 textSetCursor(x,y);
el16jh 3:4a3e169866a2 446 textColor(foreColor, bgColor);
el16jh 3:4a3e169866a2 447 textWrite(buffer, len);
el16jh 3:4a3e169866a2 448 }
el16jh 3:4a3e169866a2 449
el16jh 3:4a3e169866a2 450
el16jh 3:4a3e169866a2 451 /************************* Graphics ***********************************/
el16jh 3:4a3e169866a2 452
el16jh 3:4a3e169866a2 453 /**************************************************************************/
el16jh 3:4a3e169866a2 454 /*!
el16jh 3:4a3e169866a2 455 Sets the display in graphics mode (as opposed to text mode)
el16jh 3:4a3e169866a2 456 */
el16jh 3:4a3e169866a2 457 /**************************************************************************/
el16jh 3:4a3e169866a2 458 void Adafruit_RA8875::graphicsMode(void) {
el16jh 3:4a3e169866a2 459 writeCommand(RA8875_MWCR0);
el16jh 3:4a3e169866a2 460 uint8_t temp = readData();
el16jh 3:4a3e169866a2 461 temp &= ~RA8875_MWCR0_TXTMODE; // bit #7
el16jh 3:4a3e169866a2 462 writeData(temp);
el16jh 3:4a3e169866a2 463 }
el16jh 3:4a3e169866a2 464
el16jh 3:4a3e169866a2 465 /**************************************************************************/
el16jh 3:4a3e169866a2 466 /*!
el16jh 3:4a3e169866a2 467 Waits for screen to finish by polling the status!
el16jh 3:4a3e169866a2 468 */
el16jh 3:4a3e169866a2 469 /**************************************************************************/
el16jh 3:4a3e169866a2 470 bool Adafruit_RA8875::waitPoll(uint8_t regname, uint8_t waitflag) {
el16jh 3:4a3e169866a2 471 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 472 while (1) {
el16jh 3:4a3e169866a2 473 uint8_t temp = readReg(regname);
el16jh 3:4a3e169866a2 474 if (!(temp & waitflag))
el16jh 3:4a3e169866a2 475 return true;
el16jh 3:4a3e169866a2 476 }
el16jh 3:4a3e169866a2 477 //return false; // MEMEFIX: yeah i know, unreached! - add timeout?
el16jh 3:4a3e169866a2 478 }
el16jh 3:4a3e169866a2 479
el16jh 3:4a3e169866a2 480
el16jh 3:4a3e169866a2 481 /**************************************************************************/
el16jh 3:4a3e169866a2 482 /*!
el16jh 3:4a3e169866a2 483 Sets the current X/Y position on the display before drawing
el16jh 3:4a3e169866a2 484
el16jh 3:4a3e169866a2 485 @args x[in] The 0-based x location
el16jh 3:4a3e169866a2 486 @args y[in] The 0-base y location
el16jh 3:4a3e169866a2 487 */
el16jh 3:4a3e169866a2 488 /**************************************************************************/
el16jh 3:4a3e169866a2 489 void Adafruit_RA8875::setXY(uint16_t x, uint16_t y) {
el16jh 3:4a3e169866a2 490 writeReg(RA8875_CURH0, x);
el16jh 3:4a3e169866a2 491 writeReg(RA8875_CURH1, x >> 8);
el16jh 3:4a3e169866a2 492 writeReg(RA8875_CURV0, y);
el16jh 3:4a3e169866a2 493 writeReg(RA8875_CURV1, y >> 8);
el16jh 3:4a3e169866a2 494 }
el16jh 3:4a3e169866a2 495
el16jh 3:4a3e169866a2 496 /**************************************************************************/
el16jh 3:4a3e169866a2 497 /*!
el16jh 3:4a3e169866a2 498 HW accelerated function to push a chunk of raw pixel data
sebastiken 0:66c1aa3d198e 499
el16jh 3:4a3e169866a2 500 @args num[in] The number of pixels to push
el16jh 3:4a3e169866a2 501 @args p[in] The pixel color to use
el16jh 3:4a3e169866a2 502 */
el16jh 3:4a3e169866a2 503 /**************************************************************************/
el16jh 3:4a3e169866a2 504 void Adafruit_RA8875::pushPixels(uint32_t num, uint16_t p) {
el16jh 3:4a3e169866a2 505 _cs = 0;
el16jh 3:4a3e169866a2 506
el16jh 3:4a3e169866a2 507 spi.write(RA8875_DATAWRITE);
el16jh 3:4a3e169866a2 508 while (num--) {
el16jh 3:4a3e169866a2 509 spi.write(p >> 8);
el16jh 3:4a3e169866a2 510 spi.write(p);
el16jh 3:4a3e169866a2 511 }
el16jh 3:4a3e169866a2 512 _cs = 1;
el16jh 3:4a3e169866a2 513 }
el16jh 3:4a3e169866a2 514
el16jh 3:4a3e169866a2 515 /**************************************************************************/
el16jh 3:4a3e169866a2 516 /*!
el16jh 3:4a3e169866a2 517
el16jh 3:4a3e169866a2 518 */
el16jh 3:4a3e169866a2 519 /**************************************************************************/
el16jh 3:4a3e169866a2 520 void Adafruit_RA8875::fillRect(void) {
el16jh 3:4a3e169866a2 521 writeCommand(RA8875_DCR);
el16jh 3:4a3e169866a2 522 writeData(RA8875_DCR_LINESQUTRI_STOP | RA8875_DCR_DRAWSQUARE);
el16jh 3:4a3e169866a2 523 writeData(RA8875_DCR_LINESQUTRI_START | RA8875_DCR_FILL | RA8875_DCR_DRAWSQUARE);
el16jh 3:4a3e169866a2 524 }
el16jh 3:4a3e169866a2 525
el16jh 3:4a3e169866a2 526 /**************************************************************************/
el16jh 3:4a3e169866a2 527 /*!
el16jh 3:4a3e169866a2 528 Draws a single pixel at the specified location
el16jh 3:4a3e169866a2 529
el16jh 3:4a3e169866a2 530 @args x[in] The 0-based x location
el16jh 3:4a3e169866a2 531 @args y[in] The 0-base y location
el16jh 3:4a3e169866a2 532 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 533 */
el16jh 3:4a3e169866a2 534 /**************************************************************************/
el16jh 3:4a3e169866a2 535 void Adafruit_RA8875::drawPixel(int16_t x, int16_t y, uint16_t color) {
el16jh 3:4a3e169866a2 536 writeReg(RA8875_CURH0, x);
el16jh 3:4a3e169866a2 537 writeReg(RA8875_CURH1, x >> 8);
el16jh 3:4a3e169866a2 538 writeReg(RA8875_CURV0, y);
el16jh 3:4a3e169866a2 539 writeReg(RA8875_CURV1, y >> 8);
el16jh 3:4a3e169866a2 540 writeCommand(RA8875_MRWC);
el16jh 3:4a3e169866a2 541 _cs = 0;
el16jh 3:4a3e169866a2 542 spi.write(RA8875_DATAWRITE);
el16jh 3:4a3e169866a2 543 spi.write(color >> 8);
el16jh 3:4a3e169866a2 544 spi.write(color);
el16jh 3:4a3e169866a2 545 _cs = 1;
el16jh 3:4a3e169866a2 546 }
el16jh 3:4a3e169866a2 547
el16jh 3:4a3e169866a2 548 /**************************************************************************/
el16jh 3:4a3e169866a2 549 /*!
el16jh 3:4a3e169866a2 550 Draws a HW accelerated line on the display
sebastiken 0:66c1aa3d198e 551
el16jh 3:4a3e169866a2 552 @args x0[in] The 0-based starting x location
el16jh 3:4a3e169866a2 553 @args y0[in] The 0-base starting y location
el16jh 3:4a3e169866a2 554 @args x1[in] The 0-based ending x location
el16jh 3:4a3e169866a2 555 @args y1[in] The 0-base ending y location
el16jh 3:4a3e169866a2 556 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 557 */
el16jh 3:4a3e169866a2 558 /**************************************************************************/
el16jh 3:4a3e169866a2 559 void Adafruit_RA8875::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) {
el16jh 3:4a3e169866a2 560 /* Set X */
el16jh 3:4a3e169866a2 561 writeCommand(0x91);
el16jh 3:4a3e169866a2 562 writeData(x0);
el16jh 3:4a3e169866a2 563 writeCommand(0x92);
el16jh 3:4a3e169866a2 564 writeData(x0 >> 8);
el16jh 3:4a3e169866a2 565
el16jh 3:4a3e169866a2 566 /* Set Y */
el16jh 3:4a3e169866a2 567 writeCommand(0x93);
el16jh 3:4a3e169866a2 568 writeData(y0);
el16jh 3:4a3e169866a2 569 writeCommand(0x94);
el16jh 3:4a3e169866a2 570 writeData(y0 >> 8);
el16jh 3:4a3e169866a2 571
el16jh 3:4a3e169866a2 572 /* Set X1 */
el16jh 3:4a3e169866a2 573 writeCommand(0x95);
el16jh 3:4a3e169866a2 574 writeData(x1);
el16jh 3:4a3e169866a2 575 writeCommand(0x96);
el16jh 3:4a3e169866a2 576 writeData((x1) >> 8);
el16jh 3:4a3e169866a2 577
el16jh 3:4a3e169866a2 578 /* Set Y1 */
el16jh 3:4a3e169866a2 579 writeCommand(0x97);
el16jh 3:4a3e169866a2 580 writeData(y1);
el16jh 3:4a3e169866a2 581 writeCommand(0x98);
el16jh 3:4a3e169866a2 582 writeData((y1) >> 8);
sebastiken 0:66c1aa3d198e 583
el16jh 3:4a3e169866a2 584 /* Set Color */
el16jh 3:4a3e169866a2 585 writeCommand(0x63);
el16jh 3:4a3e169866a2 586 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 587 writeCommand(0x64);
el16jh 3:4a3e169866a2 588 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 589 writeCommand(0x65);
el16jh 3:4a3e169866a2 590 writeData((color & 0x001f));
el16jh 3:4a3e169866a2 591
el16jh 3:4a3e169866a2 592 /* Draw! */
el16jh 3:4a3e169866a2 593 writeCommand(RA8875_DCR);
el16jh 3:4a3e169866a2 594 writeData(0x80);
el16jh 3:4a3e169866a2 595
el16jh 3:4a3e169866a2 596 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 597 waitPoll(RA8875_DCR, RA8875_DCR_LINESQUTRI_STATUS);
el16jh 3:4a3e169866a2 598 }
sebastiken 0:66c1aa3d198e 599
el16jh 3:4a3e169866a2 600 /**************************************************************************/
el16jh 3:4a3e169866a2 601 /*!
el16jh 3:4a3e169866a2 602
el16jh 3:4a3e169866a2 603 */
el16jh 3:4a3e169866a2 604 /**************************************************************************/
el16jh 3:4a3e169866a2 605 void Adafruit_RA8875::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
el16jh 3:4a3e169866a2 606 drawLine(x, y, x, y+h, color);
el16jh 3:4a3e169866a2 607 }
el16jh 3:4a3e169866a2 608
el16jh 3:4a3e169866a2 609 /**************************************************************************/
el16jh 3:4a3e169866a2 610 /*!
el16jh 3:4a3e169866a2 611
el16jh 3:4a3e169866a2 612 */
el16jh 3:4a3e169866a2 613 /**************************************************************************/
el16jh 3:4a3e169866a2 614 void Adafruit_RA8875::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
el16jh 3:4a3e169866a2 615 drawLine(x, y, x+w, y, color);
el16jh 3:4a3e169866a2 616 }
sebastiken 0:66c1aa3d198e 617
el16jh 3:4a3e169866a2 618 /**************************************************************************/
el16jh 3:4a3e169866a2 619 /*!
el16jh 3:4a3e169866a2 620 Draws a HW accelerated rectangle on the display
el16jh 3:4a3e169866a2 621
el16jh 3:4a3e169866a2 622 @args x[in] The 0-based x location of the top-right corner
el16jh 3:4a3e169866a2 623 @args y[in] The 0-based y location of the top-right corner
el16jh 3:4a3e169866a2 624 @args w[in] The rectangle width
el16jh 3:4a3e169866a2 625 @args h[in] The rectangle height
el16jh 3:4a3e169866a2 626 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 627 */
el16jh 3:4a3e169866a2 628 /**************************************************************************/
el16jh 3:4a3e169866a2 629 /*
el16jh 3:4a3e169866a2 630 void Adafruit_RA8875::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
el16jh 3:4a3e169866a2 631 {
el16jh 3:4a3e169866a2 632 rectHelper(x, y, x+w, y+h, color, false);
el16jh 3:4a3e169866a2 633 }
el16jh 3:4a3e169866a2 634 */
el16jh 3:4a3e169866a2 635 /**************************************************************************/
el16jh 3:4a3e169866a2 636 /*!
el16jh 3:4a3e169866a2 637 Draws a HW accelerated filled rectangle on the display
el16jh 3:4a3e169866a2 638
el16jh 3:4a3e169866a2 639 @args x[in] The 0-based x location of the top-right corner
el16jh 3:4a3e169866a2 640 @args y[in] The 0-based y location of the top-right corner
el16jh 3:4a3e169866a2 641 @args w[in] The rectangle width
el16jh 3:4a3e169866a2 642 @args h[in] The rectangle height
el16jh 3:4a3e169866a2 643 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 644 */
el16jh 3:4a3e169866a2 645 /**************************************************************************/
el16jh 3:4a3e169866a2 646 /*
el16jh 3:4a3e169866a2 647 void Adafruit_RA8875::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
el16jh 3:4a3e169866a2 648 {
el16jh 3:4a3e169866a2 649 rectHelper(x, y, x+w, y+h, color, true);
el16jh 3:4a3e169866a2 650 }
el16jh 3:4a3e169866a2 651 */
el16jh 3:4a3e169866a2 652 /**************************************************************************/
el16jh 3:4a3e169866a2 653 /*!
el16jh 3:4a3e169866a2 654 Fills the screen with the spefied RGB565 color
el16jh 3:4a3e169866a2 655
el16jh 3:4a3e169866a2 656 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 657 */
el16jh 3:4a3e169866a2 658 /**************************************************************************/
el16jh 3:4a3e169866a2 659
el16jh 3:4a3e169866a2 660 void Adafruit_RA8875::fillScreen(uint16_t color) {
el16jh 3:4a3e169866a2 661 rectHelper(0, 0, _width-1, _height-1, color, true);
el16jh 3:4a3e169866a2 662 }
el16jh 3:4a3e169866a2 663
el16jh 3:4a3e169866a2 664 /**************************************************************************/
el16jh 3:4a3e169866a2 665 /*!
el16jh 3:4a3e169866a2 666 Draws a HW accelerated circle on the display
sebastiken 0:66c1aa3d198e 667
el16jh 3:4a3e169866a2 668 @args x[in] The 0-based x location of the center of the circle
el16jh 3:4a3e169866a2 669 @args y[in] The 0-based y location of the center of the circle
el16jh 3:4a3e169866a2 670 @args w[in] The circle's radius
el16jh 3:4a3e169866a2 671 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 672 */
el16jh 3:4a3e169866a2 673 /**************************************************************************/
el16jh 3:4a3e169866a2 674
el16jh 3:4a3e169866a2 675 void Adafruit_RA8875::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
el16jh 3:4a3e169866a2 676 circleHelper(x0, y0, r, color, false);
el16jh 3:4a3e169866a2 677 }
el16jh 3:4a3e169866a2 678
el16jh 3:4a3e169866a2 679 /**************************************************************************/
el16jh 3:4a3e169866a2 680 /*!
el16jh 3:4a3e169866a2 681 Draws a HW accelerated filled circle on the display
el16jh 3:4a3e169866a2 682
el16jh 3:4a3e169866a2 683 @args x[in] The 0-based x location of the center of the circle
el16jh 3:4a3e169866a2 684 @args y[in] The 0-based y location of the center of the circle
el16jh 3:4a3e169866a2 685 @args w[in] The circle's radius
el16jh 3:4a3e169866a2 686 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 687 */
el16jh 3:4a3e169866a2 688 /**************************************************************************/
el16jh 3:4a3e169866a2 689
el16jh 3:4a3e169866a2 690 void Adafruit_RA8875::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
el16jh 3:4a3e169866a2 691 circleHelper(x0, y0, r, color, true);
el16jh 3:4a3e169866a2 692 }
el16jh 3:4a3e169866a2 693
el16jh 3:4a3e169866a2 694 /**************************************************************************/
el16jh 3:4a3e169866a2 695 /*!
el16jh 3:4a3e169866a2 696 Draws a HW accelerated triangle on the display
sebastiken 0:66c1aa3d198e 697
el16jh 3:4a3e169866a2 698 @args x0[in] The 0-based x location of point 0 on the triangle
el16jh 3:4a3e169866a2 699 @args y0[in] The 0-based y location of point 0 on the triangle
el16jh 3:4a3e169866a2 700 @args x1[in] The 0-based x location of point 1 on the triangle
el16jh 3:4a3e169866a2 701 @args y1[in] The 0-based y location of point 1 on the triangle
el16jh 3:4a3e169866a2 702 @args x2[in] The 0-based x location of point 2 on the triangle
el16jh 3:4a3e169866a2 703 @args y2[in] The 0-based y location of point 2 on the triangle
el16jh 3:4a3e169866a2 704 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 705 */
el16jh 3:4a3e169866a2 706 /**************************************************************************/
el16jh 3:4a3e169866a2 707
el16jh 3:4a3e169866a2 708 void Adafruit_RA8875::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
el16jh 3:4a3e169866a2 709 triangleHelper(x0, y0, x1, y1, x2, y2, color, false);
el16jh 3:4a3e169866a2 710 }
el16jh 3:4a3e169866a2 711
el16jh 3:4a3e169866a2 712 /**************************************************************************/
el16jh 3:4a3e169866a2 713 /*!
el16jh 3:4a3e169866a2 714 Draws a HW accelerated filled triangle on the display
el16jh 3:4a3e169866a2 715
el16jh 3:4a3e169866a2 716 @args x0[in] The 0-based x location of point 0 on the triangle
el16jh 3:4a3e169866a2 717 @args y0[in] The 0-based y location of point 0 on the triangle
el16jh 3:4a3e169866a2 718 @args x1[in] The 0-based x location of point 1 on the triangle
el16jh 3:4a3e169866a2 719 @args y1[in] The 0-based y location of point 1 on the triangle
el16jh 3:4a3e169866a2 720 @args x2[in] The 0-based x location of point 2 on the triangle
el16jh 3:4a3e169866a2 721 @args y2[in] The 0-based y location of point 2 on the triangle
el16jh 3:4a3e169866a2 722 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 723 */
el16jh 3:4a3e169866a2 724 /**************************************************************************/
el16jh 3:4a3e169866a2 725
el16jh 3:4a3e169866a2 726 void Adafruit_RA8875::fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
el16jh 3:4a3e169866a2 727 triangleHelper(x0, y0, x1, y1, x2, y2, color, true);
el16jh 3:4a3e169866a2 728 }
sebastiken 0:66c1aa3d198e 729
el16jh 3:4a3e169866a2 730 /**************************************************************************/
el16jh 3:4a3e169866a2 731 /*!
el16jh 3:4a3e169866a2 732 Draws a HW accelerated ellipse on the display
el16jh 3:4a3e169866a2 733
el16jh 3:4a3e169866a2 734 @args xCenter[in] The 0-based x location of the ellipse's center
el16jh 3:4a3e169866a2 735 @args yCenter[in] The 0-based y location of the ellipse's center
el16jh 3:4a3e169866a2 736 @args longAxis[in] The size in pixels of the ellipse's long axis
el16jh 3:4a3e169866a2 737 @args shortAxis[in] The size in pixels of the ellipse's short axis
el16jh 3:4a3e169866a2 738 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 739 */
el16jh 3:4a3e169866a2 740 /**************************************************************************/
el16jh 3:4a3e169866a2 741
el16jh 3:4a3e169866a2 742 void Adafruit_RA8875::drawEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color) {
el16jh 3:4a3e169866a2 743 ellipseHelper(xCenter, yCenter, longAxis, shortAxis, color, false);
el16jh 3:4a3e169866a2 744 }
el16jh 3:4a3e169866a2 745
el16jh 3:4a3e169866a2 746 /**************************************************************************/
el16jh 3:4a3e169866a2 747 /*!
el16jh 3:4a3e169866a2 748 Draws a HW accelerated filled ellipse on the display
el16jh 3:4a3e169866a2 749
el16jh 3:4a3e169866a2 750 @args xCenter[in] The 0-based x location of the ellipse's center
el16jh 3:4a3e169866a2 751 @args yCenter[in] The 0-based y location of the ellipse's center
el16jh 3:4a3e169866a2 752 @args longAxis[in] The size in pixels of the ellipse's long axis
el16jh 3:4a3e169866a2 753 @args shortAxis[in] The size in pixels of the ellipse's short axis
el16jh 3:4a3e169866a2 754 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 755 */
el16jh 3:4a3e169866a2 756 /**************************************************************************/
el16jh 3:4a3e169866a2 757
el16jh 3:4a3e169866a2 758 void Adafruit_RA8875::fillEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color) {
el16jh 3:4a3e169866a2 759 ellipseHelper(xCenter, yCenter, longAxis, shortAxis, color, true);
el16jh 3:4a3e169866a2 760 }
el16jh 3:4a3e169866a2 761
el16jh 3:4a3e169866a2 762 /**************************************************************************/
el16jh 3:4a3e169866a2 763 /*!
el16jh 3:4a3e169866a2 764 Draws a HW accelerated curve on the display
el16jh 3:4a3e169866a2 765
el16jh 3:4a3e169866a2 766 @args xCenter[in] The 0-based x location of the ellipse's center
el16jh 3:4a3e169866a2 767 @args yCenter[in] The 0-based y location of the ellipse's center
el16jh 3:4a3e169866a2 768 @args longAxis[in] The size in pixels of the ellipse's long axis
el16jh 3:4a3e169866a2 769 @args shortAxis[in] The size in pixels of the ellipse's short axis
el16jh 3:4a3e169866a2 770 @args curvePart[in] The corner to draw, where in clock-wise motion:
el16jh 3:4a3e169866a2 771 0 = 180-270°
el16jh 3:4a3e169866a2 772 1 = 270-0°
el16jh 3:4a3e169866a2 773 2 = 0-90°
el16jh 3:4a3e169866a2 774 3 = 90-180°
el16jh 3:4a3e169866a2 775 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 776 */
el16jh 3:4a3e169866a2 777 /**************************************************************************/
el16jh 3:4a3e169866a2 778
el16jh 3:4a3e169866a2 779 void Adafruit_RA8875::drawCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color) {
el16jh 3:4a3e169866a2 780 curveHelper(xCenter, yCenter, longAxis, shortAxis, curvePart, color, false);
el16jh 3:4a3e169866a2 781 }
el16jh 3:4a3e169866a2 782
el16jh 3:4a3e169866a2 783 /**************************************************************************/
el16jh 3:4a3e169866a2 784 /*!
el16jh 3:4a3e169866a2 785 Draws a HW accelerated filled curve on the display
sebastiken 0:66c1aa3d198e 786
el16jh 3:4a3e169866a2 787 @args xCenter[in] The 0-based x location of the ellipse's center
el16jh 3:4a3e169866a2 788 @args yCenter[in] The 0-based y location of the ellipse's center
el16jh 3:4a3e169866a2 789 @args longAxis[in] The size in pixels of the ellipse's long axis
el16jh 3:4a3e169866a2 790 @args shortAxis[in] The size in pixels of the ellipse's short axis
el16jh 3:4a3e169866a2 791 @args curvePart[in] The corner to draw, where in clock-wise motion:
el16jh 3:4a3e169866a2 792 0 = 180-270°
el16jh 3:4a3e169866a2 793 1 = 270-0°
el16jh 3:4a3e169866a2 794 2 = 0-90°
el16jh 3:4a3e169866a2 795 3 = 90-180°
el16jh 3:4a3e169866a2 796 @args color[in] The RGB565 color to use when drawing the pixel
el16jh 3:4a3e169866a2 797 */
el16jh 3:4a3e169866a2 798 /**************************************************************************/
el16jh 3:4a3e169866a2 799
el16jh 3:4a3e169866a2 800 void Adafruit_RA8875::fillCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color) {
el16jh 3:4a3e169866a2 801 curveHelper(xCenter, yCenter, longAxis, shortAxis, curvePart, color, true);
el16jh 3:4a3e169866a2 802 }
el16jh 3:4a3e169866a2 803
el16jh 3:4a3e169866a2 804 /**************************************************************************/
el16jh 3:4a3e169866a2 805 /*!
el16jh 3:4a3e169866a2 806 Helper function for higher level circle drawing code
el16jh 3:4a3e169866a2 807 */
el16jh 3:4a3e169866a2 808 /**************************************************************************/
el16jh 3:4a3e169866a2 809
el16jh 3:4a3e169866a2 810 void Adafruit_RA8875::circleHelper(int16_t x0, int16_t y0, int16_t r, uint16_t color, bool filled) {
el16jh 3:4a3e169866a2 811 /* Set X */
el16jh 3:4a3e169866a2 812 writeCommand(0x99);
el16jh 3:4a3e169866a2 813 writeData(x0);
el16jh 3:4a3e169866a2 814 writeCommand(0x9a);
el16jh 3:4a3e169866a2 815 writeData(x0 >> 8);
sebastiken 0:66c1aa3d198e 816
el16jh 3:4a3e169866a2 817 /* Set Y */
el16jh 3:4a3e169866a2 818 writeCommand(0x9b);
el16jh 3:4a3e169866a2 819 writeData(y0);
el16jh 3:4a3e169866a2 820 writeCommand(0x9c);
el16jh 3:4a3e169866a2 821 writeData(y0 >> 8);
el16jh 3:4a3e169866a2 822
el16jh 3:4a3e169866a2 823 /* Set Radius */
el16jh 3:4a3e169866a2 824 writeCommand(0x9d);
el16jh 3:4a3e169866a2 825 writeData(r);
el16jh 3:4a3e169866a2 826
el16jh 3:4a3e169866a2 827 /* Set Color */
el16jh 3:4a3e169866a2 828 writeCommand(0x63);
el16jh 3:4a3e169866a2 829 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 830 writeCommand(0x64);
el16jh 3:4a3e169866a2 831 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 832 writeCommand(0x65);
el16jh 3:4a3e169866a2 833 writeData((color & 0x001f));
el16jh 3:4a3e169866a2 834
el16jh 3:4a3e169866a2 835 /* Draw! */
el16jh 3:4a3e169866a2 836 writeCommand(RA8875_DCR);
el16jh 3:4a3e169866a2 837 if (filled) {
el16jh 3:4a3e169866a2 838 writeData(RA8875_DCR_CIRCLE_START | RA8875_DCR_FILL);
el16jh 3:4a3e169866a2 839 } else {
el16jh 3:4a3e169866a2 840 writeData(RA8875_DCR_CIRCLE_START | RA8875_DCR_NOFILL);
el16jh 3:4a3e169866a2 841 }
el16jh 3:4a3e169866a2 842
el16jh 3:4a3e169866a2 843 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 844 waitPoll(RA8875_DCR, RA8875_DCR_CIRCLE_STATUS);
el16jh 3:4a3e169866a2 845 }
sebastiken 0:66c1aa3d198e 846
el16jh 3:4a3e169866a2 847 /**************************************************************************/
el16jh 3:4a3e169866a2 848 /*!
el16jh 3:4a3e169866a2 849 Helper function for higher level rectangle drawing code
el16jh 3:4a3e169866a2 850 */
el16jh 3:4a3e169866a2 851 /**************************************************************************/
el16jh 3:4a3e169866a2 852 void Adafruit_RA8875::rectHelper(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color, bool filled) {
el16jh 3:4a3e169866a2 853 /* Set X */
el16jh 3:4a3e169866a2 854 writeCommand(0x91);
el16jh 3:4a3e169866a2 855 writeData(x);
el16jh 3:4a3e169866a2 856 writeCommand(0x92);
el16jh 3:4a3e169866a2 857 writeData(x >> 8);
el16jh 3:4a3e169866a2 858
el16jh 3:4a3e169866a2 859 /* Set Y */
el16jh 3:4a3e169866a2 860 writeCommand(0x93);
el16jh 3:4a3e169866a2 861 writeData(y);
el16jh 3:4a3e169866a2 862 writeCommand(0x94);
el16jh 3:4a3e169866a2 863 writeData(y >> 8);
sebastiken 0:66c1aa3d198e 864
el16jh 3:4a3e169866a2 865 /* Set X1 */
el16jh 3:4a3e169866a2 866 writeCommand(0x95);
el16jh 3:4a3e169866a2 867 writeData(w);
el16jh 3:4a3e169866a2 868 writeCommand(0x96);
el16jh 3:4a3e169866a2 869 writeData((w) >> 8);
sebastiken 0:66c1aa3d198e 870
el16jh 3:4a3e169866a2 871 /* Set Y1 */
el16jh 3:4a3e169866a2 872 writeCommand(0x97);
el16jh 3:4a3e169866a2 873 writeData(h);
el16jh 3:4a3e169866a2 874 writeCommand(0x98);
el16jh 3:4a3e169866a2 875 writeData((h) >> 8);
sebastiken 0:66c1aa3d198e 876
el16jh 3:4a3e169866a2 877 /* Set Color */
el16jh 3:4a3e169866a2 878 writeCommand(0x63);
el16jh 3:4a3e169866a2 879 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 880 writeCommand(0x64);
el16jh 3:4a3e169866a2 881 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 882 writeCommand(0x65);
el16jh 3:4a3e169866a2 883 writeData((color & 0x001f));
el16jh 3:4a3e169866a2 884
el16jh 3:4a3e169866a2 885 /* Draw! */
el16jh 3:4a3e169866a2 886 writeCommand(RA8875_DCR);
el16jh 3:4a3e169866a2 887 if (filled) {
el16jh 3:4a3e169866a2 888 writeData(0xB0);
el16jh 3:4a3e169866a2 889 } else {
el16jh 3:4a3e169866a2 890 writeData(0x90);
el16jh 3:4a3e169866a2 891 }
sebastiken 0:66c1aa3d198e 892
el16jh 3:4a3e169866a2 893 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 894 waitPoll(RA8875_DCR, RA8875_DCR_LINESQUTRI_STATUS);
el16jh 3:4a3e169866a2 895 }
el16jh 3:4a3e169866a2 896
el16jh 3:4a3e169866a2 897
el16jh 3:4a3e169866a2 898
el16jh 3:4a3e169866a2 899 /////// Function to draw a rectangle with a border
el16jh 3:4a3e169866a2 900
el16jh 3:4a3e169866a2 901
el16jh 3:4a3e169866a2 902 void Adafruit_RA8875::boxDraw(int16_t x, int16_t y, int16_t length, int16_t height, int16_t thick, uint16_t color, uint16_t fill) {
el16jh 3:4a3e169866a2 903
el16jh 3:4a3e169866a2 904 int w = x+length;
el16jh 3:4a3e169866a2 905 int h = y+height;
el16jh 3:4a3e169866a2 906
el16jh 3:4a3e169866a2 907 graphicsMode();
el16jh 3:4a3e169866a2 908 rectHelper(x,y,w,h,color,1);
el16jh 3:4a3e169866a2 909 rectHelper((x+thick),(y+thick),(w-thick),(h-thick),fill,1);
el16jh 3:4a3e169866a2 910 }
el16jh 3:4a3e169866a2 911
el16jh 3:4a3e169866a2 912
el16jh 3:4a3e169866a2 913
el16jh 3:4a3e169866a2 914
el16jh 3:4a3e169866a2 915
el16jh 3:4a3e169866a2 916
el16jh 3:4a3e169866a2 917
el16jh 3:4a3e169866a2 918
el16jh 3:4a3e169866a2 919
el16jh 3:4a3e169866a2 920
sebastiken 0:66c1aa3d198e 921
el16jh 3:4a3e169866a2 922 /**************************************************************************/
el16jh 3:4a3e169866a2 923 /*!
el16jh 3:4a3e169866a2 924 Helper function for higher level triangle drawing code
el16jh 3:4a3e169866a2 925 */
el16jh 3:4a3e169866a2 926 /**************************************************************************/
el16jh 3:4a3e169866a2 927 void Adafruit_RA8875::triangleHelper(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color, bool filled) {
el16jh 3:4a3e169866a2 928 /* Set Point 0 */
el16jh 3:4a3e169866a2 929 writeCommand(0x91);
el16jh 3:4a3e169866a2 930 writeData(x0);
el16jh 3:4a3e169866a2 931 writeCommand(0x92);
el16jh 3:4a3e169866a2 932 writeData(x0 >> 8);
el16jh 3:4a3e169866a2 933 writeCommand(0x93);
el16jh 3:4a3e169866a2 934 writeData(y0);
el16jh 3:4a3e169866a2 935 writeCommand(0x94);
el16jh 3:4a3e169866a2 936 writeData(y0 >> 8);
sebastiken 0:66c1aa3d198e 937
el16jh 3:4a3e169866a2 938 /* Set Point 1 */
el16jh 3:4a3e169866a2 939 writeCommand(0x95);
el16jh 3:4a3e169866a2 940 writeData(x1);
el16jh 3:4a3e169866a2 941 writeCommand(0x96);
el16jh 3:4a3e169866a2 942 writeData(x1 >> 8);
el16jh 3:4a3e169866a2 943 writeCommand(0x97);
el16jh 3:4a3e169866a2 944 writeData(y1);
el16jh 3:4a3e169866a2 945 writeCommand(0x98);
el16jh 3:4a3e169866a2 946 writeData(y1 >> 8);
el16jh 3:4a3e169866a2 947
el16jh 3:4a3e169866a2 948 /* Set Point 2 */
el16jh 3:4a3e169866a2 949 writeCommand(0xA9);
el16jh 3:4a3e169866a2 950 writeData(x2);
el16jh 3:4a3e169866a2 951 writeCommand(0xAA);
el16jh 3:4a3e169866a2 952 writeData(x2 >> 8);
el16jh 3:4a3e169866a2 953 writeCommand(0xAB);
el16jh 3:4a3e169866a2 954 writeData(y2);
el16jh 3:4a3e169866a2 955 writeCommand(0xAC);
el16jh 3:4a3e169866a2 956 writeData(y2 >> 8);
sebastiken 0:66c1aa3d198e 957
el16jh 3:4a3e169866a2 958 /* Set Color */
el16jh 3:4a3e169866a2 959 writeCommand(0x63);
el16jh 3:4a3e169866a2 960 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 961 writeCommand(0x64);
el16jh 3:4a3e169866a2 962 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 963 writeCommand(0x65);
el16jh 3:4a3e169866a2 964 writeData((color & 0x001f));
el16jh 3:4a3e169866a2 965
el16jh 3:4a3e169866a2 966 /* Draw! */
el16jh 3:4a3e169866a2 967 writeCommand(RA8875_DCR);
el16jh 3:4a3e169866a2 968 if (filled) {
el16jh 3:4a3e169866a2 969 writeData(0xA1);
el16jh 3:4a3e169866a2 970 } else {
el16jh 3:4a3e169866a2 971 writeData(0x81);
el16jh 3:4a3e169866a2 972 }
el16jh 3:4a3e169866a2 973
el16jh 3:4a3e169866a2 974 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 975 waitPoll(RA8875_DCR, RA8875_DCR_LINESQUTRI_STATUS);
el16jh 3:4a3e169866a2 976 }
sebastiken 0:66c1aa3d198e 977
el16jh 3:4a3e169866a2 978 /**************************************************************************/
el16jh 3:4a3e169866a2 979 /*!
el16jh 3:4a3e169866a2 980 Helper function for higher level ellipse drawing code
el16jh 3:4a3e169866a2 981 */
el16jh 3:4a3e169866a2 982 /**************************************************************************/
el16jh 3:4a3e169866a2 983 void Adafruit_RA8875::ellipseHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color, bool filled) {
el16jh 3:4a3e169866a2 984 /* Set Center Point */
el16jh 3:4a3e169866a2 985 writeCommand(0xA5);
el16jh 3:4a3e169866a2 986 writeData(xCenter);
el16jh 3:4a3e169866a2 987 writeCommand(0xA6);
el16jh 3:4a3e169866a2 988 writeData(xCenter >> 8);
el16jh 3:4a3e169866a2 989 writeCommand(0xA7);
el16jh 3:4a3e169866a2 990 writeData(yCenter);
el16jh 3:4a3e169866a2 991 writeCommand(0xA8);
el16jh 3:4a3e169866a2 992 writeData(yCenter >> 8);
sebastiken 0:66c1aa3d198e 993
el16jh 3:4a3e169866a2 994 /* Set Long and Short Axis */
el16jh 3:4a3e169866a2 995 writeCommand(0xA1);
el16jh 3:4a3e169866a2 996 writeData(longAxis);
el16jh 3:4a3e169866a2 997 writeCommand(0xA2);
el16jh 3:4a3e169866a2 998 writeData(longAxis >> 8);
el16jh 3:4a3e169866a2 999 writeCommand(0xA3);
el16jh 3:4a3e169866a2 1000 writeData(shortAxis);
el16jh 3:4a3e169866a2 1001 writeCommand(0xA4);
el16jh 3:4a3e169866a2 1002 writeData(shortAxis >> 8);
sebastiken 0:66c1aa3d198e 1003
el16jh 3:4a3e169866a2 1004 /* Set Color */
el16jh 3:4a3e169866a2 1005 writeCommand(0x63);
el16jh 3:4a3e169866a2 1006 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 1007 writeCommand(0x64);
el16jh 3:4a3e169866a2 1008 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 1009 writeCommand(0x65);
el16jh 3:4a3e169866a2 1010 writeData((color & 0x001f));
sebastiken 0:66c1aa3d198e 1011
el16jh 3:4a3e169866a2 1012 /* Draw! */
el16jh 3:4a3e169866a2 1013 writeCommand(0xA0);
el16jh 3:4a3e169866a2 1014 if (filled) {
el16jh 3:4a3e169866a2 1015 writeData(0xC0);
el16jh 3:4a3e169866a2 1016 } else {
el16jh 3:4a3e169866a2 1017 writeData(0x80);
el16jh 3:4a3e169866a2 1018 }
el16jh 3:4a3e169866a2 1019
el16jh 3:4a3e169866a2 1020 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 1021 waitPoll(RA8875_ELLIPSE, RA8875_ELLIPSE_STATUS);
el16jh 3:4a3e169866a2 1022 }
el16jh 3:4a3e169866a2 1023
el16jh 3:4a3e169866a2 1024 /**************************************************************************/
el16jh 3:4a3e169866a2 1025 /*!
el16jh 3:4a3e169866a2 1026 Helper function for higher level curve drawing code
el16jh 3:4a3e169866a2 1027 */
el16jh 3:4a3e169866a2 1028 /**************************************************************************/
el16jh 3:4a3e169866a2 1029 void Adafruit_RA8875::curveHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color, bool filled) {
el16jh 3:4a3e169866a2 1030 /* Set Center Point */
el16jh 3:4a3e169866a2 1031 writeCommand(0xA5);
el16jh 3:4a3e169866a2 1032 writeData(xCenter);
el16jh 3:4a3e169866a2 1033 writeCommand(0xA6);
el16jh 3:4a3e169866a2 1034 writeData(xCenter >> 8);
el16jh 3:4a3e169866a2 1035 writeCommand(0xA7);
el16jh 3:4a3e169866a2 1036 writeData(yCenter);
el16jh 3:4a3e169866a2 1037 writeCommand(0xA8);
el16jh 3:4a3e169866a2 1038 writeData(yCenter >> 8);
sebastiken 0:66c1aa3d198e 1039
el16jh 3:4a3e169866a2 1040 /* Set Long and Short Axis */
el16jh 3:4a3e169866a2 1041 writeCommand(0xA1);
el16jh 3:4a3e169866a2 1042 writeData(longAxis);
el16jh 3:4a3e169866a2 1043 writeCommand(0xA2);
el16jh 3:4a3e169866a2 1044 writeData(longAxis >> 8);
el16jh 3:4a3e169866a2 1045 writeCommand(0xA3);
el16jh 3:4a3e169866a2 1046 writeData(shortAxis);
el16jh 3:4a3e169866a2 1047 writeCommand(0xA4);
el16jh 3:4a3e169866a2 1048 writeData(shortAxis >> 8);
el16jh 3:4a3e169866a2 1049
el16jh 3:4a3e169866a2 1050 /* Set Color */
el16jh 3:4a3e169866a2 1051 writeCommand(0x63);
el16jh 3:4a3e169866a2 1052 writeData((color & 0xf800) >> 11);
el16jh 3:4a3e169866a2 1053 writeCommand(0x64);
el16jh 3:4a3e169866a2 1054 writeData((color & 0x07e0) >> 5);
el16jh 3:4a3e169866a2 1055 writeCommand(0x65);
el16jh 3:4a3e169866a2 1056 writeData((color & 0x001f));
el16jh 3:4a3e169866a2 1057
el16jh 3:4a3e169866a2 1058 /* Draw! */
el16jh 3:4a3e169866a2 1059 writeCommand(0xA0);
el16jh 3:4a3e169866a2 1060 if (filled) {
el16jh 3:4a3e169866a2 1061 writeData(0xD0 | (curvePart & 0x03));
el16jh 3:4a3e169866a2 1062 } else {
el16jh 3:4a3e169866a2 1063 writeData(0x90 | (curvePart & 0x03));
el16jh 3:4a3e169866a2 1064 }
el16jh 3:4a3e169866a2 1065
el16jh 3:4a3e169866a2 1066 /* Wait for the command to finish */
el16jh 3:4a3e169866a2 1067 waitPoll(RA8875_ELLIPSE, RA8875_ELLIPSE_STATUS);
el16jh 3:4a3e169866a2 1068 }
el16jh 3:4a3e169866a2 1069
el16jh 3:4a3e169866a2 1070 /************************* Mid Level ***********************************/
el16jh 3:4a3e169866a2 1071
el16jh 3:4a3e169866a2 1072 /**************************************************************************/
el16jh 3:4a3e169866a2 1073 /*!
sebastiken 0:66c1aa3d198e 1074
el16jh 3:4a3e169866a2 1075 */
el16jh 3:4a3e169866a2 1076 /**************************************************************************/
el16jh 3:4a3e169866a2 1077 void Adafruit_RA8875::GPIOX(bool on) {
el16jh 3:4a3e169866a2 1078 if (on)
el16jh 3:4a3e169866a2 1079 writeReg(RA8875_GPIOX, 1);
el16jh 3:4a3e169866a2 1080 else
el16jh 3:4a3e169866a2 1081 writeReg(RA8875_GPIOX, 0);
el16jh 3:4a3e169866a2 1082 }
el16jh 3:4a3e169866a2 1083
el16jh 3:4a3e169866a2 1084 /**************************************************************************/
el16jh 3:4a3e169866a2 1085 /*!
el16jh 3:4a3e169866a2 1086
el16jh 3:4a3e169866a2 1087 */
el16jh 3:4a3e169866a2 1088 /**************************************************************************/
el16jh 3:4a3e169866a2 1089 void Adafruit_RA8875::PWM1out(uint8_t p) {
el16jh 3:4a3e169866a2 1090 writeReg(RA8875_P1DCR, p);
el16jh 3:4a3e169866a2 1091 }
el16jh 3:4a3e169866a2 1092
el16jh 3:4a3e169866a2 1093 /**************************************************************************/
el16jh 3:4a3e169866a2 1094 /*!
sebastiken 0:66c1aa3d198e 1095
el16jh 3:4a3e169866a2 1096 */
el16jh 3:4a3e169866a2 1097 /**************************************************************************/
el16jh 3:4a3e169866a2 1098 void Adafruit_RA8875::PWM2out(uint8_t p) {
el16jh 3:4a3e169866a2 1099 writeReg(RA8875_P2DCR, p);
el16jh 3:4a3e169866a2 1100 }
el16jh 3:4a3e169866a2 1101
el16jh 3:4a3e169866a2 1102 /**************************************************************************/
el16jh 3:4a3e169866a2 1103 /*!
sebastiken 0:66c1aa3d198e 1104
el16jh 3:4a3e169866a2 1105 */
el16jh 3:4a3e169866a2 1106 /**************************************************************************/
el16jh 3:4a3e169866a2 1107 void Adafruit_RA8875::PWM1config(bool on, uint8_t clock) {
el16jh 3:4a3e169866a2 1108 if (on) {
el16jh 3:4a3e169866a2 1109 writeReg(RA8875_P1CR, RA8875_P1CR_ENABLE | (clock & 0xF));
el16jh 3:4a3e169866a2 1110 } else {
el16jh 3:4a3e169866a2 1111 writeReg(RA8875_P1CR, RA8875_P1CR_DISABLE | (clock & 0xF));
el16jh 3:4a3e169866a2 1112 }
el16jh 3:4a3e169866a2 1113 }
sebastiken 0:66c1aa3d198e 1114
el16jh 3:4a3e169866a2 1115 /**************************************************************************/
el16jh 3:4a3e169866a2 1116 /*!
el16jh 3:4a3e169866a2 1117
el16jh 3:4a3e169866a2 1118 */
el16jh 3:4a3e169866a2 1119 /**************************************************************************/
el16jh 3:4a3e169866a2 1120 void Adafruit_RA8875::PWM2config(bool on, uint8_t clock) {
el16jh 3:4a3e169866a2 1121 if (on) {
el16jh 3:4a3e169866a2 1122 writeReg(RA8875_P2CR, RA8875_P2CR_ENABLE | (clock & 0xF));
el16jh 3:4a3e169866a2 1123 } else {
el16jh 3:4a3e169866a2 1124 writeReg(RA8875_P2CR, RA8875_P2CR_DISABLE | (clock & 0xF));
el16jh 3:4a3e169866a2 1125 }
el16jh 3:4a3e169866a2 1126 }
sebastiken 0:66c1aa3d198e 1127
el16jh 3:4a3e169866a2 1128 /**************************************************************************/
el16jh 3:4a3e169866a2 1129 /*!
el16jh 3:4a3e169866a2 1130 Enables or disables the on-chip touch screen controller
el16jh 3:4a3e169866a2 1131 */
el16jh 3:4a3e169866a2 1132 /**************************************************************************/
el16jh 3:4a3e169866a2 1133 void Adafruit_RA8875::touchEnable(bool on) {
el16jh 3:4a3e169866a2 1134 uint8_t adcClk = (uint8_t) RA8875_TPCR0_ADCCLK_DIV4;
el16jh 3:4a3e169866a2 1135
el16jh 3:4a3e169866a2 1136 if ( _size == RA8875_800x480 ) //match up touch size with LCD size
el16jh 3:4a3e169866a2 1137 adcClk = (uint8_t) RA8875_TPCR0_ADCCLK_DIV16;
sebastiken 0:66c1aa3d198e 1138
el16jh 3:4a3e169866a2 1139 if (on) {
el16jh 3:4a3e169866a2 1140 /* Enable Touch Panel (Reg 0x70) */
el16jh 3:4a3e169866a2 1141 writeReg(RA8875_TPCR0, RA8875_TPCR0_ENABLE |
el16jh 3:4a3e169866a2 1142 RA8875_TPCR0_WAIT_4096CLK |
el16jh 3:4a3e169866a2 1143 RA8875_TPCR0_WAKEENABLE |
el16jh 3:4a3e169866a2 1144 adcClk); // 10mhz max!
el16jh 3:4a3e169866a2 1145 /* Set Auto Mode (Reg 0x71) */
el16jh 3:4a3e169866a2 1146 writeReg(RA8875_TPCR1, RA8875_TPCR1_AUTO |
el16jh 3:4a3e169866a2 1147 // RA8875_TPCR1_VREFEXT |
el16jh 3:4a3e169866a2 1148 RA8875_TPCR1_DEBOUNCE);
el16jh 3:4a3e169866a2 1149 /* Enable TP INT */
el16jh 3:4a3e169866a2 1150 writeReg(RA8875_INTC1, readReg(RA8875_INTC1) | RA8875_INTC1_TP);
el16jh 3:4a3e169866a2 1151 } else {
el16jh 3:4a3e169866a2 1152 /* Disable TP INT */
el16jh 3:4a3e169866a2 1153 writeReg(RA8875_INTC1, readReg(RA8875_INTC1) & ~RA8875_INTC1_TP);
el16jh 3:4a3e169866a2 1154 /* Disable Touch Panel (Reg 0x70) */
el16jh 3:4a3e169866a2 1155 writeReg(RA8875_TPCR0, RA8875_TPCR0_DISABLE);
el16jh 3:4a3e169866a2 1156 }
el16jh 3:4a3e169866a2 1157 }
el16jh 3:4a3e169866a2 1158
el16jh 3:4a3e169866a2 1159 /**************************************************************************/
el16jh 3:4a3e169866a2 1160 /*!
el16jh 3:4a3e169866a2 1161 Checks if a touch event has occured
sebastiken 0:66c1aa3d198e 1162
el16jh 3:4a3e169866a2 1163 @returns True is a touch event has occured (reading it via
el16jh 3:4a3e169866a2 1164 touchRead() will clear the interrupt in memory)
el16jh 3:4a3e169866a2 1165 */
el16jh 3:4a3e169866a2 1166 /**************************************************************************/
el16jh 3:4a3e169866a2 1167 bool Adafruit_RA8875::touched(void) {
el16jh 3:4a3e169866a2 1168 if (readReg(RA8875_INTC2) & RA8875_INTC2_TP) return true;
el16jh 3:4a3e169866a2 1169 return false;
el16jh 3:4a3e169866a2 1170 }
sebastiken 0:66c1aa3d198e 1171
el16jh 3:4a3e169866a2 1172 /**************************************************************************/
el16jh 3:4a3e169866a2 1173 /*!
el16jh 3:4a3e169866a2 1174 Reads the last touch event
el16jh 3:4a3e169866a2 1175
el16jh 3:4a3e169866a2 1176 @args x[out] Pointer to the uint16_t field to assign the raw X value
el16jh 3:4a3e169866a2 1177 @args y[out] Pointer to the uint16_t field to assign the raw Y value
el16jh 3:4a3e169866a2 1178
el16jh 3:4a3e169866a2 1179 @note Calling this function will clear the touch panel interrupt on
el16jh 3:4a3e169866a2 1180 the RA8875, resetting the flag used by the 'touched' function
el16jh 3:4a3e169866a2 1181 */
el16jh 3:4a3e169866a2 1182 /**************************************************************************/
el16jh 3:4a3e169866a2 1183 bool Adafruit_RA8875::touchRead(uint16_t *x, uint16_t *y) {
el16jh 3:4a3e169866a2 1184 uint16_t tx, ty;
el16jh 3:4a3e169866a2 1185 uint8_t temp;
sebastiken 0:66c1aa3d198e 1186
el16jh 3:4a3e169866a2 1187 tx = readReg(RA8875_TPXH);
el16jh 3:4a3e169866a2 1188 ty = readReg(RA8875_TPYH);
el16jh 3:4a3e169866a2 1189 temp = readReg(RA8875_TPXYL);
el16jh 3:4a3e169866a2 1190 tx <<= 2;
el16jh 3:4a3e169866a2 1191 ty <<= 2;
el16jh 3:4a3e169866a2 1192 tx |= temp & 0x03; // get the bottom x bits
el16jh 3:4a3e169866a2 1193 ty |= (temp >> 2) & 0x03; // get the bottom y bits
sebastiken 0:66c1aa3d198e 1194
el16jh 3:4a3e169866a2 1195 *x = tx;
el16jh 3:4a3e169866a2 1196 *y = ty;
sebastiken 0:66c1aa3d198e 1197
el16jh 3:4a3e169866a2 1198 /* Clear TP INT Status */
el16jh 3:4a3e169866a2 1199 writeReg(RA8875_INTC2, RA8875_INTC2_TP);
el16jh 3:4a3e169866a2 1200
el16jh 3:4a3e169866a2 1201 return true;
el16jh 3:4a3e169866a2 1202 }
sebastiken 0:66c1aa3d198e 1203
el16jh 3:4a3e169866a2 1204 /**************************************************************************/
el16jh 3:4a3e169866a2 1205 /*!
el16jh 3:4a3e169866a2 1206 Turns the display on or off
el16jh 3:4a3e169866a2 1207 */
el16jh 3:4a3e169866a2 1208 /**************************************************************************/
el16jh 3:4a3e169866a2 1209 void Adafruit_RA8875::displayOn(bool on) {
el16jh 3:4a3e169866a2 1210 if (on)
el16jh 3:4a3e169866a2 1211 writeReg(RA8875_PWRR, RA8875_PWRR_NORMAL | RA8875_PWRR_DISPON);
el16jh 3:4a3e169866a2 1212 else
el16jh 3:4a3e169866a2 1213 writeReg(RA8875_PWRR, RA8875_PWRR_NORMAL | RA8875_PWRR_DISPOFF);
el16jh 3:4a3e169866a2 1214 }
sebastiken 0:66c1aa3d198e 1215
el16jh 3:4a3e169866a2 1216 /**************************************************************************/
el16jh 3:4a3e169866a2 1217 /*!
el16jh 3:4a3e169866a2 1218 Puts the display in sleep mode, or disables sleep mode if enabled
el16jh 3:4a3e169866a2 1219 */
el16jh 3:4a3e169866a2 1220 /**************************************************************************/
el16jh 3:4a3e169866a2 1221 void Adafruit_RA8875::sleep(bool sleep) {
el16jh 3:4a3e169866a2 1222 if (sleep)
el16jh 3:4a3e169866a2 1223 writeReg(RA8875_PWRR, RA8875_PWRR_DISPOFF | RA8875_PWRR_SLEEP);
el16jh 3:4a3e169866a2 1224 else
el16jh 3:4a3e169866a2 1225 writeReg(RA8875_PWRR, RA8875_PWRR_DISPOFF);
el16jh 3:4a3e169866a2 1226 }
sebastiken 0:66c1aa3d198e 1227
el16jh 3:4a3e169866a2 1228 /************************* Low Level ***********************************/
el16jh 3:4a3e169866a2 1229
el16jh 3:4a3e169866a2 1230 /**************************************************************************/
el16jh 3:4a3e169866a2 1231 /*!
el16jh 3:4a3e169866a2 1232
el16jh 3:4a3e169866a2 1233 */
el16jh 3:4a3e169866a2 1234 /**************************************************************************/
el16jh 3:4a3e169866a2 1235 void Adafruit_RA8875::writeReg(uint8_t reg, uint8_t val) {
el16jh 3:4a3e169866a2 1236 writeCommand(reg);
el16jh 3:4a3e169866a2 1237 writeData(val);
el16jh 3:4a3e169866a2 1238 }
el16jh 3:4a3e169866a2 1239
el16jh 3:4a3e169866a2 1240 /**************************************************************************/
el16jh 3:4a3e169866a2 1241 /*!
sebastiken 0:66c1aa3d198e 1242
el16jh 3:4a3e169866a2 1243 */
el16jh 3:4a3e169866a2 1244 /**************************************************************************/
el16jh 3:4a3e169866a2 1245 uint8_t Adafruit_RA8875::readReg(uint8_t reg) {
el16jh 3:4a3e169866a2 1246 writeCommand(reg);
el16jh 3:4a3e169866a2 1247 return readData();
el16jh 3:4a3e169866a2 1248 }
sebastiken 0:66c1aa3d198e 1249
el16jh 3:4a3e169866a2 1250 /**************************************************************************/
el16jh 3:4a3e169866a2 1251 /*!
el16jh 3:4a3e169866a2 1252
el16jh 3:4a3e169866a2 1253 */
el16jh 3:4a3e169866a2 1254 /**************************************************************************/
el16jh 3:4a3e169866a2 1255 void Adafruit_RA8875::writeData(uint8_t d) {
el16jh 3:4a3e169866a2 1256 _cs = 0;
sebastiken 0:66c1aa3d198e 1257
el16jh 3:4a3e169866a2 1258 spi.write(RA8875_DATAWRITE);
el16jh 3:4a3e169866a2 1259 spi.write(d);
el16jh 3:4a3e169866a2 1260 _cs = 1;
el16jh 3:4a3e169866a2 1261
el16jh 3:4a3e169866a2 1262 }
sebastiken 0:66c1aa3d198e 1263
el16jh 3:4a3e169866a2 1264 /**************************************************************************/
el16jh 3:4a3e169866a2 1265 /*!
sebastiken 0:66c1aa3d198e 1266
el16jh 3:4a3e169866a2 1267 */
el16jh 3:4a3e169866a2 1268 /**************************************************************************/
el16jh 3:4a3e169866a2 1269 uint8_t Adafruit_RA8875::readData(void) {
el16jh 3:4a3e169866a2 1270 _cs = 0;
el16jh 3:4a3e169866a2 1271
el16jh 3:4a3e169866a2 1272 spi.write(RA8875_DATAREAD);
el16jh 3:4a3e169866a2 1273 uint8_t x = spi.write(0x0);
sebastiken 0:66c1aa3d198e 1274
el16jh 3:4a3e169866a2 1275 _cs = 1;
el16jh 3:4a3e169866a2 1276 return x;
el16jh 3:4a3e169866a2 1277 }
el16jh 3:4a3e169866a2 1278
el16jh 3:4a3e169866a2 1279 /**************************************************************************/
el16jh 3:4a3e169866a2 1280 /*!
sebastiken 0:66c1aa3d198e 1281
el16jh 3:4a3e169866a2 1282 */
el16jh 3:4a3e169866a2 1283 /**************************************************************************/
el16jh 3:4a3e169866a2 1284 void Adafruit_RA8875::writeCommand(uint8_t d) {
el16jh 3:4a3e169866a2 1285 _cs = 0;
el16jh 3:4a3e169866a2 1286
el16jh 3:4a3e169866a2 1287 spi.write(RA8875_CMDWRITE);
el16jh 3:4a3e169866a2 1288 spi.write(d);
sebastiken 0:66c1aa3d198e 1289
el16jh 3:4a3e169866a2 1290 _cs = 1;
el16jh 3:4a3e169866a2 1291 }
el16jh 3:4a3e169866a2 1292
el16jh 3:4a3e169866a2 1293 /**************************************************************************/
el16jh 3:4a3e169866a2 1294 /*!
sebastiken 0:66c1aa3d198e 1295
el16jh 3:4a3e169866a2 1296 */
el16jh 3:4a3e169866a2 1297 /**************************************************************************/
el16jh 3:4a3e169866a2 1298 uint8_t Adafruit_RA8875::readStatus(void) {
el16jh 3:4a3e169866a2 1299 _cs = 0;
sebastiken 0:66c1aa3d198e 1300
el16jh 3:4a3e169866a2 1301 spi.write(RA8875_CMDREAD);
el16jh 3:4a3e169866a2 1302 uint8_t x = spi.write(0x0);
el16jh 3:4a3e169866a2 1303
el16jh 3:4a3e169866a2 1304 _cs = 1;
el16jh 3:4a3e169866a2 1305 return x;
el16jh 3:4a3e169866a2 1306 }