//初始化LCD
//注:改初始化函数能够初始化各类ILI93XX液晶,可是其余函数是基于ILI9320的!!!
//在其余型号的驱动芯片上没有测试!
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
FSMC_NORSRAMInitTypeDef FSMC_NSInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); //使能 FSMC 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|
RCC_APB2Periph_AFIO, ENABLE); // ①使能GPIO 以及AFIO 复用功能时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //②初始化 PB0
//PORTD 复用推挽输出
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); //②初始化 PORTD
//PORTE 复用推挽输出
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|
GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure); //②初始化 PORTE
//PORTG12 复用推挽输出 A0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; //PORTD
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; //PORTD 复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure); //②初始化 PORTG
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址创建时间 2 个 HCLK 1
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间模式 A 未用到
readWriteTiming.FSMC_DataSetupTime = 0x0f; // 数据保存时间为 16 个 HCLK
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式 A
writeTiming.FSMC_AddressSetupTime = 0x00; //地址创建时间为 1 个 HCLK
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间( A
writeTiming.FSMC_DataSetupTime = 0x03; //数据保存时间为 4 个 HCLK
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式 A
FSMC_NSInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; //这里咱们使用NE4,也就对应BTCR[6],[7]。
FSMC_NSInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //不复用数据地址
FSMC_NSInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; // SRAM
FSMC_NSInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //存储器数据宽度为 16bit
FSMC_NSInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NSInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NSInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NSInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NSInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NSInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //存储器写使能
FSMC_NSInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NSInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
// 读写使用不一样的时序
FSMC_NSInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NSInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
FSMC_NSInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NSInitStructure); //③初始化FSMC 配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); //④使能BANK1
delay_ms(50); // delay 50 ms
lcddev.id = LCD_ReadReg(0x0000); //读ID(9320\9325\9328\4531\4535等IC)
if(lcddev.id < 0xff || lcddev.id == 0xffff || lcddev.id == 0x9300)
//ID不正确,新增0x9300判断,由于9341在未被复位时,会被读成9300
{
//尝试9341 ID的读取
LCD_WR_REG(0xd3);
lcddev.id = LCD_RD_DATA(); //dummy read
lcddev.id = LCD_RD_DATA(); //读到0x00
lcddev.id = LCD_RD_DATA(); //读到93
lcddev.id <<= 8;
lcddev.id |= LCD_RD_DATA(); //读取41
if(lcddev.id != 0x9341) //非9341,尝试是否是6804
{
LCD_WR_REG(0xBF);
lcddev.id = LCD_RD_DATA(); //dummy read
lcddev.id = LCD_RD_DATA(); //读到0x01
lcddev.id = LCD_RD_DATA(); //读到0xD0
lcddev.id = LCD_RD_DATA(); //读到0x68
lcddev.id <<= 8;
lcddev.id |= LCD_RD_DATA(); //读取0x04
if(lcddev.id != 0x6804) //也不是6804,尝试NT35310
{
LCD_WR_REG(0xd4);
lcddev.id = LCD_RD_DATA(); //dummy read
lcddev.id = LCD_RD_DATA(); //读到0x01
lcddev.id = LCD_RD_DATA(); //读到0x53
lcddev.id <<= 8;
lcddev.id |= LCD_RD_DATA(); //读取0x10
if(lcddev.id != 0x5310) //也不是NT35310,尝试NT35110
{
LCD_WR_REG(0xda00);
lcddev.id = LCD_RD_DATA(); //读回0x00
LCD_WR_REG(0xdb00);
lcddev.id = LCD_RD_DATA(); //读回0x80
lcddev.id <<= 8;
LCD_WR_REG(0xdc00);
lcddev.id |= LCD_RD_DATA(); //读回0x00
if(lcddev.id == 0x8000)
lcddev.id == 0x5510; //NT35510读回的ID是8000H,为方便区分,咱们强制设置为5510
if(lcddev.id != 0x5510) //也不是5510,尝试SSD1963
{
LCD_WR_REG(0xa1);
lcddev.id = LCD_RD_DATA();
lcddev.id = LCD_RD_DATA(); //读回0x57
lcddev.id <<= 8;
lcddev.id |= LCD_RD_DATA(); //读回0x61
if(lcddev.id == 0x5761)
lcddev.id == 0x1963; //SSD1963读回的ID是5761H,为方便区分,咱们强制设置为1963
}
}
}
}
}
printf(" LCD ID:%x\r\n",lcddev.id); //打印 LCD ID
if(lcddev.id==0X9341) //9341 初始化
{
……//9341 初始化代码
}
else if(lcddev.id==0xXXXX) //其余 LCD 初始化代码
{
……//其余 LCD 驱动 IC,初始化代码
}
LCD_Display_Dir(0); //默认为竖屏显示
LCD_LED=1; //点亮背光
LCD_Clear(WHITE);
}