矩阵键盘是一种常用于电子设备中的输入设备,其原理是利用行和列的交叉点来识别按键输入。矩阵键盘通常由多个按键排列成行和列的形式组成,通过按下某个按键可以在对应的行和列交叉点上产生电路连接。
在矩阵键盘中,每个按键都被安排在一个矩阵的交叉点上,按下某个按键会使得对应行和列之间的电路连接。因此,通过扫描矩阵键盘的每一行和列,可以检测到哪个按键被按下。这种扫描过程可以通过微处理器或控制器来完成,一旦检测到按键输入,就可以进行相应的操作或数据采集。
总的来说,矩阵键盘的原理是基于行和列的交叉点上的电路连接来识别按键输入,通过扫描矩阵键盘的行和列可以检测到按键的输入,从而实现数据输入和控制操作。
按钮的工作原理
51单片机上矩阵键盘的原理图
矩阵键盘使用的是并行的IO口,独立键盘使用的是单个的IO口
读取通过的电压:当按键按下的IO口会的电平会被拉低,当检测到电压为0V的时候判断键盘被按下,当我们的手松开的时候检测键盘没有按下电平回到5V。
按键的抖动问题:需要在段选的后面加延时
eg1:按单片机第一个按键实现数字自加效果,按第二个按键的时候实现数字自减效果
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char
sbit beep = P2^3;
sbit wei = P2^7; // 位选择器
sbit duan = P2^6; // 段选择器
sbit key_S2 = P3^0; // P30的IO口独立按键S2
sbit key_S3 = P3^1; // 第二个独立按键
uchar number;
//数组的定义
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00 //自定义
};
// 功能函数
void diaplay(uchar i){
uchar bai,shi,ge;
// 计算个位10位和百位
bai = i / 100; // 211 /100 = 2
shi = i % 100 / 10; // 211 % 100 / 10 = 1;
ge = i % 10; // 211 % 10
}
void main(){
// 打开位锁存器
wei = 1;
P0 = 0xFE; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
while(1){
if(key_S2 == 0){
Delay(20); // 按键抖动的消除
if(key_S2 == 0){
number++;
if(number == 10){
number = 0;
duan = 1;
P0 = leddata[number];
duan = 0;
}
// 添加松手检测
while(!key_S2){
}
}
}
// 按独立按键相减的代码
if(key_S3 == 0){
Delay(20); // 按键抖动的消除
if(key_S3 == 0){
if(number > 0){
number--;
}
while(!key_S3);
}
}
//松手之后刷新显示
duan = 1;
P0 = leddata[number];
duan = 0; // 锁存段选数据
}
}
矩阵键盘的识别
矩阵键盘与独立键盘的识别和扫描
矩阵键盘二进制取值原理图
eg2:矩阵键盘扫描的实现
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char
sbit wei = P2^7; // 位选择器
sbit duan = P2^6; // 段选择器
uchar number;
uchar KeyValue;
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
// 键盘的列扫描
void ketScan(){
/*
4*4键盘的扫描
*/
P3 = 0xF0;
if(P3 != 0xF0){ // 判断键盘是否被按下
Delay(10); // 软件消除抖动
if(P3 != 0xF0){ // 列扫描
switch(P3){
case 0xE0:
KeyValue = 0; // 表示的是第一列被按下
break;
case 0xD0:
KeyValue = 1; // 表示的是第二例被按下
break;
case 0xB0:
KeyValue = 2; // 表示的是第三列被按下
break;
case 0x70:
KeyValue = 3; // 表示的是第四列被按下
break;
}
P3 = 0X0f;// 行扫描
switch(P3){
case 0x0e:
KeyValue = KeyValue; // 表示的是第一行被按下
break;
case 0x0D:
KeyValue = KeyValue + 4; // 表示的是第二行被按下
break;
case 0x0b:
KeyValue = KeyValue + 8; // 表示的是第三行被按下
break;
case 0x07:
KeyValue = KeyValue + 12; // 表示的是第四行被按下
break;
}
// 松手检测
while(P3 != 0X0f){
}
}
}
// 独立按键键盘的扫描
P3 = 0XFF;
if(P3 != 0xff){
Delay(10); // 软件消抖
switch(P3){
case 0xfe:
KeyValue = 16; // 表示的是S2被按下
break;
case 0xfD:
KeyValue = 17; // 表示的是S3被按下
break;
case 0xfb:
KeyValue = 18; // 表示的是S4被按下
break;
case 0xf7:
KeyValue = 19; // 表示的是S5被按下
break;
}
while(P3 != 0xff); // 默认会回到最后的值
}
}
void main(){
// 打开位锁存器
wei = 1;
// 高电平的16进制位0x06
P0 = 0xFE;
//关闭位锁存器
wei = 0;
while(1){
ketScan(); // 调用键盘扫描函数
duan = 1;
P0 = leddata[KeyValue]; // 显示按键的值
duan = 0;
}
}