当独立键盘连接到单片机时,每个键都需要单片机的I / O端口。如果一个单片机系统需要更多的键,则如果使用独立的键,它将占用太多的I / O端口资源。单片机系统中的I / O端口资源通常很宝贵。为了在使用多个键时节省I / O端口线,我们引入了矩阵键盘。
我们以4X4矩阵键盘为例来说明其工作原理和检测方法。将16个按钮排列为4行4列。第一行将每个按钮的一端连接在一起以形成一行,而第一列将每个按钮的另一端连接在一起以形成一行,因此共有4行。 4列中有8根电线。我们将这8条线连接到在“和”关系之后反射到导线上。”这两个句子构成了矩阵键盘扫描的整体。要很好地理解,如果您无法理解,只需记住即可。
现在,我将详细描述矩阵键盘扫描的原理和步骤:

矩阵键盘扫描的原理
方法1:
逐行扫描:我们可以通过依次输出高四位中的低电平来逐行扫描矩阵键盘。当低四位接收的数据不是全部为1时,表示存在按键,然后通过接收到的接收数据的哪一位为0来确定按下了哪个按钮。

方法2:
行和列扫描:我们可以通过高四位输出低电平,通过低四位输出高电平。当接收到的数据的低四位不都为高时,表示按下了按钮,然后根据接收到的数据值,判断哪一列按下了按钮,反之亦然,高四位输出为高等级。低四位数字输出低电平,然后根据高四位数字的接收值,判断哪一行有按钮被按下,从而可以确定哪个按钮被按下。
接下来,给出一个矩阵键盘程序的示例。本示例使用两组IO端口P 0、 P1。 P1用于检测矩阵键盘中是否有按下的键,P0用于驱动静态数字管的显示。
以下是示例程序:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define GPIO_DIG P0
#define GPIO_KEY P1
u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};//静态数码管码值
u8 KeyColValue;
u8 KeyLineValue;
void delay(u16 i) //延时函数
{
while(i --);
}
void KeyDown() //键盘按键扫描函数
{
char a;
GPIO_KEY = 0x0f;
if(GPIO_KEY != 0x0f)//检测4行中哪一行按键是否按下
{
delay(1000); //延时消抖
if(GPIO_KEY != 0x0f) //再次检测4行中哪一行按键是否按下
{
switch(GPIO_KEY) //根据IO的值来确定哪一行按键按下
{
case(0x07): KeyColValue = 0; break;
case(0x0b): KeyColValue = 1; break;
case(0x0d): KeyColValue = 2; break;
case(0x0e): KeyColValue = 3; break;
}
}
}
GPIO_KEY = 0xf0;
if(GPIO_KEY != 0xf0) //检测4行中哪一列按键是否按下
{
delay(1000); //延时消抖
if(GPIO_KEY != 0xf0) //再次检测4行中哪一列按键是否按下
{
switch(GPIO_KEY) //根据IO的值来确定哪一列按键按下
{
case(0x70): KeyLineValue = 0; break;
case(0xb0): KeyLineValue = 1; break;
case(0xd0): KeyLineValue = 2; break;
case(0xe0): KeyLineValue = 3; break;
}
}
while((a < 50) && (GPIO_KEY != 0xf0)) //延时,确保没有按键再按下
{
delay(1000);
a ++;
}
}
}
void main()
{
while(1)
{
KeyDown();//检测按键是否按下
GPIO_DIG = ~smgduan[KeyLineValue*4 + KeyColValue];//根据按键的行列值,静态数码管显示相应的值
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-357419-1.html
靠贴牌
然后是回扣