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

2019-08-16 20:19发布

 原子哥,下面是你的STM32开发指南中的读取某点的颜 {MOD}值的函数,红 {MOD}部分有疑问           
//读取个某点的颜 {MOD}值 
//x,y:坐标
//返回值:此点的颜 {MOD}
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;            //实际坐标颜 {MOD}
  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直接返回颜 {MOD}值
 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);    //开启显示
}

  在蓝 {MOD}字体中,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))的含义
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-08-16 23:58
回复【楼主位】悔憾人生:
---------------------------------
这就是9341奇葩IC的特技之一。
这个代码是供应商给我的,我当时为了实现读点颜 {MOD},研究了好几天无果,后面供应商告诉我,数据手册的描述有问题,随之给我个代码,一用即可。
至于这公式如何来的,供应商没说,我也不关心,能用就行。

所以楼主如果想研究的话,建议直接发email给ILI公司。
若是美妙生活
2楼-- · 2019-08-17 00:51
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-08-17 06:10
数据手册有问题!!!!此代码来自供应商!
QKX607
4楼-- · 2019-08-17 08:50
回复【4楼】正点原子:
---------------------------------
那他们没有正确版本的手册么!都在误导使用者啊!!
正点原子
5楼-- · 2019-08-17 13:15
回复【5楼】QKX607:
---------------------------------
没有。
SHIBO
6楼-- · 2019-08-17 17:31
我也不太明白啊

一周热门 更多>