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条回答
feier567
1楼-- · 2019-07-15 14:47
人中狼 发表于 2018-1-15 13:19
延时不止一两个指令周期,C语言的while(i--)至少有一个减法指令和一个比较指令,就算是一个指令周期,按51算,12兆晶振,12分频,一个指令周期1us,刷屏76800个点,就是76800us,即76毫秒,这还是按一个指令周期算的。
查查代码吧,看看跟例程的区别再哪 ...

没有那个延迟,单步调试都没用。加上延迟什么都正常了,真是无解了
人中狼
2楼-- · 2019-07-15 15:27
找个32的例程对比看看吧,应该是程序问题,可能是引脚设置或时序的问题
feier567
3楼-- · 2019-07-15 19:17
 精彩回答 2  元偷偷看……
人中狼
4楼-- · 2019-07-16 01:10
彩屏的8位和16位操作是不一样的,如果单片机使用16位端口连接彩屏,数据是16位一次写入的,如果是使用8位端口连接彩屏,则是16位数据分两次写入彩屏,这需要确定彩屏使用的16位还是8位接口,然后单片机采用相应的控制方式进行控制
feier567
5楼-- · 2019-07-16 04:25
本帖最后由 feier567 于 2018-1-30 20:00 编辑

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


彩屏是16位的接口,所以才说用16位8080接口啊
人中狼
6楼-- · 2019-07-16 07:39
不知道你的程序改了没有,不过下面的代码应该是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位

一周热门 更多>