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); | |
} |
回路図
シフトレジスタが理解するのに時間がかかったため大変でした
出来たぁ pic.twitter.com/UgmnJIdCLk
— じんさん (@uesitananame55) February 24, 2017
参考:
コメント