mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-16 11:21:18 +03:00
Adafruit_ILI9341 +7% speed now at 327,45% total
This commit is contained in:
@ -479,16 +479,31 @@ void Adafruit_ILI9341::begin(void) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
|
||||
spiCsLow();
|
||||
setAddrWindow_(x0, y0, x1, y1);
|
||||
spiCsHigh();
|
||||
}
|
||||
|
||||
uint8_t buffC[] = {(uint8_t)(x0 >> 8), (uint8_t)x0, (uint8_t)(x1 >> 8), (uint8_t)x1};
|
||||
uint8_t buffP[] = {(uint8_t)(y0 >> 8), (uint8_t)y0, (uint8_t)(y1 >> 8), (uint8_t)y1};
|
||||
void Adafruit_ILI9341::setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
|
||||
|
||||
writeCmdData(ILI9341_CASET, &buffC[0], sizeof(buffC)); // Column addr set
|
||||
writeCmdData(ILI9341_PASET, &buffP[0], sizeof(buffP)); // Column addr set
|
||||
uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 };
|
||||
uint8_t buffP[] = { (uint8_t) (y0 >> 8), (uint8_t) y0, (uint8_t) (y1 >> 8), (uint8_t) y1 };
|
||||
|
||||
spiDcLow();
|
||||
spiwrite(ILI9341_CASET);
|
||||
spiDcHigh();
|
||||
spiwriteBytes(&buffC[0], sizeof(buffC));
|
||||
|
||||
spiDcLow();
|
||||
spiwrite(ILI9341_PASET);
|
||||
spiDcHigh();
|
||||
spiwriteBytes(&buffP[0], sizeof(buffP));
|
||||
|
||||
spiDcLow();
|
||||
spiwrite(ILI9341_RAMWR);
|
||||
spiDcHigh();
|
||||
|
||||
writecommand(ILI9341_RAMWR); // write to RAM
|
||||
}
|
||||
|
||||
|
||||
@ -512,13 +527,18 @@ void Adafruit_ILI9341::pushColor(uint16_t color) {
|
||||
|
||||
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
|
||||
if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(hwSPI) {
|
||||
spi_begin();
|
||||
}
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x,y,x+1,y+1);
|
||||
spiDcHigh();
|
||||
spiCsLow();
|
||||
|
||||
setAddrWindow_(x, y, x + 1, y + 1);
|
||||
|
||||
#ifdef ESP8266
|
||||
spiwrite16(color);
|
||||
#else
|
||||
@ -528,55 +548,59 @@ void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
spiCsHigh();
|
||||
|
||||
if (hwSPI) spi_end();
|
||||
if(hwSPI) {
|
||||
spi_end();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
|
||||
uint16_t color) {
|
||||
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((y + h - 1) >= _height) h = _height - y;
|
||||
|
||||
if((y+h-1) >= _height)
|
||||
h = _height-y;
|
||||
if(hwSPI) {
|
||||
spi_begin();
|
||||
}
|
||||
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x, y, x, y+h-1);
|
||||
#ifndef ESP8266
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
#endif
|
||||
|
||||
spiDcHigh();
|
||||
spiCsLow();
|
||||
|
||||
setAddrWindow_(x, y, x, (y + h - 1));
|
||||
|
||||
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
|
||||
spiwritePattern(&colorBin[0], 2, h);
|
||||
|
||||
spiCsHigh();
|
||||
|
||||
if (hwSPI) spi_end();
|
||||
if(hwSPI) {
|
||||
spi_end();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
|
||||
uint16_t color) {
|
||||
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x+w-1) >= _width) w = _width-x;
|
||||
if (hwSPI) spi_begin();
|
||||
setAddrWindow(x, y, x+w-1, y);
|
||||
|
||||
if(hwSPI) {
|
||||
spi_begin();
|
||||
}
|
||||
|
||||
spiDcHigh();
|
||||
spiCsLow();
|
||||
|
||||
setAddrWindow_(x, y, (x + w - 1), y);
|
||||
|
||||
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
|
||||
spiwritePattern(&colorBin[0], 2, w);
|
||||
|
||||
spiCsHigh();
|
||||
|
||||
if (hwSPI) spi_end();
|
||||
if(hwSPI) {
|
||||
spi_end();
|
||||
}
|
||||
}
|
||||
|
||||
void Adafruit_ILI9341::fillScreen(uint16_t color) {
|
||||
@ -598,11 +622,10 @@ void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint
|
||||
spi_begin();
|
||||
}
|
||||
|
||||
setAddrWindow(x, y, x + w - 1, y + h - 1);
|
||||
|
||||
spiDcHigh();
|
||||
spiCsLow();
|
||||
|
||||
setAddrWindow_(x, y, x + w - 1, y + h - 1);
|
||||
|
||||
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
|
||||
spiwritePattern(&colorBin[0], 2, (w * h));
|
||||
|
||||
|
@ -161,16 +161,20 @@ class Adafruit_ILI9341 : public Adafruit_GFX {
|
||||
|
||||
uint8_t spiread(void);
|
||||
|
||||
|
||||
#ifdef ESP8266
|
||||
inline void spiwrite(uint8_t data);
|
||||
inline void spiwrite16(uint16_t data);
|
||||
inline void spiwriteBytes(uint8_t * data, uint8_t size);
|
||||
inline void spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat);
|
||||
|
||||
inline void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
|
||||
#else
|
||||
void spiwrite(uint8_t);
|
||||
void spiwrite16(uint16_t data);
|
||||
void spiwriteBytes(uint8_t * data, uint8_t size);
|
||||
void spiwritePattern(uint8_t * data, uint8_t size, uint8_t repeat);
|
||||
void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
|
||||
#endif
|
||||
|
||||
inline void spiCsHigh(void);
|
||||
|
Reference in New Issue
Block a user