/******************************************/
#include <reg52.h>
#define uchar unsigned char
//mcu=at89s52
//keyboard= 4*4, output pin= P2[7,4], input pin= P2[3,0]
bit bdata b_key_scan; //'1'-> can scan the key
bit bdata b_key_debounce; //'1'-> key has debounce
bit bdata b_key_release; //'0'-> key has release
uchar keyscan(void);
/******************************************/
void main(void)
{
uchar r_temp_key;
TMOD = 0x01;
TH0 = (65536-10000)/256; //timer0 = 10ms
TL0 = (65536-10000)%256;
ET0 = 1;
TR0 = 1;
b_key_scan = 0;
b_key_debounce = 0;
b_key_release = 0;
EA = 1;
while(1)
{
r_temp_key = keyscan();
switch (r_temp_key)
{
case 0xee:
//key1
break;
case 0xed:
//key2
break;
case 0xeb:
//key3
break;
case 0xe7:
//key4
break;
case 0xde:
//key5
break;
case 0xdd:
//key6
break;
case 0xdb:
//key7
break;
case 0xd7:
//key8
break;
case 0xbe:
//key9
break;
case 0xbd:
//key10
break;
case 0xbb:
//key11
break;
case 0xb7:
//key12
break;
case 0x7e:
//key13
break;
case 0x7d:
//key14
break;
case 0x7b:
//key15
break;
case 0x77:
//key16
break;
default:
break;
}
}
}
void T0_ISR(void) interrupt 1
{
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%256;
b_key_scan = 1;
}
/******************************************/
uchar keyscan(void)
{
static uchar r_key_pre; //last key value
uchar r_key_row; //store the key row
uchar r_temp_p2; //p2 temp value
if(b_key_scan==0) return 0;
b_key_scan = 0;
r_key_row = (0xfe << 4);
while(r_key_row !=0)
{
P2 = r_key_row & 0xf0;
r_temp_p2 = P2;
r_temp_p2 &= 0x0f;
r_temp_p2 |= (r_key_row & 0xf0);
if((r_temp_p2 & 0x0f) != 0x0f)
{//have one key
if(b_key_release==1)
{//last key have not release
b_key_debounce = 0;
return 0;
}
if(b_key_debounce==0)
{//set debounce
r_key_pre = r_temp_p2;
b_key_debounce = 1;
return 0;
}
b_key_debounce = 0;
//compare twice key value
if(r_key_pre != r_temp_p2) return 0;
b_key_release = 1; //set key not release
return r_temp_p2;
}
r_key_row <<= 1;
}
//scan all none key, release key
b_key_release = 0;
return 0;
}
/******************************************/
|