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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:296
  • 最近打卡:2025-06-15 10:29:27

10

主题

99

回帖

250

积分

中级会员

积分
250
发表于 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
  • 打卡总天数:535
  • 最近打卡:2025-06-15 08:26:34

31

主题

351

回帖

3785

积分

荣誉版主

积分
3785
发表于 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 | 显示全部楼层
牛蛙
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:37
  • 最近打卡:2025-06-15 22:31:29
已绑定手机

0

主题

23

回帖

240

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:48
  • 最近打卡:2025-06-15 00:00:31
已绑定手机

0

主题

7

回帖

96

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:503
  • 最近打卡:2025-06-15 10:34:02

22

主题

177

回帖

1670

积分

金牌会员

积分
1670
发表于 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
  • 打卡总天数:535
  • 最近打卡:2025-06-15 08:26:34

31

主题

351

回帖

3785

积分

荣誉版主

积分
3785
发表于 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, 下载次数: 1)


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 03:55 , Processed in 0.233228 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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