MAX7219 같은 드라이버 칩이나 라이브러리 없이, 아두이노 나노의 GPIO만으로 8x8 LED 매트릭스(공통 캐소드)를 직접 제어하는 방법입니다. 멀티플렉싱(행 단위 시분할 구동)을 사용하여 16개 핀(행 8 + 열 8)으로 64개 LED를 제어합니다.
추후 MAX7219 사용 버전과 비교하는 튜토리얼도 제작 예정입니다.
소스 코드
1. 전체 LED 순차 점등 테스트
// Mario's Ideas
// 8x8 LED 매트릭스 64개 LED 순차 점등 테스트
// 행 핀 (공통 캐소드: LOW 활성)
#define R1 2 #define R2 3 #define R3 4 #define R4 5
#define R5 6 #define R6 7 #define R7 8 #define R8 9
// 열 핀 (공통 캐소드: HIGH 활성)
#define C1 10 #define C2 11 #define C3 12 #define C4 13
#define C5 A0 #define C6 A1 #define C7 A2 #define C8 A3
void setup() {
// 모든 핀 출력 모드
for (int p = 2; p <= 13; p++) pinMode(p, OUTPUT);
for (int p = A0; p <= A3; p++) pinMode(p, OUTPUT);
// 초기화: 모든 행 HIGH(끄기), 모든 열 LOW(끄기)
for (int r = R1; r <= R8; r++) digitalWrite(r, HIGH);
for (int c = C1; c <= C8; c++) digitalWrite(c, LOW);
}
void SelectRow(int row) {
// 선택된 행만 LOW, 나머지는 HIGH
digitalWrite(R1, row==1?LOW:HIGH);
digitalWrite(R2, row==2?LOW:HIGH);
digitalWrite(R3, row==3?LOW:HIGH);
digitalWrite(R4, row==4?LOW:HIGH);
digitalWrite(R5, row==5?LOW:HIGH);
digitalWrite(R6, row==6?LOW:HIGH);
digitalWrite(R7, row==7?LOW:HIGH);
digitalWrite(R8, row==8?LOW:HIGH);
}
void SelectColumn(int col) {
// 선택된 열만 HIGH, 나머지는 LOW
digitalWrite(C1, col==1?HIGH:LOW);
digitalWrite(C2, col==2?HIGH:LOW);
digitalWrite(C3, col==3?HIGH:LOW);
digitalWrite(C4, col==4?HIGH:LOW);
digitalWrite(C5, col==5?HIGH:LOW);
digitalWrite(C6, col==6?HIGH:LOW);
digitalWrite(C7, col==7?HIGH:LOW);
digitalWrite(C8, col==8?HIGH:LOW);
}
void loop() {
for (int i = 1; i < 9; i++) {
for (int j = 1; j < 9; j++) {
SelectRow(i);
SelectColumn(j);
delay(100);
}
}
}
2. 고양이 이미지 표시 (멀티플렉싱)
// 8x8 LED 매트릭스에 고양이 이미지 표시 (멀티플렉싱)
int pause = 300;
int Cat[8][8] = {
{1,0,0,0,1,0,0,0},
{1,1,1,1,1,0,0,0},
{1,0,1,0,1,0,0,0},
{0,1,1,1,0,0,0,1},
{0,0,1,0,0,0,0,1},
{0,1,1,1,1,0,0,1},
{0,1,1,1,1,1,0,1},
{1,0,1,1,1,1,1,0}
};
void setup() { /* 핀 설정 동일 */ }
void SelectRow(int row) { /* 위와 동일 */ }
void Set_LED_in_Active_Row(int col, int state) {
switch(col) {
case 1: digitalWrite(C1, state); break;
case 2: digitalWrite(C2, state); break;
case 3: digitalWrite(C3, state); break;
case 4: digitalWrite(C4, state); break;
case 5: digitalWrite(C5, state); break;
case 6: digitalWrite(C6, state); break;
case 7: digitalWrite(C7, state); break;
case 8: digitalWrite(C8, state); break;
}
}
void loop() {
for (int j = 0; j < 8; j++) {
SelectRow(j+1);
for (int i = 0; i < 8; i++) {
Set_LED_in_Active_Row(i+1, Cat[j][i]);
}
delay(2 + pause);
}
if (pause > 100) pause -= 100;
else if (pause > 0) pause -= 10;
}
3. 텍스트 스크롤 (멀티플렉싱)
// 8x8 LED 매트릭스에 텍스트 스크롤 표시
int position = 0;
int Marios_ideas[8][54] = { // 8행 x 54열 비트맵 (생략 - 원본 참조)
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,0,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0},
// ... 나머지 6행 데이터
};
void loop() {
for (int x = 0; x < 5; x++) { // 프레임당 5회 반복으로 밝기 보정
for (int j = 0; j < 8; j++) {
SelectRow(j+1);
for (int i = 0; i < 8; i++) {
int colIdx = (i + position) % 54;
Set_LED_in_Active_Row(i+1, Marios_ideas[j][colIdx]);
}
delay(2);
}
}
position = (position + 1) % 54;
}
회로도
행(캐소드): D2~D9 → 각 행 공통 캐소드
열(애노드): D10~D13, A0~A3 → 각 열 공통 애노드 (330Ω 저항 직렬 권장)