先上电路图
#include <REGX52.H>
#include "Delay.h";
unsigned char MatrixKey(){
unsigned char KeyNumber=0;
// 第一列P3列
P1=0xFF;
P1_3=0;
// 检查松手,如果一直是按下的状态就一直进行循环
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber=1;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber=5;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber=9;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber=13;}
// 第二列P2列
P1=0xFF;
P1_2=0;
// 检查松手,如果一直是按下的状态就一直进行循环
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber=2;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber=6;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber=10;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber=14;}
// 第三列P1列
P1=0xFF;
P1_1=0;
// 检查松手,如果一直是按下的状态就一直进行循环
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber=3;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber=7;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber=11;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber=15;}
// 第四列P0列
P1=0xFF;
P1_0=0;
// 检查松手,如果一直是按下的状态就一直进行循环
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber=4;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber=8;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber=12;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber=16;}
return KeyNumber;
}
按列进行判断,一行一行进行判断
P17-P14接所有LED灯的阳极,P13-P10接所有LED灯的阴级。
按钮按下的状态为0,判断那个按钮的状态为0,也就是按下的状态,如果是零的话,就把事先定义好的数字给返回出去。
在外面main.c主函数里面使用
#include "MatrixKey.h"
// while(1)为死循环也可以实现实时监听的效果
while(1){
// 将矩阵按钮按下返回的值,接收在KeyNum中
KeyNum=MatrixKey();
// 判断KeyNum中是否有返回值,如果是零(false)也就是没有返回值,如果有返回值则是true
if(KeyNum){
// 通过LCD_ShowNum(第几行,从第几个开始,显示内容,显示数字数量)函数来进行在LCD屏显示
LCD_ShowNum(2,1,KeyNum,2);
}
}