消抖
if(key1==0){
delay(10);//按下消抖
if(key1==0){
d1=0;
num++;
if(num==10)
num=0;
}
while(!key1);//判断是否松开按键
delay(10);//松开消抖
while(!key1);
}
矩阵键盘的检测
比如4*4的矩阵键盘
检测时要一行一行的检测。4+4需要用到8个二进制位,正好2个16进制位,列在前行在后。
检测要用到一个循环,由于51单片机上电后所有接口默认高电平,而键盘按下后为低电平,循环中按顺序1、2、3、4检测行。
例如检测第一行时,先将P3赋值为0xFE即第一行为0。然后读取此时键盘状态(即P3的值)并将值与0xF0相与,若结果仍为0xF0,则表示该行无键盘按下,继续下一行的检测。
检测第一行例程
while(1){
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
switch(temp){
case 0xe0:num=1;
break;
case 0xd0:num=2;
break;
case 0xb0:num=3;
break;
case 0x70:num=4;
break;
}
dula=1;
P0=table[num-1];
dula=0;
}
}
}
检测4*4矩阵键盘例程
某键按下后显示对应数字。
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
uchar num=0,temp;
uint num1;
void delay(uint z);
uint keyscan();
void main(){
dula=1;
P0=0;
dula=0;
wela=1;
P0=0xc0;
wela=0;
while(1){
num1=keyscan();
dula=1;
P0=table[num1-1];
dula=0;
}
}
void delay(uint z){
uint x,y;
for(x=z;x>0;x--){
for(y=110;y>0;y--);
}
}
uint keyscan(){
//第一行
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
delay(5);
temp=P3;
temp=temp&0xf0;
if(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;
}
}
}
//第二行
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
delay(5);
temp=P3;
temp=temp&0xf0;
if(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;
}
}
}
//第三行
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
delay(5);
temp=P3;
temp=temp&0xf0;
if(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;
}
}
}
//第四行
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
delay(5);
temp=P3;
temp=temp&0xf0;
if(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;
}
}
}
}