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、代码实现
• 独立按键
1 uchar Key_Scan_Alone() //独立键盘 2 { 3 uchar key = 0xff; 4 if(!(P3_0&&P3_1&&P3_2&&P3_3)) 5 { 6 delaykey(5); 7 if(!(P3_0&&P3_1&&P3_2&&P3_3)) 8 { 9 if(P3_3==0) key=4; 10 else if(P3_2==0) key=5; 11 else if(P3_1==0) key=6; 12 else if(P3_0==0) key=7; 13 while(!(P3_0&&P3_1&&P3_2&&P3_3)) 14 { 15 delaykey(5); 16 } 17 } 18 } 19 return key; 20 }
• 矩阵按键
1 uchar Key_Scan() //矩阵键盘 2 { 3 uchar key = 0XFF-4; 4 P3=0x0f;P4_2=0;P4_4=0; 5 if(P3!=0X0f) 6 { 7 delaykey(5); 8 if(P3!=0X0f) 9 { 10 P3=0x0f;P4_2=0;P4_4=0; 11 switch(P3) 12 { 13 case 0x07 : key=0; break; 14 case 0x0b : key=1; break; 15 case 0x0d : key=2; break; 16 case 0x0e : key=3; break; 17 } 18 P3=0xf0;P4_2=1;P4_4=1; 19 20 if(P4_4==0) key+=0; 21 else if(P4_2==0) key+=4; 22 else if(P3_5==0) key+=8; 23 else if(P3_4==0) key+=12; 24 25 while(P3_4==0||P3_5==0||P4_2==0||P4_4==0) 26 { 27 delaykey(5); 28 } 29 } 30 } 31 return key+4; 32 }