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

📄 lcddrv.c

📁 LCM046在PIC24HJ64GP506单片机上的驱动程序
💻 C
字号:
#include "p24HJ128GP506.h"

#define INT16U    unsigned int 	
#define INT8U     unsigned char 	

#define CSLCD			LATGbits.LATG8/*cs*/
#define WRLCD			LATGbits.LATG6/*wr*/
#define RDLCD			LATGbits.LATG7/*wr*/
#define DATALCD			LATGbits.LATG15/*data*/

static void   timedelay(INT16U time);
static void   timedelayMS(INT16U time);
static void   wrcom(INT16U *p);
static void   wrdd(INT16U *p);
//static void   wrda(INT16U *p);
//static void   walp(INT16U *p);
static void   LCDinit(void);
static void   LCDdis(INT8U,INT8U);
static void   UINTDeal(INT16U);
static void   LCDdisUINT(INT8U *);


INT16U command;
INT16U lcdaddr;
INT16U lcdaddrtemp;
INT16U lcddata;
INT16U lcddatatemp;
INT8U  segdata[10] = {0xeb,0x0a,0xad,0x8f,0x4e,0xc7,0xe7,0x8a,0xef,0xcf
/*						0	1	 2	  3		4	5	 6	  7		8	9	*/
};
INT8U  DISChar[4] = {0,0,0,0};
void main(void) 
{
INT8U i=0;
LCDinit();
while(1)
	{

	for(i=0;i<10000;i++)
	{
/*    
	LCDdis(i,0);
    LCDdis(i,2);
    LCDdis(i,4);
    LCDdis(i,6);
*/
	UINTDeal(i);
	LCDdisUINT(DISChar);
	timedelayMS(500);
	if(i==9999)
		i = 0;
	}
	}
}

 /*
*****************************************************
*			initialize LCD
*****************************************************
*/
static void LCDinit(void)
{
	INT16U *p;
	TRISG &= 0b0111111000111111;//0x7e3f
	RDLCD = 1;
	p=&command;
	timedelay(500);
	*p=0x29;	
	wrcom(p);	//initialize
	timedelay(500);

	*p=0x18;	
	wrcom(p);	//rc
	
	*p=0x01;//0x18;	
	wrcom(p);	//sys en

	*p=0x03;	
	wrcom(p);	//lcd on 

	timedelay(500);
}

 /*
*****************************************************
*			write command
*****************************************************
*/
void wrcom(INT16U *p)
{
	INT8U i;

	CSLCD=1;	/*----|_________*/
	timedelay(5);	
	CSLCD=0;	
	timedelay(5);


	WRLCD=0;	/*1*/
	timedelay(5);	
	DATALCD=1;	
	timedelay(5);
	WRLCD=1;	
	timedelay(5);
	
	WRLCD=0;	/*0*/
	timedelay(5);
	DATALCD=0;	
	timedelay(5);
	WRLCD=1;
	timedelay(5);

	WRLCD=0;	/*0*/
	timedelay(5);
	DATALCD=0;
	timedelay(5);
	WRLCD=1;
	timedelay(5);

	for(i=0;i<9;i++)/*write command data*/
	{timedelay(5);
	 WRLCD=0;
	 timedelay(5);
	 if( (*p)&0x80 )/*check the bits from bit7*/	
		{DATALCD=1;timedelay(5);}	
	 else 
		{DATALCD=0;timedelay(5);}
	 WRLCD=1;
	 timedelay(5);
	 *p=(*p)<<1;	
	}
}

 /*
*****************************************************
*			write data
*****************************************************
*/
void wrdd(INT16U *p)
{
	INT8U i;
	CSLCD=1;/*----|_________*/
	timedelay(5);
	CSLCD=0;
	timedelay(5);

	WRLCD=0;	/*1*/
	timedelay(5);
	DATALCD=1;
	timedelay(5);
	WRLCD=1;
	timedelay(5);

	WRLCD=0;	/*0*/
	timedelay(5);	
	DATALCD=0;
	timedelay(5);
	WRLCD=1;
	timedelay(5);

	WRLCD=0;	/*1*/
	timedelay(5);
	DATALCD=1;
	timedelay(5);
	WRLCD=1;
	timedelay(5);

	for(i=0;i<10;i++)
	{
	 timedelay(5);
	 WRLCD=0;
	 timedelay(5);
	 if(*p&0x0200)
		{timedelay(5);DATALCD=1;timedelay(5);}	
	 else 
		{DATALCD=0;timedelay(5);}
	 timedelay(5);
	 WRLCD=1;
	 timedelay(5);
	 *p=(*p)<<1;	
	}
}

 /*
*****************************************************
*			write data for continue data write
*****************************************************
*/
/*void wrda(INT16U *p)
{
	INT8U i;
	for(i=0;i<4;i++)
		{timedelay(5);
	     WRLCD=0;	
	     timedelay(5);

		 if(*p&0x01)
			{timedelay(5);DATALCD=1;timedelay(5);}	
	 	 else 	
			{DATALCD=0;timedelay(5);}

	 	timedelay(5);
		WRLCD=1;
		timedelay(5);
	 	 *p=(*p)>>1;	
		}
}*/

 /*
*****************************************************
*			continue data write
*****************************************************
*/
/*void walp(INT16U *p)
{
INT8U i;
for(i=0;i<32;i++)
{wrdd(p);
wrda(p);}
}*/

 /*
*****************************************************
*			deal data and address
*****************************************************
*/
static void LCDdis(INT8U data,INT8U addr)
{
	INT16U *pt;

	*pt = 0;
	*pt = addr;
	*pt = (*pt)<<4 | ( (segdata[data]>>4)&0x0f );
     wrdd(pt);

	*pt = 0;
	*pt = addr+1;
	*pt = (*pt)<<4 | ( segdata[data]&0x0f );
     wrdd(pt);
}

static void  UINTDeal(INT16U a)
{
//	INT16U temp;
//	temp = a;
	DISChar[3] = 0;
	DISChar[2] = 0;
	DISChar[1] = 0;
	DISChar[0] = 0;
	while(a>0)
	{
		if((a<10000)&&(a>=1000))
		{
			a=a-1000;
			DISChar[3]++;
		}
		if((a<1000)&&(a>=100))
		{
			a=a-100;
			DISChar[2]++;
		}
		if((a<100)&&(a>=10))
		{
			a=a-10;
			DISChar[1]++;
		}
		if((a<10)&&(a>0))
		{
			a=a-1;
			DISChar[0]++;
		}
//		if(a>9999)
//		{
//			goto out;
//		}

	}
//out:	a=temp;
}

static void  LCDdisUINT(INT8U *pdata)
{
	LCDdis(*(pdata++),6);
	LCDdis(*(pdata++),4);
	LCDdis(*(pdata++),2);
	LCDdis(*(pdata),0);
	timedelay(10);
}

static void timedelay(INT16U time)
{
	INT16U j;
	for(j=0;j<time;j++)
		{
			j++;
			j--;
		}
}

static void timedelayMS(INT16U time)
{
	INT16U i,j;
	for(i=0;i<800;i++)
		for(j=0;j<time;j++)
		{
			j++;
			j--;
		}

}

⌨️ 快捷键说明

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