• Increase font size
  • Default font size
  • Decrease font size
  • default color
  • cyan color
  • red color

Arduino.TW樂園

Member Area
手把手理解74HC595工作原理 & shiftOut指令
站長Blog文章單元 - Arduino擴充IO (PWM IC, LED Driver IC, Digital/Analo)
作者是 xlinx   
週六, 29 五月 2010 22:46

擴充Digital IO應用74HC595移位暫存器工作原理說明。

PINS 1-7, 15 Q0 " Q7 Output Pins
PIN 8 GND Ground, Vss
PIN 9 Q7" Serial Out
PIN 10 MR Master Reclear, active low
PIN 11 SH_CP Shift register clock pin
PIN 12 ST_CP Storage register clock pin (latch pin)
PIN 13 OE Output enable, active low
PIN 14 DS Serial data input
PIN 16 Vcc Positive supply voltage

 

 

74HC595_腳位說明:

  • DS:序列資料,接Arduino的某個Digital I/O 腳位(範例使用11)。
  • Q0~Q7:8bit並行資料輸出,可以直接控制8個LED,或者是七段數碼管的8個腳位。
  • Q7′:串聯輸出端,與下一個74HC595的DS相連,實現多個595晶片之間的串聯(測試似乎串接八個會異常)。

74HC595重要的四個暫存器與狀態時序圖:

  • SH_CP:移位暫存器的時序輸入。上升沿時移位暫存器中的資料依次移動一位元,即Q0中的資料移到Q1中,Q1中的資料移到Q2中,依次類推;下降沿時移位暫存器中的資料保持不變。
  • ST_CP:存儲寄存器的時序輸入。上升沿時移位暫存器中的資料進入存儲寄存器,下降沿時存儲寄存器中的資料保持不變。應用時通常將ST_CP置為低點平,移位結束後再在ST_CP端產生一個正脈衝更新顯示資料。
  • MR:重置(RESET),低電平時將移位暫存器中的資料清零,應用時通常將它直接連高電位(VCC)。
  • OE:輸出允許,高電平時禁止輸出(高阻態)。在顯示更新頻率低的時候可以用Arduino的一個IO腳來控制它,這樣可以很方便地產生閃爍和熄滅的效果。實際應用時可以將它直接接地(GND)。

 

 

 對於一個最簡單的74HC595應用來講,可以用Arduino的三個數位I/O埠分別控制DS、SH_CP和ST_CP,然後將MR和OE分別接VCC和地。下面是利用74HC595來控制8個LED。 



shiftOut原始動作程式

#include "wiring_private.h"

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
{
	int i;
	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}
int latchPin = 8; //ST_CP 低電位鎖定資料並輸出Q0~Q7;高電位更新
int clockPin = 12; //SH_CP
int dataPin = 11; //DATA

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //count up routine
  for (int first8bits = 0; first8bits < 256; first8bits++) {
    for (int second8bits = 0; second8bits < 256; second8bits++) {
    //LATCH低電壓時Q0~Q7輸出
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, first8bits);   
    shiftOut(dataPin, clockPin, LSBFIRST, second8bits);   
    //將DATA以左移方式更新
    digitalWrite(latchPin, HIGH);
    //latch(ST_CP)高電位更新資料
    delay(1000);
}   } }

[download code]


blog comments powered by Disqus
最近更新在 週日, 04 七月 2010 13:13