Tako can fry!

とほほ・・・

e-BASiC (6)

名前がかぶらないよう 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 をカウントアップさせています。