제13장 KeyPAD 비밀번호입력기 (HBE-MCU-Multi AVR).ppt …artoa.hanbat.ac.kr/lecture_data/microprocessor/2014/제13장 KeyPAD... · Microsoft PowerPoint - 제13장 KeyPAD 비밀번호입력기
Post on 11-Feb-2018
249 Views
Preview:
Transcript
KeyPAD를이용한비밀번호입력기
Chapter. 13
Jaeheung, Lee
HBE-MCU-Multi AVR
목차
1. 키패드(KeyPAD)
2. KeyPAD를 이용한 비밀번호 입력기
키패드(KeyPAD)
¨ 키패드(KeyPAD)
¤ 마이크로컨트롤러 활용에서 사용자의 입력을 받아 들이기 위한 장치
¤ 전화기, 컴퓨터, 핸드폰, 냉장고등 거의 모든 가전제품에서 사용
¤ 키 패드 인터페이스 방식
n 정적 인터페이스(Static Interface) 방식 :
n 키를 포트에 일대 일로 연결하여 입력을 검사하는 방식
n 하드웨어 구성이 간편하고, 소프트웨어 구현이 쉬운 장점이 있다.
n 많은 키 입력이 필요할 때는 키의 개수 만큼의 포트를 사용하기 때문에 포트 사용이 비효율적이다.
n 동적 인터페이스(Dynamic Interface) 방식 :
n 키 스위치를 매트릭스 형태로 구성하여 출력상태에 따른 입력 값을 비교하여키 입력을 판별하는 방법
n 적은 포트로 여러 개의 키를 제어할 수 있다.
n 눌린 스위치의 검출 방법이 좀 복잡해진다.
키패드(KeyPAD)
¨ 키패드(KeyPAD)¤ 정적 인터페이스(Static Interface) 방식
키패드(KeyPAD)
¨ 키패드(KeyPAD)¤ 동적 인터페이스(Dynamic Interface) 방식
키패드(KeyPAD)
¨ 키패드(KeyPAD)¤ 동적 인터페이스방식에서의 신호에 따른 스위치 눌림 검출표
KEY_C0~2=100 KEY_C0~2=010 KEY_C0~2=001
KEY_R0~3=1000 S1 S2 S3
KEY_R0~3=0100 S4 S5 S6
KEY_R0~3=0010 S7 S8 S9
KEY_R0~3=0001 S10 S11 S12
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 실습 개요
¤ 12키 키패드를 이용하여 자동문 개폐기 등에 사용되는 비밀번호 입력기를 만들도록 한다.
¤ 키패드 모듈과 TEXT LCD를 사용하여, 프로그램을 작성한다.
¤ 편이상 비밀번호는 미리 정의해두기로 하고, 4자리수 비밀 번호를 사용하기로 한다.
¨ 실습 목표
¤ 키패드의 동작 원리를 이해
¤ ATmega128의 GPIO를 이용한 키패드 데이터 입력 방법 습득
¤ TEXT-LCD, FND, GPIO 제어의 복합적인 프로그램 능력 배양
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 사용 모듈 : MCU 모듈, TEXT-LCD모듈, 키패드 모듈, FND 모듈
Control 신호 (Rs, RW, E)
MCU 모듈
TEXT LCD 모듈
Data BUS (D0~D7)
KeyPAD
신호
키패드 모듈
E 포트
FND모듈 연결
C,D 포트
TEXT LCD 모듈 연결
FND
모듈 Signal
FND 모듈
F포트
키패드모듈 연결
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 사용 모듈 : 키패드 모듈회로
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 모듈 결선 방법
MCU 모듈포트 C의PC0~PC7은TEXT LCD 모듈의 D0~D7 핀에 연결
MCU 모듈포트 D의PD5~PD7은 각각TEXT LCD 모듈의 RS, RW, E에 연결
MCU 모듈포트 A의 PA0~PA2은 키패드모듈의 C0~C2에, PA3~PA6은키패드 모듈의 R0~R3에 연결
MCU 모듈포트 E의PE0~PE7은FND모듈의SB_A~SA_H까지 연결
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 사전지식¤ 동작
n 키패드를 이용하여 비밀번호를 입력하고,
n 비밀번호가 입력되면 4자리가 입력될 때까지 기다렸다가 미리 지정된비밀번호와 비교하여, 맞는지 여부를 판단하고 결과를 TEXT LCD에 알려주기로 한다.
¤ 키패드 입력 루틴n 키패드모듈의 KEYPAD_R0~KEYPAD_R3에 차례대로 “1000”, “01
00”, “0010”, “0001”을 인가해 가면서, KEYPAD_C0~KEYPAD_C2값을 보면 어떤 키가 눌러졌는지 검출이 가능
¤ 소스 구성n key.c : 메인 프로그램 파일
n key_pad.c : 키패드와 비밀 번호 입력/비교 함수등 이 예제의 핵심 기능을 하는 함수들 포함
n lcd.c : TEXT LCD 관련 함수들 포함
n avr_lib.c : 부가적으로 자주 사용되는 사용자 함수들 포함
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 사전지식
¤ 키패드 입력 루틴n 키패드모듈의 KEYPAD_R0~KEYPAD_R3에 차례대로 “1000”,
“0100”, “0010”, “0001”을 인가해 가면서, KEYPAD_C0~KEYPAD_C2값을 보면 어떤 키가 눌러졌는지 검출이 가능
n 함수 get_passwd() 동작
n 키패드로 키패드 체크신호(R0~R3)을 차례대로 출력
n 키패드로부터 키입력 신호(C0~C1)를 받아 어떤 키가 눌렸는지 확인하여 FND에 출력
n 비밀번호 체크 함수에 비밀번호 비교를 의뢰
실습 20 : KeyPAD를 이용한 비밀번호입력기
Get_passwd
u08 get_passwd(){
ROW_PORT = ROW_1;
ms_delay(1);
if((COLUMN_PIN & KEY_1)){
FND_PORT = FND_DATA_TBL[1];
passcheck('1');
}
else if((COLUMN_PIN & KEY_2)){
FND_PORT = FND_DATA_TBL[2];
passcheck('2');
}
else if((COLUMN_PIN & KEY_3)){
FND_PORT = FND_DATA_TBL[3];
passcheck('3');
}
ms_delay(10);
키패드 입력 루틴
실습 20 : KeyPAD를 이용한 비밀번호입력기
Get_passwd
ROW_PORT = ROW_2;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[4];
passcheck('4');
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[5];
passcheck('5');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[6];
passcheck('6');
}
ms_delay(10);
키패드 입력 루틴
실습 20 : KeyPAD를 이용한 비밀번호입력기
Get_passwd
ROW_PORT = ROW_3;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[7];
passcheck('7');
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[8];
passcheck('8');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[9];
passcheck('9');
}
ms_delay(10);
키패드 입력 루틴
실습 20 : KeyPAD를 이용한 비밀번호입력기
Get_passwd
ROW_PORT = ROW_4;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[15];
reset_check();
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[0];
passcheck('0');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[11];
back_pass();
}
ms_delay(10);
return _loop;
}
키패드 입력 루틴
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 소스분석¤ Lcdconf.h
#ifdef LCD_PORT_INTERFACE
#ifndef LCD_CTRL_PORT
#define LCD_CTRL_PORT PORTD
#define LCD_CTRL_DDR DDRD
#define LCD_CTRL_RS 5
#define LCD_CTRL_RW 6
#define LCD_CTRL_E 7
#endif
#ifndef LCD_DATA_POUT
#define LCD_DATA_POUT PORTC
#define LCD_DATA_PIN PINC
#define LCD_DATA_DDR DDRC
#endif
#endif
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 소스분석¤ Key_pad.h
1-1)
#ifndef KEY_PAD_H
#define KEY_PAD_H
#include<avr/io.h>
#include"lcd.h"
#include"avr_lib.h“
#define ROW_PORT PORTA
#define ROW_DDR DDRA
#define ROW_DDR_ADDR 0x78
#define COLUMN_PORT PORTA
#define COLUMN_DDR DDRA
#define COLUMN_PIN PINA
실습 20 : KeyPAD를 이용한 비밀번호입력기
1-1)
#define FND_PORT PORTE
#define FND_DDR DDRE
#define KEY_1 0x01
#define KEY_2 0x02
#define KEY_3 0x04
#define ROW_1 0x08
#define ROW_2 0x10
#define ROW_3 0x20
#define ROW_4 0x40
void init_keypad();
u08 get_passwd();
u08 passwd_check(u08 pass[]);
#endif
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 소스분석¤ Key_pad.c
2-1)
#include"key_pad.h"
u08 cnt=0;
u08 pass[4]={0};
u08 _loop=1;
u08 FND_DATA_TBL[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X67,0X77,0X7C,0X39,0X5E,0X79,0X71,0X08,0X80};
u08 PASSWD[]="1234";
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-2) void init_keypad(){
ROW_DDR |= ROW_DDR_ADDR;
ROW_PORT &= ~(ROW_DDR_ADDR);
COLUMN_DDR &= ~(KEY_1 | KEY_2 | KEY_3);
COLUMN_PORT &= ~(KEY_1 | KEY_2 | KEY_3);
FND_DDR = 0xff;
FND_PORT = 0x00;
lcdInit();
lcdGotoXY(0,0);
lcdPrintData("PASSWORD?",sizeof("PASSWORD?")-1);
lcdGotoXY(0,1);
lcdDataWrite('>');
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-4) void reset_check(){ // 패스워드 체크 리셋
lcdClear();
ms_delay(10);
lcdGotoXY(0,0);
lcdPrintData("Reset!!",sizeof("Reset!!")-1);
ms_delay(500);
lcdGotoXY(0,0);
lcdPrintData("PASSWORD?",sizeof("PASSWORD?")-1);
lcdGotoXY(0,1);
lcdDataWrite('>');
while((COLUMN_PIN & 0x07)!=0);
cnt=0;
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-5) void passcheck(u08 data){ // 4자리의 패스워드가 맞는지 확인하는 함수
if(cnt!=3){ //4자리입력이 아닌경우
lcdDataWrite('*');
pass[cnt++]=data;
}
else if(cnt==3){
lcdDataWrite('*');
pass[cnt]=data;
if(passwd_check(pass)!=0){ // 비밀번호 1234 와 다른 경우
lcdGotoXY(0,0);
lcdPrintData("WrongPassWord!",sizeof("WrongPassWord!")-1);
lcdGotoXY(0,1);
lcdPrintData("Plz Check U Pass",sizeof("Plz Check U Pass")-1);
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-5)
cnt=0;
ms_delay(950);
lcdClear();
ms_delay(50);
lcdPrintData("PASSWORD?",sizeof("PASSWORD?")-1);
lcdGotoXY(0,1);
lcdDataWrite('>');
}
else{ // 패스워드가 맞는경우
lcdClear();
lcdGotoXY(0,0);
lcdPrintData("Hello MCU_WORLD",sizeof("Hello MCU_WORLD")-1);
cnt=0;
_loop=0;
ms_delay(1000);
}
}
while((COLUMN_PIN & 0x07)!=0);
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-6) u08 get_passwd(){
ROW_PORT = ROW_1;
ms_delay(1);
if((COLUMN_PIN & KEY_1)){
FND_PORT = FND_DATA_TBL[1];
passcheck('1');
}
else if((COLUMN_PIN & KEY_2)){
FND_PORT = FND_DATA_TBL[2];
passcheck('2');
}
else if((COLUMN_PIN & KEY_3)){
FND_PORT = FND_DATA_TBL[3];
passcheck('3');
}
ms_delay(10);
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-6) ROW_PORT = ROW_2;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[4];
passcheck('4');
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[5];
passcheck('5');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[6];
passcheck('6');
}
ms_delay(10);
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-6) ROW_PORT = ROW_3;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[7];
passcheck('7');
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[8];
passcheck('8');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[9];
passcheck('9');
}
ms_delay(10);
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-6) ROW_PORT = ROW_4;
ms_delay(1);
if(COLUMN_PIN & KEY_1){
FND_PORT = FND_DATA_TBL[15];
reset_check();
}
else if(COLUMN_PIN & KEY_2){
FND_PORT = FND_DATA_TBL[0];
passcheck('0');
}
else if(COLUMN_PIN & KEY_3){
FND_PORT = FND_DATA_TBL[11];
back_pass();
}
ms_delay(10);
return _loop;
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
2-7) u08 passwd_check(u08 pass[]){
u08 _error=0;
u08 i;
for(i=0;i<4;i++){
if(pass[i]!=PASSWD[i])
_error++;
}
return _error;
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 구동 프로그램 : 소스분석¤ Key.c
3-1) #include<avr/io.h>
#include"key_pad.h" // 키패드 제어 헤더
int main(){
char loop = 1;
init_keypad(); //키패드 설정 초기화, Textlcd 초기화
3-2) while(loop){
loop=get_passwd(); //반복문을 돌려서 비밀번호가 맞는지 찾아냄
}
return 0;
}
실습 20 : KeyPAD를 이용한 비밀번호입력기
¨ 실행 결과
top related