/*
/Program for writing to NHD-2.4-240320AF-CSXP with ST7789VI controller with serial Interface.
/This code is written for the Arduino Uno using Serial Interface.
/
/Newhaven Display invests time and resources providing this open source code,
/Please support Newhaven Display by purchasing products from Newhaven Display!
* Copyright (c) 2025 - Newhaven Display International, Inc.
*
* This code is provided as an example only and without any warranty by Newhaven Display.
* Newhaven Display accepts no responsibility for any issues resulting from its use.
* The developer on the final application incorporating any parts of this
* sample code is responsible for ensuring its safe and correct operation
* and for any consequences resulting from its use.
* See the GNU General Public License for more details.
*
* Logic level shifters are recommended to convert the Arduino 5V logic to 3.3V logic
*
*/
/****************************************************
* PINOUT: Arduino Uno -> 2.4" TFT *
*****************************************************/
#define SDA 6 //MOSI signal connected to Arduino pin 6
#define SCL 7 //SCL signal connected to Arduino pin 7
#define DC 8 // DC signal connected to Arduino pin 8
#define CS 9 // CS signal connected to Arduino pin 9
#define RES 10 //RES signal connected to Arduino pin 10
unsigned char mode = 4; // 3 = 3-Wire Serial // 4 = 4-Wire Serial
/****************************************************
* Function Commands *
******************************************************/
void comm_out(unsigned char c)
{
switch(mode)
{
case 3: PORTD |=(1<<PORTD2); //IM0 = 1
PORTD &= ~(1<<PORTD3); //IM1 = 0
PORTD &= ~(1<<PORTD6); //MOSI = 1 for D/C Bit
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
for (int i=0;i<8;i++)
{
if((c & 0x80)== 0x80)
PORTD |=(1<<PORTD6); //MOSI = 1
else
PORTD &= ~(1<<PORTD6); //MOSI = 0
c = (c<<1);
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
}
break;
case 4: PORTD &= ~(1<<PORTD2); //IM0 = 0
PORTD |=(1<<PORTD3); //IM1 = 1
PORTB &= ~(1<<PORTB0); //D/C = 0
for (int i=0;i<8;i++)
{
if((c & 0x80)== 0x80)
PORTD |=(1<<PORTD6); //MOSI = 1
else
PORTD &= ~(1<<PORTD6); //MOSI = 0
c = (c<<1);
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
}
break;
}
}
void data_out(unsigned char d)
{
switch(mode)
{
case 3: PORTD |=(1<<PORTD2); //IM0 = 1
PORTD &= ~(1<<PORTD3); //IM1 = 0
PORTD |=(1<<PORTD6); //MOSI = 1 for D/C Bit
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
for (int i=0;i<8;i++)
{
if((d & 0x80)== 0x80)
PORTD |=(1<<PORTD6); //MOSI = 1
else
PORTD &= ~(1<<PORTD6); //MOSI = 0
d = (d<<1);
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
}
break;
case 4: PORTD &= ~(1<<PORTD2); //IM0 = 0
PORTD |=(1<<PORTD3); //IM1 = 1
PORTB |=(1<<PORTB0); //D/C = 1
for (int i=0;i<8;i++)
{
if((d & 0x80)== 0x80)
PORTD |=(1<<PORTD6); //MOSI = 1
else
PORTD &= ~(1<<PORTD6); //MOSI = 0
d = (d<<1);
PORTD |=(1<< PORTD7); //SCL = 0
PORTD &= ~(1<<PORTD7); //SCL = 1
PORTD |=(1<< PORTD7); //SCL = 0
}
break;
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Fill Screen (All Red -> All Green -> All Blue) Function
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void disp()
{
{
unsigned int i;
comm_out(0x2C); //command to begin writing to frame memory
for(i=0;i<38400;i++) //fill screen with blue pixels
{
data_out(0x00);
data_out(0x1F);
data_out(0x00);
data_out(0x1F);
}
for(i=0;i<38400;i++) //fill screen with green pixels
{
data_out(0x07);
data_out(0xE0);
data_out(0x07);
data_out(0xE0);
}
for(i=0;i<38400;i++) //fill screen with red pixels
{
data_out(0xF8);
data_out(0x00);
data_out(0xF8);
data_out(0x00);
}
delay(300);
}
}
/****************************************************
* Initialization and Setup Routine *
*****************************************************/
void setup()
{
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
pinMode(10, OUTPUT);
digitalWrite(10, LOW);
digitalWrite(CS, LOW);
digitalWrite(RES, LOW);
delay(250);
digitalWrite(RES, HIGH);
delay(250);
comm_out(0x28); //display off
comm_out(0x11); //exit SLEEP mode
delay(100);
comm_out(0x36); //MADCTL: memory data access control
data_out(0x10); //changing from 0x88
comm_out(0x3A); //COLMOD: Interface Pixel format *** 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel
data_out(0x55);
comm_out(0xB2); //PORCTRK: Porch setting
data_out(0x0C);
data_out(0x0C);
data_out(0x00);
data_out(0x33);
data_out(0x33);
comm_out(0xB7); //GCTRL: Gate Control
data_out(0x35);
comm_out(0xBB); //VCOMS: VCOM setting
data_out(0x2B);
comm_out(0xC0); //LCMCTRL: LCM Control
data_out(0x2C);
comm_out(0xC2); //VDVVRHEN: VDV and VRH Command Enable
data_out(0x01);
data_out(0xFF);
comm_out(0xC3); //VRHS: VRH Set
data_out(0x11);
comm_out(0xC4); //VDVS: VDV Set
data_out(0x20);
comm_out(0xC6); //FRCTRL2: Frame Rate control in normal mode
data_out(0x0F);
comm_out(0xD0); //PWCTRL1: Power Control 1
data_out(0xA4);
data_out(0xA1);
comm_out(0xE0); //PVGAMCTRL: Positive Voltage Gamma control
data_out(0xD0);
data_out(0x00);
data_out(0x05);
data_out(0x0E);
data_out(0x15);
data_out(0x0D);
data_out(0x37);
data_out(0x43);
data_out(0x47);
data_out(0x09);
data_out(0x15);
data_out(0x12);
data_out(0x16);
data_out(0x19);
comm_out(0xE1); //NVGAMCTRL: Negative Voltage Gamma control
data_out(0xD0);
data_out(0x00);
data_out(0x05);
data_out(0x0D);
data_out(0x0C);
data_out(0x06);
data_out(0x2D);
data_out(0x44);
data_out(0x40);
data_out(0x0E);
data_out(0x1C);
data_out(0x18);
data_out(0x16);
data_out(0x19);
comm_out(0x2A); //X address set
data_out(0x00);
data_out(0x00);
data_out(0x00);
data_out(0xEF);
comm_out(0x2B); //Y address set
data_out(0x00);
data_out(0x00);
data_out(0x01);
data_out(0x3F);
delay(10);
comm_out(0x29); //display ON
delay(10);
}
/*****************************************************
* Loop Function, to run repeatedly *
*****************************************************/
void loop()
{
disp();
delay(500);
}