OpenEdv-开源电子网

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

求助原子哥:ILI9341驱动问题和sprintf函数问题

[复制链接]

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
发表于 2015-11-30 17:46:24 | 显示全部楼层 |阅读模式
5金钱
我在练习使用ILI9341,为什么我写入颜色数据的时候发现我的RGB颜色R和B是反的,当输入R5G6B5的时候,实际显示效果却是B5G6R5,如输入0xF800显示结果是红色。包括读出结果也是一样。下图为把0,0点颜色读出显示结果


下面为主函数内容:
[mw_shl_code=c,true]int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 u8 lcd_cl[20]; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到l,cd_id数组。 while(1) { switch(x) { case 0CD_Clear(WHITE);break; case 1CD_Clear(BLACK);break; case 2CD_Clear(BLUE);break; case 3CD_Clear(RED);break; case 4CD_Clear(MAGENTA);break; case 5CD_Clear(GREEN);break; case 6CD_Clear(CYAN);break; case 7CD_Clear(YELLOW);break; case 8CD_Clear(BRRED);break; case 9CD_Clear(GRAY);break; case 10:LCD_Clear(LGRAY);break; case 11:LCD_Clear(BROWN);break; } sprintf((char*)lcd_cl,"color for 0,0 is:%04X",LCD_ReadPoint(0,0)); POINT_COLOR=RED; LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^"); LCD_ShowString(30,70,200,16,16,"TFTLCD TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID LCD_ShowString(30,130,200,12,12,"2015/11/30"); LCD_ShowString(30,150,200,12,12,lcd_cl); x++; if(x==12)x=0; LED0=!LED0; delay_ms(3000); } }[/mw_shl_code]


此时又出现一个问题,本该显示ID的地方却出现了些随机的数字,当我把主函数更改一下:把获取ID的sprintf函数放到获取颜色数据的sprintf函数下面
[mw_shl_code=c,true]int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 u8 lcd_cl[20]; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { switch(x) { case 0:LCD_Clear(WHITE);break; case 1:LCD_Clear(BLACK);break; case 2:LCD_Clear(BLUE);break; case 3:LCD_Clear(RED);break; case 4:LCD_Clear(MAGENTA);break; case 5:LCD_Clear(GREEN);break; case 6:LCD_Clear(CYAN);break; case 7:LCD_Clear(YELLOW);break; case 8:LCD_Clear(BRRED);break; case 9:LCD_Clear(GRAY);break; case 10:LCD_Clear(LGRAY);break; case 11:LCD_Clear(BROWN);break; } sprintf((char*)lcd_cl,"color for 0,0 is:%04X",LCD_ReadPoint(0,0)); sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id); POINT_COLOR=RED; LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^"); LCD_ShowString(30,70,200,16,16,"TFTLCD TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID LCD_ShowString(30,130,200,12,12,"2015/11/30"); LCD_ShowString(30,150,200,12,12,lcd_cl); x++; if(x==12)x=0; LED0=!LED0; delay_ms(3000); } }[/mw_shl_code]
[mw_shl_code=c,true]此时显示结果:[/mw_shl_code] [mw_shl_code=c,true]

[/mw_shl_code]
求助:为什么会出现以上问题?

最佳答案

查看完整内容[请看2#楼]

仔细看下你代码里面的“LCD_Scan_Dir(unsigned char dir)”这个函数,你肯定删掉了这句吧”if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510))regval|=0X08;//5310/5510不需要BGR   “
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-30 17:46:25 | 显示全部楼层
仔细看下你代码里面的“LCD_Scan_Dir(unsigned char dir)”这个函数,你肯定删掉了这句吧”if((lcddev.id!=0X5310)&&(lcddev.id!=0X5510))regval|=0X08;//5310/5510不需要BGR   “
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-11-30 18:51:17 | 显示全部楼层
第一个问题:有RGB和BGR两种方式,具体是哪一种看你的LCD初始化代码


看D3位就知道了,对照下你的LCD初始化代码里写该命令后的数据,对应的D3位是0还是1。如果是1,那么写入颜色值RGB时LCD的显示是BGR;如果是0,写入RGB则显示的也是RGB

我的某个的LCD初始化代码里有这两句

TFT_WriteCmd(0x36);       
TFT_WriteData(0x00);        //MY=0, MX=0, MV=0, ML=0, RGB=0, MH=0

看出来了吧,写命令0x36后的下一个写数据操作,你对照下D3位。

