ラベル定義 ;**************** Label Definition ******************** cblock h'20'データエリアにはCBLOCK疑似命令を使用して20hから自動割付を行っています。割付の終了にはENDCを使います。 以下に今回使用しているデータエリアの意味(使用目的)を示します。
環境指定 他
コンフィグレーションワードとして以下を指定しています。
結果は3F72hです。 初期化処理 ;**************** Initial Process *********************
LED表示周期タイマの初期化
ポート初期化
PORTCはLED制御に使用していて、"1"を出力するとLEDが消える回路にしています。 ワークエリア初期化
モードデータは0で時刻設定モードなので、初期化した後は時刻設定モードになります。要は電源を入れた時には時刻設定モードで動作することになります。 ワークエリア初期化では7セグメントLED用のデータもワークエリアに設定しています。 割り込み初期化
割り込み待ち処理
LED表示処理 ;********* LED disply Process (1msec interval) *********
時刻設定モードで時10位に消灯データ(0Ah)が入っている場合には特に制御は行いません。先頭で消灯処理を行っているからです。 時計処理 ;****** Clock count up Process (20msec interval) *******
時刻設定モードチェック
0秒設定スイッチはラストルック監視をしています。スイッチONを検出する前の状態がOFFの場合だけ0秒設定処理を行います。スイッチが連続的に押されていても、最初の変化以降のON状態は0秒設定に影響ないようにしています。
時刻設定処理を行う前に、変更桁を時10位にし、秒を00秒にし、さらにRBポートの変化検出割り込みを可能にしています。RB変化検出はロータリーエンコーダからの入力を取り込むためです。RB7LLを1にしているのは時刻設定モードになるときに桁位置が変化しないようにするためです。
今回の処理では少し凝ってAM11:59からPM12:00へ、PM11:59からAM0:00にしています。 時報制御 ;*** Time signal check
今回の処理では以下の8種類を時報にしています。
時刻設定処理 ;****** Time adjust mode Process (20msec interval) ******
時刻設定解除
時刻設定解除処理では設定対象桁を200ミリ秒周期で点滅させているので、表示が消えている可能性があります。ですから、表示エリアにデータを再設定しています。また、RBの変化割り込みをOFFにしています。
設定できる桁は時/分のみで、秒の設定はしていません。時刻設定の時は常に0秒になります。 表示の点滅処理のために対象桁のデータをセーブしています。移動前の桁の表示が消えている場合には、表示を戻してから移動後の桁のデータをセーブしています。
時刻変更処理 ;**************** Digit change process ******************
ロータリエンコーダには2つの出力(A,B)があり、それぞれのONするタイミングが右回転の場合と、左回転の場合とで異なっています。 今回の処理では状態管理データを使って、右回転、左回転の判断をしています。 ここでONは「1」、OFFは「0」です。
A:OFF、B:OFFの状態は管理していません。AとBが両方ONになる直前の状態が分かれば良いからです。 状態遷移図で表すと左図のようになります。 状態0でA=ON、B=ONを検出すると、右回転で設定対象桁の数字を増加させます。状態1でA=ON、B=ONを検出すると、左回転で数字を減少させます。 ロータリエンコーダの出力にはチャッタリング(ONまたはOFFになるときにON/OFFを繰り返す現象)が発生します。しかし、今回のような状態管理を行えば問題はありません。 チャッタリングを想定したときの信号変化と状態遷移の関係を左図に示します。 |