Arduino

디스플레이 : 도트 매트릭스(Dot Matrix) 표시하기

작성자 임베디드코리아 작성일25-05-16 00:21 조회172회 댓글0건

첨부파일

<*  도트 매트릭스(Dot Matrix) 표시하기 *>

----- < 소스 코드 > -----------------------------------------------
#include <FrequencyTimer2.h>

#define E  { \
    {0, 1, 1, 1, 1, 1, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 1, 1, 1, 1, 1, 0}  \
}

#define D { \
    {1, 1, 1, 1, 1, 0, 0, 0},\
    {1, 1, 0, 0, 1, 1, 0, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 1, 1, 0, 0},\
    {1, 1, 1, 1, 1, 0, 0, 0},\
}
 
#define U { \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 0, 1, 1, 1, 1, 0, 0}  \
}
 
#define I { \
    {0, 0, 1, 1, 1, 1, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 1, 1, 1, 1, 0, 0},\
}

#define N { \
    {0, 1, 0, 0, 0, 0, 1, 0},\
    {0, 1, 1, 0, 0, 0, 1, 0},\
    {0, 1, 0, 1, 0, 0, 1, 0},\
    {0, 1, 0, 1, 0, 0, 1, 0},\
    {0, 1, 0, 0, 1, 0, 1, 0},\
    {0, 1, 0, 0, 1, 0, 1, 0},\
    {0, 1, 0, 0, 0, 1, 1, 0},\
    {0, 1, 0, 0, 0, 0, 1, 0},\
}

#define O { \
    {0, 0, 0, 1, 1, 0, 0, 0}, \
    {0, 0, 1, 0, 0, 1, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 1, 0, 0, 0, 0, 1, 0}, \
    {0, 0, 1, 0, 0, 1, 0, 0}, \
    {0, 0, 0, 1, 1, 0, 0, 0}  \
}
 
#define HEART { \
    {0, 0, 1, 0, 0, 1, 0, 0},\
    {0, 1, 0, 1, 1, 0, 1, 0},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {0, 1, 0, 0, 0, 0, 1, 0},\
    {0, 0, 1, 0, 0, 1, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
}

int tact = A5;      // 택트 스위치 a%에 연결
byte col = 0;      // COL을 0으로 초기화
byte leds[8][8];    // 현재 출력해야 할 LED 모양 업로드하는 배열

// 맨 처음 PINS[0]은 사용하지 않기때문에 -1로 설정. 1~16번까지의 핀을 PIN에 연결
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};

// 행 0~7번까지 핀 연결해 주기
int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[6], pins[11], pins[15], pins[16]};

// 열 0~ 7번까지 핀 연결해 주기
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};

const int numPatterns = 7;      // 총 사용할 패턴 수
byte patterns[numPatterns][8][8] = { E, D, U, I, N, O, HEART };  // 위에서 정의한 led 모양을 patterns에 입력해 주기

int pattern = 0;         

void setup() {
  // 1~16번 까지의 핀을 출력으로 설정
  for (int i = 1; i <= 16; i++) {
    pinMode(pins[i], OUTPUT);
  }

  // 행 0~7번까지를 high로
  for (int i = 0; i < 8; i++) {
    digitalWrite(cols[i], HIGH );
  }
  // 열 0~7번 까지를 low로
  for (int i = 0; i < 8; i++) {
    digitalWrite(rows[i], HIGH);
  }

  clearLeds();  // led 초기화
 
  FrequencyTimer2::setOnOverflow(display);  // leds를 보여주기 위해서 setOnOverFlow를 사용

  pinMode(tact, INPUT); // SW 를 설정, 아두이노 풀업저항 사용
 
  setPattern(pattern);     
}

void loop() {
    int readTact = digitalRead(tact);

    if(readTact == HIGH){    // 택트 스위치가 high일때
      if(pattern == 6) pattern = 0;  //패턴의 끝(heart)까지 다 출력하고 다시 처음 E 출력
      else pattern++;                // 다음 패턴 출력을 위해 pattern ++
    // delay(300);                // 길게 눌러 패턴이 순식간에 넘거가지 않기 위해서 딜레이를 줌
    }   
      setPattern(pattern);          // 패턴 출력
}

void clearLeds() {  // led 다 초기화
  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      leds[i][j] = 0; 
}

void setPattern(int pattern) {        // LED 배열에 PATTREN 입력하기
  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
      leds[i][j] = patterns[pattern][i][j]; 
}

// Interrupt routine
void display() {
  digitalWrite(cols[col], HIGH);  // 이전 행들 다 꺼지게끔 해주기.
  col++;
  if (col == 8) {
    col = 0;
  }
  for (int row = 0; row <= 7; row++) {
    if (leds[col][7 - row] == 1) {        // 위의 배열에서 1일때 해당되는 위치 불빛 켜주기
      digitalWrite(rows[row], HIGH);
    }
    else {                          // 위 배열에서 0일때 해당되는 위치 불빛 꺼주기
      digitalWrite(rows[row], LOW);
    }
  }
  digitalWrite(cols[col], LOW);    // 다음 패턴을 위해 led 다 꺼주기
}