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

📄 lcddrive.c

📁 使用Lpc2114测试通过
💻 C
字号:
  /****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶320*240驱动(型号为ili9320)。65K显示存,0000H-7FFFH地址。显示是横向字节,高位
*      在前。
* 硬件连接: D0--D15  <===>  D0--D15
*    	_CS1 	<===>	(1<<27)			
*     	 RS  	<===>	(1<<28)		
*     	_WR 	<===>	(1<<25)			
*     	_RD 	<===>	(1<<24)			 
*       /RST    <===>	 VCC
****************************************************************************************/
#include  "config.h"
unsigned int page,seg,Temp0,Temp1;  
    
void delay(unsigned int param)
{
   unsigned int x,y;
   for(y=0;y<param;y++)
   for(x=0;x<10000;x++);
}

void WriteRegAddr(unsigned int Address)
{
    IOCLR = DataPort;  		//DataPort
    IOCLR = RS;    
    IOCLR = _CS1;   

    IOCLR = _WR;    
    IOSET = Address;
    IOSET = _WR;
    
    IOSET = _CS1;
    IOSET = RS;       
} 

void WriteData(unsigned int OutData)
{
    IOCLR = DataPort; 
    IOCLR = _CS1;  		
    IOSET = OutData;	//DataPort=OutData;   
   
    IOCLR = _WR;
    IOSET = _WR;
    IOSET = _CS1;   
} 

void WriteReg(unsigned int Address, unsigned int OutData)
{
   WriteRegAddr(Address);
   WriteData(OutData);
}

void LCD_Reset(void)
{
    IOSET = _CS1;
    IOSET = _RD;
    delay(10);
}

//============================================
void LCD_Initial(void)       //initial code 1
{
	WriteReg(0x000000,0x000100); 
  	WriteReg(0x000100,0x010000); 
	WriteReg(0x000200,0x040000); 
	WriteReg(0x000300,0x120000); 
	WriteReg(0x000400,0x000000);
	 
	WriteReg(0x000800,0x020200); 
	WriteReg(0x000900,0x000000); 
	WriteReg(0x000a00,0x000000); 
	WriteReg(0x000c00,0x000000); 
	WriteReg(0x000d00,0x000000); 
	WriteReg(0x000f00,0x000000);
	 
	WriteReg(0x001000,0x000000); 
	WriteReg(0x001100,0x000700); 
	WriteReg(0x001200,0x000000); 
	WriteReg(0x001300,0x080000); 
	delay(50);
	WriteReg(0x001000,0x15f000); 
	WriteReg(0x001100,0x000000); 
	delay(50);
	WriteReg(0x001200,0x011c00);
	delay(50); 
	
	WriteReg(0x001300,0x0d0000); 
	WriteReg(0x002900,0x000000);
	delay(50); 
	WriteReg(0x002000,0x000000); 
	WriteReg(0x002100,0x000000); 
	WriteReg(0x002B00,0x002000); 
	
	WriteReg(0x003000,0x000000); 
	WriteReg(0x003100,0x030600); 
	WriteReg(0x003200,0x020000); 
	WriteReg(0x003500,0x010700); 
	WriteReg(0x003600,0x040400); 
	WriteReg(0x003700,0x060600); 
	WriteReg(0x003800,0x010500); 
	WriteReg(0x003900,0x070700); 
	WriteReg(0x003c00,0x060000); 
	WriteReg(0x003d00,0x080700); 
	
//------------------ Set GRAM area -------------//
	WriteReg(0x005000, 0x000000);	    	// Horizontal GRAM Start Address
	WriteReg(0x005100, 0x00EF00);	    	// Horizontal GRAM End Address
	WriteReg(0x005200, 0x000000);	    	// Vertical GRAM Start Address
	WriteReg(0x005300, 0x013F00);	    	// Vertical GRAM Start Address
	
	WriteReg(0x006000, 0x270000);	    	// Gate Scan Line
	WriteReg(0x006100, 0x000100);	    	// NDL,VLE, REV
	WriteReg(0x006A00, 0x000000);	    	// set scrolling line
	//-------------- Partial Display Control -------//
	WriteReg(0x008000, 0x000000);
	WriteReg(0x008100, 0x000000);
	WriteReg(0x008200, 0x000000);
	WriteReg(0x008300, 0x000000);
	WriteReg(0x008400, 0x000000);
	WriteReg(0x008500, 0x000000);
	//-------------- Panel Control -----------------//
	WriteReg(0x009000, 0x001300);
	WriteReg(0x009200, 0x000000);
	WriteReg(0x009300, 0x000300);
	WriteReg(0x009500, 0x011000);
	WriteReg(0x009700, 0x000000);
	WriteReg(0x009800, 0x000000);

	WriteReg(0x000700, 0x000100);
	delay(50);
	WriteReg(0x000700, 0x002100);
	WriteReg(0x000700, 0x002300);
	delay(50);		
	WriteReg(0x000700, 0x017300);	    	// 65K color and display ON
}	

//----------------------------------------------------------------------

void Checker(unsigned int param1,unsigned int param2) //Full on,off,checkerboard,bar
{
   WriteRegAddr(0x002200);
   for(page=0;page<DisplayCol;page++)
       {
	for(seg=0;seg<DisplaySeg;seg++)
            {
	     if(seg%2) 
	       {
		WriteData(param1);
		}
            else 
	       {
		WriteData(param2);
    		}
	     }
	}
}

//===================================================
void WriteGrid1(void)
{
  for(page=0;page<DisplayCol;page++)
     {
      for(seg=0;seg<DisplaySeg;seg++)
	 {
	 switch((page/16+seg/16)%3)
            {
             case 0: WriteData(0x001f00);break;  //red
             case 1: WriteData(0x07e000);break;  //green
             case 2: WriteData(0xf80000);break;  //blue
             }
	 }
      }
}

//============================================
void Field(void)
{
    unsigned char x;
    unsigned int y;
    WriteRegAddr(0x002200);
	for(y=0;y<320;y++)
	   for(x=0;x<240;x++)
	      {
	      if((y==0)||(y==1)||(y==158)||(y==159)||(y==318)||(y==319)){WriteData(0xffff);}
		else if((x==0)||(x==1)||(x==118)||(x==119)||(x==238)||(x==239)){WriteData(0xffff);}
		else{WriteData(0x000000); }
	       }
}

//==================================================
void WR_DATA(unsigned int temp1, unsigned int temp2)
{
    IOSET = RS;
    IOSET = _CS1;
    IOCLR = DataPort; 		//DataPort=temp1;
    IOSET = temp1;
    
    IOCLR = _CS1;
    IOCLR = DataPort;		//DataPort=temp2;
    IOSET = temp2;
    IOCLR = _WR;
    IOSET = _WR;
    IOSET = _CS1;
} 

//========================================================
void showpicture1(void)
{
    unsigned char *p;
    unsigned int i,j,temp1,temp2;  
    WriteReg(0x002000,0x000000);   
    WriteReg(0x002100,0x000000);  
    WriteRegAddr(0x002200);

    for(i=0;i<320;i++)
    {
       for(j=0;j<240;j++)
	{
	temp1=*p++;
       	temp2=*p++;
	WR_DATA(temp1,temp2);
	}
    }
} 

//========================================================
void WriteBar1(void)
{
    unsigned char i;
    unsigned int m;
    WriteRegAddr(0x002200);
    for(i=0;i<80;i++)
	  {
	   for(m=0;m<240;m++)
	   WriteData(0xf80000);
	   }
    for(i=0;i<80;i++)
	  {
	   for(m=0;m<240;m++)
	   WriteData(0x07e000);
	   }
    for(i=0;i<80;i++)
	  {
	   for(m=0;m<240;m++)
	   WriteData(0x001f00);
	   }
    for(i=0;i<80;i++)
	  {
	   for(m=0;m<240;m++)
	   WriteData(0xffff00);
	   }
} 

