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;
}