키패드는 다양한 전자 제품 및 임베디드 프로젝트에서 널리 사용되는 입력 장치입니다. 숫자와 알파벳의 형태로 입력을 받아 추가 처리를 위해 시스템에 입력하는 데 사용됩니다. 이 튜토리얼에서는 4x4 매트릭스 키패드를 PIC16F877A와 인터페이스 할 것 입니다.
세부 논리로 들어가서 키패드 사용법을 배우기 전에 몇 가지 알아야 할 사항이 있습니다.
4x4 키패드가 필요한 이유:
일반적으로 마이크로 컨트롤러 장치의 단일 I / O 핀을 사용하여 스위치 입력과 같은 디지털 신호를 읽습니다. 입력 목적으로 9, 12, 16 키가 필요한 일부 애플리케이션에서는 마이크로 컨트롤러 포트에 각 키를 추가하면 16 개의 I / O 포트를 사용하게됩니다. 이 16 개의 I / O 포트는 I / O 신호를 읽기위한 것뿐만 아니라 주변 장치 연결로도 사용할 수 있습니다. ADC 지원, I2C, SPI 연결도 해당 I / O 핀에서 지원합니다. 이러한 핀은 스위치 / 키와 연결되어 있으므로 사용할 수 없으며 I / O 포트로만 사용할 수 있습니다. 이것은 전혀 말이되지 않습니다. 그렇다면 핀 수를 줄이는 방법은 무엇입니까? 대답은 육각 키패드 또는 매트릭스 키패드를 사용하는 것입니다 . 핀 수를 줄일 수 있습니다., 4x4 매트릭스 키를 연결합니다. 이 중 4 개는 행으로, 4 개는 열로 연결된 8 개의 핀을 사용하므로 마이크로 컨트롤러의 8 개 핀이 절약됩니다.
4x4 매트릭스 키패드 작동 방식:
상단 이미지에서 매트릭스 키패드 모듈이 왼쪽에 표시됩니다. 오른쪽에는 내부 연결과 포트 연결이 표시됩니다. 포트에 8 개의 핀이 있고 처음 4 개는 왼쪽에서 오른쪽으로 X1, X2, X3, X4 는 행 이고 마지막 4 개는 왼쪽에서 오른쪽으로 Y1, Y2, Y3, Y4 는 4 개의 열 입니다. 4 행 또는 X면을 출력 으로 만들고 논리를 낮게 또는 0 으로 만들고 4 열 을 입력으로 만들고 키를 읽으면 해당 Y가 0이 될 때 스위치 누름을 읽습니다.
n 이 숫자 인 nxn 행렬에서도 같은 일이 발생 합니다. 3x3, 6x6 등이 될 수 있습니다.
이제 1을 눌렀다 고 생각하십시오. 그런 다음 1은 X1 행과 Y1 열에 있습니다. X1이 0이면 Y1은 0이됩니다. 같은 방식으로 열 Y1, Y2, Y3 및 Y4를 감지하여 X1 행의 각 키를 감지 할 수 있습니다. 이 일은 모든 스위치에 대해 발생하며 매트릭스에서 스위치의 위치를 읽습니다.
각 녹색 원은 스위치이며 둘 다 같은 방식으로 함께 연결됩니다.
이 튜토리얼에서는 다음 사양으로 키보드를 인터페이스합니다.
- 내부 풀업을 사용합니다.
- 키 디 바운스 옵션을 추가합니다.
그러나 스위치를 누르지 않으면 Y1, Y2, Y3 및 Y4 를 높음 또는 1 로 만들어야합니다 . 그렇지 않으면 스위치를 눌렀을 때 논리 변경을 감지 할 수 없습니다. 그러나 핀이 출력이 아닌 입력으로 사용되기 때문에 코드 나 프로그램으로 만들 수 없었습니다. 따라서 마이크로 컨트롤러의 내부 작동 레지스터를 사용하고 해당 핀을 약한 풀업 활성화 모드로 작동 합니다. 이를 사용하면 기본 상태 일 때 로직 하이 활성화 모드가됩니다.
또한 키를 누를 때 스위치 접점에 스파이크가 발생하거나 노이즈가 발생하며 이로 인해 예상치 못한 다중 스위치 누름이 발생합니다. 따라서 먼저 스위치 누름을 감지하고 몇 밀리 초 동안 기다린 다음 스위치가 여전히 눌려 있는지 여부를 다시 확인하고 스위치가 여전히 눌려 있으면 스위치 누름을 수락합니다. 이것을 스위치의 디 바운싱 이라고 합니다.
이 모든 것을 코드에서 구현하고 브레드 보드에서 연결합니다.
4x4 키패드를 다른 마이크로 컨트롤러와 인터페이스 하는 방법도 확인하십시오.
- Arduino Uno와의 키패드 인터페이스
- 8051 마이크로 컨트롤러와 인터페이스하는 4x4 매트릭스 키패드
- ATmega32 마이크로 컨트롤러와 인터페이스하는 4x4 키패드
- 브레드 보드의 Raspberry Pi 디지털 코드 잠금
필요한 재료:
- 브레드 보드
- PC의 Pic-kit 3 및 개발 환경, 즉 MPLABX
- 전선 및 커넥터
- 캐릭터 LCD 16x2
- 20Mhz 크리스탈
- 33pF 세라믹 디스크 캡 2 개.
- 4.7k 저항
- 10k 프리셋 (가변 저항기)
- 4x4 매트릭스 키패드
- 5V 어댑터
회로도:
관련 핀의 수정과 저항을 연결합니다. 또한 PORTD를 통해 4 비트 모드로 LCD를 연결합니다. 우리는 RB4 포트를 통해 육각 키패드 또는 매트릭스 키패드를 연결했습니다.
PIC를 처음 사용하는 경우 PIC 마이크로 컨트롤러 시작하기: PIC 및 MPLABX 소개부터 시작하십시오.
프로그래밍 설명:
PIC 마이크로 컨트롤러와 매트릭스 키패드를 연결하기위한 완전한 코드 가 끝에 제공됩니다. 코드는 쉽고 자명합니다. 키패드 라이브러리는 코드에서 이해할 수있는 유일한 것입니다. 여기 에서는 키패드와 16x2 LCD를 인터페이스하기 위해 키패드 .h 및 lcd.h 라이브러리를 사용 했습니다 . 그 안에서 무슨 일이 일어나고 있는지 봅시다.
키패드.h 내부에서 기본 레지스터 라이브러리 인 xc.h 헤더를 사용 했음을 알 수 있습니다. 크리스탈 주파수는 kepad.c 파일 에서 사용되는 지연 사용을 위해 정의 됩니다. PORTRB 레지스터 에서 키패드 포트를 정의하고 개별 핀을 행 (X) 및 열 (Y)로 정의했습니다.
또한 포트를 출력 및 입력으로 리디렉션하는 키패드 초기화와 호출시 스위치 누름 상태를 반환하는 스위치 누름 스캔에 대해 두 가지 기능을 사용했습니다.
#포함
에서 keypad.c 우리는 키패드 스캐너 기능이 'n'을 반환하지 않을 경우 기능 아래의 키 누름을 반환 것을 볼 수 있습니다.
char switch_press_scan (void) // 사용자로부터 키 가져 오기 { char key = 'n'; // 키를 누르지 않았다고 가정 while (key == 'n') // 키가 눌릴 때까지 기다 립니다 key = 키패드 _scanner (); // 키를 반복해서 스캔합니다 . return key; // 키를 눌렀을 때 값을 반환 }
아래는 키패드 읽기 기능입니다. 각 단계에서 X1, X2, X3 및 X4 행을 0으로 만들고 Y1, Y2, Y3 및 Y4 상태를 읽습니다. 딜레이는 디 바운스 효과에 사용되며, 스위치를 계속 누르고 있으면 관련된 값을 반환합니다. 스위치를 누르지 않으면 'n' 을 반환 합니다.
문자 키패드 _ 스캐너 (무효) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); 동안 (Y_1 == 0); return '1'; } if (Y_2 == 0) {__delay_ms (100); 동안 (Y_2 == 0); return '2'; } if (Y_3 == 0) {__delay_ms (100); 동안 (Y_3 == 0); return '3'; } if (Y_4 == 0) {__delay_ms (100); 동안 (Y_4 == 0); return 'A'; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); 동안 (Y_1 == 0); return '4'; } if (Y_2 == 0) {__delay_ms (100); 동안 (Y_2 == 0); return '5'; } if (Y_3 == 0) {__delay_ms (100); 동안 (Y_3 == 0); return '6'; } if (Y_4 == 0) {__delay_ms (100); 동안 (Y_4 == 0); return 'B'; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; if (Y_1 == 0) {__delay_ms (100); 동안 (Y_1 == 0); return '7'; } if (Y_2 == 0) {__delay_ms (100); 동안 (Y_2 == 0); return '8'; } if (Y_3 == 0) {__delay_ms (100); 동안 (Y_3 == 0); return '9'; } if (Y_4 == 0) {__delay_ms (100); 동안 (Y_4 == 0); return 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; if (Y_1 == 0) {__delay_ms (100); 동안 (Y_1 == 0); 반환 '*'; } if (Y_2 == 0) {__delay_ms (100); 동안 (Y_2 == 0); 반환 '0'; } if (Y_3 == 0) {__delay_ms (100); 동안 (Y_3 == 0); 반환 '#'; } if (Y_4 == 0) {__delay_ms (100); 동안 (Y_4 == 0); return 'D'; } return 'n'; }
또한 마지막 4 비트에 약한 풀업을 설정하고 포트의 방향을 마지막 4 개 입력으로 설정하고 처음 4 개를 출력으로 설정합니다. OPTION_REG = & 0x7F의; 마지막 핀에 약한 풀업 모드를 설정하는 데 사용됩니다.
void InitKeypad (void) { Keypad_PORT = 0x00; // 키패드 포트 핀 값을 0으로 설정 Keypad_PORT_Direction = 0xF0; // 마지막 4 핀 입력, 처음 4 핀 출력 OPTION_REG & = 0x7F; }
에서 주요 PIC 프로그램을 우리가 먼저 구성 비트를 설정하고 몇 가지 필요한 라이브러리를 포함 (아래). 그런 다음 void system_init 함수에서 키패드와 LCD를 초기화합니다. 그리고 마지막에 의 주요 기능을 우리는 호출하여 키패드를 읽고 switch_press_scan () 함수와 LCD에 값을 반환.
여기에서 헤더 파일이 포함 된 전체 코드를 다운로드하고 아래 데모 비디오를 확인하십시오.