📄 gps.c
字号:
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include "System.h"
#include "Lcd.h"
#include "Menu.h"
#include "UART.h"
//字符数组绝对地址
#define latitude 0x8000
#define longitude 0x9947
#define flag 0xB28E
#define satllite 0xB79D
#define height 0xBCAC
#define speed 0xC6C9
#define angle 0xD5F4
////////////////////////////////////////////////////////////////////////////////////////////////
//GPS模块参数默认值
unsigned char GPSParaList[]={3,8,30,0,0,7,3,26};
////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int code BaudArray[]={12,24,48,96,192,288,576,1152};
void GPSSetUp() //设置
{
char MovHand=1; //移动光标标志位
char ItemSel=2; //光标所在行
//显示界面
Clear(0,240);
dprintf(9,0,"GPS串行实验参数设置");
dprintf(0,16*1,line);
dprintf(2,16*2,"波特率: 00");
putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
dprintf(2,16*3,"时 间: 时");
putufig(12,16*3,GPSParaList[1],2,0,'0');
dprintf(12,16*4," 分:");
putufig(12,16*4,GPSParaList[2],2,0,'0');
dprintf(12,16*5," 秒");
putufig(12,16*5,GPSParaList[3],2,0,'0');
dprintf(12,16*6," 毫秒");
putufig(13,16*6,GPSParaList[4],1,0,' ');
dprintf(2,16*7,"日 期: 年");
putufig(12,16*7,GPSParaList[5],2,0,'0');
dprintf(12,16*8," 月");
putufig(12,16*8,GPSParaList[6],2,0,'0');
dprintf(12,16*9," 日");
putufig(12,16*9,GPSParaList[7],2,0,'0');
dprintf(0,16*12,line);
dprintf(0,16*13,"选择项目 改变参数");
dprintf(1,16*14, "芗 兦 戛 戋");
dprintf(35,16*14, "确定");
while(1)
{
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(MovHand==1)
{
int i;
for(i=2;i<12;i++)
{
if(ItemSel==i)
dprintf(0,i*16,"贲");
else
dprintf(0,i*16," ");
}
MovHand=0;
}
if(Key[0].pressed==1) //检测到上键
{
Key[0].pressed=0;
if(ItemSel>2)
ItemSel--;
MovHand=1;
}
if(Key[1].pressed==1) //检测到下键
{
Key[1].pressed=0;
if(ItemSel<9)
ItemSel++;
MovHand=1;
}
if(Key[2].pressed==1) //检测到-键
{
Key[2].pressed=0;
switch(ItemSel)
{
case 2: //波特率
if(GPSParaList[0]!=0)
{
GPSParaList[0]--;
putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
}
break;
case 3: //时
if(GPSParaList[1]==0)
GPSParaList[1]=23;
else
GPSParaList[1]--;
putufig(12,16*3,GPSParaList[1],2,0,'0');
break;
case 4: //分
if(GPSParaList[2]==0)
GPSParaList[2]=59;
else
GPSParaList[2]--;
putufig(12,16*4,GPSParaList[2],2,0,'0');
break;
case 5: //秒
if(GPSParaList[3]==0)
GPSParaList[3]=59;
else
GPSParaList[3]--;
putufig(12,16*5,GPSParaList[3],2,0,'0');
break;
case 6: //毫秒
if(GPSParaList[4]==0)
GPSParaList[4]=9;
else
GPSParaList[4]--;
putufig(13,16*6,GPSParaList[4],1,0,' ');
break;
case 7: //年
if(GPSParaList[5]==0)
GPSParaList[5]=99;
else
GPSParaList[5]--;
putufig(12,16*7,GPSParaList[5],2,0,'0');
break;
case 8: //月
if(GPSParaList[6]==1)
GPSParaList[6]=12;
else
GPSParaList[6]--;
putufig(12,16*8,GPSParaList[6],2,0,'0');
break;
case 9: //日
if(GPSParaList[7]==1)
GPSParaList[7]=31;
else
GPSParaList[7]--;
putufig(12,16*9,GPSParaList[7],2,0,'0');
break;
default:
break;
}
}
if(Key[3].pressed==1) //检测到+键
{
Key[3].pressed=0;
switch(ItemSel)
{
case 2: //波特率
if(GPSParaList[0]!=7)
{
GPSParaList[0]++;
putufig(10,16*2,BaudArray[GPSParaList[0]],4,0,' ');
}
break;
case 3: //时
if(GPSParaList[1]==23)
GPSParaList[1]=0;
else
GPSParaList[1]++;
putufig(12,16*3,GPSParaList[1],2,0,'0');
break;
case 4: //分
if(GPSParaList[2]==59)
GPSParaList[2]=0;
else
GPSParaList[2]++;
putufig(12,16*4,GPSParaList[2],2,0,'0');
break;
case 5: //秒
if(GPSParaList[3]==59)
GPSParaList[3]=0;
else
GPSParaList[3]++;
putufig(12,16*5,GPSParaList[3],2,0,'0');
break;
case 6: //毫秒
if(GPSParaList[4]==9)
GPSParaList[4]=0;
else
GPSParaList[4]++;
putufig(13,16*6,GPSParaList[4],1,0,' ');
break;
case 7: //年
if(GPSParaList[5]==99)
GPSParaList[5]=0;
else
GPSParaList[5]++;
putufig(12,16*7,GPSParaList[5],2,0,'0');
break;
case 8: //月
if(GPSParaList[6]==12)
GPSParaList[6]=1;
else
GPSParaList[6]++;
putufig(12,16*8,GPSParaList[6],2,0,'0');
break;
case 9: //日
if(GPSParaList[7]==31)
GPSParaList[7]=1;
else
GPSParaList[7]++;
putufig(12,16*9,GPSParaList[7],2,0,'0');
break;
default:
break;
}
}
if(Key[7].pressed==1) //检测到确定键,向DACData中填充数据
{
ClearKey();
Clear(0,240);
uart_ini(GPSParaList[0]);
return;
}
}//while(1)
}
void GPS()
{
char Buf1[256]={"\0"};
char Buf2[256];
int N=0;
unsigned int hour,minute,second;
char time[10];
char date[12];
char *SendBuf=Buf1;
char *SaveBuf;
GPSSetUp();
hour=GPSParaList[1];
minute=GPSParaList[2];
second=GPSParaList[3];
uart_port_ini();
dprintf(0,16*13,line);
dprintf(35,224,"退出");
sprintf(date,"%d%d,%d%d,20%d%d\0",(unsigned int)GPSParaList[7]/10,(unsigned int)GPSParaList[7]%10,\
(unsigned int)GPSParaList[6]/10,(unsigned int)GPSParaList[6]%10,(unsigned int)GPSParaList[5]/10,(unsigned int)GPSParaList[5]%10);
Myflag=1;
X=0;
Y=0;
F=0;
while(1)
{
if(CheckKeyF==1) //键盘检测
{
CheckKey();
CheckKeyF=0;
}
if(Myflag==1)
{
int i,length,length2;
unsigned char checksum;
char AorV;
Myflag=0;
Mycounter=counter+40;
if(N%2==0)
{
SendBuf=Buf1;
SaveBuf=Buf2;
}
else
{
SendBuf=Buf2;
SaveBuf=Buf1;
}
UartSend(SendBuf);
if(F==1)
{
Clear(0,16*13);
tprintf(0,0,SendBuf);
}
else
tprintf(X,Y,SendBuf);
//设置时间
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
sprintf(time,"%d%d%d%d%d%d.%d\0",hour/10,hour%10,minute/10,minute%10,second/10,second%10,(unsigned int)GPSParaList[4]);
//change bank page to BANK2
PSBANK=0x21;
//GPGGA:
sprintf(SaveBuf,"$GPGGA,%s,395%c.%c%c%c%c,N,1161%c.%c%c%c%c,E,%c,%c,4.30,\0",\
time,CBYTE[latitude+N*5],CBYTE[latitude+N*5+1],CBYTE[latitude+N*5+2],CBYTE[latitude+N*5+3],CBYTE[latitude+N*5+4],\
CBYTE[longitude+N*5],CBYTE[longitude+N*5+1],CBYTE[longitude+N*5+2],CBYTE[longitude+N*5+3],CBYTE[longitude+N*5+4],\
CBYTE[flag+N],CBYTE[satllite+N]);
length=strlen(SaveBuf);
if(CBYTE[height+N*2]!='0' && CBYTE[height+N*2+1]!='0')
sprintf(SaveBuf+length,"000%c%c,M,,M,,*\0",CBYTE[height+N*2],CBYTE[height+N*2+1]);
else
sprintf(SaveBuf+length,",M,,M,,*\0");
length=strlen(SaveBuf);
checksum=SaveBuf[1];
for(i=1;i<length-2;i++)
{
checksum^=SaveBuf[i+1];
}
sprintf(SaveBuf+length,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);
//GPRMC:
length=strlen(SaveBuf);
if(CBYTE[flag+N]=='0')
AorV='V';
else
AorV='A';
sprintf(SaveBuf+length,"$GPRMC,%s,%c,395%c.%c%c%c%c,N,1161%c.%c%c%c%c,E,00%c%c.%c,%c%c%c,130905,,E*\0",\
time,AorV,CBYTE[latitude+N*5],CBYTE[latitude+N*5+1],CBYTE[latitude+N*5+2],CBYTE[latitude+N*5+3],CBYTE[latitude+N*5+4],\
CBYTE[longitude+N*5],CBYTE[longitude+N*5+1],CBYTE[longitude+N*5+2],CBYTE[longitude+N*5+3],CBYTE[longitude+N*5+4],\
CBYTE[speed+N*3],CBYTE[speed+N*3+1],CBYTE[speed+N*3+2],CBYTE[angle+N*3],CBYTE[angle+N*3+1],CBYTE[angle+N*3+2]);
length2=strlen(SaveBuf);
checksum=SaveBuf[length+1];
for(i=1;i<length2-length-2;i++)
{
checksum^=SaveBuf[length+i+1];
}
sprintf(SaveBuf+length2,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);
//GPZDA:
length=strlen(SaveBuf);
sprintf(SaveBuf+length,"$GPZDA,%s,%s,,*\0",time,date);
length2=strlen(SaveBuf);
checksum=SaveBuf[length+1];
for(i=1;i<length2-length-2;i++)
{
checksum^=SaveBuf[length+i+1];
}
sprintf(SaveBuf+length2,"%X%X\r\n\0",(unsigned int)checksum/16,(unsigned int)checksum%16);
//change back
PSBANK=0x11;
N++;
if(N==1294)
N=0;
}
if(Key[7].pressed==1) //退出串口模块
{
ClearKey(); //清按键
Clear(0,240); //清屏幕
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -