/* 
* classTFT.cpp
*
* Created: 04/02/2020 18:29:30
* Author: Ledo
*/


#include "classTFT.h"

// default constructor
classTFT::classTFT()
{
} //classTFT

// default destructor
classTFT::~classTFT()
{
} //~classTFT

void classTFT::Tft_write(uint16_t VAL)
{
	TFT_CS_LOW();
	TFT_WR_LOW();
	//Ponemos el comando en el bus de datos
	PIOD->PIO_ODSR = VAL;
	TFT_WR_HIGH();
	TFT_CS_HIGH();
}

uint16_t classTFT::Tft_read(void)
{
	uint16_t d;
	TFT_CS_LOW();
	TFT_RD_LOW();
	delay_us(1); //delay 1 us
	d = PIOD->PIO_ODSR;
	TFT_RD_HIGH();
	TFT_CS_HIGH();
	return d;
}

/*****************************************************************************
 * @name       :void Tft_WR_REG(uint16_t Reg)	
 * @date       :2020-02-04  
 * @function   :Write an 16-bit command to the LCD screen
 * @parameters :data:Command value to be written
 * @retvalue   :None
******************************************************************************/
void classTFT::Tft_WR_REG(uint16_t Reg)	 
{	
	TFT_DC_LOW();
	Tft_write(Reg);
} 

/*****************************************************************************
 * @name       :void Tft_WR_DATA(uint16_t Data)
 * @date       :2020-02-04 
 * @function   :Write an 16-bit data to the LCD screen
 * @parameters :data:data value to be written
 * @retvalue   :None
******************************************************************************/
void classTFT::Tft_WR_DATA(uint16_t Data)
{
	TFT_DC_HIGH();
	Tft_write(Data);
}

/*****************************************************************************
 * @name       :uint16_t Tft_RD_DATA(void)
 * @date       :2020-02-04 
 * @function   :Read an 16-bit value from the LCD screen
 * @parameters :None
 * @retvalue   :read value
******************************************************************************/
uint16_t classTFT::Tft_RD_DATA(void)
{
	TFT_DC_HIGH();
	return Tft_read();
}

/*****************************************************************************
 * @name       :void Tft_WR_DATA_16Bit(uint16_t Data)
 * @date       :2020-02-04 
 * @function   :Write an 16-bit command to the LCD screen
 * @parameters :Data:Data to be written
 * @retvalue   :None
******************************************************************************/	 
void classTFT::Tft_WR_DATA_16Bit(uint16_t Data)
{
	TFT_DC_HIGH();
	Tft_write(Data);
}

uint16_t classTFT::Color_To_565(uint8_t r, uint8_t g, uint8_t b)
{
	return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3);
}

/*****************************************************************************
 * @name       :uint16_t Tft_ReadData_16Bit(void)
 * @date       :2020-02-04 
 * @function   :Read an 16-bit value from the LCD screen
 * @parameters :None
 * @retvalue   :read value
******************************************************************************/	
uint16_t classTFT::Tft_RD_DATA_16Bit(void)
{
	uint16_t r,g,b;
	TFT_DC_HIGH();
	TFT_CS_LOW();
	
	//dummy data
	TFT_RD_LOW();
	delay_us(1); //delay 1us
	r = PIOD->PIO_ODSR;
	TFT_RD_HIGH();
	
	//8bit:red data
	//16bit:red and green data
	TFT_RD_LOW();
	delay_us(1); //delay 1us
    r = PIOD->PIO_ODSR;	
	TFT_RD_HIGH();
	
	//8bit:green data
	//16bit:blue data
	TFT_RD_LOW();
	delay_us(1); //delay 1us
	g = PIOD->PIO_ODSR;
	TFT_RD_HIGH();
	
		
	TFT_RD_LOW();
	delay_us(1); //delay 1us
	b = PIOD->PIO_ODSR;
	TFT_RD_HIGH();
	b = g>>8;
	g = r&0xFF;
	r = r>>8;
	TFT_CS_HIGH();
	return Color_To_565(r, g, b);
}

