打印
[STM32F4]

驱动ILI9341的lcd能写进数据,屏却没反应,怎么回事呢。。。

[复制链接]
9703|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
郡吻魍|  楼主 | 2015-1-26 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神帮帮忙。。。
初始化代码
void LCD_WR_REG(unsigned char Data)
{
        OLED_CS_RESET;
        OLED_RD_SET;
        OLED_RS_RESET;       
        DATAOUT(Data);
        OLED_WR_RESET;
        OLED_WR_SET;  
  OLED_CS_SET;       
}
void LCD_WR_DATA (unsigned char Data)
{
        OLED_CS_RESET;
        OLED_RS_SET;
        OLED_RD_SET;
        DATAOUT(Data);
        OLED_WR_RESET;
        OLED_WR_SET;
        OLED_CS_SET;
}
void LCD_Init()
{



        //LCD RESET
        OLED_RST_SET;
        delay_ms(1);
        OLED_RST_RESET;
        delay_ms(20);
        OLED_RST_SET;
        delay_ms(120);   

        //LCD Initiate
        LCD_WR_REG(0xCF);
        LCD_WR_DATA (0x00);
        LCD_WR_DATA (0x81);
        LCD_WR_DATA (0X30);
        LCD_WR_REG(0xED);
        LCD_WR_DATA (0x64);
        LCD_WR_DATA (0x03);
        LCD_WR_DATA (0X12);
        LCD_WR_DATA (0X81);
        LCD_WR_REG(0xE8);
        LCD_WR_DATA (0x85);
        LCD_WR_DATA (0x10);
        LCD_WR_DATA (0x7A);
        LCD_WR_REG(0xCB);
        LCD_WR_DATA (0x39);
        LCD_WR_DATA (0x2C);
        LCD_WR_DATA (0x00);
        LCD_WR_DATA (0x34);
        LCD_WR_DATA (0x02);
        LCD_WR_REG(0xF7);
        LCD_WR_DATA (0x20);
        LCD_WR_REG(0xEA);
        LCD_WR_DATA (0x00);
        LCD_WR_DATA (0x00);
        LCD_WR_REG(0xC0); //Power control
        LCD_WR_DATA (0x21); //VRH[5:0]
        LCD_WR_REG(0xC1); //Power control
        LCD_WR_DATA (0x11); //SAP[2:0];BT[3:0]
        LCD_WR_REG(0xC5); //VCM control
        LCD_WR_DATA (0x3F);
        LCD_WR_DATA (0x3C);
        LCD_WR_REG(0xC7); //VCM control
        LCD_WR_DATA (0x9E);
        LCD_WR_REG(0x3A); // Memory Access Control
        LCD_WR_DATA (0x55);
        LCD_WR_REG(0x36); // Memory Access Control
        LCD_WR_DATA (0x48);
        LCD_WR_REG(0xB1);
        LCD_WR_DATA (0x00);
        LCD_WR_DATA (0x1B);
        LCD_WR_REG(0xB6); // Display Function Control
        LCD_WR_DATA (0x0A);
        LCD_WR_DATA (0xA2);
        LCD_WR_REG(0xF2); // 3Gamma Function Disable
        LCD_WR_DATA (0x00);
        LCD_WR_REG(0x26); //Gamma curve selected
        LCD_WR_DATA (0x01);
        LCD_WR_REG(0xE0); //Set Gamma
        LCD_WR_DATA (0x0F);
        LCD_WR_DATA (0x22);
        LCD_WR_DATA (0x1C);
        LCD_WR_DATA (0x1B);
        LCD_WR_DATA (0x08);
        LCD_WR_DATA (0x0F);
        LCD_WR_DATA (0x48);
        LCD_WR_DATA (0xB8);
        LCD_WR_DATA (0x34);
        LCD_WR_DATA (0x05);
        LCD_WR_DATA (0x0C);
        LCD_WR_DATA (0x09);
        LCD_WR_DATA (0x0F);
        LCD_WR_DATA (0x07);
        LCD_WR_DATA (0x00);
        LCD_WR_REG(0XE1); //Set Gamma
        LCD_WR_DATA (0x00);
        LCD_WR_DATA (0x23);
        LCD_WR_DATA (0x24);
        LCD_WR_DATA (0x07);
        LCD_WR_DATA (0x10);
        LCD_WR_DATA (0x07);
        LCD_WR_DATA (0x38);
        LCD_WR_DATA (0x47);
        LCD_WR_DATA (0x4B);
        LCD_WR_DATA (0x0A);
        LCD_WR_DATA (0x13);
        LCD_WR_DATA (0x06);
        LCD_WR_DATA (0x30);
        LCD_WR_DATA (0x38);
        LCD_WR_DATA (0x0F);
        LCD_WR_REG(0x11); //Exit Sleep
        delay_ms(120);;
        LCD_WR_REG(0x29); //Display on
}

