版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hu_junhua/article/details/79221450
1.原理图
直接上代码:
#define MKEYPORT P0
unsigned char Mkeyscan(void)
{
unsigned char temp = 0;
MKEYPORT = 0xf0; //四行全部开启扫描
if(MKEYPORT != 0xf0) //说明有按键按下
{
MKEYPORT = 0xfe; //第一行扫描
if(MKEYPORT != 0xfe)
{
delay_ms(10); //消抖
if(MKEYPORT != 0xfe)
{
temp = MKEYPORT;
}
}
MKEYPORT = 0xfd; //第二行扫描
if(MKEYPORT != 0xfd)
{
delay_ms(10); //消抖
if(MKEYPORT != 0xfd)
{
temp = MKEYPORT;
}
}
MKEYPORT = 0xfb; //第三行扫描
if(MKEYPORT != 0xfb)
{
delay_ms(10);//消抖
if(MKEYPORT != 0xfb)
{
temp = MKEYPORT;
}
}
MKEYPORT = 0xf7; //第四行扫描
if(MKEYPORT != 0xf7)
{
delay_ms(10);//消抖
if(MKEYPORT != 0xf7)
{
temp = MKEYPORT;
}
}
}
else//没有按键按下
{
temp = 0xff;
}
return temp;
}
unsigned char Mkey_Proc(void)
{
unsigned char Mkeyvalue = 0x99;
switch(Mkeyscan())
{
case 0x7e:
Mkeyvalue = 1;
break;
case 0xbe:
Mkeyvalue = 2;
break;
case 0xde:
Mkeyvalue = 3;
break;
case 0xee:
Mkeyvalue = 4;
break;
case 0x7d:
Mkeyvalue = 5;
break;
case 0xbd:
Mkeyvalue = 6;
break;
case 0xdd:
Mkeyvalue = 7;
break;
case 0xed:
Mkeyvalue = 8;
break;
case 0x7b:
Mkeyvalue = 9;
break;
case 0xbb:
Mkeyvalue = 10;
break;
case 0xdb:
Mkeyvalue = 11;
break;
case 0xeb:
Mkeyvalue = 12;
break;
case 0x77:
Mkeyvalue = 13;
break;
case 0xb7:
Mkeyvalue = 14;
break;
case 0xd7:
Mkeyvalue = 15;
break;
case 0xe7:
Mkeyvalue = 16;
break;
default :
Mkeyvalue = 0x99;
}
return Mkeyvalue;
}