ITGenerations
[avr]키패드 입력, 세븐세그먼트 [실패] 본문
// source 27
//키패드 입력, 세븐세그먼트
/*
#include <avr/io.h>
#include <avr/interrupt.h>
#include "iseg7.h"
#include "keypad.h"
int main()
{
unsigned char key;
unsigned short data=0;
ISeg7Init();
KeyInit();
sei();
ISeg7DispNum(data, 10);
while(1)
{
key=KeyInput();
switch(key)
{
case SW1:
data+=1;
break;
case SW2:
data+=2;
break;
case SW3:
data+=3;
break;
default:
break;
}
ISeg7DispNum(data,10);
}
}
*/
----------------------------------------keypad.h-----------------------------------------------------------------------
#ifndef __KEYPAD_H__
#define __KEYPAD_H__
// 키패드 스위치 코드 값
#define SW0 0x18 // 0-번째 행
#define SW1 0x14
#define SW2 0x12
#define SW3 0x11
#define SW4 0x28 // 1-번째 행
#define SW5 0x24
#define SW6 0x22
#define SW7 0x21
#define SW8 0x48 // 2-번째 행
#define SW9 0x44
#define SW10 0x42
#define SW11 0x41
#define SW12 0x88 // 3-번째 행
#define SW13 0x84
#define SW14 0x82
#define SW15 0x81
#define NO_KEY 0x00
//
// 함수 정의
//
void KeyInit(void);
unsigned char KeyInput(void);
#endif
-------------------------------------------------------------------------------------------------------------------
------------------------------------keypad.c-------------------------------------------------------------------
//=====================================================
// Keypad Matrix 인터페이스
//
// 포트 핀 F7 F6 F5 F4 F3 F2 F1 F0
// 키 패드 I3 I2 I1 I0 O3 O2 O1 O0
//
// In : 키패드 입력 핀
// On : 키패드 출력 핀
//=====================================================
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "keypad.h"
#define N_COL 4 // 스캔 할 키패드 열 수
#define KEY_OUT PORTF // keyboard 출력 포트
#define KEY_IN PINF // keyboard 입력 포트
#define KEY_DIR DDRF // keyboard 입출력 방향 레지스터
static unsigned char key_scan(void);
static unsigned char pin = 0; // 이전 키값
void KeyInit()
{
KEY_OUT = 0xF0; // 출력 초기 값으로 0을 출력
KEY_DIR = 0x0F; // 하위니블 ->출력, 상위니블->입력
}
//==============================================
// 키패드의 스캔 코드 값을 리턴한다.
//
// 리턴 값 : 0이 아닐 때 : 스캔 코드 값
// 0일 때 : 입력 값이 없음
//==============================================
unsigned char KeyInput(void)
{
unsigned char in, in1;
in = key_scan(); // 키스캔을 하여 값을 읽는다.
while(1)
{
_delay_ms(10); _delay_ms(10); _delay_ms(10);
in1 = key_scan(); // 한 번 더 읽는다.
if(in==in1) break;
in = in1;
}
if(!(in & 0xF0)) // 눌러진 키가 없음
{
pin =0;
return 0;
}
if(pin == in) // 같은 키를 계속 누르고 있음
return 0; // 새로운 키 입력이 없는 것으로 리턴
pin = in; // 키 값을 저장 함.
return in; // 코드를 반환한다.
}
//-------------------------------------------
// 스캔코드값을 리턴함
//-------------------------------------------
static unsigned char key_scan(void)
{
unsigned char out, i, in;
out = 0x01; // 3-열부터 스캔
for(i=0; i<N_COL; i++)
{
KEY_OUT = ~out; // 출력 포트에 스캔출력을 낸다.
asm("nop"::); // 1사이클 지연
in = (~KEY_IN) & 0xF0; // 입력된 값의
//상위 4비트를 취한다.
if(in) // 키 입력이 있음
{
in += out; // 출력과 입력을 조합하여 코드생성
break; // 입력이 있으므로 루프 탈출
}
out <<= 1; // 다음 스캔코드로 변경
}
return in; // 스캔코드 값 리턴
}
-------------------------------------------------------------------------------------------------------------------
'Univ > AVR atmega128' 카테고리의 다른 글
[avr] LCD 타이머 표시 (0) | 2017.12.10 |
---|---|
[avr] LCD제어 모듈 테스트, 가변저항 x (0) | 2017.12.09 |
세븐 세그먼트 + 키패드 (0) | 2017.12.09 |
[avr] 세븐세그먼트 1씩 증가 (0) | 2017.12.09 |
[avr] 세븐세그먼트/트랜지스터 사용 o (0) | 2017.12.09 |