C语言程序清单:
#include<reg52.h>
#include"intrins.h"
unsigned char key() //有键按下返回键值0~15,无键按下返回0xff
{ unsigned char row,col,scan,k=0xff; //定义变量行row、列col、扫描值scan、返回值k
P1=0xf0;
if(P1==0xf0)
return k; //无键按下,返回0xff
delay20ms(); //延时去抖
if(P1==0xf0)
return k; //抖动引起,返回0xff
scan=0xfe; //准备行扫描值
for(row=0; row<4; row++) //逐行扫描
{ P1=scan; //扫描值送P1
col=P1&0xf0; //读取P1口,只取高4位的列值
if(col!=0xf0) //列线不全为1,该行有键按下
break; //跳出循环,再进一步找到按键所在的列
scan=_crol_(scan,1); //扫描值循环左移一位
}
if(row>3)
return k; //4行均无按下的键返回0xff
k=row*4; //行首键值给k
for(row=0; row<4; row++) //查找按下键所在的列
{if(col&0x10==0) //判定列值是否为0
break; //列值为0,则找到了按下键所在的列
else
{col=col>>1; //列值右移一位
k++; //键值加1
}
}
P1=0xf0;
while(P1!=0xf0); //等待按键释放
return k; //返回键值
}