数码之家

 找回密码
 立即注册
搜索
查看: 5880|回复: 20

[C51] 请教在TFT彩屏的图片背景上显示文字的问题

[复制链接]
发表于 2020-8-20 15:47:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
撂下了LED数码管又找出来TFT彩屏继续玩,有一个问题不知道咋弄特来请教,TFT彩屏可以刷上图片背景、也可以刷单色背景,我想在背景上显示时钟、文字,起初以为采样叠加显示的写屏模式就可以了,但是后来发现这方法是错误的,如果在某一个位置写入一个固定文字是没问题的,但是如果在同一个位置显示新的文字就会出现新旧文字的叠加,弄了好几天了也找不到解决办法,请各位指点一下路径如能分享些资料就更加感激了,先谢了!
发表于 2020-8-20 16:02:16 | 显示全部楼层
屏幕不是整个要刷新的吗,没听说单个位置刷新的,
回复 支持 反对

使用道具 举报

发表于 2020-8-20 16:04:48 | 显示全部楼层
进来学习的,坐等高手解答!
回复 支持 反对

使用道具 举报

发表于 2020-8-20 16:10:04 | 显示全部楼层
基本小lcd屏文字单片写屏都是用写点函数来解决的,原位置像素信息一般不保留,需要图片透文字的时候需要读取汉字点位的原图形像素保存,清除或者写下一个汉字时候需要覆盖回去(无论是读原图或者lcd缓存都可以),纯色则把上个汉字按底色从新写一遍或者方形区域从新覆盖底色。
如果你内存充裕,可以设置一个图像缓冲区,覆盖好各种图像文字再统一刷新,这样不容易闪,当然如果总线不快这样整体刷新也不快,一般都是写点写块,能不刷新的地方都不刷新。再高级点的系统会自动处理叠加显示刷新的问题。
回复 支持 反对

使用道具 举报

发表于 2020-8-20 16:26:26 | 显示全部楼层
叠加字需要现刷新背景(非单色时)
回复 支持 反对

使用道具 举报

发表于 2020-8-20 20:48:21 | 显示全部楼层
最简单的就是先重刷下背景。
回复 支持 反对

使用道具 举报

发表于 2020-8-20 23:12:46 | 显示全部楼层
最简单就是楼上说的重刷背景,不然就要写点前读点存到数组中,下次写前也要先还原数组中的内容
回复 支持 反对

使用道具 举报

发表于 2020-8-20 23:44:57 | 显示全部楼层
如果CPU足够强大,就用emwin来做这些事情吧,自己写还是太花时间,不一定每个轮子都要自己造吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 08:48:25 | 显示全部楼层
bluexiaoyu 发表于 2020-8-20 16:10
基本小lcd屏文字单片写屏都是用写点函数来解决的,原位置像素信息一般不保留,需要图片透文字的时候需要读 ...

感谢层主,你说的东西都是敲黑板划重点的事,我在试试如果不成在向你请教,多谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 08:55:18 | 显示全部楼层
zhkrid 发表于 2020-8-20 16:02
屏幕不是整个要刷新的吗,没听说单个位置刷新的,

51单片机驱动ILI9468的4寸TFT,即使我用的是8080并口驱动刷一瓶也要2秒多,如果我在背景上显示时钟,那么秒的个位那个数字每秒跳变一次就刷屏,那么屏幕是刷不过来的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 08:56:21 | 显示全部楼层
bg4rff 发表于 2020-8-20 16:26
叠加字需要现刷新背景(非单色时)

多谢,正在考虑如何保存原始背景的方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 08:58:24 | 显示全部楼层
akikyoua 发表于 2020-8-20 23:12
最简单就是楼上说的重刷背景,不然就要写点前读点存到数组中,下次写前也要先还原数组中的内容 ...

多谢,“重刷背景”的“重”字或许是个点,回头在这个方面试试看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-21 09:08:00 | 显示全部楼层
go2net 发表于 2020-8-20 23:44
如果CPU足够强大,就用emwin来做这些事情吧,自己写还是太花时间,不一定每个轮子都要自己造吧 ...

说实话emwin弄了一阵子没能弄明白,我的另一块屏是7寸-SD1963的,用STM32F407驱动就会用到这个了,本帖的ILI19468的4寸屏是用STC单片机驱动的,只是做一个可以设置图片背景的闹表,简单应用而已。
回复 支持 反对

使用道具 举报

发表于 2020-8-23 16:21:24 | 显示全部楼层
STC驱动TFT,用纯色背景,超频可能勉强可行,如果用彩色背景图作背景是不可行的。用STM32驱动是可靠的。操作上用GRAM写屏尝试一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 20:08:38 | 显示全部楼层
fsss007 发表于 2020-8-23 16:21
STC驱动TFT,用纯色背景,超频可能勉强可行,如果用彩色背景图作背景是不可行的。用STM32驱动是可靠的。操 ...

