嵌入式linux tft刷屏,TFT刷屏速度问题

这段代码主要展示了如何初始化ILI9341液晶显示屏,包括设置通讯参数、硬件复位、发送初始化序列等步骤。此外,还定义了用于写入命令和参数的函数,以及读写数据的低级别接口。代码中特别处理了数据传输时高低位的反转问题,确保正确通信。
摘要由CSDN通过智能技术生成

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&nbsp

titter.gifarameter

{

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值