/***************************************************
This program works for the generic Banggood 2.4" TFT board/shield mounted on an Arduino UNO
It demonstrates a number of TFT library functions which are available from multiple sources
and it represents a highly modified version of the open source GFX example for the Adafruit ILI9341
Breakout and Shield. Caveat emptor, you get what you pay for. The Banggood product can, without
adding insulation, short out to the USB enclosure on the Arduino board and the Manufacturer often uses
alternate TFT displays which may or may not work perfectly with the code below
For reliability and documentation check out the link below for the Adafruit product, a stable design
with fully documented software Adafruit has invested time and resources providing this open source code,
and they would greatly appreciate your support by purchasing Adafruit's open-source hardware directly
from Adafruit! ----> http://www.adafruit.com/products/1651
Libraries were modified by rogerclarkmelbourne and victorpv at:
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1/libraries/Adafruit_GFX_AS
Sketch and libraries were modified by KB1UIF (A.Tedds)
further modified to provide correct color palette by MODAL (E. Kimble)
Uses 8bit Communication for ili9341 or Samsung Driver Chip!!
Colors are 5 bits-red, 1 bit blank, 5 bits-green, 5 bits-blue, all combined in the order given into a single 16 bit unsigned integer
Code was initially written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above should be included in any redistribution. All parts of this work have been modified.
****************************************************/
#include <Adafruit_GFX_AS.h> // Modified Adafruit Core graphics library
#include <Adafruit_ILI9341_8bit_AS.h> // Modified Hardware-specific library, 8bit Modified from Adafruit Lib.
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define ORANGE 0xFF40
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GRAY1 0x8888
#define GRAY2 0xAAAA
Adafruit_ILI9341_8bit_AS tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
void setup() {
Serial.begin(9600);
Serial.println("ILI9341 Test!");
tft.begin();
// read diagnostics (optional but can help debug problems)
//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(F("Benchmark Time (microseconds)"));
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(CYAN));
delay(500);
Serial.print(F("Horiz/Vert Lines "));
Serial.println(testFastLines(RED, BLUE));
delay(500);
Serial.print(F("Rectangles (outline) "));
Serial.println(testRects(GREEN));
delay(500);
Serial.print(F("Rectangles (filled) "));
Serial.println(testFilledRects(YELLOW, MAGENTA));
delay(500);
Serial.print(F("Circles (filled) "));
Serial.println(testFilledCircles(10, MAGENTA));
Serial.print(F("Circles (outline) "));
Serial.println(testCircles(10, 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);
tft.setRotation(2);
testText();
Serial.println(F("Done!"));}
void loop(void) {
//to demo text rotation, uncomment following code including end curly bracket
// for(uint8_t rotation=0; rotation<4; rotation++) {
// tft.setRotation(rotation);
// testText();
delay(10000);
// }
}
//*********************************Subroutines *******************************
unsigned long testFillScreen() {
unsigned long start = micros();
tft.fillScreen(BLACK);
tft.fillScreen(RED);
tft.fillScreen(GREEN);
tft.fillScreen(WHITE);
tft.fillScreen(GRAY1);
tft.fillScreen(YELLOW);
tft.fillScreen(BLUE);
tft.fillScreen(BLACK);
return micros() - start;}
//*********************
unsigned long testText() {
tft.fillScreen(BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(WHITE); tft.setTextSize(3);
tft.println("Hello World!");
tft.setTextColor(YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(ORANGE);
tft.setTextSize(5);
tft.println("Group");
tft.setTextSize(2);
tft.setTextColor(GREEN);
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;
uint16_t cc;
int a=0;
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();
tft.fillScreen(BLACK);
x1 = y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=3){
if (a<64) {a++; cc= a*64;}
if (a==32) cc=YELLOW;
if (a==64) cc=color;
tft.drawLine(x1, y1, x2, y2, cc);}
x2 = w - 1;a=0;
for(y2=0; y2<h; y2+=3) {
if (a<64) {a++; cc= a*64;} //Shades of green
if (a==64) cc=ORANGE;
tft.drawLine(x1, y1, x2, y2, cc);}
t = micros() - start; // fillScreen doesn't count against timing
tft.fillScreen(BLACK);
x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, BLUE);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, RED);
t += micros() - start;
tft.fillScreen(BLACK);
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;
tft.fillScreen(BLACK);
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;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
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(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(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(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); }
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(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); } }
return micros() - start;}
//*********************
unsigned long testTriangles() {
unsigned long start;
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(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(0, 0, 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(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, i));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i, i, 0)); }
return t;}
//*********************
unsigned long testRoundRects() {
unsigned long start;
int w, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(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(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)); }
return micros() - start;}
//*********************
|