矩阵键盘的电路结构图
第一行的行控制线接到p17,第二行的行控制线接到p16,第三行的行控制线接到p15,第4行的行控制线接到p14
第一列的列控制线接到p13,第二列的列控制线接到p12,第三列的列控制线接到p11,第四列的列控制线接到p10
矩阵键盘的原理和独立按键类似,另外我们可以把矩阵键盘的任意一行或一列作为一个独立键盘使用,假如我们把第一行作为独立键盘,那么我们只需要让P17输出高电平,其余7个io口输出低电平即可,假如我们按下了s1,那么p13的电平就会被拉低,变为低电平,所以我们可以通过查找低4位里哪一位为低电平就可以知道哪个按键按下了
unsigned char keyscan(){
unsigned char key,Row,Col;
P1=0x0f;
if(P1!=0x0f){
delay(10);
if(P1!=0x0f){
Row=P1&0x0f;
P1=0xf0;
Col=P1&0xf0;
}
while((P1&0xf0)!=0xf0);//判断键是否抬起
}
switch(Row+Col){
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
return key;
}
这个代码为矩阵键盘按键的数值
MatrixKey.h:
#ifndef __MatrixKey_H__
#define __MatrixKey_H__
int MatrixKey();
#endif
MareixKey.c:
#include<regx52.h>
void Delay(int x)
{
while(x!=0) {x--;}
}
int MatrixKey()
{
int keynumber=0;
P1=0xFF; //initialize:1111 1111
P1_3=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=1;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=5;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=9;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=13;}
P1=0xFF; //initialize:1111 1111
P1_2=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=2;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=6;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=10;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=14;}
P1=0xFF; //initialize:1111 1111
P1_1=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=3;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=7;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=11;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=15;}
P1=0xFF; //initialize:1111 1111
P1_0=0;
if(P1_7==0) {Delay(10000); while(P1_7==0); Delay(100); keynumber=4;}
if(P1_6==0) {Delay(10000); while(P1_6==0); Delay(100); keynumber=8;}
if(P1_5==0) {Delay(10000); while(P1_5==0); Delay(100); keynumber=12;}
if(P1_4==0) {Delay(10000); while(P1_4==0); Delay(100); keynumber=16;}
return keynumber;
}
main
#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"
int number;
void main()
{
LCD_Init();
while(1)
{
number=MatrixKey();
if (number!=0)
{
LCD_ShowNum(1,1,number,3);
}
}
}
将该代码输入时即可对单片机的矩阵键盘进行控制
效果如下