MAX7219が超便利!7セグメントLEDが楽々 [ハード]
昔からある「7セグメントLED」。
家庭じゃあまり見ないけれども、
電子工作なんかでは、いまだに現役。
表示できるのは、ほぼ数字だけだけど、
安いし扱いが簡単なのと離れてても見えるのが、
いまだに使われている理由だろうか。
1ケタは、8つのLEDで構成されてて、それぞれをON/OFFして、文字を表示する。
つまり1ケタで8つのIOが必要なわけだけど、
普通何かを表示するには、4桁くらいはほしいわけで、
こうなると、8×4=32本のIOピンが必要。
で、そんなことはできないわけで、ダイナミックドライブといわれるテクニックで、
1ケタずつ切り替えて表示するので、8+4=12本のIOピンで済ませている。
テレビで工場とかの機械を映してるときに、表示がチラチラしてるのはこのせい。
これをたった3本のIOピンで、8桁も表示してしまうのが、MAX7219というIC。
http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf
↑データシート。
しかもこのICは、文字パターンも持っているので、パターンを入れる必要もない。
IOピンは、LOAD,DIN、CLKの3つだが、
使い方は簡単で、LOADピンをLOWにして、アドレス+データをDINとCLKでシリアルで書き込み、
LOADピンをHIGHに戻すだけ。
#define P_LOAD 10
#define P_DIN 11
#define P_CLK 13
void setup() {
pinMode(P_LOAD,OUTPUT);
pinMode(P_DIN, OUTPUT);
pinMode(P_CLK, OUTPUT);
digitalWrite(P_LOAD,HIGH);
digitalWrite(P_DIN, LOW );
digitalWrite(P_CLK, LOW );
delay(1);
max_out( 0x0F, 0x00 );
max_out( 0x09, 0xFF );
max_out( 0x0A, 0x08 );
max_out( 0x0B, 0x07 );
max_out( 0x0C, 0x01 );
}
void loop()
{
char i;
for (i=1; i <= 8; i++){
max_out(i, 9-i);
}
delay(2000);
}
void max_out( byte high_byte, byte low_byte )
{
digitalWrite( P_LOAD, LOW );
shiftOut( P_DIN, P_CLK, MSBFIRST, high_byte );
shiftOut( P_DIN, P_CLK, MSBFIRST, low_byte );
digitalWrite( P_LOAD, HIGH );
delayMicroseconds(1);
}
こんな感じで書くと↓こうなる。
max_out(アドレス,データ)で書き込める。
アドレスは、右端が1で順に増えてって左端が8になる。
9からは設定になっていて、
9は、FFにするとデコードになり、データに1を書くだけで1が表示される。
0を設定するとデコードされず、ビットで表示される。
10は、輝度で0が暗くて、15が明るい。
11は、何ケタ表示するかで、0-7の値で1-8桁になる。
12は、表示のON/OFFができ、0でOFF、1でON。
13,14はなく、15がテストモードで、0がノーマル、1でテスト。
データの表示だが、アドレス9でデコードにしてると
0から9までは、0から9が表示され、10からは、-,E,H,L,Pになる。
アドレス9で非デコードにしてると、ビット表示になる。
タグ:7セグメントLED
コメント 0