OpenEdv-开源电子网

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

ILI9486出现花屏,颜色显示也不正常,请教了

[复制链接]

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-4-18 09:57:45 | 显示全部楼层 |阅读模式
5金钱
各位坛友好,又来麻烦大家了,我买了一块ILI9486的液晶屏,采用8080的8位接口通讯,现在出现的问题是花屏,我硬件调试的时候命令数据都是发送正常的,各个控制信号也是正常,下面是我的初始化程序(我用的是GPIOB的高8位)
#include"ili9486.h"
#include"stm32f10x_conf.h"

//外部引脚定义

//背光控制引脚 
#define LCD9468_ON  GPIO_SetBits(GPIOA,GPIO_Pin_0);
#define LCD9468_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_0);

//片选,低有效
#define LCD9468_Cs_1  GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define LCD9468_Cs_0  GPIO_ResetBits(GPIOA,GPIO_Pin_1);
//数据命令,
#define LCD9468_Set_Rs  GPIO_SetBits(GPIOA,GPIO_Pin_2);
#define LCD9468_Clr_Rs  GPIO_ResetBits(GPIOA,GPIO_Pin_2);
//写数据 低状态写数据,上升沿ili9486读取数据
#define LCD9468_Set_Wr GPIO_SetBits(GPIOA,GPIO_Pin_3);
#define LCD9468_Clr_Wr GPIO_ResetBits(GPIOA,GPIO_Pin_3);
//读数据,低有效
#define LCD9468_Set_Rd  GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define LCD9468_Clr_Rd  GPIO_ResetBits(GPIOA,GPIO_Pin_4);
//复位
#define LCD9468_Set_rest  GPIO_SetBits(GPIOA,GPIO_Pin_5);
#define LCD9468_Clr_rest  GPIO_ResetBits(GPIOA,GPIO_Pin_5);

#define LCD9468_DATAIN   GPIO_ReadInputData(GPIOB); 
#define LCD9468_DATAOUT(X)  GPIO_Write(GPIOB,X);

extern void delay_ms(u32 timer);

void Delay(u32 value)
{
  delay_ms(value);

}

 void LCD_delay(u32 time)
 {
  delay_ms(time);
 }
//将端口B设置成输出模式
GPIO_InitTypeDef GPIOB_IN;

 void SET_GPIOB_OUT()
 {

   GPIOB_IN.GPIO_Pin=GPIO_Pin_All;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

   GPIOB_IN.GPIO_Speed=GPIO_Speed_50MHz;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

   GPIOB_IN.GPIO_Mode=GPIO_Mode_Out_PP;    /*!< Specifies the operating mode for the selected pins.
   */
   GPIO_Init(GPIOB,&GPIOB_IN);

 }

void SET_GPIOIN()
{
 
   GPIOB_IN.GPIO_Pin=GPIO_Pin_All;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

   GPIOB_IN.GPIO_Speed=GPIO_Speed_50MHz;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

   GPIOB_IN.GPIO_Mode=GPIO_Mode_IN_FLOATING;    /*!< Specifies the operating mode for the selected pins.
   */
   GPIO_Init(GPIOB,&GPIOB_IN);

}

void WriteComm(unsigned int i)
{
LCD9468_Cs_0;         //CS0=0;
LCD9468_Set_Rd;       //RD0=1;
LCD9468_Clr_Rs;       //RS=0;

SET_GPIOB_OUT();
LCD9468_Clr_Wr;       //WR0=0;
LCD9468_DATAOUT(i<<8);   //DBL=i;用B口的高8位   

LCD9468_Set_Wr;       //WR0=1; 

LCD9468_Cs_1;         //CS0=1; 
}

//写命令参数
void WriteData(unsigned int i)
{
LCD9468_Cs_0;         //CS0=0;
LCD9468_Set_Rd;       //RD0=1;
LCD9468_Set_Rs;       //RS=1;  

//DBH=i>>8; 
//WR0=0;  
//WR0=1; 
SET_GPIOB_OUT();
LCD9468_Clr_Wr;       //WR0=0;
LCD9468_DATAOUT(i<<8);   //DBL=i;   
 
LCD9468_Set_Wr;       //WR0=1;

LCD9468_Cs_1;         //CS0=1;
}



void WriteDispData(unsigned int data)
{
LCD9468_Cs_0;          //CS0=0;
LCD9468_Set_Rd;        //RD0=1;
LCD9468_Set_Rs;        //RS=1;
SET_GPIOB_OUT(); 
LCD9468_Clr_Wr;           //WR0=0;  
LCD9468_DATAOUT(data); //DBL=DataH;写高8位
 
LCD9468_Set_Wr;           //WR0=1;
LCD9468_Clr_Wr;           //WR0=0;
LCD9468_DATAOUT(data<<8);   //DBL=DataL; 写低8位
  
LCD9468_Set_Wr;           //WR0=1;
 
 

LCD9468_Cs_1;              //CS0=1;
}

 void WriteInitData(unsigned int data)
{

     LCD9468_Cs_0;          //CS0=0;
LCD9468_Set_Rd;        //RD0=1;
LCD9468_Set_Rs;        //RS=1;
SET_GPIOB_OUT();
LCD9468_Clr_Wr;           //WR0=0; 
LCD9468_DATAOUT(data); //DBL=DataH;写高8位
 
LCD9468_Set_Wr;           //WR0=1;
LCD9468_Clr_Wr;           //WR0=0;  
LCD9468_DATAOUT(data<<8);   //DBL=DataL; 写低8位
 
LCD9468_Set_Wr;           //WR0=1;
   
 

     LCD9468_Cs_1;             // CS0=1;
}

void WriteOneDot(unsigned int color)


LCD9468_Cs_0;          //CS0=0;  
LCD9468_Set_Rd;        //RD0=1;
LCD9468_Set_Rs;        //RS=1;

SET_GPIOB_OUT();
LCD9468_Clr_Wr;           //WR0=0;
LCD9468_DATAOUT(color);//DBL=color<<8; 

LCD9468_Set_Wr;           //WR0=1;
LCD9468_Clr_Wr;           //WR0=0;
LCD9468_DATAOUT(color<<8);//DBL=color;

LCD9468_Set_Wr;           //WR0=1;

LCD9468_Cs_1;             //CS0=1;
}



u16 Read_data(u16 rag)
{
  u16 k;
  WriteComm(rag);
  SET_GPIOIN();
  LCD9468_Cs_0;
  LCD9468_Set_Wr;
  LCD9468_Clr_Rd;
  k=GPIO_ReadInputData(GPIOB);
  LCD9468_Set_Rd; 
  LCD9468_Cs_1;

  return k;
}

// 用的是GPIO的高8位
void LCD_Init(void)
{
GPIO_InitTypeDef GpioAinit;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
  
    GpioAinit.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

    GpioAinit.GPIO_Speed=GPIO_Speed_50MHz;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */
    GpioAinit.GPIO_Mode=GPIO_Mode_Out_PP; 
    GPIO_Init(GPIOA, &GpioAinit);


LCD9468_Set_rest;            //RST=1;  
Delay(200);

LCD9468_Clr_rest;            //RST=0;
Delay(800);

LCD9468_Set_rest;            //RST=1;
Delay(800);

   WriteComm(0x00B0);
   WriteData(0x0000);
   WriteComm(0x0011);
   Delay(30);
   
   WriteComm(0x00B3);
   WriteData(0x0002);
   WriteData(0x0000);
   WriteData(0x0000);
   WriteData(0x0000);

   WriteComm(0x00C0);
   WriteData(0x0010);
   WriteData(0x003B);
   WriteData(0x0000);
   WriteData(0x0002);
   WriteData(0x0000);
   WriteData(0x0001);
   WriteData(0x0000);
   WriteData(0x0043);

   WriteComm(0x00C1);
   WriteData(0x0010);
   WriteData(0x0010);
   WriteData(0x0008);
   WriteData(0x0008);

//   WriteComm(0x00B6);
//   WriteData(0x0000);
//   WriteData(0x0062);
//   WriteData(0x003B);

   WriteComm(0x00C4);
   WriteData(0x0011);
   WriteData(0x0007);
   WriteData(0x0003);
   WriteData(0x0003);

 

   WriteComm(0x00C6);
   WriteData(0x0000);

   WriteComm(0x00C8); //Gamma
   WriteData(0x0003);
   WriteData(0x0003);
   WriteData(0x0013);
   WriteData(0x005c);
   WriteData(0x0003);
   WriteData(0x0007);
   WriteData(0x0014);
   WriteData(0x0008);
   WriteData(0x0000);
   WriteData(0x0021);
   WriteData(0x0008);
   WriteData(0x0014);
   WriteData(0x0007);
   WriteData(0x0053);
   WriteData(0x000c);
   WriteData(0x0013);
   WriteData(0x0003);
   WriteData(0x0003);
   WriteData(0x0021);
   WriteData(0x0000);

   WriteComm(0x0035);
   WriteData(0x0000);

   WriteComm(0x0036);
   WriteData(0x0008);

   WriteComm(0x003A);
   WriteData(0x0055);

   WriteComm(0x0044);
   WriteData(0x0000);
   WriteData(0x0001);

   WriteComm(0x00B6);
   WriteData(0x0000);
   WriteData(0x0022);
   WriteData(0x003B);

   WriteComm(0x00D0);
   WriteData(0x0007);
   WriteData(0x0007);
   WriteData(0x001D);

   WriteComm(0x00D1);
   WriteData(0x0000);
   WriteData(0x0003);
   WriteData(0x0000);

   WriteComm(0x00D2);
   WriteData(0x0003);
   WriteData(0x0014);
   WriteData(0x0004);

   WriteComm(0x0029);
   Delay(500);
}


void LCD_clear(u16 color)
{

u16 k=0;
WriteComm(0x002);
    WriteData(0);     // Xstart>>8
WriteData(0);     //Xstart&0xff
WriteData(271);    //Xend>>8
WriteData(271<<8);       //Xend&0xff

WriteComm(0x002b);   
WriteData(0); //Ystart>>8
WriteData(0);  // Ystart&0xff
WriteData(479);  //Yend>>8
WriteData(479<<8); // Yend&0xff
SET_GPIOB_OUT();
WriteComm(0x002c);
   for(k=0;k<240*480;k++)
   {
        LCD9468_DATAOUT(color); // DBL=color>>8;

LCD9468_Clr_Wr;              //WR0=0;  
   LCD9468_Set_Wr;              //WR0=1;
 
   LCD9468_DATAOUT(color<<8);    //DBL=color;
LCD9468_Clr_Wr;              //WR0=0;  
   LCD9468_Set_Wr;              //WR0=1;
  

   }

搞了一周多了,还是这样,看了很多人的初始化函数,也也尝试了横多初始化函数,现在还是这样,真不知道是什么问题,求教啊

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-18 22:58:46 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-5-4
在线时间
3 小时
发表于 2015-5-4 15:06:05 | 显示全部楼层
楼主解决了没,我也遇到同样的问题,貌似屏也是一样的。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-5-4
在线时间
0 小时
发表于 2015-5-4 15:37:08 | 显示全部楼层
WriteData和WriteComm中添加适当的延时试试
回复

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
 楼主| 发表于 2015-5-10 10:05:27 | 显示全部楼层
回复【4楼】skyloveraining:
---------------------------------
确实是延时的问题,我吧延时加长了,就没有问题了,现在显示很正常,就是从ILI9486读出显示数据还不行
回复

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
 楼主| 发表于 2015-5-10 10:06:28 | 显示全部楼层
---------------------------------
回复【3楼】samyon:
---------------------------------
现在解决了,但是从ILI9486读出数据还不行,正在研究.....
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-6-18
在线时间
4 小时
发表于 2021-6-21 13:59:28 | 显示全部楼层
creating 发表于 2015-5-10 10:06
---------------------------------
回复【3楼】samyon:
---------------------------------
现在解决了, ...

请问是加长哪个位置的延时呢?
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-6-18
在线时间
4 小时
发表于 2021-6-21 19:23:50 | 显示全部楼层
Erickson55555 发表于 2021-6-21 13:59
请问是加长哪个位置的延时呢?

这边检查到原因了,是因为控制脚接线错误。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 23:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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