본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-18» : 키 매트릭스(Key Matrix)

by 나는영하 2022. 2. 23.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

키 매트릭스 사용 방법

고스트 현상 & 마스킹 현상

 


1. 키 매트릭스

1-1. 개요

1) 개요

도트 매트릭스(좌) / 키 매트릭스(우)

- 버튼을 매트릭스 형태로 배치

- 적은 수의 입력 핀으로 많은 버튼 입력 검사

- LED 도트 매트릭스의 잔상효과와 기본적으로 동일한 방식 사용

(차이점은 도트 매트릭스는 출력, 키 매트릭스는 입력을 위한 방법이다)

- 전화기, 키보드, 도어락에 흔히 사용

 

2) 고스트 현상 & 마스킹 현상

키 매트릭스 기본 회로

- 풀 다운 저항이 연결되어 있는 기본적인 키 매트릭스의 회로에 해당된다.

- COL1에 HIGH를 주고 COL2에 LOW를 주었을때 SW11을 누르면 ROW1은 HIGH를 가지고 ROW2는 LOW값을 가져서 해당 열에 속한 버튼들의 상태를 알 수 있다. 

 

- 기본 회로의 경우 버튼 1개를 눌렀을때는 크게 지장이 없다. 하지만 버튼을 2개 이상 눌렀을경우 잘못된 값이 입력될 수 있다.

- 위의 그림처럼 버튼을 2개 이상 눌렀을때 의도와는 다르게 눌려지지 않은 SW21의 행에 속하는 ROW2에 HIGH값이 가해지는것을 알 수 있다.

- 이처럼 튼을 누르지 않았지만 의도하지 않은 루프 형성에 의해 버튼을 누른 것과 동일한 값이 가해지는 현상 또는 반대로 버튼을 눌렀지만 누르지 않은 것과 동일한 값이 가해지는 현상을 '고스트 현상(고스트 키 현상)'이라 한다.

- 고스트 현상이 발생하면 실제로 버튼을 누른 경우와 누르지 않은 경우를 구별할 수 없는데 이를 '마스킹 현상'이라 한다.

※ 고스트 현상 및 마스킹 현상을 없애기 위해서는 다이오드를 사용하면 된다. 다이오드를 추가하면 한쪽으로만 루프가 형성되기 때문에 고스트 현상을 억제할 수 있다.

 

1-2. 사용 방법(4x4 키 매트릭스)

- 총 8개의 핀으로 16개의 KEY를 사용할 수 있다.

- 행의 끝에 풀업 저항을 사용하고 고스트 현상을 억제하기 위해 다이오드를 사용하였다.

- 다이오드의 방향으로 봤을때 검사하고자 하는 열에 0의 값을 가하고, 나머지 열에는 1을 가한다.

(다이오드 방향상 열에 1이 출력될 경우 전류가 COL ↔ ROW로 흐를수가 없다)

- 버튼이 눌려졌을경우 풀업 저항에 의해 해당 행은 0(LOW)이 출력되고 버튼이 안눌러졌을 경우 1(HIGH)이 출력 된다.

-실제 프로그래밍에서 이중for문을 사용해서 16개의 버튼을 검사하게 되는데 순서는 아래와 같다.

① : ⑴ → ⑵ → ⑶ → ⑷ →→

② : ⑴ → ⑵ → ⑶ → ⑷ →→

③ : ⑴ → ⑵ → ⑶ → ⑷ →→

④ : ⑴ → ⑵ → ⑶ → ⑷

 


 

2. 키 매트릭스 관련 예제

2-1. 예제 1 : 버튼을 누르면 눌려진 위치를 4x4 배열로 출력

키 매트릭스 실습 사진(좌) / 키 매트릭스 소스 코드

- Line 15 : 버튼이 눌려졌을때만 출력하기 위한 변수

해당 값이 1이상인 경우에만 4x4 배열(keystate[4][4])가 출력 된다.

- Line 22 ~ 23 : B포트의 0~3번 핀을 출력, 4~7번 핀을 입력으로 설정하고 한개의 열씩 0을 출력한다.

- Line 28 : PIN 레지스터에 의해 저장된 B포트의 4~7번 핀 값을 read 변수로 저장한다.

- Line 30 : bit_is_set(read, y) = read 변수의 y비트가 1이면 1을 출력하고 아니면 0을 출력한다.

- Line 31 ~ 35 : read 변수의 y 비트가 1이면 keystate[x][y]에 0을 넣고 아니면 keystate[x][y]에 1을 넣는다.

(y비트가 1이면 키 매트릭스의 버튼이 안눌려졌음을 의미하고, 0이면 버튼이 눌려졌음을 의미한다)

- Line 41 ~ 54 : key_count 값이 1이면 배열에 저장된 값을 for문을 통해 확인하고 삼항 연산자를 통해 사용자가 지정한 문자를 출력한다. (본 코드의 경우 버튼이 눌려졌으면 'O' 안눌려졌으면 '.'을 출력한다)

 

위의 코드를 컴파일 후 실행하면 보여지는 PuTTY 화면

- 같은 행의 키버튼을 누르면 출력이 안되는 현상이 발생한다..(디버그는 하지 못했습니다 ..ㅠ)😥

 

2-2. 예제 2 : 버튼을 누르면 해당 위치에 해당하는 숫자 출력

- 예제1의 사용자 정의 함수부인 read_key와 print_key를 한개의 함수인 getKeyNumber로 병합

- main문의 key_num 변수의 값을 통해 정수값을 받아서 UART통신을 통해 출력

- 정수값을 통해 switch case를 사용해서 다양한 소자들 동작 제어 가능 (활용법)

댓글