#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_CS 2 // TFT CS pin is connected to arduino pin 2
#define TFT_RST 3 // TFT RST pin is connected to arduino pin 3
#define TFT_DC 4 // TFT DC pin is connected to arduino pin 4
// initialize ILI9341 TFT library
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
HardwareSerial & lin = Serial;
void setup() {
// put your setup code here, to run once:
tft.begin();
tft.setTextSize(2);
tft.setRotation(1);// row - 240px, column - 320px
// tft.setRotation(4);// row - 320px, column - 240px
// byte package[4] = {0x4a, 0x55, 0x93, 0xe5};
// tft.setCursor(0, 20);
// tft.print(linCalcChecksum(package, 4),HEX);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_RED, ILI9341_LIGHTGREY);
tft.invertDisplay(0);
tft.print("Select and send the Frame");
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(0, 20);
tft.print("ID D0 D1 D2 D3 D4 D5 D6 D7");
uint16_t colorIndex[] = {
ILI9341_NAVY,
ILI9341_DARKGREEN,
ILI9341_DARKCYAN,
ILI9341_MAROON,
ILI9341_PURPLE,
ILI9341_OLIVE,
ILI9341_CYAN,
ILI9341_MAGENTA,
ILI9341_YELLOW,
ILI9341_ORANGE,
ILI9341_GREENYELLOW};
for(uint8_t i=0; i<=10; i++){
tft.setCursor(0, (i+2)*20);
tft.setTextColor(colorIndex[i]);
tft.print("01 01 02 03 04 05 06 07 08");
}
delay(1000);
uint8_t offset = 0;
tft.setTextColor(ILI9341_CYAN);
tft.setCursor(0, 40);
tft.print(0xFF,HEX);
tft.setCursor(36, 40);
tft.print(0xFF,HEX);
for(uint8_t i=0; i<9; i++){
tft.setCursor(36*i, 40); //each character takes 12px
tft.setTextColor(colorIndex[i],ILI9341_BLACK );
tft.print(0xFF,HEX);
}
// #define BLACK 0x0000 // 黑色
// #define NAVY 0x000F // 深蓝色
// #define DGREEN 0x03E0 // 深绿色
// #define DCYAN 0x03EF // 深青色
// #define MAROON 0x7800 // 深红色
// #define PURPLE 0x780F // 紫色
// #define OLIVE 0x7BE0 // 橄榄绿
// #define LGRAY 0xC618 // 灰白色
// #define DGRAY 0x7BEF // 深灰色
// #define BLUE 0x001F // 蓝色
// #define GREEN 0x07E0 // 绿色
// #define CYAN 0x07FF // 青色
// #define RED 0xF800 // 红色
// #define MAGENTA 0xF81F // 品红
// #define YELLOW 0xFFE0 // 黄色
// #define WHITE 0xFFFF // 白色
// ————————————————
// 版权声明:本文为CSDN博主「Dan.Qiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/ACBC12345/article/details/86286213
// delay(2000);
// tft.invertDisplay(1);
// tft.setCursor(0, 40);
// tft.print("01 01 02 03 04 05 06 07 08");
// tft.setCursor(0, 60);
// tft.print("01 01 02 03 04 05 06 07 08");
// tft.setCursor(0, 80);
// tft.print("01 01 02 03 04 05 06 07 08");
// tft.setCursor(0, 100);
// tft.print("01 01 02 03 04 05 06 07 08");
}
void loop() {
// put your main code here, to run repeatedly:
// int second = millis()/100;
// tft.setCursor(0, 0);
// tft.print(second);
// delay(500);
}
void lin_break(void){
// send the break field. Since lin only specifies min 13bit, we'll send 0x00 at half baud
lin.flush();
lin.begin(12800);
// send the break field
lin.write(0x00);
lin.flush();
}
/* Create the Lin ID parity */
#define BIT(data, shift) ((ident & (1 << shift)) >> shift)
uint8_t linCalcIdentParity(uint8_t ident) {
uint8_t p0 = BIT(ident, 0) ^ BIT(ident, 1) ^ BIT(ident, 2) ^ BIT(ident, 4);
uint8_t p1 = ~(BIT(ident, 1) ^ BIT(ident, 3) ^ BIT(ident, 4) ^ BIT(ident, 5));
return (p0 | (p1 << 1)) << 6;
}
uint8_t linGenerateIdent(uint8_t frameId) {
return (frameId & 0x3f) | linCalcIdentParity(frameId);
}
uint8_t linCalcChecksum(void *data, size_t len) {
uint8_t *p = data;
uint16_t ret = 0;
uint8_t carry = 0;
for(size_t i = 0; i < len; i++) {
ret += p[i];
carry = ret>>8;
ret = ret & 0x0FF ;
ret += carry;
carry = 0;
}
return ~ret;
}
void linWrite(uint8_t frameId, void *data, size_t len) {
// Synch Break
lin_break();
// Send data via Serial interface
lin.begin(19200);
lin.write(0x55);
lin.write(linGenerateIdent(frameId));
lin.write((char *)(data), len);
// for(int i=0; i< len; i++){
// lin.write(data);
// }
lin.write(linCalcChecksum(data, len));
lin.flush();
}
void linPrint(uint8_t frameId, void *data, size_t len) {
// Synch Break
lin_break();
// Send data via Serial interface
lin.begin(19200);
lin.println(0x55);
lin.println(linGenerateIdent(frameId));
// lin.println((char *)(data), len);
// for(int i=0; i< len; i++){
// lin.write(data);
// }
lin.println(linCalcChecksum(data, len));
lin.flush();
}
// 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)"));
// 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 loop(void) {
// for(uint8_t rotation=0; rotation<4; rotation++) {
// tft.setRotation(rotation);
// testText();
// delay(1000);
// }
// }
// 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;
// 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);
// }
// }
// 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;
// }