365 lines
8.8 KiB
C++
365 lines
8.8 KiB
C++
// Demo based on:
|
|
// UTFT_Demo_320x240 by Henning Karlsen
|
|
// web: http://www.henningkarlsen.com/electronics
|
|
//
|
|
/*
|
|
|
|
This sketch uses the GLCD and font 2 only. Disable other fonts to make
|
|
the sketch fit in an UNO!
|
|
|
|
Make sure all the required fonts are loaded by editting the
|
|
User_Setup.h file in the TFT_eSPI library folder.
|
|
|
|
The library uses the hardware SPI pins only:
|
|
For UNO, Nano, Micro Pro ATmega328 based processors
|
|
MOSI = pin 11, SCK = pin 13
|
|
For Mega:
|
|
MOSI = pin 51, SCK = pin 52
|
|
|
|
The pins used for the TFT chip select (CS) and Data/command (DC) and Reset (RST)
|
|
signal lines to the TFT must also be defined in the library User_Setup.h file.
|
|
|
|
Sugested TFT connections for UNO and Atmega328 based boards
|
|
sclk 13 // Don't change, this is the hardware SPI SCLK line
|
|
mosi 11 // Don't change, this is the hardware SPI MOSI line
|
|
cs 10 // Chip select for TFT display
|
|
dc 9 // Data/command line
|
|
rst 7 // Reset, you could connect this to the Arduino reset pin
|
|
|
|
Suggested TFT connections for the MEGA and ATmega2560 based boards
|
|
sclk 52 // Don't change, this is the hardware SPI SCLK line
|
|
mosi 51 // Don't change, this is the hardware SPI MOSI line
|
|
cs 47 // TFT chip select line
|
|
dc 48 // TFT data/command line
|
|
rst 44 // you could alternatively connect this to the Arduino reset
|
|
|
|
#########################################################################
|
|
###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ######
|
|
###### TO SELECT THE FONTS AND PINS YOU USE, SEE ABOVE ######
|
|
#########################################################################
|
|
*/
|
|
|
|
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
|
|
#include <SPI.h>
|
|
|
|
TFT_eSPI myGLCD = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
|
|
|
|
#define DELAY 500
|
|
|
|
#define TFT_GREY 0x7BEF
|
|
#define TFT_W 160
|
|
#define TFT_H 128
|
|
|
|
unsigned long runTime = 0;
|
|
void setup()
|
|
{
|
|
randomSeed(analogRead(A0));
|
|
pinMode(7, OUTPUT);
|
|
digitalWrite(7, LOW);
|
|
delay(10);
|
|
digitalWrite(7, HIGH);
|
|
// Setup the LCD
|
|
myGLCD.init();
|
|
myGLCD.setRotation(1);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
randomSeed(millis());
|
|
//randomSeed(1234); // This ensure test is repeatable with exact same draws each loop
|
|
int buf[TFT_W-2];
|
|
int x, x2;
|
|
int y, y2;
|
|
int r;
|
|
runTime = millis();
|
|
// Clear the screen and draw the frame
|
|
myGLCD.fillScreen(TFT_BLACK);
|
|
|
|
|
|
myGLCD.fillRect(0, 0, TFT_W-1, 14,TFT_RED);
|
|
|
|
myGLCD.fillRect(0, TFT_H-14, TFT_W-1, 14,TFT_GREY);
|
|
|
|
myGLCD.setTextColor(TFT_BLACK,TFT_RED);
|
|
myGLCD.drawCentreString("* TFT_S6D02A1 *", TFT_W/2, 4, 1);
|
|
myGLCD.setTextColor(TFT_YELLOW,TFT_GREY);
|
|
myGLCD.drawCentreString("Adapted by Bodmer", TFT_W/2, TFT_H-12,1);
|
|
|
|
myGLCD.drawRect(0, 14, TFT_W-1, TFT_H-28, TFT_BLUE);
|
|
|
|
// Draw crosshairs
|
|
myGLCD.drawLine(TFT_W/2-1, 15, TFT_W/2-1, TFT_H-16,TFT_BLUE);
|
|
myGLCD.drawLine(1, TFT_H/2-1, TFT_W-2, TFT_H/2-1,TFT_BLUE);
|
|
for (int i=9; i<TFT_W-1; i+=10)
|
|
myGLCD.drawLine(i, TFT_H/2-3, i, TFT_H/2+1,TFT_BLUE);
|
|
for (int i=19; i<TFT_H-20; i+=10)
|
|
myGLCD.drawLine(TFT_W/2-3, i, TFT_W/2+1, i,TFT_BLUE);
|
|
|
|
// Draw sin-, cos- and tan-lines
|
|
myGLCD.setTextColor(TFT_CYAN);
|
|
myGLCD.drawString("Sin", 5, 15,2);
|
|
for (int i=1; i<TFT_W-2; i++)
|
|
{
|
|
myGLCD.drawPixel(i,TFT_H/2-1+(sin(((i*2.26)*3.14)/180)*48),TFT_CYAN);
|
|
}
|
|
myGLCD.setTextColor(TFT_RED);
|
|
myGLCD.drawString("Cos", 5, 30,2);
|
|
for (int i=1; i<TFT_W-2; i++)
|
|
{
|
|
myGLCD.drawPixel(i,TFT_H/2-1+(cos(((i*2.26)*3.14)/180)*48),TFT_RED);
|
|
}
|
|
myGLCD.setTextColor(TFT_YELLOW);
|
|
myGLCD.drawString("Tan", 5, 45,2);
|
|
for (int i=1; i<TFT_W-2; i++)
|
|
{
|
|
myGLCD.drawPixel(i,TFT_H/2-1+(tan(((i*2.26)*3.14)/180)),TFT_YELLOW);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
myGLCD.drawLine(TFT_W/2-1, 15, TFT_W/2-1, TFT_H-16,TFT_BLUE);
|
|
myGLCD.drawLine(1, TFT_H/2-1, TFT_W-2, TFT_H/2-1,TFT_BLUE);
|
|
int col = 0;
|
|
// Draw a moving sinewave
|
|
x=1;
|
|
for (int i=1; i<((TFT_W-3)*20); i++)
|
|
{
|
|
x++;
|
|
if (x==TFT_W-2)
|
|
x=1;
|
|
if (i>TFT_W-2)
|
|
{
|
|
if ((x==TFT_W/2-1)||(buf[x-1]==TFT_H/2-1))
|
|
col = TFT_BLUE;
|
|
else
|
|
myGLCD.drawPixel(x,buf[x-1],TFT_BLACK);
|
|
}
|
|
y=TFT_H/2 +(sin(((i*2.2)*3.14)/180)*(49-(i / 100)));
|
|
myGLCD.drawPixel(x,y,TFT_BLUE);
|
|
buf[x-1]=y;
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some filled rectangles
|
|
for (int i=1; i<6; i++)
|
|
{
|
|
switch (i)
|
|
{
|
|
case 1:
|
|
col = TFT_MAGENTA;
|
|
break;
|
|
case 2:
|
|
col = TFT_RED;
|
|
break;
|
|
case 3:
|
|
col = TFT_GREEN;
|
|
break;
|
|
case 4:
|
|
col = TFT_BLUE;
|
|
break;
|
|
case 5:
|
|
col = TFT_YELLOW;
|
|
break;
|
|
}
|
|
myGLCD.fillRect(30+(i*10), 20+(i*10), 30, 30,col);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some filled, rounded rectangles
|
|
for (int i=1; i<6; i++)
|
|
{
|
|
switch (i)
|
|
{
|
|
case 1:
|
|
col = TFT_MAGENTA;
|
|
break;
|
|
case 2:
|
|
col = TFT_RED;
|
|
break;
|
|
case 3:
|
|
col = TFT_GREEN;
|
|
break;
|
|
case 4:
|
|
col = TFT_BLUE;
|
|
break;
|
|
case 5:
|
|
col = TFT_YELLOW;
|
|
break;
|
|
}
|
|
myGLCD.fillRoundRect(TFT_W/2+20-(i*10), 20+(i*10), 30,30, 3,col);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some filled circles
|
|
for (int i=1; i<6; i++)
|
|
{
|
|
switch (i)
|
|
{
|
|
case 1:
|
|
col = TFT_MAGENTA;
|
|
break;
|
|
case 2:
|
|
col = TFT_RED;
|
|
break;
|
|
case 3:
|
|
col = TFT_GREEN;
|
|
break;
|
|
case 4:
|
|
col = TFT_BLUE;
|
|
break;
|
|
case 5:
|
|
col = TFT_YELLOW;
|
|
break;
|
|
}
|
|
myGLCD.fillCircle(45+(i*10),30+(i*10), 15,col);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some lines in a pattern
|
|
|
|
for (int i=15; i<TFT_H-16; i+=5)
|
|
{
|
|
myGLCD.drawLine(1, i, (i*1.44)-10, TFT_H-17,TFT_RED);
|
|
}
|
|
|
|
for (int i=TFT_H-17; i>15; i-=5)
|
|
{
|
|
myGLCD.drawLine(TFT_W-3, i, (i*1.44)-11, 15,TFT_RED);
|
|
}
|
|
|
|
for (int i=TFT_H-17; i>15; i-=5)
|
|
{
|
|
myGLCD.drawLine(1, i, TFT_W+11-(i*1.44), 15,TFT_CYAN);
|
|
}
|
|
|
|
for (int i=15; i<TFT_H-16; i+=5)
|
|
{
|
|
myGLCD.drawLine(TFT_W-3, i, TFT_W+10-(i*1.44), TFT_H-17,TFT_CYAN);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some random circles
|
|
for (int i=0; i<100; i++)
|
|
{
|
|
x=32+random(TFT_W-2-32-30);
|
|
y=45+random(TFT_H-19-45-30);
|
|
r=random(30);
|
|
myGLCD.drawCircle(x, y, r,random(0xFFFF));
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some random rectangles
|
|
for (int i=0; i<100; i++)
|
|
{
|
|
x=2+random(TFT_W-4);
|
|
y=16+random(TFT_H-33);
|
|
x2=2+random(TFT_H-4);
|
|
y2=16+random(TFT_H-33);
|
|
if (x2<x) {
|
|
r=x;x=x2;x2=r;
|
|
}
|
|
if (y2<y) {
|
|
r=y;y=y2;y2=r;
|
|
}
|
|
myGLCD.drawRect(x, y, x2-x, y2-y,random(0xFFFF));
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// Draw some random rounded rectangles
|
|
for (int i=0; i<100; i++)
|
|
{
|
|
x=2+random(TFT_W-4);
|
|
y=16+random(TFT_H-33);
|
|
x2=2+random(TFT_W-4);
|
|
y2=16+random(TFT_H-33);
|
|
// We need to get the width and height and do some window checking
|
|
if (x2<x) {
|
|
r=x;x=x2;x2=r;
|
|
}
|
|
if (y2<y) {
|
|
r=y;y=y2;y2=r;
|
|
}
|
|
// We need a minimum size of 6
|
|
if((x2-x)<6) x2=x+6;
|
|
if((y2-y)<6) y2=y+6;
|
|
myGLCD.drawRoundRect(x, y, x2-x,y2-y, 3,random(0xFFFF));
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
//randomSeed(1234);
|
|
int colour = 0;
|
|
for (int i=0; i<100; i++)
|
|
{
|
|
x=2+random(TFT_W-4);
|
|
y=16+random(TFT_H-31);
|
|
x2=2+random(TFT_W-4);
|
|
y2=16+random(TFT_H-31);
|
|
colour=random(0xFFFF);
|
|
myGLCD.drawLine(x, y, x2, y2,colour);
|
|
}
|
|
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillRect(1,15,TFT_W-3,TFT_H-31,TFT_BLACK);
|
|
|
|
// This test has been modified as it takes more time to calculate the random numbers
|
|
// than to draw the pixels (3 seconds to produce 30,000 randoms)!
|
|
//for (int i=0; i<10000; i++)
|
|
//{
|
|
// myGLCD.drawPixel(2+random(316), 16+random(209),random(0xFFFF));
|
|
//}
|
|
|
|
// Draw 10,000 pixels to fill a 100x100 pixel box
|
|
// use the coords as the colour to produce the banding
|
|
byte i = 100;
|
|
while (i--) {
|
|
byte j = 100;
|
|
while (j--) myGLCD.drawPixel(i+TFT_W/2-50,j+TFT_H/2-50,i+j);
|
|
}
|
|
delay(DELAY);
|
|
|
|
myGLCD.fillScreen(TFT_BLUE);
|
|
myGLCD.fillRoundRect(20, 20, TFT_W-40, TFT_H-60, 6,TFT_RED);
|
|
|
|
myGLCD.setTextColor(TFT_WHITE,TFT_RED);
|
|
myGLCD.drawCentreString("That's it!", TFT_W/2-1, 23,2);
|
|
myGLCD.drawCentreString("Restarting in a", TFT_W/2-1, 40,2);
|
|
myGLCD.drawCentreString("few seconds...", TFT_W/2-1, 57,2);
|
|
|
|
runTime = millis()-runTime;
|
|
myGLCD.setTextColor(TFT_GREEN,TFT_BLUE);
|
|
myGLCD.drawCentreString("Draw time: (msecs)", TFT_W/2, TFT_H-34,2);
|
|
myGLCD.drawNumber(runTime-11*DELAY, TFT_W/2-20, TFT_H-17,2);
|
|
delay (5000);
|
|
}
|
|
|
|
|