weishuhui 发表于 2011-5-16 16:35:52

AVR ATmega16 关于GPS接受用5110液晶屏显示的问题,望各位高手们帮忙看一下问题在

我们在做接收GPS信号并处理用液晶屏显示的小实验,出现了一点问题被卡住啦,希望各位帮帮忙.假设已经接收到信号
unsigned char Recieve_Gps={"$GPRMC,114301.000,A,3802.2167,N,11431.5890,E,0.00,,080511,,*1F"};//接收一条完整的gps语句
/*<1>*/unsigned char Gps_time;//接收时时间,hhmmss      ///////////
/*<2>*/unsigned char Data_State;//定位状态,A=有效定位,V=无效定位 //////
/*<3>*/unsigned char Latitude;//纬度
/*<4>*/unsigned char Latitude_Direction;//纬度方向,N为北纬,S为南纬
/*<5>*/unsigned char Longitude;//经度
/*<6>*/unsigned char Longitude_Direction;//经度方向,E为东经,W为西经
/*<7>*/unsigned char Gps_Speed;//地面速率(000.0~999.9节,前面的0也将被传输)
/*<8>*/unsigned char Gps_Angle;//地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
/*<9>*/unsigned char Gps_Date;//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;//帧头,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=*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=*temp;break;//接收字符放入类型缓存
                        }
                if(mode==2)//开始接收帧内数据
                        {switch(Seg_Count)
                                  {case 1:if(Byte_Count<10)//接收时间
                                    {
                                        Gps_time=*temp;
                                变换并赋予高二位显示   
                                    }break;
                                  case 2:if(Byte_Count<1)//接收数据有效位
                                                {
                                        *Data_State=*temp;
                                    }break;
                                  case 3:if(Byte_Count<9)//接收纬度
                                    {
                                       Latitude=*temp;
                                    }break;
                                  case 4:if(Byte_Count<1)//接收纬度方向
                                                    {
                                          *Latitude_Direction=*temp;
                                    }break;
                                  case 5:if(Byte_Count<10)//接收经度
                                    {
                                          Longitude=*temp;
                                    }break;
                                  case 6:if(Byte_Count<1)//接收经度方向
                                                {
                                          *Longitude_Direction=*temp;
                                    }break;
                                  case 7:if(Byte_Count<4)// 地面速率
                                                      {
                                          Gps_Speed=*temp;
                                    }break;
                                  case 8:if(Byte_Count<5)//地面航向
                                                      {
                                              Gps_Angle=*temp;
                                    }break;
                                  case 9:if(Byte_Count<6)//接收日期 UTC日期
                                    {
                                             Gps_Date=*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);

}

}
页: [1]
查看完整版本: AVR ATmega16 关于GPS接受用5110液晶屏显示的问题,望各位高手们帮忙看一下问题在