for 522 mbed basic operate
Diff: DmTftRa8875.cpp
- Revision:
- 15:70127e08ed27
- Parent:
- 14:2db7065edbec
--- a/DmTftRa8875.cpp Mon Oct 12 08:35:35 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,902 +0,0 @@ -/********************************************************************************************** - Copyright (c) 2014 DisplayModule. All rights reserved. - - Redistribution and use of this source code, part of this source code or any compiled binary - based on this source code is permitted as long as the above copyright notice and following - disclaimer is retained. - - DISCLAIMER: - THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES - NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE. - ********************************************************************************************/ - -/* Notice: - The panel resolution should be config in DmTftRa8875::init() function. - RA8875Size size = RA8875_480x272 or RA8875Size size = RA8875_800x480; - - Tested on NUCLEO-F401RE, LPCXpresso11U68, LPCXpresso824-MAX platform. -*/ - -#include "DmTftRa8875.h" -#if defined (DM_TOOLCHAIN_ARDUINO) -DmTftRa8875::DmTftRa8875(uint8_t cs, uint8_t sel) -: DmTftBase(480, 272) -#elif defined (DM_TOOLCHAIN_MBED) -DmTftRa8875::DmTftRa8875(PinName cs, PinName sel, PinName mosi, PinName miso, PinName clk) -: DmTftBase(480, 272), spi(mosi, miso, clk) -#endif -{ - _cs = cs; - _sel = sel; -} - -DmTftRa8875::~DmTftRa8875() -{ -#if defined (DM_TOOLCHAIN_MBED) - delete _pinCS; - delete _pinSEL; - - _pinCS = NULL; - _pinSEL = NULL; -#endif -} - -uint16_t DmTftRa8875::width(void) -{ - return _width; -} - -uint16_t DmTftRa8875::height(void) -{ - return _height; -} - -void DmTftRa8875::writeBus(uint8_t data) -{ -#if defined (DM_TOOLCHAIN_ARDUINO) - //SPCR = _spiSettings; // SPI Control Register - SPDR = data; // SPI Data Register - while(!(SPSR & _BV(SPIF))); // SPI Status Register Wait for transmission to finish -#elif defined (DM_TOOLCHAIN_MBED) - spi.write(data); -#endif -} - -uint8_t DmTftRa8875::readBus(void) -{ -#if defined (DM_TOOLCHAIN_ARDUINO) - //SPCR = _spiSettings; // SPI Control Register - SPDR = 0; // SPI Data Register - while(!(SPSR & _BV(SPIF))); // SPI Status Register Wait for transmission to finish - return SPDR; -#elif defined (DM_TOOLCHAIN_MBED) - return spi.write(0x00); // dummy byte to read -#endif -} - -void DmTftRa8875::sendCommand(uint8_t index) -{ - cbi(_pinCS, _bitmaskCS); - - writeBus(0x80); - writeBus(index); - - sbi(_pinCS, _bitmaskCS); -} - -uint8_t DmTftRa8875::readStatus(void) -{ - cbi(_pinCS, _bitmaskCS); - - writeBus(0xC0); - uint8_t data = readBus(); - - sbi(_pinCS, _bitmaskCS); - - return data; -} - -void DmTftRa8875::sendData(uint16_t data) -{ - - uint8_t dh = data>>8; - uint8_t dl = data&0xff; - - cbi(_pinCS, _bitmaskCS); - - writeBus(0x00); - writeBus(dh); - writeBus(dl); - - sbi(_pinCS, _bitmaskCS); - -} - -void DmTftRa8875::send8BitData(uint8_t data) -{ - cbi(_pinCS, _bitmaskCS); - - writeBus(0x00); - writeBus(data); - - sbi(_pinCS, _bitmaskCS); -} - -uint8_t DmTftRa8875::readData(void) -{ - cbi(_pinCS, _bitmaskCS); - - writeBus(0x40); - uint8_t data = readBus(); - - sbi(_pinCS, _bitmaskCS); - - return data; -} - -void DmTftRa8875::writeReg(uint8_t reg, uint8_t val) -{ - sendCommand(reg); - send8BitData(val); -} - -uint8_t DmTftRa8875::readReg(uint8_t reg) -{ - sendCommand(reg); - return readData(); -} - -void DmTftRa8875::setAddress(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) -{ - /* Set active window X */ - writeReg(0x30, x0); // horizontal start point - writeReg(0x31, x0 >> 8); - writeReg(0x34, (uint16_t)(x1) & 0xFF); // horizontal end point - writeReg(0x35, (uint16_t)(x1) >> 8); - - /* Set active window Y */ - writeReg(0x32, y0); // vertical start point - writeReg(0x33, y0 >> 8); - writeReg(0x36, (uint16_t)(y1) & 0xFF); // vertical end point - writeReg(0x37, (uint16_t)(y1) >> 8); - - writeReg(0x46, x0); - writeReg(0x47, x0 >> 8); - writeReg(0x48, y0); - writeReg(0x49, y0 >> 8); - sendCommand(0x02); -} - -void DmTftRa8875::softReset(void) -{ - //softreset - sendCommand(0x01); - send8BitData(0x01); - delay(10); - sendCommand(0x01); - send8BitData(0x00); - delay(100); // This much delay needed?? -} - -void DmTftRa8875::init(void) -{ - // DM_TFT43_108 = RA8875_480x272; DM_TFT50_111 = RA8875_800x480 - RA8875Size size = RA8875_480x272; - - setTextColor(BLACK, WHITE); -#if defined (DM_TOOLCHAIN_ARDUINO) - _pinCS = portOutputRegister(digitalPinToPort(_cs)); - _bitmaskCS = digitalPinToBitMask(_cs); - _pinSEL = portOutputRegister(digitalPinToPort(_sel)); - _bitmaskSEL = digitalPinToBitMask(_sel); - pinMode(_cs,OUTPUT); - pinMode(_sel,OUTPUT); - digitalWrite(_sel, LOW); // w25 control by MCU - - sbi(_pinCS, _bitmaskCS); - - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!) - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - _spiSettings = SPCR; -#elif defined (DM_TOOLCHAIN_MBED) - _pinCS = new DigitalOut(_cs); - _pinSEL = new DigitalOut(_sel); - sbi(_pinSEL, _bitmaskSEL); // w25 control by MCU - - sbi(_pinCS, _bitmaskCS); - - -#ifdef TARGET_LPC824 // for LPCXpresso824-MAX - spi.format(8,3); - spi.frequency(8000000); -#elif TARGET_LPC11U6X // for LPCXpresso11U68 - spi.format(8,3); - spi.frequency(2000000); -#elif TARGET_NUCLEO_F401RE // for NUCLEO-F401RE - spi.format(8,0); - spi.frequency(8000000); -#else - spi.format(8,3); - spi.frequency(2000000); // Max SPI speed for display is 10 and for 17 for LPC15xx -#endif - softReset(); -#endif - - cbi(_pinCS, _bitmaskCS); - - /* Timing values */ - uint8_t pixclk; - uint8_t hsync_start; - uint8_t hsync_pw; - uint8_t hsync_finetune; - uint8_t hsync_nondisp; - uint8_t vsync_pw; - uint16_t vsync_nondisp; - uint16_t vsync_start; - - if(size == RA8875_480x272) { - _width = 480; - _height = 272; - setWidth(_width); - setHeight(_height); - // PLL init - // 20MHz*(10+1)/((RA8875_PLLC1_PLLDIV1 +1) * 2^RA8875_PLLC2_DIV4)) - writeReg(0x88, 0x00 + 10); - delay(1); - writeReg(0x89, 0x02); - delay(1); - - pixclk = 0x80 | 0x02; - hsync_nondisp = 10; - hsync_start = 8; - hsync_pw = 48; - hsync_finetune = 0; - vsync_nondisp = 3; - vsync_start = 8; - vsync_pw = 10; - } - - if(size == RA8875_800x480) { - _width = 800; - _height = 480; - setWidth(_width); - setHeight(_height); - // PLL init - // 20MHz*(10+1)/((RA8875_PLLC1_PLLDIV1 +1) * 2^RA8875_PLLC2_DIV4)) - writeReg(0x88, 0x00 + 10); - delay(1); - writeReg(0x89, 0x02); - delay(1); - - pixclk = 0x80 | 0x01; - hsync_nondisp = 26; - hsync_start = 32; - hsync_pw = 96; - hsync_finetune = 0; - vsync_nondisp = 32; - vsync_start = 23; - vsync_pw = 2; - } - - writeReg(0x10, 0x0C | 0x00); - - writeReg(0x04, pixclk); - delay(1); - - /* Horizontal settings registers */ - writeReg(0x14, (_width / 8) - 1); // H width: (HDWR + 1) * 8 = 480 - writeReg(0x15, 0x00 + hsync_finetune); - writeReg(0x16, (hsync_nondisp - hsync_finetune - 2)/8); // H non-display: HNDR * 8 + HNDFTR + 2 = 10 - writeReg(0x17, hsync_start/8 - 1); // Hsync start: (HSTR + 1)*8 - writeReg(0x18, 0x00 + (hsync_pw/8 - 1)); // HSync pulse width = (HPWR+1) * 8 - - /* Vertical settings registers */ - writeReg(0x19, (uint16_t)(_height - 1) & 0xFF); - writeReg(0x1A, (uint16_t)(_height - 1) >> 8); - writeReg(0x1B, vsync_nondisp-1); // V non-display period = VNDR + 1 - writeReg(0x1C, vsync_nondisp >> 8); - writeReg(0x1D, vsync_start-1); // Vsync start position = VSTR + 1 - writeReg(0x1E, vsync_start >> 8); - writeReg(0x1F, 0x00 + vsync_pw - 1); // Vsync pulse width = VPWR + 1 - - /* Set active window X */ - writeReg(0x30, 0); // horizontal start point - writeReg(0x31, 0); - writeReg(0x34, (uint16_t)(_width - 1) & 0xFF); // horizontal end point - writeReg(0x35, (uint16_t)(_width - 1) >> 8); - - /* Set active window Y */ - writeReg(0x32, 0); // vertical start point - writeReg(0x33, 0); - writeReg(0x36, (uint16_t)(_height - 1) & 0xFF); // vertical end point - writeReg(0x37, (uint16_t)(_height - 1) >> 8); - /* Clear the entire window */ - writeReg(0x8E, 0x80 | 0x00); - /* Wait for the command to finish */ - while (readReg(0x8E) & 0x80); - //delay(100); - // display on - writeReg(0x01, 0x00 | 0x80); - // GPIOX on - writeReg(0xC7, 1); - sbi(_pinCS, _bitmaskCS); - - //clearScreen(); - setFontColor(BLACK, WHITE); - //setFontZoom(0, 0); - - // spi flash control by MCU - w25CtrlByMCU(); - - //backlight on - backlightOn(true); - backlightAdjust(255); // max luminance - -} - -void DmTftRa8875::eableKeyScan(bool on) -{ - if(on) { - writeReg(0xC0, (1 << 7) | (0 << 4 ) | 1 ); // enable key scan - } else { - writeReg(0xC0, (0 << 7)); - } -} - -uint8_t DmTftRa8875::getKeyValue(void) -{ - uint8_t data = 0xFF; - sendCommand(0xC2); - data = readData(); - - // Clear key interrupt status - writeReg(0xF1,readReg(0xF1) | 0x10); - delay(1); - return data; - -} - -bool DmTftRa8875::isKeyPress(void) -{ - uint8_t temp; - temp = readReg(0xF1); - - if(temp & 0x10) { - return true; - } else { - return false; - } -} - -void DmTftRa8875::backlightOn(bool on) -{ - if(on) { - writeReg(0x8A, (1 << 7) | (10 << 0 )); // enable PWM1 - } else { - writeReg(0x8A, (0 << 7) | (10 << 0 )); - } -} - -void DmTftRa8875::backlightAdjust(uint8_t value) -{ - writeReg(0x8B, value); -} - -void DmTftRa8875::w25CtrlByMCU(void) -{ -#if defined (DM_TOOLCHAIN_ARDUINO) - digitalWrite(_sel, LOW); -#elif defined (DM_TOOLCHAIN_MBED) - cbi(_pinSEL, _bitmaskSEL); -#endif -} - -void DmTftRa8875::w25CtrlByRa8875(void) -{ -#if defined (DM_TOOLCHAIN_ARDUINO) - digitalWrite(_sel, HIGH); -#elif defined (DM_TOOLCHAIN_MBED) - sbi(_pinSEL, _bitmaskSEL); -#endif - -} - -void DmTftRa8875::drawImageContinuous(uint32_t startaddress,uint32_t count,uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1) -{ - w25CtrlByRa8875(); - - setAddress(x0, y0, x1-1, y1-1); - - writeReg(0xE0, 0x00); - - writeReg(0x05, (0 << 7) | (0 << 6) | (1 << 5) | (0 << 3) | (1 << 2) | (3 << 1)); - writeReg(0x06, (0 << 0)); // set serial flash frequency - - writeReg(0xB0,startaddress & 0xFF); // DMA Source Start Address - writeReg(0xB1,startaddress >> 8); - writeReg(0xB2,startaddress >> 16); - - writeReg(0xB4, count & 0xFF); // DMA Transfer Number - writeReg(0xB6, (count & 0xFF00) >> 8 ); - writeReg(0xB8, (count & 0xFF0000) >> 16); - - - writeReg(0xBF, 0x00); // Continuous mode - writeReg(0xBF, readReg(0xBF) | 0x01); //start DMA - - /* Wait for the DMA Transfer to finish */ - while (readReg(0xBF) & 0x01); - - w25CtrlByMCU(); - -} - -void DmTftRa8875::drawImageBlock(uint32_t startaddress, uint32_t count, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,uint16_t pic_width, uint16_t block_width, uint16_t block_height) -{ - w25CtrlByRa8875(); - - setAddress(x0, y0, x1-1, y1-1); - - writeReg(0xE0, 0x00); - - writeReg(0x05, (0 << 7) | (0 << 6) | (1 << 5) | (0 << 3) | (1 << 2) | (3 << 1)); - writeReg(0x06, (0 << 0)); // set serial flash frequency - - writeReg(0xB0,startaddress & 0xFF); // DMA Source Start Address - writeReg(0xB1,startaddress >> 8); - writeReg(0xB2,startaddress >> 16); - - writeReg(0xB4, block_width & 0xFF); // DMA block width - writeReg(0xB5, block_width >> 8 ); - writeReg(0xB6, block_height & 0xFF); // DMA block height - writeReg(0xB7, block_height >> 8 ); - - writeReg(0xB8, pic_width & 0xFF); // DMA soruce picture width - writeReg(0xB9, pic_width >> 8 ); - - writeReg(0xBF, 0x02); // block mode - writeReg(0xBF, readReg(0xBF) | 0x01); //start DMA - - /* Wait for the DMA Transfer to finish */ - while (readReg(0xBF) & 0x01); - - w25CtrlByMCU(); - -} - -void DmTftRa8875::drawPoint(uint16_t x, uint16_t y, uint16_t radius) -{ - if (radius == 0) { - cbi(_pinCS, _bitmaskCS); - - setAddress(x,y,x,y); - sendData(_fgColor); - - sbi(_pinCS, _bitmaskCS); - } else { - fillRectangle(x-radius,y-radius,x+radius,y+radius, _fgColor); - } -} - - -void DmTftRa8875::setFontColor(uint16_t background,uint16_t foreground) -{ - /* Set Background Color */ - _bgColor = background; - writeReg(0x60, (background & 0xf800) >> 11); - writeReg(0x61, (background & 0x07e0) >> 5); - writeReg(0x62, (background & 0x001f)); - - /* Set Fore Color */ - _fgColor = foreground; - writeReg(0x63, (foreground & 0xf800) >> 11); - writeReg(0x64, (foreground & 0x07e0) >> 5); - writeReg(0x65, (foreground & 0x001f)); -} - - -void DmTftRa8875::setFontZoom(uint8_t Hsize,uint8_t Vsize) -{ - writeReg(0x22, ((Hsize & 0x03) <<2 | (Vsize & 0x03))); -} - -void DmTftRa8875::int2str(int n, char *str) -{ - char buf[10] = ""; - int i = 0; - int len = 0; - int temp = n < 0 ? -n: n; - - if (str == NULL) { - return; - } - while(temp) { - buf[i++] = (temp % 10) + '0'; - temp = temp / 10; - } - - len = n < 0 ? ++i: i; - str[i] = 0; - while(1) { - i--; - if (buf[len-i-1] ==0) { - break; - } - str[i] = buf[len-i-1]; - } - if (i == 0 ) { - str[i] = '-'; - } -} - -void DmTftRa8875::drawNumber(uint16_t x, uint16_t y, int num, int digitsToShow, bool leadingZeros) -{ - char p[10]; - int2str(num, p); - - // clear the last number on the screen; default font width is 8. - for(int i=0; i<digitsToShow; i++) - drawString(x+i*8, y," "); - - drawString(x, y, p); -} - - -void DmTftRa8875::drawString(uint16_t x, uint16_t y, const char *p) -{ - setAddress(0, 0, _width-1, _height-1); - - writeReg(0x40, (1 << 7) | (1 << 0)); // enter text mode - writeReg(0x2A, x); - writeReg(0x2B, x >> 8); - writeReg(0x2C, y); - writeReg(0x2D, y >> 8); - - writeReg(0x2F, 0x00); - writeReg(0x21, (0 << 7) | (0 << 5) | (0 << 1) | (0 << 0)); - sendCommand(0x02); - - while (*p != '\0') { - send8BitData(*p); - while ((readStatus() & 0x80) == 0x80); // wait finish - p++; - } - writeReg(0x40, (0 << 7)); // enter graphics mode -} - -void DmTftRa8875::drawStringCentered(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const char *p) -{ - - int len = strlen(p); - uint16_t tmp = len * 8; - if (tmp <= width) { - x += (width - tmp)/2; - } - if (16 <= height) { - y += (height - 16)/2; - } - - drawString(x, y, p); -} - -void DmTftRa8875::clearScreen(uint16_t color) -{ - rectangle(0, 0, _width-1, _height-1, color, true); -} - -void DmTftRa8875::rectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set x0 */ - writeReg(0x91, x0); - writeReg(0x92, x0 >> 8); - - /* Set y0 */ - writeReg(0x93, y0); - writeReg(0x94, y0 >> 8); - - /* Set x1 */ - writeReg(0x95, x1); - writeReg(0x96, x1 >> 8); - - /* Set y1 */ - writeReg(0x97, y1); - writeReg(0x98, y1 >> 8); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0x90, 0xB0); - } else { - writeReg(0x90, 0x90); - } - - /* Wait for the command to finish */ - while (readReg(0x90) & 0x80); -} - -void DmTftRa8875::drawRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) -{ - rectangle(x0, y0, x1, y1, color, false); -} -void DmTftRa8875::fillRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) -{ - rectangle(x0, y0, x1, y1, color, true); -} - -void DmTftRa8875::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set x0 */ - writeReg(0x91, x0); - writeReg(0x92, x0 >> 8); - - /* Set y0 */ - writeReg(0x93, y0); - writeReg(0x94, y0 >> 8); - - /* Set x1 */ - writeReg(0x95, x1); - writeReg(0x96, x1 >> 8); - - /* Set y1 */ - writeReg(0x97, y1); - writeReg(0x98, y1 >> 8); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - writeReg(0x90, 0x80); - - /* Wait for the command to finish */ - while (readReg(0x90) & 0x80); -} - -void DmTftRa8875::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) -{ - drawLine(x, y, x, y+length, color); -} - -void DmTftRa8875::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) -{ - drawLine(x, y, x+length, y, color); -} - -void DmTftRa8875::circle(int16_t x, int16_t y, int16_t r, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set x */ - writeReg(0x99, x); - writeReg(0x9A, x >> 8); - - /* Set y */ - writeReg(0x9B, y); - writeReg(0x9C, y >> 8); - - /* Set Radius */ - writeReg(0x9D, r); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0x90, 0x40 | 0x20); - } else { - writeReg(0x90, 0x40 | 0x00); - } - - /* Wait for the command to finish */ - while (readReg(0x90) & 0x40); -} - -void DmTftRa8875::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) -{ - circle(x0, y0, r, color, false); -} -void DmTftRa8875::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) -{ - circle(x0, y0, r, color, true); -} - -void DmTftRa8875::triangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set Point 0 */ - writeReg(0x91, x0); - writeReg(0x92, (x0 >> 8)); - writeReg(0x93, y0); - writeReg(0x94, (y0 >> 8)); - - /* Set Point 1 */ - writeReg(0x95, x1); - writeReg(0x96, (x1 >> 8)); - writeReg(0x97, y1); - writeReg(0x98, (y1 >> 8)); - - /* Set Point 2 */ - writeReg(0xA9, x2); - writeReg(0xAA, (x2 >> 8)); - writeReg(0xAB, y2); - writeReg(0xAC, (y2 >> 8)); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0x90, 0xA1); - } else { - writeReg(0x90, 0x81); - } - - /* Wait for the command to finish */ - while (readReg(0x90) & 0x80); -} - -void DmTftRa8875::drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) -{ - triangle(x0, y0, x1, y1, x2, y2, color, false); -} - -void DmTftRa8875::fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) -{ - triangle(x0, y0, x1, y1, x2, y2, color, true); -} - -void DmTftRa8875::ellipse(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set Center Point */ - writeReg(0xA5, x0); - writeReg(0xA6, (x0 >> 8)); - writeReg(0xA7, y0); - writeReg(0xA8, (y0 >> 8)); - - /* Set Long and Short Axis */ - writeReg(0xA1, longAxis); - writeReg(0xA2, (longAxis >> 8)); - writeReg(0xA3, shortAxis); - writeReg(0xA4, (shortAxis >> 8)); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0xA0, 0xC0); - } else { - writeReg(0xA0, 0x80); - } - - /* Wait for the command to finish */ - while (readReg(0xA0) & 0x80); - -} - -void DmTftRa8875::drawEllipse(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint16_t color) -{ - ellipse(x0, y0, longAxis, shortAxis, color, false); -} - -void DmTftRa8875::fillEllipse(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint16_t color) -{ - ellipse(x0, y0, longAxis, shortAxis, color, true); -} - -void DmTftRa8875::curve(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set Center Point */ - writeReg(0xA5, x0); - writeReg(0xA6, (x0 >> 8)); - writeReg(0xA7, y0); - writeReg(0xA8, (y0 >> 8)); - - /* Set Long and Short Axis */ - writeReg(0xA1, longAxis); - writeReg(0xA2, (longAxis >> 8)); - writeReg(0xA3, shortAxis); - writeReg(0xA4, (shortAxis >> 8)); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0xA0, 0xD0 | (curvePart & 0x03)); - } else { - writeReg(0xA0, 0x90 | (curvePart & 0x03)); - } - - /* Wait for the command to finish */ - while (readReg(0xA0) & 0x80); - -} - -void DmTftRa8875::drawCurve(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color) -{ - curve(x0, y0, longAxis, shortAxis, curvePart, color, false); -} - -void DmTftRa8875::fillCurve(int16_t x0, int16_t y0, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color) -{ - curve(x0, y0, longAxis, shortAxis, curvePart, color, true); -} - -void DmTftRa8875::roundrectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t r1, uint16_t r2, uint16_t color, bool filled) -{ - setAddress(0, 0, _width-1, _height-1); - - /* Set x0 */ - writeReg(0x91, x0); - writeReg(0x92, x0 >> 8); - - /* Set y0 */ - writeReg(0x93, y0); - writeReg(0x94, y0 >> 8); - - /* Set x1 */ - writeReg(0x95, x1); - writeReg(0x96, x1 >> 8); - - /* Set y1 */ - writeReg(0x97, y1); - writeReg(0x98, y1 >> 8); - - /* Set Radius */ - writeReg(0xA1, r1); - writeReg(0xA2, r1 >> 8); - writeReg(0xA3, r2); - writeReg(0xA4, r2 >> 8); - - /* Set Color */ - writeReg(0x63, (color & 0xf800) >> 11); - writeReg(0x64, (color & 0x07e0) >> 5); - writeReg(0x65, (color & 0x001f)); - - /* Draw! */ - if (filled) { - writeReg(0xA0, 0xE0); - } else { - writeReg(0xA0, 0xA0); - } - - /* Wait for the command to finish */ - while (readReg(0xA0) & 0x80); -} - -void DmTftRa8875::drawRoundRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t r1, uint16_t r2, uint16_t color) -{ - roundrectangle(x0, y0, x1, y1, r1, r2, color, false); -} -void DmTftRa8875::fillRoundRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t r1, uint16_t r2, uint16_t color) -{ - roundrectangle(x0, y0, x1, y1, r1, r2, color, true); -} -/********************************************************************************************************* - END FILE -*********************************************************************************************************/