--------------------------
Chip : 아두이노 나노
Program : Arduino IDE 1.8.13
Module : 3*4 KeyPad
--------------------------
아래는 3*4 키패드의 핀구성도이다.
나는 Col0~Col2를 출력으로 쓰고,
Row0~Row3을 입력으로 쓰기로 했다.
(반대가 되어도 상관없다)
아래는 회로도이다.
KeyPad는 9핀이지만 양쪽을 제외한 가운데 7핀만 사용해서 구현할 수 있다.
아두이노는 자체적으로 내부 풀업 저항을 지원한다.
따라서 별다른 저항 없이도 회로를 꾸밀 수 있다.
나노 -> 키패드의 핀맵이다.
아두이노 나노 | 3*4 키패드 |
D6 | PIN1(Col1) |
D7 | PIN2(Row0) |
D8 | PIN3(Col0) |
D9 | PIN4(Row3) |
D10 | PIN5(Col2) |
D11 | PIN6(Row2) |
D5 | PIN7(Row1) |
아래는 구현 코드이다.
주석을 달아놨으니 이해가 될 것이다.
#define keyPad_col0 8 // 3*4 KeyPad Pin3
#define keyPad_col1 6 // 3*4 KeyPad Pin1
#define keyPad_col2 10 // 3*4 KeyPad Pin5
#define keyPad_row0 7 // 3*4 KeyPad Pin2
#define keyPad_row1 5 // 3*4 KeyPad Pin7
#define keyPad_row2 11 // 3*4 KeyPad Pin6
#define keyPad_row3 9 // 3*4 KeyPad Pin4
#define star 10 // Key Pad *
#define zero 11 // Key Pad 0
#define hash 12 // Key Pad #
int keyPad_NUM = 0; // 입력받은 숫자 저장
void setup() {
// put your setup code here, to run once:
pinMode(keyPad_col0, OUTPUT); // col0:2은 출력으로 지정해줘야함.
pinMode(keyPad_col1, OUTPUT);
pinMode(keyPad_col2, OUTPUT);
pinMode(keyPad_row0, INPUT_PULLUP); // row0:3은 입력으로 지정해줘야함.
pinMode(keyPad_row1, INPUT_PULLUP); // 아두이노의 내부 풀업저항 사용.
pinMode(keyPad_row2, INPUT_PULLUP);
pinMode(keyPad_row3, INPUT_PULLUP);
Serial.begin(9600); // serial 통신시작
}
void loop() {
// put your main code here, to run repeatedly:
keyPad_NUM = 0; // 입력받은 값 초기화
digitalWrite(keyPad_col0, HIGH); // col0:2 HIGH로 초기화
digitalWrite(keyPad_col1, HIGH);
digitalWrite(keyPad_col2, HIGH);
digitalWrite(keyPad_col0, LOW); // col0을 low로 활성화 시켜 1,4,7,* 을 받아옴
if(!(digitalRead(keyPad_row0))){ keyPad_NUM = 1; while(!(digitalRead(keyPad_row0))); }
// col0,row0가 동시에 활성화 되면 1이 입력된 것으로 판단함. 눌렀다가 뗄 때 while에서 빠져나와서 다시 동작
else if(!(digitalRead(keyPad_row1))){ keyPad_NUM = 4; while(!(digitalRead(keyPad_row1))); }
else if(!(digitalRead(keyPad_row2))){ keyPad_NUM = 7; while(!(digitalRead(keyPad_row2))); }
else if(!(digitalRead(keyPad_row3))){ keyPad_NUM = 10; while(!(digitalRead(keyPad_row3))); }
else {}
digitalWrite(keyPad_col0, HIGH); // col0를 HIGH로 초기화
// ------------------------------------
digitalWrite(keyPad_col1, LOW); // col0을 low로 활성화 시켜 2,5,8,0 을 받아옴
if(!(digitalRead(keyPad_row0))){ keyPad_NUM = 2; while(!(digitalRead(keyPad_row0))); }
// col1,row0가 동시에 활성화 되면 2가 입력된 것으로 판단함. 눌렀다가 뗄 때 while에서 빠져나와서 다시 동작
else if(!(digitalRead(keyPad_row1))){ keyPad_NUM = 5; while(!(digitalRead(keyPad_row1))); }
else if(!(digitalRead(keyPad_row2))){ keyPad_NUM = 8; while(!(digitalRead(keyPad_row2))); }
else if(!(digitalRead(keyPad_row3))){ keyPad_NUM = 11; while(!(digitalRead(keyPad_row3))); }
else {}
digitalWrite(keyPad_col1, HIGH); // col1를 HIGH로 초기화
// ------------------------------------
digitalWrite(keyPad_col2, LOW); // col2을 low로 활성화 시켜 3,6,9,# 을 받아옴
if(!(digitalRead(keyPad_row0))){ keyPad_NUM = 3; while(!(digitalRead(keyPad_row0))); }
// col2,row0가 동시에 활성화 되면 3이 입력된 것으로 판단함. 눌렀다가 뗄 때 while에서 빠져나와서 다시 동작
else if(!(digitalRead(keyPad_row1))){ keyPad_NUM = 6; while(!(digitalRead(keyPad_row1))); }
else if(!(digitalRead(keyPad_row2))){ keyPad_NUM = 9; while(!(digitalRead(keyPad_row2))); }
else if(!(digitalRead(keyPad_row3))){ keyPad_NUM = 12; while(!(digitalRead(keyPad_row3))); }
else {}
digitalWrite(keyPad_col2, HIGH); // col2를 HIGH로 초기화
delay(10);
Serial.println(keyPad_NUM); // 입력받은 값을 시리얼 모니터에 출력.
}
실행결과
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'프로그래밍 > 임베디드' 카테고리의 다른 글
[아두이노] ESP-32 Cam, 포트포워딩을 이용한 CCTV (2) | 2021.01.30 |
---|---|
[아두이노] Key Pad를 이용한 도어락 (0) | 2021.01.08 |
[GLCD] 한글 사용법 (0) | 2021.01.05 |
[GLCD] 한글의 모든 조합 (0) | 2021.01.05 |
[AVR] Avr Studio Flash Memory 사용법 (0) | 2021.01.04 |
댓글