jaretburkett / ILI9488

Arduino Library for the ILI9488 TFT controller for 4 wire SPI
82 stars 40 forks source link

ILI9488 not working on Arduino Mega #16

Open mattbue opened 3 years ago

mattbue commented 3 years ago

Hey, i have connected an ILI9488 to an Arduino Mega using the pins of the HW SPI. There is nothing shown on the display unless i press the reset button of the Arduino Mega. As long the reset button is pressed the last "picture" is displayed. When the button is released the screen is cleared and keeps cleared until the button is pressed again.

Does someone has an idea what can cause this behaviour?

Thanks

ihsanbu commented 2 years ago

/*** This is our GFX example for the Adafruit ILI9488 Breakout and Shield ----> http://www.adafruit.com/products/1651 3.5 Inch 480x320 SPI Serial TFT LCD Module Display Screen with Press Panel Driver IC ILI9488 for MCU

Check out the links above for our tutorials and wiring diagrams These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional) Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution ****/

include "SPI.h"

include

include

//#define TFT_CS PA1 //#define TFT_DC PB3 //#define TFT_LED PB0 //#define TFT_RST PB4

define TFT_CS 10

define TFT_DC 9

//#define TFT_LED PB0

define TFT_RST 8

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC ILI9488 tft = ILI9488(TFT_CS, TFT_DC, TFT_RST); // If using the breakout, change pins as desired //Adafruit_ILI9488 tft = Adafruit_ILI9488(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

void setup() { Serial.begin(9600); Serial.println("ILI9488 Test!");

// delect all SPI Devics pinMode(TFT_CS,OUTPUT); pinMode(7,OUTPUT); digitalWrite(TFT_CS,HIGH); digitalWrite(7,HIGH);

tft.begin();

// read diagnostics (optional but can help debug problems) uint8_t x = tft.readcommand8(ILI9488_RDMODE); Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDMADCTL); Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDPIXFMT); Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDIMGFMT); Serial.print("Image Format: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_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(ILI9488_CYAN)); delay(500);

Serial.print(F("Horiz/Vert Lines ")); Serial.println(testFastLines(ILI9488_RED, ILI9488_BLUE)); delay(500);

Serial.print(F("Rectangles (outline) ")); Serial.println(testRects(ILI9488_GREEN)); delay(500);

Serial.print(F("Rectangles (filled) ")); Serial.println(testFilledRects(ILI9488_YELLOW, ILI9488_MAGENTA)); delay(500);

Serial.print(F("Circles (filled) ")); Serial.println(testFilledCircles(10, ILI9488_MAGENTA));

Serial.print(F("Circles (outline) ")); Serial.println(testCircles(10, ILI9488_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(ILI9488_BLACK); tft.fillScreen(ILI9488_RED); tft.fillScreen(ILI9488_GREEN); tft.fillScreen(ILI9488_BLUE); tft.fillScreen(ILI9488_BLACK); return micros() - start; }

unsigned long testText() { tft.fillScreen(ILI9488_BLACK); unsigned long start = micros(); tft.setCursor(0, 0); tft.setTextColor(ILI9488_WHITE); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ILI9488_YELLOW); tft.setTextSize(2); tft.println(1234.56); tft.setTextColor(ILI9488_RED); tft.setTextSize(3); tft.println(0xDEADBEEF, HEX); tft.println(); tft.setTextColor(ILI9488_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(ILI9488_BLACK);

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

tft.fillScreen(ILI9488_BLACK);

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;

tft.fillScreen(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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; }

ihsanbu commented 2 years ago

please save libraries with name that header file name my code is working best

mr-baguette commented 6 months ago

/*** This is our GFX example for the Adafruit ILI9488 Breakout and Shield ----> http://www.adafruit.com/products/1651 3.5 Inch 480x320 SPI Serial TFT LCD Module Display Screen with Press Panel Driver IC ILI9488 for MCU

Check out the links above for our tutorials and wiring diagrams These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional) Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution ****/

include "SPI.h" #include #include

//#define TFT_CS PA1 //#define TFT_DC PB3 //#define TFT_LED PB0 //#define TFT_RST PB4

define TFT_CS 10 #define TFT_DC 9 //#define TFT_LED PB0 #define TFT_RST 8

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC ILI9488 tft = ILI9488(TFT_CS, TFT_DC, TFT_RST); // If using the breakout, change pins as desired //Adafruit_ILI9488 tft = Adafruit_ILI9488(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

void setup() { Serial.begin(9600); Serial.println("ILI9488 Test!");

// delect all SPI Devics pinMode(TFT_CS,OUTPUT); pinMode(7,OUTPUT); digitalWrite(TFT_CS,HIGH); digitalWrite(7,HIGH);

tft.begin();

// read diagnostics (optional but can help debug problems) uint8_t x = tft.readcommand8(ILI9488_RDMODE); Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDMADCTL); Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDPIXFMT); Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_RDIMGFMT); Serial.print("Image Format: 0x"); Serial.println(x, HEX); x = tft.readcommand8(ILI9488_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(ILI9488_CYAN)); delay(500);

Serial.print(F("Horiz/Vert Lines ")); Serial.println(testFastLines(ILI9488_RED, ILI9488_BLUE)); delay(500);

Serial.print(F("Rectangles (outline) ")); Serial.println(testRects(ILI9488_GREEN)); delay(500);

Serial.print(F("Rectangles (filled) ")); Serial.println(testFilledRects(ILI9488_YELLOW, ILI9488_MAGENTA)); delay(500);

Serial.print(F("Circles (filled) ")); Serial.println(testFilledCircles(10, ILI9488_MAGENTA));

Serial.print(F("Circles (outline) ")); Serial.println(testCircles(10, ILI9488_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(ILI9488_BLACK); tft.fillScreen(ILI9488_RED); tft.fillScreen(ILI9488_GREEN); tft.fillScreen(ILI9488_BLUE); tft.fillScreen(ILI9488_BLACK); return micros() - start; }

unsigned long testText() { tft.fillScreen(ILI9488_BLACK); unsigned long start = micros(); tft.setCursor(0, 0); tft.setTextColor(ILI9488_WHITE); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ILI9488_YELLOW); tft.setTextSize(2); tft.println(1234.56); tft.setTextColor(ILI9488_RED); tft.setTextSize(3); tft.println(0xDEADBEEF, HEX); tft.println(); tft.setTextColor(ILI9488_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(ILI9488_BLACK);

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

tft.fillScreen(ILI9488_BLACK);

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;

tft.fillScreen(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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(ILI9488_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; }

@ihsanbu , I tried this code but it didn't work for me, but I'm not sure if all the correct pins are connected. If someone could explain to me how I would connect this code to my screen, that would be great. All my available pins are : sdo(miso), led, sck, sdi(mosi), dc/rs, reset and cs.

And unlike MattBue s problem, there is just nothing displayed, even when holding the reset button.

This is what the arduino serial monitor displays: Display Power Mode: 0x0 MADCTL Mode: 0x0 Pixel Format: 0x0 Image Format: 0x0 Self Diagnostic: 0x0 Benchmark Time (microseconds) Screen fill 42295608 Text 531572 Lines 7352684 Horiz/Vert Lines 3400876 Rectangles (outline) 1864848 Done!