你好,我现在实验的就是STM32F4驱动SD1963的16位并口7寸TFT,用的是原子的例程,原本我想在这个系统中弄好了效果再往STC驱动的4寸屏上移植,如果是纯色背景就不是问题了,就是图片背景的一直不行,这两天根据楼上各位的提示,经过努力在固定位置的单个文字不破坏背景而更新显示已经没有问题了,但是固定宽度内的字符串显示则没能实现,因为保存屏幕点颜色值需要的内存太多了无法实现。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-25 10:32:36 | 显示全部楼层
本帖最后由 慕名而来 于 2020-8-25 10:47 编辑

问题没有解决,按照我的思路,如果用48*24的字符显示时钟的话,例如显示:12:25:48 需要保存的区域为高*宽=48*192=9216个颜色点(对于7寸屏而言这应该是很小的一块),也就是需要保存9216个16位数据,再加上x、y的坐标就需要建立一个二维数组data[10000][3];(其中的[3]为[x][y][颜色值]),我试了一下,编译出错、提示内存不足,而单片机的资源如下图所示:

在此请各位指点一下,应该怎样保存背景颜色或者说应该将采集的背景数据暂存到哪里,STM32单片机只是刷例程的水平,很多东西真心不懂,另外,我所说的这个data[10000][3]数组究竟需要占用多大的空间,怎么计算我也不会。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2020-8-25 10:53:03 | 显示全部楼层
本帖最后由 bluexiaoyu 于 2020-8-25 11:03 编辑
慕名而来 发表于 2020-8-25 10:32
问题没有解决,按照我的思路,如果用48*24的字符显示时钟的话,例如显示:12:25:48 需要保存的区域为高*宽= ...

如果你是固定图像背景,直接从新覆盖图像即可,自己写个转换函数,按字符的左上位置查询背景图像相关区域颜色,自己新写个字符恢复函数和写点恢复函数,查询相对位置的图像,写点时候写背景图像的颜色,每次写正常字符前,把老字符写一遍背景图形区块或者文字点位

建议从新描绘文字范围区块即可,这样不需要存储临时数据,只需要自己复制改写下文字函数改成根据位置覆盖区域图像
另外,你保存48*24的思路是错的,你如果用透明模式,则只需要保存亮点颜色数据即可,并且颜色数据rgb是可压缩的,你只需要写文字前,把文字对应的每个点颜色保存为一个序列即可(最大无非是纯白快48*24。最小估计也就几个点的符号,顺序压入一个堆栈),下次覆盖还是这个文字,所以不用保存位置信息,保存文字编号就成,还按字库顺序每个点覆盖回去就好(每次从序列里出栈一个颜色),位置信息可以计算出来,没必要保存,文字缝隙的空白点也没必要保存
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-25 11:08:01 | 显示全部楼层
bluexiaoyu 发表于 2020-8-25 10:53
如果你是固定图像背景,直接从新覆盖图像即可,自己写个转换函数,按字符的左上位置查询背景相关区域颜色 ...

多谢你的热心指点很愿意与你交流,你说的方法我的理解是每次需要复原背景时就到背景图的对应位置去读取哪里的数据来用不经过中间的存储过程,是这样吗,我的背景图片是存储在TF卡内的,需要刷新背景时就读卡写屏,我不知道原子的代码中是否有图片缓存,如果有的话就真的是个好办法,如果没有的话貌似也不好实现的。
回复 支持 反对

使用道具 举报

发表于 2020-8-25 12:01:34 | 显示全部楼层
慕名而来 发表于 2020-8-25 11:08
多谢你的热心指点很愿意与你交流,你说的方法我的理解是每次需要复原背景时就到背景图的对应位置去读取哪 ...

读卡那就慢了。。。

你还是研究保存文字点进堆栈(不建议整块保留,每次只保留文字覆盖区域),然后再出栈覆盖吧,按这个方法,空间至少比你预计的省2/3以上,

思路大概是自己写个写点函数和写文字函数,每次写正常文字前,读lcd gram字符每个点的颜色顺序保存,然后写正常文字,然后写下一个字符前,按上一个文字的点位顺序把图像gram信息覆盖回去,然后再读下一个正常文字点位的gram,再写下一个文字,如此往复,相信要保留的数组不会很大,每个点不压缩也只占24bit一个半字节,这个操作只给秒更新字符即可,分钟的看你内存剩余,减少读和刷新tf也对寿命好点,小时或者天气一类的刷新的就没必要保存了,直接覆盖全图然后从新写文字即可。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 18:02 , Processed in 0.124801 second(s), 9 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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