STM32 ILI9341驱动TFTLCD屏(六)LCD画直线

接口/总线/驱动

1139人已加入

描述

通过前面的学习,已经掌握了LCD显示图片以及显示Gif动画。这些图片其实也可以自己通过写显存,以画画的方式完成。而画画最基本的就是点和线了。

要画一个点,只要取一个点的区域,写该点的显存就可以完成。

void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
  ILI9341_SetPageAddr(y,y);      //页地址设置
  ILI9341_SetColumnAddr(x,x);     //列地址设置
  ILI9341_WriteMemory(&color,1); //写点的显存
}

接着进行测试,连续画多个点看最终效果。

主函数

#include "stm32f4xx.h"
#include "core_cm4.h"
#include "ili9341.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  for(i=0;i< 240;i++)
    LCD_DrawPoint(i,i,RED);
  while(1);
}

屏幕显示如下图

LCD显示

连续画点可以看到点已经被画出来,最终连成了一条直线,画点函数编写成功。

点画好了,而两点又可以确定一条直线,现在开始构造画直线函数。画直线可以模仿Windows下的画图工具中的直线,缩小时看起来是一条直线,放大后可以看到是由很多个点上下左右移动得到的。

LCD显示

LCD显示

通过什么判断往哪个方向移动呢?根据数学知识可以知道直线的斜率可以判断直线与X轴的夹角,那么也可以用来判断写入的点在直线上方还是下方,左边还是右边。

为了更加方便的编写函数,默认划线方向为从左到右,如果起点在终点的右边,就把终点和起点互换,从左到右画线。再根据两点的坐标计算从起点到终点要偏移多少次才能完成。接着就是通过斜率判断下一个点究竟往哪个方向偏移。不断循环,直到终点为止。

void LCD_DrawLine(u16 x0,u16 y0,u16 x1,u16 y1,u16 color)
{
  u16 xm = 0,ym = 0;
  u16 step = 0;  

  if(x1< x0)    //如果起点在终点左边,起点终点互换位置,确保从左到右划线
  {
    xm = x0;
    x0 = x1;
    x1 = xm;

    ym = y0;
    y0 = y1;
    y1 = ym;
  }
  xm = x0;
  ym = y0;
  LCD_DrawPoint(xm,ym,color);//写起点

  if(y1 >=y0)    //斜率为正
  {
    step = (y1-y0)+(x1-x0);//需要移动的步数
    while(step--)
    {
      if((y1-ym)*(x1-x0) >(y1-y0)*(x1-xm))//判断斜率
        ym++;
      else 
        xm++;
      LCD_DrawPoint(xm,ym,color);
    }
  }
  else        //斜率为负
  {
    step = (y0-y1)+(x1-x0);//需要移动的步数
    while(step--)
    {
      if((y1-ym)*(x1-x0)< (y1-y0)*(x1-xm))//判断斜率
        ym--;
      else 
        xm++;
      LCD_DrawPoint(xm,ym,color);
    }
  }
}

主函数画三角形进行测试

#include "stm32f4xx.h"
#include "core_cm4.h"
#include "ili9341.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  while(1)
  {
    LCD_DrawLine(10,20,10,80,RED);
    LCD_DrawLine(10,80,80,80,RED);
    LCD_DrawLine(80,80,10,20,RED);
  }
}

屏幕显示如下

LCD显示

屏幕显示出三角形,画直线函数编写成功。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分