📄 gps.c
字号:
/*****************************************************/
/* File name : GPS.c */
/* Description : Code for GPS viewer */
/* Platform : AVRStudio4.14 + WinAVR20080610 for ATmega8 */
/* Author : Michael Zhang - 章其波 */
/* Email : sudazqb@163.com */
/* MSN : zhangqibo_1985@hotmail.com */
/* Date : 2008-9-21 */
/* NOT FOR COMMERCIAL USE, ALL RIGHT RESERVED! */
/*****************************************************/
/* Change Log: */
/* 20080921: fix a bug about time */
/* Add speed in km support */
/* Add direct directiong support */
/* 20080920: original version */
/*****************************************************/
#include <avr/io.h>
#include "lcd/lcd.h"
#include "lcd/lcd_app.h"
#include "uart/uart.h"
#include "string.h"
#include "util/delay.h"
//#define SPEED_KPH 1
#define ANGLE_DIRECTION 1
#define KEY_LEFT_DDR DDRD
#define KEY_LEFT_PORT PORTD
#define KEY_LEFT_PIN PIND
#define KEY_LEFT_BIT PD6
#define KEY_RIGHT_DDR DDRD
#define KEY_RIGHT_PORT PORTD
#define KEY_RIGHT_PIN PIND
#define KEY_RIGHT_BIT PD7
#define KEY_INI {\
KEY_LEFT_DDR &= ~(1<<KEY_LEFT_BIT);\
KEY_RIGHT_DDR &= ~(1<<KEY_RIGHT_BIT);\
KEY_LEFT_PORT |= 1<<KEY_LEFT_BIT;\
KEY_RIGHT_PORT |= 1<<KEY_RIGHT_BIT;\
}
#define KEY_LEFT (KEY_LEFT_PIN & (1<<KEY_LEFT_BIT))
#define KEY_RIGHT (KEY_RIGHT_PIN & (1<<KEY_RIGHT_BIT))
unsigned char data_buffer[8];
unsigned char latitude[14] = {'N',':',' '};
unsigned char longitude[14] = {'E',':'};
unsigned char altitude[12] = {'A',':'};
unsigned char total_statlites_visable[3] = {'0','0',0}; /*可视卫星总数*/
unsigned char total_statlites_useful[3] = {'0','0',0}; /*定位用的卫星数*/
unsigned char total_statlites_have_signal[3] = {'0','0',0}; /*有信号的卫星数*/
unsigned char time[10];
unsigned char speed[15] = {'S',':',' '};
unsigned char angle[15] = {'A','n','g','l','e',':',' '};
unsigned char time_beijing;
int main()
{
unsigned char temp; /*用于接收串口数据的临时变量*/
unsigned char i; /*循环用的变量*/
unsigned long j;
unsigned char k;
unsigned char need_update =0; /*更新显示标志*/
unsigned char need_update1 =0; /*更新显示标志 用于解决时间显示上的一个小bug*/
unsigned char mode = 0; /*显示模式,坐标和速度两个界面,3310的液晶太小*/
unsigned char tip; /*提示信息*/
unsigned long speed_angle_kph_temp;
unsigned char mile_or_km = 0;
unsigned char total_gpgsv_no; /*GPGSV语句条数*/
unsigned char current_gpgsv_index; /*当前GPGSV语句index*/
unsigned char fix_valid; /*定位有效标志*/
unsigned char gprmc_valid; /*GPRMC语句有效标志位*/
KEY_INI; /*按键初始化*/
COM_Initial(MYUBRR); /*串口初始化*/
lcdInit(); /*LCD初始化*/
lcdClrDisBuf(); /*清显存*/
LCD_print12(0,0," GPS Viewer\n --by bozai"); /*log信息*/
lcdUpdateDisplay(); /*显示*/
_delay_ms(10);
while(1)
{
if(KEY_RIGHT == 0) /*检测按键*/
{
_delay_ms(10); /*简单去抖*/
if(KEY_RIGHT == 0)
{
while(KEY_RIGHT == 0); /*等待释放*/
if(mode == 0)
{
mode = 1; /*速度模式*/
tip = 5; /*tip的count设为5秒*/
}
else mode = 0; /*坐标模式*/
need_update1 = 1; /*只要有模式更改则须立即更新显示内容*/
}
}
if(KEY_LEFT == 0) /*检测按键*/
{
_delay_ms(10); /*简单去抖*/
if(KEY_LEFT == 0)
{
while(KEY_LEFT == 0); /*等待释放*/
if(mile_or_km == 0)
{
mile_or_km = 1; /*英里模式*/
//tip = 5; /*tip的count设为5秒*/
}
else mile_or_km = 0; /*公里模式*/
need_update1 = 1; /*只要有模式更改则须立即更新显示内容*/
}
}
/*更新显示内容*/
if(need_update || need_update1)
{
need_update = 0;
lcdClrDisBuf(); /*清显存*/
if(mode == 0) /*坐标模式*/
{
LCD_print12(0,0,latitude); /*纬度*/
LCD_print12(0,12,longitude);/*经度*/
LCD_print12(0,24,altitude); /*海拔*/
}
else /*速度模式*/
{
#if 0 /*debug 用数据*/
i = 3;
//speed[i++] = '1';
//speed[i++] = '0';
speed[i++] = '1';
speed[i++] = '.';
speed[i++] = '0';
//speed[i++] = '0';
//speed[i++] = '0';
speed[i++] = ' ';
speed[i++] = 'K';
speed[i++] = 'P';
speed[i++] = 'H';
speed[i++] = '\0';
#endif
#if 0 /*debug 用数据*/
i = 7;
angle[i++] = '2';
angle[i++] = '4';
angle[i++] = '9';
angle[i++] = '.';
angle[i++] = '4';
angle[i++] = ' ';
angle[i++] = '\0';
#endif
if(mile_or_km == 0)
{
speed_angle_kph_temp = 0; /*清零*/
for(i=3;;i++) /*找到小数点前有几位数*/
{
if(speed[i] == '.')break;
}
for(k=i+1,j=100;j!=0;k++,j/=10) /*把小数点后的数放大1000倍*/
{
if(speed[k] == ' ')break;
speed_angle_kph_temp += (speed[k]-'0')*j;
}
for(j=1000,k=i-1;k>=3;k--,j*=10) /*小数点前的数放大1000倍*/
{
speed_angle_kph_temp += (speed[k]-'0')*j;
}
speed_angle_kph_temp *= 16093; /*转成公里*/
speed_angle_kph_temp /= 10000; /*缩小到放大1000倍的值*/
i = 3;
if((j = speed_angle_kph_temp/100000)!=0)speed[i++] = j + '0';
speed_angle_kph_temp%=100000;
if((j = speed_angle_kph_temp/10000)!=0)speed[i++] = j + '0';
speed_angle_kph_temp%=10000;
speed[i++] = speed_angle_kph_temp/1000 + '0';
speed_angle_kph_temp%=1000;
speed[i++] = '.';
speed[i++] = speed_angle_kph_temp/100 + '0';
speed_angle_kph_temp%=100;
speed[i++] = speed_angle_kph_temp/10 + '0';
speed[i++] = speed_angle_kph_temp%10 + '0';
speed[i++] = ' ';
speed[i++] = 'K';
speed[i++] = 'P';
speed[i++] = 'H';
speed[i++] = '\0';
}
LCD_print12(0,0,speed); /*速度,单位MPH*/
#if ANGLE_DIRECTION
LCD_print12(0,12,angle);/*方位角*/
speed_angle_kph_temp = 0; /*清零*/
for(i=7;;i++) /*找到小数点前有几位数*/
{
if(angle[i] == '.')break;
}
speed_angle_kph_temp += angle[i+1]-'0'; /*小数点后一位*/
for(j=10,i--;i>=7;i--,j*=10) /*小数点前的数放大10倍*/
{
speed_angle_kph_temp += (angle[i]-'0')*j;
}
/*根据值确定方向*/
if(speed_angle_kph_temp>3375 || speed_angle_kph_temp < 226)
LCD_print12(0,24,"--> North");
else if(speed_angle_kph_temp>2925)
LCD_print12(0,24,"--> North West");
else if(speed_angle_kph_temp>2475)
LCD_print12(0,24,"--> West");
else if(speed_angle_kph_temp>2025)
LCD_print12(0,24,"--> South West");
else if(speed_angle_kph_temp>1575)
LCD_print12(0,24,"--> South");
else if(speed_angle_kph_temp>1125)
LCD_print12(0,24,"--> South East");
else if(speed_angle_kph_temp>675)
LCD_print12(0,24,"--> East");
else if(speed_angle_kph_temp>225)
LCD_print12(0,24,"--> North East");
#else
if(tip) /*显示一些关于方位角的小提示*/
{
tip--;
if(tip > 2)
LCD_print12(0,24,"Tip: 0 = North");
else
LCD_print12(0,24,"Tip: 90 = East");
}
else LCD_print12(0,24," --by bozai");
#endif
}
LCD_print12(0,36,total_statlites_useful); /*定位用的卫星数目*/
LCD_print12(12,36,"/");
LCD_print12(18,36,total_statlites_have_signal); /*有信号的卫星数目*/
/*北京时间转换及显示*/
if(need_update1)
{
need_update1 = 0;
}
else
{
time_beijing = (time[0]-'0')*10 + (time[1] - '0') + 8;
if(time_beijing > 23)
{
time[0] = '0';
time[1] = (time_beijing%24) + '0';
}
else
{
time[0] = time_beijing/10 + '0';
time[1] = time_beijing%10 + '0';
}
}
LCD_print12(36,36,time); /*显示时间*/
lcdUpdateDisplay(); /*显示*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -