초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

시프트 레지스터-다수의 LED 깜빡이기

2015-01-23 10:13:15

시프트 레지스터란?



플립플롭(flip-flop) 또는 래치(latch)라고도하는, 0과 1만을 갖는 1비트 값을 저장할 수 있는 기본 회로가 있습니다.

레지스터란 이런 플립플롭을 여려 개 일렬로 연결하여, 여러 비트로 구성한 2진수를 저장할 수 있게 한 것을 말합니다.

 

 

 


 

이 예제에서 사용된 8bit 시프트 레지스터는 8개의 플립플롭이 연결되어 있으며, 단방향 또는 양방향으로 매 클럭펄스마다, 한 플립플롭 씩 저장된 값을 좌우로 이동시킬 수 있는 레지스터입니다. 여기서 클럭 펄스란 일정한 간격을 갖는 전기적 펄스로 회로내의 동작을 동기화하는데 사용됩니다.  (전기적 펄스에 대한 내용은 2.3 아날로그와 디지털, 2.4 펄스 폭 변조를 참고합니다.)

 

시프트레지스터의 용도로서 대표적인 것은 데이터의 직렬-병렬변환(SIPO : Serial In Parallel Out)으로 직렬입력으로 다중 출력을 만들어 낼 수 있습니다. 이 예제에서는 오렌지보드의 핀 3개를 사용하여 8개의 LED 를 제어 해 봅니다.
 

 

 

 

 

시프트 레지스터 사용방법



시프트 레지스터는 핀마다 고유의 기능이 있으므로 연결시 방향에 주의 합니다.

홈이 파진 부분을 위로 향하게 했을때를 기준으로 좌측 상단에 있는 핀이 1번 핀이 되며,  총 16개의 핀으로 구성되어 있습니다.
 


 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 시프트 레지스터 1 SN74HC595N
3 LED 8 LED 색상 무관
4 브레드 보드 1  
5 점퍼케이블  18  

 

부품명 오렌지 보드 시프트 레지스터 LED 브레드 보드 점퍼케이블
파트

 

 

 

 

 

 

하드웨어 making



1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 시프트 레지스터를 그림과 깉이 홈이 위로가게하여, 양쪽 IC영역에 걸치도록 꽂습니다.

4. LED 8개를 캐소드(짧은 단자)가 반대쪽의 -버스에 연결되도록 꽂습니다.

5. 각 LED의 애노드(긴 단자)에 330Ω 저항을 연결합니다.

6. 시프트 레지스터의 15, 1, 2, 3, 4, 5, 6, 7번핀을 8개의 LED 애노드에 각각 연결합니다.

7. 시프트 레지스터의 8번핀과 13번을 -버스에 연결합니다.

8. 시프트 레지스터의 10번핀과 16번핀을 +버스에 연결합니다.

9. 시프트 레지스터의 12번핀을 오렌지보드 2번핀에 연결합니다.

10. 시프트 레지스터의 11번핀을 오렌지보드 3번핀에 연결합니다.

11. 시프트 레지스터의 14번핀을 오렌지보드 4번핀에 연결합니다.

12. 8개의 LED 캐소드가 연결된 -버스를 오렌지보드 GND와 연결된 -버스와 연결합니다. 



 

 

 

소프트웨어 coding


 

  1. /*
  2.   제목    : 시프트 레지스터로 다수 LED 깜빡이기
  3.   내용   : 시프트 레지스터로 8개의 LED를 한번에 깜빡이게 해봅니다.
  4. */
  5.  
  6. // 클럭 입력이 활성화되면, 입력을 받아 저장하고, 클럭 입력이 비활성화되면 출력 측으로 전달합니다.
  7. // 출력은 클록이 다시 활성화될 때까지 그 값을 유지할 것이다.
  8. int latch = 2;
  9.  
  10. // 클럭펄스를 발생시켜 데이터 값이 레지스터에 저장되도록 합니다.
  11. int clock = 3;
  12.  
  13. // 이 데이터 핀을 통해 시프트 레지스터에 원하는 동작을 수행하게 합니다.
  14. int data = 4;
  15.  
  16. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  17. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  18. void setup() {
  19.   // latch, clock, data부분이 연결된 핀을 OUTPUT으로 설정합니다.
  20.   pinMode(latch, OUTPUT);
  21.   pinMode(clock, OUTPUT);
  22.   pinMode(data, OUTPUT);
  23. }
  24.  
  25. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  26. // 블록 안의 코드를 무한히 반복 실행됩니다.
  27. void loop() {
  28.   //8개의 LED를 한 개씩 켜고 끕니다.
  29.   for (int i = 0 ; i < 8 ; i++) {
  30.     // latch의 비활성화하여 데이터를 입력받도록 설정합니다.
  31.     digitalWrite(latch, LOW);
  32.     // 데이터로 입력된 값을 클럭 펄스로 동기화하여 시프트 레지스터에 저장합니다.
  33.     shiftOut(data, clock, MSBFIRST, 1 << i);
  34.     // latch를 활성화하여 저장된 입력된 데이터를 출력핀으로 전달합니다.
  35.     digitalWrite(latch, HIGH);
  36.     // 1초간 대기합니다.
  37.     delay(1000);
  38.   }

 

TIP 

MSBFIRST - Most Significant Bit First의 약자로 가장 중요한 비트(자릿수가 가장 큰 왼쪽) 라는 뜻입니다.

LSBFIRST - Least Significant Bit First의 약자로 가장 중요도가 낮은 비트 먼저(자릿수가 가장 낮은 오른쪽) 라는 뜻입니다.

 

 

 

 

 

 

 

 

비트연산자(>>, <<)

 

시프트레지스터는 1비트씩 제어를 통해 여러 핀을 동시에 제어하게되는데 이때 비트를 제어하기 위해서는 비트연산자를 사용합니다.

위 코드에서는 비트이동연산자라고 불리는 <<, >>를 사용합니다.

 

<<는 왼쪽으로 비트를 이동하라는 명령어이고

>>는 오른쪽으로 비트를 이동하라는 명령어입니다.

 

 

예를 들어 1<<2라면 1을 왼쪽으로 2칸 이동하라는 의미로 결과값은 100이 출력됩니다.

이동하면서 생기는 공간은 0으로 채워집니다.

 

 

주의할 점은 8<<1이라해서 8이 한 칸 왼쪽으로 이동해서 80이 되는것이 아닌 비트는 이진수 단위이기 때문에

8을 이진수로 변환하면 0b1000이고 그래서 결과값은 0b1000이 왼쪽으로 한 칸 이동한 0b10000 = 16이 됩니다.

 

 

결국 왼쪽으로 한칸씩 이동할때마다 원래값에서 x2가 된다고 이해가 되면 편합니다. 

반대로 오른쪽으로 한칸씩 이동하면 /2가 됩니다.

 

 

 

 

 

 

코드실행

 

코드에서는 for문에 의해 i값이 0부터 7까지 증가하고 증가한 값만큼 1의 비트가 왼쪽으로 이동합니다.(1<<i)

 

따라서 위의 코드를 실행하면 다음과 같은 LED의 깜빡임을 볼 수 있습니다.

 

 

MSB          LED1     LED2     LED3     LED4     LED5     LED6     LED7     LED8             LSB
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     켜짐
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      켜짐     꺼짐
꺼짐     꺼짐      꺼짐      꺼짐      꺼짐      켜짐      꺼짐     꺼짐
꺼짐     꺼짐      꺼짐      꺼짐      켜짐      꺼짐      꺼짐     꺼짐
꺼짐     꺼짐      꺼짐      켜짐      꺼짐      꺼짐      꺼짐     꺼짐
꺼짐     꺼짐      켜짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼짐
꺼짐     켜짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼짐
켜짐     꺼짐      꺼짐      꺼짐      꺼짐      꺼짐      꺼짐     꺼짐
 

 

 

 

※ 아래의 영상은 위 코드에서 LED의 깜빡임 delay()수치를 조정하였습니다.

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

시프트 레지스터, 아두이노, 오렌지보드