/*****************************************************************************
 * @name       :void Tft_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue)
 * @date       :2020-02-04 
 * @function   :Write data into registers
 * @parameters :LCD_Reg:Register address
                LCD_RegValue:Data to be written
 * @retvalue   :None
******************************************************************************/
void classTFT::Tft_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue)
{
    Tft_WR_REG(LCD_Reg);
	Tft_WR_DATA(LCD_RegValue);
}

/*****************************************************************************
 * @name       :void Tft_ReadReg(uint16_t LCD_Reg,uint16_t *Rval,int n)
 * @date       :2020-02-04 
 * @function   :read value from specially registers
 * @parameters :LCD_Reg:Register address
 * @retvalue   :read value
******************************************************************************/
void classTFT::Tft_ReadReg(uint16_t LCD_Reg,uint16_t *Rval,int n)
{
	Tft_WR_REG(LCD_Reg);
	PIOD->PIO_ODSR = 0xffff;
	while(n--)
	{		
		*(Rval++) = Tft_RD_DATA();
	}
	PIOD->PIO_ODSR = 0xffff;
}

/*****************************************************************************
 * @name       :void Tft_WriteRAM_Prepare(void)
 * @date       :2020-02-04 
 * @function   :Write GRAM
 * @parameters :None
 * @retvalue   :None
******************************************************************************/	
void classTFT::Tft_WriteRAM_Prepare(void)
{
 	Tft_WR_REG(lcddev.wramcmd);	  
}

/*****************************************************************************
 * @name       :void Tft_ReadRAM_Prepare(void)
 * @date       :2020-02-04 
 * @function   :Read GRAM
 * @parameters :None
 * @retvalue   :None
******************************************************************************/	 
void classTFT::Tft_ReadRAM_Prepare(void)
{
	Tft_WR_REG(lcddev.rramcmd);
}

/*****************************************************************************
 * @name       :void Tft_Clear(uint16_t Color)
 * @date       :2020-02-04 
 * @function   :Full screen filled LCD screen
 * @parameters :color:Filled color
 * @retvalue   :None
******************************************************************************/	
void classTFT::Tft_Clear(uint16_t Color)
{
	uint16_t i,j;
	Tft_SetWindows(0,0,lcddev.width-1,lcddev.height-1);	
    for(i=0;i<lcddev.width;i++)
	 {
	  for (j=0;j<lcddev.height;j++)
        	 Tft_WR_DATA_16Bit(Color);
	 }
}

/*****************************************************************************
 * @name       :void Tft_DrawPoint(uint16_t x,uint16_t y)
 * @date       :2020-02-04 
 * @function   :Write a pixel data at a specified location
 * @parameters :x:the x coordinate of the pixel
                y:the y coordinate of the pixel
 * @retvalue   :None
******************************************************************************/	
void classTFT::Tft_DrawPoint(uint16_t x,uint16_t y)
{
	Tft_SetWindows(x,y,x,y);
	Tft_WR_DATA_16Bit(POINT_COLOR); 	    
} 

/*****************************************************************************
 * @name       :uint16_t Tft_ReadPoint(uint16_t x,uint16_t y)
 * @date       :2020-02-04 
 * @function   :Read a pixel color value at a specified location
 * @parameters :x:the x coordinate of the pixel
                y:the y coordinate of the pixel
 * @retvalue   :the read color value
******************************************************************************/	
uint16_t classTFT::Tft_ReadPoint(uint16_t x,uint16_t y)
{
	uint16_t color;
	if(x>=lcddev.width||y>=lcddev.height)
	{
		return 0;		
	}
	Tft_SetCursor(x,y);
	Tft_ReadRAM_Prepare();
	PIOD->PIO_ODSR = 0xffff;
	color = Tft_RD_DATA_16Bit();
	PIOD->PIO_ODSR = 0xffff;
	return color;
}	

/*****************************************************************************
 * @name       :void Tft_Reset(void)
 * @date       :2020-02-04 
 * @function   :Reset LCD screen
 * @parameters :None
 * @retvalue   :None
******************************************************************************/	
void classTFT::Tft_Reset(void)
{
	delay_ms(50);	
	TFT_RST_ON();
	delay_ms(50);
	TFT_RST_OFF();
	delay_ms(50);
}


