矩阵键盘是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。
<span style="font-family:宋体;">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) //确实</span><span style="font-family: 宋体;">有按键按下</span><span style="font-family:宋体;">
{
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;
}</span>