接口/总线/驱动
通过前面的学习,已经掌握了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);
}
屏幕显示如下图
连续画点可以看到点已经被画出来,最终连成了一条直线,画点函数编写成功。
点画好了,而两点又可以确定一条直线,现在开始构造画直线函数。画直线可以模仿Windows下的画图工具中的直线,缩小时看起来是一条直线,放大后可以看到是由很多个点上下左右移动得到的。
通过什么判断往哪个方向移动呢?根据数学知识可以知道直线的斜率可以判断直线与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);
}
}
屏幕显示如下
屏幕显示出三角形,画直线函数编写成功。
全部0条评论
快来发表一下你的评论吧 !