#include <pic.h>

__CONFIG(WDTDIS & RC & UNPROTECT);

#define RS_PIN RA0
#define RW_PIN RA1
#define E_PIN RA2
#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB
void Delay_4ms(void)
{
unsigned int t;
for(t=0;t<820;t++);

}
void WriteCommand(unsigned char cmd)
{
TRIS_DATA_PORT=0x00;
RS_PIN=0;
RW_PIN=0;
E_PIN=1;
DATA_PORT=cmd;
E_PIN=0;
}
unsigned char BusyCheck(void)
{
unsigned char BF;
TRIS_DATA_PORT=0xff;
RS_PIN=0;
RW_PIN=1;
E_PIN=1;
BF=DATA_PORT;
E_PIN=0;
if(BF & 0x80)
return 1;
else
return 0;
}

void InitByInstru(void)
{
Delay_4ms();
WriteCommand(0b00111111);
Delay_4ms();
WriteCommand(0b00111111);
Delay_4ms();
WriteCommand(0b00111111);
WriteCommand(0b00111011); 
while(BusyCheck());
WriteCommand(0b00001100); 
while(BusyCheck());
WriteCommand(0b00000001); 
while(BusyCheck());
WriteCommand(0b00000011); 
while(BusyCheck());
WriteCommand(0b00000110); 

}

void WriteAddress(unsigned char adr)
{
TRIS_DATA_PORT=0x00;
RS_PIN=0;
RW_PIN=0;
E_PIN=1;
DATA_PORT=(adr | 0x80);
E_PIN=0;
}

void WriteChar(unsigned char data)
{
TRIS_DATA_PORT=0x00;
RS_PIN=1;
RW_PIN=0;
E_PIN=1;
DATA_PORT=data;
E_PIN=0;
}

void WriteStr(const char *string,unsigned char cnt)
{
while(cnt--)
{
while(BusyCheck());
WriteChar(*string++);
}
}
void Delay_500ms(void)
{
unsigned int k;
for(k=0;k<120;k++)
Delay_4ms();
}
void init(void)
{
TRIS_DATA_PORT=0b00000000;
TRISA=0b0000;
E_PIN=0;
}

const char poweron[]="Have Fun With Us";
const char disp1[]="More Surprizes ";
const char disp2[]="Sure Electronics";
const char disp3[]="VER 1.0";
void main(void)
{
unsigned char cnt;
init();
InitByInstru();
while(BusyCheck());
WriteAddress(0x00); 
WriteStr(poweron,16);
while(BusyCheck());
WriteAddress(0x18); 
WriteStr(disp1,15);
while(BusyCheck());
WriteChar(0b01000000); 
while(BusyCheck());
WriteAddress(0x40); 
WriteStr(poweron+9,7);
while(BusyCheck());
WriteChar(' ');
WriteStr(poweron,8);
while(BusyCheck());
WriteAddress(0x58); 
WriteStr(disp2,16);
Delay_500ms(); 
Delay_500ms();
Delay_500ms();
Delay_500ms();

for(cnt=0;cnt<16;cnt++)
{
InitByInstru();
while(BusyCheck());
WriteAddress(0x00);
WriteStr(disp2+cnt,16-cnt);
if(cnt<7)
{
while(BusyCheck());
WriteAddress(0x40);
WriteStr(disp3+cnt,7-cnt);
}
Delay_500ms();
}
}