1、原理
注:其中S4、S5、S6、S7可做独立按键使用。
独立按键与矩阵按键的切换条件: ◊ 独立按键——将CON3中2、3段短接 。
◊ 独立按键——将CON3中1、2段短接 。
(1)独立按键使用条件下,给定P30、P31、P32、P33端高电位,按键另一侧接地,按键按下时电路接通,会检测到P30、P31、P32、P33端电位为低,通过检测P3口前四位的电位高低,可以检测到S4、S5、S6、S7按键是否按下,这就是独立按键使用的原理。
(2)矩阵按键使用条件下,由P30、P31、P32、P33确定行,P34、P35、P36、P37确定列。举例:按下按键S10,给定P3=0x0f,检测行,P31变为低电位,由此确定为第二行;再给定P3=0xf0,检测列,P36变为低电位,由此确定为第二列,这样搞清楚了行和列,就可以成功确定按下的是哪一个按键。
• 但是要注意,由于板子的底层硬件原理,再这里P36、P37要使用P42、P44代替。而在头文件"regx52.h"中并没有定义P4端口,因此我们要预先定义P4端口,以便使用。
sfr P4 = 0XC0;
sbit P4_2 = P4^2;
sbit P4_4 = P4^4;
2、代码实现
• 独立按键
uchar Key_Scan_Alone() //独立键盘
{
uchar key = 0xff;
if(!(P3_0&&P3_1&&P3_2&&P3_3))
{
delaykey(5);
if(!(P3_0&&P3_1&&P3_2&&P3_3))
{
if(P3_3==0) key=4;
else if(P3_2==0) key=5;
else if(P3_1==0) key=6;
else if(P3_0==0) key=7;
while(!(P3_0&&P3_1&&P3_2&&P3_3))
{
delaykey(5);
}
}
}
return key;
}
• 矩阵按键
uchar Key_Scan() //矩阵键盘
{
uchar key = 0XFF-4;
P3=0x0f;P4_2=0;P4_4=0;
if(P3!=0X0f)
{
delaykey(5);
if(P3!=0X0f)
{
P3=0x0f;P4_2=0;P4_4=0;
switch(P3)
{
case 0x07 : key=0; break;
case 0x0b : key=1; break;
case 0x0d : key=2; break;
case 0x0e : key=3; break;
}
P3=0xf0;P4_2=1;P4_4=1;
if(P4_4==0) key+=0;
else if(P4_2==0) key+=4;
else if(P3_5==0) key+=8;
else if(P3_4==0) key+=12;
while(P3_4==0||P3_5==0||P4_2==0||P4_4==0)
{
delaykey(5);
}
}
}
return key+4;
}