//********************************************************************** /*    『簡易GPSデータ表示』 */ //********************************************************************** #define LED PORTA.F4 #define SW PORTA.F5 #define ON 0 #define OFF 1 #define CR 0x0D #define LF 0x0A #define HEADER_SIZE 8 #define DATA_SIZE 12 //********************************************************************** unsigned short flg, len; unsigned short hd[HEADER_SIZE], utc[DATA_SIZE], latitude[DATA_SIZE], longitude[DATA_SIZE]; unsigned short quality[4], satellites[4]; /* Format: $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>,*<13> Example: $GPGGA,104549.04,2447.2038,N,12100.4990,E,1,06,01.7,00078.8,M,0016.3,M,,*5C */ void interrupt() { unsigned short rd; // LED = ON; while (Usart_Data_Ready()) { rd = Usart_Read(); if (rd == LF) { len = 0; continue; } // switch (flg) { case 0: hd[len] = rd; len++; if (len == 7) { len = 0; if (strncmp(hd, "$GPGGA,", 7) == 0) { flg = 1; } } break; case 1: //UTC(Coordinated Universal Time 協定世界時)、日本標準時(Japan Standard Time, JST)+9時間の時差 if (rd == ',') { utc[len] = 0x00; len = 0; flg = 2; } else { utc[len] = rd; len++; } break; case 2: if (rd == ',') { latitude[len] = 0x00; len = 0; flg = 3; } else { latitude[len] = rd; len++; } break; case 3: if (rd == ',') { len = 0; flg = 4; } break; case 4: if (rd == ',') { longitude[len] = 0x00; len = 0; flg = 5; } else { longitude[len] = rd; len++; } break; case 5: if (rd == ',') { len = 0; flg = 6; } break; case 6: if (rd == ',') { quality[len] = 0x00; len = 0; flg = 7; } else { quality[len] = rd; len++; } break; case 7: if (rd == ',') { satellites[len] = 0x00; len = 0; flg = 8; } else { satellites[len] = rd; len++; } break; } } LED = OFF; }//~ //********************************************************************** void Usart_Write_String(char *str) { unsigned short i; i = 0; while (str[i] != 0x00) { USART_Write(str[i]); i++; } }//~ //********************************************************************** unsigned short tmp[12], buf[12]; void secConv(char* msg) // dddmm.mmmm → ddd.mmssss(やまおたく形式) { char *p; float f; int i; // p = strchr(msg, '.'); f = atof(p); f = f * 6000.0; WordToStr(f, tmp); if (tmp[1] == ' ') tmp[1] = '0'; if (tmp[2] == ' ') tmp[2] = '0'; if (tmp[3] == ' ') tmp[3] = '0'; *(p) = *(p - 1); *(p - 1) = *(p - 2); *(p - 2) = '.'; *(p + 1) = 0x00; strcat(p + 1, &tmp[1]); } //********************************************************************** void main() { short mode, i; // // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000000; // A/D変換は使用しない。 // ポートを初期化する。 //ポートの設定 TRISA = 0b11100000; TRISB = 0b00000100; //変数の初期化 flg = 0; len = 0; mode = 1; //LCDの初期化 Lcd_Custom_Config(&PORTA,3,2,1,0,&PORTB,4,6,7); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); //RS232Cの初期化 Usart_Init(9600); // 割り込みを許可する。 PIE1.RCIE = 1; PIR1.RCIF = 0; INTCON.PEIE = 1; INTCON.GIE = 1; // Lcd_Custom_Out(1, 1, "WGS-84 set!"); while (1) { if (flg != 8) continue; flg = 0; Usart_Write_String("$PSRF106,21*0F\r\n"); //測地系:WGS-84に設定 break; } Lcd_Custom_Cmd(LCD_CLEAR); // while (1) { //$GPGGAデータを受信していれば、内容を表示する。 if (flg == 8) { if ((SW == 1) && (mode == 0)) { mode = 1; Lcd_Custom_Cmd(LCD_CLEAR); } if ((SW == 0) && (mode == 1)) { mode = 0; Lcd_Custom_Cmd(LCD_CLEAR); } // Lcd_Custom_Chr(1, 14, 0xFF); // if (mode == 1) { secConv(latitude); Lcd_Custom_Out(1, 1, "N= "); Lcd_Custom_Out(1, 4, latitude); // secConv(longitude); Lcd_Custom_Out(2, 1, "E="); Lcd_Custom_Out(2, 3, longitude); } else { tmp[8] = 0x00; tmp[7] = utc[5]; tmp[6] = utc[4]; tmp[5] = ':'; tmp[4] = utc[3]; tmp[3] = utc[2]; tmp[2] = ':'; utc[2] = 0x00; i = atoi(utc) + 9; i = i < 24 ? i : i - 24; ByteToStr(i, buf); tmp[1] = buf[2]; tmp[0] = buf[1]; Lcd_Custom_Out(1, 1, tmp); } // Lcd_Custom_Out(1, 16, quality); // Lcd_Custom_Out(2, 15, satellites); // Lcd_Custom_Chr(1, 14, '-'); // len = 0; flg = 0; } } }//~! //**********************************************************************