;******************************************************************* ; DTMFリモコンコントローラ ; CQ出版 エレキジャック 2007年4月号 ; ; 制作著作: 澤田 淳一 ; ; ; アセンブルにはAKI-PICプログラマ付属のアセンブラ「PA.EXE」を使用。 ; ; CLOCKはRC発振 10KΩと100PFで構成。(数100KHz) ; ; DTMFデコーダーチップの動作モードはHEXに設定。 ; 1=#1h, 2=#2h, 3=#3h, 0=#Ah ; ; [1] [#] CH-1 ON ; [1] [*] CH-1 OFF ; [2] [#] CH-2 ON ; [2] [*] CH-2 OFF ; [3] [#] CH-3 ON ; [3] [*] CH-3 OFF ; [0] [#] CH-0 ON→500ms後に自動OFF ; [0] [*] 全チャンネルOFF ; ; ; 複数ポートを一気に設定することも出来る。 ; [1] [3] [#]とキー入力すると、#を送った直後にCH-1とCH-3がONになる。 ; [2] [3] [*]とキー入力すると、CH-2〜3がOFFになる。 ; ; ; 2007/01/22 コーディング開始 ; 2007/01/26 v0.1完成 ; 2007/01/26 BEEP追加 ; ;******************************************************************* include 16f84.h .osc rc .wdt off .pwrt on .protect off ;ポートの別名定義 StD equ ra.4 ; ストローブ入力 BEEP equ ra.3 ; BEEP出力 PTT equ ra.2 ; PTT出力 ;変数宣言 org 0ch ; 作業用RAMエリアのスタートアドレス宣言 DATA ds 1 ; DTMFデータ RCV0 ds 1 ; 0検出フラグ RCV1 ds 1 ; 1検出フラグ RCV2 ds 1 ; 2検出フラグ RCV3 ds 1 ; 3検出フラグ RCV5 ds 1 ; 5検出フラグ CHK ds 1 ; 有効データチェックフラグ BTIME_a ds 1 ; BEEP発生時間用カウンター BTIME_b ds 1 ; BEEP発生時間用カウンター wait_cn ds 1 ; ウエイト用変数 wait_cn2 ds 1 ; ウエイト用変数 ;リセット、割り込みの処理 org 0 ; リセットベクター goto start org 4 ; 割り込みベクター goto start start ; ポート初期化 clr ra ; RAポート初期化 clr rb ; RBポート初期化 call flag_clr ; フラグクリア mov !ra,#10000b ; RA.4を入力ポートにする mov !rb,#00001111b ; RB.7-4を出力ポートに、RB.3-0を入力ポートにする clr ra ; rbポートオール0 clr rb ; rbポートオール0 call flag_clr ; フラグクリア main btfss StD ; StDが1だったら受信データ読み込みへ goto main ;受信データ読み込み mov DATA,rb ; RBポートからデータ読み込み bcf DATA,7 ; 7bit目クリア bcf DATA,6 ; 6bit目クリア bcf DATA,5 ; 5bit目クリア bcf DATA,4 ; 4bit目クリア ;入力データ判別 cjne DATA,#0101b,skip1 ; 0じゃ無かったらSKIP mov RCV0,#1 ; 0検出(all off命令) skip1 cjne DATA,#1000b,skip2 ; 1じゃ無かったらSKIP mov RCV1,#1 ; 1検出 skip2 cjne DATA,#0100b,skip3 ; 2じゃ無かったらSKIP mov RCV2,#1 ; 2検出 skip3 cjne DATA,#1100b,skip4 ; 3じゃ無かったらSKIP mov RCV3,#1 ; 3検出 skip4 cjne DATA,#1010b,skip5 ; 5じゃ無かったらSKIP mov RCV5,#1 ; 5検出 skip5 cjne DATA,#0011b,skip6 ; #じゃ無かったらSKIP goto cmd_on ; #検出(ON命令) skip6 cjne DATA,#1101b,skip7 ; *じゃ無かったらSKIP goto cmd_off ; *検出(OFF命令) skip7 goto main ; ループに戻る ;ONコマンド検出 cmd_on csne RCV1,#1 ; [1]じゃ無かったらスキップ setb rb.5 ; CH-1 ON csne RCV2,#1 ; [2]じゃ無かったらスキップ setb rb.6 ; CH-2 ON csne RCV3,#1 ; [3]じゃ無かったらスキップ setb rb.7 ; CH-3 ON csne RCV0,#1 ; [0]じゃ無かったらスキップ call one_shot ; ワンショット動作へ cse RCV0,#0 inc CHK cse RCV1,#0 inc CHK cse RCV2,#0 inc CHK cse RCV3,#0 inc CHK cse CHK,#0 ; 無効ポート番号だったらSKIP call beep_h ; BEEP(H)送信 call flag_clr ; フラグクリア clr CHK goto main ;OFFコマンド検出 cmd_off csne RCV1,#1 ; 1じゃ無かったらスキップ clrb rb.5 ; CH-1 OFF csne RCV2,#1 ; 2じゃ無かったらスキップ clrb rb.6 ; CH-2 OFF csne RCV3,#1 ; 3じゃ無かったらスキップ clrb rb.7 ; CH-3 OFF csne RCV0,#1 ; 0じゃ無かったらスキップ clr rb ; ALL OFF cse RCV0,#0 inc CHK cse RCV1,#0 inc CHK cse RCV2,#0 inc CHK cse RCV3,#0 inc CHK cse CHK,#0 ; 無効ポート番号だったらSKIP call beep_l ; BEEP(L)送信 call flag_clr ; フラグクリア clr CHK goto main ;ワンショット動作(CH-0) one_shot setb rb.4 ; CH-0 ON mov wait_cn,#35 ; 500ms(500x0.07=35) call wait_ms ; msオーダーのウエイト実行 clrb rb.4 ; CH-0 OFF ret ;フラグクリア flag_clr clr RCV0 clr RCV1 clr RCV2 clr RCV3 ret ;ビープ出力(ピー) beep_h setb PTT ; 送信開始 oop11 mov BTIME_b,#255 loop12 setb BEEP mov wait_cn,#35 call wait_us clrb BEEP mov wait_cn,#35 call wait_us djnz BTIME_b,loop12 clrb PTT ; 送信終了 ret ;ビープ出力(ポー) beep_l setb PTT ; 送信開始 loop21 mov BTIME_b,#255 loop22 setb BEEP mov wait_cn,#70 call wait_us clrb BEEP mov wait_cn,#70 call wait_us djnz BTIME_b,loop22 clrb PTT ; 送信終了 ret ;ウエイト(CLOCK=10MHzの時) ;使い方1 mov wait_cn,#2 ; call wait_ms ;使い方2 mov wait_cn,#2 ; call wait_us ; ;500msのウエイトを得たかったら、wait_cnには35を代入する ;→ 500*0.07=35 ; ;例) ;70 1000ms ;35 500ms ;14 200ms ; 7 100ms ; ;msオーダーのウェイト wait_ms wait_ms0 mov wait_cn2,#0 wait_ms1 nop nop nop nop nop nop nop djnz wait_cn2,wait_ms1 djnz wait_cn,wait_ms0 ret ;usオーダーのウェイト wait_us wait_us0 djnz wait_cn,wait_us0 ret end