ILI9341驱动的LCD屏刷屏很慢要什么解决?

2019-07-14 19:02发布

第一次用彩屏,用IO口模拟16位的8080时序。写了个清屏函数测试下,差不多300ms这样才刷完一次。不是说16位并口速度很快吗??网上有人说用SPI都能30帧/s怎么做到的???
还有那个时序函数也有点问题,为什么那些例程里,放上数据后都不需要延时,我这个没延时就出问题了???

  1. void LCD_Clear(u16 color)//填充的颜 {MOD}
  2. {
  3.         u32 i;
  4.         
  5.         LCD_WR_CMD(LCD_CMD_COLADDR);//设置列地址
  6.         LCD_WR_DAT(0x00);       //列开始地址0(0x0000),先写高8位
  7.         LCD_WR_DAT(0x00);                //后写低8位
  8.         LCD_WR_DAT(0x00);                //列结束地址239(0x00ef),先写高8位
  9.         LCD_WR_DAT(0xef);                //后写低8位
  10.         
  11.         LCD_WR_CMD(LCD_CMD_ROWADDR);//设置行地址
  12.         LCD_WR_DAT(0x00);       //行开始地址0(0x0000),先写高8位
  13.         LCD_WR_DAT(0x00);                //后写低8位
  14.         LCD_WR_DAT(0x01);                //行结束地址319(0x013f),先写高8位
  15.         LCD_WR_DAT(0x3f);                //后写低8位
  16.         
  17.         LCD_WR_CMD(LCD_CMD_GRAM);//开始写显示数据
  18.         
  19.         for(i=0;i<76800;i++) LCD_WR_DAT(color);
复制代码





补充内容 (2018-1-15 12:27):
/*------- 写命令时序 ----------*/
void LCD_WR_CMD(unsigned short dat)
{
        LCD_CS_0;//片选拉低
        LCD_RS_0;//RS为0是写命令
        LCD_WR_0;//写操作,先拉低以便产生上升沿
        LCD_RD_1;//写操作时,RD要拉高
       
        DATAOUT(dat)//往数据口放数据
       
        delay_ns(1);//延时,不然会白屏或花屏
       
        LCD_WR_1;//拉高产生上升沿
        LCD_CS_1;//片选拉高
}

/*------- 写数据时序 --------*/
void LCD_WR_DAT(unsigned short dat)
{
        LCD_CS_0;
        LCD_RS_1;//RS为1是写数据
        LCD_WR_0;//写操作,先拉低以便产生上升沿
        LCD_RD_1;//写操作时,RD要拉高
       
        DATAOUT(dat)
       
        delay_ns(1);//延时,不然会白屏或花屏
       
        LCD_WR_1;
        LCD_CS_1;
}

/*-------- 读数据时序 -----------*/
unsigned short LCD_RD_DAT(void)
{
        u16 dat = 0;
        Input_mode();//IO口模式设置为输入模式以便接收数据
       
        LCD_CS_0;
        LCD_RS_1;//数据
        LCD_WR_1;//读操作时,WR要拉高
        LCD_RD_0;//读操作,先拉低以便产生上升沿
        delay_us(5);
       
        dat = DATAIN//取出IDR里的数据
       
       
        LCD_RD_1;
        LCD_CS_1;
       
        Output_mode();//IO口模式换回输出模式
       
        return dat;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
ElecFans王岑
1楼-- · 2019-07-14 22:17
记得下次提问要选择“问答”类别
feier567
2楼-- · 2019-07-14 22:32
人中狼 发表于 2018-1-15 10:10
你的程序这部分看不出什么问题,另外向9341写数据不需要延时,只要把数据写入9341就可以了,不需要等待结果或向1602等需要查忙,所以如果你的程序里有延时,那么假设每一个字节一个延时,76800个延时的时间也够长了。
你应该查查其他部分的程序和硬件电路,例程的代码一般都没什么问题的,除了硬件连接有可能不一样,例程都 ...

我把时序函数贴出来了,你看看。
那个延时函数就是一个 while(i--); 而已,汇编代码也就一两指令周期吧,而且延时可以替换成别的操作比如++,--或者给个if判断之类的,然后就正常了,很奇怪。
人中狼
3楼-- · 2019-07-15 04:07
从你的描述来看,应该还是代码的问题,比如i的初始值是多少,有没有被改变。
另外还是那个问题,对于9341,单片机向9341写入数据是不需要加延时操作的,我用51和STM32F103操作9341,都不需要加延时的,也是参考例程修改使用的。
feier567
4楼-- · 2019-07-15 05:29
 精彩回答 2  元偷偷看……
人中狼
5楼-- · 2019-07-15 07:04
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪
feier567
6楼-- · 2019-07-15 10:03
人中狼 发表于 2018-1-15 13:19
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪 ...

好吧,我再看看代码,不行再来问。
我是用32的,算过了刷76800个点大概也就2-5毫秒这样吧?

一周热门 更多>