void gps ()
{
unsigned int LAT[9], LON[10];
unsigned char Temp, i;
if (rx_data() == ‘$’)
{
if( rx_data() == ‘G’)
{
if (rx_data() == ‘P’)
{
if (rx_data() == ‘R’)
{
if (rx_data() == ‘M’)
{
if (rx_data() == ‘C’)
{
while (rx_data() != ‘,’);
while (rx_data() != ‘,’);
Temp = rx_data(); /*checking for “A” condition*/
if (Temp == ‘A’||Temp == ‘V’)
{
while (rx_data() != ‘,’);
LCDCmd (0x80); /*latitude values*/
for (i=0; i<9; i++)
{
LAT[i] = rx_data();
LCDData (LAT[i]);
}
while (rx_data() != ‘,’);
while (rx_data() != ‘,’);
LCDCmd (0xc0); /*longitude values*/
for (i=0; i<10; i++)
{
LON[i] = rx_data();
LCDData (LON[i]);
}
}
}
}
}
}
}
}
}
Thank you very much @BrianFor anyone seeing accented characters, A' should be a double quote symbol (").
It reads characters from the UART and compares them one at a time to find a particular 'word' which it then passes to the LCD.
A classic example of how not to parse a text string!
Brian.
we are checking function rx_data is equal to ‘$’ ...and so on
I don't understand what the meaning of these character's and why we are checking
Is it complete code ?I think it is copied directly from HTML, hence the strange encoding.
Brian.
#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();
}
}
Is it complete code ?
"The data itself is just ascii text and may extend over multiple sentences in certain specialized instances but is normally fully contained in one variable length sentence. The data may vary in the amount of precision contained in the message. "
I can write my own subroutine for lcd and uart but the problem with only GPS routines I am looking someone code because I don't have any idea about it. I am trying to understand how they did programming.Vead, just copying other peoples code, especially when it is written for a different task will lead you nowhere.
#include<reg51.h>
#include <stdio.h>
#include <string.h>
#define lcd_data P2
sbit rs=P0^0;
sbit rw=P0^1;
sbit en=P0^2;
void lcd_init();
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);
void lcd_delay();
void tx(unsigned char send);
void tx_str(unsigned char *s);
unsigned char rx();
char namegps[7], name1gps[7] = "GPRMC,",gpsdat[63];
char msggps , checkgps;
int h;
unsigned char f;
void main()
{
TMOD = 0x20;
TH1 = TL1=0xfd;
SCON = 0x50;
TR1 = 1;
IE = 0x90;
lcd_init();
cmd(0x80);
show("LON: ");
cmd(0xc0);
show("LAT: ");
while(1);
}
void ISR_sc(void) interrupt 4
{
if(RI==1){
msggps= rx();
if(msggps=='$') {
EA = 0;
for(f=0;f<=5;f++) {
namegps[f]=rx();
}
checkgps=strcmp(namegps,name1gps);
if(checkgps==0) {
for(f=0;f<=62;f++) {
gpsdat[f]=rx();
}
cmd(0x84);
for(h=12;h<14;h++) {
dat(gpsdat[h]);
}
dat('.');
for(h=14;h<16;h++) {
dat(gpsdat[h]);
}
for(h=17;h<19;h++) {
dat(gpsdat[h]);
}
dat(223);
dat(' ');
dat('N');
cmd(0xc4);
for(h=26;h<28;h++) {
dat(gpsdat[h]);
}
dat('.');
for(h=28;h<30;h++) {
dat(gpsdat[h]);
}
for(h=31;h<33;h++) {
dat(gpsdat[h]);
}
dat(223);
dat(' ');
dat('E');
EA = 1;
}
}
}
}
void tx(unsigned char send)
{
SBUF=send;
while(TI==0);
TI=0;
}
void tx_str(unsigned char *s)
{
while(*s)
tx(*s++);
}
unsigned char rx()
{
while(RI==0);
RI=0;
return SBUF;
}
void lcd_init()
{
cmd(0x38);
cmd(0x0e);
cmd(0x01);
cmd(0x06);
cmd(0x0c);
cmd(0x80);
}
void cmd(unsigned char a)
{
lcd_data=a;
rs=0;
rw=0;
en=1;
lcd_delay();
en=0;
}
void dat(unsigned char b)
{
lcd_data=b;
rs=1;
rw=0;
en=1;
lcd_delay();
en=0;
}
void show(unsigned char *s)
{
while(*s) {
dat(*s++);
}
}
void lcd_delay()
{
unsigned int lcd_delay;
for(lcd_delay=0;lcd_delay<=6000;lcd_delay++);
}
I can write my own subroutine for lcd and uart but the problem with only GPS routines I am looking someone code because I don't have any idea about it.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?