zhen5116584 发表于 2011-8-21 15:16:35

在LCD上画波形、曲线、直线

在设计仪器仪表时,经常会碰到要求在LCD显示屏上显示电流电压等参数的波形曲线。初次接触该问题的工程师都觉得这个很困难,无从下手,论坛上也经常有同志提出这方面问题。本文针对上述问题,阐述了显示曲线的原理,给出了画直线段的子程序。
在数字系统里,我们画的曲线都是由若干段的直线段组成的。例如,在一个电流采集系统中,显示的电流波形曲线是如何得到的?
首先,创建坐标系,X轴表示时间,Y轴表示电流;
然后,我们要在时间轴上连续采样若干个点的电流值,每个采样点的电流值都对应坐标系中的一个点;
最后,我们就可以将坐标系中的相邻点用直线段连接起来,得到的就是电流波形了!
因此,我们可以看出,画曲线的关键,真正的难点转为了画直线段。画直线段的算法有很多种,以下画直线段的C代码(针对51单片机)使用的是插补算法。

///////////////////////////////////////////////////////////
//                                                       //
// 来自www.viewtech.cn                                 //
// 画线程序,适合单色LCD屏                              //
// 驱动板VT1335b/VT6448b/VT4832b                         //
// 入口程序:draw_LINE(unsigned int x1,y1,x2,y2);      //
//          起点(x1,y1),终点(x2,y2),以象素为单位      //
//          LCD屏左上角为坐标原点                        //
//                                                      //
//                                                      //
//////////////////////////////////////////////////////////

#include <reg51.h>
#include <absacc.h>
#define X_ADDR XBYTE
#define Y_ADDR XBYTE
#define CMD XBYTE
#define DAT XBYTE
//声明程序
draw_point(unsigned int x,unsigned int y);
draw_LINE(unsigned int x1,y1,x2,y2);

//*************************draw LINE start*******************************
draw_LINE(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
    unsigned int x,y;
    unsigned int d_x,d_y;//d_x=x2-x1;d_y=y2-y1;
    int err=0;
    unsigned CHAR TEMP=0;
    if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
    d_y=y2-y1;
    if (d_y==0)
      {
      if (x1>x2) {x=x1;x1=x2;x2=x;}
      for ( x=x1;x<=x2;x++ ) draw_point(x,y1);
      }
    else
      {
    if(x2>=x1){TEMP=1;d_x=x2-x1;}else d_x=x1-x2;
    x=x1;y=y1;draw_point(x,y);
    if(TEMP&&(d_y<=d_x))
      while(x!=x2)
            {if(err<0){x=x+1;err=err+(y2-y);}
            else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
            draw_point(x,y);
            }
    else if(TEMP&&(d_y>d_x))
      while(y!=y2)
            {d_x=x2-x;d_y=y2-y;
            if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            draw_point(x,y);
            }
    else if(!TEMP&&(d_y<=d_x))
      while(x!=x2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;err=err+d_y;}
            else {x=x-1;y=y+1;err=err+d_y-d_x;}
            draw_point(x,y);
            }
    else if(!TEMP &&(d_y>d_x))
      while(y!=y2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            draw_point(x,y);
            }
      }   
}                                 
draw_point(unsigned int x,unsigned int y)
{
    unsigned CHAR TEMP,i;
    Y_ADDR = y;X_ADDR = x/8;
    if(y>255)CMD=0x14;else CMD=0x04;
    TEMP=DAT;
    i=0x80;
    i=(i>>(x%8));
    TEMP=(TEMP|i);
    Y_ADDR = y;X_ADDR = x/8;
    if(y>255)CMD=0x14;else CMD=0x04;
    DAT=TEMP;
}
//************draw LINE end********************

//调用举例
main()
{
draw_LINE(0,0,150,150);//(0,0)->(150,150)
}

babaili2010 发表于 2011-9-13 17:56:11

抢沙发

cjr82123 发表于 2011-9-13 19:13:18

mark,以后用!

automaticdai 发表于 2011-9-13 20:28:23

支持一下,

liqiaw 发表于 2011-9-13 21:11:33

好强啊 值得细细研究

frival 发表于 2011-9-13 22:22:25

mark!

yulongkui 发表于 2011-9-13 23:27:55

mark

gloryzkl 发表于 2011-9-15 18:09:47

mark

whzhangpeng 发表于 2011-9-17 13:18:38

顶起!

0810612124 发表于 2011-9-20 23:15:41

支持楼主

lan_boy008 发表于 2011-9-22 16:27:25

得得得得得得得得

sddzycnq 发表于 2011-9-28 22:19:33

mark

bluelool 发表于 2011-9-28 22:40:31

mark

kevinshq 发表于 2011-9-30 10:14:31

学习算法,留以备用!

thtssqc 发表于 2011-11-4 08:32:26

学习,细细品味

ljh42728620 发表于 2011-11-4 09:03:32

学习

nianjing 发表于 2012-2-25 20:30:25

回复【15楼】ljh42728620
-----------------------------------------------------------------------

写的很好,mark

li0709 发表于 2012-2-25 20:34:42

研究下

luhuaneda 发表于 2012-2-25 21:29:56

mark

kenson 发表于 2012-2-25 21:48:10

mark

binaimei2007 发表于 2012-2-25 22:00:50

mark

tiancaigao7 发表于 2012-2-25 22:36:14

绘制曲线最大的问题是闪屏,尤其是上了GUI之后,曲线绘制会比较慢,因此就会出现闪屏。这个时候要使用缓冲,但是会增加资源占用。这个是需要解决的问题。

simon51 发表于 2012-9-23 15:45:09

mark{:smile:}

sunocean 发表于 2012-9-28 08:36:55

楼主,代码好好排下呀,看着很乱,不过技术贴值得支持

凌晨一点 发表于 2013-2-1 20:43:18

现在还看得不太懂··留着以后用

hubinghuandi 发表于 2013-2-2 09:07:34

收藏,备用,谢谢楼主

hamipeter 发表于 2013-2-2 09:34:51

支持,顶一下

304301959 发表于 2013-8-5 10:35:45

好好看看

wsh 发表于 2013-11-11 15:26:57

果断收藏。。。。。。。。。。

kikai 发表于 2013-11-11 15:47:25

mark 学习了

woshiqinyikun 发表于 2013-11-11 18:48:19

学习了,谢谢楼主
页: [1]
查看完整版本: 在LCD上画波形、曲线、直线