void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
        LCD_WR_REG(0x2A);
        LCD_WR_DATA(x>>8);
        LCD_WR_DATA(x&0xFF);       
        LCD_WR_DATA(x>>8);  
        LCD_WR_DATA(x&0xFF);
        LCD_WR_REG(0x2B);
        LCD_WR_DATA(y>>8);       
        LCD_WR_DATA(y&0xFF);
        LCD_WR_DATA(y>>8);       
        LCD_WR_DATA(y&0xFF);
        LCD_WR_REG(0x2C);
        LCD_WR_DATA(color>>8);  
        LCD_WR_DATA(color);
}

void LCD_SetArea(u16 stx,u16 sty,u16 endx,u16 endy)
{
        LCD_WR_REG(0x2A);  
        LCD_WR_DATA(stx >> 8);     
        LCD_WR_DATA(stx & 0xff);
        LCD_WR_DATA(endx >> 8);     
        LCD_WR_DATA(endx & 0xff);

        LCD_WR_REG(0x2B);  
        LCD_WR_DATA(sty >> 8);     
        LCD_WR_DATA(sty & 0xff);
        LCD_WR_DATA(endy >> 8);     
        LCD_WR_DATA(endy & 0xff);
}


沙发
郡吻魍|  楼主 | 2015-1-26 11:28 | 只看该作者
求帮忙啊。。。

使用特权

评论回复
板凳
colin2135| | 2015-1-26 12:11 | 只看该作者
你用的是模拟的还是FSMC?
最好能先读到ID,再做初始化。

这是根据原子哥的方案改:
void ILI9341_Init(void)
{
        CLR_RST;
        HAL_Delay(1000);
        SET_RST;
        HAL_Delay(1000);
       
        LCD_WriteReg(0x0000,0x0001);
        HAL_Delay(50);
        ID = LCD_ReadReg(0x0000);  
        LCD_WR_REG(0XD3);       
        LCD_RD_DATA();                                 //dummy read        
        LCD_RD_DATA();                       //读到0X00
        ID=LCD_RD_DATA();           //读取93                                                                  
        ID<<=8;
        ID|=LCD_RD_DATA();          //读取41           
        lcddev.id=ID;
        //************* Start Initial Sequence **********//               
        LCD_WR_REG(0xCF);  
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xC1);
        LCD_WR_DATA(0X30);
        LCD_WR_REG(0xED);  
        LCD_WR_DATA(0x64);
        LCD_WR_DATA(0x03);
        LCD_WR_DATA(0X12);
        LCD_WR_DATA(0X81);
        LCD_WR_REG(0xE8);  
        LCD_WR_DATA(0x85);
        LCD_WR_DATA(0x10);
        LCD_WR_DATA(0x7A);
        LCD_WR_REG(0xCB);  
        LCD_WR_DATA(0x39);
        LCD_WR_DATA(0x2C);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x34);
        LCD_WR_DATA(0x02);
        LCD_WR_REG(0xF7);  
        LCD_WR_DATA(0x20);
        LCD_WR_REG(0xEA);  
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_REG(0xC0);    //Power control
        LCD_WR_DATA(0x1B);   //VRH[5:0]
        LCD_WR_REG(0xC1);    //Power control
        LCD_WR_DATA(0x01);   //SAP[2:0];BT[3:0]
        LCD_WR_REG(0xC5);    //VCM control
        LCD_WR_DATA(0x30);          //3F
        LCD_WR_DATA(0x30);          //3C
        LCD_WR_REG(0xC7);    //VCM control2
        LCD_WR_DATA(0XB7);
        LCD_WR_REG(0x36);    // Memory Access Control
        LCD_WR_DATA(0x48);
        LCD_WR_REG(0x3A);   
        LCD_WR_DATA(0x55);
        LCD_WR_REG(0xB1);   
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x1A);
        LCD_WR_REG(0xB6);    // Display Function Control
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0xA2);
        LCD_WR_REG(0xF2);    // 3Gamma Function Disable
        LCD_WR_DATA(0x00);
        LCD_WR_REG(0x26);    //Gamma curve selected
        LCD_WR_DATA(0x01);
        LCD_WR_REG(0xE0);    //Set Gamma
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x2A);
        LCD_WR_DATA(0x28);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x0E);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x54);
        LCD_WR_DATA(0XA9);
        LCD_WR_DATA(0x43);
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);                  
        LCD_WR_REG(0XE1);    //Set Gamma
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x15);
        LCD_WR_DATA(0x17);
        LCD_WR_DATA(0x07);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x2B);
        LCD_WR_DATA(0x56);
        LCD_WR_DATA(0x3C);
        LCD_WR_DATA(0x05);
        LCD_WR_DATA(0x10);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x0F);
        LCD_WR_REG(0x2B);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x01);
        LCD_WR_DATA(0x3f);
        LCD_WR_REG(0x2A);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xef);         
        LCD_WR_REG(0x11); //Exit Sleep
        delay_ms(120);
        LCD_WR_REG(0x29); //display on       


        LCD_SetParam();//设置LCD参数         
        LCD_Clear(GREEN);
}

使用特权

评论回复
地板
mmuuss586| | 2015-1-26 12:13 | 只看该作者

参考楼上的程序先改下;

借助示波器测试下,读写的时序是否合理;

使用特权

评论回复
5
s976228410| | 2015-7-17 10:47 | 只看该作者
楼主问题现在解决了吗??我现在遇到相同的问题,写进去LCD屏没有反应啊

使用特权

评论回复
6
郡吻魍|  楼主 | 2015-7-17 17:52 | 只看该作者
s976228410 发表于 2015-7-17 10:47
楼主问题现在解决了吗??我现在遇到相同的问题,写进去LCD屏没有反应啊

问题已经解决了,具体是什么情况呢你。。。

使用特权

