void DataToWrite(u16 data) //核心函数,16位通讯方式
{
//u16 temp; //IO口 的数据接收高低位反了
u16 temp1 = 0;
temp1 |= (data&0x00ff)<<8;
temp1 |= (data&0xff00)>>8;
//temp = GPIO_ReadOutputData(GPIOD);
//GPIO_Write(GPIOD, (data>>8)|(temp&0xff00)); //高8位数据
GPIO_Write(GPIOD, temp1); //低8位数据
//GPIOD->ODR = temp1;
}
//============================================================================
// It will be necessary to wait 120msec after sending Sleep Out command
//(when in Sleep In Mode) before Sleep In command can be sent.
//=============================================================================
void ILI9341_WR_COMD(u16 comm)//write command
{
LCD_RS_LO();
LCD_RD_HI();
LCD_CS_LO();
LCD_WR_LO();
DataToWrite(comm);
LCD_WR_HI();
LCD_CS_HI();
}
void ILI9341_WR_Parameter(u16 data)//write 
arameter
{
LCD_RD_HI();
LCD_RS_HI();
LCD_CS_LO();
LCD_WR_LO();
DataToWrite(data);
LCD_WR_HI();
LCD_CS_HI();
}
void LCD_ILI9341_Init(void)
{
// VCI=2.8V
//LCDBL_EN();
//************* Reset LCD Driver ****************//
LCD_RST_HI();//硬件复位
delay_us(1*8000);// Delay 1ms
LCD_RST_LO();
delay_us(10*8000); // Delay 10ms // This delay time is necessary
LCD_RST_HI();
delay_us(120*8000); // Delay 120 ms
//************* Start Initial Sequence **********//
ILI9341_WR_COMD(0xCF);
ILI9341_WR_Parameter (0x00);
//ILI9341_WR_Parameter (0x8B);
ILI9341_WR_Parameter (0x81);
ILI9341_WR_Parameter (0X30);
ILI9341_WR_COMD(0xED);
//ILI9341_WR_Parameter (0x67);
ILI9341_WR_Parameter (0x64);
ILI9341_WR_Parameter (0x03);
ILI9341_WR_Parameter (0X12);
ILI9341_WR_Parameter (0X81);
ILI9341_WR_COMD(0xE8);
ILI9341_WR_Parameter(0x85);
ILI9341_WR_Parameter (0x10);
ILI9341_WR_Parameter (0x7A);
ILI9341_WR_COMD(0xCB);
ILI9341_WR_Parameter (0x39);
ILI9341_WR_Parameter (0x2C);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x34);
ILI9341_WR_Parameter (0x02);
ILI9341_WR_COMD(0xF7);
ILI9341_WR_Parameter (0x20);
ILI9341_WR_COMD(0xEA);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_COMD(0xC0); //Power control
//ILI9341_WR_Parameter (0x1B); //VRH[5:0]
ILI9341_WR_Parameter (0x2E); //VRH[5:0]
ILI9341_WR_COMD(0xC1); //Power control
//ILI9341_WR_Parameter (0x10); //SAP[2:0];BT[3:0]
ILI9341_WR_Parameter (0x12); //SAP[2:0];BT[3:0]
ILI9341_WR_COMD(0xC5); //VCM control
ILI9341_WR_Parameter (0x3F);
ILI9341_WR_Parameter (0x3C);
ILI9341_WR_COMD(0xC7); //VCM control2
//ILI9341_WR_Parameter (0XB7);
ILI9341_WR_Parameter (0X90);
/***************************
***************************/
ILI9341_WR_COMD (0X2A);
ILI9341_WR_Parameter (0X00);
ILI9341_WR_Parameter (0X00);
ILI9341_WR_Parameter (0X01);
ILI9341_WR_Parameter (0X3F);
ILI9341_WR_COMD (0X2B);
ILI9341_WR_Parameter (0X00);
ILI9341_WR_Parameter (0X00);
ILI9341_WR_Parameter (0X00);
ILI9341_WR_Parameter (0XEF);
ILI9341_WR_COMD(0x36); // Memory Access Control
//ILI9341_WR_Parameter (0x08);
ILI9341_WR_Parameter (0xA8);
ILI9341_WR_COMD(0x3A);
ILI9341_WR_Parameter (0x55);
ILI9341_WR_COMD(0xB1);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x1B);
ILI9341_WR_COMD(0xB6); // Display Function Control
ILI9341_WR_Parameter (0x0A);
ILI9341_WR_Parameter (0xA2);
ILI9341_WR_COMD(0xF2); // 3Gamma Function Disable
ILI9341_WR_Parameter (0x00);
ILI9341_WR_COMD(0x26); //Gamma curve selected
ILI9341_WR_Parameter (0x01);
ILI9341_WR_COMD(0xE0); //Set Gamma
ILI9341_WR_Parameter (0x0F);
ILI9341_WR_Parameter (0x2A);
ILI9341_WR_Parameter (0x28);
ILI9341_WR_Parameter (0x08);
ILI9341_WR_Parameter (0x0E);
ILI9341_WR_Parameter (0x08);
ILI9341_WR_Parameter(0x54);
ILI9341_WR_Parameter(0XA9);
ILI9341_WR_Parameter (0x43);
ILI9341_WR_Parameter(0x0A);
ILI9341_WR_Parameter (0x0F);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x00);
ILI9341_WR_COMD(0XE1); //Set Gamma
ILI9341_WR_Parameter (0x00);
ILI9341_WR_Parameter (0x15);
ILI9341_WR_Parameter (0x17);
ILI9341_WR_Parameter (0x07);
ILI9341_WR_Parameter (0x11);
ILI9341_WR_Parameter (0x06);
ILI9341_WR_Parameter (0x2B);
ILI9341_WR_Parameter (0x56);
ILI9341_WR_Parameter (0x3C);
ILI9341_WR_Parameter (0x05);
ILI9341_WR_Parameter (0x10);
ILI9341_WR_Parameter (0x0F);
ILI9341_WR_Parameter (0x3F);
ILI9341_WR_Parameter (0x3F);
ILI9341_WR_Parameter (0x0F);
ILI9341_WR_COMD(0x11); //Exit Sleep
delay_us(120*8000);
ILI9341_WR_COMD(0x29); //Display on
delay_us(10*8000);
ILI9341_WR_COMD(0x2c);
}
void LCD_WR_REG(u16 Index,u16 CongfigTemp)
{
LCD_RS_LO(); //写地址
LCD_CS_LO();
LCD_RD_HI();
LCD_WR_LO();
DataToWrite(Index);
LCD_WR_HI();
LCD_WR_LO();
LCD_RS_HI();
DataToWrite(CongfigTemp);
//LCD_WR_LO();
LCD_WR_HI();
LCD_CS_HI();
}
void LCD_SetCursor(uint16_t x, uint16_t y)
{
ILI9341_WR_COMD(0X2A); /* 设置X坐标 */
ILI9341_WR_Parameter(x>>8); /* 先高8位,然后低8位 */
ILI9341_WR_Parameter(x&0xff); /* 设置起始点和结束点*/
ILI9341_WR_Parameter(x>>8);
ILI9341_WR_Parameter(x&0xff);
ILI9341_WR_COMD(0X2B); /* 设置Y坐标*/
ILI9341_WR_Parameter(y>>8);
ILI9341_WR_Parameter(y&0xff);
ILI9341_WR_Parameter(y>>8);
ILI9341_WR_Parameter(y&0xff);
}
void Lcd_WR_Start(void)
{
LCD_CS_LO();
LCD_RS_LO();
LCD_RD_HI();
LCD_WR_LO();
DataToWrite(0x0022);
//LCD_WR_LO();
LCD_WR_HI();
LCD_RS_HI();
}
void Lcd_Clear(u16 Color)
{
u32 temp;
LCD_SetCursor(0x00, 0x0000);
LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
LCD_WR_REG(0x0051,239);//水平GRAM终止位置
LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
Lcd_WR_Start();
LCD_RS_HI();
for (temp = 0; temp
{
ILI9341_WR_Parameter(Color);
}
}
u16 LCD_RD_DATA(void)
{
u16 tmp,tmp1,tmp2;
//PSendChars((u8*)&tmp,2);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIOD->ODR=0X0000; //全部输出0
LCD_RS_HI();
LCD_RD_LO();
LCD_WR_HI();
LCD_CS_LO();
tmp1 = GPIO_ReadInputData(GPIOD);
tmp2 = tmp1;
PSendChars((u8*)&tmp2,2);
tmp = ((tmp1>>8)|(tmp2<<8));
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIOB->ODR=0XFFFF; //全部输出高
LCD_RD_HI();
LCD_CS_HI();
//PSendChars((u8*)&tmp,2);
return tmp;
}
u16 LCD_ReadReg(u8 LCD_Reg)
{
ILI9341_WR_COMD(LCD_Reg); //写入要读的寄存器号
return LCD_RD_DATA();
}
void LCD_Init(void)
{
u16 DeviceCode;
//DataToWrite(0XFFFF);
delay_us(8000*50);
LCD_WR_REG(0x0000,0x0001);
delay_us(8000*50);
DeviceCode = LCD_ReadReg(0x0000);
PSendChars((u8*)&DeviceCode,2);
if(DeviceCode==0||DeviceCode==0XFFFF)//读到ID不正确
{
//可能是9341,尝试9341的ID读取
ILI9341_WR_Parameter(0XD3);
LCD_RD_DATA();//dummy read
LCD_RD_DATA();//读回0X00
DeviceCode=LCD_RD_DATA()&0XBF;//这里读回0XD3,实际是0X93才对.强制去掉第6位
DeviceCode<<=8;
DeviceCode|=LCD_RD_DATA();
}
PSendChars((u8*)&DeviceCode,2);
//printf("
LCD_ILI9341_Init();
delay_us(8000*10);
//LCD_REG_Config();
Lcd_Clear(0XF800);
}