◆◆ ATmega128 : KeyPad P.379 ◆◆
/*
KEY PAD - 74LS138이용 P.379
keypad - > FND 숫자 display
21 16 11 6 1
22 17 12 7 2
23 18 13 8 3
24 19 14 9 4
25 20 15 10 5
0323A_KEYPAD_74ls138.c
*/
#include <mega128.h>
#include <delay.h>
unsigned char Keybuf = 0; // 현재 눌린 키값 계산 저장
unsigned Oldkey = 0xff; // 이전에 눌렸던 키값
unsigned Newkey = 0; // keybuf 변수 저장
unsigned char Seg_dis[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79 }; // FND
unsigned char N1 = 0, N10 = 0;
void Scankey(void){
unsigned char Tmp, Row, Cul ; // 임시값저장, 0~4까지의 값, row값에 따른 키 계산값
for( Row = 0 ; Row < 5 ; Row++){
do{
PORTC = 0xf8 | Row; // Row에 1을 쓴다.
Tmp = PINC & 0xf8; // 첫번째 읽은 포트3의 비트 7 ~ 비트3 값을 Tmp 에 저장
}//enddo
while( ( PINC & 0xf8) != Tmp ); // 첫번째와 두번째 읽은값이 일치하지 않으면 다시 읽는다
if( Tmp != 0xf8 ){
Tmp += Row;
if( Tmp == Oldkey ){
Tmp = ( Tmp >> 3 ) & 0x1f;
if( Tmp == 0x1e ) Cul = 1;
else if( Tmp == 0x1d ) Cul = 2;
else if( Tmp == 0x1b ) Cul = 3;
else if( Tmp == 0x17 ) Cul = 4;
else if( Tmp == 0x0f ) Cul = 5;
Keybuf = Row*5 + Cul;
}//endif
else Oldkey = Tmp;
}//endif
}//endfor
}//endScankey
void main(void){
DDRB = 0xff; // B port
DDRF = 0xff; // F port
DDRC = 0x07; // C port
while(1){
Scankey();
if( Keybuf != Newkey){
Newkey = Keybuf;
}//endif
N10 = Newkey / 10 ; // 10 자리수
N1 = Newkey % 10; // 1자리수
PORTF = 0b11100000;
PORTB = Seg_dis[N1]; // 1자리수 - FND
delay_ms(5);
PORTF = 0b11010000; // 10자리수 - FND
PORTB = Seg_dis[N10];
delay_ms(5);
}//endwhile
}//end main