/*****************************************************************************
 * @name       :void Tft_Init(void)
 * @date       :2020-02-04 
 * @function   :Initialization LCD screen
 * @parameters :None
 * @retvalue   :None
******************************************************************************/	 	 
void classTFT::Tft_Init(void)
{
	
	delay_ms(50);
	Tft_Reset(); 
//************* NT35510³υΚΌ»―**********//	
	Tft_WR_REG(0xF000); Tft_WR_DATA(0x55);
	Tft_WR_REG(0xF001); Tft_WR_DATA(0xAA);
	Tft_WR_REG(0xF002); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xF003); Tft_WR_DATA(0x08);
	Tft_WR_REG(0xF004); Tft_WR_DATA(0x01);
	//# AVDD: manual); Tft_WR_DATA(
	Tft_WR_REG(0xB600); Tft_WR_DATA(0x34);
	Tft_WR_REG(0xB601); Tft_WR_DATA(0x34);
	Tft_WR_REG(0xB602); Tft_WR_DATA(0x34);

	Tft_WR_REG(0xB000); Tft_WR_DATA(0x0D);//09
	Tft_WR_REG(0xB001); Tft_WR_DATA(0x0D);
	Tft_WR_REG(0xB002); Tft_WR_DATA(0x0D);
	//# AVEE: manual); Tft_WR_DATA( -6V
	Tft_WR_REG(0xB700); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB701); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB702); Tft_WR_DATA(0x24);

	Tft_WR_REG(0xB100); Tft_WR_DATA(0x0D);
	Tft_WR_REG(0xB101); Tft_WR_DATA(0x0D);
	Tft_WR_REG(0xB102); Tft_WR_DATA(0x0D);
	//#Power Control for
	//VCL
	Tft_WR_REG(0xB800); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB801); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB802); Tft_WR_DATA(0x24);

	Tft_WR_REG(0xB200); Tft_WR_DATA(0x00);

	//# VGH: Clamp Enable); Tft_WR_DATA(
	Tft_WR_REG(0xB900); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB901); Tft_WR_DATA(0x24);
	Tft_WR_REG(0xB902); Tft_WR_DATA(0x24);

	Tft_WR_REG(0xB300); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB301); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB302); Tft_WR_DATA(0x05);

	///Tft_WR_REG(0xBF00); Tft_WR_DATA(0x01);

	//# VGL(LVGL):
	Tft_WR_REG(0xBA00); Tft_WR_DATA(0x34);
	Tft_WR_REG(0xBA01); Tft_WR_DATA(0x34);
	Tft_WR_REG(0xBA02); Tft_WR_DATA(0x34);
	//# VGL_REG(VGLO)
	Tft_WR_REG(0xB500); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xB501); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xB502); Tft_WR_DATA(0x0B);
	//# VGMP/VGSP:
	Tft_WR_REG(0xBC00); Tft_WR_DATA(0X00);
	Tft_WR_REG(0xBC01); Tft_WR_DATA(0xA3);
	Tft_WR_REG(0xBC02); Tft_WR_DATA(0X00);
	//# VGMN/VGSN
	Tft_WR_REG(0xBD00); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xBD01); Tft_WR_DATA(0xA3);
	Tft_WR_REG(0xBD02); Tft_WR_DATA(0x00);
	//# VCOM=-0.1
	Tft_WR_REG(0xBE00); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xBE01); Tft_WR_DATA(0x63);//4f
	//  VCOMH+0x01;
  //#R+
	Tft_WR_REG(0xD100); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD101); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD102); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD103); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD104); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD105); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD106); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD107); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD108); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD109); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD10A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD10B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD10C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD10D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD10E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD10F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD110); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD111); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD112); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD113); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD114); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD115); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD116); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD117); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD118); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD119); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD11A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD11B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD11C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD11D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD11E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD11F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD120); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD121); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD122); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD123); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD124); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD125); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD126); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD127); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD128); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD129); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD12A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD12B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD12C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD12D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD12E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD12F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD130); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD131); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD132); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD133); Tft_WR_DATA(0xC1);
	//#G+
	Tft_WR_REG(0xD200); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD201); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD202); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD203); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD204); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD205); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD206); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD207); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD208); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD209); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD20A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD20B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD20C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD20D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD20E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD20F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD210); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD211); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD212); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD213); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD214); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD215); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD216); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD217); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD218); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD219); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD21A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD21B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD21C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD21D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD21E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD21F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD220); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD221); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD222); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD223); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD224); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD225); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD226); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD227); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD228); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD229); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD22A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD22B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD22C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD22D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD22E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD22F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD230); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD231); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD232); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD233); Tft_WR_DATA(0xC1);
	//#B+
	Tft_WR_REG(0xD300); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD301); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD302); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD303); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD304); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD305); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD306); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD307); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD308); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD309); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD30A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD30B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD30C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD30D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD30E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD30F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD310); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD311); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD312); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD313); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD314); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD315); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD316); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD317); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD318); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD319); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD31A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD31B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD31C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD31D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD31E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD31F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD320); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD321); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD322); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD323); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD324); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD325); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD326); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD327); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD328); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD329); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD32A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD32B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD32C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD32D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD32E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD32F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD330); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD331); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD332); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD333); Tft_WR_DATA(0xC1);

	//#R-///////////////////////////////////////////
	Tft_WR_REG(0xD400); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD401); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD402); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD403); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD404); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD405); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD406); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD407); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD408); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD409); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD40A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD40B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD40C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD40D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD40E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD40F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD410); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD411); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD412); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD413); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD414); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD415); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD416); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD417); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD418); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD419); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD41A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD41B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD41C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD41D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD41E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD41F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD420); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD421); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD422); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD423); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD424); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD425); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD426); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD427); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD428); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD429); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD42A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD42B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD42C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD42D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD42E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD42F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD430); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD431); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD432); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD433); Tft_WR_DATA(0xC1);

	//#G-//////////////////////////////////////////////
	Tft_WR_REG(0xD500); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD501); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD502); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD503); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD504); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD505); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD506); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD507); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD508); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD509); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD50A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD50B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD50C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD50D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD50E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD50F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD510); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD511); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD512); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD513); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD514); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD515); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD516); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD517); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD518); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD519); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD51A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD51B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD51C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD51D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD51E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD51F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD520); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD521); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD522); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD523); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD524); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD525); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD526); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD527); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD528); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD529); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD52A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD52B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD52C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD52D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD52E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD52F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD530); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD531); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD532); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD533); Tft_WR_DATA(0xC1);
	//#B-///////////////////////////////
	Tft_WR_REG(0xD600); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD601); Tft_WR_DATA(0x37);
	Tft_WR_REG(0xD602); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD603); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xD604); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD605); Tft_WR_DATA(0x7B);
	Tft_WR_REG(0xD606); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD607); Tft_WR_DATA(0x99);
	Tft_WR_REG(0xD608); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD609); Tft_WR_DATA(0xB1);
	Tft_WR_REG(0xD60A); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD60B); Tft_WR_DATA(0xD2);
	Tft_WR_REG(0xD60C); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xD60D); Tft_WR_DATA(0xF6);
	Tft_WR_REG(0xD60E); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD60F); Tft_WR_DATA(0x27);
	Tft_WR_REG(0xD610); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD611); Tft_WR_DATA(0x4E);
	Tft_WR_REG(0xD612); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD613); Tft_WR_DATA(0x8C);
	Tft_WR_REG(0xD614); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xD615); Tft_WR_DATA(0xBE);
	Tft_WR_REG(0xD616); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD617); Tft_WR_DATA(0x0B);
	Tft_WR_REG(0xD618); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD619); Tft_WR_DATA(0x48);
	Tft_WR_REG(0xD61A); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD61B); Tft_WR_DATA(0x4A);
	Tft_WR_REG(0xD61C); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD61D); Tft_WR_DATA(0x7E);
	Tft_WR_REG(0xD61E); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD61F); Tft_WR_DATA(0xBC);
	Tft_WR_REG(0xD620); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xD621); Tft_WR_DATA(0xE1);
	Tft_WR_REG(0xD622); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD623); Tft_WR_DATA(0x10);
	Tft_WR_REG(0xD624); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD625); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xD626); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD627); Tft_WR_DATA(0x5A);
	Tft_WR_REG(0xD628); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD629); Tft_WR_DATA(0x73);
	Tft_WR_REG(0xD62A); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD62B); Tft_WR_DATA(0x94);
	Tft_WR_REG(0xD62C); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD62D); Tft_WR_DATA(0x9F);
	Tft_WR_REG(0xD62E); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD62F); Tft_WR_DATA(0xB3);
	Tft_WR_REG(0xD630); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD631); Tft_WR_DATA(0xB9);
	Tft_WR_REG(0xD632); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xD633); Tft_WR_DATA(0xC1);



	//#Enable Page0
	Tft_WR_REG(0xF000); Tft_WR_DATA(0x55);
	Tft_WR_REG(0xF001); Tft_WR_DATA(0xAA);
	Tft_WR_REG(0xF002); Tft_WR_DATA(0x52);
	Tft_WR_REG(0xF003); Tft_WR_DATA(0x08);
	Tft_WR_REG(0xF004); Tft_WR_DATA(0x00);
	//# RGB I/F Setting
	Tft_WR_REG(0xB000); Tft_WR_DATA(0x08);
	Tft_WR_REG(0xB001); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB002); Tft_WR_DATA(0x02);
	Tft_WR_REG(0xB003); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB004); Tft_WR_DATA(0x02);
	//## SDT:
	Tft_WR_REG(0xB600); Tft_WR_DATA(0x08);
	Tft_WR_REG(0xB500); Tft_WR_DATA(0x50);

	//## Gate EQ:
	Tft_WR_REG(0xB700); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xB701); Tft_WR_DATA(0x00);

	//## Source EQ:
	Tft_WR_REG(0xB800); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xB801); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB802); Tft_WR_DATA(0x05);
	Tft_WR_REG(0xB803); Tft_WR_DATA(0x05);

	//# Inversion: Column inversion (NVT)
	Tft_WR_REG(0xBC00); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xBC01); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xBC02); Tft_WR_DATA(0x00);

	//# BOE's Setting(default)
	Tft_WR_REG(0xCC00); Tft_WR_DATA(0x03);
	Tft_WR_REG(0xCC01); Tft_WR_DATA(0x00);
	Tft_WR_REG(0xCC02); Tft_WR_DATA(0x00);

	//# Display Timing:
	Tft_WR_REG(0xBD00); Tft_WR_DATA(0x01);
	Tft_WR_REG(0xBD01); Tft_WR_DATA(0x84);
	Tft_WR_REG(0xBD02); Tft_WR_DATA(0x07);
	Tft_WR_REG(0xBD03); Tft_WR_DATA(0x31);
	Tft_WR_REG(0xBD04); Tft_WR_DATA(0x00);

	Tft_WR_REG(0xBA00); Tft_WR_DATA(0x01);

	Tft_WR_REG(0xFF00); Tft_WR_DATA(0xAA);
	Tft_WR_REG(0xFF01); Tft_WR_DATA(0x55);
	Tft_WR_REG(0xFF02); Tft_WR_DATA(0x25);
	Tft_WR_REG(0xFF03); Tft_WR_DATA(0x01);

	Tft_WR_REG(0x3500); Tft_WR_DATA(0x00);
	Tft_WR_REG(0x3600); Tft_WR_DATA(0x00);
	Tft_WR_REG(0x3a00); Tft_WR_DATA(0x55);  
	Tft_WR_REG(0x1100);
	delay_ms(120); 
	Tft_WR_REG(0x2900 ); 
	Tft_WR_REG(0x2c00);
	Tft_direction(USE_HORIZONTAL);
	TFT_BKL_ON();
}

