Lab-03: Control of 8 LEDs Using the 74595 Shift Register

 

[Theory]

회로도

 

/* shiftOut 함수를 통해 1개의 74HC595 사용하여 8개의 LED 제어 */

 

int latchPin = 8;                                  //ST_CP(Storage register Clock) -> Latch Clock

int clockPin = 12;                               //SH_CP(Shift register Clock) -> Shift Clock

int dataPin = 11;                                //74HC595 DS

 

byte ledStatus;                                                  //LED 상태 변수

 

void setup()

  pinMode(latchPin, OUTPUT);                     //74HC595 데이터를 전달하는 핀이므로 모두 OUTPUT 사용

  pinMode(clockPin, OUTPUT);

  pinMode(dataPin, OUTPUT);

  Serial.begin(9600);                                        //SerialMonitor 사용

 

 

void loop() 

  ledStatus = 0;                                                //byte형이므로 0=0b00000000

 

/* 순차적으로 LED 점등시키기 위한 반복문 */

  for (int i = 0; i < 8; i++)                 //8 반복

    Serial.println(ledStatus);                           //SerialMonitor ledStatus 출력  

    ledStatus = (ledStatus << 1) | 1;               /* ledStatus 왼쪽으로 1 bit 밀고 OR( | 연산자)                                               통해 1 (=0b00000001) 대입.

                                                                ex1) i=0 번째 루프일 , 0b00000000 | 0b00000001

                                                                     i=1 번째 루프일 , 0b00000010 | 0b00000001

                                        i=4 다섯 번째 루프일 , 0b00011110 | 0b00000001

                                                                ex2) ledStatus = (ledStatus << 2) | 2 경우

                                          i=0 번째 루프일 , 0b00000000 | 0b00000010

                                                                     i=1 번째 루프일 , 0b00001000 | 0b00000010

                                          i=4 번째 루프일 , 0b10101000 | 0b00000010 */

    Serial.println(ledStatus);                          

    Serial.println("--------");                             //SerialMonitor (ledStatus << 1) | 1 연산결과 출력   

    digitalWrite(latchPin, LOW);                   //latchPin LOW(0) 74HC595에서 데이터 출력X

 

    shiftOut(dataPin, clockPin, MSBFIRST, ledStatus);

/* 원하는 (ledStatus) 맞는 데이터신호(dataPin) 클럭신호(clockPin) 내보내는 함수.

  (데이터핀넘버, 클럭핀넘버, MSBFIRST or LSBFIRST, ) 순서로 사용.

  ledStatus 있는 값을 shiftOut 함수를 통해 dataPin, clockPin 값을 조정해서 내보내줌.

  MSBFIRST 경우 Q7부터 값을 채워줌.

  (ex) 0b11110000 -> Q7=1, Q6=1, Q5=1, Q4=1, Q3=0, Q2=0, Q1=0, Q0=0

  LSBFIRST 경우 Q0부터 값을 채워줌.

  (ex) 0b11110000 -> Q0=1, Q1=1, Q2=1, Q3=1, Q4=0, Q5=0, Q6=0, Q7=0 */

 

    digitalWrite(latchPin, HIGH);                  //latchPin HIGH(1) 74HC595에서 데이터 출력을    

                                          하면서 LED 새로 업데이트 상태로 점등

  

    delay(500);                                               //LED 변화를 확인하기 위해 500ms 정지

 

 

/* 순차적으로 LED 끄기 위한 반복문 */

  for (int i = 0;i<8;i++)                                   //8 반복

    ledStatus <<= 1;                                       /*ledStatus = ledStatus << 1 같은 의미.

                                          ledStatus 왼쪽으로 1 bit 밀기 만함.

                                               ex1) i=0 번째 루프일 , 0b11111111 << 1 = 0b11111110

                                                                 i=1 번째 루프일 , 0b11111110 << 1 = 0b11111100

                                    i=4 다섯 번째 루프일 , 0b11110000 << 1 = 0b11100000 */

    digitalWrite(latchPin, LOW);

    shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); 

    digitalWrite(latchPin, HIGH);

    delay(500);

 

 

74HC595 (Latch 포함된 Shift Register)

 

Logic diagram

 

Timing diagram

 

- Shift Clock 데이터를 동기화 시키기 위한 역할.

  (Shift Clock HIGH->LOW , Serial data 값을 기록)

- Storage register (Latch) HIGH->LOW 시켰을 , Q0-Q7 출력이 동작을 한다.

  (Latch HIGH->LOW 1 마다, Q0-Q7순서로 데이터 전달)

 

ex) Shift Clock에서 HIGH->LOW(Pulse) 4 반복 , Serial data값이 전부 HIGH 였다면, Latch 1 HIGH->LOW 됐을 , Q0-Q3 HIGH, Q4-Q7 LOW. 여기서 Latch 한번더 HIGH->LOW 된다면, Q0 LOW 되고 Q1-Q5까지는 HIGH 상태, Q6-Q7 LOW 상태로 Shift 된다.

 

* https://www.youtube.com/watch?v=gZ2oEjQgtcM 참조

 

[Lab]

1. 프로젝트 검색창에 "LED" 입력하고 번째로 표시되는 Ti Can 프로젝트를 가져다가 소스 코드를 보고 동작원리를 파악하라.

2. 좌측 LED부터 1, 2, ..., 8번까지 번호를 지정(in your mind). 홀수번 4 LED 짝수번 4 LED 번갈아 가면서 동시에 점멸하도록 하라. 현장 확인(10)

- 여러분의 상상력을 발휘하여 LED 재미 있게 점멸하도록 하라. 필요시 LED 수를 늘이거나 줄일 있다. 현장 확인(10)