/***********************************************************************
* 名称:LCD_FillAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:dat		要填充的数据
* 出口参数:无
***********************************************************************/
void  LCD_FillAll(uint8 dat)
{//  uint32  i;

 //  LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);		// 置地址指针
 //  LCD_WriteTCommand1(LCD_AUT_WR);				// 自动写
 //  for(i=0;i<128*30;i++)
 //  {  LCD_WriteTData1(dat);					// 写数据
 //  }
 //  LCD_WriteTCommand1(LCD_AUT_OVR);				// 自动写结束
//   LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);			// 重置地址指针
}


/****************************************************************************
* 名称:LCD_UpdatePoint()
* 功能:在指定位置上画点,刷新某一点。
* 入口参数: x		指定点所在列的位置
*           y		指定点所在行的位置
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  LCD_UpdatePoint(uint32 x, uint32 y)
{   
   /* 设置缓冲区相应的点 */    
   WriteReg(0x000c00,0x001000);   
   WriteReg(0x002000,x>>8);
   WriteReg(0x002100,y>>8);
   
   
   /* 输出数据 */
   WriteReg(0x002200,0x000000);	
   WriteReg(0x000c00,0x000000);   
}

/****************************************************************************
*                    与LCM相关的GUI接口函数
****************************************************************************/


/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void  GUI_FillSCR(uint8 dat)
{//  uint32  i, j;

//   for(i=0; i<GUI_LCM_YMAX; i++)		// 历遍所有行
//   {  for(j=0; j<GUI_LCM_XMAX/8; j++)	// 历遍所有行
//      {  gui_disp_buf[i][j] = dat;		// 填充数据
//	  }
//   }
   
   /* 填充LCM */
   LCD_FillAll(dat);
}

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x		指定点所在列的位置
*           y		指定点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*          效范围)
* 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
*      实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
*      处理。
****************************************************************************/
uint8  GUI_Point(uint32 x, uint32 y, uint32 color)
{  /* 参数过滤 */
   if(x>=320) return(0);
   if(y>=240) return(0);
   
   /* 设置缓冲区相应的点 */   
   WriteReg(0x000c00,0x001000);       
   WriteReg(0x002000,x<<8);
   WriteReg(0x002100,y<<8);
	   
   /* 刷新显示 */
   WriteReg(0x002200,color<<8);
   WriteReg(0x000c00,0x000000); 
   return(1);
}

/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数:x0		水平线起点所在列的位置
*           y0		水平线起点所在行的位置
*           x1  	水平线终点所在列的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(uint32 x0, uint32 y0, uint32 x1, uint32 color) 
{  

   /* 设置缓冲区相应的点 */   
   WriteReg(0x000c00,0x001000);       
   WriteReg(0x002000,x0<<8);
   WriteReg(0x002100,y0<<8);
    delay(10);   
   WriteRegAddr(0x002200);
   do
   { 
     WriteData(color<<8); 
     x0--;
   }while(x0>x1);
     WriteData(color<<8);         
   WriteReg(0x000c00,0x000000);   	
}

/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0		垂直线起点所在列的位置
*           y0		垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_RLine(uint32 x0, uint32 y0, uint32 y1, uint32 color) 
{     
   /* 设置缓冲区相应的点 */   
   WriteReg(0x000c00,0x001000);       
   WriteReg(0x002000,x0<<8);   
   do
     {
      	WriteReg(0x002100,y0<<8);  	
    	WriteRegAddr(0x002200);    	
    	WriteData(color<<8); 	
      y0--;}while(y0>y1);
        WriteReg(0x002100,y0<<8);  	
    	WriteRegAddr(0x002200);	
   	WriteData(color<<8);         
   WriteReg(0x000c00,0x000000); 	
}

/***************************************************************************/

⌨️ 快捷键说明

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