您的位置:首页 > 编程语言

基于DSP的GPGGA定位数据提取的代码

2012-06-28 01:07 197 查看
基于DSP的GPGGA定位数据提取的代码已经通过了测试。

由于分了好多模块,但在网上下载就有其他的模块,在此我贴出来已经改好的GPGGA的main函数代码,

其他的代码不变,可以在网上下载,百度里搜 基于DSP的GPGGA定位数据提取 就能找到,main函数换以下代码就能得到你想要的功能。

该代码的功能能使液晶移动并且翻页。

main函数代码:

#include <stdio.h>

#include "mmdrv.h" //CPU Memory-Mapped Registers

#include "mcbsp.h" //串口模块de头文件

#include "cpu_reg.h"

#include "lcd_86.h" //液晶显示模块de头文件

#define uint16 unsigned int

#define uint8 unsigned char

ioport unsigned portefff;

#define IO_374 portefff

#define shuzunum 600 //定义数据缓冲区

void init_exint1_interrupt();

void init_GPIO(void);

void uart_rece_gpgga_0(void); //提取haiba,tm,weidu,jingdu;

void uart_rece_gpgga_1(void);

void uart_trans(void);

void uart_trans_byte(unsigned int data);

unsigned int flag=0xffff;

volatile unsigned int displayflag=0;

char tx_re_buf[1]={0x38};

void display()

{

LCD_clear(0);

cur_row=0;

cur_col=50;

LCD_pr_chars("GPGGA",5);

cur_row=1;

cur_col=0;

LCD_pr_chars("=====================",21);

cur_row=3;

cur_col=0;

LCD_pr_chars("K1:H,Tm,WD,JD",13);

cur_row=5;

cur_col=0;

LCD_pr_chars("K2:State,Num,HODP",17);

cur_row=7;

cur_col=0;

LCD_pr_chars("=====================",21);

}

uint16 keyscan()

{

unsigned int key_val;

unsigned int i,j;

i=Get_Key();

waitloop( 0x040000L );

j=Get_Key();

if(i==j)

{

key_val=j; /*保存 key_val*/

while(Get_Key())

{

asm("\tnop"); //wait blank_key

}

}

return key_val;

}

void main(void)

{

SWWSR = 0x7fff;

SWCR = 0x0001;

BSCR = 0x8006;

CLKMD = PLL_DIV_INIT;

waitloop( 0x0400 );

CLKMD = PLL_LOCK_INIT_X(14);

waitloop( 0x0400 );

PMST = 0x0168;

IO_374=0xffff; //374 enable

init_exint1_interrupt();

init_GPIO();

init_lcd();

display(); //显示菜单

Close_LED_sign();

Close_LED_Data();

Close_LED_Traf();

waitloop( 0x0400 );

while(1)

{

flag=0xffff; /*防抖动*/

switch(keyscan())

{

default:

break;

case 1:

displayflag=1;

LCD_clear(0); //清屏

break;

case 2:

displayflag=2;

LCD_clear(0);

break;

case 17:

displayflag=3;

display();

break;

}

switch(displayflag)

{

default:

break;

case 1:

uart_rece_gpgga_0();//第一页显示海拔高度,时间,纬度,经度

break;

case 2:

uart_rece_gpgga_1(); //第二页显示水平精度因子,卫星个数

break;

case 3:

display(); //返回到主菜单

break;

}

//LCD_clear(0);

}

}

void init_exint1_interrupt() //中断

{

IFR =0xffff;

IMR =0x0002; //TINT=IMR.3 EXINT1=IMR.1

asm("\trsbx\tintm ");

}

interrupt void EXINT1_isr()

{

Close_LED_sign();

Close_LED_Data();

Close_LED_Traf();

// while(!(GPIOSR&0x01))

{

asm("\tnop"); //中断处理函数

asm("\tnop");

}

flag=0;

cur_row=7;

cur_col=15;

LCD_pr_chars(" Uart_Stop ",17);

}

void init_GPIO(void)

{

GPIOCR =0xfffe; //EXINT1=GPIO.0=input=0,nand_cs=GPIO.6=output=1

GPIOSR =0x0040; //GPIO.6=output=1

}

void uart_rece_gpgga_0(void) //提取haiba,tm,weidu,jingdu

{

unsigned int ii;

unsigned int jj;

unsigned char data[shuzunum];//缓冲区中存储600个数据

unsigned int tm[7],weidu[10],jingdu[11],hb[8],E[2],N[2];

unsigned int locate=0;

unsigned int ji_dou=0;//逗号计数变量

unsigned int data_num=0;//数组计数变量

char chartable[10]={'0','1','2','3','4','5','6','7','8','9'};

Uart_Init();

for(ii=0;ii<shuzunum;ii++)//清空数据缓冲区

{

data[ii] =0;

}

while(1)

{

do

{

jj = Uart_rx();

if(!flag)

{

asm("\tnop");

break;

}

}while(jj==0xFFFF);

//Uart_tx(jj); //发送接收到的数据

if(locate<shuzunum)//每当接收到一个数据时立马把他存下来

{

data[locate] =jj; //数组是从data[0]开始存储

locate++;//接收完一个数据立马将数组位置进一位

}

else

{

ii=0;

//while(ii<shuzunum) //总的数据长度不超过600

while(1)

{

if(data[ii]==36)//$

{

if((ii+1)<shuzunum&&data[ii+1]==71)//G

if((ii+2)<shuzunum&&data[ii+2]==80)//P

if((ii+3)<shuzunum&&data[ii+3]==71) //G

if((ii+4)<shuzunum&&data[ii+4]==71)//G

if((ii+5)<shuzunum&&data[ii+5]==65)//A

break;//也就是满足上面六个符号则退出这个whlile大循环

}

ii++;

}

//退出后接着就是将一串的数据解析出我们要的

ii+=6;

for(;ii<shuzunum;ii++)

{

if(data[ii]==36)

break; //$

if(ji_dou==1)//如果逗号个数为1则为时间

{

tm[data_num]=data[ii];

data_num++;

}

else if(ji_dou==2)//如果逗号个数为2则为北纬度数

{

weidu[data_num]=data[ii];

data_num++;

}

else if(ji_dou==3)

{

N[data_num]=data[ii];

data_num++;

}

else if(ji_dou==4)

{

jingdu[data_num]=data[ii];

data_num++;

}

else if(ji_dou==5)

{

E[data_num]=data[ii];

data_num++;

}

else if(ji_dou==9)

{

hb[data_num]=data[ii];

data_num++;

}

if(data[ii]==44)//判断是否为逗号

{

ji_dou++;//遇到逗号则逗号计数的加1

data_num=0;//也就是在遇到逗号来之前我们要把数据存下来st++

}

}

//数据截取下来后就要进行相应的显示了

//LCD_clear(0);//先清上次的显示

cur_col=50;

cur_row=0;

LCD_pr_chars("GPGGA",5);

cur_col=0;

cur_row=1;

LCD_pr_chars("***********************",23);

cur_col = 1;

cur_row = 2;

LCD_pr_chars("haiba:",6);

for(ii=0;ii<4;ii++)

{

if(hb[ii]==46)

LCD_nextchar('.');

else

LCD_nextchar(chartable[hb[ii]-48]);

}

cur_col = 1;

cur_row =3;

LCD_pr_chars("Time:",5);

LCD_nextchar(chartable[tm[0]-48]);

LCD_nextchar(chartable[tm[1]-48]);

LCD_nextchar(':');

LCD_nextchar(chartable[tm[2]-48]);

LCD_nextchar(chartable[tm[3]-48]);

LCD_nextchar(':');

LCD_nextchar(chartable[tm[4]-48]);

LCD_nextchar(chartable[tm[5]-48]);

cur_col = 1;

cur_row = 4;

LCD_pr_chars("Latitude:",9);

for(ii=0;ii<9;ii++)

{

if(weidu[ii]==46)LCD_nextchar('.');

else LCD_nextchar(chartable[weidu[ii]-48]);

}

if(N[0]==78)LCD_nextchar('N');

else LCD_nextchar('S');

cur_col = 1;

cur_row = 5;

LCD_pr_chars("Longitude:",10);

for(ii=0;ii<9;ii++)

{

if(jingdu[ii]==46)LCD_nextchar('.');

else LCD_nextchar(chartable[jingdu[ii]-48]);

}

if(E[0]==69)LCD_nextchar('E');

else LCD_nextchar('W');

cur_row=6;

cur_col=0;

LCD_pr_chars("Press <Esc> to Exit",19);

cur_col=0;

cur_row=7;

LCD_pr_chars("***********************",23);

break;

}

}

return;

}

void uart_rece_gpgga_1(void) //串口提取

{

unsigned int ii;

unsigned int jj;

unsigned char data[shuzunum];//缓冲区中存储600个数据

unsigned int state_gps[2],satellite_num[2],HDOP[4];

unsigned int locate=0;

unsigned int ji_dou=0;//逗号计数变量

unsigned int data_num=0;//数组计数变量

char chartable[10]={'0','1','2','3','4','5','6','7','8','9'};

Uart_Init();

for(ii=0;ii<shuzunum;ii++)//清空数据缓冲区

{

data[ii] =0;

}

while(1)

{

do

{

jj = Uart_rx();

if(!flag)

{

asm("\tnop");

break;

}

}while(jj==0xFFFF);

//Uart_tx(jj); //发送接收到的数据

if(locate<shuzunum)//每当接收到一个数据时立马把他存下来

{

data[locate] =jj; //数组是从data[0]开始存储

locate++;//接收完一个数据立马将数组位置进一位

}

else

{

ii=0;

//while(ii<shuzunum) //总的数据长度不超过600

while(1)

{

if(data[ii]==36)//$

{

if((ii+1)<shuzunum&&data[ii+1]==71)//G

if((ii+2)<shuzunum&&data[ii+2]==80)//P

if((ii+3)<shuzunum&&data[ii+3]==71) //G

if((ii+4)<shuzunum&&data[ii+4]==71)//G

if((ii+5)<shuzunum&&data[ii+5]==65)//A

break;//也就是满足上面六个符号则退出这个whlile大循环

}

ii++;

}

//退出后接着就是将一串的数据解析出我们要的

ii+=6;

for(;ii<shuzunum;ii++)

{

if(data[ii]==36)

break; //$

if(ji_dou==6)//如果逗号个数为1则为时间

{

state_gps[data_num]=data[ii];

data_num++;

}

else if(ji_dou==7)//如果逗号个数为2则为北纬度数

{

satellite_num[data_num]=data[ii];

data_num++;

}

else if(ji_dou==8)

{

HDOP[data_num]=data[ii];

data_num++;

}

if(data[ii]==44)//判断是否为逗号

{

ji_dou++;//遇到逗号则逗号计数的加1

data_num=0;//也就是在遇到逗号来之前我们要把数据存下来st++

}

}

//数据截取下来后就要进行相应的显示了

//LCD_clear(0);//先清上次的显示

cur_col=50;

cur_row=0;

LCD_pr_chars("GPGGA",5);

cur_col=0;

cur_row=1;

LCD_pr_chars("***********************",23);

//*********************************************************************

//GPS定位状态

cur_col = 1;

cur_row = 2;

LCD_pr_chars("state_gps:",10);

cur_col = 1;

cur_row = 3;

if (state_gps[0]=='0')

LCD_pr_chars("Unlocated",9);

else if(state_gps[0]=='1')

LCD_pr_chars("non-differential gps",20);

else if(state_gps[0]=='2')

LCD_pr_chars("differential gps",16);

else if(state_gps[0]=='6')

LCD_pr_chars("estimated",9);

else

{};

//***********************************************************************

//正在使用的卫星数量

cur_col = 1;

cur_row = 4;

LCD_pr_chars("satellite_num:",14);

if(satellite_num[1]!=0)

{

LCD_nextchar(chartable[satellite_num[0]-48]);

LCD_nextchar(chartable[satellite_num[1]-48]);

}

else

LCD_nextchar(chartable[satellite_num[0]-48]);

//***********************************************************************

//HDOP水平精度因子

cur_col = 1;

cur_row = 5;

LCD_pr_chars("HDOP:",5);

for(ii=0;ii<4;ii++)

{

if(HDOP[ii]==46)LCD_nextchar('.');

else LCD_nextchar(chartable[HDOP[ii]-48]);

}

cur_row=6;

cur_col=0;

LCD_pr_chars("Press <Esc> to Exit",19);

cur_col=0;

cur_row=7;

LCD_pr_chars("***********************",23);

break;

}

}

return;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: