OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9156|回复: 9

原子哥!寻求LCD_ReadPoint函数疑问解答

[复制链接]

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-11-1
在线时间
0 小时
发表于 2012-11-17 10:36:09 | 显示全部楼层 |阅读模式

 原子哥,下面是你的STM32开发指南中的读取某点的颜色值的函数,红色部分有疑问           

//读取个某点的颜色值 
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
  u16 r=0,g=0,b=0;
 if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回    
 LCD_SetCursor(x,y);    
 if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X2E);//9341/6804 发送读GRAM指令
 else LCD_WR_REG(R34);             //其他IC发送读GRAM指令
  if(lcddev.id==0X9320)opt_delay(2);    //FOR 9320,延时2us    
 if(LCD->LCD_RAM)r=0;       //dummy Read   
 opt_delay(2);  
  r=LCD->LCD_RAM;            //实际坐标颜色
  if(lcddev.id==0X9341)//9341要分2次读出
  {
  opt_delay(2);  
  b=LCD->LCD_RAM;
  g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
  g<<=8;
 }else if(lcddev.id==0X6804)r=LCD->LCD_RAM;//6804第二次读取的才是真实值
 if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0X8989||lcddev.id==0XB505)return r;//这几种IC直接返回颜色值
 else if(lcddev.id==0X9341)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下
 else return LCD_BGR2RGB(r);            //其他IC
}   
//LCD开启显示
void LCD_DisplayOn(void)
{       
 if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X29); //开启显示
 else LCD_WriteReg(R7,0x0173);    //开启显示
}


 

在蓝色字体中,b=LCD->LCD_RAM也就是将GRAM的的值赋给b啊即D[17:0]都是给了b了的,b>>11,即b取了之前D[17:11]的值给了D[6:0],但是RGB中的B应该是未移位之前的D[5:1]的值啊(这是我的理解,不知道是不是理解错误)我怎么感觉应该是(b<<11)>>11啊?

如果不嫌麻烦,可否讲一下 (((r>>11)<<11)|((g>>10)<<5)|(b>>11))的含义

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-17 10:58:46 | 显示全部楼层
回复【楼主位】悔憾人生:
---------------------------------
这就是9341奇葩IC的特技之一。
这个代码是供应商给我的,我当时为了实现读点颜色,研究了好几天无果,后面供应商告诉我,数据手册的描述有问题,随之给我个代码,一用即可。
至于这公式如何来的,供应商没说,我也不关心,能用就行。

所以楼主如果想研究的话,建议直接发email给ILI公司。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-1-8
在线时间
0 小时
发表于 2013-2-12 21:25:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我看到这里也有一点疑问。我用的是6804.
 else if(lcddev.id==0X6804)r=LCD->LCD_RAM;//6804第二次读取的才是真实值         看到这一句有疑问:
if(LCD->LCD_RAM)r=0;       //dummy Read    这是第一次。
 r=LCD->LCD_RAM;            //实际坐标颜色      这是第二次
那么第一行那句应该是第三次呀。我也看了6804的数据手册 ,如下:
2EH  RAMRD (Memory Read) 
1st  parameter   x  x x x x x x x x  x 
2nd parameter  D1[17..8]D17 D16 D15 D14 D13 D12 D11 D10 
(N+1)th parameter Dn[17..8] Dn7 Dn6 Dn5 Dn4 Dn3 Dn2 Dn1 Dn0 
确实第二次读就行了,是不是我理解有误?望原子哥能帮我解惑。
还有就是我看数据手册上,读的话,列或者页的地址寄存器是自增的。如果读了三次的话,还是读的同一个像素点吗?是不是在哪里设置了
读地址,地址寄存器不自增。
窗外挂着一纸蓝蓝的天~~!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-12 23:52:21 | 显示全部楼层
数据手册有问题!!!!此代码来自供应商!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-3-15
在线时间
4 小时
发表于 2015-5-4 20:28:28 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
那他们没有正确版本的手册么!都在误导使用者啊!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-4 23:54:39 | 显示全部楼层
回复【5楼】QKX607:
---------------------------------
没有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-4-9 14:29:44 | 显示全部楼层
我也不太明白啊
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-4
在线时间
3 小时
发表于 2017-7-24 21:49:27 | 显示全部楼层
读取LCD GRAM的时候每次读取16位 R占用8位 G占用8位  然后读取下一个16位时 B占8位 R又占用8位。R先右移11位又左移11位是为了保留高5位(RGB565模式),G右移10位又左移5位 是为了筛选出G的6位,同理B右移11位 筛选出B的5位  组合到一起就变成了刚好16位的颜色值
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-7-7
在线时间
12 小时
发表于 2019-7-21 17:04:39 | 显示全部楼层
你好像记错啦楼主
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-5-18
在线时间
52 小时
发表于 2019-8-8 16:58:05 | 显示全部楼层
歪百子 发表于 2017-7-24 21:49
读取LCD GRAM的时候每次读取16位 R占用8位 G占用8位  然后读取下一个16位时 B占8位 R又占用8位。R先右移11 ...

正解,感谢分析
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 08:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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