Skip to content

How to fix a blank screen on a 2.4 inch 240x320 TFT display?

aWritten byadmin From theTyrell Lab journal

Start by checking the power supply. A blank screen on a 2.4 inch 240x320 tft display often stems from insufficient voltage or current. Measure the voltage at the display’s VCC pin with a multimeter—it should be 3.3V or 5V, depending on your module. If it reads below 3.0V (for a 3.3V variant) or below 4.5V (for a 5V variant), the display won’t initialize. Also, check the backlight pin (LED or BL) independently; it typically needs 3.3V to 5V through a current-limiting resistor, usually 100Ω to 220Ω. If the backlight is off, the screen might appear blank even if the LCD is active. For example, on a common ILI9341 driver, the backlight enable pin (LEDK) must be tied to ground, and LEDA to VCC. If you’re using a microcontroller like an Arduino Uno, the 5V pin can supply up to 500mA, but the display plus SD card (if present) can draw 80mA to 120mA. A USB port might sag below 4.75V, causing instability. Use a separate 3.3V regulator (e.g., AMS1117-3.3) if your board’s regulator is weak.

Next, verify the initialization sequence. The 2.4 inch 240x320 TFT display relies on a specific SPI or parallel interface configuration. For SPI-based modules (common with ILI9341 or ST7789), the chip select (CS) pin must be pulled low before sending commands. If CS is floating or tied to ground incorrectly, the display ignores data. Check the data sheet for your driver—ILI9341 requires a reset pulse of at least 10µs low, then a 120ms delay after power-up. Many Arduino libraries (like Adafruit_ILI9341) handle this, but if you’re using a custom code, ensure the reset pin is toggled. A common mistake: using a 5V logic microcontroller with a 3.3V display without level shifting. The ILI9341 is 3.3V tolerant, but 5V signals on the data lines can damage the driver or cause erratic behavior. Use a 74LVC245 level shifter or a voltage divider (e.g., 1kΩ and 2kΩ resistors) for each line. Measure the SPI clock frequency—the ILI9341 supports up to 10MHz on 3.3V, but some cheap modules fail above 6MHz. Reduce the SPI clock to 4MHz in your code to test.

Inspect the physical connections. The 2.4 inch display typically has 14 to 18 pins, including VCC, GND, CS, DC, RESET, MOSI, SCLK, and backlight. Loose jumper wires or cold solder joints on a breadboard can cause intermittent blank screens. Use a continuity tester on each pin between the microcontroller and display. For example, the DC pin (data/command select) must be stable; if it’s floating, the display might interpret commands as data. Solder the pins directly to a perfboard if you’re using a breadboard—parasitic capacitance from long wires (over 10cm) can corrupt SPI signals. Also, check the SD card slot if your module has one—a shorted SD card pin can pull the CS line low, conflicting with the display. Remove the SD card if present, or desolder the slot if you don’t need it.

Test the driver chip identification. The 2.4 inch 240x320 TFT display often uses the ILI9341, but some use ST7789, HX8357, or even SSD1963. If your code initializes the wrong driver, the screen stays blank. Read the chip markings on the flex cable or PCB—ILI9341 is common, but ST7789 is also used in some 2.4-inch modules. The resolution is 240x320, but the initialization commands differ. For instance, ILI9341 requires a 0x11 command (sleep out) followed by a 120ms delay, then 0x29 (display on). ST7789 uses similar but different register values. Use a library that auto-detects the driver, like TFT_eSPI, which reads the chip ID via SPI. The ID for ILI9341 is 0x9341, for ST7789 it’s 0x7789. If the ID reads 0x0000 or 0xFFFF, the SPI communication is broken. Check the MISO pin—some modules don’t connect MISO, so you can’t read the ID; in that case, force the driver manually.

Examine the backlight circuit. The 2.4 inch display’s backlight is usually a set of white LEDs driven by a boost converter or a simple resistor. If the backlight is anodes (LEDA) and cathodes (LEDK) are reversed, it won’t light. Measure the voltage across the backlight pins—it should be around 3.2V to 3.4V for white LEDs. If it’s 0V, the boost converter (if present) might be faulty. Some modules have a transistor that switches the backlight from a PWM pin; if that pin is not driven high, the backlight stays off. In your code, set the backlight pin to HIGH (or use analogWrite with 255) after a 100ms delay. If the backlight still doesn’t light, test with a 100Ω resistor directly from VCC to the LEDA pin—this bypasses the transistor. If it lights, the transistor or PWM signal is the issue.

