本章我们主要是写矩阵键盘的内容,矩阵键盘的原理和独立按键的按键原理基本是类似的,只是关于整个的原理还是要有些介绍,本章我们通过矩阵按键的某个按键按下,然后在数码管上输出对应的按键值。
1.关于按键
可以看前面按键的内容。
2. 硬件
首先我的矩阵键盘如下所示,我们首先是把P1接口分为了两组,P0到P3分为了一组,P4到盘分为了一组。
我们可以首先是给P1^0一个低电平,然后给P1^1到P1^7高电平,然后我们检测P1^4到P1^7的电平状态,如果有某一个按键被按下了,那么就可以检测到P1^4到P1^7上某一个GPIO引脚变为了低电平,我们就可以检测到这个按键被按下啦。
3软件
这一章主要是用了之前数码管和这章矩阵按键的内容,程序如下:
#include "reg52.h"
#include "key.h"
extern int key_val;
void key_scan(){
int temp;
P1 = 0xfe;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
delay(10);
P1= 0xfe;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
switch(temp){
case 0x70:
key_val = 3;
break;
case 0xb0:
key_val = 7;
break;
case 0xd0:
key_val = 11;
break;
case 0xe0:
key_val = 15;
break;
}
}
while(temp != 0xf0){
temp = P1;
temp &= 0xf0;
}
}
P1 = 0xfd;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
delay(10);
P1 = 0xfd;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
switch(temp){
case 0x70:
key_val = 2;
break;
case 0xb0:
key_val = 6;
break;
case 0xd0:
key_val = 10;
break;
case 0xe0:
key_val = 14;
break;
}
}
while(temp != 0xf0){
temp = P1;
temp &= 0xf0;
}
}
P1 = 0xfb;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
delay(10);
P1 = 0xfb;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
switch(temp){
case 0x70:
key_val = 1;
break;
case 0xb0:
key_val = 5;
break;
case 0xd0:
key_val = 9;
break;
case 0xe0:
key_val = 13;
break;
}
}
while(temp != 0xf0){
temp = P1;
temp &= 0xf0;
}
}
P1 = 0xf7;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
delay(10);
P1 = 0xf7;
temp = P1;
temp &= 0xf0;
if(temp != 0xf0){
switch(temp){
case 0x70:
key_val = 0;
break;
case 0xb0:
key_val = 4;
break;
case 0xd0:
key_val = 8;
break;
case 0xe0:
key_val = 12;
break;
}
}
while(temp != 0xf0){
temp = P1;
temp &= 0xf0;
}
}
}
调用的主函数内容如下:
#include "reg52.h"
#include "key.h"
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
int key_val = 0;
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(int xms){
int i;
int j;
for(i = 0;i < xms;i++){
for(j = 0; j < 100;j++){
;
}
}
}
void main(){
LSA = 0; LSB = 0;LSC = 0;
while(1){
key_scan();
P0 = smgduan[key_val];
delay(10);
}
}
头文件的内容如下:
#ifndef _KEY_H_
#define _KEY_H_
extern int key_val;
void key_scan();
void delay(int xms);
#endif