数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3867|回复: 11

[C51] STC8单片机读取TFT_LCD彩屏的像素点问题求教

[复制链接]
发表于 2021-2-17 22:53:03 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2021-2-18 09:20 编辑

年假期间继续弄玩了很久的彩屏,这个彩屏的故事曾经在此发帖说过:煮熟的鸭子就这样飞走了,单片机板子也白焊了https://www.mydigit.cn/forum.php?mod=viewthread&tid=201706(出处: 数码之家) ;;;再买鸭子重新煮,继续玩TFT彩屏https://www.mydigit.cn/forum.php?mod=viewthread&tid=208210(出处: 数码之家)
这个屏配合自己打样的板子已经玩过了时间模块、温湿度模块、W25Q**字库、通过简单的FAT系统读取TF卡显示图片,这几天一直弄读取屏幕色素点,原本以为挺简单的结果弄了一周竟然没有弄通,俗话说:有事不决问百度,百度无解问坛友;希望高手先知们不吝赐教,先谢了!
系统环境:
STC8A8K64S4A12+ILI9806_4.5"_854*480彩屏
接线方式=P0;P2两个8位端口构成16bit驱动模式。注:除了初始化代码稍有不同外、ILI9341的基础代码可兼容驱动此屏幕,已经调试完成了刷屏、各种字符、文字、图片的显示。
现在的测试方法为:
1.定位写入一个像素点。
2.定位读取这个像素点。
问题为:无法正确读出像素值!不知道问题出在哪里以及接下来的工作方向。
实验方法:
调用读屏函数之前已经在坐标100,100之处画了一个值为0x1234的像素点。
而后调用如下函数读取LCD_Read(100,100)之处的像素值,读取函数如下,实验结果在最下侧。
u16 LCD_Read(u16 x,u16 y)
{
u16 r,g,b;
LCD_SetCursor(x,y);
LCD_WR_REG(0X2E);
RS=1;
CS=0;
RD=0;
delay_us(20); //延时
//空操作、假读一次
RD=1;
RD=0;
delay_us(20); //延时
//以下分两次读取数据
r=DH; //读取高8位
r=r<<8;//移入高8位
r|=DL;//读取低8位并合成16bit数据
RD=1;
RD=0;
delay_us(20);//延时
b=DH;
b=b<<8;
b|=DL;
RD=1;
g=r&0XFF;//第一次读取的是 RG 的值,R 在前,G 在后,各占 8 位
g<<=8;
CS=1;
return  (((r>>11)<<11)|((g>>10)<<5)|(b>>11));//公式转换
}
实验结果:
返回值不是0x1234;
当前返回值为0x0120;其他变量值r=0x0024;g=0x2400;b=0x0034;补充资料:






本帖子中包含更多资源

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

x
发表于 2021-2-17 23:26:48 来自手机浏览器 | 显示全部楼层
反正我觉得吧这玩意儿能用就行了,控制器里面很多寄存器有移位也就是说地址偏移,就跟1602那玩意儿一样实际显示的地址跟寄存器上面的地址都会有偏移,你可以试一下你4个角的像素点的地址各是多少,这样应该心里就有数了…用就行了…不懂瞎说的…有错的话望老哥海涵:handshake:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-18 09:02:14 | 显示全部楼层
触景情伤 发表于 2021-2-17 23:26
反正我觉得吧这玩意儿能用就行了,控制器里面很多寄存器有移位也就是说地址偏移,就跟1602那玩意儿一样实际 ...

多谢你帮我顶贴,因为这个屏还没想好做啥加上有兴趣,所以就拖拖拉拉的想到哪里就玩一阵子,此前都是玩各种显示,这次想弄一下读屏这一块结果就卡住了,这货读屏幕比1602麻烦些,毕竟像素值都是16位数据,读出来的数据还要调整RGB的排列、剪裁等等,弄着还是挺有趣的,待到你有了闲暇时间也可以玩玩。
回复 支持 反对

使用道具 举报

发表于 2021-2-18 11:18:13 | 显示全部楼层
读取两遍试试?我有个12864单色无字库的屏,没数据手册,读取数据的时候不知道什么原因要读两次才能读取正确的数值.:sweat:
回复 支持 反对

使用道具 举报

发表于 2021-2-18 12:29:22 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2021-2-18 09:02
多谢你帮我顶贴,因为这个屏还没想好做啥加上有兴趣,所以就拖拖拉拉的想到哪里就玩一阵子,此前都是玩各 ...

有好多东西玩不过来,这两天正在玩串口打印3231呢,有个串口的VFD这两天有点忙一直没怎么弄…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-19 08:42:57 | 显示全部楼层
自己再顶一下,期盼有大神能帮忙看看。
回复 支持 反对

使用道具 举报

发表于 2021-7-1 22:02:44 | 显示全部楼层
慕名而来 发表于 2021-2-19 08:42
自己再顶一下,期盼有大神能帮忙看看。

楼主你这个问题解决了没?什么方法解决的?今天弄st7796s 读ID没问题,写像素没问题,读取像素值跟你的问题一样。
回复 支持 反对

使用道具 举报

发表于 2021-7-2 09:51:08 | 显示全部楼层
本帖最后由 inthsunshine 于 2021-7-2 16:04 编辑

stc读fat, 自己写的还是开源的代码
回复 支持 反对

使用道具 举报

发表于 2021-7-2 15:28:31 来自手机浏览器 | 显示全部楼层
数据在RD上升沿移至并行口,应该在RD高电平期间读数据吧?函数中第一次空操作后未有RD置位操作就开始读操作了。是否操作顺序原因?
回复 支持 反对

使用道具 举报

发表于 2021-7-2 20:55:02 | 显示全部楼层
本帖最后由 简燕 于 2021-7-2 21:26 编辑

如果信号线的读写时序没有问题,那么就是RGB数据格式的问题了.

先看看初始化时,芯片初始化的DPI DBI参数是什么,这参数与后面的读取格式有关.

根据这个图,要么读一个16位数据(RGB565),要么读三个16位数据(RGB666,RGB888).

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 10:46:12 | 显示全部楼层
简燕 发表于 2021-7-2 20:55
如果信号线的读写时序没有问题,那么就是RGB数据格式的问题了.

先看看初始化时,芯片初始化的DPI DBI参数是 ...

非常感谢你的热心回复,只是这块屏已经废掉了,现在玩的5“屏读ID、读点都没问题了。再次感谢你的热心指点。
回复 支持 反对

使用道具 举报

发表于 2021-7-3 15:32:30 来自手机浏览器 | 显示全部楼层
能读回数据但是结果不对的这种情况一般都是时序不对导致的。说明差不多成功了,还有细节弄错。我也没有试过去读点,只是匆匆一暼。我觉得读写寄存器那里要先把cs拉低,再设置点地址和发读命令。cs全程拉低最后再变高,或者写转读的时候拉高一下再拉低,具体得实际测试一下。或者参考网上的代码研究下。编代码有个试错的过程,有时会出怪问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 02:11 , Processed in 0.187201 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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