www.pudn.com > ZLG_GUI_spilcd.zip > lcd.c, change:2014-10-25,size:10589b


#include "LCD.h" 
//#include "font.h"  
#include "delay.h" 
 
 
//SPI2 读写一个字节 
//TxData:要写入的字节 
//返回值:读取到的字节 
void SPI2_WriteByte(u8 TxData) 
{ 
#if FAST_WRITE		  
	SPI2->DR=TxData;	 	//发送一个byte 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
	__nop(); 
#else	  
	SPI2->DR=TxData;	 	//发送一个byte 
	while((SPI2->SR&1<<1)==0);		//等待发送区空 
#endif 
} 
 
u8 SPI2_ReadByte(void) 
{ 
	while((SPI2->SR&1<<0)==0);//等待接收完一个byte  
	return SPI2->DR;          	     //返回收到的数据 
} 
 
 
 
/**************************************************************************** 
* 名    称:SPI2_Init(void) 
* 功    能:STM32_SPI2硬件配置初始化 
****************************************************************************/
void SPI2_Init(void) 
{ 
 	RCC->APB2ENR|=1<<3;       //PORTB时钟使能 	  
	RCC->APB1ENR|=1<<14;      //SPI2时钟使能  
		    
	//这里只针对SPI口初始化 
	GPIOB->CRH&=0X000FFFFF;  
	GPIOB->CRH|=0XBBB00000;//PB13、14、15复用 	     
	GPIOB->ODR|=0X7<<13;    //PB13、14、15上拉 
		 
	SPI2->CR1|=0<<10;//全双工模式	 
	SPI2->CR1|=1<<9; //软件nss管理 
	SPI2->CR1|=1<<8;   
 
	SPI2->CR1|=1<<2; //SPI主机 
	SPI2->CR1|=0<<11;//8bit数据格式	 
	SPI2->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1 
	SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1   
	SPI2->CR1|=0<<3; //Fsck=Fcpu/2 
	SPI2->CR1|=0<<7; //MSBfirst    
	SPI2->CR1|=1<<6; //SPI设备使能 
	SPI2_WriteByte(0xff);//启动传输 
} 
 
 

/**************************************************************************** 
* 名    称:LCD_WriteIndex(u8 Index) 
* 功    能:向液晶屏写一个8位指令 
* 入口参数:Index   寄存器地址 
* 出口参数:无 
* 说    明:调用前需先选中控制器,内部函数 
****************************************************************************/ 
void LCD_WriteIndex(u8 Index) 
{ 
   LCD_RS_CLR; 
   SPI2_WriteByte(Index); 
} 
 
/**************************************************************************** 
* 名    称:LCD_WriteData(u8 Data) 
* 功    能:向液晶屏写一个8位数据 
* 入口参数:dat     寄存器数据 
* 出口参数:无 
* 说    明:向控制器指定地址写入数据,内部函数 
****************************************************************************/ 
void LCD_WriteData(u8 Data) 
{ 
   	LCD_RS_SET; 
   	SPI2_WriteByte(Data); 
} 
 
/**************************************************************************** 
* 名    称:void LCD_WriteData_16Bit(u16 Data) 
* 功    能:向液晶屏写一个16位数据 
* 入口参数:Data 
* 出口参数:无 
* 说    明:向控制器指定地址写入一个16位数据 
****************************************************************************/ 
void LCD_WriteData_16Bit(u16 Data) 
{	 
	LCD_WriteData(Data>>8); 
	LCD_WriteData(Data);	 
} 
 
/**************************************************************************** 
* 名    称:void LCD_WriteReg(u8 Index,u16 Data) 
* 功    能:写寄存器数据 
* 入口参数:Index,Data 
* 出口参数:无 
* 说    明:本函数为组合函数,向Index地址的寄存器写入Data值 
****************************************************************************/ 
void LCD_WriteReg(u8 Index,u16 Data) 
{ 
	LCD_WriteIndex(Index); 
  	LCD_WriteData_16Bit(Data); 
} 
 
 
 
/**************************************************************************** 
* 名    称:void LCD_Reset(void) 
* 功    能:液晶硬复位函数 
* 入口参数:无 
* 出口参数:无 
* 说    明:液晶初始化前需执行一次复位操作 
****************************************************************************/ 
void LCD_Reset(void) 
{ 
	LCD_RST_CLR; 
	delay_ms(100); 
	LCD_RST_SET; 
	delay_ms(50); 
} 
 
 
 
 
/**************************************************************************** 
* 名    称:GUI_Init(void) 
* 功    能:液晶初始化函数 
* 入口参数:无 
* 出口参数:无 
* 说    明:液晶初始化 
****************************************************************************/ 
void GUI_Init(void) 
{	 
	//使用硬件SPI 
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟 
	RCC->APB2ENR|=1<<4;    //使能PORTC时钟	   	 	 
	GPIOB->CRL&=0X0FFFFFFF;  
	GPIOB->CRL|=0X30000000;//PB7推挽输出   	  
	GPIOB->CRH&=0XFFF0FF0F; 
	GPIOB->CRH|=0X00030030;//PB9、12推挽输出 
	GPIOC->CRH&=0XFFFFF0FF; 
	GPIOC->CRH|=0X00000300;//PC10推挽输出 
	 
	SPI2_Init(); 
 
	LCD_Reset(); //Reset before LCD Init. 
 
	LCD_WriteIndex(0xCB);   
        LCD_WriteData(0x39);  
        LCD_WriteData(0x2C);  
        LCD_WriteData(0x00);  
        LCD_WriteData(0x34);  
        LCD_WriteData(0x02);  
 
        LCD_WriteIndex(0xCF);   
        LCD_WriteData(0x00);  
        LCD_WriteData(0XC1);  
        LCD_WriteData(0X30);  
  
        LCD_WriteIndex(0xE8);   
        LCD_WriteData(0x85);  
        LCD_WriteData(0x00);  
        LCD_WriteData(0x78);  
  
        LCD_WriteIndex(0xEA);   
        LCD_WriteData(0x00);  
        LCD_WriteData(0x00);  
  
        LCD_WriteIndex(0xED);   
        LCD_WriteData(0x64);  
        LCD_WriteData(0x03);  
        LCD_WriteData(0X12);  
        LCD_WriteData(0X81);  
 
        LCD_WriteIndex(0xF7);   
        LCD_WriteData(0x20);  
   
        LCD_WriteIndex(0xC0);    //Power control  
        LCD_WriteData(0x23);   //VRH[5:0]  
  
        LCD_WriteIndex(0xC1);    //Power control  
        LCD_WriteData(0x10);   //SAP[2:0];BT[3:0]  
  
        LCD_WriteIndex(0xC5);    //VCM control  
        LCD_WriteData(0x3e); //对比度调节 
        LCD_WriteData(0x28);  
  
        LCD_WriteIndex(0xC7);    //VCM control2  
        LCD_WriteData(0x86);  //-- 
  
        LCD_WriteIndex(0x36);    // Memory Access Control  
#if USE_HORIZONTAL 
        LCD_WriteData(0xE8); //C8	   //48 68竖屏//28 E8 横屏 
		LCD_WriteIndex(0x2a); 
		LCD_WriteData_16Bit(0); 
		LCD_WriteData_16Bit(319); 
		LCD_WriteIndex(0x2b); 
		LCD_WriteData_16Bit(0); 
		LCD_WriteData_16Bit(239); 
#else 
		LCD_WriteData(0x88); 
		LCD_WriteIndex(0x2a); 
		LCD_WriteData_16Bit(0); 
		LCD_WriteData_16Bit(239); 
		LCD_WriteIndex(0x2b); 
		LCD_WriteData_16Bit(0); 
		LCD_WriteData_16Bit(319);  
#endif 
 
        LCD_WriteIndex(0x3A);     
        LCD_WriteData(0x55);  
 
        LCD_WriteIndex(0xB1);     
        LCD_WriteData(0x00);   
        LCD_WriteData(0x18);  
  
        LCD_WriteIndex(0xB6);    // Display Function Control  
        LCD_WriteData(0x08);  
        LCD_WriteData(0x82); 
        LCD_WriteData(0x27);   
  
        LCD_WriteIndex(0xF2);    // 3Gamma Function Disable  
        LCD_WriteData(0x00);  
  
        LCD_WriteIndex(0x26);    //Gamma curve selected  
        LCD_WriteData(0x01);  
  
        LCD_WriteIndex(0xE0);    //Set Gamma  
        LCD_WriteData(0x0F);  
        LCD_WriteData(0x31);  
        LCD_WriteData(0x2B);  
        LCD_WriteData(0x0C);  
        LCD_WriteData(0x0E);  
        LCD_WriteData(0x08);  
        LCD_WriteData(0x4E);  
        LCD_WriteData(0xF1);  
        LCD_WriteData(0x37);  
        LCD_WriteData(0x07);  
        LCD_WriteData(0x10);  
        LCD_WriteData(0x03);  
        LCD_WriteData(0x0E);  
        LCD_WriteData(0x09);  
        LCD_WriteData(0x00);  
 
        LCD_WriteIndex(0XE1);    //Set Gamma  
        LCD_WriteData(0x00);  
        LCD_WriteData(0x0E);  
        LCD_WriteData(0x14);  
        LCD_WriteData(0x03);  
        LCD_WriteData(0x11);  
        LCD_WriteData(0x07);  
        LCD_WriteData(0x31);  
        LCD_WriteData(0xC1);  
        LCD_WriteData(0x48);  
        LCD_WriteData(0x08);  
        LCD_WriteData(0x0F);  
        LCD_WriteData(0x0C);  
        LCD_WriteData(0x31);  
        LCD_WriteData(0x36);  
        LCD_WriteData(0x0F);  
  
        LCD_WriteIndex(0x11);    //Exit Sleep  
        delay_ms(120);  
				 
        LCD_WriteIndex(0x29);    //Display on  
        LCD_WriteIndex(0x2c); 
		 
		LCD_LED=1;//背光亮 
		  
		GUI_FillSCR(WHITE); 
} 
 
 
/************************************************* 
函数名:LCD_Set_XY 
功能:设置LCD显示起始点 
入口参数:xy坐标 
返回值:无 
*************************************************/ 
void LCD_SetCursor(u16 Xpos, u16 Ypos) 
{	 
#if USE_HORIZONTAL==1 
	LCD_WriteReg(0x2b,Ypos); 
	LCD_WriteReg(0x2a,Xpos); 
	LCD_WriteIndex(0x2c);				    
#else 
	LCD_WriteReg(0x2a,Xpos); 
	LCD_WriteReg(0x2b,Ypos); 
	LCD_WriteIndex(0x2c);     
#endif	 
} 
 
	 
/************************************************* 
函数名:LCD_DrawPoint 
功能:画一个点 
入口参数:xy坐标和颜色数据 
返回值:无 
*************************************************/ 
void GUI_Point(u16 x,u16 y,u16 color) 
{ 
	LCD_SetCursor(x,y); 
	LCD_WriteData_16Bit(color); 
} 
 
