/**************按键扫描*******************/
void key_scan()
{
static uint cnt; //计数延时
static bit sign=0; //按键自锁标志
if(PX!=0x0f) //有键按下
{
cnt++;
if(cnt>=1000) //延时消抖,消除多键同步差
{
cnt=1000; //防止溢出
if(sign==0)
{
sign=1; //防止键未抬起重复读键
switch(PX) //4个键去除0f共15种组合,根据实际要求取舍
{
case 0x0e: key= 1; break;
case 0x0d: key= 2; break;
case 0x0c: key= 3; break;
case 0x0b: key= 4; break;
case 0x0a: key= 5; break;
case 0x09: key= 6; break;
case 0x08: key= 7; break;
case 0x07: key= 8; break;
case 0x06: key= 9; break;
case 0x05: key=10; break;
case 0x04: key=11; break;
case 0x03: key=12; break;
case 0x02: key=13; break;
case 0x01: key=14; break;
case 0x00: key=15; break;
}
}
}
}
else //键抬起
{
cnt=0;
sign=0;
}
}
/**************按键服务*******************/
void key_service()
{
switch(key) //共15种组合,根据实际任务取舍
{
case 1: P1=0xfe; break; //LED显示键值
case 2: P1=0xfd; break;
case 3: P1=0xfc; break;
case 4: P1=0xfb; break;
case 5: P1=0xfa; break;
case 6: P1=0xf9; break;
case 7: P1=0xf8; break;
case 8: P1=0xf7; break;
case 9: P1=0xf6; break;
case 10: P1=0xf5; break;
case 11: P1=0xf4; break;
case 12: P1=0xf3; break;
case 13: P1=0xf2; break;
case 14: P1=0xf1; break;
case 15: P1=0xef; break;
}
}