
/////////////////////////////////////////////////////////////////////
//hardware configration:JUMPERS LED_EN and SEG_EN must be disconnected.
/////////////////////////////////////////////////////////////////////
#include<pic.h> 
__CONFIG(0x1832);
//__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

#define  rs  	RA0                    //COMMNAD/DATA SELECT 
#define  rw  	RA1                    //READ/WRITE SELECT 
#define  e   	RA2                    	//ENABLE SIGNAL 
#define  psb 	RA3                    	//PARALLEL/SERIAL SELECT（H/L） 
#define  rst 	RA4                    	//RESET SIGNAL 
#define  nop()  asm("nop")          	//nop func


const unsigned char TAB1A[ ] = {"**新良电子**"};
const unsigned char TAB1B[ ] = {"QQ：634503119"};

const unsigned char TAB1C[ ] = {"**单片机天地**"};
const unsigned char TAB1D[ ] = {"欢迎您的惠顾！"};
unsigned int lcd_x;                	//X address
unsigned int lcd_y;                	//Y address 
bit busy;                         	//busy flag 

void init();                        //system init. 
void lcd_init();                    //LCD init 
void clear_p();                     //clear screen 
void writelcd(const unsigned char *pt);	   		//
void wr_zb();                       //display setting mode.
void flash();                       //lcd blink func.
void send_d(unsigned char x);       //send data
void send_i(unsigned char x);       //send command.
void chk_busy();                    //check busy sub.
void delay();                       //delay func, decide the speed of display.
void delay1();                      //delay func, decide the speed of blink.

/****************************************************************************
//main() 
****************************************************************************/
void main()
{
	init();    							 //system init.
	while (1)
	{
		lcd_init();                  	//LCD init
//		clear_p();                   	//
		send_i(0x81);				 	//line 1
		writelcd(TAB1A);
		send_i(0x90);					//line 2
		writelcd(TAB1B); 
		send_i(0x88);					//line 3
		writelcd(TAB1C);
		send_i(0x98);					//line 4
		writelcd(TAB1D);
		delay();                     	//delay
//		flash();                     	//
//		clear_p();                   	//
	}
}

/****************************************************************************
//init() 
****************************************************************************/
void init()
{	
	ADCON1 = 0X07;                      //A port as ordinary i/o 
	TRISA = 0X10;                       //A port as output 
	TRISD = 0X00;                       //D port as output 

}


/****************************************************************************
//lcd_init() 
****************************************************************************/
void lcd_init()
{
	rst = 0;                            //reset LCD
	delay();                          	//
	rst = 1;                            //LCD normal work.
	nop();
	psb = 1;                            //8 bit as parrallel.
	send_i(0x30);                     	//basic operation instruction
	send_i(0x01);                     	//off display 
	send_i(0x06);                     	//set the cursor's moving direction.
	send_i(0x0c);                      //on display,off cursor,off blink
}

/****************************************************************************
//wr_zb() 
****************************************************************************/
void wr_zb()
{
	send_i(lcd_y);
	send_i(lcd_x);
}

/****************************************************************************
//flash() 
****************************************************************************/
void flash()
{
	send_i(0x08);                  //off display.
	delay1();                      //
	send_i(0x0c);                  //on display
	delay1();delay1();             //
	send_i(0x08);                  //off display.
	delay1();
	send_i(0x0c);                  //on display
	delay1();delay1();
	send_i(0x08);                  //off display.
	delay1();
	send_i(0x0c);                  //on display
	delay1();delay1();
	
}

/****************************************************************************
//clear_p()
****************************************************************************/
void clear_p()
{
	send_i(0x1);                   //clear all
	send_i(0x34);                  //extend.
	send_i(0x30);                   //basic
}

/****************************************************************************
//send_d() 
****************************************************************************/
void send_d(unsigned char x)
{
	chk_busy();                  	//check busy.
	rs = 1;                        	//data not commnad. 
	rw = 0;                        	 //write not read.
	PORTD = x;                     //data to bus. 
	e = 1;                         	//enable. 
	nop();
	nop();
	nop();
	e = 0;                         	//disable.
}

/****************************************************************************
//send_i() 
****************************************************************************/
void send_i(unsigned char x)
{
	chk_busy();                  //check lcd if busy. 
	rs = 0;                       //data not commnad.
	rw = 0;                        //write not read.
	PORTD = x;                     //data to bus. 
	e = 1;                        //enable.
	nop();
	nop();
	nop();
	e = 0;                         //disable.
}

/****************************************************************************
//chk_busy() 
****************************************************************************/
void chk_busy()
{
	busy = 1;                      //set busy signal 
	TRISD = 0XFF;                  //change the bus to input. 
	rs = 0;                        //command not data. 
	rw = 1;                        //read not write. 
	while (busy)
	{
		nop();nop();nop();
		e = 1;                   	//enable.
		nop();nop();nop();
		if (!RD7) busy = 0;       	//busy?
		nop();nop();nop();
		e = 0;                   	//DISABLE.
	}
	e = 0;                         	//DISABLE.
	TRISD = 0X00;                  	//bus as output.
}

/****************************************************************************
//delay() 
****************************************************************************/
void delay()
{
	int i;
	for (i = 0;i < 5000;i++);
}

/****************************************************************************
//delayl() 
****************************************************************************/
void delay1()
{
	int i;
	for (i = 0;i < 10;i++)
	{
		delay();              
	}
}

/****************************************************************************
//writelcd（）
****************************************************************************/
void writelcd(const unsigned char *pt)
{
    while(*pt)			
        send_d(*pt++); 
}
