📄 main.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 + -