/*****************************************************************************
 * @name       :void Tft_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
 * @date       :2020 02 04
 * @function   :Setting TFT display window
 * @parameters :xStar:the beginning x coordinate of the LCD display window
								yStar:the beginning y coordinate of the LCD display window
								xEnd:the ending x coordinate of the LCD display window
								yEnd:the ending y coordinate of the LCD display window
 * @retvalue   :None
******************************************************************************/ 
void classTFT::Tft_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{	
	Tft_WR_REG(lcddev.setxcmd);Tft_WR_DATA(xStar>>8);  
	Tft_WR_REG(lcddev.setxcmd+1);Tft_WR_DATA(xStar&0XFF);	  
	Tft_WR_REG(lcddev.setxcmd+2);Tft_WR_DATA(xEnd>>8);   
	Tft_WR_REG(lcddev.setxcmd+3);Tft_WR_DATA(xEnd&0XFF);   
	Tft_WR_REG(lcddev.setycmd);Tft_WR_DATA(yStar>>8);   
	Tft_WR_REG(lcddev.setycmd+1);Tft_WR_DATA(yStar&0XFF);  
	Tft_WR_REG(lcddev.setycmd+2);Tft_WR_DATA(yEnd>>8);   
	Tft_WR_REG(lcddev.setycmd+3);Tft_WR_DATA(yEnd&0XFF); 

	Tft_WriteRAM_Prepare();				
}   

