// 키패드 7-SEG LED제작

// KEY PAD 입력기

// 1. 처음에는 오른쪽 끝에 0이 하나만 표시된다

// 2. KEYPAD를 누르면 해당숫자를 4자리 FND에 오른쪽부터 왼쪽으로 밀려가며 표시

// 3. Leading0은 표시하지 않는다..

// sw1:0~sw16:F

<!--[if !supportEmptyParas]--> <!--[endif]-->

#include<avr/io.h>

#include<util/delay.h>

#include<stdio.h>

<!--[if !supportEmptyParas]--> <!--[endif]-->

#define N_COL 4 // 스캔할 키패드의 열수

#define KEY_OUT PORTA // Keypad 출력포트

#define KEY_IN PINA // keypad 입력포트

#define KEY_DIR DDRA // KEYPAD 입출력 방향 레지스터

<!--[if !supportEmptyParas]--> <!--[endif]-->

static unsigned char key_scan(void); // 맞는지 안맞는지 확인

static unsigned char pin = NO_KEY; // former code

<!--[if !supportEmptyParas]--> <!--[endif]-->

void key_init(void){

KEY_OUT = 0xF0; // 출력조기값으로 0을 출력 <1

KEY_DIR = 0x0F; // 하위니블 출력 0-3 까지 상위니블 입력 4-7까지

<!--[if !supportEmptyParas]--> <!--[endif]-->

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

unsigned char key_intput(void) {

unsigned char in,in1; // in,in1 초기화

in = key_scan(); // 키 스캔을 하여서 코드값을 읽는다

while(1){ // 무한반복

in1= key_scan(); // 한번더 읽는다

if( in==in1) break; // 같을시 그만

in = in1 ; // in = in1 같다

}

if(!(in & 0xF0)){ // in 이라는 key값을 리셋

pin = 0; // 이전에잇던 키 값을 리셋

return =0; //

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

if ( pin ==in) // 0이라는 pin 값과 in의 값이 같을때

return 0; // 비어잇던 키를 다시 돌아온다

pin = in; // pinin이라는 키 값을 넣는다

return in; // 키코드를 복귀시킨다

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

static unsigned char key_scan(void){ // key code를 스캔한다.

unsigned char out. i,in; // out ,i, in 설정

out = 0x01;

for (i=0; i<N_COL;i++){ // i0부터 시작 4보다 작을시 i++한다 0 ,1,2,3

KEY_OUT = ~out; // KEY_OUT =~out 11111110

asm("nop";;); // 지연

in = (~KEY_IN) & 0xF0; // PINA 입력 포트 KEY_INAND 11110000

// AND값의 결과에 나온값을 ~ 부호 시켜준다

// SW값이 0이어야 커진다

if (in){ // in이 트루인지 펄스인지 펄스=0

in+=out; // in에다가 out을 더한다

break; // 된것으로 판단

out <<=1; // out은 왼쪽으로 1비트 쉬프트한다.

}

return in; // 펄스일시 in값이 복귀한다.

}