1.独立按键
按键按下之后,按键的高电平被拉成低电平。
所以对独立按键按下并且弹起的判断:
while(1)
{
if(0 == key1)//有按键按下
{
delay_ms(10);
if(0 == key1)//确定有按键按下
{
while(!key1);//有按键抬起
delay_ms(10);
while(!key1);//确实有按键抬起
/*
在此处写下操作
*/
}
}
}
矩阵键盘
//物理地址
unsigned char key_scan(void)
{
unsigned char keyvalue;
KEYPORT = 0xf0;
if(0xf0 != KEYPORT)
{
delay_ms(10);
if(0xf0 != KEYPORT)
{
KEYPORT = 0xfe;
if(0xfe != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue +=0x0e;
while(0xfe != KEYPORT);
delay_ms(10);
while(0xfe != KEYPORT);
return keyvalue;
}
KEYPORT = 0xfd;
if(0xfd != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue +=0x0d;
while(0xfd != KEYPORT);
delay_ms(10);
while(0xfd != KEYPORT);
return keyvalue;
}
KEYPORT = 0xfb;
if(0xfb != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue +=0x0b;
while(0xfb != KEYPORT);
delay_ms(10);
while(0xfb != KEYPORT);
return keyvalue;
}
KEYPORT = 0xf7;
if(0xf7 != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue +=0x07;
while(0xf7 != KEYPORT);
delay_ms(10);
while(0xf7 != KEYPORT);
return keyvalue;
}
}
}
return 0xff;
}
//逻辑地址
unsigned char key_scanf(void)
{
unsigned char key_num;
key_num = key_scan();
switch(key_num)
{
case 0x7e:return 0;break;
case 0xbe:return 1;break;
case 0xde:return 2;break;
case 0xee:return 3;break;
case 0x7d:return 4;break;
case 0xbd:return 5;break;
case 0xdd:return 6;break;
case 0xed:return 7;break;
case 0x7b:return 8;break;
case 0xbb:return 9;break;
case 0xdb:return 10;break;
case 0xeb:return 11;break;
case 0x77:return 12;break;
case 0xb7:return 13;break;
case 0xd7:return 14;break;
case 0xe7:return 15;break;
default:return 0xff;break;
}
}