阿杰爱学单片机
发表于 2024-8-29 13:42:48
感谢分享
lyagp03
发表于 2025-1-2 21:07:56
标记一下
xiaohaha
发表于 2025-1-7 20:09:12
<p>哪里有更详细的教程啊</p>
浦江一水
发表于 2025-1-7 21:40:30
xiaohaha 发表于 2025-1-7 20:09
哪里有更详细的教程啊
谢谢浏览和留言.
本实验的源代码,注释都是比较详细的.
还需要了解什么样的具体知识点,可以提出来,会尽力给予解答的.
xiaohaha
发表于 2025-1-8 08:30:14
浦江一水 发表于 2025-1-7 21:40
谢谢浏览和留言.
本实验的源代码,注释都是比较详细的.
还需要了解什么样的具体知识点,可以提出来,会尽力 ...
好的,我下载看看
Gostwang
发表于 2025-3-21 15:25:56
牛蛙
冬不拉
发表于 2025-5-16 10:43:35
最近买了一块TFT彩屏,收藏学习。
itschina999
发表于 2025-5-22 18:11:12
非常棒!
Tuier
发表于 2025-5-23 21:38:10
版主好,用你的程序验证了一下,很好。发现有个BUG,不知是我没搞懂,还是程序的问题,还请版主验证一下。
任意两点画线函数LCD_Line(5,5,175,175,12)运行正常,如果改成LCD_Line(5,50,175,5,12)就不对了。换言之就是画线函数坐标只能是从左上角往右下角画,如果坐标从左下角往右上角画,效果是整个区域填充了。即该函数只能是X2≥X1,Y2≥Y1。要画一条左低右高的线该如何修改该画线函数呢?
源画线函数:
/* 任意两点画直线函数 调用参数:起始点X0列Y0行,结束点X1列Y1行,Color色 */
void LCD_Line(unsigned int X1,unsigned int Y1,unsigned int X2,unsigned int Y2,unsigned char Color)
{ unsigned int i;
float r;
if(X1==X2) /* 垂直线 */
{ if(Y1==Y2){ LCD_Point(X1,Y1,Color); return; /* 画点 */}
if(Y1<Y2)LCD_LineV(X1,Y1,Y2-Y1+1,Color);
else LCD_LineV(X1,Y2,Y1-Y2+1,Color); return;
}
if(X1>X2){ i=X1;X1=X2;X2=i;i=Y1;Y1=Y2;Y2=i; } /* 交换坐标 */
if(Y1==Y2){ LCD_LineH(X1,Y1,X2-X1,Color);return; } /* 画水平线 */
r=(float)(Y2-Y1)/(float)(X2-X1); /* 计算斜率 */
if(r>=-1&&r<=1) /* 与水平夹角<=45度 */
for(i=0;i<(X2-X1);i++)LCD_Point(X1+i,Y1+i*r,Color); /* 画出斜线 */
else /* 斜率>1*/
{ r=1/r;
if(r>0) /* 与水平夹角>45度 */
for(i=0;i<(Y2-Y1);i++)LCD_Point(X1+i*r,Y1+i,Color); /* 画出斜线 */
else
{ r=-r;
for(i=0;i<(Y1-Y2);i++)LCD_Point(X1+i*r,Y1-i,Color); /* 画出斜线 */
}
}
}
浦江一水
发表于 2025-5-24 09:20:53
Tuier 发表于 2025-5-23 21:38
版主好,用你的程序验证了一下,很好。发现有个BUG,不知是我没搞懂,还是程序的问题,还请版主验证一下。
...
感谢这位坛友的浏览和指出问题。
验证了一下,确实是Line函数存在BUG,没有考虑周全,算法出错了。
现重写了Line函数局部语句,可以再试试看。
/* 任意两点画直线函数 调用参数:起始点X0列Y0行,结束点X1列Y1行,Color色 */
void LCD_Line(unsigned int X1,unsigned int Y1,unsigned int X2,unsigned int Y2,unsigned char Color)
{ float r;
unsigned int i;
if(X1==X2) /* 垂直线 */
{ if(Y1==Y2){ LCD_Point(X1,Y1,Color); return; /* 画点 */}
if(Y1<Y2)LCD_LineV(X1,Y1,Y2-Y1+1,Color);
else LCD_LineV(X1,Y2,Y1-Y2+1,Color); return;
}
if(X1>X2){ i=X1;X1=X2;X2=i;i=Y1;Y1=Y2;Y2=i; } /* 交换坐标 */
if(Y1==Y2){ LCD_LineH(X1,Y1,X2-X1,Color);return; } /* 画水平线 */
if(Y2>Y1)
{ r=(float)(Y2-Y1)/(float)(X2-X1); /* 计算斜率 */
if(r<=1) /* 与水平夹角<=45度 */
for(i=0;i<(X2-X1);i++)LCD_Point(X1+i,Y1+i*r,Color);/* 画出斜线 */
else /* 斜率>1*/
{ r=1/r;
for(i=0;i<(Y2-Y1);i++)LCD_Point(X1+i*r,Y1+i,Color); /* 画出斜线 */
}
}
else
{ r=(float)(Y1-Y2)/(float)(X2-X1); /* 计算斜率 */
if(r<=1) /* 与水平夹角<=45度 */
for(i=0;i<(X2-X1);i++)LCD_Point(X1+i,Y1-i*r,Color);/* 画出斜线 */
else /* 斜率>1*/
{ r=1/r;
for(i=0;i<(Y1-Y2);i++)LCD_Point(X1+i*r,Y1-i,Color);/* 画出斜线 */
}
}
}
两点一线的画线函数, 相对比较复杂一些。算法有多种。
这是本人自己琢磨的一种,属于比较笨拙的算法,基于斜率的思路。
当Y2小于Y1时,(Y2-Y1)将出现负值,而Y1、Y2定义是无符号整数,计算就出错了。
因此当画左下右上的斜线时,要另外处理,改变计算方法。
附上修正版: