4×4行列式扫描:
每个按键都由两根线共同控制,两者都为低电平时按键才能发挥作用,如上图所示,P10-P13称为列线,P14-P17称为行线,使其中一条行线(或列线)为低电平,分别去检测另外的列线(或行线)即可。
如上图所示的行列式扫描程序如下:
//定义一个扫描函数
typedfe unsigned char u8;
u8 key_scan()
{
u8 key_value=0;
K=0x7f; //第一行为0即P17=0
if (K!=0x7f)
{
delay_10us(1000);
switch(K) //保证第一行为0
{
case 0x77:key_value=0; break; //如果第一列为0.P13=0
case 0x7b:key_value=1; break;
case 0x7d:key_value=2; break;
case 0x7e:key_value=3; break;
}
}
while (K!=0x7f); //按键松开
K=0xbf;
if (K!=0xbf)
{
delay_10us(1000);
switch(K)
{
case 0xb7:key_value=4; break;
case 0xbb:key_value=5; break;
case 0xbd:key_value=6; break;
case 0xbe: key_value=7; break;
}
}
while(K!=0Xbf);
K=0xdf;
if (K!=0xdf)
{
delay_10us(1000);
switch(K)
{
case 0xd7:key_value=8; break;
case 0xdb:key_value=9; break;
case 0xdd:key_value=10; break;
case 0xde: key_value=11; break;
}
}
while(K!=0xdf);
K=0xef;
if (K!=0xef)
{
delay_10us(1000);
switch(K)
{
case 0xe7:key_value=12; break;
case 0xeb:key_value=13; break;
case 0xed:key_value=14; break;
case 0xee: key_value=15; break;
}
}
while(K!=0xef) ;
return key_value;
}
//主函数
void main()
{
while(1)
{
//要执行的程序
}
}