名前がかぶらないよう e と i を小文字に。
なんとなく回路で使われる記号っぽいし。
いよいよ、2 ケタの 7 セグ LED を扱ってみることに。
http://www.youtube.com/watch?v=apWdiDFh_-4
1 ケタあたり 8 本の信号線を制御しないといけないので、2 ケタだと 16 本ということになるが、そんなに信号を出せるかというともっとケタ数が多くなったときに足りなくなってしまうので、1 ケタづつ短い間隔で順番に点灯していく「ダイナミック点灯」という処理をします。
これを STM32 と e-BASiC で簡単に実現してみます。
まあ、それなりに配線は多いんだけどね。
適当なので、これで OK なのかは微妙なところだけど。
あとでピンを楽に引き出せるよう、こんなものも。
というわけで、PC07 と PC08 でどちらの 7 セグを点灯させるか選択しています。
EN1: GPIOC 7 OUT EN1 = 1 EN2: GPIOC 8 OUT EN2 = 1
マイコンから電流を取り出すのには制限があるので、トランジスタを使うようです。
この回路の場合、L にすると電圧がかかるようになるので、
EN1 = 0
とすると、1 ケタ目の 7 セグに電流が流れて点灯することになります。
前回と同様に、PD00〜PD07 までを 7 セグにつないで、次にように定義。
SEG7: DATA GPIOD 0 1 2 3 4 5 6 7 OUT SEG7ARY: ARRAY 192 249 164 176 153 146 130 216 128 144
1 ケタ目に 7 を表示させたい場合、
EN1 = 0 SEG7 = SEG7ARY = 7
と実行することになります。
これをケタ毎に短い間隔で切り替えながら点灯させると、両方に数字が表示されているように見えるわけですね。
そういうわけで、動画のプログラムはこんな感じに。
COUNTER: VAL 0 TMP: VAL 0 FLAG: VAL 0 TIMER1: TIMER 1000 MAIN: LOOP TMP = COUNTER / 10 SEG7 = SEG7ARY = TMP EN1 = 0 DELAY 10 EN1 = 1 TMP = TMP * 10 TMP = COUNTER - TMP SEG7 = SEG7ARY = TMP EN2 = 0 DELAY 10 EN2 = 1 IF TIMER1 < 100 IF FLAG = 0 COUNTER = COUNTER + 1 IF COUNTER >= 100 COUNTER = 0 ENDIF FLAG = 1 ENDIF ELSE FLAG = 0 ENDIF ENDLOOP
前半で 10ms 間隔で COUNTER の内容を 7 セグに表示させ、後半で 1 秒置きに COUNTER をカウントアップさせています。