评论回复
7
s976228410| | 2015-7-18 16:47 | 只看该作者
void DataToWrite(u16 data)            //核心函数,16位通讯方式
{
        //u16 temp;  //IO口 的数据接收高低位反了
        u16 temp1 = 0;
        temp1 |= (data&0x00ff)<<8;
        temp1 |= (data&0xff00)>>8;
        GPIO_Write(GPIOD, 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 Parameter
{   
        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(150*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);

}

使用特权

评论回复
8
s976228410| | 2015-7-18 16:49 | 只看该作者
我是直接用IO口模拟8080时序来控制ILI9341的,结果屏幕只有背光点亮,其他的就没有反应了,不知道什么问题。。

使用特权

评论回复
9
郡吻魍|  楼主 | 2015-7-20 09:26 | 只看该作者
s976228410 发表于 2015-7-18 16:49
我是直接用IO口模拟8080时序来控制ILI9341的,结果屏幕只有背光点亮,其他的就没有反应了,不知道什么问题 ...

数据没写进去,你先检查你硬件接口是不是有问题,初始化代码如果是原厂提供的一般不会有什么问题,能兼容你的平台就好。。。

使用特权

评论回复
10
s976228410| | 2015-7-20 09:49 | 只看该作者
硬件接口没有问题的,我这里只用了IO口输出命令和数据,没有写输出的地址。那个输出地址应该怎么写呢?

使用特权

评论回复
11
gonggu8181| | 2015-7-20 10:46 | 只看该作者
推荐原子的驱动程序

使用特权

评论回复
12
ljc424| | 2015-7-20 10:47 | 只看该作者
转让韦博英语四个级别课程
https://bbs.21ic.com/forum.php?mo ... &fromuid=351131
(出处: 21ic电子技术论坛)

使用特权

评论回复
13
s976228410| | 2015-7-21 11:23 | 只看该作者
gonggu8181 发表于 2015-7-20 10:46
推荐原子的驱动程序

研究过原子哥的程序了,读ID都读的不对,求大神指点。。

使用特权

评论回复
14
s976228410| | 2015-7-23 13:50 | 只看该作者
自己顶一下 不要沉了:(

使用特权

评论回复
15
s976228410| | 2015-7-24 17:57 | 只看该作者
顶顶 每天静等大神解答、、、

使用特权

评论回复
16
zhou0214| | 2015-7-25 10:31 | 只看该作者
遇到这种问题,是必须先读到ID,再做初始化吗?、

使用特权

评论回复
17
s976228410| | 2015-7-27 15:47 | 只看该作者
zhou0214 发表于 2015-7-25 10:31
遇到这种问题,是必须先读到ID,再做初始化吗?、

当然不是了,读ID是为了下面初始化的时候可以兼容其他控制器,但是我现在读ID都读不对,所以我觉得前面肯定是有问题的。。

使用特权

评论回复
18
s976228410| | 2015-7-31 17:51 | 只看该作者
现在问题解决了 我是用单个输出的就可以正常了 不过就是刷屏速度有点慢

使用特权

评论回复
19
s976228410| | 2015-7-31 17:51 | 只看该作者
贴上代码分享一下
        if(data&(1<<15))//DB15=PD10
                  {
                          GPIOD->ODR |=(1<<10);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<10);
                  }
          if(data&(1<<14))//DB14=PD9
                  {
                          GPIOD->ODR |=(1<<9);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<9);
                  }
          if(data&(1<<13))//DB13=PD8
                  {
                          GPIOD->ODR |=(1<<8);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<8);
                  }   
          if(data&(1<<12))////DB12=PE15
                  {
                          GPIOE->ODR |=(1<<15);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<15);
                  }
          
        if(data&(1<<11))////DB11=PE14
                  {
                          GPIOE->ODR |=(1<<14);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<14);
                  }           
          if(data&(1<<10))////DB10=PE13
                  {
                          GPIOE->ODR |=(1<<13);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<13);
                  }   
          if(data&(1<<9))//DB9=PE12
                  {
                          GPIOE->ODR |=(1<<12);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<12);
                  }   
          if(data&(1<<8))//DB8=PE11
                  {
                          GPIOE->ODR |=(1<<11);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<11);
                  }   
          if(data&(1<<7))//DB7=PE10
                  {
                          GPIOE->ODR |=(1<<10);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<10);
                  }   
        if(data&(1<<6))////DB6=PE9
                  {
                          GPIOE->ODR |=(1<<9);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<9);
                  }   
        if(data&(1<<5))//DB5=PE8
                  {
                          GPIOE->ODR |=(1<<8);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<8);
                  }           
        if(data&(1<<4))//DB4=PE7
                  {
                          GPIOE->ODR |=(1<<7);
                  }
          else
                  {
                          GPIOE->ODR &=~(1<<7);
                  }   
        if(data&(1<<3))///DB3=PD1
                  {
                          GPIOD->ODR |=(1<<1);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<1);
                  }   
        if(data&(1<<2))//DB2=PD0
                  {
                          GPIOD->ODR |=(1<<0);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<0);
                  }   
        if(data&(1<<1))//DB1=PD15
                  {
                          GPIOD->ODR |=(1<<15);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<15);
                  }   
          
        if(data&(1<<0))//DB0=PD14
                  {
                          GPIOD->ODR |=(1<<14);
                  }
          else
                  {
                          GPIOD->ODR &=~(1<<14);
                  }      
                  

使用特权

评论回复
20
s976228410| | 2015-7-31 17:52 | 只看该作者
现在还有一点搞不明白,直接写一族IO口就不能正常,一位一位的写就可以,坐等大神指点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

38

帖子

1

粉丝