搜索
bottom↓
回复: 30

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

[复制链接]

出0入0汤圆

发表于 2011-8-21 15:16:35 | 显示全部楼层 |阅读模式
在设计仪器仪表时,经常会碰到要求在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[0x0000]
#define Y_ADDR XBYTE[0x0100]
#define CMD XBYTE[0x0200]
#define DAT XBYTE[0x0300]
//声明程序
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)
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-9-13 17:56:11 | 显示全部楼层
抢沙发

出0入0汤圆

发表于 2011-9-13 19:13:18 | 显示全部楼层
mark,以后用!

出0入0汤圆

发表于 2011-9-13 20:28:23 | 显示全部楼层
支持一下,

出0入0汤圆

发表于 2011-9-13 21:11:33 | 显示全部楼层
好强啊 值得细细研究

出0入0汤圆

发表于 2011-9-13 22:22:25 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-9-13 23:27:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-15 18:09:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-17 13:18:38 | 显示全部楼层
顶起!

出0入0汤圆

发表于 2011-9-20 23:15:41 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2011-9-22 16:27:25 | 显示全部楼层
得得得得得得得得

出0入0汤圆

发表于 2011-9-28 22:19:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-28 22:40:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-30 10:14:31 | 显示全部楼层
学习算法,留以备用!

出0入0汤圆

发表于 2011-11-4 08:32:26 | 显示全部楼层
学习,细细品味

出0入0汤圆

发表于 2011-11-4 09:03:32 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-2-25 20:30:25 | 显示全部楼层
回复【15楼】ljh42728620
-----------------------------------------------------------------------

写的很好,mark

出0入0汤圆

发表于 2012-2-25 20:34:42 | 显示全部楼层
研究下

出0入0汤圆

发表于 2012-2-25 21:29:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 21:48:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 22:00:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 22:36:14 | 显示全部楼层
绘制曲线最大的问题是闪屏,尤其是上了GUI之后,曲线绘制会比较慢,因此就会出现闪屏。这个时候要使用缓冲,但是会增加资源占用。这个是需要解决的问题。

出0入0汤圆

发表于 2012-9-23 15:45:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-28 08:36:55 | 显示全部楼层
楼主,代码好好排下呀,看着很乱,不过技术贴值得支持

出0入0汤圆

发表于 2013-2-1 20:43:18 | 显示全部楼层
现在还看得不太懂··留着以后用

出0入0汤圆

发表于 2013-2-2 09:07:34 | 显示全部楼层
收藏,备用,谢谢楼主

出0入0汤圆

发表于 2013-2-2 09:34:51 来自手机 | 显示全部楼层
支持,顶一下

出0入0汤圆

发表于 2013-8-5 10:35:45 | 显示全部楼层
好好看看

出0入0汤圆

发表于 2013-11-11 15:26:57 | 显示全部楼层
果断收藏。。。。。。。。。。

出0入0汤圆

发表于 2013-11-11 15:47:25 来自手机 | 显示全部楼层
mark 学习了

出0入0汤圆

发表于 2013-11-11 18:48:19 | 显示全部楼层
学习了,谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-3 12:46

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

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