/*****************************************************
This code was written for the Arduino Mega and allows to choose between 8080 parallel interface and 3-wire SPI Interface.
Newhaven Display invests time and resources providing this open source code,
Please support Newhaven Display by purchasing products from Newhaven Display!
Copyright (c) 2023, Newhaven Display International
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 of 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.
/*----------------------------------------------------------------------------
Arduino Mega TFT Display |
------------------------------------------------------------------------------
GND 1 GND - Ground |
NC 2-5 - No Connect |
NC 6 SDO - Serial data out |
3.3V 7 VDD - Supply Voltage for LCD (3.3v) |
3.3V 8 VDDI - Supply Voltage for Logic (3.3) |
24 9 SDA - Serial data in |
23 10 CSX - Active LOW Chip Select signal(can tie to GND) |
25 11 DCX - D/C Data =1 , Command =0 |
29 12 WRX - Active LOW Write signal |
28 13 RDX - Active LOW Read signal |
NC 14-21 - No Connect |
49 22 DB0 |
48 23 DB1 |
47 24 DB2 |
46 25 DB3 |
45 26 DB4 |
44 27 DB5 |
43 28 DB6 |
42 29 DB7 |
10 30 RESX |
26 31 IM0 = 1 HIGH for 8080-II ; IM0 = 1 HIGH 3-wire SPI |
27 32 IM2 = 0 LOW for 8080-II ; IM2 = 1 HIGH 3-wire SPI |
GND 33 GND - Ground |
GND 34 LED-K1 Backlight Cathode |
GND 35 LED-K2 Backlight Cathode |
GND 36 LED-K3 Backlight Cathode |
GND 37 LED-K4 Backlight Cathode |
3.1V 38 LED-A Backlight Anode(160mA @ 3.1V) |
GND 39 Ground |
NC 40 TE |
----------------------------------------------------------------------------*/
#define RESX 10 /*RESX signal connected to Arduino digital pin 10*/
#define CSX 23 /*CSX signal connected to Arduino digital pin 23*/
#define SDA 24 /*SDA signal connected to Arduino digital pin 24*/
#define DCX 25 /*DCX signal connected to Arduino digital pin 25*/ //SCL pin when mode = 1
#define IM0 26 /*IM0 signal connected to Arduino digital pin 26*/
#define IM2 27 /*IM2 signal connected to Arduino digital pin 27*/
#define RDX 28 /*RDX signal connected to Arduino digital pin 28*/
#define WRX 29 /*WRX signal connected to Arduino digital pin 29*/
//The 8-bit data bus is connected to PORT L on the Arduino MEGA
int mode = 0 ; //Toggle value for interface ; 0 = 8080 Parallel, 1 = 3-Wire SPI;
void Command_out(unsigned char c) //Function used for sending commands to TFT
{
switch(mode){
case 0:
PORTA &= ~(1 << PORTA3); // Set DCX pin to LOW
PORTL=c; // Assigning the Command Byte 'c' to PortL
PORTA &= ~(1 << PORTA7); // Set WRX pin to LOW
PORTA |= (1 << PORTA7); // Set WRX pin to HIGH
break;
case 1:
PORTA &= ~(1 << PORTA2); //Set SDA LOW for D/C Bit
PORTA |= (1 << PORTA3); //Set SCL LOW
PORTA &= ~(1 << PORTA3); //Set SCL HIGH
PORTA |= (1 << PORTA3); //Set SCL LOW
for (int i = 0; i < 8; i++) {
if ((c & 0x80) == 0x80)
PORTA |= (1 << PORTA2); //Set SDA HIGH
else
PORTA &= ~(1 << PORTA2); //Set SDA LOW
c = (c << 1); //Shift byte
PORTA |= (1 << PORTA3); //Set SCL LOW
PORTA &= ~(1 << PORTA3); //Set SCL HIGH
PORTA |= (1 << PORTA3); //Set SCL LOW
}
break;
}
}
void data_out(unsigned char d) { //Function used for sending data to TFT
switch(mode){
case 0:
PORTA |= (1 << PORTA3); // Set DCX pin to HIGH
PORTL=d; // Assigning the Data Byte 'd' to PortL
PORTA &= ~(1 << PORTA7); // Set WRX pin to LOW
PORTA |= (1 << PORTA7); // Set WRX pin to HIGH
break;
case 1:
PORTA |= (1 << PORTA2); //Set SDA HIGH for D/C Bit
PORTA |= (1 << PORTA3); //Set SCL LOW
PORTA &= ~(1 << PORTA3); //Set SCL HIGH
PORTA |= (1 << PORTA3); //Set SCL LOW
for (int i = 0; i < 8; i++) {
if ((d & 0x80) == 0x80)
PORTA |= (1 << PORTA2); //Set SDA HIGH
else
PORTA &= ~(1 << PORTA2); //Set SDA LOW
d = (d << 1);
PORTA |= (1 << PORTA3); //Set SCL LOW
PORTA &= ~(1 << PORTA3); //Set SCL HIGH
PORTA |= (1 << PORTA3); //Set SCL LOW
}
break;
}
}
void Set_XY_Address() {
Command_out(0x2A); /*Set x column */
data_out(0x00);
data_out(0x00);
data_out(0x00);
data_out(0xEF);
Command_out(0x2B); /*Set y row */
data_out(0x00);
data_out(0x00);
data_out(0x01);
data_out(0x3F);
Command_out(0x2C); /*command to begin writing to frame memory */
}
void disp() {
Set_XY_Address();
unsigned int i;
for ( i = 0; i < 38400; i++)
{
data_out(0x00);
data_out(0x1f); //Fills screen with Red pixels
data_out(0x00);
data_out(0x1f);
}
delay(2000);
Set_XY_Address();
for ( i = 0; i < 38400; i++)
{
data_out(0x07); //Fills screen with Green pixels
data_out(0xe0);
data_out(0x07);
data_out(0xe0);
}
delay(2000);
Set_XY_Address();
for ( i = 0; i < 38400; i++)
{
data_out(0xf8); //Fills screen with Blue pixels
data_out(0x00);
data_out(0xf8);
data_out(0x00);
}
delay(2000);
}
void Ports_parallel(){
DDRL=0xff; //Enable All pins as output on PortL
PORTL=0X00; //Clears PortL
DDRA = 0xFF; //Enable All pins as output on PortA
PORTA = 0x00; //Clears PortA
DDRB = 0xFF; //Enable All pins as output on PortB
PORTB = 0x00; //Clears PortB
digitalWrite(IM0,HIGH);
digitalWrite(IM2,LOW); //Sets Interface selection pins
digitalWrite(CSX,LOW);
digitalWrite(RDX, HIGH);
digitalWrite(WRX, LOW);
}
void Ports_SPI(){
DDRA = 0xFF; //Enable All pins as output on PortA
PORTA = 0x00; //Clears PortA
DDRB = 0xFF; //Enable All pins as output on PortB
PORTB = 0x00; //Clears PortB
DDRL=0xff; //Enable All pins as output on PortL
PORTL=0X00; //Clears PortL
digitalWrite(IM0,HIGH);
digitalWrite(IM2,HIGH); //Sets Interface selection pins
digitalWrite(CSX,LOW);
}
void TFT_init(){
digitalWrite(RESX, LOW);
delay(250);
digitalWrite(RESX, HIGH);
delay(250);
Command_out(0x28); //display off
Command_out(0x11); //exit SLEEP mode
delay(100);
Command_out(0x36); //MADCTL: memory data access control
data_out(0x88);
Command_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);
Command_out(0xB2); //PORCTRK: Porch setting
data_out(0x0C);
data_out(0x0C);
data_out(0x00);
data_out(0x33);
data_out(0x33);
Command_out(0xB7); //GCTRL: Gate Control
data_out(0x35);
Command_out(0xBB); //VCOMS: VCOM setting
data_out(0x2B);
Command_out(0xC0); //LCMCTRL: LCM Control
data_out(0x2C);
Command_out(0xC2); //VDVVRHEN: VDV and VRH Command Enable
data_out(0x01);
data_out(0xFF);
Command_out(0xC3); //VRHS: VRH Set
data_out(0x11);
Command_out(0xC4); //VDVS: VDV Set
data_out(0x20);
Command_out(0xC6); //FRCTRL2: Frame Rate control in normal mode
data_out(0x0F);
Command_out(0xD0); //PWCTRL1: Power Control 1
data_out(0xA4);
data_out(0xA1);
Command_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);
Command_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);
Command_out(0x2A); //X address set
data_out(0x00);
data_out(0x00);
data_out(0x00);
data_out(0xEF);
Command_out(0x2B); //Y address set
data_out(0x00);
data_out(0x00);
data_out(0x01);
data_out(0x3F);
delay(10);
Command_out(0x21); //Color inversion for ips
Command_out(0x29); //display ON
delay(10);
}
void setup() {
if (mode==1) { Ports_SPI(); } //Ports setup for SPI or Parallel Interface
else { Ports_parallel(); }
TFT_init(); //TFT initialazation
}
void loop() {
disp(); //Outputs RGB colors loop
}