930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 9656|回复: 0

LCD 12864液晶模块使用详解6-画直线和简单表格

[复制链接]

27

主题

72

帖子

384

积分

版主

Rank: 7Rank: 7Rank: 7

积分
384
发表于 2016-9-27 22:06:19 | 显示全部楼层 |阅读模式
本帖最后由 飞宇 于 2016-9-27 22:25 编辑

       有了画点的基础,画线就比较容易了。画线的时候,有下面三种类型的直线:
       1). 画水平直线。
       2). 画垂直直线。       3). 画任意直线。

       水平直线:水平直线的y坐标相同,从x坐标的起点到终点逐个画点即可实现。

程序清单:
  1. /************************************************************************
  2. * 描  述 : LCD12864液晶画水平直线
  3. * 参  数 : x0[in]:起点x轴坐标,范围0~127
  4. *        : x1[in]:终点x轴坐标,范围0~127
  5. *        :y[in]:y轴坐标,范围0~63  
  6. *        :color[in]:0=熄灭,1=点亮,2=反显
  7. * 返回值 : SUCCESS:操作成功,PARM_ERR:输入参数错误
  8. ************************************************************************/
  9. uchar DrawHline(uchar x0,uchar x1,uchar y,uchar color)
  10. {
  11.     uchar temp;
  12.    
  13.     //判断输入参数是否合法
  14.     if((x0>127)||(x1>127)||(y>63))return PARM_ERR;
  15.     if(color>2)return PARM_ERR;

  16.     if(x0>x1)
  17.     {
  18.     temp=x0;x0=x1;
  19.     x1=temp;
  20.   }
  21.   do
  22.   {
  23.       LCD_DrawDot(x0,y,color);
  24.       x0++;
  25.   }
  26.   while(x1>=x0);
  27.    
  28.     return SUCESS;
  29. }
复制代码
     使用画水平直线函数画一条起点(10,30)(100,30)的水平直线,效果如下:
      



     垂直直线:垂直直线和水平直线类似,垂直直线的x坐标相同,从y坐标的起点到终点逐个画点即可实现。

程序清单:
  1. /************************************************************************
  2. * 描  述 : LCD12864液晶画垂直直线
  3. * 参  数 : x[in]:x轴坐标,范围0~127
  4. *        : y0[in]:y轴起点坐标,范围0~63
  5. *        :y1[in]:y轴终点坐标,范围0~63  
  6. *        :color[in]:0=熄灭,1=点亮,2=反显
  7. * 返回值 : SUCCESS:操作成功,PARM_ERR:输入参数错误
  8. ************************************************************************/
  9. uchar DrawVline(uchar x,uchar y0,uchar y1,uchar color)
  10. {
  11.     uchar temp;
  12.    
  13.     //判断输入参数是否合法
  14.     if((x>127)||(y0>63)||(y1>63))return PARM_ERR;
  15.     if(color>2)return PARM_ERR;
  16.     if(y0>y1)
  17.     {
  18.       temp=y0;y1=y0;y0=temp;
  19.     }
  20.     do
  21.     {
  22.         LCD_DrawDot(x,y0,color);
  23.         y0++;
  24.     }
  25.     while(y1>=y0);
  26.    
  27.     return SUCESS;
  28. }
复制代码
     使用画水平直线函数画一条起点(20,10)(20,50)的直线,效果如下:
      


     掌握了画水平直线和垂直直线,画一个基本的表格就很简单了。我们只需算好表格各个线条的起点和终点,使用绘制垂直和水平直线函数绘制即可。

程序清单:
//用水平和垂直直线绘制一个表格
  1. DrawHline(0,127,0,1);
  2.     DrawHline(0,127,7,1);
  3.     DrawHline(0,127,15,1);
  4.     DrawHline(0,127,23,1);
  5.     DrawHline(0,127,31,1);
  6.     DrawHline(0,127,39,1);
  7.     DrawHline(0,127,47,1);
  8.     DrawHline(0,127,55,1);
  9.     DrawHline(0,127,63,1);
  10.    
  11.     DrawVline(0,0,63,1);
  12.     DrawVline(31,0,63,1);
  13.     DrawVline(63,0,63,1);
  14.     DrawVline(95,0,63,1);
  15.     DrawVline(127,0,63,1);
复制代码

显示效果如下:
      


      任意直线:任意直线相对比较复杂一些,我们需要做的是确定从起点到终点之间有哪些点,描绘这些点即可画出直线。目前比较流行的是采用“Bresenham画线     算法”。从起点开始,x坐标或y坐标每增加1的时候,下一个点的坐标。
     Bresenham画线算法:
  • Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
  • Bresenham直线算法用的是较为快速的整数加法、减法和位元移位,这会有效的提高处理速度。
  • 斜率k=dy/dx。斜率=0:表示画水平直线。斜率=1:表示画垂直直线。X坐标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,最接近于当前象素的右上方象素(x+1,y+1)。而当d<0.5时,更接近于右方象素(x+1,y)。

程序清单:
  1. /****************************************************************
  2. * 描  述 : LCD12864液晶画任意直线
  3. * 参  数 : x0[in]:x轴起点坐标,范围0~127
  4. *        : x1[in]:x轴终点坐标,范围0~127
  5. *        : y0[in]:y轴起点坐标,范围0~63
  6. *        :y1[in]:y轴终点坐标,范围0~63  
  7. *        :color[in]:0=熄灭,1=点亮,2=反显
  8. * 返回值 : 无
  9. ****************************************************************/
  10. uchar DrawLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
  11. {
  12.   int i,distance;   
  13.   int x=0,y=0,dx,dy;
  14.   char incx,incy;

  15.   dx=x1-x0;  //计算x轴的增量
  16.   dy=y1-y0;  //计算y轴的增量

  17.   if(dx > 0)incx=1;
  18.   else if(dx == 0)
  19.   {
  20.     //x轴起点和终点相等,表示画垂直直线
  21.     DrawVline(x0,y0,y1,color);
  22.     return SUCESS;
  23.   }
  24.   else incx=-1;
  25.    
  26.   if(dy > 0)incy=1;
  27.   else if(dy == 0)
  28.   {
  29.     //y轴起点和终点相等,表示画水平直线
  30.     DrawHline(x0,y0,y1,color);
  31.     return SUCESS;
  32.   }
  33.   else incy=-1;
  34.    
  35.   //取dx,dy绝对值
  36.   dx=abs(dx);
  37.   dy=abs(dy);
  38.   //角度变换,确保角度<=45°
  39.   if(dx > dy)distance=dx;
  40.   else distance=dy;
  41.   
  42.   //开始绘制直线
  43.   for(i=0;i<=distance+1;i++)
  44.   {
  45.     LCD_DrawDot(x0,y0,color);
  46.     x+=dx;
  47.     y+=dy;
  48.     if(x>distance)
  49.     {
  50.       x-=distance;
  51.       x0+=incx;
  52.     }
  53.     if(y>distance)
  54.     {
  55.       y-=distance;
  56.       y0+=incy;
  57.     }
  58.   }
  59.   return SUCESS;
  60. }
复制代码
使用画任意直线函数画一条起点(0,0)(128,64)的直线,效果如下:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表