아두이노

시프트 레지스터 (MAX 7219)를 이용한 세븐 시그먼트 8개 표시하기 - MAX 7219의 원리

ILETCTM 2014. 2. 27. 21:22
반응형

며칠간 이것저것 해보다가.. (완전 생기초 LED깜빡이기.. 등등)

목표가 하나 생겼는데 그것은 시프트 레지스터를 이용해서 세븐 시그먼트를 표현하는 방법에 관한 것이다.

처음에 세븐 시그먼트를 표현한다고 햇갈렸는데 (cathod anode타입의 회로구성이라든지.. 이 발이 무슨 세그먼트에 연결 된 발인지 등등..)

오기가 생겨서 하다보니 성공을 했는데.. 이건 할때마다 잘 되고 안되고 한다..

여튼.. 그 확장판으로

세븐시그먼트를 시프트 레지스터를 이용하여 구현하는 방법에 대해서 연구를 해 보았다.

우선 시프트 레지스터란 무었인가...

3학년 때, 온도계를 만드는 과제가 있었는데 그 당시 각 세그먼트에 대한 발광정보를 한 번에 저장해서 한번에 쏴주는.. 그런 용도의 것으로 알고있었다.

즉 아두이노와 세븐세그먼트 두개만 가지고 구현 할 경우 일곱개의 각 세그먼트에 대해서 on,off 여부를 알려줄 일곱개의 출력 포트를 설정해야하나

시프트 레지스터를 이용하면 선 한개로 정보를 받아서 시프트 레지스터에서 선 일곱개가 나가는 것이다. 즉, 아두이노의 출력포트 갯수를 많이 줄일 수 있기에 사용하는것이 시프트 레지스터의 주된 사용 목적이 아닌가 싶다.

하지만 선 한개로 일곱개의 on,off정보를 보내는게 가능하나 싶다.

잘 알아보니 그 원리는 생각보다 쉬웠다.

 

위 그림은 MAX7219 의 메뉴얼인데 해당 칩의 작동원리를 잘 설명해주고 있는 것 같다.

우선 아두이노와 7219에는 선에 3개가 연결이 되는데 그것은

LOAD(시프트레지스터를 작동시키는 신호)

CLK(숫자열들을 끊어주는 신호)

DIN(세븐시그먼트의 발광정보 )이다. DIN에서 각각의 D15, D14 .... D0은 신호의 한 세트 (16비트, 예를들면 0001 1000 0010 0100 형태의 신호) 안의 자리의 번호이다.

아두이노와 세븐시그먼트만 사용 할 경우 A seg, B seg, C seg... 등의 각각의 세그먼트에 대해서 각각의 출력포트가 지속적으로 0(꺼짐), 1(켜짐) 신호를 보내주는것이지만

EX)

--------------------

OUTPUT 1 = on

OUTPUT 2 = on

OUTPUT 3 = on

OUTPUT 4 = on

OUTPUT 5 = on

OUTPUT 6 = on

OUTPUT 7 = on

이렇게 따로따로 되어 1번부터 7번핀까지 연결된 세븐세그먼트의 각 세그먼트는 전부 켜지게 된 상태로 지속된다.

------------------

시프트 레지스터를 이용 할 경우 아두이노에서 해당 숫자열을 차례대로 입력을 받고, CLK의 on,off에 따라 그 숫자열의 데이터를 각 저장소(총 16개)에 차례대로 저장하게 된다. 

EX)

----------------

LOAD       = ON----------------------------------------------------------------------------------------------------------------------------------------OFF

DIN          =        0           1           0            1           0           1           0           1           0           1            0           1            0          0           0           1

        CLK =   off     on off     on off     on off     on off     on off     on off     on off     on off     on off     on off     on off     on off     on off    on off     on off       on

----------------

위의 과정을 쉽게 표현한다면 먼저 LOAD로 신호를 보내 시프트 레지스터를 작동한다는 신호를 넣고  DIN의 16비트 신호를 받으면서 각 자리수의 값을 CLK와 연동하여 off할때 첫번째 저장소에 0을 넣고, on 할때는 첫번째저장소를 끄고 두번째 off일때 두번째 저장소에 1을 넣고 on일때 두번째 저장소를 끄고.. 하면서 16자리의 숫자를 시프트 레지스터에 있는 16종류의 저장소에 저장하는것이다. (flip-flop[논리회로를 이용하여 0, 1의 정보를 저장]]을 이용한다고 들었는데 이부분은 잘 기억이.. ;;)

그 다음은 7219에서 해당 데이터의 정보를 분석하여 자동으로 숫자를 써주거나(디코딩on- 0000 0011을 넣으면 3이나옴),

아니면 세븐 시그먼트를 수동으로 조작하거나 (디코딩 off-0000 0011을 넣으면 ㄱ 가 나옴) 하면서 7219가 세븐 세그먼트에 연결된 7개의 출력포트로 각각의 on,off정보를 전송하는 방식이다.

7219의 원리는 이쯤에서 그만하고.. 튜토리얼로 어떻게 작동하는지 알아보는 과정으로 넘어감! 슝~

 

반응형