⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 手持式GPS导航系统-源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************/
/*            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 + -