STM32/STM8技术论坛
直播中

feier567

8年用户 137经验值
擅长:控制/MCU
私信 关注
[问答]

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

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

  1. void LCD_Clear(u16 color)//填充的颜色
  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;
}

回帖(17)

人中狼

2018-1-15 10:10:13
你的程序这部分看不出什么问题,另外向9341写数据不需要延时,只要把数据写入9341就可以了,不需要等待结果或向1602等需要查忙,所以如果你的程序里有延时,那么假设每一个字节一个延时,76800个延时的时间也够长了。
你应该查查其他部分的程序和硬件电路,例程的代码一般都没什么问题的,除了硬件连接有可能不一样,例程都是能正确运行的
举报

jf_ed1027433

2018-1-15 11:11:24
记得下次提问要选择“问答”类别
举报

feier567

2018-1-15 12:36:49
引用: 人中狼 发表于 2018-1-15 10:10
你的程序这部分看不出什么问题,另外向9341写数据不需要延时,只要把数据写入9341就可以了,不需要等待结果或向1602等需要查忙,所以如果你的程序里有延时,那么假设每一个字节一个延时,76800个延时的时间也够长了。
你应该查查其他部分的程序和硬件电路,例程的代码一般都没什么问题的,除了硬件连接有可能不一样,例程都 ...

我把时序函数贴出来了,你看看。
那个延时函数就是一个 while(i--); 而已,汇编代码也就一两指令周期吧,而且延时可以替换成别的操作比如++,--或者给个if判断之类的,然后就正常了,很奇怪。
举报

人中狼

2018-1-15 12:42:41
从你的描述来看,应该还是代码的问题,比如i的初始值是多少,有没有被改变。
另外还是那个问题,对于9341,单片机向9341写入数据是不需要加延时操作的,我用51和STM32F103操作9341,都不需要加延时的,也是参考例程修改使用的。
举报

feier567

2018-1-15 12:58:22
引用: 人中狼 发表于 2018-1-15 12:42
从你的描述来看,应该还是代码的问题,比如i的初始值是多少,有没有被改变。
另外还是那个问题,对于9341,单片机向9341写入数据是不需要加延时操作的,我用51和STM32F103操作9341,都不需要加延时的,也是参考例程修改使用的。 ...

i 是手动赋值的,delay_ns(1); 那 i 就是1。
既然能刷屏了那硬件连接应该是没问题的吧,现在问题就是那个延时不懂什么情况。
就算加上那个延时,也就延迟一两个指令周期而已吧,怎么会对刷屏速度有那么大影响?
举报

人中狼

2018-1-15 13:19:02
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪
举报

feier567

2018-1-15 13:55:12
引用: 人中狼 发表于 2018-1-15 13:19
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪 ...

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

feier567

2018-1-15 18:10:22
引用: 人中狼 发表于 2018-1-15 13:19
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪 ...

没有那个延迟,单步调试都没用。加上延迟什么都正常了,真是无解了
举报

人中狼

2018-1-15 18:39:51
找个32的例程对比看看吧,应该是程序问题,可能是引脚设置或时序的问题
举报

feier567

2018-1-30 19:06:53
引用: 人中狼 发表于 2018-1-15 18:39
找个32的例程对比看看吧,应该是程序问题,可能是引脚设置或时序的问题

搞了半个月。换了块f103ZET6板,数据口改用PD口,没有那个延时也能正常用了。
不过又有问题了,填充屏幕如果白色(也就是PD口输出0xFFFF),一开始只会填充一行像素点,然后卡住一会,接着就花屏了,改用其他颜色比如0x00FF或0xFF00,或者红绿蓝黑这些就正常。。这又是什么情况啊
PD2口有板载的外部上拉电阻,不知道是不是这个引起的
举报

人中狼

2018-1-30 19:21:25
彩屏的8位和16位操作是不一样的,如果单片机使用16位端口连接彩屏,数据是16位一次写入的,如果是使用8位端口连接彩屏,则是16位数据分两次写入彩屏,这需要确定彩屏使用的16位还是8位接口,然后单片机采用相应的控制方式进行控制
举报

