实验板键盘和数码管接法:
/*
c51单片机 4×4矩阵键盘 检测代码 原创
*/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define keyCtrl P1 //键盘接的控制口
uchar led00[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//共
阳 无小数点
//uchar key;//按键值
void delay(uint ms);
uchar waitingKeyL1();
uchar waitingKeyL2();
uchar waitingKeyL3();
uchar waitingKeyL4();
uchar waitingKeyAll();
void main()
{
uchar keyVal=15; //让LED不显示
while(1)
{
keyVal=waitingKeyAll(); //按键的返回值 0~15
if(keyVal != 255)
{
P2=0x7f;
P0=led00[keyVal];
}
}
}
void delay(uint ms)
{
uint i;
for(;ms-- > 0;)
for(i=125;i-- > 0;);
}
uchar waitingKeyAll() //检测所有键盘动作
{
uchar v1,v2,v3,v4;
v1=waitingKeyL1();
v2=waitingKeyL2();
v3=waitingKeyL3();
v4=waitingKeyL4();
if(v1!=255)return v1;
if(v2!=255)return v2;
if(v3!=255)return v3;
if(v4!=255)return v4;
return 255; //无按键动作 返回255
}
/*------------检测第一排键盘动作-------------*/
uchar waitingKeyL1() //检测第一排键盘动作
{
uchar keyVal=255; //键值 255表示无按键动作
uchar temp;
keyCtrl=0xfe;
temp=keyCtrl;
temp=temp & 0xf0;
if(temp != 0xf0)
{
delay(15);
temp=temp>>4;
switch(temp)
{
case 0xe:
keyVal=0;
break;
case 0xd:
keyVal=1;
break;
case 0xb:
keyVal=2;
break;
case 0x7:
keyVal=3;
break;
}
//释放按键判断
while(temp != 0xf0)
{
temp=keyCtrl & 0xf0;
}
}//end if
return keyVal;
}
/*------------检测第二排键盘动作-------------*/
uchar waitingKeyL2() //检测第二排键盘动作
{
uchar keyVal=255; //键值 255表示无按键动作
uchar temp;
keyCtrl=0xfd;
temp=keyCtrl;
temp=temp & 0xf0;
if(temp != 0xf0)
{
delay(15);
temp=temp>>4;
switch(temp)
{
case 0xe:
keyVal=4;
break;
case 0xd:
keyVal=5;
break;
case 0xb:
keyVal=6;
break;
case 0x7:
keyVal=7;
break;
}
//释放按键判断
while(temp != 0xf0)
{
temp=keyCtrl & 0xf0;
}
}//end if
return keyVal;
}
/*------------检测第三排键盘动作-------------*/
uchar waitingKeyL3() //检测第三排键盘动作
{
uchar keyVal=255; //键值 255表示无按键动作
uchar temp;
keyCtrl=0xfb;
temp=keyCtrl;
temp=temp & 0xf0;
if(temp != 0xf0)
{
delay(15);
temp=temp>>4;
switch(temp)
{
case 0xe:
keyVal=8;
break;
case 0xd:
keyVal=9;
break;
case 0xb:
keyVal=10;
break;
case 0x7:
keyVal=11;
break;
}
//释放按键判断
while(temp != 0xf0)
{
temp=keyCtrl & 0xf0;
}
}//end if
return keyVal;
}
/*------------检测第四排键盘动作-------------*/
uchar waitingKeyL4() //检测第四排键盘动作
{
uchar keyVal=255; //键值 255表示无按键动作
uchar temp;
keyCtrl=0xf7;
temp=keyCtrl;
temp=temp & 0xf0;
if(temp != 0xf0)
{
delay(15);
temp=temp>>4;
switch(temp)
{
case 0xe:
keyVal=12;
break;
case 0xd:
keyVal=13;
break;
case 0xb:
keyVal=14;
break;
case 0x7:
keyVal=15;
break;
}
//释放按键判断
while(temp != 0xf0)
{
temp=keyCtrl & 0xf0;
}
}//end if
return keyVal;
}