至于你的第二个问题,看不明白你想说什么
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-11-30 19:08:22 | 显示全部楼层
回复【2楼】bj2008wyou:
---------------------------------
第二个问题已经解决,我定义的数组长度不够导致的,不过我把0x36 D3位尝试不管写0还是写1结果都一样,不知道什么情况呢
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-11-30 19:14:06 | 显示全部楼层
[mw_shl_code=c,true]        下面是屏体初始化过程:[/mw_shl_code] [mw_shl_code=c,true]        LCD_WR_REG(0xCF); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0xC1); LCD_WR_DATAX(0X30); LCD_WR_REG(0xED); LCD_WR_DATAX(0x64); LCD_WR_DATAX(0x03); LCD_WR_DATAX(0X12); LCD_WR_DATAX(0X81); LCD_WR_REG(0xE8); LCD_WR_DATAX(0x85); LCD_WR_DATAX(0x10); LCD_WR_DATAX(0x7A); LCD_WR_REG(0xCB); LCD_WR_DATAX(0x39); LCD_WR_DATAX(0x2C); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x34); LCD_WR_DATAX(0x02); LCD_WR_REG(0xF7); LCD_WR_DATAX(0x20); LCD_WR_REG(0xEA); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_REG(0xC0); //Power control LCD_WR_DATAX(0x1B); //VRH[5:0] LCD_WR_REG(0xC1); //Power control LCD_WR_DATAX(0x01); //SAP[2:0];BT[3:0] LCD_WR_REG(0xC5); //VCM control LCD_WR_DATAX(0x30); //3F LCD_WR_DATAX(0x30); //3C LCD_WR_REG(0xC7); //VCM control2 LCD_WR_DATAX(0XB7); LCD_WR_REG(0x36); // Memory Access Control LCD_WR_DATAX(0x00); LCD_WR_REG(0x3A); LCD_WR_DATAX(0x55); LCD_WR_REG(0xB1); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x1A); LCD_WR_REG(0xB6); // Display Function Control LCD_WR_DATAX(0x0A); LCD_WR_DATAX(0xA2); LCD_WR_REG(0xF2); // 3Gamma Function Disable LCD_WR_DATAX(0x00); LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_DATAX(0x01); LCD_WR_REG(0xE0); //Set Gamma LCD_WR_DATAX(0x0F); LCD_WR_DATAX(0x2A); LCD_WR_DATAX(0x28); LCD_WR_DATAX(0x08); LCD_WR_DATAX(0x0E); LCD_WR_DATAX(0x08); LCD_WR_DATAX(0x54); LCD_WR_DATAX(0XA9); LCD_WR_DATAX(0x43); LCD_WR_DATAX(0x0A); LCD_WR_DATAX(0x0F); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_REG(0XE1); //Set Gamma LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x15); LCD_WR_DATAX(0x17); LCD_WR_DATAX(0x07); LCD_WR_DATAX(0x11); LCD_WR_DATAX(0x06); LCD_WR_DATAX(0x2B); LCD_WR_DATAX(0x56); LCD_WR_DATAX(0x3C); LCD_WR_DATAX(0x05); LCD_WR_DATAX(0x10); LCD_WR_DATAX(0x0F); LCD_WR_DATAX(0x3F); LCD_WR_DATAX(0x3F); LCD_WR_DATAX(0x0F); LCD_WR_REG(0x2B); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x01); LCD_WR_DATAX(0x3f); LCD_WR_REG(0x2A); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0x00); LCD_WR_DATAX(0xef); LCD_WR_REG(0x11); //Exit Sleep delay_ms(120); LCD_WR_REG(0x29); //display on [/mw_shl_code]

回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-11-30 19:17:17 | 显示全部楼层
回复【3楼】bumbdong:
---------------------------------
你的意思是,相当于上面的TFT_WriteCmd(0x36) 直接改0x36这个数的D3位?要改就改这句TFT_WriteData(0x00); 

但如果没效果我也没办法,我没有ILI9341的LCD,虽然有个类似的,但东西不在身边,没法验证
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-11-30 20:42:40 | 显示全部楼层
回复【5楼】bj2008wyou:
---------------------------------
我肯定不会吧0x36改了啊,我改的是这个寄存器内的值,不管D3位是0还是1,都是没效果。坐等原子哥!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-30 22:35:05 | 显示全部楼层
回复【6楼】bumbdong:
---------------------------------
下载我们的usmart例程,测试下.
在里面加入读点函数.
你这是直接用的我们的液晶模块+我们的开发板吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-12-1 09:17:42 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
是的,迷你版的,用原例程就是正常,我只是对元例程进行了修改,把不需要的东西都删除掉了,结果就出现这个情况,搞了2天,百思不得其解啊!到底哪里出问题了呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-2 23:32:19 | 显示全部楼层
回复【8楼】bumbdong:
---------------------------------
一步步删。
删几行代码,测试下。
删几行代码,再测试下。
直到出现问题,就可以定点了。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-3 11:23:11 | 显示全部楼层
出错的原因很简单,自己删代码的人很多都会忽略一点,在原子哥代码中“LCD_Scan_Dir(unsigned char dir)”这个函数里面,原子哥给0x36这个指令赋值的时候,是用一个变量“regval”一次将他写入0x36这个寄存器中,而如果你删代码的时候不小心删掉这句“regval|=0X08;”,就会导致他的D3位在执行到这个函数的时候一直为0,所以无论你初始化怎么改在后面一运行到这个函数的时候都会变为0,所请在“LCD_Scan_Dir(unsigned char dir)”这个函数里面加上“regval|=0X08;”,主要还是你删代码的时候不细心
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-12-3 20:33:27 | 显示全部楼层
回复【11楼】229382777@qq.com:
---------------------------------
多谢多谢!!!的确是这个问题,当时删除的时候没有注意里面是不等于,就直接给删掉了!怪不得在初始化中怎么修改都没有效果呢,原来在后面调用的时候又被修改了!多谢
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-3 20:37:56 | 显示全部楼层
回复【12楼】bumbdong:
---------------------------------
不客气,当时自己删代码也遇到了这个问题,后面经过自己一步步的单步调试是可以调试出来的
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2015-12-3 20:56:36 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 23:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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