// the C/D pin is low during write void TFTLCD::writeCommand(uint16_t cmd) { volatile uint8_t *wrportreg = portOutputRegister(wrport); *portOutputRegister(csport) &= ~cspin; //digitalWrite(_cs, LOW); *portOutputRegister(cdport) &= ~cdpin; //digitalWrite(_cd, LOW); *portOutputRegister(rdport) |= rdpin; //digitalWrite(_rd, HIGH); *wrportreg |= wrpin; //digitalWrite(_wr, HIGH); setWriteDir(); write8(cmd >> 8); *wrportreg &= ~wrpin; //digitalWrite(_wr, LOW); *wrportreg |= wrpin; //digitalWrite(_wr, HIGH); write8(cmd); *wrportreg &= ~wrpin; //digitalWrite(_wr, LOW); *wrportreg |= wrpin; //digitalWrite(_wr, HIGH); *portOutputRegister(csport) |= cspin; }
// Initialization common to both shield & breakout configs void Adafruit_TFTLCD::init(void) { #ifdef USE_ADAFRUIT_SHIELD_PINOUT CS_IDLE; // Set all control bits to idle state WR_IDLE; RD_IDLE; CD_DATA; digitalWrite(5, HIGH); // Reset line pinMode(A3, OUTPUT); // Enable outputs pinMode(A2, OUTPUT); pinMode(A1, OUTPUT); pinMode(A0, OUTPUT); pinMode( 5, OUTPUT); #endif setWriteDir(); // Set up LCD data port(s) for WRITE operations rotation = 0; cursor_y = cursor_x = 0; textsize = 1; textcolor = 0xFFFF; _width = TFTWIDTH; _height = TFTHEIGHT; }
void TFTLCD::fillScreen(uint16_t color) { goHome(); uint32_t i; i = 320; i *= 240; *portOutputRegister(csport) &= ~cspin; //digitalWrite(_cs, LOW); *portOutputRegister(cdport) |= cdpin; //digitalWrite(_cd, HIGH); *portOutputRegister(rdport) |= rdpin; //digitalWrite(_rd, HIGH); *portOutputRegister(wrport) |= wrpin; //digitalWrite(_wr, HIGH); setWriteDir(); while (i--) { writeData_unsafe(color); } *portOutputRegister(csport) |= cspin; //digitalWrite(_cs, HIGH); }
void TFTLCD::drawFastLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color, uint8_t rotflag) { uint16_t newentrymod; switch (rotation) { case 0: if (rotflag) newentrymod = 0x1028; // we want a 'vertical line' else newentrymod = 0x1030; // we want a 'horizontal line' break; case 1: swap(x, y); // first up fix the X x = TFTWIDTH - x - 1; if (rotflag) newentrymod = 0x1000; // we want a 'vertical line' else newentrymod = 0x1028; // we want a 'horizontal line' break; case 2: x = TFTWIDTH - x - 1; y = TFTHEIGHT - y - 1; if (rotflag) newentrymod = 0x1008; // we want a 'vertical line' else newentrymod = 0x1020; // we want a 'horizontal line' break; case 3: swap(x,y); y = TFTHEIGHT - y - 1; if (rotflag) newentrymod = 0x1030; // we want a 'vertical line' else newentrymod = 0x1008; // we want a 'horizontal line' break; } writeRegister(TFTLCD_ENTRY_MOD, newentrymod); writeRegister(TFTLCD_GRAM_HOR_AD, x); // GRAM Address Set (Horizontal Address) (R20h) writeRegister(TFTLCD_GRAM_VER_AD, y); // GRAM Address Set (Vertical Address) (R21h) writeCommand(TFTLCD_RW_GRAM); // Write Data to GRAM (R22h) *portOutputRegister(csport) &= ~cspin; //digitalWrite(_cs, LOW); *portOutputRegister(cdport) |= cdpin; //digitalWrite(_cd, HIGH); *portOutputRegister(rdport) |= rdpin; //digitalWrite(_rd, HIGH); *portOutputRegister(wrport) |= wrpin; //digitalWrite(_wr, HIGH); setWriteDir(); while (length--) { writeData_unsafe(color); } // set back to default *portOutputRegister(csport) |= cspin; //digitalWrite(_cs, HIGH); writeRegister(TFTLCD_ENTRY_MOD, 0x1030); }