/************************************* 
**读取个某点的颜色值	  
//x:0~239 
//y:0~319 
//返回值:此点的颜色 
*************************************/ 
u16 GUI_ReadPoint(u16 x,u16 y) 
{ 
 	u16 r; 
	if(x>=LCD_W||y>=LCD_H)return 0;			//超过了范围,直接返回		    
	LCD_SetCursor(x,y); 
	LCD_WriteIndex(0X2E);	//ILI9341发送读GRAM指令 
 
	LCD_RS_SET; 
	LCD_CS_CLR; 
	r=SPI2_ReadByte(); 
	r<<=8; 
 	r|=SPI2_ReadByte();   
	LCD_CS_SET; 
	return r; 
} 
 
 
/************************************************* 
函数名:GUI_FillSCR 
功能:全屏清屏函数 
入口参数:填充颜色COLOR 
返回值:无 
*************************************************/ 
void GUI_FillSCR(u16 Color)                
{	 
	u32 index=0;       
	LCD_SetCursor(0,0);//设置光标位置 	   
	for(index=0;index<76800;index++) 
	{ 
		LCD_WriteData_16Bit(Color);     
	}  
} 
 
/**************************************************************************** 
* 名称:GUI_HLine() 
* 功能:画水平线。 
* 入口参数: x0		水平线起点所在列的位置 
*           y0		水平线起点所在行的位置 
*           x1      水平线终点所在列的位置 
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示) 
* 出口参数:无 
* 说明:操作失败原因是指定地址超出缓冲区范围。 
****************************************************************************/ 
void GUI_HLine(u16 x0, u16 y0, u16 x1, u16 color)  
{ 
	u16  bak; 
	if(x0>x1) 						// 对x0、x1大小进行排列,以便画图 
   	{ 
		bak = x1; 
		x1 = x0; 
      	x0 = bak; 
   	} 
	 
	do 
   	{ 
		GUI_Point(x0,y0,color); 
		x0++; 
   	}while(x1>=x0); 
} 
 
/*********************************************************************** 
* 名称:GUI_RLine() 
* 功能:画竖直线 
* 入口参数:x0		垂直线起点所在列的位置 
*           y0		垂直线起点所在行的位置 
*           y1      垂直线终点所在行的位置 
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示) 
* 出口参数:	无 
* 说明:操作失败原因是指定地址超出缓冲区范围。 
***********************************************************************/ 
void GUI_RLine(u16 x0, u16 y0, u16 y1, u16 color)  
{ 
	u16  bak; 
	 
	if(y0>y1) 		// 对y0、y1大小进行排列,以便画图 
   	{ 
		bak = y1; 
      	y1 = y0; 
      	y0 = bak; 
   	} 
 
	do 
   	{ 
		GUI_Point(x0,y0,color); 
		y0++; 
   	}while(y1>=y0); 
}