OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6864|回复: 4

LCD的ILI9341的颜色显示BGR改不成RGB是什么问题

[复制链接]

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-9-11
在线时间
4 小时
发表于 2023-1-10 16:48:21 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 Ciri 于 2023-1-10 16:57 编辑

这是主函数,主要功能就是让整个屏幕显示红色,但是诡异的是它不管怎么改LCD的配置显示的都是黄色,也就是一直用的是BGR格式
int main()
{
        uint16_t ID;
        delay_init(168);
        Debug_USART_Config();
        printf("\n这是一个LCD实验 \n");
        LCD_Init();
        ID = LCD_Get_ID();
        printf("\n ID = %x \n",ID);
        LCD_OpenWindow(0,0,240,320);
        ILI9341_FillColor(240*320,RED);//RED = 0xF800
        printf("\n结束\n");
  while(1);
}

下面这个LCD配置是从原子哥例程里复制过来的
static void LCD_LLI9341_Config()
{
                LCD_WriteCmd(0xCF);  
                LCD_WriteData(0x00);
                LCD_WriteData(0xC1);
                LCD_WriteData(0X30);
                LCD_WriteCmd(0xED);  
                LCD_WriteData(0x64);
                LCD_WriteData(0x03);
                LCD_WriteData(0X12);
                LCD_WriteData(0X81);
                LCD_WriteCmd(0xE8);  
                LCD_WriteData(0x85);
                LCD_WriteData(0x10);
                LCD_WriteData(0x7A);
                LCD_WriteCmd(0xCB);  
                LCD_WriteData(0x39);
                LCD_WriteData(0x2C);
                LCD_WriteData(0x00);
                LCD_WriteData(0x34);
                LCD_WriteData(0x02);
                LCD_WriteCmd(0xF7);  
                LCD_WriteData(0x20);
                LCD_WriteCmd(0xEA);  
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteCmd(0xC0);    //Power control
                LCD_WriteData(0x1B);   //VRH[5:0]
                LCD_WriteCmd(0xC1);    //Power control
                LCD_WriteData(0x01);   //SAP[2:0];BT[3:0]
                LCD_WriteCmd(0xC5);    //VCM control
                LCD_WriteData(0x30);          //3F
                LCD_WriteData(0x30);          //3C
                LCD_WriteCmd(0xC7);    //VCM control2
                LCD_WriteData(0XB7);
                LCD_WriteCmd(0x36);    // Memory Access Control
据数据手册说发送这个命令后下一条数据的D3位为0的话显示格式就是RGB,所以原本发送0x48的数据我改成了0x40,但是颜色的格式仍然是BGR
                LCD_WriteData(0x40);
                LCD_WriteCmd(0x3A);   
                LCD_WriteData(0x55);
                LCD_WriteCmd(0xB1);   
                LCD_WriteData(0x00);   
                LCD_WriteData(0x1A);
                LCD_WriteCmd(0xB6);    // Display Function Control
                LCD_WriteData(0x0A);
                LCD_WriteData(0xA2);
                LCD_WriteCmd(0xF2);    // 3Gamma Function Disable
                LCD_WriteData(0x00);
                LCD_WriteCmd(0x26);    //Gamma curve selected
                LCD_WriteData(0x01);
                LCD_WriteCmd(0xE0);    //Set Gamma
                LCD_WriteData(0x0F);
                LCD_WriteData(0x2A);
                LCD_WriteData(0x28);
                LCD_WriteData(0x08);
                LCD_WriteData(0x0E);
                LCD_WriteData(0x08);
                LCD_WriteData(0x54);
                LCD_WriteData(0XA9);
                LCD_WriteData(0x43);
                LCD_WriteData(0x0A);
                LCD_WriteData(0x0F);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);                  
                LCD_WriteCmd(0XE1);    //Set Gamma
                LCD_WriteData(0x00);
                LCD_WriteData(0x15);
                LCD_WriteData(0x17);
                LCD_WriteData(0x07);
                LCD_WriteData(0x11);
                LCD_WriteData(0x06);
                LCD_WriteData(0x2B);
                LCD_WriteData(0x56);
                LCD_WriteData(0x3C);
                LCD_WriteData(0x05);
                LCD_WriteData(0x10);
                LCD_WriteData(0x0F);
                LCD_WriteData(0x3F);
                LCD_WriteData(0x3F);
                LCD_WriteData(0x0F);
                LCD_WriteCmd(0x2B);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteData(0x01);
                LCD_WriteData(0x3f);
                LCD_WriteCmd(0x2A);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteData(0x00);
                LCD_WriteData(0xef);         
                LCD_WriteCmd(0x11); //Exit Sleep
                delay_ms(120);
                LCD_WriteCmd(0x29); //display on        

}
除了这个函数其他的程序都是自己写的,我确定0x36这条指令只在这里出现过一次,不明白为什么不能用0x36改成RGB格式,硬件本身应该没有问题,原子哥的例程显示是正确的颜色
也尝试过这个配置函数完全按原子哥给的来,然后再LCD_Init函数里发送0x36和0x00,结果还是显示的BGR,真是让人费解


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-9-11
在线时间
4 小时
 楼主| 发表于 2023-1-10 16:50:05 | 显示全部楼层
下面是一些我认为跟这个关系不大的函数
void LCD_WriteCmd( uint16_t usCmd)
{
         *( __IO uint16_t * )( FSMC_Addr_ILI9341_CMD ) = usCmd;
}
void LCD_WriteData( uint16_t usData)
{
         *( __IO uint16_t * )( FSMC_Addr_ILI9341_DATA ) = usData;
}
uint16_t LCD_ReadData()
{
        uint16_t data;
        data =  *( __IO uint16_t * )( FSMC_Addr_ILI9341_DATA );
        return data;
}

uint16_t LCD_Get_ID()
{
        uint16_t ID;
        LCD_WriteCmd(0xD3);
        LCD_ReadData();
        LCD_ReadData();
        ID = LCD_ReadData();
        ID <<= 8;
        ID |= LCD_ReadData();
        return ID;
}

void Back_Light_Ctr(uint8_t state)
{
        if(state == ENABLE)
                GPIO_SetBits(ILI9341_BK_PORT,ILI9341_BK_PIN);
        else if(state == DISABLE)
                GPIO_ResetBits(ILI9341_BK_PORT,ILI9341_BK_PIN);
}
void LCD_Init()
{
        LCD_GPIO_Init();
        LCD_FSMC_Config();
        LCD_LLI9341_Config();
        Back_Light_Ctr(ENABLE);
}
void LCD_OpenWindow(uint16_t usX ,uint16_t usY ,uint16_t Width , uint16_t Highth )
{
        uint16_t ecx,ecy;
        ecx = usX + Width-1;
        ecy = usY + Highth-1;
        LCD_WriteCmd(0x2A);
        LCD_WriteData(usX>>8);
        LCD_WriteData(usX & 0xFF);
       
        LCD_WriteData(ecx>>8);
        LCD_WriteData(ecx & 0xFF);
       
        LCD_WriteCmd(0x2B);
        LCD_WriteData(usY>>8);
        LCD_WriteData(usY & 0xFF);
       
        LCD_WriteData(ecy>>8);
        LCD_WriteData(ecy & 0xFF);
}       
void ILI9341_FillColor ( uint32_t ulAmout_Point,
uint16_t usColor )
{
         uint32_t i = 0;
         
         LCD_WriteCmd( 0x2C );

         for ( i = 0; i < ulAmout_Point; i ++ )
         LCD_WriteData( usColor );
       
}
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-9-11
在线时间
4 小时
 楼主| 发表于 2023-1-10 16:51:54 | 显示全部楼层
配置的FSMC和原子哥的例程不太一样
void LCD_FSMC_Config()
{
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure = {0};
        FSMC_NORSRAMTimingInitTypeDef  readWriteTiming = {0};
       
/* 使能FSMC时钟*/
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);

        //地址建立时间(ADDSET)为1个HCLK 5/168M=30ns
        readWriteTiming.FSMC_AddressSetupTime      = 0x04;         //地址建立时间
        //数据保持时间(DATAST)+ 1个HCLK = 12/168M=72ns       
        readWriteTiming.FSMC_DataSetupTime         = 0x0f;         //数据建立时间
        //选择控制的模式
        //模式B,异步NOR FLASH模式,与ILI9341的8080时序匹配
        readWriteTiming.FSMC_AccessMode            = FSMC_AccessMode_B;       
       
        /*以下配置与模式B无关*/
        //地址保持时间(ADDHLD)模式A未用到
        readWriteTiming.FSMC_AddressHoldTime       = 0x00;         //地址保持时间
        //设置总线转换周期,仅用于复用模式的NOR操作
        readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
        //设置时钟分频,仅用于同步类型的存储器
        readWriteTiming.FSMC_CLKDivision           = 0x00;
        //数据保持时间,仅用于同步型的NOR       
        readWriteTiming.FSMC_DataLatency           = 0x00;       

       
        FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_Bank1_NORSRAMx;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_NOR;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;
        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_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &readWriteTiming;  
       
        FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure );
       
       
        /* 使能 FSMC_Bank1_NORSRAM4 */
        FSMC_NORSRAMCmd ( FSMC_Bank1_NORSRAMx, ENABLE );  
}
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2022-9-11
在线时间
4 小时
 楼主| 发表于 2023-1-10 16:55:29 | 显示全部楼层
刚刚发现了一个颜色显示异常的问题,板子断电重新上电后直接白屏,按了好多次复位键后才重新显示黄色
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-7-20
在线时间
1 小时
发表于 2023-4-20 15:34:58 | 显示全部楼层
LCD_OpenWindow(0,0,240,320);  这里面应该有0x36的设置
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-19 21:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表