当按键达到8个以上时,我们一般就不会选择用独立式了。而选用矩阵式键盘扫描方式。
CEPARK 51实验板的按键就是按照这种方式。6个口控制8个按键。
(按键响应结果:按下前对应行列输入从共“1”转为按下后的共“0”)
sunhm版主也写过这个方面的帖子。。大家可以去参考下。。它调用了其他的头文件。这里我就没用调用其他的头文件。
这里是链接http://bbs.cepark.com/viewthread.php?tid=713&fromuid=55&extra=page%3D1
呵呵。。。。
设计思想:
先将低四位置0,高四位置1,当有按键按下是高四位的P2.4或者P2.5一定有一个被拉为0.通过这个判断是不是有按键按下。
然后给P2口赋值为0xfe,也就是P2.0口为0,再来判断是那个键按下。如果没有按键按下就左移,判断P2.1,一直到P2.3判断完。如此循环下去就能找到是那个按键被按下。通过行号和列号我们得到键值。就可以转到相应的程序去操作了。
具体的程序如下:
/*******************
键盘扫描 本程序适用CEPARK 51实验板
作者:hnrain
时间:2008/12/29
********************/
#i nclude <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sfr LEDport=0x80;
void delay() //延时程序
{
uchar i,j;
for(i=50;i>0;i--)
for(j=200;j>0;j--);
}
uchar keyscan() //键盘扫描程序
{
uchar hangcode,liecode; //定义两个变量记录行列号。
P2=0xf0; //将P2口低四位置0,高四位置1.
if((P2&0xf0)!=0xf0) //判断是否有按键按下。有的话顺序执行。
{
delay(); //去抖动
if((P2&0xf0)!=0xf0) //再次判断是否有按键按下
{
hangcode=0xfe; //将P2.0口置0,其他位置1
while((hangcode&0x10)!=0) //这一句是低四位循环设置用,和下面的左移指令结合用,当移到P2.4为0时就为假。
{
P2=hangcode;
if((P2&0xf0)!=0xf0)
{
liecode=((P2&0xf0)|0x0f); //读取列是哪个键按下。
return ((~hangcode)+(~liecode)); //通过行号列号确定到底是哪个键按下。并返回键值
}
else hangcode=((hangcode<<1)|0x01); //这里是左移0x01的作用是,我们左移时系统补在后面的是0,不加这个就会读错
}
}
else return 0;
}
}
main()
{
uchar key;
while(1)
{
key=keyscan();
switch(key) //通过SWITCH语句执行相应操作。
{
case 0x11: LEDport=0xfe;break;
case 0x12: LEDport=0xef;break;
case 0x14: LEDport=0xfb;break;
case 0x18: LEDport=0xf7;break;
case 0x21: LEDport=0xfd;break;
case 0x22: LEDport=0xdf;break;
case 0x24: LEDport=0xbf;break;
case 0x28: LEDport=0x7f;break;
}
}
}
这里是用点亮LED来判断,我们也可以用它在数码管上显示我们想要的数据。。。大家可以自己写写。。!!!
关键是理解这种编程思想。。。。