PIC16F84電子遊戯(7)
最終更新日:2001年1月15日
99分タイマー(1ページ)へ (2ページ)へ (3ページ) (4ページ)へ

99分タイマーのキースキャン
(注)今回説明のソースリストの全体掲載は次回になります。
今回はタイマーの時間を設定したり、スタート・ストップするキーのスキャン方法を説明します。まず、キーの状態を読み取るには、チャタリングを取る必要があります。
チャタリングとはキーをONする瞬間にキーのON・OFFがばたつくことです。
このときキー入力ポートはしばらくの時間、レベルがLになったりHになったりします。
従って入力がLになった瞬間、キーONを認識するのではなく、キー入力がLになったら、しばらく時間を待って再びキー入力がLかどうかを判断する必要があります。
今回のソフトでは7セグLED表示の前に1回キースキャンをして各キーの状態を読み込んでおき、7セグLED表示の後再びキースキャンをして状態が一致すれば、キーを有効にするようにしています。
また、一度押されたキーはキーを離すまで、1回しか動作しないようにしています。
key_input
7 6 5 4 3 2 1 0

--

--

--

up10

up1

start/stop

--

--

(キー入力状態のRAM定義)
movlw 0ffh ;key input clear
movwf key_input
btfss PORTA,2 ;start/stop key check
bcf key_input,2 ;start/stop key input ari
btfss PORTA,3 ;up1 key check
bcf key_input,3 ;up1 key input ari
btfss PORTA,4 ;up10 key check
bcf key_input,4 ;up10 key input ari
まず1回目のキースキャンの状態をkey_inputのRAMに読み込みます。
状態のまま読み込んでいますので、キーONのとき「0」、OFFのとき「1」になります。
key_data
7 6 5 4 3 2 1 0

--

--

up10.up1

up10

up1

start/stop

--

--

(キー入力有効のRAM定義)
7セグLED表示の後(一定時間が経過している)、再びキースキャンを行います。
先ほどのON状態と今回のON状態が一致すれば、キーONを有効とします。
一致しなければ無効と判断してkey_dataのキーに対応するビットを「1」にクリアします。
有効のときはまず、前回のキー入力が有効か調べます。
前回が無効で今回が有効のときのみキー入力処理をすることにより、一度キーが押されたときにしか動作しないようにしています。
処理を行うときはkey_dataの対応ビットを「0」にして、処理済みとします。
stsp_check
btfss PORTA,2 ;start/stop key check
goto stsp_next
bsf key_data,2 ;start/stop key off
goto up1_check

stsp_next
btfsc key_input,2 ;start/stop key input check
goto up1_check
btfss key_data,2 ;start/stop key on check
goto up1_check
bcf key_data,2 ;start/stop key on
これはスタート・ストップキーの処理ルーチンです。
99分タイマーのスタート・ストップ
99分タイマーのタイマースタート・ストップ、アラーム音スタート・ストップのRAMを定義します。割り込み処理でこのRAMを見てタイマーを減算したり、止めたりします。
start_stop
7 6 5 4 3 2 1 0

--

--

--

--

--

--

buzzer

timer

(スタート・ストップのRAM定義)
btfss start_stop,0 ;start/stop check
goto stsp_next_2
bcf start_stop,0 ;start/stop <=stop
nop
bcf start_stop,1 ;buzzer flg off
goto up1_check

stsp_next_2
bsf start_stop,0 ;start/stop <=start
スタート・ストップキーが押された時は、タイマーが動作中はタイマーストップ、停止中はタイマースタートにします。
99分タイマーのタイマー時間設定
「+1」と「+10」のキーでそれぞれ時間を設定します。キーを押すごとに「0」から「9」まで順次変化します。
時間を設定したら強制的に秒の部分は「00秒」にクリアしています。
各桁ごとに設定しますので、桁上がりとかはありません。
(この方が長い時間を設定するときは便利だと思います。)
タイマー動作中は設定処理が出来ないようにしています。
call sec_clear ;min1_data up
incf min1_data,1
movlw 0ah
subwf min1_data,0
btfss STATUS,0
goto up10_check
movlw 00h
movwf min1_data
99分タイマーの「+1」「+10」の2重押し
入力した時間を瞬時に「00分」に戻すために、「+1」と「+10」を2重押ししたときにその処理をするようにしましょう。
それぞれのキー入力状態がわかりますから、両方が有効になったのを判断して処理を行います。もちろんタイマー動作中は処理が出来ません。
up110_check
btfsc key_data,3 ;up1 key on check
goto up110_next
btfsc key_data,4 ;up10 key on check
goto up110_next
btfss key_data,5 ;up1up10 key on check
goto next_key
bcf key_data,5 ;up1up10 key on
btfsc start_stop,0 ;start/stop check
goto next_key
call min_clear
goto next_key

up110_next
bsf key_data,5 ;up1up10 key off
99分タイマーのアラーム音制御
アラーム音はアラーム音スタート・ストップRAMの内容を見て、実際のポートを制御します。
buzzer
btfss start_stop,1 ;buzzer flg check
goto buzzer_2
bsf PORTA,0 ;buzzer on
goto buzzer_3

buzzer_2
bcf PORTA,0

buzzer_3
99分タイマーのタイムアップ
アラーム音を鳴らすタイミングは1秒おきに、残っている時間を調べて判断します。
sec1_data,sec10_data,min1_data,min10_dataが全て「00」のときにアラーム音スタート・ストップRAMをスタートに設定します。
電源投入後の初期設定が「00.00」なので、この時にアラーム音が鳴らないように、タイマーが動作している時に限りスタートにします。
zero_check
movf sec1_data,1
btfss STATUS,2 ;Z check
return
movf sec10_data,1
btfss STATUS,2 ;Z check
return
movf min1_data,1
btfss STATUS,2 ;Z check
return
movf min10_data,1
btfss STATUS,2 ;Z check
return
btfss start_stop,0 ;start/stop check
return
bsf start_stop,1 ;buzzer flg on
return
今回は部分的にソースリストの説明をしましたが、いかがでしたか。
多分全体のソースリストがないとわからないかもしれませんね。
でも今日はページが長くなりましたので、全体のソースは次回にします。
もうすでに完成してますが、お披露目は次回ということで・・・・・
これからも「PIC16F84電子遊戯」をよろしくです。
この続きは(4ページ)へ

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft