이 코드에서 스위치를 추가하여 처음에 좌우로 이동했다가 스위치 버튼을 누르면 상하로 이동하고 다시 버튼을 누르면 좌우로 이동하게 하는 코드를 어떻게 짜면 될까요??
/*
* 타이머/카운터 인터럽트 사용을 위해 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);
}
|