Fork of https://os.mbed.com/users/sebastiken/code/Adafruit_RA8875/ ; Adapted for use with K64F and in the process of adding more functions.
RA8875.cpp@3:4a3e169866a2, 2019-03-14 (annotated)
- Committer:
- el16jh
- Date:
- Thu Mar 14 12:00:15 2019 +0000
- Revision:
- 3:4a3e169866a2
- Parent:
- 2:040a687cea93
First publish of working Adafruit 7 TFT - RA8875 program
Who changed what in which revision?
User | Revision | Line number | New 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 | } |