前回はシフトレジスター『74HC595』の使用方法を学びました。
今回はシフトレジスターを使用して7セグメントディスプレイで0~Fまで表示してみましょう。
7セグメントディスプレイについて
7セグメントディスプレイはデジタル電子表示デバイスです。「8」という数字と小数点が表示されており、これは8つのLEDから構成されています。これらのLEDは共通のアノード(陽極)と個別のカソード(陰極)を持っています。内部構造とピンの配置図は以下の通りです
上の回路図でわかるように、各LEDの状態を個別に制御することができます。また、異なるONとOFFの状態のLEDを組み合わせることで、さまざまな文字(数字やアルファベット)を表示することができます。例えば、「0」を表示する場合、LEDセグメントA、B、C、D、E、FをONにし、LEDセグメントGとDPをOFFにする必要があります。
このプロジェクトでは、共通アノード型の7セグメントディスプレイを使用します。そのため、LEDセグメントにLOWレベルの信号を入力すると、LEDが点灯します。セグメント “A”を最下位、セグメント “DP” を最上位として、上位から下位に向かって “DP”、”G”、”F”、”E”、”D”、”C”、”B”、”A” となります。文字 “0” はコード 1100 0000 = 0xc0 に対応します。
表にすると以下のとおりです。
CHAR | DP | G | F | E | D | C | B | A | Hex | ASCII |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0xC0 | 1100 0000 |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0xF9 | 1111 1001 |
2 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0xA4 | 1010 0100 |
3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0xB0 | 1011 0000 |
4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0x99 | 1001 1001 |
5 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0x92 | 1001 0010 |
6 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0x82 | 1000 0010 |
7 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0xF8 | 1111 1000 |
8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x80 | 1000 0000 |
9 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0x90 | 1001 0000 |
A | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0x88 | 1000 1000 |
B | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0x83 | 1000 0011 |
C | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0xC6 | 1100 0110 |
D | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0xA1 | 1010 0001 |
E | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0x86 | 1000 0110 |
F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0x8E | 1000 1110 |
回路図
接続図
動作デモ
コード
/**********************************************************************
Filename : 1 Digital 7 Segment Display
Description : Use 74HC595 to drive the digital display
Auther : www.freenove.com
Modification: 2022/10/24
**********************************************************************/
int dataPin = 12; // Pin connected to DS of 74HC595(Pin14)
int latchPin = 13; // Pin connected to ST_CP of 74HC595(Pin12)
int clockPin = 14; // Pin connected to SH_CP of 74HC595(Pin11)
// Define the encoding of characters 0-F for the common-anode 7-Segment Display
byte num[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
void setup() {
// set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
// display 0-F on digital tube
for (int i = 0; i < 16; i++) {
writeData(num[i]);// Send data to 74HC595
delay(1000); // delay 1 second
writeData(0xff); // Clear the display content
}
}
void writeData(int value) {
// Make latchPin output low level
digitalWrite(latchPin, LOW);
// Send serial data to 74HC595
shiftOut(dataPin, clockPin, LSBFIRST, value);
// Make latchPin output high level, then 74HC595 will update the data to parallel output
digitalWrite(latchPin, HIGH);
}
コード解説
まずは12~15行目。発光パターンを16進数2桁=1バイトでbyte型の配列に入れていますね。
byte num[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
メインループは出力して、1秒待って、消しての繰り返し。
33行目からがメインディッシュ。ラッチピンを下げて、シフトアウトして、ラッチピンを上げる⇒出力する
void writeData(int value) {
// Make latchPin output low level
digitalWrite(latchPin, LOW);
// Send serial data to 74HC595
shiftOut(dataPin, clockPin, LSBFIRST, value);
// Make latchPin output high level, then 74HC595 will update the data to parallel output
digitalWrite(latchPin, HIGH);
}
そんなに難しいプログラムではないですね。最初の発光パターンを用意するのがちょっと面倒ですね。
次回は4つの7セグディスプレイを制御してみましょう。
コメント