LCD命令にデータをつければそのまま表示、とはいかないので一工夫。7セグの部分に割り当てたポート番号から、数字とFとHを表示させる(Fは時間終了、Hは電圧が規定値に達した時)ための表を書き、その7セグデータを16進に変換した。このデータを配列変数に入れ込むのである。試験的に書き込んで表示させてみたら、ハチャメチャな表示になった。よく考えたら、上位ビットと下位ビットを逆さまにしていた。オソマツ。

電源を入れると0から9まで0.5秒間隔で表示する。その後電池がつながっていれば定電流回路ONとなり充電開始、1秒間隔で7セグのドットが点滅しプログラムが走っているモニタになる。電池がつながっていないとすぐにH表示で止まる。満充電近くで端子電圧が上がってくるとH表示で止まる。普段使用していると、16時間経過してF表示になることは先ず無いのでタイマーは安全弁といったところか。
さて、プログラムを順を追って見ていく。
最初は例によってお約束のメモ書きのREM文。使ったCPU、クロックの他に、各ポートを何に割り付けているかをメモっている。プログラムの実行には関係ないが後から人間が読むときは大助かり。この中で0から9、F、Hのところに書かれている16進数が7セグデータとなる。その他、充電回路制御、1秒のドットの点滅や10時間台の1を2番目のLEDに表示するなどが書かれている。実際プログラムを書くときも何番ポートが何につながっていたかと良く参照する。


次は変数定義。この中でLEDに表示する7セグデータを配列変数で定義して呼び出しやすくしている。配列はSeg(0)はゆるされずSeg(1)からなので”0”はSeg(10)に入れている。
次に各ポートの入出力設定とアナログコンパレータの設定、配列へのデータ書き込み、タイマー設定そして各変数の初期値設定となる。
カウンタをリセット、割り込み処理先の定義をし、割り込み許可と進む。
その次は0.5秒ずつLEDを1から0まで数字表示する。遊び心から、なのだがLEDのランプテスト、プログラムがRUN始めた確認など意外と有用。


基準時間は内部源発振を8MHz、内部分周を8としてクロックを1MHzに設定する。8ビットのカウンタに初期値6とし256カウントアップで割り込みがかかる。割り込み毎に初期値4000から1減じていき0になったら1秒処理をする。(256−6)×4000=1MHz
1秒処理を繰り返す毎にPortBの3番をON、OFFする。7セグのドットにつながっており点滅する。さらにカウントアップし、3600になったらメインルーチンが走る。
メインルーチンでは1時間毎にカウントアップする。11時間以上ではデータから10を引き2桁目のLEDに結果を表示し1桁目のLEDに1を表示する。10時間では1桁目に1、2桁目にゼロを表示、10時間以下ではそのまま2桁目に表示というメンドーな処理をしている。LCDなら簡単なのに、ふぅー。
時間が14時間以上、または電圧が規定値以上ならメインループをぬける。表示をリセットし、充電回路を遮断、7セグに時間オーバーならF、電圧オーバーならHを常時して終了する。
へ戻ります。