/***********************************************************************/ /* */ /* FILE :MDI_adaptor.c */ /* DATE :Tue, Jan 27, 2009 */ /* DESCRIPTION :モデムダイアルインアダプタープログラム */ /* CPU TYPE :H8/3664F */ /* */ /* PROGRAMD by T.AZAMI */ /* */ /* 2009/2/5 受信部以外動作確認OK                 */ /* 2009/2/6 EEPROMデータ保存部作成 */ /* 2009/2/24 時計部分を追加 */ /* 2009/2/26 受信部完成、動作確認 */ /* 2009/2/26 TEL A B からの発信ルーチン作成 */ /* 2009/2/27 DIデータ着信による振り分け完成、但しTELB着信時おかしい */ /* 2009/3/1 タイマWによるモデム受信タイムアウト追加 */ /* 2009/3/3 全ての動作確認OK 一応 実験ベースで完成! */ /***********************************************************************/ void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif #include #include "iodefine.h" #include "DectoBin.h" #include "LCD.h" #include "IIC_EEPROM.h" #include "SCI_232C.h" #define LOW 0 #define HI 1 #define OUTPUT 0 #define INPUT 1 #define CRLF 1 #define NO_CRLF 0 #define IO_RL1 IO.PDR1.BIT.B0 // LOWでOFF #define IO_RL2 IO.PDR1.BIT.B1 #define IO_RL3 IO.PDR1.BIT.B2 #define IO_BUZZER IO.PDR1.BIT.B4 #define IO_LED IO.PDR1.BIT.B5 #define IO_SW1 IO.PDRB.BIT.B1 #define IO_SW2 IO.PDRB.BIT.B2 #define IO_SW3 IO.PDRB.BIT.B3 #define IO_HANTEN IO.PDRB.BIT.B4 // 反転検出 1:正転 0:反転 #define IO_HOOK IO.PDRB.BIT.B5 // 受話器検出  1:置く 0:上げる #define IO_TELB IO.PDRB.BIT.B6 // TEL_B検出 1:置く 0:上げる char MY_number[16]; // 自局ダイアルイン番号 char ND_number[16]; // 受信着信番号 char DI_number[16]; // 受信ダイアルイン番号 unsigned char RX_count; // モデム受信時使用 受信文字数 unsigned char RX_buf[128]; // モデム受信時使用 バッファ unsigned int RX_check; unsigned int TM_count; // タイマ割り込みカウント用変数 unsigned char EEp_buf; // EEPROM読み書き用変数 unsigned long EEp_adrs; // EEPROM読み書き用アドレス unsigned char Disp_line; // 着信履歴表示行 unsigned char MENU_no; // メニュー番号 unsigned int TMW_ovf_counter; // Timer W オーバーフローカウンタ unsigned int TM_timeout; char MENU_str[10][17] = { // メニュー表示用変数 "0:プログラム ショキカ ", "1:DI num ニュウリョク", "2:キロク ヒヨウジ ", "3:リレーセイギョ テスト ", "4:ポートモニター テスト ", "5:ジュシン ゼンデータ", "6:EEPROM ショキカ ", "7:EEPROM ダンプ ", "8:EEPROM ライト ", "9:CLOCK adjust " }; volatile char hex_head[53] = "Adrs +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\0"; volatile unsigned char T_hour,T_min,T_sec; // 時間表示用変数 volatile char Msg_Clk[] = "12:12"; // 時刻表示文字列 //------------------------------------------------------------------- // 初期設定 //------------------------------------------------------------------- void EEPROM_reset( void ){ // EEPROMの初期化 全て0で埋める EEp_buf = 0; for(EEp_adrs=0x00; EEp_adrs<0xFF; EEp_adrs++ ){ Write_byte_EEPROM( EEp_adrs , EEp_buf ); } Write_byte_EEPROM( 0xF0 , 1 ); // 着信履歴表示行保存として0xF0番地のみ1を書き込む } void Initialize( void ){ int i,j; IO.PCR1 = 0xFF; // ポート1は出力 // ポートBは入力のみなので設定なし IO_LED = HI; IO_RL1 = LOW; IO_RL2 = LOW; IO_RL3 = LOW; LCD_init(); // LCDモジュールのイニシャライズ LCD_cursol(1); // カーソル,ブリンク OFF SCI_init(); // シリアル通信のイニシャライズ EEPROM_init(); // I2Cバスのイニシャライズ EEp_adrs = 0x0F0; // EEPROMのチェック EEp_buf = Read_byte_EEPROM( EEp_adrs ); if( EEp_buf>0x0E ){ // EEPROM F0番地をチェック EEPROM_reset(); } for(EEp_adrs=0; EEp_adrs<17; EEp_adrs++){ // 登録してあるMY_numberを読み込む EEp_buf = Read_byte_EEPROM( EEp_adrs ); MY_number[EEp_adrs] = EEp_buf; } Disp_line = Read_byte_EEPROM( 0xF0 ); // 最終表示行を読み込む TM_timeout = 0x50; // 約2.7秒でタイムアウトとなるように設定 // 時計用カウンタ タイマA 設定 TA.TMA.BYTE = 0x08; // 1ms 毎にTimer A が割込みをかけるよう設定(秒のカウント) b00001000 IRR1.BIT.IRRTA = 0; // Timer A 割込みフラグのリセット IENR1.BIT.IENTA = 1; // 割込み許可 // MODEMタイムアウト用カウンタ タイマW 設定 TW.TCRW.BYTE = 0x30; // タイマWコントロールレジスタ クロックΦ1/8 TW.TSRW.BIT.OVF = 0; // オーバーフローフラグ クリア 32.76msでオーバーフロー TW.TMRW.BIT.CTS = 0; // カウンタ停止 TW.TIERW.BIT.OVIE = 1; // OVFフラグによる割り込み許可 } //------------------------------------------------------------------- // その他処理 //------------------------------------------------------------------- /* 数値から文字列に変換(Char型)*/ void Itostring(int digit, unsigned long data, char *buffer){ char i; buffer += digit; //文字列の最後 for(i=digit; i>0; i--) //最下位桁から上位へ { buffer--; //ポインター1 *buffer = (data % 10) + '0'; //その桁数値を文字にして格納 data = data / 10; //桁-1 } } void Beep( unsigned int k ){ // Beep 引数は長さ(100程度) unsigned int i,j; for(i=0;i RS232C出力 -------------------------------------------------------------------*/ void EEPROM_dump_256( void ){ unsigned char buf; unsigned int adrs; SCI_print( hex_head , NO_CRLF); adrs = 0; while( adrs<256 ) { buf = Read_byte_EEPROM( adrs ); if( (adrs % 16) == 0 ){ SCI_crlf(); SCI_print_hex( 4, adrs, NO_CRLF ); SCI_print( " ",NO_CRLF ); } SCI_print_hex( 2, buf, NO_CRLF ); SCI_print( " ",NO_CRLF ); adrs++; } SCI_crlf(); } /*------------------------------------------------------------------- EEPROM アドレスに1バイト書き込む --> RS232C入出力 -------------------------------------------------------------------*/ void EEPROM_1byte_write( void ){ unsigned char er; unsigned long buf; char strbuf[30]; LCD_clear(); LCD_print("EEPROMバイトライト"); LCD_lineprint( 1,2,"in/out = SCI"); SCI_print("EEPROM : byte write mode.", CRLF ); SCI_print("adrs=0xff -> end of this test", CRLF ); while( 1 ){ do{ SCI_print( "adrs(hex) = ", NO_CRLF ); SCI_rx_clear(); buf = SCI_input_num( 16, CRLF ); if( buf == 0xff ) goto write_end; if( buf>0xFF ){ er = 1; }else{ SCI_print( "Input adrs = 0x", NO_CRLF ); SCI_print_hex( 2, buf, CRLF ); EEp_adrs = buf; er = 0; } }while( er==1 ); do{ SCI_print( "data(hex) = ", NO_CRLF ); SCI_rx_clear(); buf = SCI_input_num( 16, CRLF ); if( buf>0xFF ){ er = 1; }else{ SCI_print( "Input data = 0x", NO_CRLF ); SCI_print_hex( 2, buf, CRLF ); EEp_buf = buf; er = 0; } }while( er==1 ); Write_byte_EEPROM( EEp_adrs , EEp_buf ); SCI_crlf(); } write_end: Beep(100); EEPROM_dump_256(); } //------------------------------------------------------------------- // コンソールメニュー 1  自局電話番号入力 //------------------------------------------------------------------- void Menu_input_my_number( void ){ char col,num; Beep(100); LCD_clear(); LCD_print("TEL No.?"); Wait( 500 ); col = 0; num = 0x30; while( 1 ){ LCD_locate( col+1, 2 ); LCD_data( num ); if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 1000 ); if( IO_SW1 == LOW ){ // SW1の長押で設定を終了 MY_number[col] = num; MY_number[col+1] = 0; break; }else{ MY_number[col] = num; // SW1で桁移動 col++; } } if( IO_SW2 == LOW ){ // UP Beep( 100 ); Wait( 500 ); num++; if( num == 0x3A ){ num = 0x30; } } if( IO_SW3 == LOW ){ // DOWN Beep( 100 ); Wait( 500 ); num--; if( num == 0x2F ){ num = 0x39; } } } LCD_clear(); LCD_lineprint( 1,1, "DIswitch tel no"); LCD_lineprint( 1,2, MY_number ); EEp_adrs=0; // EEPROMへの登録データ書き込み for(col=0; col<16; col++){ Write_byte_EEPROM( EEp_adrs + col , MY_number[col] ); } Beep( 500 ); Wait( 2000 ); } //------------------------------------------------------------------- // コンソールメニュー 2  履歴表示 //------------------------------------------------------------------- /* 履歴表示 サブルーチン 表示する先頭アドレスと履歴番号を引数とする */ void LCD_disp_history( int adrs , char num){ unsigned char col; int buf; char msg_hist_1[] = "ND- 12:12"; char msg_hist_2[] = " "; LCD_clear(); Itostring( 2, num, msg_hist_1+3 ); buf = Read_byte_EEPROM( adrs+0x0E ); // 時 読み込み Itostring( 2, buf, msg_hist_1+6 ); buf = Read_byte_EEPROM( adrs+0x0F ); // 分 読み込み Itostring( 2, buf, msg_hist_1+9 ); LCD_lineprint( 1,1,msg_hist_1 ); // 1行目表示 SCI_print("adrs = ",NO_CRLF); SCI_print_hex( 2,adrs,NO_CRLF ); SCI_print(" num = ",NO_CRLF); SCI_print_hex( 2,adrs,CRLF ); col = 0; for(col=0; col<14; col++){ Wait(50); // ループ中にウエイトを入れないと、正常に読み出せない buf = Read_byte_EEPROM( adrs+col ); if( buf < 0x30 ) buf=0x20; // 制御文字だった場合はスペース msg_hist_2[col] = buf; } LCD_lineprint( 1,2,msg_hist_2 ); // 2行目表示 } void Menu_disp_history( void ){ char adrs, num; Beep(100); adrs = Disp_line << 4; num = 10; LCD_disp_history( adrs, num ); // 最新のものを表示 while(1){ if( IO_SW1 == LOW ) break; if( IO_SW2 == LOW ){ // 1つ前のもの Beep( 100 ); Wait( 500 ); adrs = adrs-0x10; if( adrs == 0 ) adrs = 0xA0; if( num == 0 ){ num = 9; }else{ num--; } LCD_disp_history( adrs, num ); } if( IO_SW3 == LOW ){ // 1つ後ろのもの Beep( 100 ); Wait( 500 ); adrs = adrs+0x10; num++; if( adrs > 0xA0 ) adrs = 0x10; if( num == 10 ) num = 0; LCD_disp_history( adrs, num ); } } } //------------------------------------------------------------------- // コンソールメニュー 3  ハードウェア リレー切替テスト //------------------------------------------------------------------- void Menu_testmode_relay(void){ unsigned char c; Beep(100); LCD_clear(); LCD_lineprint( 1,1, "リレーテスト SW1,2,3"); LCD_lineprint( 1,2, " off off off"); IO_RL1 = LOW; IO_RL2 = LOW; IO_RL3 = LOW; while(1){ if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); if( IO_RL1 == LOW ){ IO_RL1 = HI; LCD_lineprint( 2,2,"on "); }else{ IO_RL1 = LOW; LCD_lineprint( 2,2,"off"); } if( IO_SW1 == LOW ){ Wait( 500 ); if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); break; // IO_SW1長押で終了 } } } if( IO_SW2 == LOW ){ Beep( 100 ); Wait( 500 ); if( IO_RL2 == LOW ){ IO_RL2 = HI; LCD_lineprint( 7,2,"on "); }else{ IO_RL2 = LOW; LCD_lineprint( 7,2,"off"); } } if( IO_SW3 == LOW ){ Beep( 100 ); Wait( 500 ); if( IO_RL3 == LOW ){ IO_RL3 = HI; LCD_lineprint( 12,2,"on "); }else{ IO_RL3 = LOW; LCD_lineprint( 12,2,"off"); } } } IO_RL1 = LOW; IO_RL2 = LOW; IO_RL3 = LOW; } //------------------------------------------------------------------- // コンソールメニュー 4  ハードウェア ポート状況モニタ //------------------------------------------------------------------- void Menu_testmode_portmonitor( void ){ Beep(100); LCD_clear(); LCD_print("ポートジョウキョウモニタ"); while(1){ if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); break; } if( IO_HANTEN ){ LCD_lineprint( 1,2,"1off" ); }else{ LCD_lineprint( 1,2,"0on " ); } if( IO_HOOK ){ LCD_lineprint( 6,2,"1off" ); }else{ LCD_lineprint( 6,2,"0on " ); } if( IO_TELB ){ LCD_lineprint( 11,2,"1off" ); }else{ LCD_lineprint( 11,2,"0on " ); } } } //------------------------------------------------------------------- // コンソールメニュー 5  全モデム受信データ --> 232Cへ表示 //   (モデム受信後、バッファに残っているデータを書き出す) //------------------------------------------------------------------- void Menu_testmode_modemdatadisplay( void ){ unsigned char buf; unsigned int chk; unsigned char i; SCI_print( "MODEM receive data", CRLF ); for(i=0; i<=RX_count; i++){ SCI_print_dec( i, NO_CRLF); SCI_print( " : 0x", NO_CRLF ); SCI_print_hex( 2, RX_buf[i], NO_CRLF ); SCI_print( " -- ", NO_CRLF ); if(( RX_buf[i] > 31 ) && ( RX_buf[i] < 127 )){ //制御文字だった場合は表示しない SCI_tx( RX_buf[i] ); }else{ SCI_print( "* ", NO_CRLF ); } SCI_crlf(); } SCI_print( "--END--", CRLF ); Beep(500); } //------------------------------------------------------------------- // 時刻設定 //------------------------------------------------------------------- void Time_adjust( void ) { Beep(100); IENR1.BIT.IENTA = 0; // タイマA割込み停止 LCD_clear(); LCD_print("TIME adjust"); Time_disp(); // 時刻表示 Wait( 500 ); while( 1 ){ // 時-設定 if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); break; } if( IO_SW2 == LOW ){ // UP Beep( 100 ); Wait( 500 ); T_hour++; if( T_hour == 24 ){ T_hour = 0; } } if( IO_SW3 == LOW ){ // DOWN Beep( 100 ); Wait( 500 ); T_hour--; if( T_hour < 0 ){ T_hour = 23; } } Time_disp(); } while( 1 ){ // 分-設定 if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); break; } if( IO_SW2 == LOW ){ // UP Beep( 100 ); Wait( 500 ); T_min++; if( T_min == 60 ){ T_min = 0; } } if( IO_SW3 == LOW ){ // DOWN Beep( 100 ); Wait( 500 ); T_min--; if( T_min < 0 ){ T_min = 59; } } Time_disp(); } IENR1.BIT.IENTA = 1; // タイマA割込み許可(秒カウント開始) Beep( 500 ); Wait( 2000 ); } //---------------------------------------------------------------------------- // TEL A-B 切替判定 //   (ダイアルインデータと登録データを比較して、着信ポートを切り替える) //---------------------------------------------------------------------------- void Output_control(void){ char i = 0; char flag = 1; while( MY_number[i] != 0 ){ if( MY_number[i] != DI_number[i] ){ flag = 0; // ダイアルイン != 登録でフラグをクリア break; } i++; } if( flag ){ SCI_print( "DI = Me. -> TEL B",CRLF); // TEL B に切替 IO_RL3 = HI; Wait( 50 ); IO_RL2 = HI; Wait( 50 ); }else{ // TEL A をそのまま SCI_print( "DI not Me",CRLF); } } //---------------------------------------------------------------------------- // モデム受信ルーチン:ナンバーディスプレイ履歴->EEPROM保存 //---------------------------------------------------------------------------- void Modem_data_to_eeprom( void ){ char i; Disp_line++; if( Disp_line == 0x0B ) Disp_line = 0x01; i = 0; do{ EEp_adrs = Disp_line << 4; EEp_adrs = EEp_adrs + i; Write_byte_EEPROM( EEp_adrs , ND_number[i] ); i++; } while( ND_number[i] != 0 ); Write_byte_EEPROM( EEp_adrs + 0x0E , T_hour ); Write_byte_EEPROM( EEp_adrs + 0x0F , T_min ); Write_byte_EEPROM( 0xF0 , Disp_line ); } //---------------------------------------------------------------------------- // モデム受信ルーチン:データ解析 //---------------------------------------------------------------------------- void Modem_data_analyze( void ){ unsigned char b,c,i,j,flag; c = 0; flag=0; for(j=0; j<15; j++){ // ND_number[] をクリアする ND_number[j] = 0; DI_number[j] = 0; } while ( c < 127 ){ if( RX_buf[c] == 0x02 ){ // 最初のSTXを検出 c++; b = RX_buf[c]; // サービス種別 c++; b = RX_buf[c]; // 以後の内容長 c++; flag=1; break; } c++; } if( flag ){ i = b + c; while( c < i ){ if( RX_buf[c] == 0x02 ){ // ナンバーディスプレイデータ 発信者番号 c++; b = RX_buf[c]; // 内容長 c++; for( j=0; j TM_timeout ){ RX_count = 0; TW.TMRW.BIT.CTS = 0; // カウンタ停止 goto RCV_END; } } if (SCI3.SSR.BIT.RDRF == 1){ //受信データが正常にRDRレジスタに転送された時 buf = SCI3.RDR; SCI3.SSR.BIT.RDRF = 0; //フラグのクリア }else{ //エラー時の処理 SCI3.SSR.BYTE &= 0xC7; //b11000111 エラーフラグをクリア buf = 0xFF; //エラー時は0xFFを返す } //buf = SCI_rx(); //SCI_tx(buf); RX_buf[RX_count] = buf; chk = chk << 8; chk = chk | buf; //if( chk == 0x1003 ) goto RCV_END; // DLE-ETXの並びで受信完了 if( buf == 0x03 ) goto RCV_END; RX_count++; } RCV_END: SCI_print( "rcv data end.", CRLF ); buf=0; return RX_count; // タイムアウト時 0 } //---------------------------------------------------------------------------- //   メニュー入力サブルーチン //---------------------------------------------------------------------------- void MENU_mode( void ){ MENU_no = 0; LCD_clear(); LCD_lineprint( 1,1, "MENU MODE" ); LCD_lineprint( 1,2, MENU_str[MENU_no] ); while(1){ if( IO_SW1 == LOW ){ Beep( 100 ); Wait( 500 ); break; } if( IO_SW2 == LOW ){ Beep( 100 ); Wait( 500 ); MENU_no++; if( MENU_no == 10 ){ MENU_no = 0; } LCD_lineprint( 1,2, MENU_str[MENU_no] ); } if( IO_SW3 == LOW ){ Beep( 100 ); Wait( 500 ); if( MENU_no == 0 ){ MENU_no = 10; } MENU_no--; LCD_lineprint( 1,2, MENU_str[MENU_no] ); } } } /***************************************************************************** メインルーチン *****************************************************************************/ void main(void){ unsigned char flag,i,j; start: Initialize(); if( MY_number[0] == 0 ){ // 初期設定(EEPROMの登録)がされていない場合の処理 LCD_print( "ショキセッテイヲシテクダサイ" ); Beep( 5000 ); Menu_input_my_number(); Wait( 3000 ); goto start; } LCD_lineprint( 1,1, "MDI_adaptor v13" ); // オープニングメッセージ LCD_lineprint( 1,2, "Me:" ); LCD_lineprint( 4,2, MY_number ); Beep( 5000 ); MENU_no = 0; flag = 0; Time_disp(); waiting: Beep(100); IO_RL1 = LOW; // リレー断(電話側) //Hanten_check(); // 接続されている極性をチェックする Disp_taiki(); // LCD待機画面表示 while( 1 ){ /*----- 着信の場合の処理 -----*/ if( IO_HANTEN == 0) { // 局線が正転の場合ループする Wait( 100 ); // チャタリング除去待ち if( IO_HANTEN == 0 ){ SCI_print("HANTEN detect.", CRLF ); LCD_lineprint( 1,1, "MODEM " ); Wait( 400 ); // 反転後モデム動作開始までのウェイト IO_RL1 = HI ; // リレーをモデム側に切替 Rcv_modem(); // モデム受信ルーチン IO_RL1 = LOW; Modem_data_analyze(); // 受信データを分解、解析する Output_control(); // 受信データに基づき、TEL A-Bの切替をする LCD_lineprint( 1,1, "ND: " ); // LCD表示 LCD_lineprint( 4,1, ND_number ); LCD_lineprint( 1,2, "DI: " ); LCD_lineprint( 4,2, DI_number ); Wait(500); while(1){ if( IO_HANTEN == 1 ) break; // 通話終了、またはリンガー停止するまで待機 } Wait(500); while(1){ if( IO_HOOK == 1) break; } IO_RL3 = LOW; Wait(50); IO_RL2 = LOW; Disp_taiki(); // LCD待機画面表示 SCI_print("HANTEN routine end.",CRLF); } } /*----- スイッチが押されていたらメニュー処理 -----*/ if( IO_SW1 == LOW ){ // SW1でメニュー表示・選択へ Beep( 100 ); Wait( 500 ); MENU_mode(); // メニュー選択サブルーチン switch( MENU_no ){ case 0x01: // 1:自局ナンバー入力    Menu_input_my_number(); Wait( 500 ); goto start; case 0x02: // 2:記録表示 Menu_disp_history(); Wait( 500 ); goto start; case 0x03: // 3:テストモード(リレー制御) Menu_testmode_relay(); Wait( 500 ); goto start; case 0x04: // 4:テストモード(ポートモニタ) Menu_testmode_portmonitor(); Wait( 500 ); goto start; case 0x05: // モデム受信データ表示 Menu_testmode_modemdatadisplay(); Wait( 500 ); goto start; case 0x06: // EEPROM リセット EEPROM_reset(); Wait( 500 ); goto start; case 0x07: // EEPROM 512バイトダンプ表示 EEPROM_dump_256(); Wait( 500 ); goto start; case 0x08: // EEPROM ライト EEPROM_1byte_write(); Wait( 500 ); goto start; case 0x09: // 時刻設定 Time_adjust(); Wait( 500 ); goto start; case 0x00: // 0:メニュー終了 Wait( 500 ); goto start; } } /*----- TEL B より発信の場合の処理 -----*/ if( IO_TELB == 0 ){ // TEL B 発信 Wait(100); if( IO_TELB == 0 ){ SCI_print("TEL B off hook. ",CRLF); LCD_lineprint( 1,1,"InUse B" ); IO_RL3 = HI; // TEL B を回線側に切替 Wait( 10 ); IO_RL2 = HI; Wait(500); while( IO_HOOK == 0 ); // TEL B 通話終了まで待つ Wait(500); while( IO_HANTEN == 0 ); // TEL B 通話終了まで待つ IO_RL3 = LOW; // TEL B を回線側に切替 Wait( 10 ); IO_RL2 = LOW; Wait( 50 ); SCI_print("TEL B end.",CRLF); Disp_taiki(); } } /*----- TEL A より発信の場合の処理 -----*/ if( IO_HOOK == 0 ){ Wait(100); if( IO_HOOK == 0 ){ SCI_print("TEL A off hook. ",CRLF); LCD_lineprint( 1,1,"InUse A" ); Wait(500); while( IO_HOOK == 0 ); // TEL A 通話終了まで待つ Wait(500); while( IO_HANTEN == 0 ); // TEL A 通話終了まで待つ SCI_print("TEL A end.",CRLF); Disp_taiki(); } } /*----- 1分経過していたら表示処理 -----*/ if( T_sec == 0 ){ // 時刻表示 Time_disp(); } } label: IO_RL1 = LOW; // 終了時はリレーを電話側に切替 } #ifdef __cplusplus void abort(void) { } #endif