一、矩阵按键模块原理图

二、源文件
1、MatrixKey.c文件
#include <REGX52.H>
#include "Delay.h"
/**
* 函数功能:读取矩阵键盘对应的按键键码
* 输入:无
* 输出:按下按键的键码值(即KeyNumber)
如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
**/
unsigned char MatrixKey(void)
{
unsigned char KeyNumber = 0;
P1 = 0xFF;
P1_3 = 0;
if(P1_7 == 0){Delay(20); while(P1_7 == 0); Delay(20); KeyNumber = 1;}
if(P1_6 == 0){Delay(20); while(P1_6 == 0); Delay(20); KeyNumber = 5;}
if(P1_5 == 0){Delay(20); while(P1_5 == 0); Delay(20); KeyNumber = 9;}
if(P1_4 == 0){Delay(20); while(P1_4 == 0); Delay(20); KeyNumber = 13;}
P1 = 0xFF;
P1_2 = 0;
if(P1_7 == 0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6 == 0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5 == 0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4 == 0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
2、MatrixKey.h文件
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif