本章我们主要是写矩阵键盘的内容,矩阵键盘的原理和独立按键的按键原理基本是类似的,只是关于整个的原理还是要有些介绍,本章我们通过矩阵按键的某个按键按下,然后在数码管上输出对应的按键值。
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