1、按键管脚采用下拉的方式,当按键触发产生低电平,经过一个延时消抖返回键值,其中key_state用于检测按键是否松手

2、矩阵按键采用行(列)扫描结束后再列(行)扫描的方式判断是哪颗按键暗下;具体分析如下,首先拉低某行,然后采用列扫描确定该行哪一列被拉低,就能确定哪一个按键按下,剩余三行重复以上步骤即可实现矩阵按键

3、代码展示如下:

#include <stc15.h>

#include <math.h>

#define  KEY1  P30

#define  KEY2  P31

#define  KEY3  P32

#define  KEY4  P33

#define  BEEP  P06

#define  RELAY P04

#define  Key1Press 1

#define  Key2Press 2

#define  Key3Press 3

#define  Key4Press 4

#define  Key5Press 5

#define  Key6Press 6

#define  Key7Press 7

#define  Key8Press 8

#define  Key9Press 9

#define  Key10Press 10

#define  Key11Press 11

#define  Key12Press 12

#define  Key13Press 13

#define  Key14Press 14

#define  Key15Press 15

#define  Key16Press 16

//独立按键函数

uchar ScanKey(void)

{

uchar key_state=1;

if((KEY1==0|KEY2==0|KEY3==0|KEY4==0)&&key_state==1)

{

 delay_ms(10);

 key_state = 0;

 if(KEY1==0)return Key1Press;

 if(KEY2==0)return Key2Press;

 if(KEY3==0)return Key3Press;

 if(KEY4==0)return Key4Press;

}

else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)

 key_state=1;

return 0;

}

//矩阵按键函数(带松手检测)

//keystate:返回键值

uchar MatrixKey(void)

{

uchar keystate = 0;

P30=1;P31=1;P32=1;P33=1;

P44=0;P35=1;P42=1;P34=1;

if(P30==0){delay_ms(5);while(P30==0);delay_ms(5);keystate = Key1Press;}

if(P31==0){delay_ms(5);while(P31==0);delay_ms(5);keystate = Key5Press;}

if(P32==0){delay_ms(5);while(P32==0);delay_ms(5);keystate = Key9Press;}

if(P33==0){delay_ms(5);while(P33==0);delay_ms(5);keystate = Key13Press;}

 

P30=1;P31=1;P32=1;P33=1;

P42=0;P34=1;P35=1;P44=1;

if(P30==0){delay_ms(5);while(P30==0);delay_ms(5);keystate = Key2Press;}

if(P31==0){delay_ms(5);while(P31==0);delay_ms(5);keystate = Key6Press;}

if(P32==0){delay_ms(5);while(P32==0);delay_ms(5);keystate = Key10Press;}

if(P33==0){delay_ms(5);while(P33==0);delay_ms(5);keystate = Key14Press;}

 

P30=1;P31=1;P32=1;P33=1;

P35=0;P42=1;P34=1;P44=1;

if(P30==0){delay_ms(5);while(P30==0);delay_ms(5);keystate = Key3Press;}

if(P31==0){delay_ms(5);while(P31==0);delay_ms(5);keystate = Key7Press;}

if(P32==0){delay_ms(5);while(P32==0);delay_ms(5);keystate = Key11Press;}

if(P33==0){delay_ms(5);while(P33==0);delay_ms(5);keystate = Key15Press;}

 

P30=1;P31=1;P32=1;P33=1;

P34=0;P35=1;P42=1;P44=1;

if(P30==0){delay_ms(5);while(P30==0);delay_ms(5);keystate = Key4Press;}

if(P31==0){delay_ms(5);while(P31==0);delay_ms(5);keystate = Key8Press;}

if(P32==0){delay_ms(5);while(P32==0);delay_ms(5);keystate = Key12Press;}

if(P33==0){delay_ms(5);while(P33==0);delay_ms(5);keystate = Key16Press;}


return keystate;  

}