📄 2038e1104f9b001d114bb919ad30f862
字号:
#include <stdio.h>
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_uart_regs.h"
#include "sys/alt_irq.h"
#include "Gui.h"
#include <string.h>
#include "io.h"
static alt_u32 SDRAM_FRAMEBUFFER_ADDRESS = (SDRAM_0_BASE + 10000);
char* gps_string;
int string_index = 0;
int section_id = 0;
int temp_index = 0;
//gps信息类型
char* GPS_DATA_TYPE;
//gps中的时间信息
char* GPS_DATA_TIME;
//gps中的状态信息
char* GPS_DATA_STATUS;
//gps中的纬度信息
char* GPS_DATA_LATITUDE;
//gps中的南北半球信息
char* GPS_DATA_NS_HEMISPHERE;
//gps中的经度信息
char* GPS_DATA_LONGITUDE;
//gps中的东西半球信息
char* GPS_DATA_WE_HEMISPHERE;
//gps中的速度信息
char* GPS_DATA_VELOCITY;
//gps中的方位角信息
char* GPS_DATA_POS_ANGLE;
//gps中的日期信息
char* GPS_DATA_DATE;
//gps中的地磁信息
char* GPS_DATA_GEOMAGNETISM;
//gps中的地磁方向信息
char* GPS_DATA_GM_DIRECTION;
void analyse_gps_data(char* string)
{
printf("%s\n",string);
int i;
for(i = 0;i < string_index;i++){
//帧头
if(gps_string[i] == '$'){
section_id = 0;
temp_index = 0;
}
else if(gps_string[i] == 13){
break;
}
else if(gps_string[i] == ','){
section_id++;
switch(section_id){
case 1:
GPS_DATA_TYPE[temp_index] = '\0';
break;
case 2:
GPS_DATA_TIME[temp_index] = '\0';
break;
case 3:
GPS_DATA_STATUS[temp_index] = '\0';
break;
case 4:
GPS_DATA_LATITUDE[temp_index] = '\0';
break;
case 5:
GPS_DATA_NS_HEMISPHERE[temp_index] = '\0';
break;
case 6:
GPS_DATA_LONGITUDE[temp_index] = '\0';
break;
case 7:
GPS_DATA_WE_HEMISPHERE[temp_index] = '\0';
break;
case 8:
GPS_DATA_VELOCITY[temp_index] = '\0';
break;
case 9:
GPS_DATA_POS_ANGLE[temp_index] = '\0';
break;
case 10:
GPS_DATA_DATE[temp_index] = '\0';
break;
case 11:
GPS_DATA_GEOMAGNETISM[temp_index] = '\0';
break;
default:
break;
}
temp_index = 0;
}
else{
switch(section_id){
case 0:
GPS_DATA_TYPE[temp_index] = string[i];
temp_index++;
break;
case 1:
GPS_DATA_TIME[temp_index] = string[i];
temp_index++;
break;
case 2:
GPS_DATA_STATUS[temp_index] = string[i];
temp_index++;
break;
case 3:
GPS_DATA_LATITUDE[temp_index] = string[i];
temp_index++;
break;
case 4:
GPS_DATA_NS_HEMISPHERE[temp_index] = string[i];
temp_index++;
break;
case 5:
GPS_DATA_LONGITUDE[temp_index] = string[i];
temp_index++;
break;
case 6:
GPS_DATA_WE_HEMISPHERE[temp_index] = string[i];
temp_index++;
break;
case 7:
GPS_DATA_VELOCITY[temp_index] = string[i];
temp_index++;
break;
case 8:
GPS_DATA_POS_ANGLE[temp_index] = string[i];
temp_index++;
break;
case 9:
GPS_DATA_DATE[temp_index] = string[i];
temp_index++;
break;
case 10:
GPS_DATA_GEOMAGNETISM[temp_index] = string[i];
temp_index++;
break;
case 11:
GPS_DATA_GM_DIRECTION[temp_index] = string[i];
temp_index++;
break;
default:
break;
}
}
}
GPS_DATA_GM_DIRECTION[temp_index] = '\0';
string_index = 0;
}
void display_gps_information()
{
setColor(GUI_RED);
//gps信息类型
drawString(80,10,GPS_DATA_TYPE);
//gps中的经度信息
if(GPS_DATA_WE_HEMISPHERE == 'W'){
drawString(80,30,"东经");
}
else{
drawString(80,30,"西经");
}
drawString(110,30,GPS_DATA_LONGITUDE);
//gps中的纬度信息
if(GPS_DATA_NS_HEMISPHERE == 'N'){
drawString(80,50,"北纬");
}
else{
drawString(80,50,"南纬");
}
drawString(110,50,GPS_DATA_LATITUDE);
//gps中的日期信息
drawChar(80,70,GPS_DATA_DATE[4]);
drawChar(88,70,GPS_DATA_DATE[5]);
drawCNChar(96,70,"年");
drawChar(110,70,GPS_DATA_DATE[2]);
drawChar(118,70,GPS_DATA_DATE[3]);
drawCNChar(126,70,"月");
drawChar(140,70,GPS_DATA_DATE[0]);
drawChar(148,70,GPS_DATA_DATE[1]);
drawCNChar(156,70,"日");
//gps中的时间信息
drawChar(80,90,GPS_DATA_TIME[0]);
drawChar(88,90,GPS_DATA_TIME[1]);
drawCNChar(96,90,"时");
drawChar(110,90,GPS_DATA_TIME[2]);
drawChar(118,90,GPS_DATA_TIME[3]);
drawCNChar(126,90,"分");
drawChar(140,90,GPS_DATA_TIME[4]);
drawChar(148,90,GPS_DATA_TIME[5]);
drawCNChar(156,90,"秒");
//gps中的速度信息
drawString(80,110,GPS_DATA_VELOCITY);
//gps中的方位角信息
drawString(80,130,GPS_DATA_POS_ANGLE);
//gps中的地磁方向信息
if(GPS_DATA_GM_DIRECTION == 'W'){
drawString(80,150,"向西方向");
}
else if(GPS_DATA_GM_DIRECTION == 'E'){
drawString(80,150,"向东方向");
}
else if(GPS_DATA_GM_DIRECTION == 'N'){
drawString(80,150,"向北方向");
}
else{
drawString(80,150,"向南方向");
}
drawString(136,150,GPS_DATA_GEOMAGNETISM);
}
void receive_gps_string(char gps_code)
{
if(gps_code != 13){
gps_string[string_index] = gps_code;
string_index++;
}
else{
gps_string[string_index] = '\0';
analyse_gps_data(gps_string);
display_gps_information();
}
}
static void handle_uart_keyboard_interrups(void* context, alt_u32 id)
{
char code;
if((IORD_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE)&(0x80)) == 0x80){
code = IORD_ALTERA_AVALON_UART_RXDATA(GPS_UART_0_BASE);
receive_gps_string(code);
}
IOWR_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE, 0x0);
}
void init_uart_keyboard()
{
IOWR_ALTERA_AVALON_UART_CONTROL(GPS_UART_0_BASE, 0x80);
IOWR_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE, 0x0);
alt_irq_register(GPS_UART_0_IRQ,NULL,handle_uart_keyboard_interrups);
}
void init_gps_information()
{
//所有的gps信息字符串
gps_string = malloc(1000);
//GPRMC格式
GPS_DATA_TYPE = malloc(7);
//当前位置的格林尼治时间,格式为hhmmss
GPS_DATA_TIME = malloc(7);
//状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
GPS_DATA_STATUS = malloc(2);
//纬度, 格式为ddmm.mmmm
GPS_DATA_LATITUDE = malloc(10);
//标明南北半球, N 为北半球、S为南半球
GPS_DATA_NS_HEMISPHERE = malloc(2);
//经度,格式为dddmm.mmmm
GPS_DATA_LONGITUDE = malloc(10);
//标明东西半球,E为东半球、W为西半球
GPS_DATA_WE_HEMISPHERE = malloc(2);
//地面上的速度,范围为0.0到999.9
GPS_DATA_VELOCITY = malloc(6);
//方位角,范围为000.0到 359.9 度
GPS_DATA_POS_ANGLE = malloc(6);
//日期, 格式为ddmmyy
GPS_DATA_DATE = malloc(7);
//地磁变化,从000.0到 180.0 度
GPS_DATA_GEOMAGNETISM = malloc(6);
//地磁变化方向,为E 或 W
GPS_DATA_GM_DIRECTION = malloc(2);
}
void init_menu()
{
int i,j;
int raw_data;
for(i = 0;i < 233;i++){
for(j = 0;j < 319;j++){
raw_data = IORD_8DIRECT(CFI_FLASH_0_BASE,i * 957 + j * 3 + 0x1000);
IOWR_8DIRECT(SDRAM_FRAMEBUFFER_ADDRESS,i * 957 + j * 3 + 2,raw_data);
raw_data = IORD_8DIRECT(CFI_FLASH_0_BASE,i * 957 + j * 3 + 1 + 0x1000);
IOWR_8DIRECT(SDRAM_FRAMEBUFFER_ADDRESS,i * 957 + j * 3 ,raw_data);
raw_data = IORD_8DIRECT(CFI_FLASH_0_BASE,i * 957 + j * 3 + 2 + 0x1000);
IOWR_8DIRECT(SDRAM_FRAMEBUFFER_ADDRESS,i * 957 + j * 3 + 1,raw_data);
}
}
setColor(GUI_GREEN);
drawString(10,10,"GPS信息:");
drawString(10,30,"经度:");
drawString(10,50,"纬度:");
drawString(10,70,"日期:");
drawString(10,90,"时间:");
drawString(10,110,"速度:");
drawString(10,130,"方位角:");
drawString(10,150,"地磁信息:");
}
int main()
{
init_lcd();
init_menu();
init_gps_information();
init_uart_keyboard();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -