tdjsppwct 发表于 2012-4-19 17:12:18

LCD速度如何解决?

我对单色LCD液晶屏画线画图写字时速度很慢,特别是画线的时候屏幕初始化完成后能看到画线的具体走势,可是我看人家的程序时初始化完成后,所有的文字,图片以及线条一下子就全都显示出来了,请问这是怎么做的的?希望高手帮忙啊,弄很久了这个程序!我的程序部分代码如下:

/*----------------------------------------------
功能:画点函数,在图形区进行
参数:
   @x--为屏幕上水平位置,以像素点为单位
   @y--为屏幕上垂直位置,以像素行为单位
----------------------------------------------*/
void LCD_Drawpoint(U32 x,U32 y)
{
    unsigned char dotdata,m;
    unsigned int addr,addr_L,addr_H;
   
   
   
    // 计算图形区ARM的实际显示地址
    //      ------------->计算点在该行的第几个字节处,每行占320/8=40个字节/行
    //      |      ------>计算点在屏幕的第几行,每行40个字节,共240行即0~239行
    //      |      |   -->0x1000图形区SAD2地址
    //      |      |   |
    addr = x/8+y*40+0x2580;   // 点所在图形区的地址
    addr_L = addr&0xff;         // 地址低八位
    addr_H = addr>>8;         // 地址高八位
   
    m = x%8;                  // 计算x在该字节的第几个点
   
    dotdata = 0x80>>m;          // 使X所在点所对应字节的位置1
    LCD_CMDWrite(0x46);         // 设置光标地址
    LCD_DATAWrite(addr_L);      // 写入光标地址低八位值
    LCD_DATAWrite(addr_H);      // 写入光标地址高八位值
    LCD_CMDWrite(0x43);         // 显示数据读操作
    m = LCD_DATARead()|dotdata; // 读取原始点的值

    LCD_CMDWrite(0x46);
    LCD_DATAWrite(addr_L);
    LCD_DATAWrite(addr_H);
    LCD_CMDWrite(0x42);         // 显示数据写操作
    LCD_DATAWrite(m);         // 写入数据m
}


/*---------------------------------------------------
功能:画线函数,在图形区进行
参数:
   @x1,y1--为起点坐标,屏幕上水平位置,以像素点为单位
   @x2,y2--为终点坐标,屏幕上垂直位置,以像素行为单位
----------------------------------------------------*/
void Draw_Line(U32 x1,U32 y1,U32 x2,U32 y2)
{
unsigned int temp;
int dalt_x,dalt_y,err=0;
if(y1>y2){
    temp=x1;
    x1=x2;
    temp=y1;
    y1=y2;
    y2=temp;
}
LCD_Drawpoint(x1,y1);
dalt_x=x2-x1;
dalt_y=y2-y1;
if(dalt_x>=0){                   // x2>x1
    if(dalt_y>dalt_x){             // 斜率k>1
      while(y1<y2){
      if(err<0){
          x1=x1+1;
          y1=y1+1;
          err=err+dalt_y-dalt_x;
      }else{
          y1=y1+1;
          err=err-dalt_x;
      }
      LCD_Drawpoint(x1,y1);
      }
    }else{
      if(dalt_y==0)
      y1=y1-1;
      while(x1<x2){
      if(err<0){
          x1=x1+1;
          err=err+dalt_y;
      }else{
          y1=y1+1;
          x1=x1+1;
          err=err+dalt_y-dalt_x;
      }
      LCD_Drawpoint(x1,y1);
      }
    }
}else{
    dalt_x=x1-x2;
    if(dalt_y>dalt_x){
      while(y1<y2){
      if(err<0){
          x1=x1-1;
          y1=y1+1;
          err=err+dalt_y-dalt_x;
      }else{
          y1=y1+1;
          err=err-dalt_x;
      }
      LCD_Drawpoint(x1,y1);
      }
    }else{
      if(dalt_y==0)
      y1=y1-1;
      while(x1>x2){
      if(err<0){
          x1=x1-1;
          err=err+dalt_y;
      }else{
          x1=x1-1;
          y1=y1+1;
          err=err+dalt_y-dalt_x;
      }
      LCD_Drawpoint(x1,y1);
   }
    }
}
}

希望高手指点下,谢谢了!等我把程序弄完我就把代码发上来!

longfeix86 发表于 2012-4-19 17:19:39

使用DMA吧,50M的主频显示也会很快的

longfeix86 发表于 2012-4-19 17:20:09

使用DMA吧,50M的主频显示也会很快的

gaolf_2012 发表于 2012-4-19 19:53:12

瓶颈不在这里,在更底层的驱动程序里

pcr386 发表于 2012-4-19 20:10:10

加个buffer吧。

dtszcr 发表于 2012-4-19 20:13:54

如果你的内存够的话,可以开辟一块作为显存,修改在内存里操作,刷屏时整块刷,或者分部刷,这样就能快一点。

283868130 发表于 2012-4-19 20:16:24

我的做法是建个显示buffer,数据操作全部针对该buffer完成
定时将该buffer写入屏幕,貌似速度还可以!

tdjsppwct 发表于 2012-4-19 22:16:00

283868130 发表于 2012-4-19 20:16 static/image/common/back.gif
我的做法是建个显示buffer,数据操作全部针对该buffer完成
定时将该buffer写入屏幕,貌似速度还可以! ...

怎么显示buffer?没有明白你的意思,望回复,谢谢!

tdjsppwct 发表于 2012-4-19 22:24:29

pcr386 发表于 2012-4-19 20:10 static/image/common/back.gif
加个buffer吧。

怎么加?

airfex 发表于 2012-4-19 22:26:44

同样想学一招

tdjsppwct 发表于 2012-4-19 22:27:50

dtszcr 发表于 2012-4-19 20:13 static/image/common/back.gif
如果你的内存够的话,可以开辟一块作为显存,修改在内存里操作,刷屏时整块刷,或者分部刷,这样就能快一点 ...

这不是有专门的显示区吗?对于单色液晶屏有一二三四四个区,二区只能是图形方式,一三四根据自己设置,可以设置为文本形式或图形形式,可是画图都在图形区即第二显示区啊!还能怎么开辟新的内存?

tdjsppwct 发表于 2012-4-20 16:42:18

another_2 发表于 2012-4-20 16:37 static/image/common/back.gif
这个估计很难扭转,我们是TFT专业研发和生产厂家,有需求请联系QQ 369122197

打广告啊?不过我现在还不需要TFT

283868130 发表于 2012-4-20 21:36:15

tdjsppwct 发表于 2012-4-19 22:27 static/image/common/back.gif
这不是有专门的显示区吗?对于单色液晶屏有一二三四四个区,二区只能是图形方式,一三四根据自己设置,可 ...

只使用lcd的图形区,在cpu内部见一个图形区的拷贝
cpu根据实际需要更改该拷贝的内容,然后定时刷新至lcd图形区

tdjsppwct 发表于 2012-4-21 07:37:30

283868130 发表于 2012-4-20 21:36 static/image/common/back.gif
只使用lcd的图形区,在cpu内部见一个图形区的拷贝
cpu根据实际需要更改该拷贝的内容,然后定时刷新至lcd ...

嗯,我往你说的试试,看看能不能写出来,没有整过这方面的程序!
页: [1]
查看完整版本: LCD速度如何解决?