/* Basic program to show latitude and longitude on LCD extracted from GPGGA statement */
#include<reg51.h>
#define port2 P2
sbit rs = P1^7;
sbit rw = P1^6;
sbit e = P1^5;
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=0xfd; // 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()
{ EA=1;
serial();
lcd_cmd(0x38); //2 LINE, 5X7 MATRIX
lcd_cmd(0x0e); //DISPLAY ON, CURSOR BLINKING
IE=0x90;
while(1)
{
if(check==69)
compare();
}
}