求51单片机最简单的矩阵按键程序

刚接触矩阵按键,理解不了,给我一个最简单的矩阵按键控制灯亮灭的程序,让我消化消化。

uchar x[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
uchar scan() //扫描键值的子程序
{
P1=0xf0;
scan0=P1;
delay1ms(20);

if(scan0!=0xf0) //判键是否按下
{
scan0=P1;
if(scan0!=0xf0) //二次判键是否按下
{
P1=0x0f;
delay1ms(20);
scan1=P1;
keycode=scan0|scan1; //组合成键编码
for(m=0;m<16;m++)
{
if(keycode==x[m]) //查表得键值
{
key=m;

}

}
}
}
return(key);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-10-11
uchar x[16]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
uchar scan()      //扫描键值的子程序
{
  key = 16;
  P1 = 0xf0; scan0 = P1;
  P1 = 0x0f; scan1 = P1;
  k1 = scan0 | scan1; //第一次读出按键
 
  if(k1 != 0xff) {  //如果键按下

    delay1ms(20);  //延时

 
  P1 = 0xf0; scan0 = P1;
  P1 = 0x0f; scan1 = P1;
  k2 = scan0 | scan1; //第二次读出按键
 
    if(k1 == k2) {   //如果两次按键相同
      for(m = 0; m < 16; m++) //查键值表
        if(k1 == x[m]) key = m;
    }
  }
  return(key);
}