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

📄 main.c

📁 GPS模块的相关资料
💻 C
字号:
#include "main.h"
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "delay.h"
#include "uart.h"
#include "lcd3310.h"
#include "sht15.h"

#define GPS_PRINT		1
#define SHT_PRINT		2
#define SPEED_PRINT		3

extern const unsigned char font16X10[];

unsigned char new_print = 1;
unsigned char second =0;

char GPS_head[5];
char time[4] = {0};
char latitude[10] = {0};
char longitude[11] = {0}; 
char GPS_state = 0; 
char date[4];
char speed[6] = {0};
char direction[6] ={0};


volatile unsigned char GPS_flag = 0;
volatile unsigned char GPS_mode = 0;
volatile unsigned char GPS_sec = 0;
volatile unsigned char GPS_data_index = 0;
volatile unsigned char GPS_update = 0;

unsigned char sht_ready = 0;
unsigned char sht_data[6]={0};
unsigned char sht_char[9]={0};

volatile unsigned char key = 0;



const unsigned char yue[] PROGMEM=
{
	0x40,0x3F,0x15,0x15,0x7F,0x00
};

const unsigned char ri[] PROGMEM=
{
	0x00,0x7F,0x49,0x49,0x49,0x7F
};

const unsigned char nian[] PROGMEM=
{
	0x26,0x3B,0x2A,0x7E,0x2A,0x2A
};

const unsigned char cel[] PROGMEM=
{
	0x00,0x00,0x00,0x7E,0x7E,0x66,0x66,0x7E,
	0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	
};

const unsigned char arrow[] PROGMEM=
{
	0x00,0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,
	0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
	0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
	0xC0,0xE2,0x76,0x3E,0x1E,0x3E,0x7E,0x00,
	0x00,0x60,0x70,0x38,0x1C,0x0E,0x07,0x03,
	0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	

	0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
	0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,
	0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
	0x01,0x01,0x01,0x0F,0x07,0x03,0x01,0x00,

	0x00,0x06,0x0E,0x1C,0x38,0x70,0xE0,0xC0,
	0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
	0x03,0x47,0x6E,0x7C,0x78,0x7C,0x7E,0x00,


	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
	0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x08,0x18,0x38,0x7F,
	0x7F,0x38,0x18,0x08,0x00,0x00,0x00,0x00,

	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
	0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x00,
	0x00,0x7E,0x7C,0x78,0x7C,0x6E,0x47,0x03,
	0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

	0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,
	0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
	0x00,0x01,0x03,0x07,0x0F,0x01,0x01,0x01,
	0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,

	0x00,0x7E,0x3E,0x1E,0x3E,0x76,0xE2,0xC0,
	0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
	0x03,0x07,0x0E,0x1C,0x38,0x70,0x60,0x00,

};

void port_init(void)
{
	DDRD =0x02;
	PORTD = 0x03;
	
	LCD_CON_DDR |= LCD_RST | LCD_DC | LCD_CE;
	SPI_DDR |= SPI_MOSI | SPI_CLK;

}

void spi_init(void)
{
	SPSR = (1<<SPI2X);
	SPCR = (1<<SPE)|(1<<MSTR);
}

void timer_init(void)
{
	TCCR0 = 0x05;
	TCNT0 = 220;
	TIFR |= 0x01;
	TIMSK |= 0x01;

}

void init(void)
{
	OSCCAL = 0xB1;
	port_init();
	uart_init();
	spi_init();
	timer_init();
}

SIGNAL(SIG_OVERFLOW0)
{
	static unsigned char key1_tmp = 0, key2_tmp = 0;
	unsigned char tmp,i;
	TCNT0 = 220;
	tmp = PIND;
	for(i=0;i<5;i++)
	{
		delay_1us();
		if(tmp != PIND)
			return;
	}
	if(tmp & 0x08)
	{
		if(key1_tmp > 1)
		{
			key |= 0x01;
		}
		key1_tmp = 0;
	}
	else
	{
		key1_tmp ++;
		if(key1_tmp > 100)
			key1_tmp = 100;
	}

	if(tmp & 0x04)
	{
		if(key2_tmp > 1)
		{
			key |= 0x02;
		}
		key2_tmp = 0;

	}
	else
	{
		key2_tmp ++;
		if(key2_tmp > 100)
			key2_tmp = 100;
	}
}

SIGNAL(SIG_UART_RECV)
{
	char tmp;
	tmp=UDR;
	switch(tmp)
	{
		case '$':
		{
			GPS_flag = 1;
			GPS_sec = 0;
			GPS_data_index = 0;
			break;
		}
		case ',':
		{
			GPS_sec ++;
			GPS_data_index = 0;
			break;
		}
		default:
		{
			if(GPS_flag == 1)
			{
				GPS_head[GPS_data_index] = tmp;
				if(GPS_data_index >= 4)
				{
					if((GPS_head[0]=='G') && (GPS_head[1]=='P') && (GPS_head[2]=='R')
						&& (GPS_head[3]=='M') && (GPS_head[4]=='C'))
					{
						GPS_flag = 2;
						GPS_sec = 0;
						GPS_data_index = 0;
					}
				}
			}
			else if(GPS_flag == 2)
			{
				switch(GPS_sec)
				{
					case 1:
					{
						if(GPS_data_index < 4)
						{
							time[GPS_data_index] = tmp;
						}
						break;
					}
					case 2:
					{
						if(!GPS_data_index)
						{
							GPS_state = tmp;
						}
					}
					case 3:
					{
						if(GPS_data_index < 9)
						{
							latitude[GPS_data_index] = tmp;
						}
						break;
					}
					case 5:
					{
						if(GPS_data_index < 10)
						{
							longitude[GPS_data_index] = tmp;
						}
						break;
					}
					case 7:
					{
						if(GPS_data_index < 5)
						{
							speed[GPS_data_index] = tmp;
						}
						break;
					}
					case 8:
					{
						if(GPS_data_index < 5)
						{
							direction[GPS_data_index] = tmp;
						}
						break;
					}
					case 9:
					{
						if(GPS_data_index < 4)
						{
							date[GPS_data_index] = tmp;
						}
						if(GPS_data_index == 3)
						{
							GPS_update = 1;
						}
					}
					default: break;
				}				
			}
			GPS_data_index++;
			break;
		}
	}
}

void LCD_write_time(void)
{
	LCD_set_XY(0,0);
	LCD_write_char(date[2]);
	LCD_write_char(date[3]);
	LCD_set_XY(13,0);
	LCD_write_my_char(yue);
	LCD_set_XY(20,0);
	LCD_write_char(date[0]);
	LCD_write_char(date[1]);
	LCD_set_XY(33,0);
	LCD_write_my_char(ri);
	LCD_write_pgm_bmp(15,1,10,2,font16X10+(time[0]-32)*20);
	LCD_write_pgm_bmp(25,1,10,2,font16X10+(time[1]-32)*20);
	LCD_write_pgm_bmp(35,1,10,2,font16X10+(':'-32)*20);
	LCD_write_pgm_bmp(45,1,10,2,font16X10+(time[2]-32)*20);
	LCD_write_pgm_bmp(55,1,10,2,font16X10+(time[3]-32)*20);
}


void LCD_write_GPS_data(void)
{
	LCD_write_time();	
	if(GPS_state != 'A')
	{
		LCD_write_english_string(0,4,"   Wait GPS   ");
		LCD_write_english_string(0,5,"              ");
		return;
	}
	LCD_write_english_string(12,4,latitude);
	LCD_write_english_string(12,5,longitude);
}

void make_sht_string(unsigned char * sht_char)
{

	if(sht_char[3] > '4')
	{
		sht_char[2] += 1;
	}
	if(sht_char[2] > '9')
	{
		sht_char[1] += 1;
		sht_char[2] = '0';
	}
	if(sht_char[1] > '9')
	{
		sht_char[0] += 1;
		sht_char[1] = '0';
	}

	if(sht_char[8] > '4')
	{
		sht_char[7] += 1;
	}
	if(sht_char[7] > '9')
	{
		sht_char[6] += 1;
		sht_char[7] = '0';
	}
	if(sht_char[6] > '9')
	{
		sht_char[6] = '9';
	}
	
	if( (sht_char[0]== '0') && (sht_char[1] < '4'))
	{
		sht_char[0] = '-';
		sht_char[1] = '3'- sht_char[1];
	}
	else if( (sht_char[0]== '0') && (sht_char[1] >= '4'))
	{
		sht_char[0] = ' ';
		sht_char[1] -= 4;
	}

	sht_char[4] = sht_char[3];
	sht_char[3] = '.';
	sht_char[5] = 0;

}

void LCD_write_sht_data(void)
{
	if(sht_ready)
	{
		calc_sht(sht_data,sht_char);
		make_sht_string(sht_char);
		sht_ready = 0;
	}

	LCD_write_time();
	LCD_write_pgm_bmp(0,4,10,2,font16X10+(sht_char[1]-32)*20);
	LCD_write_pgm_bmp(10,4,10,2,font16X10+(sht_char[2]-32)*20);
	LCD_write_pgm_bmp(20,4,10,2,cel);
	LCD_write_pgm_bmp(30,4,10,2,font16X10+('C'-32)*20);

	LCD_write_pgm_bmp(50,4,10,2,font16X10+(sht_char[6]-32)*20);
	LCD_write_pgm_bmp(60,4,10,2,font16X10+(sht_char[7]-32)*20);
	LCD_write_pgm_bmp(70,4,10,2,font16X10+('%'-32)*20);

}

void LCD_write_speed_data(void)
{
	unsigned int tmp=0;
	LCD_write_time();
	speed[5]=0;
	if(GPS_state != 'A')
	{
		LCD_write_english_string(0,4,"   Wait GPS   ");
		LCD_write_english_string(0,5,"              ");
		return;
	}
	LCD_write_english_string(16,4,"        ");

	
	unsigned char i=0;
	while(speed[i])
	{
		LCD_write_pgm_bmp(i*10,4,10,2,font16X10+(speed[i]-32)*20);
		i++;
	}
	tmp = 0;
	for(i=0;i<6;i++)
	{
		if(direction[i] == '.')
			break;
		tmp *= 10;
		tmp += (direction[i]-0x30);
	}
	tmp = (unsigned int)(tmp / 45);
	if (tmp > 7)
		return;
	LCD_write_pgm_bmp(60,4,16,2,arrow+tmp*32);


}

void update_LCD(void)
{
	switch(new_print)
	{
		case GPS_PRINT :
		{
			LCD_write_GPS_data();
			break;
		}
		case SHT_PRINT :
		{
			LCD_write_sht_data();
			break;
		}
		case SPEED_PRINT:
		{
			LCD_write_speed_data();
			break;
		}
	}
}

int main(void)
{
	cli();
	init();
	delay_nms(10);
	LCD_init(); 
	s_connectionreset();
	delay_nms(100);
	LCD_clear();
	sei();
	for(unsigned char i=0;i<10;i++)
	{
		if((!s_measure(sht_data, sht_data+4, 0)) && (!s_measure(sht_data+2, sht_data+5, 1)))
		{
			sht_ready = 1;
			break;
		}
	}

	while(1)
	{
		if(GPS_update)
		{
			second ++;
			if(second > 10)
			{
				second = 0;
				if((!s_measure(sht_data, sht_data+4, 0)) && (!s_measure(sht_data+2, sht_data+5, 1)))
				{
					sht_ready = 1;
				}
			}
			
			update_LCD();
			GPS_update = 0;
			delay_nms(2);
		}
		else if( (key & 0x01))
		{
			new_print++;
			if(new_print > 3)
				new_print = 1;
			LCD_clear();
			LCD_clear();
			update_LCD();
		}
		key = 0x00;
		delay_nms(60);

	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -