7セグメントLEDを2個をダイナミック点灯する。
前回までで、回路は決まったので、7セグメントLEDを2個をダイナミック点灯するプログラムを組みます。
下のプログラムが組んだプログラムです。
まず、プログラムの各行の説明。
プログラムの31行までは、初期設定です。
31行のdata配列の初期値は、0から表示するように、0のデータを最初に移動しています。
33行のwhile文で、{}内を永久に繰り返しています。
35行は、41行のcount1を0から始めて9まで増やします。
37行は、44行のcount2を0から始めて9まで増やします。
39行は、41行から46行までを50回繰り返します。
41行は、配列のcount1番目のdataの内容をPORTBに出力し、7セグメント表示器の点灯させるセグメントに5vを加えます。
42行は、PORTAのRA0にHをRA1にLを出力し、左側の7セグメント表示器用のトランジスタのみONさせ、左側の7セグメント表示器のカソード側をアースに落とします。
ここで、左側の7セグメント表示器に配列のcount1番目のdataの内容の数字が点灯します。
43行は5mS待ちます(左側の7セグメント表示器を点灯させる時間)。
44行は、配列のcount2番目のdataの内容をPORTBに出力し、7セグメント表示器の点灯させるセグメントに5vを加えます。
45行は、PORTAのRA0にLをRA1にHを出力し、右側の7セグメント表示器用のトランジスタのみONさせ、右側の7セグメント表示器のカソード側をアースに落とします。
ここで、左側のセグメント表示器が消灯し、右側の7セグメント表示器に配列のcount2番目のdataの内容の数字が点灯します。
46行は5mS待ちます(右側の7セグメント表示器を点灯させる時間)。
7セグメント表示器が10と点灯するまでの解説。
初期設定が終わって、35行に来ると、for文が実行され、count1に0が入り、count1<10が判定され、成立する(count1は0)ので{}内に行きます。
{}内のfor文が実行され、count2に0が入り、count2<10が判定され、成立する(count2は0)ので{}内に行きます。
{}内のfor文が実行され、kauntoに0が入り、kaunto<50が判定され、成立する(kauntoは0)ので{}内に行きます。
PORTB=data〔count1];文の実行は、count1は0なので、data〔0]は、0xEEですから、PORTBに0xEEが出力されます。
すると、0xEEは、2進数で11101110ですから、RB1~RB3とRB5~RB7がH,RB0とRB4がLとなります、したがって、各ピンにつながっているABCDEFのセグメントに5vが加わります。
PORTA=0x01が実行されると、0x01は、2進数で00000001ですから、RA0がH、その他はLがPORTAに出力され、PA0に5vが加わり、PA0につながっているトランジスタのベースに電流がながれ、トランジスタはONになって、左側の7セグメント表示器のカソード側をグランドに落としますから、PORTBから5vのかかっているセグメントに電流がながれ、0が点灯します。
ディレイ文で、5mS待ちます。
次に、PORTB=data〔count2];文の実行は、count2は0なので、data〔0]は、0xEEですから、PORTBに0xEEが出力されます。
すると、上と同じ動作で0が点灯します。
ディレイ文で、5mS待ちます。
for文の最後まで来ましたから、for文に戻りますが、その時、kaunto++が実行され、kauntoの内容は+1され、1になります。
for文が実行され、kaunto<50が判定され、成立する(kauntoは1)ので{}内に行きます(for文のkaunto=0は最初の1回だけ実行される)。
41行~46行が実行されます。
for文の最後まで来ましたから、for文に戻りますが、その時、kaunto++が実行され、kauntoの内容は+1され、2になります。
これが、繰り返され、for文の最後まで来た時、kaunto++が実行され、kauntoの内容は+1され、50になってもどると、for文が実行され、kaunto<50が判定され、成立しない(kauntoは50)ので、このfor文を抜けて、37行のfor文の最後まで来ましたから、for文に戻りますが、その時、count2++が実行され、count2の内容は+1され、1になります。。
for文が実行され、count2<10が判定され、成立する(count2は1)ので{}内に行きます。
39行のfor文の実行で、01が点灯します。
これが、繰り返され、for文の最後まで来た時、count2++が実行され、count2の内容は+1され、10になってもどると、for文が実行され、count2<10が判定され、成立しない(count2は10)ので、このfor文を抜けて、35行のfor文の最後まで来ましたから、for文に戻りますが、その時、count1++が実行され、count1の内容は+1され、1になります。
35行のfor文が実行され、count1<10が判定され、成立する(count1は1)ので{}内に行きます。
そして、39行のfor文の実行で、10が点灯します。
これが、繰り返され、for文の最後まで来た時、count1++が実行され、count1の内容は+1され、10になってもどると、for文が実行され、count1<10が判定され、成立しない(count1は10)ので、このfor文を抜けて、33行のwhile文の最後まで来ました、このwhile文は永久に成立しますから、{}内を永久に繰り返し、00~01~・・・・~98~99と点灯し、00に戻って、00~01~・・・・と永久に点灯し続けます。
このプログラムをPICに焼いて、動作を確認したのが下の動画です。