打印

请教一个LCD划线的程序!

[复制链接]
3073|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llllwwww|  楼主 | 2009-6-22 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一个LCD划线的程序!这个程序实在看不明白!
要求要简化它,不要每个点来判断一次,要按照步长来判断!
就是说要划虚线!谢谢那位大侠能帮我分析分析~
//划线
void DrawLine(unsigned int intStarX_Addr,unsigned int intStarY_Addr,unsigned int intEndX_Addr,unsigned int intEndY_Addr)
{
    unsigned char ReadData;
    unsigned int ErrDataX=0;                //X方向公差
    unsigned int ErrDataY=0;                //Y方向公差
    unsigned int PointNum=0;
    unsigned long Temp;
    unsigned int D_X;                    //X坐标差
    unsigned int D_Y;                    //Y坐标差
    unsigned int MaxErrData;                //X坐标差和Y坐标差中的最大值
    unsigned int OffsetX;                    //X方向修改值
    unsigned int OffsetY;                    //Y方向修改值
    unsigned int PX=intStarX_Addr;                //X点坐标
    unsigned int PY=intStarY_Addr;                //Y点坐标
    unsigned int EX=intEndX_Addr;
    unsigned int EY=intEndY_Addr;
    
//    EX=intEndX_Addr;
//    EY=intEndY_Addr;
    
    D_X=ABS(PX,EX);                        //D_X=|intEndX_Addr-intStarX_Addr|
    D_Y=ABS(PY,EY);                        //D_Y=|intEndY_Addr-intStarY_Addr|
    MaxErrData=Max(D_X,D_Y);                //MaxErrData=max(D_X,D_Y)
    if((PX==EX)&&(PY==EY))
    {
        ReadData=ReadSram_one_Data(PX,PY);
        ReadData=BitTurnOver(ReadData,0);
        if(bCPL==false)    
            ReadData=ReadData|0x01;
        WriteSram_one_Data(PX,PY,ReadData);
    }
    else
    {

        if(EX>PX)
            OffsetX=1;                //intEndX_Addr>intStarX_Addr
        else if(EX<PX)
            OffsetX=0xffff;                //intEndX_Addr<intStarX_Addr
        else
            OffsetX=0;                //intEndX_Addr=intStarX_Addr
        if(EY>PY)
            OffsetY=1;                //intEndY_Addr>intStarY_Addr
        else if(EY<PY)
            OffsetY=0xffff;                //intEndY_Addr<intStarY_Addr
        else
            OffsetY=0;                //intEndY_Addr=intStarY_Addr
        do
        {
            if(PointNum%Step==0)
            {
                 ReadData=ReadSram_one_Data(PX,PY);
                ReadData=BitTurnOver(ReadData,0);
                if(bCPL==false)    
                    ReadData=ReadData|0x01;
                WriteSram_one_Data(PX,PY,ReadData);
            }
            Temp=(unsigned long)ErrDataX+D_X;
            if(Temp>=0x10000)
            {
                ErrDataX=ErrDataX+D_X;
                ErrDataX=ErrDataX-MaxErrData;
                PX=PX+OffsetX;
            }
            else
            {
                ErrDataX=ErrDataX+D_X;
                if(ErrDataX>=MaxErrData)
                {
                    ErrDataX=ErrDataX-MaxErrData;
                    PX=PX+OffsetX;
                }    
            }
            Temp=(unsigned long)ErrDataY+D_Y;
            if(Temp>=0x10000)
            {
                ErrDataY=ErrDataY+D_Y;
                ErrDataY=ErrDataY-MaxErrData;
                PY=PY+OffsetY;
            }
            else
            {
                ErrDataY=ErrDataY+D_Y;
                if(ErrDataY>=MaxErrData)
                {
                    ErrDataY=ErrDataY-MaxErrData;
                    PY=PY+OffsetY;
                }
            }
            PointNum++;
        }while(PointNum!=MaxErrData);
        ReadData=ReadSram_one_Data(PX,PY);
        ReadData=BitTurnOver(ReadData,0);
        if(bCPL==false)    
            ReadData=ReadData|0x01;
        WriteSram_one_Data(EX,EY,ReadData);
    }
}    

