高级会员

- 积分
- 523
- 金钱
- 523
- 注册时间
- 2015-4-25
- 在线时间
- 158 小时
|
5金钱
最近在调3.5寸ILI9486L控制芯片的程序,现在可以刷屏显示颜色,但是刷屏的时候有时会有部分区域花屏,显示黑色的条纹,有没有调试好的ILI9486L的程序,希望借鉴一下。附上我的程序:
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{
*(__IO u16 *)(Bank1_LCD_REG)=regval;//写入要写的寄存器序号
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{
*(__IO u16 *)(Bank1_LCD_RAM)=data;
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
return *(__IO u16 *)(Bank1_LCD_RAM);
}
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue)
{
*(__IO u16 *)(Bank1_LCD_REG) = LCD_Reg; //写入要写的寄存器序号
*(__IO u16 *)(Bank1_LCD_RAM) = LCD_RegValue;//写入数据
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
*(__IO u16 *)(Bank1_LCD_REG)=0x002C;
}
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
LCD_WR_REG(0X2A);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0XFF);
LCD_WR_REG(0X2B);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&0XFF);
}
//画点
//x,y:坐标
//color:此点的颜色
void LCD_PutPixel(u16 x,u16 y,u16 color)
{
LCD_SetCursor(x,y);//设置光标位置
*(__IO u16 *)(Bank1_LCD_REG)=0x002C;//开始写入GRAM
*(__IO u16 *)(Bank1_LCD_RAM)=color;
}
//读取个某点的颜色值
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 color;
LCD_SetCursor(x,y);
LCD_WR_REG(0X2E); //发送读GRAM指令
LCD_RD_DATA(); //无效数据
color=*(__IO u16 *)(Bank1_LCD_RAM); //实际坐标颜色
return color;
}
void TFTLCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟
//PG6->LCD_BL
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PG6 推挽输出,控制背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 //PG6 推挽输出,控制背光
GPIO_SetBits(GPIOG,GPIO_Pin_6);
//启用fsmc复用功能 复用上拉模式
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_14 //D0
|GPIO_Pin_15 //D1
|GPIO_Pin_0 //D2
|GPIO_Pin_1 //D3
|GPIO_Pin_8 //D13
|GPIO_Pin_9 //D14
|GPIO_Pin_10;//D15
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用模式
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz翻转速度
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7 //D4
|GPIO_Pin_8 //D5
|GPIO_Pin_9 //D6
|GPIO_Pin_10 //D7
|GPIO_Pin_11 //D8
|GPIO_Pin_12 //D9
|GPIO_Pin_13 //D10
|GPIO_Pin_14 //D11
|GPIO_Pin_15;//D12
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5; //WR
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12; //RD
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5//RS
|GPIO_Pin_12;//CS
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//D2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//D3
GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);//D13
GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);//D14
GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);//D15
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);//D0
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//D1
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//D4
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);//D5
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);//D6
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);//D7
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);//D8
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);//D9
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);//D10
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);//D11
GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//D12
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);//WR
GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//RD
GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC);//RS
GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);//CS
readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 60; //数据保存时间为60个HCLK =6*60=360ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime =9; //地址建立时间(ADDSET)为9个HCLK =54ns
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A
writeTiming.FSMC_DataSetupTime = 8; //数据保存时间为6ns*9个HCLK=54ns
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 这里我们使用NE4 ,也就对应BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
delay_ms(50); // delay 50 ms
LCD_WriteReg(0x36, 0x68); // memory access control MY=0, MX=1, MV=1, BGR=1
LCD_WriteReg(0x3A,0x55); //Interface Pixel Format ( DPI[3:0] - DBI[2:0] ) 16 bit/pixel, CPU interface format
// DM, RM = 0
LCD_WriteReg(0xB0,0x00); //Interface Mode Control (SDA_EN 000 VSPL HSPL DPL EPL )ARM--DPL: PCLK polarity set (??data fetched at the rising time, //??data fetched at the falling time)SET DPL=1
LCD_WR_REG(0xB6); //Display Function Control
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x42);
LCD_WR_DATA(0x3B);
LCD_WriteReg(0xB4,0x00); //(000 ZINV 00 DINV[1:0]) Z-INV DINV
LCD_WR_REG(0xB1); // frame rate = 50Hz, Horizontal line period = 17clk (what does this mean??)
LCD_WR_DATA(0x80);
LCD_WR_DATA(0x11);
LCD_WriteReg(0xB7, 0x07); // extra
// Power settings
LCD_WR_REG(0xC1); //(0100 0 BT[2:0]) (0000 0 VC[2:0])
LCD_WR_DATA(0x41);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xC5);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x53);
LCD_WR_DATA(0x00);
LCD_WriteReg(0xC2, 0x33); //extra
LCD_WriteReg(0x35, 0x00); // enable tearing effect line
//Gamma Setting_10323
LCD_WR_REG(0xE0);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x18);
LCD_WR_DATA(0x0B);
LCD_WR_DATA(0x0E);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x94);
LCD_WR_DATA(0x35);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x08);
LCD_WR_DATA(0x03);
LCD_WR_DATA(0x00);
//Gamma Setting_10323
LCD_WR_REG(0xE1);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x3A);
LCD_WR_DATA(0x37);
LCD_WR_DATA(0x0B);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x4A);
LCD_WR_DATA(0x24);
LCD_WR_DATA(0x39);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x10);
LCD_WR_DATA(0x04);
LCD_WR_DATA(0x27);
LCD_WR_DATA(0x25);
LCD_WR_DATA(0x00);
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
LCD_WR_REG(0x002C); //开始写数据
LCD_Clear(RED);
}
//清屏函数
//color:要清屏的填充色
void LCD_Clear(u16 color)
{
u32 index=0;
LCD_SetCursor(0x00,0x00); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(index=0;index<153600;index++)
{
*(__IO u16 *)(Bank1_LCD_RAM)=color;
}
}
|
|