Created
April 11, 2022 14:13
-
-
Save fxprime/f423087224f1c94a37ef949ad9d21f61 to your computer and use it in GitHub Desktop.
This file contains 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
// the regular Adafruit "TouchScreen.h" library only works on AVRs | |
// different mcufriend shields have Touchscreen on different pins | |
// and rotation. | |
// Run the TouchScreen_Calibr_native sketch for calibration of your shield | |
#include <MCUFRIEND_kbv.h> | |
MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. | |
#include <TouchScreen.h> | |
char *name = "Please Calibrate."; //edit name of shield | |
const int XP=6,XM=A2,YP=A1,YM=7; //320x480 ID=0x5310 | |
const int TS_LEFT=936,TS_RT=175,TS_TOP=950,TS_BOT=198; | |
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); | |
TSPoint tp; | |
#define MINPRESSURE 200 | |
#define MAXPRESSURE 1000 | |
int16_t BOXSIZE; | |
int16_t PENRADIUS = 1; | |
uint16_t ID, oldcolor, currentcolor; | |
uint8_t Orientation = 0; //PORTRAIT | |
// Assign human-readable names to some common 16-bit color values: | |
#define BLACK 0x0000 | |
#define BLUE 0x001F | |
#define RED 0xF800 | |
#define GREEN 0x07E0 | |
#define CYAN 0x07FF | |
#define MAGENTA 0xF81F | |
#define YELLOW 0xFFE0 | |
#define WHITE 0xFFFF | |
void show_Serial(void) | |
{ | |
Serial.println(F("Most Touch Screens use pins 6, 7, A1, A2")); | |
Serial.println(F("But they can be in ANY order")); | |
Serial.println(F("e.g. right to left or bottom to top")); | |
Serial.println(F("or wrong direction")); | |
Serial.println(F("Edit name and calibration statements\n")); | |
Serial.println(name); | |
Serial.print(F("ID=0x")); | |
Serial.println(ID, HEX); | |
Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); | |
Serial.println("Calibration is: "); | |
Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); | |
Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); | |
Serial.println("Wiring is always PORTRAIT"); | |
Serial.println("YP=" + String(YP) + " XM=" + String(XM)); | |
Serial.println("YM=" + String(YM) + " XP=" + String(XP)); | |
} | |
void show_tft(void) | |
{ | |
tft.setCursor(0, 0); | |
tft.setTextSize(1); | |
tft.print(F("ID=0x")); | |
tft.println(ID, HEX); | |
tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); | |
tft.println(""); | |
tft.setTextSize(2); | |
tft.println(name); | |
tft.setTextSize(1); | |
tft.println("PORTRAIT Values:"); | |
tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); | |
tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); | |
tft.println("\nWiring is: "); | |
tft.println("YP=" + String(YP) + " XM=" + String(XM)); | |
tft.println("YM=" + String(YM) + " XP=" + String(XP)); | |
tft.setTextSize(2); | |
tft.setTextColor(RED); | |
tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4); | |
tft.print("EXIT"); | |
tft.setTextColor(YELLOW, BLACK); | |
tft.setCursor(0, (tft.height() * 6) / 8); | |
tft.print("Touch screen for loc"); | |
while (1) { | |
tp = ts.getPoint(); | |
pinMode(XM, OUTPUT); | |
pinMode(YP, OUTPUT); | |
if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; | |
if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; | |
tft.setCursor(0, (tft.height() * 3) / 4); | |
tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " "); | |
} | |
} | |
void setup(void) | |
{ | |
uint16_t tmp; | |
tft.reset(); | |
ID = tft.readID(); | |
tft.begin(ID); | |
Serial.begin(9600); | |
show_Serial(); | |
tft.setRotation(Orientation); | |
tft.fillScreen(BLACK); | |
show_tft(); | |
BOXSIZE = tft.width() / 6; | |
tft.fillScreen(BLACK); | |
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); | |
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); | |
tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); | |
tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); | |
tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); | |
tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); | |
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); | |
currentcolor = RED; | |
delay(1000); | |
} | |
void loop() | |
{ | |
uint16_t xpos, ypos; //screen coordinates | |
tp = ts.getPoint(); //tp.x, tp.y are ADC values | |
// if sharing pins, you'll need to fix the directions of the touchscreen pins | |
pinMode(XM, OUTPUT); | |
pinMode(YP, OUTPUT); | |
// we have some minimum pressure we consider 'valid' | |
// pressure of 0 means no pressing! | |
if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { | |
// most mcufriend have touch (with icons) that extends below the TFT | |
// screens without icons need to reserve a space for "erase" | |
// scale the ADC values from ts.getPoint() to screen values e.g. 0-239 | |
// | |
// Calibration is true for PORTRAIT. tp.y is always long dimension | |
// map to your current pixel orientation | |
switch (Orientation) { | |
case 0: | |
xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); | |
ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); | |
break; | |
case 1: | |
xpos = map(tp.y, TS_TOP, TS_BOT, 0, tft.width()); | |
ypos = map(tp.x, TS_RT, TS_LEFT, 0, tft.height()); | |
break; | |
case 2: | |
xpos = map(tp.x, TS_RT, TS_LEFT, 0, tft.width()); | |
ypos = map(tp.y, TS_BOT, TS_TOP, 0, tft.height()); | |
break; | |
case 3: | |
xpos = map(tp.y, TS_BOT, TS_TOP, 0, tft.width()); | |
ypos = map(tp.x, TS_LEFT, TS_RT, 0, tft.height()); | |
break; | |
} | |
// are we in top color box area ? | |
if (ypos < BOXSIZE) { //draw white border on selected color box | |
oldcolor = currentcolor; | |
if (xpos < BOXSIZE) { | |
currentcolor = RED; | |
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); | |
} else if (xpos < BOXSIZE * 2) { | |
currentcolor = YELLOW; | |
tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); | |
} else if (xpos < BOXSIZE * 3) { | |
currentcolor = GREEN; | |
tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE); | |
} else if (xpos < BOXSIZE * 4) { | |
currentcolor = CYAN; | |
tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE); | |
} else if (xpos < BOXSIZE * 5) { | |
currentcolor = BLUE; | |
tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE); | |
} else if (xpos < BOXSIZE * 6) { | |
currentcolor = MAGENTA; | |
tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE); | |
} | |
if (oldcolor != currentcolor) { //rub out the previous white border | |
if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); | |
if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); | |
if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); | |
if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); | |
if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); | |
if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); | |
} | |
} | |
// are we in drawing area ? | |
if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) { | |
tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); | |
} | |
// are we in erase area ? | |
// Plain Touch panels use bottom 10 pixels e.g. > h - 10 | |
// Touch panels with icon area e.g. > h - 0 | |
if (ypos > tft.height() - 10) { | |
// press the bottom of the screen to erase | |
tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment