「天文屋のためのマイコン入門」7セグメントLEDとロータリースイッチの追加
前回までのプログラムで、骨格はほぼ完成しています。完成まであと少し、今日は、7セグメントLEDによる残り露出時間の表示とロータリースイッチによる露出設定を追加します。
追加点を順をおって説明します。まずは定義部分です。
SKIP_IF_ZEROはもうすでにあるので、SKIP_IF_NOT_ZEROを追加しておきます。演算結果が0でない場合に次の命令をスキップする命令です。
続いて、割り込み処理部分の追加です。ここで、ロータリースイッチから入力した数値(0~9)を7セグメントLEDに表示するプログラムを追加します。
BTFSS MODE , 1 命令によりモード2露出中の場合は、ロータリースイッチの値の表示はキャンセルされます。露出中は7セグメントLEDの表示は、残り露出時間を表示するのであって、ロータリースイッチの設定を表示するわけでないからです。スイッチの設定を表示するのは、モード0停止中またはモード1インターバル中のみです。
なお、この部分は1/32秒間隔で呼ばれるので、ロータリースイッチを回せば、ほぼリアルタイムで7セグメントLEDの表示が変わります。これは重要なことです。
サブルーチンInputSW_and_Dispはロータリースイッチの値を入力し、7セグメントLEDに表示するサブルーチンです。詳細は後で説明します。
次に割り込み処理の終盤、各モード別の動作のところ追加します。最初にモード0停止中のときプッシュスイッチが押され、モード2露出中に移行する部分の変更です。
ここでは、サブルーチンInputSWを呼んで、スイッチの値を取得し、レジスタMINUTEに格納しています。前回までここは無条件に1を代入していた部分です。
なお、
SKIP_IF_NOT_ZERO
ADDLW 10
この2行によりロータリースイッチの値が0のときは10分に変更しています。これにより、1分から10分まで設定できるようになっています。サブルーチンInputSWは以前紹介したサブルーチンとまったく同じです。
次に、時間をカウントする部分の追加です。
ここでは、モード2露出中のとき、MINUTEがデクリメントされるタイミングで、その値を7セグメントLEDに表示します。サブルーチンDisp7Segはだいぶ前に紹介したサブルーチンですがそのまま利用します。このサブルーチンは表示させたい数値を汎用レジスタの20h番地に格納しておくのでした。忘れた人は前の記事に戻って思い出してください。
次に初期化部の追加です。
最初にLEDを光らせるポートを0にクリアするのを今まで忘れていました。遅くなってしまいましたが、ここで追加しておきます。実はこの初期化ですが、この場所はあまりよくありません。また後日修正します。とりあえず、このままで。
最後にサブルーチンの追加です。
3つのサブルーチンを追加しますが、InputSWと、Disp7Segの2つは、だいぶ前に紹介したサブルーチンのままです。以前の記事を参照してください。
最初のInputSW_and_Disp7segは、のこりの2つを組み合わせたものです。スイッチの値を入力し、そのまま表示するサブルーチンです。
今日はここまで、あと、カメラのシャッターを開閉するためのアナログスイッチといわれるICを追加するだけです。完成までもう少し。
最近のコメント