基于DSP的GPGGA定位数据提取的代码已经通过了测试。
由于分了好多模块,但在网上下载就有其他的模块,在此我贴出来已经改好的GPGGA的main函数代码,
其他的代码不变,可以在网上下载,百度里搜 基于DSP的GPGGA定位数据提取 就能找到,main函数换以下代码就能得到你想要的功能。
该代码的功能能使液晶移动并且翻页。
main函数代码:
#include
#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(" nop"); //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(" rsbx intm ");
}
interrupt void EXINT1_isr()
{
Close_LED_sign();
Close_LED_Data();
Close_LED_Traf();
// while(!(GPIOSR&0x01))
{
asm(" nop"); //中断处理函数
asm(" nop");
}
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清空数据缓冲区
{
data[ii] =0;
}
while(1)
{
do
{
jj = Uart_rx();
if(!flag)
{
asm(" nop");
break;
}
}while(jj==0xFFFF);
//Uart_tx(jj); //发送接收到的数据
if(locate每当接收到一个数据时立马把他存下来
{
data[locate] =jj; //数组是从data[0]开始存储
locate++;//接收完一个数据立马将数组位置进一位
}
else
{
ii=0;
//while(ii总的数据长度不超过600
while(1)
{
if(data[ii]==36)//$
{
if((ii+1)也就是满足上面六个符号则退出这个whlile大循环
}
ii++;
}
//退出后接着就是将一串的数据解析出我们要的
ii+=6;
for(;ii如果逗号个数为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 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清空数据缓冲区
{
data[ii] =0;
}
while(1)
{
do
{
jj = Uart_rx();
if(!flag)
{
asm(" nop");
break;
}
}while(jj==0xFFFF);
//Uart_tx(jj); //发送接收到的数据
if(locate每当接收到一个数据时立马把他存下来
{
data[locate] =jj; //数组是从data[0]开始存储
locate++;//接收完一个数据立马将数组位置进一位
}
else
{
ii=0;
//while(ii总的数据长度不超过600
while(1)
{
if(data[ii]==36)//$
{
if((ii+1)也就是满足上面六个符号则退出这个whlile大循环
}
ii++;
}
//退出后接着就是将一串的数据解析出我们要的
ii+=6;
for(;ii如果逗号个数为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 to Exit",19);
cur_col=0;
cur_row=7;
LCD_pr_chars("***********************",23);
break;
}
}
return;
}