[Arduino]シフトレジスタを使って7セグLEDを表示する

Arduino
この記事は約2分で読めます。

7セグLEDは数値などを表示するものとしては代表的ですが、「.」を含めて8ピン使います、数桁表示すると無駄に消費してしまします。

シフトレジスタを使えば大幅に消費するピンが減るので使ってみました。

シフトレジスタとは

Arduinoとdata, clock, latchの3ピンで制御します

  • clockがLowからHighになる時、dataの値(0,1)を出力ポートに流します
  • 出力ポートは流されてきた値をAからHに向かってずらします
  • 必要分データを送信したら最後にlatchをLow→Highにすると出力ポートに設定された値を実際に反映させます

うん、難しいねw

ちなみにほかのピンですべて0とかも出来るらしい(今回はよくわかってないけど接続しちゃってます)

それと74HC595は連結できるので1つでは8bitのみですが、16bit. . . と増やせます

やってること

今回は1つの7セグLEDを0~9を表示するだけにチャレンジです

「.」はすべて表示しません

/*
* シフトレジスタテスト
*/
#define DATAPIN 8
#define LATCHPIN 9
#define CLOCKPIN 10
int data[][8] = {
{ 1,1,1,1,1,1,0,0}, //0
{ 0,1,1,0,0,0,0,0}, //1
{ 1,1,0,1,1,0,1,0}, //2
{ 1,1,1,1,0,0,1,0}, //3
{ 0,1,1,0,0,1,1,0}, //4
{ 1,0,1,1,0,1,1,0}, //5
{ 1,0,1,1,1,1,1,0}, //6
{ 1,1,1,0,0,0,0,0}, //7
{ 1,1,1,1,1,1,1,0}, //8
{ 1,1,1,1,0,1,1,0}, //9
{ 0,0,0,0,0,0,0,0}, // all off
{ 1,1,1,1,1,1,1,1}, //all on
};
void setup() {
pinMode(DATAPIN, OUTPUT);
pinMode(LATCHPIN, OUTPUT);
pinMode(CLOCKPIN, OUTPUT);
pinMode(13, OUTPUT);
output(3);
delay(2000);
}
void loop() {
int cnt;
for( cnt=0; cnt<10; cnt++) {
output(10);
output(cnt);
delay(500);
}
}
//データ出力
void output(int selectled) {
int cnt;
for(cnt=8; cnt>=0; cnt–) {
digitalWrite(DATAPIN, data[selectled][cnt]?HIGH:LOW); //1bit文のデータ状態を指定
onoff( CLOCKPIN);
onoff(13);
}
onoff( LATCHPIN );
}
void onoff(int Pin) {
digitalWrite(Pin, LOW);
digitalWrite(Pin, HIGH);
}

回路図


シフトレジスタが理解するのに時間がかかったため大変でした

参考:

シフトレジスタ(74HC595)の使い方 – chibiegg研究ノート

コメント