74HC595 移位暫存器 (Shift Register) 是一顆八位元 (8-bit) 序列輸入 (serial-in)、序列或是並列輸出 (serial/parallel-out) 的移位暫存器,使用這顆晶片,你只需要微控制器上的三支接腳,就可以同時控制八個輸出。
你也可以將多顆移位暫存器串接 (Daisy chain) 在一起進一步擴充更多的輸出腳位,例如: 串兩顆 74HC595 就可以同時控制 16 個輸出。你也許會想要使用其它移位暫存器,例如:STP16C596 可以同時驅動 16 組 LED 燈泡。
以下程式. 會在 8 顆 LED 上計數數字,從 0 一直計數到 255 (註:利用 8 顆 LED 表示數字,數字以二進制表示, 8 顆 LED 全部關掉時代表數字 0,全亮時代表 255):
================================================
// Lab11 使用 74HC595 和三支腳位控制 8 顆 LED
// Lab11 使用 74HC595 和三支腳位控制 8 顆 LED
// 接 74HC595 的 ST_CP (pin 12,latch pin)
int latchPin = 8;
// 接 74HC595 的 SH_CP (pin 11, clock pin)
int clockPin = 12;
// 接 74HC595 的 DS (pin 14)
int dataPin = 11;
int latchPin = 8;
// 接 74HC595 的 SH_CP (pin 11, clock pin)
int clockPin = 12;
// 接 74HC595 的 DS (pin 14)
int dataPin = 11;
void setup() {
// 將 latchPin, clockPin, dataPin 設置為輸出
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
// 將 latchPin, clockPin, dataPin 設置為輸出
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
// 在 8 顆 LED 上計數數字,從 0 計數到 255
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
// 送資料前要先把 latchPin 拉成低電位
digitalWrite(latchPin, LOW);
// 使用 shiftOut 函式送出資料
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
// 在 8 顆 LED 上計數數字,從 0 計數到 255
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
// 送資料前要先把 latchPin 拉成低電位
digitalWrite(latchPin, LOW);
// 使用 shiftOut 函式送出資料
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
// 送完資料後要把 latchPin 拉回成高電位
digitalWrite(latchPin, HIGH);
// 隔 500ms 後換下一個數字
delay(500);
}
}
===================================================
digitalWrite(latchPin, HIGH);
// 隔 500ms 後換下一個數字
delay(500);
}
}
===================================================
使用 74HC595 的時候要注意一件事,在送資料前要先把 latchPin 拉成低電位,接著使用 shiftOut() 函式送出資料,送完資料後要把 latchPin 拉回成高電位,如下:
===================================================
// 送資料前要先把 latchPin 拉成低電位
digitalWrite(latchPin, LOW);
// 使用 shiftOut 函式送出資料
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
// 送完資料後要把 latchPin 拉回成高電位
digitalWrite(latchPin, HIGH);
===================================================
digitalWrite(latchPin, HIGH);
===================================================
沒有留言:
張貼留言