相关帖子

沙发
qsdz| | 2009-7-7 14:12 | 只看该作者

给你一个函数

void  GUI_Line(INT16U x0, INT16U y0, INT16U x1, INT16U y1, TCOLOR color)
{  int32   dx;                        // 直线x轴差值变量
   int32   dy;                      // 直线y轴差值变量
   int8    dx_sym;                    // x轴增长方向,为-1时减值方向,为1时增值方向
   int8    dy_sym;                    // y轴增长方向,为-1时减值方向,为1时增值方向
   int32   dx_x2;                    // dx*2值变量,用于加快运算速度
   int32   dy_x2;                    // dy*2值变量,用于加快运算速度
   int32   di;                        // 决策变量
   
   
   dx = x1-x0;                        // 求取两点之间的差值
   dy = y1-y0;
   
   /* 判断增长方向,或是否为水平线、垂直线、点 */
   if(dx>0)                            // 判断x轴方向
   {  dx_sym = 1;                    // dx>0,设置dx_sym=1
   }
   else
   {  if(dx<0)
      {  dx_sym = -1;                // dx<0,设置dx_sym=-1
      }
      else
      {  // dx==0,画垂直线,或一点
         GUI_RLine(x0, y0, y1, color);
           return;
      }
   }
   
   if(dy>0)                            // 判断y轴方向
   {  dy_sym = 1;                    // dy>0,设置dy_sym=1
   }
   else
   {  if(dy<0)
      {  dy_sym = -1;                // dy<0,设置dy_sym=-1
      }
      else
      {  // dy==0,画水平线,或一点
         GUI_HLine(x0, y0, x1, color);
           return;
      }
   }
    
   /* 将dx、dy取绝对值 */
   dx = dx_sym * dx;
   dy = dy_sym * dy;
 
   /* 计算2倍的dx及dy值 */
   dx_x2 = dx*2;
   dy_x2 = dy*2;
   
   /* 使用Bresenham法进行画直线 */
   if(dx>=dy)                        // 对于dx>=dy,则使用x轴为基准
   {  di = dy_x2 - dx;
      while(x0!=x1)
      {  GUI_Point(x0, y0, color);
         x0 += dx_sym;
         if(di<0)
         {  di += dy_x2;            // 计算出下一步的决策值
         }
         else
         {  di += dy_x2 - dx_x2;
            y0 += dy_sym;
         }
      }
      GUI_Point(x0, y0, color);        // 显示最后一点
   }
   else                                // 对于dx<dy,则使用y轴为基准
   {  di = dx_x2 - dy;
      while(y0!=y1)
      {  GUI_Point(x0, y0, color);
         y0 += dy_sym;
         if(di<0)
         {  di += dx_x2;
         }
         else
         {  di += dx_x2 - dy_x2;
            x0 += dx_sym;
         }
      }
      GUI_Point(x0, y0, color);        // 显示最后一点
   } 
  
}

使用特权

评论回复
板凳
许世霞| | 2009-7-15 09:23 | 只看该作者

标记!

   楼主和楼下这两个前辈你们的程序是用在什么片子上的!我最近是用51系列的控制个LCD,也想怎么样才能划线什么的。感觉这个也是一个数学技巧问题。不知我说的对不嘿嘿

使用特权

评论回复
地板
winloop| | 2009-9-23 17:23 | 只看该作者
你还是对这个液晶点阵的排列方式和控制方式不熟悉,去研究手册去吧,在这里是问不出来的

使用特权

评论回复
5
rockos| | 2009-10-7 13:31 | 只看该作者
和片子没有关系,这是光栅画线算法中的一种,直线是最简单的。

随便找一本计算机图形学的书,都会讲到的。

使用特权

评论回复
6
李冬发| | 2010-7-1 23:10 | 只看该作者
和片子没有关系,这是光栅画线算法中的一种,直线是最简单的。

随便找一本计算机图形学的书,都会讲到的。
rockos 发表于 2009-10-7 13:31

圆是最简单的,直线恰恰是比较复杂的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

450

帖子

2

粉丝