找回密码
 立即注册
楼主: 浦江一水

SPI-TFT(240x240)彩屏@屠龙刀-32G12K128 驱动 | TFT取代OLED12864,ST7789

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-07-30 07:24:08

13

主题

165

回帖

491

积分

中级会员

积分
491
发表于 2024-8-29 13:42:48 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2025-07-31 10:38:05

10

主题

101

回帖

366

积分

中级会员

积分
366
发表于 2025-1-2 21:07:56 | 显示全部楼层
标记一下
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-02-02 05:15:26
已绑定手机

1

主题

46

回帖

99

积分

注册会员

积分
99
发表于 2025-1-7 20:09:12 | 显示全部楼层

哪里有更详细的教程啊

点评

谢谢浏览和留言. 本实验的源代码,注释都是比较详细的. 还需要了解什么样的具体知识点,可以提出来,会尽力给予解答的.  详情 回复 发表于 2025-1-7 21:40
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:581
  • 最近打卡:2025-07-31 08:49:16

31

主题

353

回帖

4013

积分

荣誉版主

积分
4013
发表于 2025-1-7 21:40:30 | 显示全部楼层
xiao*** 发表于 2025-1-7 20:09
哪里有更详细的教程啊

谢谢浏览和留言.
本实验的源代码,注释都是比较详细的.
还需要了解什么样的具体知识点,可以提出来,会尽力给予解答的.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-02-02 05:15:26
已绑定手机

1

主题

46

回帖

99

积分

注册会员

积分
99
发表于 2025-1-8 08:30:14 | 显示全部楼层
浦江*** 发表于 2025-1-7 21:40
谢谢浏览和留言.
本实验的源代码,注释都是比较详细的.
还需要了解什么样的具体知识点,可以提出来,会尽力 ...

好的,我下载看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-22 10:29:57
已绑定手机

0

主题

16

回帖

40

积分

新手上路

积分
40
发表于 2025-3-21 15:25:56 | 显示全部楼层
牛蛙
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-07-31 12:44:24
已绑定手机

0

主题

23

回帖

394

积分

中级会员

积分
394
发表于 2025-5-16 10:43:35 | 显示全部楼层
最近买了一块TFT彩屏,收藏学习。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:93
  • 最近打卡:2025-07-31 07:34:08
已绑定手机

1

主题

18

回帖

36

积分

新手上路

积分
36
发表于 2025-5-22 18:11:12 | 显示全部楼层
非常棒!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:546
  • 最近打卡:2025-07-31 10:47:23

23

主题

185

回帖

1560

积分

金牌会员

积分
1560
发表于 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); /* 画出斜线 */
   }  
  }
}

点评

感谢这位坛友的浏览和指出问题。 验证了一下,确实是Line函数存在BUG,没有考虑周全,算法出错了。 现重写了Line函数局部语句,可以再试试看。 /* 任意两点画直线函数 调用参数:起始点X0列Y0行,结束点X1列Y1行,Color  详情 回复 发表于 2025-5-24 09:20
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:581
  • 最近打卡:2025-07-31 08:49:16

31

主题

353

回帖

4013

积分

荣誉版主

积分
4013
发表于 2025-5-24 09:20:53 | 显示全部楼层
Tui*** 发表于 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定义是无符号整数,计算就出错了。
因此当画左下右上的斜线时,要另外处理,改变计算方法。
附上修正版:

05-TestLCD7789(240x240)(STC32G屠龙刀三)修正版.rar (124.68 KB, 下载次数: 36)


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-31 23:02 , Processed in 0.121693 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表