Check for soldering defects on the flex cable. The 2.4 inch 240x320 TFT display has a flexible flat cable (FFC) connecting the glass to the PCB. If the FFC is not fully inserted into the connector, or if the connector’s latch is loose, the display won’t work. Re-seat the cable—lift the latch, insert the cable fully, then press down. Use a magnifying glass to check for bent pins or cracks. The FFC has 14 to 18 traces, each 0.5mm pitch; a single misaligned trace can cause a blank screen. If the connector is damaged, you can solder directly to the FFC pads, but this is tricky. Also, the glass itself can be cracked if the display was dropped—look for hairline fractures near the edges. A cracked glass will show a blank screen or partial lines.

Test with a minimal sketch. Strip down your code to the bare essentials. For an Arduino Uno with ILI9341, use this:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(115200);
tft.begin();
tft.fillScreen(ILI9341_BLUE);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(0, 0);
tft.print("Hello");
}
void loop() {}

If the screen remains blank, add a 500ms delay after tft.begin() and before fillScreen(). Some displays need time to stabilize. Also, check the serial output for any error messages—if the library prints “Display not found,” the SPI wiring is wrong. Swap MOSI and MISO if you’re using a module that expects them reversed. The ILI9341 uses SPI mode 0 (CPOL=0, CPHA=0), but some clones use mode 3. Force SPI mode 0 in your library by calling SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); before tft.begin().

Consider the power-on sequence. The 2.4 inch 240x320 TFT display requires a specific order: apply VCC, then wait 10ms, then toggle RESET low for 10ms, then high, then wait 120ms, then send initialization commands. If your microcontroller powers up faster than the display, the SPI lines might be high before the display is ready, causing a latch-up. Add a 200ms delay at the start of setup() before initializing the display. Also, if you’re using a shared SPI bus with other devices (like an SD card), ensure the CS pin of the other device is high (inactive) during display communication. A pull-up resistor (10kΩ) on each CS line helps prevent floating.

Check for static damage. The ILI9341 driver is CMOS-based and sensitive to electrostatic discharge (ESD). If you touched the display pins without grounding yourself, the driver might be damaged. Symptoms include a blank screen with no response to any commands, or a white screen that never changes. Unfortunately, ESD damage is permanent—you’ll need a replacement module. To prevent this, use an anti-static wrist strap when handling the display, and store it in an anti-static bag. Also, avoid touching the flex cable pins directly.

Inspect the voltage regulator on the module. Some 2.4 inch displays have a built-in 3.3V regulator (e.g., XC6206P332MR) that converts 5V input to 3.3V for the driver. If this regulator fails, the driver gets no power. Measure the voltage at the driver chip’s VCC pin (usually pin 1 or 2 on the ILI9341). It should be 3.3V ±0.1V. If it’s below 3.0V, the regulator is bad or the input voltage is too low. Replace the regulator with a similar one (e.g., AMS1117-3.3) or bypass it by feeding 3.3V directly to the driver pin, but be careful not to exceed 3.6V. Also, check the capacitor near the regulator—a 10µF tantalum capacitor might be cracked or missing, causing oscillation.

Test the display with a different microcontroller. If you’re using an ESP32, its 3.3V logic is compatible, but the SPI pins might be mapped differently. For example, on an ESP32 DevKit, the default SPI pins are MOSI=23, MISO=19, SCLK=18, CS=5, DC=17, RESET=16. If you’re using a library like TFT_eSPI, configure the user setup file correctly. The ESP32’s 3.3V regulator can supply up to 600mA, which is enough for the display plus WiFi. But if you’re using a Raspberry Pi Pico, its 3.3V output is limited to 300mA; the display might draw 100mA, leaving little headroom. Use a separate 3.3V regulator for the display if you see brownouts. Also, the Pico’s SPI pins are on GPIO 19 (MOSI), 18 (SCLK), 16 (CS), 17 (DC), and 20 (RESET) by default—check your wiring.

Look for firmware issues in the library. The Adafruit_ILI9341 library is widely used, but some versions have bugs with certain display revisions. For instance, the library’s begin() function sends a reset command, but if the reset pin is not connected to the microcontroller, the display might not initialize. If you’re using a module with a hardware reset capacitor (0.1µF from RESET to VCC), the reset pulse might be too short. Add a manual reset by toggling the reset pin low for 10ms in your code. Also, some libraries expect the display to be in “sleep out” mode before writing pixels; if the display is in sleep mode, the screen stays blank. Send the command 0x11 (sleep out) with a 150ms delay, then 0x29 (display on) with a 50ms delay, before any drawing.

Check for address window issues. The ILI9341 uses a column address and page address to define the drawing area. If these registers are set incorrectly (e.g., to 0,0 to 0,0), the display won’t show anything. In your code, after initialization, set the address window to the full 240x320 area: tft.setAddrWindow(0, 0, 239, 319); then fill with a color. If you’re using a library, the fillScreen() function does this automatically, but if you’re writing raw SPI commands, ensure you send the correct parameters. The command 0x2A (column address) expects 4 bytes: start high, start low, end high, end low. For 240 pixels, start=0, end=239 (0x00EF). Similarly, 0x2B (page address) for 320 pixels: start=0, end=319 (0x013F). A common mistake is sending the end address as 240 instead of 239, which clips the display.

Examine the pixel format. The ILI9341 supports 16-bit (RGB565) and 18-bit (RGB666) color modes. If the library sends 16-bit data but the display is configured for 18-bit, the colors will be wrong, but the screen might still show something. However, if the display is in 12-bit mode (unlikely), the data will be misinterpreted. Check the initialization sequence in the library—look for the command 0x3A (interface pixel format). For 16-bit, set it to 0x55 (65k colors). For 18-bit, set it to 0x66 (262k colors). Most 2.4 inch displays use 16-bit, but some Chinese clones use 18-bit with a different pin mapping. If you’re using a library like TFT_eSPI, you can set the color depth in the user setup file.

Test with a known-working display. If you have another 2.4 inch 240x320 TFT display, swap it in to isolate the issue. If the new display works, the original is defective. Common defects include a dead backlight LED (measure continuity across the LED pins—should be around 0.6V forward voltage drop), a cracked LCD glass, or a failed driver chip. If the new display also fails, the problem is in your wiring or code. Also, try the display on a different microcontroller board—if it works on an Arduino Mega but not on an Uno, the issue might be memory or timing. The Uno has only 2KB of SRAM, which is tight for a 240x320 framebuffer (153KB if using a buffer). Most libraries don’t use a full framebuffer, but if you’re using a buffer, it will overflow and cause a blank screen.

Consider the timing of the SPI transactions. The ILI9341 has a maximum SPI clock of 10MHz, but some modules have a 15MHz limit. If you’re running at 20MHz or higher, the data might be corrupted. Reduce the clock to 4MHz in your code. Also, the display requires a minimum delay between commands—typically 100µs for most commands, but 120ms after sleep out. If you’re sending commands too fast, the display might ignore them. Add a 1ms delay after each command in your custom code. For library users, the Adafruit_ILI9341 library already handles delays, but if you’re using a fast microcontroller like an ESP32, the library might not insert enough delays. Override the delay function by adding delay(1); after each SPI transaction.

Check for ground loops. If you’re powering the display from a separate power supply (e.g., a battery) and the microcontroller from a USB port, the ground reference might differ. Connect the grounds together with a thick wire. A voltage difference of even 0.5V can cause the display to malfunction. Also, if you’re using a breadboard, the ground rail might have high resistance due to multiple connections. Use a dedicated ground wire from the display’s GND pin to the microcontroller’s GND pin, not through the breadboard rail. Measure the resistance between the two grounds—it should be less than 1Ω.

Inspect the initialization commands in the library. Open the library’s initialization table (e.g., in Adafruit_ILI9341.cpp, the ILI9341_init[] array). Compare it with the data sheet for your specific display. Some Chinese modules use a different set of commands, like skipping the 0xCF, 0xED, 0xE8, 0xCB, 0xF7, 0xEA, 0xC0, 0xC1, 0xC5, 0xC7, 0x36, 0x3A, 0xB1, 0xB6, 0xF2, 0x26, 0xE0, 0xE1 commands. If the library sends commands that the display doesn’t support, it might hang. For example, the ILI9341 has a command 0xCB (power control A) that some clones ignore. Try using a minimal initialization sequence from the TFT_eSPI library, which has a generic setup for ILI9341. You can also manually send only the essential commands: 0x11 (sleep out), delay 120ms, 0x29 (display on), 0x36 (memory access control) set to 0x48 (for portrait mode), 0x3A

Stop running experiments you can't defend.

Bring us a stuck funnel or a backlog of untested ideas. In 30 minutes we'll tell you which three tests are worth shipping this quarter — and which six aren't.