矩阵键盘原理图如图
键盘原理图,通过跳线帽J5选择模式
J5的2,3相连的时候为独立键盘模式,1,2相连的时候为矩阵键盘模式
PS:上图为AIP15F2K61S2 为芯片,对于STC89C52 ,P42和P44变为P36和P37即可
键盘对应P3^0,P3^1,P3^2,P3^3,引脚,按键按下时,相应引脚会变为低电平。
按键状态检测及消除抖动代码如下:
#include "reg52.h"
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
void delay(unsigned char t)
{
while(t--);
}
unsigned char pp = 0 ;
void key(unsigned char i)
{
if (S7 == 0)
{
delay(100);
if(S7 == 0)
{
if (pp == 0)
{
L1 = 0;
pp = 1;
}
else if (pp == 1)
{
L1 = 1;
pp = 0;
}
while(S7 == 0);
}
}
}
按键检测使用双if( )检测,使用delay(100)消抖,
使用while( )检测按键是否被松开
矩阵键盘通过挨个扫描来达到确认按键位置的目的
该代码可以使数码管显示对应矩阵键盘按键的位置,初始化为“00”,第一个按键可以使数码管上的数字-1,
#include "reg52.h"
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
unsigned char pp;
unsigned char code io[10] =
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void HC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void delay(unsigned int t)
{
while(t--);
}
void smg()
{
HC573(6);
P0 = 0x01;
HC573(7);
P0 = io[pp/10];
delay(500);
HC573(6);
P0 = 0x01 << 1 ;
HC573(7);
P0 = io[pp%10];
delay(500);
}
void key()
{
R1 = 0;
R2 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
pp = pp-1;
}
else if (C2 == 0)
{
while(C2 == 0);
pp = 2;
}
else if (C3 == 0)
{
while(C3 == 0);
pp = 3;
}
else if (C4 == 0)
{
while(C4 == 0);
pp = 4;
}
R2 = 0;
R1 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
pp = 5;
}
else if (C2 == 0)
{
while(C2 == 0);
pp = 6;
}
else if (C3 == 0)
{
while(C3 == 0);
pp = 7;
}
else if (C4 == 0)
{
while(C4 == 0);
pp = 8;
}
R3 = 0;
R1 = R2 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
pp = 9;
}
else if (C2 == 0)
{
while(C2 == 0);
pp = 10;
}
else if (C3 == 0)
{
while(C3 == 0);
pp = 11;
}
else if (C4 == 0)
{
while(C4 == 0);
pp = 12;
}
R4 = 0;
R1 = R2 = R3 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(C1 == 0);
pp = 13;
}
else if (C2 == 0)
{
while(C2 == 0);
pp = 14;
}
else if (C3 == 0)
{
while(C3 == 0);
pp = 15;
}
else if (C4 == 0)
{
while(C4 == 0);
pp = 16;
}
}
void main()
{
while(1)
{
key();
smg();
}
}