OpenEdv-开源电子网

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

MINI开发板液晶驱动时出现的干涉条纹

[复制链接]

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-23
在线时间
1 小时
发表于 2014-9-13 10:41:28 | 显示全部楼层 |阅读模式
5金钱

MINI板子,自己参照教程,一步一步写液晶驱动,发现总是有干涉条纹,见图(手机拍的照片,不是很清楚)

正常应该如上图

有问题的驱动


折腾很久了,找不到原因。

下面是初始化代码,没有考虑效率问题,都采用函数调用形式,主要是想搞清楚思路,初始化部分代码基本是照抄的,修改了的部分都加了中文注释:

[mw_shl_code=c,true]void LCD_Write_Data(uint16_t data) { LCD_RS_SET; LCD_CS_CLR; LCD_WR_CLR; GPIO_Write(GPIOB, data); LCD_WR_SET; LCD_CS_SET; } void LCD_Write_Cmd(uint16_t data) { LCD_RS_CLR; LCD_CS_CLR; LCD_WR_CLR; GPIO_Write(GPIOB, data); LCD_WR_SET; LCD_CS_SET; } uint16_t LCD_Read_Data() { uint16_t data; GPIOB->CRL = 0x88888888; GPIOB->CRH = 0x88888888; GPIOB->ODR = 0x0000; LCD_RS_SET; LCD_CS_CLR; LCD_RD_CLR; data = GPIO_ReadInputData(GPIOB); LCD_RD_SET; LCD_CS_SET; GPIOB->CRL = 0x33333333; GPIOB->CRH = 0x33333333; GPIOB->ODR = 0xFFFF; return data; } void LCD_Init() { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); gpio.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6; gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &gpio); gpio.GPIO_Pin = GPIO_Pin_All; gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); GPIO_SetBits(GPIOB, GPIO_Pin_All); LCD_Write_Cmd(0xD3); LCD_Read_Data(); LCD_Read_Data(); lcd.Id = LCD_Read_Data(); lcd.Id <<= 8; lcd.Id |= LCD_Read_Data(); lcd.Width = 240; lcd.Height = 320; lcd.SetXCmd = 0x2A; lcd.SetYCmd = 0x2B; lcd.WriteGRAMCmd = 0x2C; lcd.Dir = 0; //LCD_Backlight_On(); if(lcd.Id == 0x9341) { LCD_Write_Cmd(0xCF); LCD_Write_Data(0x00); LCD_Write_Data(0xC1); LCD_Write_Data(0X30); LCD_Write_Cmd(0xED); LCD_Write_Data(0x64); LCD_Write_Data(0x03); LCD_Write_Data(0X12); LCD_Write_Data(0X81); LCD_Write_Cmd(0xE8); LCD_Write_Data(0x85); LCD_Write_Data(0x10); LCD_Write_Data(0x7A); LCD_Write_Cmd(0xCB); LCD_Write_Data(0x39); LCD_Write_Data(0x2C); LCD_Write_Data(0x00); LCD_Write_Data(0x34); LCD_Write_Data(0x02); LCD_Write_Cmd(0xF7); LCD_Write_Data(0x20); LCD_Write_Cmd(0xEA); LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Cmd(0xC0); //Power control LCD_Write_Data(0x1B); //VRH[5:0] LCD_Write_Cmd(0xC1); //Power control LCD_Write_Data(0x01); //SAP[2:0];BT[3:0] LCD_Write_Cmd(0xC5); //VCM control LCD_Write_Data(0x30); //3F LCD_Write_Data(0x30); //3C LCD_Write_Cmd(0xC7); //VCM control2 LCD_Write_Data(0XB7); LCD_Write_Cmd(0x36); // Memory Access Control LCD_Write_Data(0x08); //设置显示方向 LCD_Write_Cmd(0x3A); LCD_Write_Data(0x55); LCD_Write_Cmd(0xB1); LCD_Write_Data(0x00); LCD_Write_Data(0x1A); LCD_Write_Cmd(0xB6); // Display Function Control LCD_Write_Data(0x0A); LCD_Write_Data(0xA2); LCD_Write_Cmd(0xF2); // 3Gamma Function Disable LCD_Write_Data(0x00); LCD_Write_Cmd(0x26); //Gamma curve selected LCD_Write_Data(0x01); LCD_Write_Cmd(0xE0); //Set Gamma LCD_Write_Data(0x0F); LCD_Write_Data(0x2A); LCD_Write_Data(0x28); LCD_Write_Data(0x08); LCD_Write_Data(0x0E); LCD_Write_Data(0x08); LCD_Write_Data(0x54); LCD_Write_Data(0XA9); LCD_Write_Data(0x43); LCD_Write_Data(0x0A); LCD_Write_Data(0x0F); LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Cmd(0XE1); //Set Gamma LCD_Write_Data(0x00); LCD_Write_Data(0x15); LCD_Write_Data(0x17); LCD_Write_Data(0x07); LCD_Write_Data(0x11); LCD_Write_Data(0x06); LCD_Write_Data(0x2B); LCD_Write_Data(0x56); LCD_Write_Data(0x3C); LCD_Write_Data(0x05); LCD_Write_Data(0x10); LCD_Write_Data(0x0F); LCD_Write_Data(0x3F); LCD_Write_Data(0x3F); LCD_Write_Data(0x0F); LCD_Write_Cmd(0x2B); //设置X及Y坐标范围 LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Data((lcd.Height - 1) >> 8); LCD_Write_Data((lcd.Height - 1) & 0xFF); LCD_Write_Cmd(0x2A); LCD_Write_Data(0x00); LCD_Write_Data(0x00); LCD_Write_Data((lcd.Width - 1) >> 8); LCD_Write_Data((lcd.Width - 1) & 0xFF); //LCD_Sleep(); LCD_Exit_Sleep(); //退出休眠模式 //LCD_Display_On(); } } void LCD_Sleep(void) { LCD_Write_Cmd(0x28); delay(20000); LCD_Write_Cmd(0x10); } void LCD_Exit_Sleep(void) { LCD_Write_Cmd(0x11); delay(120000); LCD_Write_Cmd(0x29); } void LCD_Backlight_On(void) { GPIO_SetBits(GPIOC, GPIO_Pin_10); } void LCD_Backlight_Off(void) { GPIO_ResetBits(GPIOC, GPIO_Pin_10); } void LCD_Set_Cusor(uint16_t x, uint16_t y) { if(lcd.Id == 0x9341) { LCD_Write_Cmd(lcd.SetXCmd); LCD_Write_Data(x >> 8); LCD_Write_Data(x & 0xFF); LCD_Write_Cmd(lcd.SetYCmd); LCD_Write_Data(y >> 8); LCD_Write_Data(y & 0xFF); } } void LCD_Draw_Point(uint16_t x, uint16_t y) { LCD_Set_Cusor(x, y); LCD_Write_Cmd(lcd.WriteGRAMCmd); LCD_Write_Data(fgColor); } void LCD_Display_On() { LCD_Write_Cmd(0x29); } void LCD_Display_Off() { LCD_Write_Cmd(0x28); }[/mw_shl_code]


最佳答案

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

找到原因了,初始化没有问题。没有清屏,如果使用LCD_Clear_Scree()清屏后就没有问题了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-23
在线时间
1 小时
 楼主| 发表于 2014-9-13 10:41:29 | 显示全部楼层
找到原因了,初始化没有问题。没有清屏,如果使用LCD_Clear_Scree()清屏后就没有问题了!
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-9-13 17:33:16 | 显示全部楼层
可能是初始化参数设置不合理导致的,你看看网上其他用相同主控的人的参数
回复

使用道具 举报

7

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-23
在线时间
1 小时
 楼主| 发表于 2014-9-13 17:51:34 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
直接用的例程里的初始化序列啊
回复

使用道具 举报

2

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2016-5-21
在线时间
238 小时
发表于 2017-2-9 18:13:39 | 显示全部楼层
厉害呀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-24 12:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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