//**************************************************** // Kenichi Ogawa // 距離、緯度経度、表示切替 OK! // GPS_test17.c // FOCS XT_PLL8 // 10MHzセラミック発振子(セラロック) // dsPIC30F4012 // MPLAB C30 v3.31 // MPLAB IDE v8.88 // GPSモジュール GT-723F // LCDモジュール 20x4行 SC2004CSLB-XA-GB-K // 時間、直線距離、衛星補足数(S)、HDP表示(H)追加 // (LCD) ----- (PIC) // RS ------- RB4 // EN ------- RB5 // DB4 ------ RB0 // BD5 ------ RB1 // DB6 ------ RB2 // DB7 ------ RB3 // // RE0 切替スイッチ // ボーレート 9600bps test 133,464 // 2013/08 //OK!!!! 連続受信成功 // デジカメ 100- // //**************************************************** //ヘッダファイル #include #include #include #include #include //**************************************************** //コンフィギュレーション _FOSC(CSW_FSCM_OFF & XT_PLL8); //10MHzセラロックを使っているのでクロックは80MHz。 _FWDT(WDT_OFF); _FBORPOR(PBOR_ON & BORV20 & PWRT_64 & MCLR_EN); _FGS(CODE_PROT_OFF); //**************************************************** //UARTの設定パラメータ unsigned int config1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD; unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR; //unsigned int config3 = UART_DIS; //**************************************************** #define CPU_CLOCK 10000000L #define CPU_PLL 8 #define FCY (CPU_CLOCK * CPU_PLL / 4) #include #define LCD_RS _LATB4 #define LCD_EN _LATB5 #define LCD_DATA LATB void lcd_send4(unsigned char); void lcd_cmd(unsigned char); void lcd_asci(unsigned char); void lcd_clear(); void lcd_goto(unsigned char); void lcd_4012_init(); void lcd_init(); void putch(unsigned char); void lcd_strobe(); char ken_getch(); char temp,cx,c; char string[40]; int i; //bit z; double gps_hokui_d,d_hokui,gen_hokui,m_hokui,sa_hokui,my_hokui; double gps_tokei_d,d_tokei,gen_tokei,m_tokei,sa_tokei,my_tokei; double sa_km_hokui,sa_m_hokui,rd_hokui; double d_km_tokei,sa_km_tokei_1,sa_km_tokei_2,sa_km_tokei_3,sa_m_tokei; //*************** double d_km_hokui,idoen; double chokusen_km; double ken_cos; // cos(rd_hokui) double m1_hokui,m2_hokui,m3_hokui,s_hokui; double m1_tokei,m2_tokei,m3_tokei,s_tokei; #define my_hokui 35.282383 #define my_tokei 136.816991 // 136.816991 #define d_km_hokui 111.135 // 1度=111.135km //#define idoen 40076.5 //メイン関数 int main(void) { char c1,c2; char gps_data[55]; char gpgga[] = "GPGGA"; char gps_hokui[12],gps_tokei[12]; char time_h[3],time_m[3],time_s[3]; char sate[3],hdp[5]; int h_int; // 時間の数値 char Km[] = " Km"; char Nsa[] = "Nsa: "; char Esa[] = "Esa: "; char Choku[] = "Choku: "; char ken[] = " I love Tamiko.Ken"; TRISE = 0x01; // RE0=IN PORTE = 0x0E; lcd_4012_init(); lcd_init(); lcd_clear(); __delay_ms(2); PORTE = 0xFE; // LED(Y) 消灯 //=================================================== //UART初期設定 //速度は9600bps Ubrg=(FCY/(16*BAUD))-1 // (20000000/153600)-1=129.2 // Ubrg=(20000000/(16*BAUD))-1=129.2 OpenUART1(config1,config2,129);// ***** //=================================================== //メインループ while(1) { i = 0; c1 = ken_getch(); while( c1 != '$') { c1 = ken_getch(); } while(i < 54 ) { c2 = ken_getch(); gps_data[i] = c2; i++; } gps_data[i] = 0x00; CloseUART1(); // ************* if (strncmp(gps_data,gpgga,5) == 0) { strncpy(gps_hokui,gps_data+17,9); strncpy(gps_tokei,gps_data+29,10); strncpy(time_h,gps_data+6,2); strncpy(time_m,gps_data+8,2); strncpy(time_s,gps_data+10,2); strncpy(sate,gps_data+44,2); strncpy(hdp,gps_data+47,4); gps_hokui_d = atof(gps_hokui); d_hokui = (int)gps_hokui_d / 100; // m_hokui = (gps_hokui_d - d_hokui * 100) / 60; m1_hokui = (gps_hokui_d - d_hokui*100); m_hokui = m1_hokui / 60; gen_hokui = d_hokui + m_hokui; m2_hokui = (int)m1_hokui; m3_hokui = m1_hokui - m2_hokui; s_hokui = m3_hokui * 60; sa_hokui = gen_hokui - my_hokui; sa_km_hokui = d_km_hokui * sa_hokui; sa_m_hokui = 1000 * sa_km_hokui; // ------------------------------- gps_tokei_d = atof(gps_tokei); d_tokei = (int)gps_tokei_d / 100; // m_tokei = (gps_tokei_d - d_tokei * 100) / 60; m1_tokei = gps_tokei_d - d_tokei * 100; m_tokei = m1_tokei / 60; gen_tokei = d_tokei + m_tokei; m2_tokei = (int)m1_tokei; m3_tokei = m1_tokei - m2_tokei; s_tokei = m3_tokei * 60; sa_tokei = gen_tokei - my_tokei; rd_hokui = 0.0174532925 * gen_hokui; ken_cos = cos(rd_hokui); sa_km_tokei_1 = 40076.5 * ken_cos; sa_km_tokei_2 = sa_km_tokei_1 / 360; sa_km_tokei_3 = sa_km_tokei_2 * sa_tokei; // ----- cyokusen --------------------------- chokusen_km = pow(sa_km_hokui,2) + pow(sa_km_tokei_3,2); chokusen_km = sqrt(chokusen_km); // ------ Time ---------------------------- h_int = atoi(time_h); if (h_int <= 14) { h_int = h_int + 9; // UST 0-14 } else { h_int = h_int - 15; // UST 15-23 } if (h_int > 11) { h_int = h_int - 12; // 12時間制 } // ------------------------------ lcd_clear(); lcd_goto(0X80); // 1行目 sprintf(string,"%2d",h_int); i = 0; while(string[i] != '\0') { c = string[i]; putch(c); i++; } c = ':'; putch(c); // ----------------- for (i=0;i<2;i++) { c = time_m[i]; putch(c); } c = ':'; putch(c); // ---------------- for (i=0;i<2;i++) { c = time_s[i]; putch(c); } lcd_goto(0x89); c = 'S'; putch(c); c = ':'; putch(c); for (i=0;i<2;i++) { c = sate[i]; putch(c); } lcd_goto(0x8E); c = 'H'; putch(c); c = ':'; putch(c); for (i=0;i<3;i++) { c = hdp[i]; putch(c); } // ------------------------------- if (_RE0) // _RE="1" 距離表示、"0" 緯度経度表示 { lcd_goto(0xC1); // 2行目 for (i=0;i<7;i++) { c = Choku[i]; putch(c); } sprintf(string,"%4.3f",chokusen_km); i = 0; while(string[i] != '\0') { c = string[i]; putch(c); i++; } for (i=0;i<3;i++) { c = Km[i]; putch(c); } // ------------------------------ lcd_goto(0x95); // 3行目 for (i=0;i<5;i++) { c = Nsa[i]; putch(c); } sprintf(string,"%+4.3f",sa_km_hokui); i = 0; while(string[i] != '\0') { c = string[i]; putch(c); i++; } for (i=0;i<3;i++) { c = Km[i]; putch(c); } // ---------------------------- lcd_goto(0xD5); // 4行目 for (i=0;i<5;i++) { c = Esa[i]; putch(c); } sprintf(string,"%+4.3f",sa_km_tokei_3); // i = 0; while(string[i] != '\0') { c = string[i]; putch(c); i++; } for (i=0;i<3;i++) { c = Km[i]; putch(c); } } //if THEN ELSE else { lcd_goto(0xC2); c = 'N'; putch(c); c = ':'; putch(c); c = ' '; putch(c); putch(c); sprintf(string,"%2d",(int)d_hokui); i = 0; while(string[i] !='\0') { c = string[i]; putch(c); i++; } c = 0xDF; putch(c); //while(1);OK sprintf(string,"%2d",(int)m2_hokui); i = 0; while(string[i] !='\0') { c = string[i]; putch(c); i++; } c = 0x27; putch(c); //while(1);OK sprintf(string,"%02.3f",s_hokui); i = 0; while(string[i] !='\0') { c = string[i]; putch(c); i++; } c = '"'; putch(c); //while(1);OK // ------------------------- lcd_goto(0x96); c = 'E'; putch(c); c = ':'; putch(c); c = ' '; putch(c); sprintf(string,"%3d",(int)d_tokei); i = 0; while(string[i] !='\0') { c = string[i]; putch(c); i++; } c = 0xDF; putch(c); //while(1); sprintf(string,"%2d",(int)m2_tokei); i = 0; while(string[i] !='\0') { c = string[i]; putch(c); i++; } c = 0x27; putch(c); sprintf(string,"%02.3f",s_tokei); i = 0; while (string[i] !='\0') { c = string[i]; putch(c); i++; } c = '"'; putch(c); // ------------------------- lcd_goto(0xD6); i = 0; while(ken[i] !='\0') { c = ken[i]; putch(c); i++; } } // else // ----------------------------- } // if OpenUART1(config1,config2,129); // 9600bps ** } //while(1) } // main //*************************************************** void lcd_send4(unsigned char c) { LCD_DATA = (LCD_DATA & 0xF0) | c; lcd_strobe(); } //----- コマンド処理 ------------------------------------ void lcd_cmd(unsigned char cmd) { LCD_RS = 0; //コマンド LCD_DATA = (LCD_DATA & 0xF0) | ((cmd >> 4) & 0x0F);// 上位ビット lcd_strobe(); LCD_DATA = (LCD_DATA & 0xF0) | (cmd & 0x0F);// 下位ビット lcd_strobe(); __delay_us(50); } //------ 文字データ処理 --------------------------------- void lcd_asci(unsigned char cmd) { LCD_RS = 1; LCD_DATA = (LCD_DATA & 0xF0) | ((cmd >> 4) & 0x0F);// 上位ビット lcd_strobe(); LCD_DATA = (LCD_DATA & 0xF0) | (cmd & 0x0F);// 下位ビット lcd_strobe(); __delay_us(50); } //------------------------------------- void lcd_goto(unsigned char pos) { lcd_cmd(pos); } //============================================ void lcd_clear() { lcd_cmd(0x1); __delay_ms(15); } //============================================== void lcd_strobe() { __delay_us(1); LCD_EN = 1; __delay_us(2); LCD_EN = 0; } //================================================ char ken_getch() { while(!DataRdyUART1()); temp = ReadUART1(); cx = temp; return(cx); } // ---------------------------------------------- void putch(unsigned char c) { lcd_asci(c); } //---------------------------------------------- void lcd_4012_init() { TRISB = 0x00; PORTB = 0x00; LATB = 0x00; } //------------------------------- void lcd_init() { __delay_ms(15); LCD_RS = 0; LCD_EN = 0; lcd_send4(0x03); __delay_ms(5); lcd_send4(0x03); __delay_ms(1); lcd_send4(0x03); __delay_ms(1); lcd_send4(0x02); __delay_ms(1); lcd_cmd(0x28); // ファンクション DL="0" 4BIT設定 lcd_cmd(0x08); // 表示ON/OFF コントロール D="0" 表示 OFF , C="0" カーソル OFF lcd_cmd(0x0C); // 表示ON/OFF コントロール D="1" 表示 ON , C="0" カーソル OFF lcd_cmd(0x06); // エントリー モード I/D="1" アドレスを+1 カーソルを右へ lcd_cmd(0x01); // 表示クリア __delay_ms(2); }