⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_driver.c

📁 STM32+ov7670
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned long  i;

	LCD_SetWindow(start_x, start_y, end_x, end_y);
	
	LCD_WriteGRAM_EN();
	for(i=0; i < (end_x - start_x + 1)*(end_y - start_y + 1); i++)				
  	{
    	LCD_DATA_OUT(color);			//填充颜色								
  	}
	LCD_WR_END();
	
	LCD_SetWindow(0,0, X_END, Y_END);	//恢复全局作图区						
}
//液晶端口初始化,外部无需调用			
void LCD_PortInit(void)
{
	//控制端口方向初始化,移植时只需更改有关宏定义
	/*LCD_CS_DDR |= BIT(LCD_CS_BIT);
	LCD_RS_DDR |= BIT(LCD_RS_BIT);
	LCD_WR_DDR |= BIT(LCD_WR_BIT);
	LCD_RD_DDR |= BIT(LCD_RD_BIT);
	LCD_REST_DDR |= BIT(LCD_REST_BIT);*/
	//控制端口电平初始化						
	/*LCD_CS_H;
	LCD_RS_H;
	LCD_WR_H;
	LCD_RD_H;
	LCD_REST_H;*/
	//数据总线端口方向初始化,视接口需要更改或添加
	
	//DATA_L_DDR = 0xff;
	//DATA_L_PORT = 0xff;
	
	RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
 	RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟

											 
	//PORTC0~13推挽输出 	
	GPIOC->CRL=0x33333333;
	GPIOC->CRH&=0xFF000000;
	GPIOC->CRH|=0x00333333;
	GPIOC->ODR|=0x3FFF;	
	//PORTB 高8位推挽输出 	
	GPIOB->CRH=0x33333333;
	GPIOB->ODR|=0xFF00;
	  					 
 

}
//液晶驱动初始化						
void LCD_DriverInit(void)
{
	unsigned short int lcd_id = 0x0000;		//保存LCD_ID号							
	LCD_PortInit();						//调用端口初始化						
	
    LCD_REST_L;							//复位控制								
	Delay_nMS(1);	
    LCD_REST_H;
	Delay_nMS(1);						//完成复位								
	
	LCD_WriteRegister(0x0000, 0x0001);	//开启时钟								
	Delay_nMS(10);
	lcd_id = LCD_ReadRegister(0x0000);	//读取LCD_ID							
	
	while(0)
	{
		UART_Transmit(lcd_id >> 8);
		UART_Transmit(lcd_id);
		Delay_nMS(500);
	}
	switch(lcd_id)
	{
		//R61514
		case 0x1514:					//R61514S驱动IC							
		LCD_WriteRegister(0x0007, 0x0000);
		Delay_nMS(2);
		LCD_WriteRegister(0x0017, 0x0001);
		LCD_WriteRegister(0x0010, 0x4410);
		LCD_WriteRegister(0x0011, 0x0000);
		LCD_WriteRegister(0x0012, 0x0118);
		LCD_WriteRegister(0x0013, 0x0d23);
		Delay_nMS(2);
		LCD_WriteRegister(0x0010, 0x4490);
		LCD_WriteRegister(0x0011, 0x0000);
		LCD_WriteRegister(0x0012, 0x013d);
		Delay_nMS(2);
		LCD_WriteRegister(0x0001, 0x0213);
		LCD_WriteRegister(0x0003, 0x1030);	//0x1030,设置接口方式,颜色位数和扫描方向
		LCD_WriteRegister(0x0007, 0x0005);
		LCD_WriteRegister(0x0008, 0x0603);
		LCD_WriteRegister(0x0009, 0x002f);
		LCD_WriteRegister(0x000b, 0x8000);
	
		LCD_WriteRegister(0x0040, 0x0000);
		LCD_WriteRegister(0x0041, 0x0000);
		LCD_WriteRegister(0x0042, 0x9f00);
		LCD_WriteRegister(0x0043, 0x9f00);
		LCD_WriteRegister(0x0044, 0x7f00);	//水平窗口起始大小(高8位HEA[结束地址],低8位HSA[起始地址])
		LCD_WriteRegister(0x0045, 0x9f00);	//垂直窗口起始大小(高8位VEA[结束地址],低8位VSA[起始地址])
		LCD_WriteRegister(0x0021, 0x0000);	//GRAM起始坐标点										 
		
		LCD_WriteRegister(0x0030, 0x0103);
		LCD_WriteRegister(0x0031, 0x0001);
		LCD_WriteRegister(0x0032, 0x0304);
		LCD_WriteRegister(0x0033, 0x0204);
		LCD_WriteRegister(0x0034, 0x0406);
		LCD_WriteRegister(0x0035, 0x0707);
		LCD_WriteRegister(0x0036, 0x0407);
		LCD_WriteRegister(0x0037, 0x0303);
		LCD_WriteRegister(0x0038, 0x0403);
		LCD_WriteRegister(0x0039, 0x0102);
		Delay_nMS(1);
											//-----Display On-------------------
		LCD_WriteRegister(0x0002, 0x0600);
		LCD_WriteRegister(0x0007, 0x0015);
		Delay_nMS(1);
		LCD_WriteRegister(0x0007, 0x0055);
		Delay_nMS(1);
		LCD_WriteRegister(0x0002, 0x0700);
		LCD_WriteRegister(0x0007, 0x0077);
		
		break;								//完成初始化						
		//ILI9320与ILI9328
		case 0x9325:
		case 0x9328:
		case 0xD325:
		LCD_WriteRegister(0x00e7,0x0010);      
        LCD_WriteRegister(0x0000,0x0001);//开启内部时钟
        LCD_WriteRegister(0x0001,0x0100);     
        LCD_WriteRegister(0x0002,0x0700);//电源开启                    
		//LCD_WriteRegister(0x0003,(1<<3)|(1<<4) ); 	//65K  RGB
		//DRIVE TABLE(寄存器 03H)
		//BIT3=AM BIT4:5=ID0:1
		//AM ID0 ID1   FUNCATION
		// 0  0   0	   R->L D->U
		// 1  0   0	   D->U	R->L
		// 0  1   0	   L->R D->U
		// 1  1   0    D->U	L->R
		// 0  0   1	   R->L U->D
		// 1  0   1    U->D	R->L
		// 0  1   1    L->R U->D 正常就用这个.
		// 1  1   1	   U->D	L->R
#if LCD_CHAR_HORIZONTAL > 0
		//字符正放(竖屏),即X->240,CHAR_X->8 
        LCD_WriteRegister(0x0003,0x1030);//65K    ,8位模式下两次传输,16位模式下1次传输,BIT[7]OGR为0时系统坐标固定,(H->x:0-219,V->y:0-319)
#else
		//字符顺时针旋转90度(横屏),即X->240,CHAR_X->16
		LCD_WriteRegister(0x0003,0x1038);
#endif
		LCD_WriteRegister(0x0004,0x0000);                                   
        LCD_WriteRegister(0x0008,0x0207);	           
        LCD_WriteRegister(0x0009,0x0000);         
        LCD_WriteRegister(0x000a,0x0000);//display setting         
        LCD_WriteRegister(0x000c,0x0001);//display setting          
        LCD_WriteRegister(0x000d,0x0000);//0f3c          
        LCD_WriteRegister(0x000f,0x0000);
		//电源配置
        LCD_WriteRegister(0x0010,0x0000);   
        LCD_WriteRegister(0x0011,0x0007);
        LCD_WriteRegister(0x0012,0x0000);                                                                 
        LCD_WriteRegister(0x0013,0x0000);                 
        Delay_nMS(5); 
        LCD_WriteRegister(0x0010,0x1590);   
        LCD_WriteRegister(0x0011,0x0227);
        Delay_nMS(5); 
        LCD_WriteRegister(0x0012,0x009c);                  
        Delay_nMS(5); 
        LCD_WriteRegister(0x0013,0x1900);   
        LCD_WriteRegister(0x0029,0x0023);
        LCD_WriteRegister(0x002b,0x000e);
        Delay_nMS(5); 
        LCD_WriteRegister(0x0020,0x0000);                                                            
        LCD_WriteRegister(0x0021,0x013f);           
		Delay_nMS(5); 
		//伽马校正
        LCD_WriteRegister(0x0030,0x0007); 
        LCD_WriteRegister(0x0031,0x0707);   
        LCD_WriteRegister(0x0032,0x0006);
        LCD_WriteRegister(0x0035,0x0704);
        LCD_WriteRegister(0x0036,0x1f04); 
        LCD_WriteRegister(0x0037,0x0004);
        LCD_WriteRegister(0x0038,0x0000);        
        LCD_WriteRegister(0x0039,0x0706);     
        LCD_WriteRegister(0x003c,0x0701);
        LCD_WriteRegister(0x003d,0x000f);
        Delay_nMS(5); 
        LCD_WriteRegister(0x0050,0x0000); //水平GRAM起始位置 
        LCD_WriteRegister(0x0051,0x00ef); //水平GRAM终止位置                    
        LCD_WriteRegister(0x0052,0x0000); //垂直GRAM起始位置                    
        LCD_WriteRegister(0x0053,0x013f); //垂直GRAM终止位置  
        
        LCD_WriteRegister(0x0060,0xa700);        
        LCD_WriteRegister(0x0061,0x0001); 
        LCD_WriteRegister(0x006a,0x0000);
        LCD_WriteRegister(0x0080,0x0000);
        LCD_WriteRegister(0x0081,0x0000);
        LCD_WriteRegister(0x0082,0x0000);
        LCD_WriteRegister(0x0083,0x0000);
        LCD_WriteRegister(0x0084,0x0000);
        LCD_WriteRegister(0x0085,0x0000);
      
        LCD_WriteRegister(0x0090,0x0010);     
        LCD_WriteRegister(0x0092,0x0000);  
        LCD_WriteRegister(0x0093,0x0003);
        LCD_WriteRegister(0x0095,0x0110);
        LCD_WriteRegister(0x0097,0x0000);        
        LCD_WriteRegister(0x0098,0x0000);  
        //开启显示设置    
        LCD_WriteRegister(0x0007,0x0133);   
        LCD_WriteRegister(0x0020,0x0000);                                                            
        LCD_WriteRegister(0x0021,0x013f);
		break;
		//ILI9320与ILI9300
		case 0x9320:
		case 0x9300:
		LCD_WriteRegister(0x00,0x0000);
		LCD_WriteRegister(0x01,0x0100);	//Driver Output Contral.
		LCD_WriteRegister(0x02,0x0700);	//LCD Driver Waveform Contral.
	#if LCD_CHAR_HORIZONTAL > 0
		//字符正放(竖屏),即X->240,CHAR_X->8 
        LCD_WriteRegister(0x0003,0x1030);//65K    ,8位模式下两次传输,16位模式下1次传输,BIT[7]OGR为0时系统坐标固定,(H->x:0-219,V->y:0-319)
	#else
		//字符顺时针旋转90度(横屏),即X->240,CHAR_X->16
		LCD_WriteRegister(0x0003,0x1038);	
	#endif
		LCD_WriteRegister(0x04,0x0000);	//Scalling Contral.
		LCD_WriteRegister(0x08,0x0202);	//Display Contral 2.(0x0207)
		LCD_WriteRegister(0x09,0x0000);	//Display Contral 3.(0x0000)
		LCD_WriteRegister(0x0a,0x0000);	//Frame Cycle Contal.(0x0000)
		LCD_WriteRegister(0x0c,(1<<0));	//Extern Display Interface Contral 1.(0x0000)
		LCD_WriteRegister(0x0d,0x0000);	//Frame Maker Position.
		LCD_WriteRegister(0x0f,0x0000);	//Extern Display Interface Contral 2.	    
		Delay_nMS(5); 
		LCD_WriteRegister(0x07,0x0101);	//Display Contral.
		Delay_nMS(5); 								  
		LCD_WriteRegister(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));	//Power Control 1.(0x16b0)
		LCD_WriteRegister(0x11,0x0007);								//Power Control 2.(0x0001)
		LCD_WriteRegister(0x12,(1<<8)|(1<<4)|(0<<0));				//Power Control 3.(0x0138)
		LCD_WriteRegister(0x13,0x0b00);								//Power Control 4.
		LCD_WriteRegister(0x29,0x0000);								//Power Control 7.
	
		LCD_WriteRegister(0x2b,(1<<14)|(1<<4));	    
		LCD_WriteRegister(0x50,0);	//Set X Star
		//水平GRAM终止位置Set X End.
		LCD_WriteRegister(0x51,239);	//Set Y Star
		LCD_WriteRegister(0x52,0);	//Set Y End.t.
		LCD_WriteRegister(0x53,319);	//
	
		LCD_WriteRegister(0x60,0x2700);	//Driver Output Control.
		LCD_WriteRegister(0x61,0x0001);	//Driver Output Control.
		LCD_WriteRegister(0x6a,0x0000);	//Vertical Srcoll Control.
	
		LCD_WriteRegister(0x80,0x0000);	//Display Position? Partial Display 1.
		LCD_WriteRegister(0x81,0x0000);	//RAM Address Start? Partial Display 1.
		LCD_WriteRegister(0x82,0x0000);	//RAM Address End-Partial Display 1.
		LCD_WriteRegister(0x83,0x0000);	//Displsy Position? Partial Display 2.
		LCD_WriteRegister(0x84,0x0000);	//RAM Address Start? Partial Display 2.
		LCD_WriteRegister(0x85,0x0000);	//RAM Address End? Partial Display 2.
	
		LCD_WriteRegister(0x90,(0<<7)|(16<<0));	//Frame Cycle Contral.(0x0013)
		LCD_WriteRegister(0x92,0x0000);	//Panel Interface Contral 2.(0x0000)
		LCD_WriteRegister(0x93,0x0001);	//Panel Interface Contral 3.
		LCD_WriteRegister(0x95,0x0110);	//Frame Cycle Contral.(0x0110)
		LCD_WriteRegister(0x97,(0<<8));	//
		LCD_WriteRegister(0x98,0x0000);	//Frame Cycle Contral.	   
		LCD_WriteRegister(0x07,0x0173);	//(0x0173)
		break;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -