Interfacing GPS with 8051

Here is the sample code to interface GPS with 8051.


#include<reg51.h>
#define port2 P2
sbit rs = P1^0;
sbit rw = P1^1;
sbit e = P1^2;
char info[70];
char test[6]={"$GPGGA"};
char comma_position[15];
unsigned int check=0,i;
unsigned char a;
void receive_data();
void lcd_latitude();
void lcd_longitude();
 
//DELAY FUNCTION
void delay(unsigned int msec)
{
int i,j ;
for(i=0;i<msec;i++)
for(j=0;j<1275;j++); 
}
 
// LCD COMMAND SENDING FUNCTION
void lcd_cmd(unsigned char item)
{
port2 = item;
rs= 0;
rw=0;
e=1;
delay(1);
e=0;
return;
} 
 
// LCD DATA SENDING FUNCTION
void lcd_data(unsigned char item)
{
port2 = item;
rs= 1;
rw=0;
e=1;
delay(1);
e=0;     
return;
}
 
 // LCD STRING SENDING FUNCTION 
void lcd_string(unsigned char *str)
{
int i=0;
while(str[i]!='\0')
{
        lcd_data(str[i]);
        i++;
        delay(10);
   }
        return;
}
 
// SERIAL PORT SETTING
void serial()
{
TMOD=0x20;      //MODE=2
TH1=0xfa;      // 4800 BAUD
SCON=0x50  ;    // SERIAL MODE 1 ,8- BIT DATA ,1 STOP BIT ,1 START BIT , RECEIVING ON
TR1=1;          //TIMER START
}
 
void find_comma()
{
unsigned int i,count=0;
for(i=0;i<70;i++)
{ 
if(info[i]==',')
{
comma_position[count++]=i;
}
    }
}
void compare()
{  
IE=0x00;        //Interrupt disable 
find_comma();    //Function to detect position of comma in the string
lcd_latitude();   //Function to show Latitude
lcd_longitude(); //Function to show Longitude
check=0;
IE=0x90;    //Interrupt enable
}
void receive_data()      interrupt 4   
{
info[check++]=SBUF;   //Read SBUF
if(check<7)          //Condition to check the required data
    {
if(info[check-1]!=test[check-1])
check=0;
    }
RI=0;
}
void lcd_shape()       //Function to create shape of degree
{
lcd_cmd(64);
lcd_data(10);
lcd_data(17);
lcd_data(17);
lcd_data(10);
lcd_data(0);
lcd_data(0);
lcd_data(0);
lcd_data(0);
}
 
void lcd_latitude()  //Function to display Latitude
{
unsigned int c2=comma_position[1]; //Position of second comma
lcd_shape();
lcd_cmd(0x01);          // Clear LCD display
lcd_cmd(0x84);          //Move cursor to position 6 of line 1
lcd_string("LATITUDE");  //Showing Latitude
lcd_cmd(0xC0);  //Beginning of second line  
lcd_data(info[c2+1]); 
lcd_data(info[c2+2]);
lcd_data(0);  //Degree symbol
lcd_data(info[c2+3]); 
lcd_data(info[c2+4]);
lcd_data(info[c2+5]);
lcd_data(info[c2+6]);
lcd_data(info[c2+7]);
lcd_data(info[c2+8]);
lcd_data(info[c2+9]);
lcd_data(0x27);          //ASCII of minute sign(')
lcd_data(info[c2+10]);
lcd_data(info[c2+11]);
delay(250);
} 
 
void lcd_longitude()
{
unsigned int c4=comma_position[3];
lcd_cmd(0x01);             //Clear LCD display
lcd_cmd(0x84);             //Move cursor to position 4 of line 1
lcd_string("LONGITUDE"); //Showing Longitude
lcd_cmd(0xC0);     //Begining of second line  
lcd_data(info[c4+1]);
lcd_data(info[c4+2]);
lcd_data(info[c4+3]);
lcd_data(0);
lcd_data(info[c4+4]);
lcd_data(info[c4+5]);
lcd_data(info[c4+6]);
lcd_data(info[c4+7]);
lcd_data(info[c4+8]);
lcd_data(info[c4+9]);
lcd_data(info[c4+10]);
lcd_data(0x27);               //ASCII of minute sign(')
lcd_data(info[c4+11]);
lcd_data(info[c4+12]);
delay(250);
}
void main()
{
serial();
lcd_cmd(0x38);         //2 LINE, 5X7 MATRIX
lcd_cmd(0x0e);         //DISPLAY ON, CURSOR BLINKING
IE=0x90;
while(1)
{
if(check==69)
compare();
}
}