#####. 키 스캔 루틴 포트1에서 4비트씩 나누어서 사용.

/*----------------------------------------
key scan retun value format
######## ########
HIGH (8bit) : flag bits -> 0x80 : key one in
LOW (8bit) : key value
------------------------------------------
key matrix
----------------------------------------*/

#define KEY_R1 P1.0
#define KEY_R2 P1.1
#define KEY_R3 P1.2
#define KEY_R4 P1.3
#define KEY_C1 P1.4
#define KEY_C2 P1.5
#define KEY_C3 P1.6
#define KEY_C4 P1.7
#define KEY P1

#define KEY_1 0x28
#define KEY_2 0x48
#define KEY_3 0x88
#define KEY_4 0x24
#define KEY_5 0x44
#define KEY_6 0x84
#define KEY_7 0x22
#define KEY_8 0x42
#define KEY_9 0x82
#define KEY_10 0x21
#define KEY_11 0x41
#define KEY_12 0x81
#define KEY_13 0x00
#define KEY_14 0x00
#define KEY_15 0x00
#define KEY_16 0x00

BYTE key_in_count;
BYTE key_scan_event;

WORD key_scan()
{
BYTE key_val;
WORD key_return;
BYTE key_wr;
BYTE i;

key_wr = 0x10;
for ( i = 0; i < 4; i++ ) /* because 4 * 4 key */
{
key_wr = key_wr & 0xf0;
KEY = ~key_wr;
key_val = key_val; /* DUMMY */
key_val = key_val; /* DUMMY */
key_val = key_val; /* DUMMY */
key_val = KEY; /* DUMMY */
key_val = KEY; /* DUMMY */
key_val = KEY;
key_val = (~key_val) & 0x0f;

if ( key_val != 0x00 )
{
key_val = key_val | key_wr;
if ( key_in_count == 0 ) { key_return = 0x8000 | key_val; }
else { key_return = 0x0000; }
/* key repeat */
/* if ( key_in_count >= 10 ) { key_return = 0x8000 | key_val; } */
if ( key_in_count >= 10 ) { key_return = 0x0000; }
else { key_in_count++; }
if ( key_in_count >= 250 ) { key_in_count = 250; }
break;
}
key_wr = key_wr << 1;
}
if ( key_val == 0x00 )
{
key_in_count = 0; key_return = 0x00;
}

return ( key_return );
}


#####. 메인에서 쓰는 부분

if ( timer_cnt01 >= 10 ) /* 50msec */
{
timer_cnt01 = 0;
w1 = key_scan();
key_scan_event = TRUE;
}
else { key_scan_event = FALSE; }

if ( key_scan_event == TRUE )
{
if ( w1 & 0x8000 )
{
lcd_write_inst( 0xc0 );
b1 = w1 & 0x00ff;
lcd_write_char(hex_to_asc((b1 >> 4) & 0x0f));
b1 = w1 & 0x00ff;
lcd_write_char(hex_to_asc(b1 & 0x0f));
b1 = w1 & 0x00ff;

switch(b1)
{
case KEY_1: key = 1; break;
case KEY_2: key = 2; break;
case KEY_3: key = 3; break;
case KEY_4: key = 4; break;
case KEY_5: key = 5; break;
case KEY_6: key = 6; break;
case KEY_7: key = 7; break;
case KEY_8: key = 8; break;
case KEY_9: key = 9; break;
case KEY_10: key = 10; break;
case KEY_11: key = 11; break;
case KEY_12: key = 12; break;
}
}
}