当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのC言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、出てこないことの方が多いと思いますので、ご了承願います。

7セグメントLEDを2個をダイナミック点灯する。

前回までで、回路は決まったので、7セグメントLEDを2個をダイナミック点灯するプログラムを組みます。

下のプログラムが組んだプログラムです。

f:id:higonohimajin:20210325102217p:plain

まず、プログラムの各行の説明。

プログラムの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に焼いて、動作を確認したのが下の動画です。

youtu.be