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점)