求解释单片机键盘扫描的一段程序(关键是松手那块不明白)

来源:百度知道 编辑:UC知道 时间:2024/05/23 14:44:37
void ReadKey(void) //读键盘值
{
unsigned char i,j,key;
j=0xfe;
key=0xff; //设定初值
for (i=0;i<4;i++){
P0=j; //P0口低4位循环输出0,扫描键盘
//leday();
if ((P0&0xf0)!=0xf0){ //如果有键按下,P0口高4位不会全为1,
key=P0; //读取P0口,退出循环,否则循环下次
break;
}
j=_crol_(j,1); //此函数功能为左循环移位
}
if (key==0xff){ //如果读取不到P0口的值,比如是干扰,我们不做键值处理,返回

SPK=1; //按键有松开,停止蜂鸣器响
return;
}

if(l_keyold==key){ //检测按键放开否,如果一样表明没放开,
return;
}
SPK=0; //有键按下,我们驱动蜂鸣器响
l_keyold=key; //获取键码做为放开的凭证

for(i=0;i<17;i++){ //查表获得相应的16进制值存放l_key变量中
if (key==key_tab[i]){
l_key=i;
break;
}
}
//程序运行到这里,就表明有键值被读取存放于l_key变量中,主程序就可以检测此变量做相应外理,
//此时我们回到主程序
}
按着按键不放怎么会有l_keyold==key?(l_keyold是有个初值0XFF的),那个l_keyold不是应该保存的是上次按键后的KEY值,如果再次按下其他键就算不放手,l_keyold也等于那个KEY值,"if(l_keyold==key"

松手检测也就是消抖嘛,在你这程序中就是
if (key==0xff){ //如果读取不到P0口的值,比如是干扰,我们不做键值处理,返回
SPK=1; //按键有松开,停止蜂鸣器响
return; }
主要作用就是防止其他干扰信号误判成按键信号。
另一个就是假如你长按不放的话就要使它在那等待你放开才会执行程序,所以这在你这的程序就是
if(l_keyold==key)
{ //检测按键放开否,如果一样表明没放开,
return;
}
其实这个return可以不要,直接用分号等待也行,还有什么不懂的吗?

松手检测是很有必要的,如果没有松手检测,当你按下时会相当于你多次按下,这里松手检测用的是if;也可以用while()和for()循环做,这里的意思是当检测到手还没有松开时,就会返回到if前,再次进行判断,直到检测到松手时,才会继续向下执行!
你明白了吗

可惜我不怎么懂C语言
汇编也很简单编程的

哪里不明白?