아두이노 #52 MAX7219 LED Matrix 모듈 기초 사용법 - 라이브러리 없이 동작
Lucy Archive
Lucy / Facilitate4U
2020. 12. 1. 02:02

Arduino : MAX7219 8x8 LED Matrix Operation without Library

이전 포스트에서 MAX7219의 동작원리에 대해 알아보았습니다. 이번 포스트는

동작 원리대로 코드를 작성하여 8x8 LED Matrix를 구동하는 방법

에 대해 소개합니다. MAX7219의 동작 원리에 궁금하신 분은 아래의 포스트를 참고해주세요.
 

아두이노 #51 MAX7219 8x8 LED Matrix - MAX7219 동작 원리

Arduino : MAX7219 8x8 LED Matrix 동작 원리 이전 포스트에서 8x8 LED Matrix 동작원리와 사용법에 대한 포스트를 작성하였습니다. 이번 포스트는 MAX7219 LED Dot Matrix를 사용하기 전에 MAX7219의 동작 원리..

juahnpop.tistory.com


아두이노로 MAX7219에 데이터 쓰기

무슨 데이터를 보내야 하는가?

MAX7219와 같은 LED Display Drivers 가 포함된 LED Dot Matrix를 구동하기 위해서는 아래의 LED Display Data와 Option 데이터를 MAX7219로 보내야 합니다. 

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로 활성화합니다.  

MAX7219 Timing Diagram

 

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() 함수 설명이 필요하면 아래의 포스트를 참고해주세요.

 

아두이노 강좌 #19 shiftOut() 함수 파헤치기

Arduino shiftOut() 함수 파헤치기 아두이노에서 시리얼 인터페이스를 가진 장치를 제어하기 위해 shiftOut() 함수를 사용 할 수 있습니다. shiftOut() 는 기본적으로 SPI 와 통신 방식이 동일하지만, Software.

juahnpop.tistory.com

#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 표시 방법과, 다른 기능들을 함께 사용하기 위해 사용할 수 있는 코드 작성법에 대해 소개할 예정입니다. 

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

👉 아두이노 LED Matrix 관련글 목록 보기

👉 아두이노 디스플레이 장치 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기