[아두이노] 74HC595 시프트 레지스터로 FND 제어하기



안녕하세요 대짜이찐입니다.
이번시간에는 74hc595 시프트 레지스터를 사용하여
FND(7-segment)를 제어해 보겠습니다.

이전 1자리 FND를 제어하기 위해서는 아두이노에 8개의 I/O핀을 연결해야 했습니다.
하지만 연결해야 할 핀이 많다면, FND 하나를 제어하기 위해
8의 I/O핀을 사용하는 것이 문제가 됩니다.

이럴 경우 시프트 레지스터(Shift Register)를 사용하면, 
아두이노에 연결해야 할 I/O핀이 3개로 줄어들게 됩니다.



아두이노에서 시리얼 레지스터로 데이터가 전달됨을 알려주는 Clock 신호와,
시리얼 데이터를 함께 보내주면 시프트 레지스터는 8개의 신호를 받아
각각의 핀으로 신호를 출력합니다.




74HC595의 핀 맵 및 로직 다이어그램입니다.


  • 15번,1~7번 핀(QA~QH,output pin)은 출력을 제어 하는 8개의 핀입니다.

  • 14번 핀(A) 는 데이터 핀(Data pin, DS)으로 클럭에 맞춰 데이터를 전송해줍니다.

  • 13번 핀(OUTPUT ENABLE, OE)은 출력핀 전체를 on/off 시킬때 사용합니다. 이 핀으로 PWM제어를 할 수 있습니다. active low이므로 GND에 연결합니다.

  • 12번 핀(LATCH CLOCK, ST_CP)은 시프트 레지스터가 수신한 데이터를
    래치 레지스터에 저장하는 선입니다.

  • 11번 핀(SHIFT CLOCK, SH_CP)은 아두이노와 시프트 레지스터가 데이터를 전송할 수 있도록 클럭 신호를 전송하는 핀입니다.

  • 10번 핀(RESET, MR)은 리셋 핀입니다. active low이므로 비활성화를 위해 5V에 연결합니다.




SHIFT CLOCK(SH_CP)핀에 클럭 신호가 들어오면, A(Data pin)에서는 8개의 데이터를 전송합니다.
이 후 LATCH 레지스터에 저장하고, LATCH CLOCK(ST_CP)핀을 LOW로 바꿔주면
외부로 데이터를 전송할 수 있습니다. 데이터 전송이 끝나면 다시 HIGH로 올려줘야 합니다. 



아래 예제는 74HC595와 1자리 FND를 사용하여, 0~9까지 숫자를 출력하는 코드입니다.

준비물 :  아두이노 우노, 220Ω x 8EA, 점퍼선, 브레드 보드, FND(공통 애노드), 74HC595(IC칩)



기존 1자리 FND(애노드 타입) 핀 맵과 74HC595의 핀 맵입니다. 

아두이노
74HC595
FND
-
QA
a
-
QB
b
-
QC
c
-
QD
d
-
QE
e
-
QF
f
-
QG
g
-
QH
dp
5V
Vcc
Vcc
GND
GND
-
D8
A(Data Pin)

GND
OUTPUT ENABLE(OE)

D9
LATCH CLOCK(ST_CP)

D10
SHIFT CLOCK(SH_CP)

5V
RESET(MR)



/*
7-segment with a shift register
www.devicemart.co.kr
*/

int datapin = 8;   // 74HC595의 data(DS) 핀을 연결
int latchpin = 9// 74HC595의 latch(ST_CP) 핀을 연결
int clockpin = 10// 74HC595의 clock(SH_CP) 핀을 연결

// 공통 양극(Common Anode)방식 세그먼트 0~9 까지 숫자 16진수로 표현
byte digits[] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1B,0x01,0x09};

void setup()
{
 // shift register 설정 핀을 출력으로 세팅
 pinMode(latchpin, OUTPUT);
 pinMode(clockpin, OUTPUT);
 pinMode(datapin, OUTPUT);
}

void loop()
{
 // 숫자를 0~9까지 반복
 for (int number = 0; number < 10; number++)
 {
   // latch 핀을 데이터가 들어가기 전에 LOW로 바꿈
   digitalWrite(latchpin, LOW);
   
   // shiftOut 함수 사용시 인자 값
   // DS핀넘버, CLock핀넘버, MSBFIRST or LSBFIRST, 옮길자료(byte)
   shiftOut(datapin, clockpin, LSBFIRST, digits[number]);

   // latch 핀을 데이터가 들어간 후에 HIGH로 바꿈
   digitalWrite(latchpin, HIGH);
   delay(500);
 }
}

소스 코드 중에
-shiftOut()함수는 한 번에 한 Bit씩 한 Byte를 옮기는 함수입니다.
데이터의 최고(가장 왼쪽) 또는 최저(가장 오른쪽) 비트부터 시작할 수 있습니다.
각 비트는 차례대로 데이터 핀에 써집니다. 문법은 shiftOut(dataPin, clockPin, bitOrder, value)입니다.
bitOrder 인자값에서 MSBFIRST 또는 LSBFIRST로 1byte의 좌우 전송 방향을 정할 수 있습니다.

댓글 쓰기

0 댓글