【蓝桥杯单片机】2.3 矩阵键盘的双按键

目录

引言

一、原理图

二、定义图

三、双按键

1.分析

2.示例

(1)按键选择

(2)定义引脚

(3)消抖延时函数

(4)按键

四、代码纯享版


引言

        在前面,我们学习了矩阵键盘的单、双击http://t.csdnimg.cn/S0fGu)和矩阵键盘的长、短按http://t.csdnimg.cn/BAuZM),至此,应对蓝桥杯省赛的按键部分已是绰绰有余。此篇,我们来了解一下在蓝桥杯国赛中会出现矩阵键盘的双按键问题(国赛备赛中)。

一、原理图

  1. 按键排列成矩阵形式:按键按行列排列成矩阵,每个按键对应矩阵中的一个元素。例如,4x4 的矩阵可以支持最多 16 个按键。

  2. 行列扫描:按键矩阵通过单片机的 GPIO 引脚连接。在读取按键输入之前,单片机首先将矩阵的每一行(或每一列)依次设置为输出,而其他行(列)则设置为输入。然后,单片机逐行(或逐列)地扫描,检测是否有按键被按下。

  3. 按键状态检测:当某一行(或列)被设置为输出时,如果此行(或列)上有按键按下,那么对应的输入引脚将被拉低(或拉高),单片机可以通过读取输入引脚的状态来检测按键是否被按下。

  4. 消除冲突:由于按键矩阵的扫描方式,可能会出现多个按键同时被按下的情况,称为按键冲突。为了解决这个问题,通常采用软件或硬件的方式进行消抖和冲突解析。

  5. 按键编码:一旦检测到有按键被按下,单片机就可以根据按键所在的行列位置来编码按键的唯一标识,以便后续的处理和响应。

老规矩,开局还是先放原理图 。

二、定义图

                               (此图来源于B站小蜜蜂老师)

关于此图具体的理解请见我的作品 2.1矩阵键盘的单击、双击 http://t.csdnimg.cn/41Dd9

三、双按键

1.分析

 双按键部分与长短按有异曲同工之处,都是通过小范围的延时后,判断后续是否还有对应的操作来确定的,因此并不难理解,不同的点在于:我们此处并不需要使用定时器。

2.示例

(1)按键选择

此处我们以S7和S6同时按下为例(该图为第十五届蓝桥杯赛点资料包原理图,具体引脚可以参照第一张图片)。 

(2)定义引脚

#include <STC15F2K60S2.H>  //引入头文件
sbit R1=P3^0;    //第一行
sbit R2=P3^1;    //第二行
sbit R3=P3^2;    //第三行
sbit R4=P3^3;    //第四行

sbit C1=P4^4;    //第一列
sbit C2=P4^2;    //第二列
sbit C3=P3^5;    //第三列
sbit C4=P3^4;    //第四列

此处定义了符号R1~R4来代表行,C1~C4代表列(具体含义见我作品: 2.1矩阵键盘的单击、双击 http://t.csdnimg.cn/41Dd9http://t.csdnimg.cn/41Dd9http://t.csdnimg.cn/41Dd9)。

(3)消抖延时函数

通常,我们采用延时检测,跳过其反馈不稳定部分的检测。

void Delay(unsigned int t)  //通常延时100us即可
{
    while(t--);
}

 除了自己写的延时代码外,也可以引入头函数,利用软件来生成延时函数。

#include "intrins.h"

(此处不作具体展示) 

(4)按键

void ScanKeys()
{
	R1=R2=R3=R4=1;         //将所有行输出设置为高电平
	C1=0;C2=C3=C4=1;       //将第一列输出设置为低电平,其他列设置为高电平
    
    //此为S7先按下后的检测:
	if(R1==0)              //若检测到第一行输出低电平(即S7)
	{
		Delay(100);        //延时消抖
		if(R1==0 && R2==0) //若同时检测到第一、二行同时输出低电平
		{
			##双按键代码
			while(R1==0 && R2==0);
		}
        else if(R1==0 && R2==1) //若S7按下但S6未按下
        {
            ##单按键代码
            while(R1==0);
        }
	}
    //此为S6先按下后的检测:
    if(R2==0)              //若检测到第二行输出低电平(即S6)
	{
		Delay(100);        //延时消抖
		if(R2==0 && R1==0) //若同时检测到第二、一行同时输出低电平
		{
			##双按键代码
			while(R2==0 && R1==0);
		}
        else if(R2==0 && R1==1) //若S6按下但S7未按下
        {
            ##单按键代码
            while(R2==0);
        }
	}
}

显然,分开来写过于冗杂,我们只需在判断第一个按键按下判断是略施小计,采用判断即可:
 

void ScanKeys()
{
	R1=R2=R3=R4=1;         //将所有行输出设置为高电平
	C1=0;C2=C3=C4=1;       //将第一列输出设置为低电平,其他列设置为高电平
    
    //此为S7先按下后的检测:
	if(R1==0 || R2==0)           //若检测到第一行或第二行输出低电平(即S7或S6)
	{
		Delay(100);              //延时消抖
		if(R1==0 && R2==0)       //若同时检测到第一、二行同时输出低电平
		{
			##双按键代码
			while(R1==0 && R2==0);
		}
        else if(R1==0 && R2==1)  //若S7按下但S6未按下
        {
            ##S7按下代码
            while(R1==0);
        }
        else if(R2==0 && R1==1)  //若S6按下但S7未按下
        {
            ##S6按下代码
        }
	}
}

       如此,双按键的部分就完成了。

四、代码纯享版

#include <STC15F2K60S2.H>  //引入头文件
sbit R1=P3^0;    //第一行
sbit R2=P3^1;    //第二行
sbit R3=P3^2;    //第三行
sbit R4=P3^3;    //第四行

sbit C1=P4^4;    //第一列
sbit C2=P4^2;    //第二列
sbit C3=P3^5;    //第三列
sbit C4=P3^4;    //第四列

void Delay(unsigned int t)  //通常延时100us即可
{
    while(t--);
}

void ScanKeys()
{
	R1=R2=R3=R4=1;         //将所有行输出设置为高电平
	C1=0;C2=C3=C4=1;       //将第一列输出设置为低电平,其他列设置为高电平
    
    //此为S7先按下后的检测:
	if(R1==0 || R2==0)           //若检测到第一行或第二行输出低电平(即S7或S6)
	{
		Delay(100);              //延时消抖
		if(R1==0 && R2==0)       //若同时检测到第一、二行同时输出低电平
		{
			##双按键代码
			while(R1==0 && R2==0);
		}
        else if(R1==0 && R2==1)  //若S7按下但S6未按下
        {
            ##S7按下代码
            while(R1==0);
        }
        else if(R2==0 && R1==1)  //若S6按下但S7未按下
        {
            ##S6按下代码
        }
	}
}

以上为个人的理解与代码,精彩内容持续呈现中~~~ 

  • 44
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
蓝桥杯单片机矩阵键盘是一种常见的输入设备,它可以通过按下不同的按键来输入不同的信息。下面是蓝桥杯单片机矩阵键盘的工作原理和实现方法: 1.工作原理: 蓝桥杯单片机矩阵键盘的工作原理是基于按键扫描的。按键扫描的思路是,按键是连接行和列的桥梁,如果往某行或者某列输入低电平,其他行或列为高电平,我们只需要检测所有列或者行是否有低电平即可。因此,我们可以通过按下按键来改变行列的电平状态,从而检测出按下的按键。 2.实现方法: 蓝桥杯单片机矩阵键盘的实现方法如下: (1)将矩阵键盘的行和列分别连接到单片机的IO口上。 (2)设置行为输出,列为输入。 (3)将所有列的电平设置为高电平。 (4)循环扫描每一行,将该行的电平设置为低电平,然后检测所有列的电平状态,如果有低电平,则说明该行对应的按键被按下。 (5)重复步骤(4),直到检测完所有行。 下面是一个简单的蓝桥杯单片机矩阵键盘的实现代码: ```c #include <reg52.h> sbit row1 = P1^0; sbit row2 = P1^1; sbit row3 = P1^2; sbit row4 = P1^3; sbit col1 = P1^4; sbit col2 = P1^5; sbit col3 = P1^6; sbit col4 = P1^7; void main() { while(1) { row1 = 0; row2 = 1; row3 = 1; row4 = 1; if(col1 == 0) { /* 检测到第1个按键被按下 */ } if(col2 == 0) { /* 检测到第2个按键被按下 */ } if(col3 == 0) { /* 检测到第3个按键被按下 */ } if(col4 == 0) { /* 检测到第4个按键被按下 */ } row1 = 1; row2 = 0; row3 = 1; row4 = 1; if(col1 == 0) { /* 检测到第5个按键被按下 */ } if(col2 == 0) { /* 检测到第6个按键被按下 */ } if(col3 == 0) { /* 检测到第7个按键被按下 */ } if(col4 == 0) { /* 检测到第8个按键被按下 */ } row1 = 1; row2 = 1; row3 = 0; row4 = 1; if(col1 == 0) { /* 检测到第9个按键被按下 */ } if(col2 == 0) { /* 检测到第10个按键被按下 */ } if(col3 == 0) { /* 检测到第11个按键被按下 */ } if(col4 == 0) { /* 检测到第12个按键被按下 */ } row1 = 1; row2 = 1; row3 = 1; row4 = 0; if(col1 == 0) { /* 检测到第13个按键被按下 */ } if(col2 == 0) { /* 检测到第14个按键被按下 */ } if(col3 == 0) { /* 检测到第15个按键被按下 */ } if(col4 == 0) { /* 检测到第16个按键被按下 */ } } } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值