2016年8月9日 星期二

using 74hc595 on arduino

Ref : http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab11-74hc595-8-led.html

Ref :  https://www.arduino.cc/en/Reference/ShiftOut
實驗目的
練習以 74HC595 移位暫存器 (Shift Register) 擴充 Arduino 的 I/O 腳位,使用三支接腳搭配 74HC595 移位暫存器控制八顆 LED 燈。
74HC595 簡介
當微控制器腳位不夠用的時候,你就需要移位暫存器 (shift register) 來擴充微控制器的腳位。底下簡介 74HC595 這顆移位暫存器:

74HC595 移位暫存器 (Shift Register) 是一顆八位元 (8-bit) 序列輸入 (serial-in)、序列或是並列輸出 (serial/parallel-out) 的移位暫存器,使用這顆晶片,你只需要微控制器上的三支接腳,就可以同時控制八個輸出。
你也可以將多顆移位暫存器串接 (Daisy chain) 在一起進一步擴充更多的輸出腳位,例如: 串兩顆 74HC595 就可以同時控制 16 個輸出。你也許會想要使用其它移位暫存器,例如:STP16C596 可以同時驅動 16 組 LED 燈泡。
74HC595 總共有 16 支接腳,底下是這些腳位的圖表說明:












































OE  -> low active   output enable

pin 14 ->   Serial data input

  • 接上 8 顆 LED,將每顆 LED 短腳 (陰極) 直接接到 GND,然後將每顆 LED 的長腳 (陽極) 個別接至 74HC595 的輸出腳位 D0 ~ D7 並串接一顆 220 ohm 電阻
  • 74HC595 接線其一:
    • Vcc (pin 16) 與 MR (pin 10) 接 5V
    • GND (pin 8) 與 OE (pin 13) 接地
  • 74HC595 接線其二:
    • DS (pin 14) 接 Arduino pin 11 (下圖藍線)
    • ST_CP (pin 12, latch pin) 接 Arduino pin 8 (下圖綠線)
    • SH_CP (pin 11, clock pin) 接 Arduino pin 12 (下圖黃線)
  • 假如發現 LED 有震動閃爍的現象,可以在 ST_CP (pin 12, latch pin) 上接一顆 0.1uF 電容以去除閃爍現象


        
// Lab11 使用 74HC595 和三支腳位控制 8 顆 LED
02
03// 接 74HC595 的 ST_CP (pin 12,latch pin)
04int latchPin = 8;
05// 接 74HC595 的 SH_CP (pin 11, clock pin)
06int clockPin = 12;
07// 接 74HC595 的 DS (pin 14)
08int dataPin = 11;
09
10void setup() {
11  // 將 latchPin, clockPin, dataPin 設置為輸出
12  pinMode(latchPin, OUTPUT);
13  pinMode(clockPin, OUTPUT);
14  pinMode(dataPin, OUTPUT);
15}
16
17void loop() {
18  // 在 8 顆 LED 上計數數字,從 0 計數到 255
19  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
20    // 送資料前要先把 latchPin 拉成低電位
21    digitalWrite(latchPin, LOW);
22     
23    // 使用 shiftOut 函式送出資料
24    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); 
25
26    // 送完資料後要把 latchPin 拉回成高電位
27    digitalWrite(latchPin, HIGH);
28     
29    // 隔 500ms 後換下一個數字
30    delay(500);
31  }
32}

使用 74HC595 的時候要注意一件事,在送資料前要先把 latchPin 拉成低電位,接著使用 shiftOut() 函式送出資料,送完資料後要把 latchPin 拉回成高電位,如下:
1// 送資料前要先把 latchPin 拉成低電位
2digitalWrite(latchPin, LOW);
3     
4// 使用 shiftOut 函式送出資料
5shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); 
6
7// 送完資料後要把 latchPin 拉回成高電位
8digitalWrite(latchPin, HIGH);



其實就是先傳送資料前....先把latch pin  拉  LOW..  然後使用ShiftOut 傳送Byte 出去.....


串連兩顆74hc595   





// Lab12 使用兩顆 74HC595 和三支腳位控制 16 顆 LED
02
03// 接 74HC595 的 ST_CP (pin 12,latch pin)
04int latchPin = 8;
05// 接 74HC595 的 SH_CP (pin 11, clock pin)
06int clockPin = 12;
07// 接 74HC595 的 DS (pin 14)
08int dataPin = 11;
09
10void setup() {
11  // 將 latchPin, clockPin, dataPin 設置為輸出
12  pinMode(latchPin, OUTPUT);
13  pinMode(clockPin, OUTPUT);
14  pinMode(dataPin, OUTPUT);
15}
16
17void loop() {     
18  for (int led = 0; led < 16; led++) {
19    int numberToDisplay  = 1 << led;
20    byte high_Byte = highByte(numberToDisplay);
21    byte low_Byte = lowByte(numberToDisplay);
22     
23    // 送資料前要先把 latchPin 拉成低電位
24    digitalWrite(latchPin, LOW);
25     
26    // 先送高位元組 (Hight Byte), 給離 Arduino 較遠的那顆 74HC595
27    shiftOut(dataPin, clockPin, MSBFIRST, high_Byte); 
28    // 再送低位元組 (Low Byte), 給離 Arduino 較近的那顆 74HC595
29    shiftOut(dataPin, clockPin, MSBFIRST, low_Byte); 
30
31    // 送完資料後要把 latchPin 拉回成高電位
32    digitalWrite(latchPin, HIGH);
33    
34    delay(40);
35  }
36}




沒有留言:

張貼留言