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

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-10-10 07:47:09

31

主题

370

回帖

4387

积分

荣誉版主

积分
4387
发表于 2025-10-1 14:51:37 | 显示全部楼层
dong*** 发表于 2025-10-1 09:46
版主你好,我使用你的程序成功驱动tft屏,有一个问题搞不明白,主函数里去掉

          LCD_A12(120,30,"A ...

当编译系统版本较高时, 对语法比较严格, 若函数有定义和实现,但是没有被调用,就有警告"UNCALLED",这些警告是可以忽略,就是看着不太舒服.
但是错误是不能忽视的. "ADDRESS SPACE OVERFLOW"表示地址空间已经超出了. 与你上面的问题有关(编译系统未和谐,代码是受限的).
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-10-10 08:18:26

12

主题

22

回帖

398

积分

中级会员

积分
398
发表于 2025-10-1 15:26:30 | 显示全部楼层
浦江*** 发表于 2025-10-1 14:51
当编译系统版本较高时, 对语法比较严格, 若函数有定义和实现,但是没有被调用,就有警告"UNCALLED",这些警 ...

谢谢,还有奇怪现象侧边栏C:\Users\d\Desktop\233655656.png有两个stc32g.h
233655656.png

点评

这种现象确实有点奇怪,可能是编译系统有点小BUG,但即使重复,也是不影响编译调试,可以忽略。  详情 回复 发表于 2025-10-2 09:02
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-10-10 07:47:09

31

主题

370

回帖

4387

积分

荣誉版主

积分
4387
发表于 2025-10-2 09:02:16 | 显示全部楼层
dong*** 发表于 2025-10-1 15:26
谢谢,还有奇怪现象侧边栏有两个stc32g.h

这种现象确实有点奇怪,可能是编译系统有点小BUG,但即使重复,也是不影响编译调试,可以忽略。
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-10-10 08:18:26

12

主题

22

回帖

398

积分

中级会员

积分
398
发表于 7 天前 | 显示全部楼层
版主,有没有取模软件,发一份,谢谢
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-10-10 08:18:26

12

主题

22

回帖

398

积分

中级会员

积分
398
发表于 7 天前 | 显示全部楼层
你好版主,清屏的一个语句不太明白,“ for (temp = 0; temp < 115200; temp++) LCD_DATA(COLOR[Bcolor]); //240*240*2=115200”,这里不应该就是240*240吗,为什么要乘以2呢,还有我现在用的240+320像素的,想横屏显示命令是什么,求解答

点评

清屏函数实际上就是用一种颜色填满整个显示缓存区, 因为这个是彩色显示屏, 每一个像素是用16位来表示的,RGB格式, 红色R占5位, 绿色G占6位, 蓝色B占6位, 即一个像素占用2个字节,所以共计要用240*240*2个字节来填充  详情 回复 发表于 7 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-10-10 07:47:09

31

主题

370

回帖

4387

积分

荣誉版主

积分
4387
发表于 7 天前 | 显示全部楼层
dong*** 发表于 2025-10-3 10:21
你好版主,清屏的一个语句不太明白,“ for (temp = 0; temp < 115200; temp++) LCD_DATA(COLOR[Bcolor]);  ...

  清屏函数实际上就是用一种颜色填满整个显示缓存区, 因为这个是彩色显示屏, 每一个像素是用16位来表示的,RGB格式, 红色R占5位, 绿色G占6位, 蓝色B占6位,  即一个像素占用2个字节,所以共计要用240*240*2个字节来填充.
  另外, 320*340的显示屏, 横屏竖屏的切换, 主要是在初始化函数中实现, 首先要确定显示屏是什么驱动, 要看具体手册描述, 看相关寄存器的定义, 常见的是对地址为0x36的寄存器,要弄清楚各个位的定义, 写入指定的控制字即可.
比如本案例中, ST7789驱动: 初始化函数中的这些语句:
LCD_CMD(0x36);
LCD_DAT(0x00);  //LCD_DAT(0xC0);XY镜像
                          // LCD_DAT(0x00); Memory Data Access Control
注释中已经提示了可能的变化, 其实质是改变内存扫描的方向.
同时要好匹配宽度和高度参数:
本案例中, 初始化函数中的这些语句:
  LCD_CMD(0x2A);
  LCD_DAT(0x00); LCD_DAT(0x00);LCD_DAT(0x00); LCD_DAT(0xF0);  //宽度240
  LCD_CMD(0x2B);
  LCD_DAT(0x00);LCD_DAT(0x00);LCD_DAT(0x01); LCD_DAT(0x40);  //高度320

要注意各种显示屏的定义是不一定相同的.
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-10-10 08:18:26

12

主题

22

回帖

398

积分

中级会员

积分
398
发表于 6 天前 | 显示全部楼层
浦江*** 发表于 2025-10-3 21:08
清屏函数实际上就是用一种颜色填满整个显示缓存区, 因为这个是彩色显示屏, 每一个像素是用16位来表示的 ...

一、我刚开始也是这样想的,因为双字节所以乘二,但我看见for后面的LCD_DATA(COLOR[Bcolor]); 我就糊涂了,LCD_DATA(COLOR[Bcolor]); 是个双字节函数,(刚才我试过了应该不乘2,也是满屏
二、LCD_CMD(0x36);
       LCD_DAT(0x00);  //LCD_DAT(0xC0);XY镜像
                          // LCD_DAT(0x00); Memory Data Access Control
这个我修改成LCD_DAT(0xC0);他只是改了扫描方向,调转180度,但还是竖屏,手册全是英文看不懂。
三、l=strlen(str);与 L=Len;  这个是怎么来的,也没找到,
最后向你不辞辛苦的解答表示衷心的感谢,祝你国庆节快乐。

点评

1, 这个LCD_DAT()和LCD_DATA()函数都是我自己定义的, 目的是简明, 前者发送8位,单字节数据, 后者是发送16位双字节数据. 搞清楚原理, 适当使用即可. 有时候写源程序比较简练, 属于个人爱好. 是可以灵活变化的. 2, 320  详情 回复 发表于 6 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-10-10 07:47:09

31

主题

370

回帖

4387

积分

荣誉版主

积分
4387
发表于 6 天前 | 显示全部楼层
dong*** 发表于 2025-10-4 08:57
一、我刚开始也是这样想的,因为双字节所以乘二,但我看见for后面的LCD_DATA(COLOR[Bcolor]); 我就糊涂了 ...

1, 这个LCD_DAT()和LCD_DATA()函数都是我自己定义的, 目的是简明, 前者发送8位,单字节数据, 后者是发送16位双字节数据. 搞清楚原理, 适当使用即可. 有时候写源程序比较简练, 属于个人爱好. 是可以灵活变化的.
2, 320*240显示屏切换横竖问题, 可以提供一下你的显示屏是什么驱动芯片的, 或许能帮你找找看解释一下.
3, 关于l=strlen(str); 这是求一个字符串长度的函数, 它是C语言中的标准函数,不需要自己编写的.它定义在string.h中, 只要在文件开始处加入#include <string.h>就可以使用此函数了.
(注意一下#include "string.h" 和#include <string.h>,虽然都可以,但还是有区别的.)
这里还牵涉到个人的习惯爱好问题.比如, 显示一个16点阵字体的字符串文本,函数咋写?
我的习惯是:
LCD_P16(u16 x,u16 y,char * str,u16 fc,u16 bc);
这里函数名称中P16就是Printf显示16点阵字体的意思, 后面就四个或五个参数: x,y,屏幕坐标,后跟具体字符串, 再就是指定前景色和背景色, 比较简明.(若是单色屏,可再省一个参数,简化为mode, 1或0,正显还是反显)
通常你可能会看到, 显示字符串的函数会这样写(外国人写源码往往如此):
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode,u8 len.....);
这里多了一些参数, 例如设定字体大小,还说明字符串的长度等等.
看似函数很通用, 算法很高级, 其实个人认为没必要的.
单片机编程, 可使用的字体是很少的,8,16,24,32,就那几种就足够用了.你把字体弄成是可以设定的, 实际上进入函数后, 还要增加判断字体大小的合法性, 计算字体的间隔和行距等等,要应对编程者使用不同大小字体的可能性, 反而将函数写得复杂难懂了.
另外再看len参数, C语言中字符串是以0x00为结束符的, 进入函数后只要调用strlen()就可计算出字符串的长度,因此不必要带这个参数来调用显示字符串函数的.  这也是回答了你,我为什么要用l=strlen(str)这样的语句了.
如果用通常的字符串显示函数来编程的话, 每当要显示字符串时, 就要想想,用多大的字体,别搞错了,算算字符串的长度该指定多少(缺少了灵活性)等等, 一是增加了源代码篇幅,二是也并不省心.
当然这是个人观点和习惯, 仅供参考了...
最后,感谢你节日的祝福. 本人乐见爱好单片机的同学. 交流也是快乐的.  愿你实验顺利愉快!
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-10-10 08:18:26

12

主题

22

回帖

398

积分

中级会员

积分
398
发表于 6 天前 | 显示全部楼层
浦江*** 发表于 2025-10-4 16:44
1, 这个LCD_DAT()和LCD_DATA()函数都是我自己定义的, 目的是简明, 前者发送8位,单字节数据, 后者是发送16 ...

非常感谢你回复,看了你的回复收获颇丰,你写函数的方式感觉非常好,显示字符位置前景后景一次搞定了,很值得借鉴和学习,横屏的命令已经找到了,当时只想搜st7789的中文资料,找了半天也没找到,最后百度直接搜“st7789”横屏命令,找到了,是0x60,已经实现横屏显示了,最后,在此向你表示感谢,
微信图片_20251004171604_2_6.jpg

点评

祝贺你,实验成功,界面很漂亮的. 这套关于显示屏的函数, 基本上是够用的了. 16点阵和24点阵的显示字符串函数, 是可实现中西文混合显示的, 直接将要显示的内容写在引号内即可, 这样源代码的可读性也是很强的.  详情 回复 发表于 6 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-10-10 07:47:09

31

主题

370

回帖

4387

积分

荣誉版主

积分
4387
发表于 6 天前 | 显示全部楼层
dong*** 发表于 2025-10-4 17:09
非常感谢你回复,看了你的回复收获颇丰,你写函数的方式感觉非常好,显示字符位置前景后景一次搞定了,很 ...

祝贺你,实验成功,界面很漂亮的.
这套关于显示屏的函数, 基本上是够用的了.
16点阵和24点阵的显示字符串函数, 是可实现中西文混合显示的, 直接将要显示的内容写在引号内即可, 这样源代码的可读性也是很强的.
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-10 12:59 , Processed in 0.127042 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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