※ 주의사항 ※
본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!
감사합니다😁
안녕하세요!!
오늘은 아래와 같은 내용을 확인해보겠습니다.
키 매트릭스 사용 방법
고스트 현상 & 마스킹 현상
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' 안눌려졌으면 '.'을 출력한다)
- 같은 행의 키버튼을 누르면 출력이 안되는 현상이 발생한다..(디버그는 하지 못했습니다 ..ㅠ)😥
2-2. 예제 2 : 버튼을 누르면 해당 위치에 해당하는 숫자 출력
- 예제1의 사용자 정의 함수부인 read_key와 print_key를 한개의 함수인 getKeyNumber로 병합
- main문의 key_num 변수의 값을 통해 정수값을 받아서 UART통신을 통해 출력
- 정수값을 통해 switch case를 사용해서 다양한 소자들 동작 제어 가능 (활용법)
댓글