Created
March 2, 2017 19:03
-
-
Save me-no-dev/7cb903262e266de909d39ad4420d92d5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "SPI.h" | |
#include "Adafruit_GFX.h" | |
#include "Adafruit_ILI9341.h" | |
#ifdef ESP32 | |
#define ILI_CS 22 | |
#define ILI_DC 21 | |
#define ILI_RST 18 | |
#define ILI_SCLK 19 | |
#define ILI_MOSI 23 | |
#define ILI_MISO 25 | |
#elif defined(ESP8266) | |
#define ILI_CS 4 //D2 | |
#define ILI_DC 5 //D1 | |
#define ILI_RST 16 //D0 | |
#define ILI_SCLK 14 //D5 | |
#define ILI_MOSI 13 //D7 | |
#define ILI_MISO 12 //D6 | |
#elif defined(RASPI) | |
#define ILI_CS 8 | |
#define ILI_DC 7 | |
#define ILI_RST 25 | |
#define ILI_SCLK 11 | |
#define ILI_MOSI 10 | |
#define ILI_MISO 9 | |
#elif defined(ARDUINO_ARCH_STM32F1) | |
#define ILI_CS PA4 //7 | |
#define ILI_DC PA3 //8 | |
#define ILI_RST PA2 //9 | |
#define ILI_SCLK PA5 //6 | |
#define ILI_MOSI PA7 //4 | |
#define ILI_MISO PA6 //5 | |
#elif defined(__AVR__) | |
#define ILI_CS 10 | |
#define ILI_DC 9 | |
#define ILI_RST 8 | |
#define ILI_SCLK SCK | |
#define ILI_MOSI MOSI | |
#define ILI_MISO MISO | |
#else | |
#error Unknown board | |
#endif | |
Adafruit_ILI9341 tft = Adafruit_ILI9341(ILI_CS,ILI_DC,ILI_RST); | |
//Adafruit_ILI9341 tft = Adafruit_ILI9341(ILI_CS,ILI_DC,ILI_MOSI,ILI_SCLK,ILI_RST,ILI_MISO); | |
unsigned long testFillScreen() { | |
unsigned long start = micros(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
tft.fillScreen(ILI9341_RED); | |
yield(); | |
tft.fillScreen(ILI9341_GREEN); | |
yield(); | |
tft.fillScreen(ILI9341_BLUE); | |
yield(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
return micros() - start; | |
} | |
unsigned long testText() { | |
tft.fillScreen(ILI9341_BLACK); | |
unsigned long start = micros(); | |
tft.setCursor(0, 0); | |
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); | |
tft.println("Hello World!"); | |
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); | |
tft.println(1234.56); | |
tft.setTextColor(ILI9341_RED); tft.setTextSize(3); | |
tft.println(0xDEADBEEF, HEX); | |
tft.println(); | |
tft.setTextColor(ILI9341_GREEN); | |
tft.setTextSize(5); | |
tft.println("Groop"); | |
tft.setTextSize(2); | |
tft.println("I implore thee,"); | |
tft.setTextSize(1); | |
tft.println("my foonting turlingdromes."); | |
tft.println("And hooptiously drangle me"); | |
tft.println("with crinkly bindlewurdles,"); | |
tft.println("Or I will rend thee"); | |
tft.println("in the gobberwarts"); | |
tft.println("with my blurglecruncheon,"); | |
tft.println("see if I don't!"); | |
return micros() - start; | |
} | |
unsigned long testLines(uint16_t color) { | |
unsigned long start, t; | |
int x1, y1, x2, y2, | |
w = tft.width(), | |
h = tft.height(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
x1 = y1 = 0; | |
y2 = h - 1; | |
start = micros(); | |
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
x2 = w - 1; | |
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
t = micros() - start; // fillScreen doesn't count against timing | |
yield(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
x1 = w - 1; | |
y1 = 0; | |
y2 = h - 1; | |
start = micros(); | |
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
x2 = 0; | |
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
t += micros() - start; | |
yield(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
x1 = 0; | |
y1 = h - 1; | |
y2 = 0; | |
start = micros(); | |
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
x2 = w - 1; | |
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
t += micros() - start; | |
yield(); | |
tft.fillScreen(ILI9341_BLACK); | |
yield(); | |
x1 = w - 1; | |
y1 = h - 1; | |
y2 = 0; | |
start = micros(); | |
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
x2 = 0; | |
yield(); | |
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color); | |
yield(); | |
return micros() - start; | |
} | |
unsigned long testFastLines(uint16_t color1, uint16_t color2) { | |
unsigned long start; | |
int x, y, w = tft.width(), h = tft.height(); | |
tft.fillScreen(ILI9341_BLACK); | |
start = micros(); | |
for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1); | |
for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2); | |
return micros() - start; | |
} | |
unsigned long testRects(uint16_t color) { | |
unsigned long start; | |
int n, i, i2, | |
cx = tft.width() / 2, | |
cy = tft.height() / 2; | |
tft.fillScreen(ILI9341_BLACK); | |
n = min(tft.width(), tft.height()); | |
start = micros(); | |
for(i=2; i<n; i+=6) { | |
i2 = i / 2; | |
tft.drawRect(cx-i2, cy-i2, i, i, color); | |
} | |
return micros() - start; | |
} | |
unsigned long testFilledRects(uint16_t color1, uint16_t color2) { | |
unsigned long start, t = 0; | |
int n, i, i2, | |
cx = tft.width() / 2 - 1, | |
cy = tft.height() / 2 - 1; | |
tft.fillScreen(ILI9341_BLACK); | |
n = min(tft.width(), tft.height()); | |
for(i=n; i>0; i-=6) { | |
i2 = i / 2; | |
start = micros(); | |
tft.fillRect(cx-i2, cy-i2, i, i, color1); | |
t += micros() - start; | |
// Outlines are not included in timing results | |
tft.drawRect(cx-i2, cy-i2, i, i, color2); | |
yield(); | |
} | |
return t; | |
} | |
unsigned long testFilledCircles(uint8_t radius, uint16_t color) { | |
unsigned long start; | |
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; | |
tft.fillScreen(ILI9341_BLACK); | |
start = micros(); | |
for(x=radius; x<w; x+=r2) { | |
for(y=radius; y<h; y+=r2) { | |
tft.fillCircle(x, y, radius, color); | |
} | |
} | |
return micros() - start; | |
} | |
unsigned long testCircles(uint8_t radius, uint16_t color) { | |
unsigned long start; | |
int x, y, r2 = radius * 2, | |
w = tft.width() + radius, | |
h = tft.height() + radius; | |
// Screen is not cleared for this one -- this is | |
// intentional and does not affect the reported time. | |
start = micros(); | |
for(x=0; x<w; x+=r2) { | |
for(y=0; y<h; y+=r2) { | |
tft.drawCircle(x, y, radius, color); | |
} | |
yield(); | |
} | |
return micros() - start; | |
} | |
unsigned long testTriangles() { | |
unsigned long start; | |
int n, i, cx = tft.width() / 2 - 1, | |
cy = tft.height() / 2 - 1; | |
tft.fillScreen(ILI9341_BLACK); | |
n = min(cx, cy); | |
start = micros(); | |
for(i=0; i<n; i+=5) { | |
tft.drawTriangle( | |
cx , cy - i, // peak | |
cx - i, cy + i, // bottom left | |
cx + i, cy + i, // bottom right | |
tft.color565(i, i, i)); | |
} | |
return micros() - start; | |
} | |
unsigned long testFilledTriangles() { | |
unsigned long start, t = 0; | |
int i, cx = tft.width() / 2 - 1, | |
cy = tft.height() / 2 - 1; | |
tft.fillScreen(ILI9341_BLACK); | |
start = micros(); | |
for(i=min(cx,cy); i>10; i-=5) { | |
start = micros(); | |
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, | |
tft.color565(0, i*10, i*10)); | |
t += micros() - start; | |
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, | |
tft.color565(i*10, i*10, 0)); | |
yield(); | |
} | |
return t; | |
} | |
unsigned long testRoundRects() { | |
unsigned long start; | |
int w, i, i2, | |
cx = tft.width() / 2 - 1, | |
cy = tft.height() / 2 - 1; | |
tft.fillScreen(ILI9341_BLACK); | |
w = min(tft.width(), tft.height()); | |
start = micros(); | |
for(i=0; i<w; i+=6) { | |
i2 = i / 2; | |
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0)); | |
} | |
return micros() - start; | |
} | |
unsigned long testFilledRoundRects() { | |
unsigned long start; | |
int i, i2, | |
cx = tft.width() / 2 - 1, | |
cy = tft.height() / 2 - 1; | |
tft.fillScreen(ILI9341_BLACK); | |
start = micros(); | |
for(i=min(tft.width(), tft.height()); i>20; i-=6) { | |
i2 = i / 2; | |
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); | |
yield(); | |
} | |
return micros() - start; | |
} | |
void runLcdTest(){ | |
Serial.println(F("====== Adafruit ILI9341 Display Test =======")); | |
Serial.println("============================================"); | |
uint8_t x = tft.readcommand8(ILI9341_RDMODE); | |
Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); | |
x = tft.readcommand8(ILI9341_RDMADCTL); | |
Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); | |
x = tft.readcommand8(ILI9341_RDPIXFMT); | |
Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); | |
x = tft.readcommand8(ILI9341_RDIMGFMT); | |
Serial.print("Image Format: 0x"); Serial.println(x, HEX); | |
x = tft.readcommand8(ILI9341_RDSELFDIAG); | |
Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); | |
Serial.println("============================================"); | |
Serial.println(F("Benchmark Time (microseconds)")); | |
Serial.println("============================================"); | |
delay(10); | |
Serial.print(F("Screen fill ")); | |
Serial.println(testFillScreen()); | |
delay(500); | |
Serial.print(F("Text ")); | |
Serial.println(testText()); | |
delay(3000); | |
Serial.print(F("Lines ")); | |
Serial.println(testLines(ILI9341_CYAN)); | |
delay(500); | |
Serial.print(F("Horiz/Vert Lines ")); | |
Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); | |
delay(500); | |
Serial.print(F("Rectangles (outline) ")); | |
Serial.println(testRects(ILI9341_GREEN)); | |
delay(500); | |
Serial.print(F("Rectangles (filled) ")); | |
Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); | |
delay(500); | |
Serial.print(F("Circles (filled) ")); | |
Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); | |
Serial.print(F("Circles (outline) ")); | |
Serial.println(testCircles(10, ILI9341_WHITE)); | |
delay(500); | |
Serial.print(F("Triangles (outline) ")); | |
Serial.println(testTriangles()); | |
delay(500); | |
Serial.print(F("Triangles (filled) ")); | |
Serial.println(testFilledTriangles()); | |
delay(500); | |
Serial.print(F("Rounded rects (outline) ")); | |
Serial.println(testRoundRects()); | |
delay(500); | |
Serial.print(F("Rounded rects (filled) ")); | |
Serial.println(testFilledRoundRects()); | |
delay(500); | |
Serial.println(F("Done!")); | |
} | |
void onButton(){ | |
runLcdTest(); | |
} | |
void setup(){ | |
pinMode(0, INPUT_PULLUP); | |
Serial.begin(115200); | |
Serial.setDebugOutput(true); | |
Serial.println("Starting..."); | |
delay(2000); | |
#ifdef ESP32 | |
SPI.begin(ILI_SCLK, ILI_MISO, ILI_MOSI, -1); | |
#endif | |
tft.begin(); | |
runLcdTest(); | |
} | |
void loop(){ | |
static uint8_t lastPinState = 1; | |
uint8_t pinState = digitalRead(0); | |
if(!pinState && lastPinState){ | |
onButton(); | |
} | |
lastPinState = pinState; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment