フォト
無料ブログはココログ

MyList

« 1000時間の法則 | トップページ | 自分のアタマで考えよう »

2013年2月25日 (月)

8つのI/Oポートで市販の8×8マトリクスLEDを駆動

 SCRを使って市販の8x8マトリクスLEDを9つのI/Oポートで駆動する方法を「9つのI/Oポートで市販8x8マトリクスLEDを駆動」に書いた。
 よく考えたら8つのI/Oポートで駆動できそうである。

↓のように配線されているマトリクスLEDの駆動について

8x8matrixled

  1. SCRのカソード    ←'L'
  2. SCRのゲート     ←'H', 他SCRのゲート←'Z'
  3. SCRのカソード    ←データ(Active'L')

で駆動することを考えていた。

 SCRのカソードとゲートは↓のように接続されているので
8x8led3

  • P1←'H' → SCR1 ON
  • LED(1,2) → SCR2ゲート → SCR2 ON

となり、SCR2がONしてしまう。

 SCR2がONしないようにするには、SCR2のゲート(P1)を'L'にしておく必要があるのだが、SCR2のゲートとSCR1のカソードは繋がっているので、P1を'L'にするとLED(1,2)が点灯してしまう。
つまり、SCR1だけONしようとするとLED(1,2)~LED(1,7)までのLEDが全て点灯することになる。

 このとき、SCR1はゲートを'L'にしても、SCR1→LED(1,2)→P1 で電流が流れているので、SCR1のカソードに接続されたR9やポートP9は必要ない。

任意の列(x)にデータD(0-7)を出力する方法は

  1. P(0-7) ← 'ZZZZZZZZ'       (ALL_OFF)
  2. P(x) ← 'H',  
    P(x以外) ← 'L'         (SCR(x) ON)
  3. if D(n)='1' then P(n) ← 'L'
    else        P(n) ← 'Z'  (データ出力負論理)

でよいのではないか。

 SCRをONにする期間(2)に関係のないLEDが点灯するが、SCRをONにする期間(2)がデータを出力している期間(3)と比較して短時間であれば人間には見えないだろう。

 ソースは↓こんな感じ

void disp_col(uint8_t col, uint8_t data) {
     ALL_OFF();
     _delay_us(50);
     COL_ON(col); /* colmun on */
     _delay_us(10);  /* 用調整 */
     PORTB = 0x00;
     DDRB  = data;
}

SCRのゲートをONした後の時間待ちは電源電圧によって異なるので用調整。

9つのI/Oポートで市販8x8マトリクスLEDを駆動」と同じH/Wを使って、常時P9を'Z'とする方法で試してみた。

8x8led1

↓06:55と23:55
8x8led_8io ←リンク先にAVI
(ちょっと見にくい)

« 1000時間の法則 | トップページ | 自分のアタマで考えよう »

日記・コラム・つぶやき」カテゴリの記事

AVR」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 8つのI/Oポートで市販の8×8マトリクスLEDを駆動:

« 1000時間の法則 | トップページ | 自分のアタマで考えよう »