1、键盘的分类
· 编码式键盘
· 非编码式键盘
编码式键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值。(如:计算机键盘)
非编码式键盘:由软件编程来识别。(单片机中使用最多)
2、非编码式键盘
· 独立键盘
· 矩阵键盘
(1)独立键盘
原理:当按键被按下时,P3.4 / P3.7 将会与 GND 连通,即为低电平(0);
随手代码:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P1^0;
sbit dula=P2^6; //数码管段选信号
sbit wela=P2^7; //数码管位选信号
sbit key1=P3^4; //独立按键key1
uchar code table[]={ //数码管显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num;
void delay(uint z) //延时 (防抖)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
wela=1;
P0=0xfe; //打开低一数码管
wela=0;
P3=0xff;
while(1)
{
if(key1==0) //监听按键是否被按下
{
delay(5);//延时5ms (具体解释见本文尾)
if(key1==0)//再次确认按键是否被按下
{
d1=0;
num++;
if(num==10)
num=0;
}
while(!key1);//松手监测
delay(5);
while(!key1);//再次确认是否松手
}
else
d1=1;
dula=1;
P0=table[num];//数码管显示
dula=0;
}
}
(2)矩阵键盘
通常,矩阵式键盘 8 个引脚接在单片机的 P3.0 ~P3.7上
原理:(以下为第一行键盘,以此类推)
(1)将 P3 口赋值为 0xfe (1111,1110)
(2)定义一个变量 temp = P3, 通过 temp &= 0xf0,取其高四位,判断是否有键被按下
(3)重读 P3 口,判断是哪一个键被按下
随手代码:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}
uchar keyscan();
void display(uchar aa);
void main()
{
num = 17;
dula = 1;
P0 = 0;
dula = 0;
wela = 1;
P0 = 0xc0;
wela = 0;
while(1)
{
display(keyscan());
}
}
void display(uchar aa)//数码管显示
{
dula = 1;
P0 = table[ aa - 1 ];
dula = 0;
}
uchar keyscan()
{
P3 = 0xfe;
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)//防抖
{
delay(5);
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xee: num = 1;
break;
case 0xde: num = 2;
break;
case 0xbe: num = 3;
break;
case 0x7e: num = 4;
break;
}
while(temp != 0xf0)//松手监测
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3 = 0xfd;
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
delay(5);
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xed: num = 5;
break;
case 0xdd: num = 6;
break;
case 0xbd: num = 7;
break;
case 0x7d: num = 8;
break;
}
while(temp != 0xf0)
{
temp = P3;
temp = temp & 0xf0;
}
}
}
P3 = 0xfb;
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
delay(5);
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xeb: num = 9;
break;
case 0xdb: num = 10;
break;
case 0xbb: num = 11;
break;
case 0x7b: num = 12;
break;
}
while(temp != 0xf0)
{
temp = P3;
temp = temp & 0xf0;
}
}
- }
P3 = 0xf7;
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
delay(5);
temp = P3;
temp = temp & 0xf0;
while(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xe7: num = 13;
break;
case 0xd7: num = 14;
break;
case 0xb7: num = 15;
break;
case 0x77: num = 16;
break;
}
while(temp != 0xf0)
{
temp = P3;
temp = temp & 0xf0;
}
}
}
return num;
}
3、抖动现象
按键在闭合和断开时,触点会存在抖动现象
图 1 图 2
如图1,我们可以在 delay(5)后,重新读取,可消除抖动;
图2是硬件防抖