阿杰爱学单片机 发表于 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定义是无符号整数,计算就出错了。
因此当画左下右上的斜线时,要另外处理,改变计算方法。
附上修正版:




页: 1 2 [3] 4
查看完整版本: SPI-TFT(240x240)彩屏@屠龙刀-32G12K128 驱动 | TFT取代OLED12864