OpenEdv-开源电子网

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

液晶初始化时,会闪屏,求高人指点,谢谢

[复制链接]

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-8-3
在线时间
2 小时
发表于 2014-5-15 10:15:32 | 显示全部楼层 |阅读模式
5金钱

先说下事情经过,理解完液晶驱动的程序后,觉得原子哥的程序里可以驱动很多ic,但我的板子是ili9341的驱动芯片,所以决定精简一下,把其他的ic程序都删掉,同时也去掉了横竖屏的选择,和IC型号的读取,我重新写了一个LCD.c和.h   把原来的程序里需要的粘贴过来但是 问题来了, 发现自己写的程序在启动时屏幕会闪烁,大盖5秒左右,然后我就能正常使用了,所以我觉得是初始化那有问题,但是我的初始化是完全粘贴原子的原程序的,求高手帮忙看下,另外说一句,应该不是液晶坏掉,因为我烧成原子哥的程序,屏幕就正常,应该在复位时会闪一下,然后就好了
下面贴程序,
int main(void)
 {
  u8 i=0;
 u16 j;
 delay_init();       //延时函数初始化  
 NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 uart_init(9600);   //串口初始化为9600
  LED_Init();        //LED端口初始化
 LCD_Init();    
   while(1)
 { 
  LCD_Clear(0x0000);
  delay_ms(10000);
  LCD_Clear(0xffff);
   delay_ms(1000);
   LCD_Open_Windows(10,10,30,30);
   LCD_WR_CMD(WR_GRAM_CMD);     //开始写入GRAM
   for(j=0;j<441;j++)
  {
   LCD_WR_DATA(0x781c);   
  }
  delay_ms(1000);
  i++;   
  if(i==20)
  { j=0;
   i=0;
   LED0=!LED0;
  }     
 }
}


//写寄存器函数
//regval:寄存器值
void LCD_WR_CMD(u16 regval)
{
 LCD->LCD_CMD=regval;//写入要写的寄存器序号 

//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{                 
 LCD->LCD_DATA=data;  
}

u16 LCD_RD_DATA(void)
{                 
 return LCD->LCD_DATA;  
}

u16 LCD_ReadReg(u8 LCD_Reg)
{            
 LCD_WR_CMD(LCD_Reg);  //写入要读的寄存器序号
 delay_us(5);   
 return LCD_RD_DATA();  //返回读到的值
 }
void LCD_Init(void)
{  
 u16 id;          
 GPIO_InitTypeDef GPIO_InitStructure;
 FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    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);//使能PORTB,D,E,G以及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);

  //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;     // //PORTD复用推挽输出 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
 //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;     // //PORTD复用推挽输出 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  
    // //PORTG12复用推挽输出 A0 
 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);
 
 readWriteTiming.FSMC_AddressSetupTime = 0x01;  //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
    readWriteTiming.FSMC_AddressHoldTime = 0x00;  //地址保持时间(ADDHLD)模式A未用到 
    readWriteTiming.FSMC_DataSetupTime = 0x0f;   // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;  //模式A
   

 writeTiming.FSMC_AddressSetupTime = 0x00;  //地址建立时间(ADDSET)为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_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_WR_CMD(0X00);
 LCD_WR_DATA(0X01);
  //LCD_WriteReg(0x0000,0x0001);
 delay_ms(50);
  id = LCD_ReadReg(0x0000);
  LCD_WR_CMD(0XD3);      
  LCD_RD_DATA();     //dummy read  
   LCD_RD_DATA();         //读到0X00
    id=LCD_RD_DATA();    //读取93          
   id<<=8;
  id|=LCD_RD_DATA();   //读取41  
  LCD_WR_CMD(0xCF); 
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0xC1);
  LCD_WR_DATA(0X30);
  LCD_WR_CMD(0xED); 
  LCD_WR_DATA(0x64);
  LCD_WR_DATA(0x03);
  LCD_WR_DATA(0X12);
  LCD_WR_DATA(0X81);
  LCD_WR_CMD(0xE8); 
  LCD_WR_DATA(0x85);
  LCD_WR_DATA(0x10);
  LCD_WR_DATA(0x7A);
  LCD_WR_CMD(0xCB); 
  LCD_WR_DATA(0x39);
  LCD_WR_DATA(0x2C);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x34);
  LCD_WR_DATA(0x02);
  LCD_WR_CMD(0xF7); 
  LCD_WR_DATA(0x20);
  LCD_WR_CMD(0xEA); 
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_CMD(0xC0);    //Power control
  LCD_WR_DATA(0x1B);   //VRH[5:0]
  LCD_WR_CMD(0xC1);    //Power control
  LCD_WR_DATA(0x01);   //SAP[2:0];BT[3:0]
  LCD_WR_CMD(0xC5);    //VCM control
  LCD_WR_DATA(0x30);   //3F
  LCD_WR_DATA(0x30);   //3C
  LCD_WR_CMD(0xC7);    //VCM control2
  LCD_WR_DATA(0XB7);
  LCD_WR_CMD(0x36);    // Memory Access Control
  LCD_WR_DATA(0x48);
  LCD_WR_CMD(0x3A);  
  LCD_WR_DATA(0x55);
  LCD_WR_CMD(0xB1);  
  LCD_WR_DATA(0x00);  
  LCD_WR_DATA(0x1A);
  LCD_WR_CMD(0xB6);    // Display Function Control
  LCD_WR_DATA(0x0A);
  LCD_WR_DATA(0xA2);
  LCD_WR_CMD(0xF2);    // 3Gamma Function Disable
  LCD_WR_DATA(0x00);
  LCD_WR_CMD(0x26);    //Gamma curve selected
  LCD_WR_DATA(0x01);
  LCD_WR_CMD(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_CMD(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_CMD(0x2B);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x01);
  LCD_WR_DATA(0x3f);
  LCD_WR_CMD(0x2A);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0xef); 
  LCD_WR_CMD(0x11); //Exit Sleep
  delay_ms(120);
  LCD_WR_CMD(0x29); //display on 
  delay_ms(50);
/////////////////////////////////////////////////////////////  
  LCD_WR_CMD(0X36);   //重新定义映射和读写方向
  LCD_WR_DATA(0x08);          //默认从左到右从上到下,BGR
  LCD_LED=1;     //点亮背光
//////////////////////////////////////////////////////////  
}
//视窗函数,设置行列地址
//X_START:起点坐标
//Y_START:
//X_END:  终点坐标
//Y_END: 
void LCD_Open_Windows(u16 X_S, u16 Y_S, u16 X_E, u16 Y_E)
{       
 LCD_WR_CMD(SET_X_CMD);
 LCD_WR_DATA(X_S>>8);       //起点高8位
 LCD_WR_DATA(X_S&0XFF);       //起点低8位
 LCD_WR_DATA(X_E>>8);     //终点高八位
 LCD_WR_DATA(X_E&0XFF);    //终点低八位
 LCD_WR_CMD(SET_Y_CMD);      //设置y的起点终点
 LCD_WR_DATA(Y_S>>8);       //起点高8位
 LCD_WR_DATA(Y_S&0XFF);       //起点低8位
 LCD_WR_DATA(Y_E>>8);     //终点高八位
 LCD_WR_DATA(Y_E&0XFF);    //终点低八位
}

最佳答案

查看完整内容[请看2#楼]

终于让我找到原因了。。。战舰不是2个USB接口一个,一个串口烧写程序,一个串口供电,只要USB接在串口供电上就好了。。。果然还是原子哥说的对,哈哈  找了老半天,终于解决了,谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-8-3
在线时间
2 小时
 楼主| 发表于 2014-5-15 10:15:33 | 显示全部楼层
终于让我找到原因了。。。战舰不是2个USB接口一个,一个串口烧写程序,一个串口供电,只要USB接在串口供电上就好了。。。果然还是原子哥说的对,哈哈 
找了老半天,终于解决了,谢谢!
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-15 12:56:48 | 显示全部楼层
你的原子哥的板子?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-15 13:49:50 | 显示全部楼层
如果是我们的板子,看看是不是一键下载电路的影响。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-8-3
在线时间
2 小时
 楼主| 发表于 2014-5-15 15:12:07 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我用的是原子战舰开发板,如果是意见下载电路影响,那么原来的程序应该也会受到影响,但是烧成自己的就有烧成原来程序就没有了。。。
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-8-11
在线时间
5 小时
发表于 2016-8-11 20:53:52 | 显示全部楼层
确实因为JLink输出供电不稳定的问题。外接电源即可
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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