依据各教材的解析和网上部分解释,大致理解但依旧有疑虑。
以按下S16为例(P3.3、P3.4)
uchar keyscan(void)
{
uchar cord_h,cord_l;
P3=0x0f; //初始赋值0000 1111
cord_h=P3&0x0f; //按键按下故P3变成1110 0111(0xe7),所以cord_h成0000 0111
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //0000 0111
P3=cord_h|0xf0; //将前四位变高电平,保留后四位1111 0111
cord_l=P3&0xf0; //因为已经按下,故P3是1110 0111,所以cord_l成1110 0000
return(cord_h+cord_l);//键盘最后组合码值1110 0111
}
}return(0xff); //返回该值
}
解决了cord_l的值的问题,(主要是P3的值不断更新)
但P3=cord_h|0xf0;这条语句不知有何作用(对下文而言)觉得累赘,可以删除。
但是网上解释这是由于硬件方面的语句。由于没找到硬件层次的解释(也许是找到但看不懂)就此搁置。
值得肯定的是,删除该语句会导致整个矩阵键盘的失效,按前两行的按键时指示灯会闪动,数码管无变化(完全失效)。