Arduino : MAX7219 8x8 LED Matrix Operation without Library
동작 원리대로 코드를 작성하여 8x8 LED Matrix를 구동하는 방법
에 대해 소개합니다. MAX7219의 동작 원리에 궁금하신 분은 아래의 포스트를 참고해주세요.아두이노로 MAX7219에 데이터 쓰기
무슨 데이터를 보내야 하는가?
MAX7219와 같은 LED Display Drivers 가 포함된 LED Dot Matrix를 구동하기 위해서는 아래의 LED Display Data와 Option 데이터를 MAX7219로 보내야 합니다.
어떻게 보내는가?
데이터를 보내는 방법은 데이터시트의 Timing Diagram을 보면 어떻게 보내는지 알 수 있습니다. MCU(uP)와 MAX7219는 MOSI(DIN), I/O(LOAD/CS), SCK(CLK) 3핀을 이용해서 통신을 합니다. 16bit의 Serial-Data를 CLK의 Rising Edge에 맞춰 데이터를 전송하면 됩니다. 이 데이터를 보내는 동안 LOAD(CS) 핀은 LOW를 유지하고, 16bit 데이터 전송이 완료되면 HIGH로 활성화합니다.
8x8 LED Matrix 동작하기
준비물
본 예제의 구성품은 아래와 같습니다.
- Arduino Uno x 1EA
- MAX7219 8x8 LED Matrix x 1EA
- Jumper Wires
하드웨어 연결
위의 구성품은 아래와 같이 연결 하였습니다. 회로도를 참고하셔서 Arduino Uno와 LED Matrix를 연결하시면 됩니다. 오른쪽 그림의 회로도는 예상되는 내부 회로도입니다.
아두이노 코드작성
사진에서는 8x8 LED Matrix 가 4개가 연결된 타입의 모듈을 사용하였지만, 동작 원리와 기본 코드를 이해하기 위해 한 칸만 사용하는 코드입니다. 아래의 코드는 unit8_t A[8] 배열에 저장된 문자 'A'를 출력하는 코드입니다.
#define SCK 13
#define DIN 11
#define LATCH 10
uint8_t A[8] = {
0b00011000,
0b00111100,
0b01100110,
0b11000011,
0b11111111,
0b11111111,
0b11000011,
0b11000011
};
void setup(){
pinMode(SCK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(LATCH, OUTPUT);
delay(100);
write_Max7219(0x09, 0x00); // Decode Mode - No decode for digits
write_Max7219(0x0a, 0x00); // Intensity - 7/32
write_Max7219(0x0b, 0x07); // Scan Limit - All Output Port Enable
write_Max7219(0x0c, 0x01); // Shutdown - Normal Operation
write_Max7219(0x0f, 0x00); // Display Test
}
void loop(){
uint8_t i;
for( i = 1 ; i < 9 ; i++){
write_Max7219(i, A[i-1]);
}
}
void write_Max7219(uint8_t address, uint8_t data){
digitalWrite(LATCH,LOW);
write_byte(address);
write_byte(data);
digitalWrite(LATCH,HIGH);
}
void write_byte(uint8_t data){
uint8_t i;
for (i = 0; i < 8; i++){
digitalWrite(DIN, !!(data & (1 << 7 - i)));
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
}
}
주요 코드 설명
위 코드에서 사용한 write_MAX7219(address, data) 함수 내의 코드는 아래와 같은 역할을 합니다.
void write_Max7219(uint8_t address, uint8_t data){
digitalWrite(LATCH,LOW);
write_byte(address);
write_byte(data);
digitalWrite(LATCH,HIGH);
}
실행결과
위의 코드를 실행하면 아래 그림과 같이 LED Matrix에 'A'문자가 출력되는 것을 확인할 수 있습니다. 이 코드는 1개의 LED Matrix 모듈 동작 기준 코드로 프로그램을 실행하면 4개의 LED Matrix에 동일한 화면이 출력됩니다.
부록 : Shiftout() 함수를 사용한 코드
위의 코드에서 아두이노에서 제공하는 Shiftout() 함수를 사용하면 아래와 같이 좀 더 간결한 코드 작성이 가능합니다. shiftout() 함수 설명이 필요하면 아래의 포스트를 참고해주세요.
#define SCK 13
#define DIN 11
#define LATCH 10
unsigned char matrixHeart[8] = {
0b00000000,
0b01100110,
0b11111111,
0b11111111,
0b11111111,
0b01111110,
0b00111100,
0b00011000,
};
void setup(){
pinMode(SCK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(LATCH, OUTPUT);
write_Max7219(0x09, 0x00); // Decode Mode - No decode for digits
write_Max7219(0x0a, 0x01); // Intensity - 7/32
write_Max7219(0x0b, 0x07); // Scan Limit - All Output Port Enable
write_Max7219(0x0c, 0x01); // Shutdown - Normal Operation
write_Max7219(0x0f, 0x00); // Display Test
delay(50);
}
void loop(){
uint8_t i;
for( i = 1 ; i < 9 ; i++){
write_Max7219(i, matrixHeart[i-1]);
}
delay(100);
}
void write_Max7219(uint8_t address, uint8_t data){
digitalWrite(LATCH,LOW);
shiftOut(DIN, SCK, MSBFIRST, address);
shiftOut(DIN, SCK, MSBFIRST, data);
digitalWrite(LATCH,HIGH);
}
마무리
이번 포스트는 MAX7219를 사용한 도트메트릭스 기초 사용 방법을 소개하였습니다. 이후 포스트는 4개의 LED Matrix 표시 방법과, 다른 기능들을 함께 사용하기 위해 사용할 수 있는 코드 작성법에 대해 소개할 예정입니다.
끝까지 읽어 주셔서 감사합니다.^^
'Embedded > Arduino' 카테고리의 다른 글
아두이노 #54 32x8 LED Matrix Font 데이터 참조로 문자 표시 및 메모리 문제 해결 (0) | 2020.12.02 |
---|---|
아두이노 #53 MAX7219 32x8 LED Matrix 문자 표시하기 기초 - 라이브러리 없이 코드 작성 (0) | 2020.12.02 |
아두이노 #51 MAX7219 8x8 LED Matrix - MAX7219 동작 원리 (0) | 2020.11.30 |
아두이노 강좌 #50 SD-Card를 사용한 웹 서버로 LED 제어 (2) | 2020.11.27 |
아두이노 강좌 #49 SD-Card를 사용한 웹 서버 - 이더넷 쉴드 사용 (0) | 2020.11.12 |