우선 도트매트릭스의 앞뒤 생김새를 살펴보면 아래와 같다.


 도트매트릭스는 LED를 연결하여 잘 배열하여 놓은 것으로 내부에는 아무 것도 없다. 정말 LED빼곤 아무것도 없다. 도트매트릭스 가격이 부담스럽다면 직접 LED를 한땀한땀 땜질하여 사용해도 무방하다.(하지만 땜질하다 보면 내가 이걸 왜 하고 있지..하는 생각이 2천번 정도 들 것이다.)
 사실 도트매트릭스 모듈 중에는 미리 땜질이 다 되어 있고, 안에 Driver Chip들을 내장해놓아서 데이터시트대로 신호만 주면 별 어려움 없이 전광판을 만들 수도 있는 것도 있다. 하지만 우리는 도트매트릭스의 원리를 알아야 하기 때문에 쌩(?)도트매트릭스를 사용하도록 한다.
 위 사진의 8X8 도트매트릭스 회로도를 보면 아래와 같다.


 회로도를 봐도 역시 LED밖에 없다. 나와있는 핀은 사진과 같이 24개이고, 그중 8개는 ROW라고 써있고 가로 줄 LED의 (+)극 끼리 쫘라락 연결해 놓았다(커먼 애노드). 그럼 이제 이 도트매트릭스를 켜기 위한 방법을 알아보기 위해 ROW1만 있다고 생각해보자. LED 8개 제어하는건 참 쉽다. (1, 1)의 GREEN LED를 켜기 위해선 ROW1에 5V를 주고, COL24번핀을 0V를 주면 된다. 23번핀을 0V를 주면 빨간색이 들어올 것이고, 23번과 24번핀이 모두 0V일 경우엔 GREEN과 RED가 모두 켜져 주황색으로 켜진것처럼 보일 것이다. 


 그럼 이제 (1, 1)과 (2, 2)를 동시에 켜보도록 하자. 어떻게 하면 될까? ROW1을 1로 놓고 COL24는 0으로 놓고, ROW2는 1로 놓고 COL21을 0으로 놓으면 될까? 회로도를 자세히 살펴 보면 LED의 (-)부분 역시 세로로 연결이 되어 있어서 왼쪽 구석의 LED 4개가 모두 들어오게 될 것이다.
그럼 어떻게 해야할까?  이번에도 사람의 눈을 교묘히 속여서 원하는 대로 LED를 켜도록 하자.(잔상돼지편 참조)
 즉, 한꺼번에 모든 LED를 켜는 것이 아니라, 한줄한줄 돌아가면서 한번씩 켜주는 것이 포인트이다.
ROW1 켜주고 원하는 24번 0V 넣어주고, ROW2 켜주고 21번 0V 넣어주고를 반복하면 (1, 1)과 (2, 2)에 불이 켜진 것처럼 보일 것이다. 전체 8줄을 다 켠다면 ROW1 ~ ROW8까지 반복하며 원하는 데이터를 넣어주면 된다.
 그럼 이 방법을 사용한다면 I/O포트는 몇개나 필요할까?
ROW에 8개 필요할 것이고, COLUMN에는 빨강, 녹색 각각 8개의 LED가 있으므로 16 + 8 = 24개의 PORT가 필요하고, 이런게 16개 있으므로 24*16 = 384개의 I/O포트가 필요하다. 아까 2000개에 비하면 많이 줄었지만 384개도 역시 많다. 그럼 더 줄여 보도록 하자.
 우선 ROW에 8개 필요한 것을 3개로 줄여보자. ROW에 사용하는 포트가 하는 일은 뭘까? 
처음엔 ROW1에 1주고, 두번째엔 ROW2 1주고, 세번째엔 ROW3에 1주고... ROW8에 1주고, 또 ROW1에 1주고...
위의 작업을 표로 나타내면 아래와 같다.


이러한 출력을 내주는 녀석을 디코더라고 한다. 디코더는 입력에 따라 한개의 출력을 선택하게끔 하는 회로인데, n개의 입력으로 2 ⁿ 개의 출력을 내줄 수 있다. 우리에게 필요한 출력은 ROW1~8까지 8개의 선택이므로, 2의 3승이 8이므로 입력이 3개만 필요한 것을 알 수 있다.
수학적으로 구해보려면 2 ⁿ  = 8 양변에 로그를 취하면.. n log 2 = log 8 = 3 log 2, 즉 n = 3이 된다.
이말인 즉슨, 3개의 입력만 있으면 우리가 원하는 8개의 출력을 내줄 수 있다는 말씀.
실제 우리가 실제로 사용할 디코더 74138의 진리표는 다음과 같다.


 여기서 H는 High 즉, 1을 나타내고 L은 Low, 0을 나타낸다. 위에 그림과 1과 0이 바뀌었는데 그 이유는 뒤에서 보도록 하자.

자, 그럼 이제 ROW를 제어하기 위한 포트도 줄였겠다, 가속도를 더 붙여 Column에 대한 포트도 줄여 보도록 하자.
래치라는 것을 들어보았는가? 래치는 이전의 데이터를 저장할 수 있는 일종의 메모리 회로이다. 이 메모리 기능을 이용하여 우리의 사리사욕을 채워보자.


위 표는 래치 74573의 Function Table이다(라고 적혀있다). LE(Latch Enable을 보면 High일 경우, 입력(D)가 그대로 출력으로 나가고 LE가 Low일 경우에는 출력이 Q0로 되어있다. 즉, LE가 Low일 경우에는 뭘 입력으로 넣어도 상관없이 이전에 넣었던 내용만 출력한다라는 뜻이다. 래치의 이러한 특성을 이용하면, 포트의 사용을 획기적으로 줄일 수가 있다.
 자세한 설명은 회로도를 보면서 하도록 하자.



우선은 위에 74138 디코더가 보인다. 디코더 출력(OUTx)부분 핀에 보면 빨간버블이 붙어있는데 이는 0이 활성화 상태라는 뜻이다. 아까 위에서 살펴봤던 디코더의 진리표가 출력이 반대로 되어 있었던 이유이기도 하다. 
 디코더에서 나온 신호는 PNP형 트랜지스터의 입력으로 들어간다. 위 회로에서 PNP TR은 스위치로 사용되고, 입력이 0일때 도트매트릭스의 COMMON단에 VCC전압을 공급하여 주는 역할을 한다. 즉, 디코더의 입력 ABC에 신호를 순차적으로 주게되면 도트매트릭스의 COM1~8에 차례로 VCC 전원을 공급하여, 도트매트릭스의 한줄한줄을 순차적으로 스캔할 수 있도록 해준다.
 그 다음으로, 래치회로를 살펴보도록 하자. 래치는 우리가 입력한 데이터를 저장하기 위한 용도로 사용한다. LE(Latch Enable)을 1로 주고 래치에 원하는 신호를 준 후에, LE를 0으로 주면, 래치 입력(Dn) 신호에 상관없이 래치의 출력(Qn)에는 이전에 입력한 값만 나타나게 된다. 래치의 이러한 특성을 이용하여 GREEN과 RED에 각각 다른 값을 넣어줄 수가 있다.
 RED 데이터를 넣어주기 위해 두 래치의 LE를 1로 셋해주고 RED에 해당하는 데이터를 넣어주고, 오른쪽 래치의 LE를 0으로 해주고, 다시 GREEN에 해당하는 데이터를 넣어주면 GREEN과 RED에서는 각각 저장된 데이터가 출력되게 될 것이다.
이것이 I/O Port하나로 RED와 GREEN LED를 제어할 수 있게 하는 원리이다.
 이 회로를 여러개의 도트매트릭스에 대해  확장을 하면, 하나의 포트로 모든 도트매트릭스의 RED와 GREEN 포트에 신호를 넣어줄 수가 있게 된다.

이 원리를 이용하여 도트매트릭스에 글자를 넣어보자.
 


 위 이미지는 래치를 이용하여 각각의 도트에 데이터를 넣는 그림이다. 위에서는 3색에 대한 Latch는 고려하지 않았지만 같은 원리로 RED/GREEN에 대한 Latch에 데이터를 넣어놓을 수가 있을 것이다.
 이런 식으로 각각의 래치에 데이터를 저장하고, 디코더를 이용해 한줄한줄을 차례로 표시해준다.


위의 작업을 빠른속도로 반복하게 되면 실제 눈에 보이는 이미지는 아래와 같을 것이다.


 이러한 원리로 도트매트릭스를 적은 포트로 제어할 수 있게 된다. 도트매트릭스가 더 추가한다고 해도 실제 추가해야할 I/O포트는 LE신호를 제어할 한핀 뿐이므로 포트 갯수에 대한 부담없이(물론 땜질의 부담은 증가하겠지만..) 도트매트릭스를 추가할 수가 있을 것이다.