ili9341的某个点的颜 {MOD}的读取程序出错,求大神指正,谢谢

2019-08-16 20:08发布

先说问题再贴代码,写颜 {MOD}都是正确的,在读点的时候只能读出FC和00 这个值,程序看了一遍又一遍就是找不出哪有错,已经卡住一天了,求帮忙,谢谢了

是9341驱动的

我把牵涉到的程序都贴上,大家帮忙看看

//写命令,一般写寄存器编号
void Lcd_wr_cmd(u16 cmd)
{
LCD->lcd_cmd=cmd; //写入要写的寄存器序号
}

//读数据
u16 Lcd_re_data(void)
{
return LCD->lcd_data;  //读数据
}

//设置区间起始位置
u8 Lcd_interval_star(u16 sx,u16 sy)
{
if(sx>lcd_dev.width-1||sy>lcd_dev.height-1) return 1;
Lcd_wr_cmd(SETX_REG);
Lcd_wr_data(sx>>8);
Lcd_wr_data(sx&0x00FF);
Lcd_wr_cmd(SETY_REG);
Lcd_wr_data(sy>>8);
Lcd_wr_data(sy&0x00FF);
return 0;
}

u32 Lcd_re_colour(u16 x,u16 y)
{
u32 point_colour=0;
Lcd_interval_star(x,y);
Lcd_wr_cmd(0X002E);
Delay_us(5);
Lcd_re_data();//第一个读数丢弃
Delay_us(5);
point_colour=((u32)Lcd_re_data()<<16);
Delay_us(5);
point_colour|=(u32)Lcd_re_data();
return point_colour;
}
因为出错,所以读颜 {MOD}的时候就连读两个16位数据组成32位的,然后串口输出出来看,

printf ("FFFF write %x ",Lcd_re_colour(1,1));
这是读取函数其他颜 {MOD}都一样的

再贴串口数据结果
00 1f blue fc 00
ff e0 yellow fc fc 00 fc
ff ff    write fc fc fc fc
0000 black 0
前面是写进去的颜 {MOD},后面是读出来的颜 {MOD}

真心百爪挠心,烦躁的不行,不然不会麻烦大家的,辛苦了,谢谢



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
正点原子
1楼-- · 2019-08-16 20:47
 请参考我们的例程。
9341读点,数据手册上面的介绍,完全就是错误的!!!
[mw_shl_code=c,true]//读取个某点的颜 {MOD}值 //x,y:坐标 //返回值:此点的颜 {MOD} u16 LCD_ReadPoint(u16 x,u16 y) { u16 r,g,b; if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回 LCD_SetCursor(x,y); if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)LCD_WR_REG(0X2E); //9341/6804/5310发送读GRAM指令 else if(lcddev.id==0X5510)LCD_WR_REG(0X2E00); //5510 发送读GRAM指令 else LCD_WR_REG(R34); //其他IC发送读GRAM指令 GPIOB->CRL=0X88888888; //PB0-7 上拉输入 GPIOB->CRH=0X88888888; //PB8-15 上拉输入 GPIOB->ODR=0XFFFF; //全部输出高 LCD_RS_SET; LCD_CS_CLR; //读取数据(读GRAM时,第一次为假读) LCD_RD_CLR; delay_us(1);//延时1us LCD_RD_SET; //dummy READ LCD_RD_CLR; delay_us(1);//延时1us r=DATAIN; //实际坐标颜 {MOD} LCD_RD_SET; if(lcddev.id==0X9341||lcddev.id==0X5310||lcddev.id==0X5510) //9341/NT35310/NT35510要分2次读出 { LCD_RD_CLR; b=DATAIN;//读取蓝 {MOD}值 LCD_RD_SET; g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位 g<<=8; }else if(lcddev.id==0X6804) { LCD_RD_CLR; LCD_RD_SET; r=DATAIN;//6804第二次读取的才是真实值 } LCD_CS_SET; GPIOB->CRL=0X33333333; //PB0-7 上拉输出 GPIOB->CRH=0X33333333; //PB8-15 上拉输出 GPIOB->ODR=0XFFFF; //全部输出高 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||lcddev.id==0X5310||lcddev.id==0X5510)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11));//ILI9341/NT35310/NT35510需要公式转换一下 else return LCD_BGR2RGB(r); //其他IC }[/mw_shl_code]

ynhdate
2楼-- · 2019-08-16 21:10
回复【2楼】正点原子:
---------------------------------
在纠结两天的抓耳挠腮之后,终于搞清楚了,其实原因很简单,9341会在红 {MOD}和蓝 {MOD}的后面多余3位补上100,而不是000,在绿 {MOD}后面补上00,所以如果按照满 {MOD}全写1来输出的话,读取出来的就会是FC。为这个问题纠结两天,好浪费啊
八度空间
3楼-- · 2019-08-17 00:25
原子哥说的对,资料上面是错的,我被坑了两天,真是坑爹
八度空间
4楼-- · 2019-08-17 02:10
不知道哪里正确的资料可以下载的
xiaojiasb
5楼-- · 2019-08-17 04:50
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-08-17 08:15
回复【6楼】xiaojiasb:
---------------------------------
所以我干脆不看.
浪费时间.

一周热门 更多>