目次

7セグメントLEDの制御

 7セグメントLEDは、a〜gとDPの8ピンをもつ。

 数字表示は、a〜gに数字のビットパターンを与える。
 小数点表示は、DPに制御信号を与える。

 7セグメントLEDは、内部に8個のLEDをもち、電源
 は共通になっている。

 LEDのアノード側を共通にすると、アノードコモン型と呼ぶ。
 逆にカソード側を共通にすると、カソードコモン型と呼ぶ。

 4けたの数字を表示する場合は、信号線として4x8=32本
 必要になる。これでは、マイコンのピンを大量に使ってしまう
 ので、本数を減らす工夫を考える。


シリアル制御

 7セグメントLEDとマイコンを、シフトレジスタを挟んで接続する。  4けたの数字パターンを、4個のシフトレジスタに転送し、a〜gと  DPはシフトレジスタから出力する方式。  シフトレジスタとして、74HC164を利用すると、転送に必要な  クロックを共通にして、残りのデータを4ピンで賄える。  データ4ピン+クロック1ピンの合計5ピンで、4けたの数字表示が  可能になる。  シフトレジスタに8ビットを転送するので、処理時間は長い。  8ビットのデータ転送は、以下。
  1. CLKをLに設定
  2. 2^7ビット目(MSB)出力 CLKをH→Lと変化させる
  3. 2^6ビット目出力 CLKをH→Lと変化させる
  4. 2^5ビット目出力 CLKをH→Lと変化させる
  5. 2^4ビット目出力 CLKをH→Lと変化させる
  6. 2^3ビット目出力 CLKをH→Lと変化させる
  7. 2^2ビット目出力 CLKをH→Lと変化させる
  8. 2^1ビット目出力 CLKをH→Lと変化させる
  9. 2^0ビット目(LSB)出力 CLKをH→Lと変化させる
 4けたの10進数の最大数は、9999なので、16ビット変数xに  数値を入れて、4けたある7セグメントLEDに表示する関数を定義  する。 void display_led(UWORD x) { UBYTE dig[4] ; UBYTE i ; /* 各けたに分離する */ x %= 10000 ; *(dig+0) = x / 1000 ; x %= 1000 ; *(dig+1) = x / 100 ; x %= 100 ; *(dig+2) = x / 10 ; *(dig+3) = x % 10 ; /* LEDパターンに変換 */ *(dig+0) = led_pat[ *(dig+0) ] ; *(dig+1) = led_pat[ *(dig+1) ] ; *(dig+2) = led_pat[ *(dig+2) ] ; *(dig+3) = led_pat[ *(dig+3) ] ; /* LEDパターン出力 */ LED_CLK = OFF ; for ( i = 0 ; i < 8 ; i++ ) { /* 1ビット論理値確定 */ LED_DAT0 = OFF ; LED_DAT1 = OFF ; LED_DAT2 = OFF ; LED_DAT3 = OFF ; if ( *(dig+0) & 0x80 ) { LED_DAT0 = ON ; } if ( *(dig+1) & 0x80 ) { LED_DAT1 = ON ; } if ( *(dig+2) & 0x80 ) { LED_DAT2 = ON ; } if ( *(dig+3) & 0x80 ) { LED_DAT3 = ON ; } /* クロックに送信 */ LED_CLK = ON ; /* シフト */ *(dig+0) <<= 1 ; *(dig+1) <<= 1 ; *(dig+2) <<= 1 ; *(dig+3) <<= 1 ; /* クロックに送信 */ LED_CLK = OFF ; } }

パラレル制御

 7セグメントLEDとマイコンを、8ビットレジスタを挟んで接続する。  4けたの数字パターンを、4個のレジスタに転送し、a〜gとDPは  レジスタから出力する方式。  レジスタとして、74HC574を利用すると、データピンを共通にし  転送に必要なクロックを4ピンで賄える。  データ8ピン+クロック4ピンの合計12ピンで、4けたの数字表示が  可能になる。
  1. 0けた目のデータ出力 クロックをL→H→Lと変化させる
  2. 1けた目のデータ出力 クロックをL→H→Lと変化させる
  3. 2けた目のデータ出力 クロックをL→H→Lと変化させる
  4. 3けた目のデータ出力 クロックをL→H→Lと変化させる
 4けたの10進数の最大数は、9999なので、16ビット変数xに  数値を入れて、4けたある7セグメントLEDに表示する関数を定義  する。 void display_led(UWORD x) { UBYTE dig[4] ; /* 各けたに分離する */ x %= 10000 ; *(dig+0) = x / 1000 ; x %= 1000 ; *(dig+1) = x / 100 ; x %= 100 ; *(dig+2) = x / 10 ; *(dig+3) = x % 10 ; /* LEDパターンに変換 */ *(dig+0) = led_pat[ *(dig+0) ] ; *(dig+1) = led_pat[ *(dig+1) ] ; *(dig+2) = led_pat[ *(dig+2) ] ; *(dig+3) = led_pat[ *(dig+3) ] ; /* LEDパターン出力 */ LED_TRG0 = OFF ; LED_DAT = *(dig+0) ; LED_TRG0 = ON ; LED_TRG0 = OFF; LED_TRG1 = OFF ; LED_DAT = *(dig+1) ; LED_TRG1 = ON ; LED_TRG1 = OFF; LED_TRG2 = OFF ; LED_DAT = *(dig+2) ; LED_TRG2 = ON ; LED_TRG2 = OFF; LED_TRG3 = OFF ; LED_DAT = *(dig+3) ; LED_TRG3 = ON ; LED_TRG3 = OFF; }
目次

inserted by FC2 system