如下图,先在p3口输出0xfe,再读取p3口的电平,如果没有按键按下,temp & 0xf0还是0xf0,如果又第一个键按下,temp & 0xf0还是0xee,其他按键由此类推可得。
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3;
sbit dula = P2^6;
sbit wela = P2^7;
unsigned char i = 100;
unsigned char j, k, temp, key;
void delay(unsigned char i)
{
for(j = i; j > 0; j--)
for(k=125; k>0; k--);
}
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
display(unsigned char num)
{
P0 = table[num];
dula = 1;
dula = 0;
P0 = 0xc0;
wela = 1;
wela = 0;
}
void main()
{
dula = 0;
wela = 0;
while(1)
{
//扫描第一行键盘是否按下
P3 = 0xfe; // 1111 1110
temp = P3;
temp = temp & 0xf0; // 1111 0000
if(temp != 0xf0)
{
delay(10);
if(temp != 0xf0)
{
temp = P3;
switch(temp)
{
case 0xee: //1110 1110
key = 0;
break;
case 0xde: //1101 1110
key = 1;
break;
case 0xbe: //1011 1110
key = 2;
break;
case 0x7e: //0111 1110
key = 3;
break;
}
while(temp != 0xf0)
{
temp = P3;
temp = temp&0xf0;
beep = 0;
}
beep = 1;
display(key);
P1=0xfe;
}
}
//扫描第二行键盘是否按下
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfc;
}
}
//扫描第三行键盘是否按下
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf8;
}
}
//扫描第四行键盘是否按下
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf0;
}
}
}
}