' ' ピンク電話コントロールソフト ' ' Ver.4.0_01 by T.AZAMI ' ' 実験成功 ' 応答収納信号、硬貨収納信号ともこのタイミングで動作した。 ' RA3,RA4の切替順序は重要である。 ' 060304 3.6_02 DTMF解析実験追加 ' 060306 3.6_03 DTMF解析追加 ' 060306 3.6_04 実用動作したが・・・ ' 060308 3.7_03 回線切断リレー追加 ' 060309 3.7_04 !!! 完全動作確認・・・やっとできました、フ〜 !!! ' 060310 3.7_05 色づけ実施、課金時間タイマー数値調整 ' 060312 3.7_06 実装後微調整 ' 060316 4.0_01 回路変更、cgram使用 Dim time_count As Word '経過時間変数 Dim time_set As Byte '課金セット時間変数 Dim time_adr As Byte '課金データアドレス Dim ci As Byte '汎用変数 Dim bi As Byte 'BEEP使用 Dim csr_pos As Byte 'LCDディスプレイ桁ポジション変数 Dim dtmf_a As Byte 'DTMF解析に使用する変数 Dim dtmf_count As Byte 'DTMF解析に使用する変数 Dim dtmf(11) As Byte 'DTMF解析に使用する変数 Dim condition As Byte '切断条件フラグ Dim cgcode As Byte 'CGRAMキャラクタコード Dim cgram(8) As Byte 'CGRAM書き込みデータ Dim db As Byte 'CGRAM使用 Dim tmp As Byte 'CGRAM使用 Input RA.Bit0 'RA0 電流検出ピン Input RA.Bit1 'RA1 反転検出ピン Output RA.Bit2 'RA2 局線側リレー RL1 Output RA.Bit3 'RA3 反転リレー(+) RL3 Output RA.Bit4 'RA4 反転リレー(-) RL4 Output RA.Bit5 'RA5 電話機側リレー RL2 Low RA.Bit2 ' Low RA.Bit3 '反転リレー(+) OFF Low RA.Bit4 '反転リレー(-) OFF Low RA.Bit5 Input RD.Bit0 'DTMF受信データ Input RD.Bit1 'DTMF受信データ Input RD.Bit2 'DTMF受信データ Input RD.Bit3 'DTMF受信データ Input RD.Bit4 'DTMF受信フラグ Output RC.Bit0 'BEEP出力 Initlcd 'LCD初期化 Serclear start: Clearlcd 'オープニングタイトル表示 Homelcd Putlcd "Pink Tel Controller" Setpos 0,1 Putlcd " Ver.4.0_01" Sleep 2000 time_adr = 0 '課金情報クリア time_set = 0 time_count = 0 condition = 0 dtmf_count = 0 Gosub romdata_chk 'EEPROM課金データチェック Gosub cgram_write 'CGRAMデータ書込みサブルーチン Gosub line_chk '局線側の極性を調べる '-----メインループ----- main_loop: Debug "main loop" Low RA.Bit2 '回路をバイパス側へ Low RA.Bit5 '   〃 For ci=0 To 10 dtmf(ci) = 0 'DTMFデータ削除 Next Clearlcd Putlcd "コウカヲ イレ ダイアル " Setpos 0,1 Putlcd "シテクダサイ ",chr$(0),chr$(1),chr$(2),chr$(17),chr$(4)," " time_adr = 0 '課金情報クリア time_set = 0 time_count = 0 condition = 0 Sleep 500 Debug "main RA0=",ra.Bit0," RA1=",ra.Bit1 '-----受話器を上げた場合の処理----- i_detect_loop: If RA.Bit0 = 0 Then Debug "i detect 1 RA0=",ra.Bit0," RA1=",ra.Bit1 Sleep 500 If RA.Bit0 = 0 Then 'RA0=Low で通電状態 以下のルーチンへ High RA.Bit2 '回路をバイパスから反転リレー側へ切替 High RA.Bit5 '   〃 Clearlcd Putlcd chr$(0),chr$(1),chr$(2),chr$(17),chr$(3)," " Setpos 0,1 Putlcd " " Sleep 100 Setpos 0,1 dtmf_count = 0 Debug "i detect 2 RA0=",ra.Bit0," RA1=",ra.Bit1 Goto rev_detect_loop '反転検出へ Endif Endif Goto i_detect_loop '-----反転検出ループ----- rev_detect_loop: If RA.Bit1 = 0 Then '通話接続、極性反転 Sleep 100 If RA.Bit1 = 0 Then hanten '反転処理ルーチンへ Endif If RA.Bit0 = 1 Then '受話器を戻した場合 Sleep 100 If RA.Bit0 = 1 Then main_loop '電流ループ切断処理ルーチンへ Endif '-----DTMF検出ルーチン If dtmf_count < 11 Then While RD.Bit4 = 1 'StD HI でDTMF受信 dtmf_a = RD & &h0F 'RD0〜RD3にデータ If dtmf_a <11 Then '#*等は無視 If dtmf_a = 10 Then dtmf_a = 0 '0は10と出力されるので変換 dtmf(dtmf_count) = dtmf_a Putlcd dtmf_a dtmf_count = dtmf_count + 1 Endif While RD.Bit4 = 1 '1符号終了まで待つ Sleep 50 Wend Wend Endif Goto rev_detect_loop '-----極性が反転した場合の処理(応答収納信号発生)---- hanten: Sleep 100 '■課金データ検索 If dtmf(0) > 1 Then time_set = 180 '市内通話の場合 180秒とする Else time_adr = dtmf(0) * 100 + dtmf(1) * 10 + dtmf(2) Read time_adr , time_set Endif Debug "Hanten adr:",time_adr," time:",time_set Clearlcd Putlcd chr$(0),chr$(1),chr$(2),"=" For ci = 0 To 10 'ダイアル番号表示 Putlcd dtmf(ci) Next Setpos 0,1 Putlcd "Set:",time_set Setpos 8,1 Putlcd "Time:",time_set," " If time_set < 255 Then '■応答収納信号発生 High RA.Bit3 '反転リレー(+) ON Sleep 200 High RA.Bit4 '反転リレー(-) ON Sleep 1500 Low RA.Bit3 '反転リレー(+) OFF Sleep 100 Low RA.Bit4 '反転リレー(-) OFF Endif If time_set = 0 Then Setpos 0,1 Putlcd "コノバンゴウハカケラレマセン" Sleep 2000 Goto main_loop Endif time_count=time_set-3 'ここまでで3秒消費していることにする '-----回線接続後、通話中ループ---- tuuwa_loop: Debug "tuuwa_roop" Serout pb115200,chr$(&h31) '通話時間カウント開始 Do Sleep 900 '1s毎にカウントダウン  'この停止時間で通話秒数をコントロールしている If RA.Bit1 = 1 Then tuuwa_end '極性が正転した場合 If RA.Bit0 = 1 Then tuuwa_end '受話器を戻した場合 time_count = time_count - 1 Setpos 8,1 Putlcd "Time:",time_count," " If time_count = 0 Then If time_set < 255 Then '■硬貨収納信号発生 High RA.Bit3 '反転リレー(+) ON Sleep 50 High RA.Bit4 '反転リレー(-) ON Sleep 1500 Low RA.Bit3 '反転リレー(+) OFF Sleep 50 Low RA.Bit4 '反転リレー(-) OFF Endif time_count = time_set - 2 '時間リセット Endif If RA.Bit0 = 1 Then tuuwa_end '受話器を戻した場合 If RA.Bit1 = 1 Then tuuwa_end '極性が正転した場合 Until time_count > 0 Debug "time up" '-----通話終了処理----- tuuwa_end: Serout pb115200,chr$(&h32) '通話時間カウント終了 Debug "tuuwa end RA0=",ra.Bit0," RA1=",ra.Bit1 For ci = 1 To 10 'BEEPルーチン Gosub beep Next If RA.Bit0 = 1 Then '電流ループOFFの場合(受話器を置いた場合) Debug "tuuwa_end1" Clearlcd Putlcd "デンリュウループOFF " condition = 1 Sleep 500 Goto main_loop Endif If RA.Bit1 = 1 Then '極性が正転した場合(相手側切断) Debug "tuuwa_end2" Clearlcd Putlcd "キョクセイ + change " condition = 2 Sleep 500 Goto main_loop Endif Goto tuuwa_loop '----- BEEPサブルーチン ----- beep: For bi = 1 To 1000 High RC.Bit0 Low RC.Bit0 Next Return '----- EEPROM書込み済みデータのチェック ----- romdata_chk: Read 012,ci If ci = 255 Then Read 117,ci If ci = 180 Then Read 177,ci If ci = 180 Then Return 'チェックOK Else Goto romdata_err Endif Else Goto romdata_err Endif Endif romdata_err: Setpos 0,1 Putlcd "カキンデータエラー " For ci = 1 To 100 Gosub beep Next End '----- CGRAM書込ルーチン ----- cgram_write: cgcode = 0 cgram(0) = &B00000 '受話器絵柄左 cgram(1) = &B00000 cgram(2) = &B00000 cgram(3) = &B01110 cgram(4) = &B10001 cgram(5) = &B10001 cgram(6) = &B10001 cgram(7) = &B01111 Gosub cgram_set cgcode = 1 cgram(0) = &B00000 '受話器絵柄中央 cgram(1) = &B00000 cgram(2) = &B00000 cgram(3) = &B00000 cgram(4) = &B00000 cgram(5) = &B00001 cgram(6) = &B00110 cgram(7) = &B11000 Gosub cgram_set cgcode = 2 cgram(0) = &B01110 '受話器絵柄右 cgram(1) = &B10001 cgram(2) = &B10001 cgram(3) = &B10001 cgram(4) = &B11110 cgram(5) = &B00000 cgram(6) = &B00000 cgram(7) = &B00000 Gosub cgram_set cgcode = 3 cgram(0) = &B00100 '上矢印 cgram(1) = &B01110 cgram(2) = &B10101 cgram(3) = &B00100 cgram(4) = &B00100 cgram(5) = &B00100 cgram(6) = &B00100 cgram(7) = &B00100 Gosub cgram_set cgcode = 4 cgram(0) = &B00100 '上矢印 cgram(1) = &B00100 cgram(2) = &B00100 cgram(3) = &B00100 cgram(4) = &B00100 cgram(5) = &B10101 cgram(6) = &B01110 cgram(7) = &B00100 Gosub cgram_set cgram_set: Low RB.Bit2 db = &b01000000 | (cgcode << 3) Gosub lcddir High RB.Bit2 For ci=0 To 7 db = cgram(ci) Gosub lcddir Next Low RB.Bit2 Return '----- CGRAM DB7-4/DB3-0をRBポートに出力 lcddir: tmp = rb tmp = tmp & &B00001111 tmp = tmp | (db & &B11110000) rb = tmp High RB.Bit3 Sleep 1 Low RB.Bit3 Sleep 1 tmp = tmp & &B00001111 tmp = tmp | ((db << 4) & &B11110000) rb = tmp High RB.Bit3 Sleep 1 Low RB.Bit3 Sleep 1 Return '----- 局線側の極性を調べるルーチン line_chk: High RA.Bit2 '局線側の極性を調べる Sleep 100 While RA.Bit1 = 0 'RA1=0 : 反転状態=エラー Setpos 0,1 Putlcd "LINE ERROR " 'LINEの極性が正常でなければメッセージ Gosub beep Wend Low RA.Bit2 Return