其他分享
首页 > 其他分享> > 【嵌入式模块】矩阵键盘

【嵌入式模块】矩阵键盘

作者:互联网

前言

  交互式一直是嵌入式中非常重要的一个部分,而按键又是最为常用的交互式器件,这里总结一下最为常用的矩阵键盘的使用方法。

认识矩阵键盘

  一般来说,常见的按键有两种,一种是独立按键,即一个单独的按键一边连接到单片机的管脚上,另一边连接一个上拉或下拉,其电路图如下图所示:
在这里插入图片描述
这样,在按键按下时才会产生上升沿和下降沿的信号。
  然而这样的电路意味着每一个开关都需要占有一个输入端口,那有没有用少一点的端口来控制多一点的按键呢?有,那就是矩阵键盘
  所谓矩阵键盘,就是键盘组成n行m列的矩阵形式,每个按键占据行列的一个交点,需要连接的线数为n+m根,但却可以读取n*m个按键,因此是非常“经济”的,其一般的电路图如下图所示。
在这里插入图片描述

注意:矩阵键盘一般要求单片机引脚具有上拉电阻,如果没有需要额外接上。

矩阵键盘的控制方法

1. 扫描法

  扫描法很容易理解,就是逐行输出0,然后读入列值,并检查是否有为0的位,若有,则可以确定是某一行某一列的按键被按下。
  在实际应用中,往往会采用一些技巧来加快扫描速度:

2. 反转法

  除扫描法之外,还有一种检测按键的思路,就是反转法。

方法的选择?

  初看似乎会觉得反转法更加简单,我一开始也是这样以为的,但后来发现其实这两种方法的简易程度是和单片机类型有关的。有一些单片机的IO引脚可以一次性输出多位,比如51单片机的P1,P2等,还有一些单片机的IO引脚每次只能控制一位,比如Arduino。所以我觉得这两种方法关键是掌握里面的思想。
  以51单片机为例,它的IO引脚有一个很重要的特点,那就是IO引脚都是双向的,而且输入输出不需要提前配置,可以直接读取引脚的电平状态,这样的单片机就很适合使用矩阵键盘。下面看一个例程,严格来说,可能更偏向于反转法

/*************************************************************************
* 函 数 名: Key_Scan
* 函数功能: 检测有按键按下并读取键值
* 输    入: 无
* 返 回 值: S1~S16分别返回1~16
* 线路连接: P1的高四位为行,P1的低四位为列,具体参考上图
*************************************************************************/
unsigned char Key_Scan()
{
	unsigned char KeyValue = 0;
	P1 = 0x0f;
	unsigned char a = 0;  //用于按键松手检测
	if(P1 != 0x0f)     //读取按键是否按下
	{
		delay(1000);    //延时10ms进行消抖
		if(P1 != 0x0f)  //再次检测键盘是否按下
		{
			P1 = 0X0F;     //行输入0,检测列值,先判断列
			switch(P1)
			{
				case(0X07):	KeyValue=1;break;
				case(0X0b):	KeyValue=2;break;
				case(0X0d): KeyValue=3;break;
				case(0X0e):	KeyValue=4;break;
			}
			
			P1 = 0XF0;    //列输入0,检测行值,判断行
			switch(P1)
			{
				case(0X70):	KeyValue=KeyValue;break;
				case(0Xb0):	KeyValue=KeyValue+4;break;
				case(0Xd0): KeyValue=KeyValue+8;break;
				case(0Xe0):	KeyValue=KeyValue+12;break;
			}
			while((a<50)&&(GPIO_KEY!=0xf0))	 //检测按键松手检测
			{
				delay(1000);
				a++;
			}
		}
	}
	return KeyValue;
}

标签:break,P1,引脚,矩阵,嵌入式,键盘,单片机,KeyValue,按键
来源: https://blog.csdn.net/ZHOU_YONG915/article/details/122604090