这样的解释是否满意?
void key_scan(void)
{
uchar sccode,recode,i;
p1=0xf0; // 设置p1口为0xf0,这个键盘是4乘4的,p1口高4位是输入,低4位是输出.
if((p1&0xf0)!=0xf0) // 如果读入p1口的高4位为高电平,则没有按键信息,程序退出键盘扫描.
{
delay(); // 有按键,作按键延时,这里不知道晶振频率,一般是延时20-100ms时间.
if((p1&0xf0) !=0xf0) // 如果此时读入p1口的高4位为高电平,则认为按键抖动,程序退出键盘扫描.
{
sccode=0xfe; // 设置初始最低键盘扫描行线为低电平,列线是4位输入.
for(i=0;i <4;i++) // 分别扫描每行按键,查找对应的列输入位为低电平,以确定具体按键.
{
p1=sccode; // 将行线的值设置到p1口.
if((p1&0xf0) !=0xf0) // 如果当前高4位线有低电平,则表明有按键按下,否则当前行线所对应的按键没有按下.
{
recode=(p1&0xf0)|0x0f; // 读取高4位的列线值送入寄存器recode.
k=(~recode)+(~sccode); // 当前行线与列线的数值取反送入k寄存器.
rr=p1; // rr应是个全局变量,它保存当前p1口数据.
key_in(k); // 确定按键的键值,即确定是键盘的哪个按键被按下.
break; // 退出键盘扫描程序.
}
else sccode=(sccode < <1)|0x01; // 当前行没有按键按下,变换下一个行线为低电平检测.
}
}
}
//do {ta=p2;}while(ta==rr);
}
void delay() //去抖动
{
int a=2500;
while(--a);
}
void key_in(uchar k)
{
uchar ta;
//uchar keydata;
do
{
ta=p1; // 读入当前p1口数据到ta
}
while(ta==rr); // 循环比对按键,直到相等则退出循环.
keydata=key_tab(k); // key_tab()是个外部函数,确定键值的函数,键值附给keydata供对应的按键处理,keydata是个全局变量.
}