Protues中的KEYPAD-PHONE如图
需要注意的是,与矩阵键盘不同,矩阵键盘采用扫描的方式,如图的数字键盘是一个键对应一个输入端口。
驱动12键KEYPAD-PHONE的代码如下
#define KEY_PORT P1
void Delay(unsigned int n)
{
unsigned int i=0, j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
unsigned char key_phone_scan(void)
{
unsigned char key_value=0;
char a=0;
KEY_PORT=0xFB;//给第一列赋值0,其余全为1
if(KEY_PORT!=0xFB)//判断第一列按键是否按下
{
Delay(10);//消抖
switch(KEY_PORT)//保存第一列按键按下后的键值
{
case 0x7B: key_value=1;break;
case 0xBB: key_value=4;break;
case 0xDB: key_value=7;break;
case 0xEB: key_value=10;break;
}
}
while((a<50)&&(KEY_PORT!=0xFB)) //按键松手检测
{
Delay(1);
a++;
}
KEY_PORT=0xFD;//给第二列赋值0,其余全为1
if(KEY_PORT!=0xFD)//判断第二列按键是否按下
{
Delay(10);//消抖
switch(KEY_PORT)//保存第二列按键按下后的键值
{
case 0x7D: key_value=2;break;
case 0xBD: key_value=5;break;
case 0xDD: key_value=8;break;
case 0xED: key_value=11;break;
}
}
while((a<50)&&(KEY_PORT!=0xFD)) //按键松手检测
{
Delay(1);
a++;
}
KEY_PORT=0xFE;//给第三列赋值0,其余全为1
if(KEY_PORT!=0xFE)//判断第三列按键是否按下
{
Delay(10);//消抖
switch(KEY_PORT)//保存第三列按键按下后的键值
{
case 0x7E: key_value=3;break;
case 0xBE: key_value=6;break;
case 0xDE: key_value=9;break;
case 0xEE: key_value=12;break;
}
}
while((a<50)&&(KEY_PORT!=0xFE)) //按键松手检测
{
Delay(1);
a++;
}
return key_value;
}