/*****************************************************************************
 * @name       :void Tft_SetCursor(uint16_t Xpos, uint16_t Ypos)
 * @date       :2020 02 04
 * @function   :Set coordinate value
 * @parameters :Xpos:the  x coordinate of the pixel
		        Ypos:the  y coordinate of the pixel
 * @retvalue   :None
******************************************************************************/ 
void classTFT::Tft_SetCursor(uint16_t Xpos, uint16_t Ypos)
{	  	    			
	Tft_SetWindows(Xpos,Ypos,Xpos,Ypos);	
} 

/*****************************************************************************
 * @name       :void Tft_direction(uint8_t direction)
 * @date       :2020 02 04
 * @function   :Setting the display direction of LCD screen
 * @parameters :direction:0-0 degree
                          1-90 degree
						  2-180 degree
						  3-270 degree
 * @retvalue   :None
******************************************************************************/ 
void classTFT::Tft_direction(uint8_t direction)
{ 
	lcddev.setxcmd=0x2A00;
	lcddev.setycmd=0x2B00;
	lcddev.wramcmd=0x2C00;
	lcddev.rramcmd=0x2E00;
	switch(direction){		  
		case 0:						 	 		
			lcddev.width=LCD_W;
			lcddev.height=LCD_H;		
			Tft_WriteReg(0x3600,0x00);
		break;
		case 1:
			lcddev.width=LCD_H;
			lcddev.height=LCD_W;
			Tft_WriteReg(0x3600,(1<<5)|(1<<6));
		break;
		case 2:						 	 		
			lcddev.width=LCD_W;
			lcddev.height=LCD_H;	
			Tft_WriteReg(0x3600,(1<<7)|(1<<6));
		break;
		case 3:
			lcddev.width=LCD_H;
			lcddev.height=LCD_W;
			Tft_WriteReg(0x3600,(1<<7)|(1<<5));
		break;	
		default:break;
	}	
}

/*****************************************************************************
 * @name       :uint16_t Tft_Read_ID(void)
 * @date       :2020 02 04 
 * @function   :Read ID
 * @parameters :None
 * @retvalue   :ID value
******************************************************************************/ 
uint16_t classTFT::Tft_Read_ID(void)
{
	uint16_t val;
	Tft_WR_REG(0xF000);
	Tft_WR_DATA(0x55);
	Tft_WR_REG(0xF001);
	Tft_WR_DATA(0xAA);
	Tft_WR_REG(0xF002);
	Tft_WR_DATA(0x52);
	Tft_WR_REG(0xF003);
	Tft_WR_DATA(0x08);
	Tft_WR_REG(0xF004);
	Tft_WR_DATA(0x01);

    Tft_ReadReg(0xC500,&lcddev.id,1);
	lcddev.id<<=8;
	Tft_ReadReg(0xC501,&val,1);	
	lcddev.id |= val;
	return lcddev.id;
}
	 

 


