目次
前
次
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ビットのデータ転送は、以下。
- CLKをLに設定
- 2^7ビット目(MSB)出力 CLKをH→Lと変化させる
- 2^6ビット目出力 CLKをH→Lと変化させる
- 2^5ビット目出力 CLKをH→Lと変化させる
- 2^4ビット目出力 CLKをH→Lと変化させる
- 2^3ビット目出力 CLKをH→Lと変化させる
- 2^2ビット目出力 CLKをH→Lと変化させる
- 2^1ビット目出力 CLKをH→Lと変化させる
- 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けたの数字表示が
可能になる。
- 0けた目のデータ出力 クロックをL→H→Lと変化させる
- 1けた目のデータ出力 クロックをL→H→Lと変化させる
- 2けた目のデータ出力 クロックをL→H→Lと変化させる
- 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;
}
目次
前
次