搜索
bottom↓
回复: 13

LCD速度如何解决?

[复制链接]

出0入0汤圆

发表于 2012-4-19 17:12:18 | 显示全部楼层 |阅读模式
我对单色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);
     }
    }
  }
}

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-4-19 17:19:39 | 显示全部楼层
使用DMA吧,50M的主频显示也会很快的

出0入0汤圆

发表于 2012-4-19 17:20:09 | 显示全部楼层
使用DMA吧,50M的主频显示也会很快的

出20入12汤圆

发表于 2012-4-19 19:53:12 | 显示全部楼层
瓶颈不在这里,在更底层的驱动程序里

出0入0汤圆

发表于 2012-4-19 20:10:10 | 显示全部楼层
加个buffer吧。

出0入0汤圆

发表于 2012-4-19 20:13:54 | 显示全部楼层
如果你的内存够的话,可以开辟一块作为显存,修改在内存里操作,刷屏时整块刷,或者分部刷,这样就能快一点。

出0入0汤圆

发表于 2012-4-19 20:16:24 | 显示全部楼层
我的做法是建个显示buffer,数据操作全部针对该buffer完成
定时将该buffer写入屏幕,貌似速度还可以!

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2012-4-19 22:24:29 | 显示全部楼层
pcr386 发表于 2012-4-19 20:10
加个buffer吧。

怎么加?

出0入0汤圆

发表于 2012-4-19 22:26:44 | 显示全部楼层
同样想学一招

出0入0汤圆

 楼主| 发表于 2012-4-19 22:27:50 | 显示全部楼层
dtszcr 发表于 2012-4-19 20:13
如果你的内存够的话,可以开辟一块作为显存,修改在内存里操作,刷屏时整块刷,或者分部刷,这样就能快一点 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-20 16:42:18 | 显示全部楼层
another_2 发表于 2012-4-20 16:37
这个估计很难扭转,我们是TFT专业研发和生产厂家,有需求请联系QQ 369122197

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

出0入0汤圆

发表于 2012-4-20 21:36:15 | 显示全部楼层
tdjsppwct 发表于 2012-4-19 22:27
这不是有专门的显示区吗?对于单色液晶屏有一二三四四个区,二区只能是图形方式,一三四根据自己设置,可 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-21 07:37:30 | 显示全部楼层
283868130 发表于 2012-4-20 21:36
只使用lcd的图形区,在cpu内部见一个图形区的拷贝
cpu根据实际需要更改该拷贝的内容,然后定时刷新至lcd ...

嗯,我往你说的试试,看看能不能写出来,没有整过这方面的程序!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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