정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

도트매트릭스 스위치
홍석진 | 2016-10-12

이 코드에서 스위치를 추가하여 처음에 좌우로 이동했다가 스위치 버튼을 누르면 상하로 이동하고 다시 버튼을 누르면 좌우로 이동하게 하는 코드를 어떻게 짜면 될까요??

/*
 * 타이머/카운터 인터럽트 사용을 위해 FrequencyTimer2.h 헤더 파일을 include 한다.
 */
// 표현할 문자를 2진수로 정의 새로운 문자 추가 가능.
/*
 * 타이머/카운터 인터럽트 사용을 위해 FrequencyTimer2.h 헤더 파일을 include 한다.
 */
// 표현할 문자를 2진수로 정의 새로운 문자 추가 가능.
#define SPACE { \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {0, 0, 0, 0, 0, 0, 0, 0} \
}
#define Num_0 { \
    {0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 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} \
}
#define Num_1 { \   
    {0, 0, 0, 0, 0, 0, 0, 0}, \
    {1, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {1, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {0, 1, 0, 0, 0, 0, 0, 0}, \
    {1, 1, 0, 0, 0, 0, 0, 0} \
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 /*
 * 각 핀 정의
 * 프로그램 가독성을 위하여 배열로 선언
 */
// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[18]= {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A5};
unsigned long delayTime=200;                    // delayTime의 시간을 정의합니다

int q = 9;                                                  // 버튼을 추가합니다

 

 
// 가로열 핀 정의(col[xx] of leds = pin yy on led matrix)
int cols[8] = {pins[1], pins[2], pins[3], pins[4], pins[5], pins[6], pins[7], pins[8]};
int cols2[8] = {pins[9], pins[10], pins[11], pins[12], pins[13], pins[14], pins[15], pins[16]};
 
const int DS = A2;      // SR DS 14pin
const int ST_CP = A3;   // SR ST_CP 12pin
const int SH_CP = A4;   // SR SH_CP 11pin
 /*
 * 표현할 문자 패턴, numPatterns 의 갯수에 맞게 표시
  * Define부에서 각 문자별로 정의 됨
 */
 const int numPatterns = 17; // 표현할 글자 수
 #define Row_Sig_AllOff 8
byte patterns[numPatterns][8][8] = {
  SPACE, Num_0, Num_1, Num_2, Num_3, Num_4, Num_5, Num_6, Num_7,
  Num_8, Num_9, Num_10, Num_11, Num_12, Num_13, Num_14, Num_15
};

byte col = 0;
byte leds[8][8];
int pattern = 0;

void clearLeds() // 도트매트릭스 LED 메모리 초기화 함수
{
  // Clear display array
  for(int i=0;i<8;i++) {
    for(int j=0;j<8;j++) {
      leds[i][j] = 0;
    }
  }
}
void setPattern(int pattern) // 도트매트릭스 LED 문자 복사 함수
{
  /*
   * 3차원배열 patterns 를 2차원 배열인 leds에 복사한다
   * 깊이(높이)는 pattern 인자값을 전달 받아 결정 된다
   */
  for(int i=0;i<8;i++) {
    for(int j=0;j<8;j++) {
      leds[i][j] = patterns[pattern][i][j];
    }
  }
}

void shiftRegister(unsigned char data) //74HC595 시프트 레지스터 IC 구동 함수
{
  int i = 0;
  digitalWrite(ST_CP, LOW); // 래치 Off
  for(i=0;i<8;i++)
  {  
    digitalWrite(SH_CP, LOW); // 플립플롭 클럭 핀 로우
    if(data&(0x80>>i))  digitalWrite(DS, HIGH); // 시리얼 데이터 핀 하이?
    else  digitalWrite(DS, LOW); // 시리얼 데이터 핀 로우?
    digitalWrite(SH_CP, HIGH); // 플립플롭 클럭 핀 하이
  }
  digitalWrite(ST_CP, HIGH); // 래치 On
}
void RowPulseControl(unsigned char data) // 세로 행(Row) 핀 출력 제어 함수
{
  /* 공통 애노드 타입 8x8 도트매트릭스 LED로 변경 됨
   * 인터럽트 서비스 루틴을 나가기 전에 세로 행(Row) 핀에 해당 핀에만 하이를 출력하고
   * 그 외 핀들은 로우를 넣어 주도록 한다
   */
    switch(data)
    {
      case 0:
      shiftRegister(0x80);break;  // 첫번째 ROW
      case 1:
      shiftRegister(0x40);break; // 두번째 ROW
      case 2:
      shiftRegister(0x20);break; // 세번째 ROW
      case 3:
      shiftRegister(0x10);break; // 네번째 ROW
      case 4:
      shiftRegister(0x08);break; // 다섯번째 ROW
      case 5:
      shiftRegister(0x04);break; // 여섯번째 ROW
      case 6:
      shiftRegister(0x02);break; // 일곱번째 ROW
      case 7:
      shiftRegister(0x01);break; // 여덟번째 ROW
      case Row_Sig_AllOff:
      shiftRegister(0x00);break; // 전 ROW 핀 신호 OFF
    }
}
// Interrupt routine
void display_num() // 1ms마다 diplay()함수가 호출(Generate Interrupt Service routine per 1ms)
{
  static bool toggle = 0;
  static unsigned int cnt_time =0;
  static unsigned char cnt = 0;
  static unsigned char direc = 0;
  RowPulseControl(Row_Sig_AllOff); // 이전 세로행(Row) 신호는 끄도록 한다
  cnt_time++;
  if(cnt_time == 100) // 1 초가 되면?
  {
    cnt_time = 0;
    if (direc == 0){
      if(pattern == 8)  direc++;
      else pattern++; // 3차원 배열의 깊이를 0부터 10까지 증가
    }
    else if (direc == 1){
      if(pattern == 0){
        pattern = 9;
        direc++;
      }
      else pattern--; // 3차원 배열의 깊이를 0부터 10까지 증가
    }
    else if (direc == 2){
      if(pattern == 16) direc++;
      else pattern++; // 3차원 배열의 깊이를 0부터 10까지 증가
    }
    else if (direc == 3){
      if(pattern == 9){
        pattern = 0;
        direc = 0;
        toggle ^= 1;
      }
      else pattern--; // 3차원 배열의 깊이를 0부터 10까지 증가
    }
  }
    cnt++; // 세로 행 증가
    /*
     * 타이머/카운터 인터럽트 서비스 루틴이 발생 될 때마다 cnt값은 증가 하도록 한다
     */
    if (cnt == 8)
    {
      cnt = 0;
    }
     /*
      * 가로열 신호 출력
      * 현재 leds에 저장된 열값을 0~7번방에 걸쳐 체크하여
      * "1"일때는 HIGH, "0"일때는 LOW를 출력하도록 한다
      */
    for(int col=0;col<8;col++)
    {
      switch(toggle)
      {
      case 0:
        if (leds[cnt][col] == 1)
        {
          digitalWrite(cols[col], LOW);  // 노란색 LED ON
        }
        else
        {
          digitalWrite(cols[col], HIGH);  // 노란색 LED OFF
        }
        digitalWrite(cols2[col], HIGH); // 빨간색 LED OFF
      break;
      case 1:
        if (leds[cnt][col] == 1)
        {
        digitalWrite(cols2[col], LOW);  // 빨간색 LED ON
        }
        else
        {
        digitalWrite(cols2[col], HIGH); // 빨간색 LED OFF
        }
        digitalWrite(cols[col], HIGH); // 노란색 LED OFF
       break;
      }
    }
    RowPulseControl(cnt); // 세로 행(Row) 핀 출력 제어 함수

  /*
   * 타이머/카운터 인터럽트 서비스 루틴을 빠져나가기전에 세로 행(Row) 신호를 반드시
   * 제어하여야 한다
   */
}
void setup() // 초기화
{
  /*
   * 도트매트릭스와 연결 된 핀 들(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1)을
   * for문을 이용하여 출력포트로 설정(sets the pins as output)
   */
  for(int i=1;i<=17;i++)
  {
    pinMode(pins[i], OUTPUT);
  }
  pinMode(SH_CP, OUTPUT); // 래치 클럭 핀 출력포트로 설정
  pinMode(ST_CP, OUTPUT); // 플립플럽 클럭 핀 출력포트로 설정
  pinMode(DS, OUTPUT);    // 시리얼 데이터 입력핀 출력 포트로 설정
  
  /*
   * 도트매트릭스 LED 사용 메모리 초기화
   */
  clearLeds();

}
void loop() // 무한루프 
{

 display_num();
 setPattern(pattern); // 도트매트릭스 LED 문자 복사 함수
 delay(1);
}

이전글   |    나노와 프로미니 차이점이 있나요?? 2016-10-12
다음글   |    블루투스 연결 질문입니다. 2016-10-12