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

📄 lcd.c

📁 Mrtos开发板触摸屏驱动程序
💻 C
字号:
#include "..\inc\uTypes.h"
#include "..\inc\44b0x.h"
#include "..\inc\console.h"
#include "..\inc\sysUtils.h"
#include "lcd.h"

#define LCM_DELAY  1000

#define NOP  __asm  { nop }
             

        
void lcmInit (void)
{
   int i;
  //先初始化端口
  //PORT C GROUP
	//BUSWIDTH=16
	
	//Configure PORTA0.0 AS output
	rPCONA = 0x3fE;    												

  	// PORT B GROUP
	/*  BIT 10	9		8		7		6		5		4		3		2		1		0		*/
	/*	/CS5	/CS4	/CS3	/CS2	/CS1	nWBE3	nWBE2	/SRAS	/SCAS	SCLK	SCKE	*/
	/*	EXT		NIC		8019	IDE		D12		NC		NC		Sdram	Sdram	Sdram	Sdram	*/
	/*	1,		1,   	1,   	1,    	1,    	0,      0,		1,    	1,    	1,   	1       */
	rPDATB = 0x7ff;
	rPCONB = 0x7ff;    
	
	/*  PC15	14		13		12		11		10		9		8	*/
	/*	o		o		RXD1	TXD1	o		o		o		o	*/
	/*	NC		NC		Uart1	Uart1	NC		NC		NC		NC	*/
	/*  01		01		11		11		01		01		01		01	*/

	/*  PC7		6		5		4		3		2		1		0	*/
	/*  o		o		o		o		o		o		o		o	*/
	/*  NC		NC		NC		NC		LED		LED		LED		LED	*/
	/*  01		01		01		01		01		01		01		01	*/
	rPDATC = 0x0000;	//All IO is low
	rPCONC = 0x5f555555;	
	rPUPC  = 0x3000;	//PULL UP RESISTOR should be enabled to I/O

	//PORT D GROUP
	/*  PORT D GROUP(I/O OR LCD)										*/
	/*  BIT7		6		5		4		3		2		1		0	*/
	/*  VF			VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/
	/*	01			01		01		01		01		01		01		01	*/
	//rPDATD= 0x00;
	//rPCOND= 0x5555;	
	//rPUPD = 0x00;
	//delayMs (100);
	printf("====main panel init====\n");
	//************* Start Initial Sequence **********//
	printf("init ili9320.\n");

        rPDATC=(rPDATC&0xfffe);
	 delayMs(200);
	 rPDATC=(rPDATC|0x1); //rst
	
	// printf("====main panel init====\n");
	//************* Start Initial Sequence **********//
	SendCmd(0x0000, 0x0001); // Start internal OSC.
	SendCmd(0x0001, 0x0100); // set SS and SM bit
	SendCmd(0x0002, 0x0700); // set 1 line inversion
	SendCmd(0x0003, 0x1080); // set GRAM write direction and BGR=1.
	SendCmd(0x0004, 0x0000); // Resize register
	SendCmd(0x0008, 0x0202); // set the back porch and front porch
	SendCmd(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0]
	SendCmd(0x000A, 0x0000); // FMARK function
	SendCmd(0x000C, 0x0000); // RGB interface setting
	SendCmd(0x000D, 0x0000); // Frame marker Position
	SendCmd(0x000F, 0x0000); // RGB interface polarity
	//*************Power On sequence ****************//
	SendCmd(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
	SendCmd(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
	SendCmd(0x0012, 0x0000); // VREG1OUT voltage
	SendCmd(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude
	delayMs(200); // Dis-charge capacitor power voltage
	SendCmd(0x0010, 0x17B0); // SAP, BT[3:0], AP, DSTB, SLP, STB
	SendCmd(0x0011, 0x0007); // R11h=0x0001 at VCI=3.3V DC1[2:0], DC0[2:0], VC[2:0]
	delayMs(50); // Delay 50ms
	SendCmd(0x0012, 0x013A); // R11h=0x0138 at VCI=3.3V VREG1OUT voltage
	delayMs(50); // Delay 50ms
	SendCmd(0x0013, 0x1A00); // R11h=0x1800 at VCI=3.3V VDV[4:0] for VCOM amplitude //wangsy: SendCmd(0x0013, 0x1300);
	SendCmd(0x0029, 0x000C); // R11h=0x0008 at VCI=3.3V VCM[4:0] for VCOMH
	delayMs(50);
	SendCmd(0x0020, 0x0000); // GRAM horizontal Address
	SendCmd(0x0021, 0x0000); // GRAM Vertical Address
	// ----------- Adjust the Gamma Curve ----------//
	SendCmd(0x0030, 0x0000);
	SendCmd(0x0031, 0x0505);
	SendCmd(0x0032, 0x0004);
	SendCmd(0x0035, 0x0006);
	SendCmd(0x0036, 0x0707);
	SendCmd(0x0037, 0x0105);
	SendCmd(0x0038, 0x0002);
	SendCmd(0x0039, 0x0707);
	SendCmd(0x003C, 0x0704);
	SendCmd(0x003D, 0x0807);
	//------------------ Set GRAM area ---------------//
	SendCmd(0x0050, 0x0000); // Horizontal GRAM Start Address
	SendCmd(0x0051, 0x00EF); // Horizontal GRAM End Address
	SendCmd(0x0052, 0x0000); // Vertical GRAM Start Address
	SendCmd(0x0053, 0x013F); // Vertical GRAM Start Address
	SendCmd(0x0060, 0x2700); // Gate Scan Line
	SendCmd(0x0061, 0x0001); // NDL,VLE, REV
	SendCmd(0x006A, 0x0000); // set scrolling line
	//-------------- Partial Display Control ---------//
	SendCmd(0x0080, 0x0000);
	SendCmd(0x0081, 0x0000);
	SendCmd(0x0082, 0x0000);
	SendCmd(0x0083, 0x0000);
	SendCmd(0x0084, 0x0000);
	SendCmd(0x0085, 0x0000);
	//-------------- Panel Control -------------------//
	SendCmd(0x0090, 0x0010);
	SendCmd(0x0092, 0x0000);
	SendCmd(0x0093, 0x0003);
	SendCmd(0x0095, 0x0110);
	SendCmd(0x0097, 0x0000);
	SendCmd(0x0098, 0x0000);

	SendCmd(0x0007, 0x0001);
	delayMs(50);
	SendCmd(0x0007, 0x0021);
	SendCmd(0x0007, 0x0023);
	delayMs(50);
	SendCmd(0x0007, 0x0173); // 262K color and display ON // wangsy: strange! 0x0163?
}

/*CMD=RS low;Data=RS high*/
void SendCmd(U16 cmd,U16 par)
{
	lcmWriteCmd((0x0000|cmd));
	lcmWriteData((0x0000|par));

}



void lcmWriteCmd (U16 byCmd)
{
    rPDATA=rPDATA|0x0001;
   rPDATA=rPDATC&(~0x0001);
     (*(volatile unsigned short*)(0x04000000+0))=byCmd;
    rPDATA=rPDATA|0x0001;
}


void lcmWriteData (U16 byData)
{
      rPDATA=rPDATC&(~0x0001);
      rPDATA=rPDATA|0x0001;
   (*(volatile unsigned short*)(0x04000000+2))=byData;
      rPDATA=rPDATC&(~0x0001);
}


void delayMs (int nDelay)
{
  int i;
  for (i = 0; i < nDelay; ++ i);
}


void LCD_Set_XY(unsigned int x, unsigned int y)
{
	SendCmd(0x0020,(x&0x00ff));
	SendCmd(0x0021,(y&0x01ff));
}

void LCD_Set_Window(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY)
{
	LCD_Set_XY(startX,startY);
	SendCmd(0x0050,(startX&0x00ff));
	SendCmd(0x0052,(startY&0x00ff));
	SendCmd(0x0051,(endX&0x01ff));
	SendCmd(0x0053,(endY&0x01ff));	
}


void LCD_test(void)
{
	unsigned int i,j;
	
	(*(volatile unsigned short *)(0x04000000+0))=0x0022; //start write
	for(i=0;i<320;i++)
		for(j=0;j<240;j++)
		{
			if(i>279)lcmWriteData(0x0000);
			else if(i>239)lcmWriteData(0x001f);
			else if(i>199)lcmWriteData(0x07e0);
			else if(i>159)lcmWriteData(0x07ff);
			else if(i>119)lcmWriteData(0xf800);
			else if(i>79)lcmWriteData(0xf81f);
			else if(i>39)lcmWriteData(0xffe0);
			else lcmWriteData(0xffff);
		}
	//LCD_Write_End();
}

/*
Mod:0  画一副图片
       1  画一副纯色图片
       2  放大x2倍
       3 放大x4倍
       
*/

unsigned char LCD_DrawPicture(int startX, int startY, unsigned int *pic, int sizeX,int sizeY,unsigned char mod)
{
	int endX,endY;
	unsigned long totalPixels = (unsigned long)sizeX * (unsigned long)sizeY;
	if(startX<0)startX=0;
	if(startY<0)startY=0;
	endX = startX+sizeX-1;
	endY = startY+sizeY-1;
	if(endX>239 )endX=230;
	if(endY>319 )endX=319;


	LCD_Set_Window(startX,startY,endX,endY);
	 (*(volatile unsigned short*)(0x04000000+0))=0x0022; //start write

	 switch(mod)
	 	{
	 	    case 0:
			{
			 while(totalPixels--)lcmWriteData(*pic);
			 break;
			}
	 	    case 1:
			{
			 while(totalPixels--)lcmWriteData(*(pic++));
			 break;
			}
	 	    case 2:
			{
			// totalPixels*=2;
			endX = startX+sizeX*2-1;
			endY = startY+sizeY*2-1;
			if(endX>239 || endY>319)return 1;
			LCD_Set_Window(startX,startY,endX,endY);
			(*(volatile unsigned short*)(0x04000000+0))=0x0022; //start write
			 while(totalPixels--)
			 	{
			 	 lcmWriteData(*(pic));
				 lcmWriteData(*(pic));
				 pic++;
				}
			 break;
			}
	 	    case 3:
			{
			// totalPixels*=2;
			endX = startX+sizeX*4-1;
			endY = startY+sizeY*4-1;
			if(endX>239 || endY>319)return 1;
			LCD_Set_Window(startX,startY,endX,endY);
			(*(volatile unsigned short*)(0x04000000+0))=0x0022; //start write
			 while(totalPixels--)
			 	{
			 	 lcmWriteData(*(pic));
				 lcmWriteData(*(pic));
				 lcmWriteData(*(pic));
				 lcmWriteData(*(pic));
				 pic++;
				}
			 break;
			}
			
		   default:break;
		   
	 	}
	//LCD_Write_End();
	return 0;
}

unsigned char LCD_DrawPicture2(unsigned char startX, unsigned char startY, unsigned int *pic, unsigned char sizeX, unsigned char sizeY)
{
	unsigned int i,j;

	if((startX+sizeX)>240 || (startY+sizeY)>320)return 1;

	for (j = 0; j<sizeY; j++)
	{
    	LCD_Set_XY(startX,startY);
	 (*(volatile unsigned short*)(0x0a000000+0))=0x0022; //start write
    	for(i = 0; i<sizeX; i++)
    	{
			lcmWriteData(*(pic+=2));
    	}
    	startY++;//换行
  	}
	//LCD_Write_End();
	return 0;
}



⌨️ 快捷键说明

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