|
我们在做接收GPS信号并处理用液晶屏显示的小实验,出现了一点问题被卡住啦,希望各位帮帮忙.假设已经接收到信号
unsigned char Recieve_Gps[80]={"$GPRMC,114301.000,A,3802.2167,N,11431.5890,E,0.00,,080511,,*1F"};//接收一条完整的gps语句
/*<1>*/unsigned char Gps_time[10];//接收时时间,hhmmss ///////////
/*<2>*/unsigned char Data_State;//定位状态,A=有效定位,V=无效定位 //////
/*<3>*/unsigned char Latitude[9];//纬度
/*<4>*/unsigned char Latitude_Direction;//纬度方向,N为北纬,S为南纬
/*<5>*/unsigned char Longitude[10];//经度
/*<6>*/unsigned char Longitude_Direction;//经度方向,E为东经,W为西经
/*<7>*/unsigned char Gps_Speed[4];//地面速率(000.0~999.9节,前面的0也将被传输)
/*<8>*/unsigned char Gps_Angle[5];//地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
/*<9>*/unsigned char Gps_Date[6];//UTC日期,ddmmyy(日月年)格式
unsigned char Gps_End;
unsigned int flag=0;
unsigned char mode; //0---接收帧尾数据模式
//1---接收帧头数据模式
//2---接收帧内数据模式
unsigned int Seg_Count=0;//逗号计数器
unsigned int Byte_Count=0;//位数计数器
unsigned char Frame_Flag[5];//帧头,GPRMC
unsigned int i;
unsigned char *temp;
void Gps_Save(void)
{
for(i=0;i<79;i++)
{*temp=Recieve_Gps;
switch(*temp)
{
case'$':mode=1;//进入接收帧头数据模式
Byte_Count=0;break;//接收位数清空
default:
if(mode==1)//开始接收帧头
{
if(Byte_Count<5)
Frame_Flag[Byte_Count++]=*temp;break;//接收字符放入类型缓存
}
int main(void)
{
Uart_Init(); //串口初始化
LCD_init();//初始化液晶
LCD_clear();
SETBIT(DDRC,BACKLED_EN); //配置背光控制端口
CLEARBIT(PORTC,BACKLED_EN);//使能背光
sei();
LCD_write_english_string(5,0,"WELCOM ");
while(1){
Gps_Save();
LCD_write_english_string(5,1, Frame_Flag);}}
这样实验的时候能够正常显示,但是用下面的程序再做的时候就不行了,是一屏乱码
void Gps_Save(void)
{
for(i=0;i<79;i++)
{*temp=Recieve_Gps;
switch(*temp)
{
case'$':mode=1;//进入接收帧头数据模式
Byte_Count=0;break;//接收位数清空
case',':Seg_Count++;//逗号计数加1
mode=2;
Byte_Count=0;break;
case'*':mode=3;//进入接收帧尾数据模式
Byte_Count=0;break;
default:
if(mode==1)//开始接收帧头
{
if(Byte_Count<5)
Frame_Flag[Byte_Count++]=*temp;break;//接收字符放入类型缓存
}
if(mode==2)//开始接收帧内数据
{switch(Seg_Count)
{case 1:if(Byte_Count<10)//接收时间
{
Gps_time[Byte_Count]=*temp;
变换并赋予高二位显示
}break;
case 2:if(Byte_Count<1)//接收数据有效位
{
*Data_State=*temp;
}break;
case 3:if(Byte_Count<9)//接收纬度
{
Latitude[Byte_Count]=*temp;
}break;
case 4:if(Byte_Count<1)//接收纬度方向
{
*Latitude_Direction=*temp;
}break;
case 5:if(Byte_Count<10)//接收经度
{
Longitude[Byte_Count]=*temp;
}break;
case 6:if(Byte_Count<1)//接收经度方向
{
*Longitude_Direction=*temp;
}break;
case 7:if(Byte_Count<4)// 地面速率
{
Gps_Speed[Byte_Count]=*temp;
}break;
case 8:if(Byte_Count<5)//地面航向
{
Gps_Angle[Byte_Count]=*temp;
}break;
case 9:if(Byte_Count<6)//接收日期 UTC日期
{
Gps_Date[Byte_Count]=*temp;
}break;
default:break;
}
}
if(mode==3)//开始接收帧尾
{if(Seg_Count==11)
{
Gps_End=1;
Seg_Count=0;
}break;
}
}
Byte_Count++;break;
}
}
int main(void)
{
Uart_Init(); //串口初始化
LCD_init();//初始化液晶
LCD_clear();
SETBIT(DDRC,BACKLED_EN); //配置背光控制端口
CLEARBIT(PORTC,BACKLED_EN);//使能背光
sei();
LCD_write_english_string(5,0,"WELCOM ");
while(1)
{
Gps_Save();
LCD_write_english_string(5,1,Gps_time);
Delay_ms(100);
LCD_write_english_string(5,2,Data_State);
Delay_ms(100);
LCD_write_english_string(5,3,Latitude);
Delay_ms(100);
LCD_write_english_string(5,4,Latitude_Direction);
Delay_ms(100);
LCD_write_english_string(5,5,Longitude);
Delay_ms(100);
LCD_clear();
LCD_write_english_string(5,1,Longitude_Direction);
Delay_ms(100);
LCD_write_english_string(5,2,Gps_Speed);
Delay_ms(100);
LCD_write_english_string(5,3,Gps_Angle);
Delay_ms(100);
LCD_write_english_string(5,4,Gps_Date);
Delay_ms(100);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|