feier567

2018-1-30 19:56:36
本帖最后由 feier567 于 2018-1-30 20:00 编辑

[url=]人中狼 发表于 2018-1-30 19:21[/url]
彩屏的8位和16位操作是不一样的,如果单片机使用16位端口连接彩屏,数据是16位一次写入的,如果是使用8位端口连接彩屏,则是16位数据分两次写入彩屏,这需要确定彩屏使用的16位还是8位接口,然后单片机采用相应的控制方式进行控制 ...


彩屏是16位的接口,所以才说用16位8080接口啊
举报

人中狼

2018-1-30 20:09:12
不知道你的程序改了没有,不过下面的代码应该是8位的,16位的接口,数据不需要写两次
LCD_WR_CMD(LCD_CMD_COLADDR);//设置列地址
        LCD_WR_DAT(0x00);       //列开始地址0(0x0000),先写高8位
        LCD_WR_DAT(0x00);                //后写低8位
        LCD_WR_DAT(0x00);                //列结束地址239(0x00ef),先写高8位
        LCD_WR_DAT(0xef);                //后写低8位
举报

feier567

2018-1-30 20:38:03
引用: 人中狼 发表于 2018-1-30 20:09
不知道你的程序改了没有,不过下面的代码应该是8位的,16位的接口,数据不需要写两次
LCD_WR_CMD(LCD_CMD_COLADDR);//设置列地址
        LCD_WR_DAT(0x00);       //列开始地址0(0x0000),先写高8位

不是吧?彩屏的数据手册上说了每个16位地址要分两次写入,先写高8位再写低8位。而颜色数据才是16位整个写入。 111111111111111111.png
22222222222222222222.png
那个所谓的高8位低8位只是对液晶的寄存器而言的,和单片机IO口的8位16位没关系吧,
举报

人中狼

2018-1-30 22:12:42
不好意思,那部分我没注意看,9341的基础控制方面我是直接从例程修改过来的,我的写命令和写数据部分直接贴给你,这部分代码里我的都没有延时,所以你可能需要查一下端口操作部分的程序,16位端口我用的是C端口
void TFT_9341_Write_data(u16 TFT_9341_DATA)
{
        TFT_9341_RS_ON();
        TFT_9341_RD_ON();
        TFT_9341_WR_ON();
        GPIO_Write(TFT_9341_DATA_PORT, TFT_9341_DATA);
        TFT_9341_WR_OFF();
        TFT_9341_WR_ON();
}

void TFT_9341_Write_command(u16 TFT_9341_COMMAND)
{
        TFT_9341_RS_ON();
        TFT_9341_RS_OFF();
        TFT_9341_RD_ON();
        TFT_9341_WR_ON();
        GPIO_Write(TFT_9341_DATA_PORT, TFT_9341_COMMAND);
        TFT_9341_WR_OFF();
        TFT_9341_WR_ON();
        TFT_9341_RS_ON();
}
举报

feier567

2018-2-4 22:05:16
引用: 人中狼 发表于 2018-1-30 22:12
不好意思,那部分我没注意看,9341的基础控制方面我是直接从例程修改过来的,我的写命令和写数据部分直接贴给你,这部分代码里我的都没有延时,所以你可能需要查一下端口操作部分的程序,16位端口我用的是C端口
void TFT_9341_Write_data(u16 TFT_9341_DATA)
{

写时序没问题的了。。
花屏感觉是并口线信号干扰的问题,我用杜邦线连接的,有时候动一下线就正常,有时候就花屏,已经用临时的办法解决了,到时候用FSMC看看还花不花屏。
一般IO模拟时序的刷屏帧率有多少,我用定时器测了下有14-18帧正常吧?
举报

idianze

2018-2-4 22:54:40
我只是路过打酱油的,嘿嘿
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分