设计与开发

单片机按 单片机编程中,如何用一个按键同时检测点按与长按

小编 2024-11-24 设计与开发 23 0

单片机编程中,如何用一个按键同时检测点按与长按

1. 前言

事先说明,我这篇博客的目的是给入门学裸机编程的提供一个思路,不涉及操作系统任务阻塞之类的。在我们平常使用按键的编程过程中,一般说来,某一个按键实现的是单一的功能,比如简单的点亮一盏LED灯,按一次亮起,再按一次就是熄灭这种。但是如果我们的按键很少,此时要是用一个按键能够实现多种功能那么就可以节约我们的硬件资源。本博客带来的就是用一个按键实现检测点按与长按,进而就可以控制两种不同的功能。

2. 代码

话不多说,以下是实现的代码:

#define Long_Press 1

#define Short_Press 2

uint8_t Key_Scan(void)

{

uint8_t long_press_flag; //长按标志位

uint8_t short_press_flag; //点按标志位

if(key==0)

{

delay_ms(10);

if(key==0)

{

short_press_flag=1;

delay_ms(250); //点按的时间不能多于250ms

if(key==0)

{

long_press_flag=1;

}while(!key);

if(long_press_flag==1) //先判断是否长按,因为长按中包括了点按

{

return Long_Press;

}

if(short_press_flag==1) //后判断是否点按

{

return Short_Press;

}

}

}

return 0;

}

通过返回值得到按键是点按还是长按,若是长按,返回Long_Press;点按则返回Short_Press,这两个是宏定义;若是没有检测到按键按下,就返回0。但是本代码在使用过程中要注意的是点按的周期不能小于250ms,否则也会被当成是长按,适用于一些实时性要求没有太高的场合。当然,延时的250ms可以改变,依据个人习惯更改长按的等待时间即可。

————————————————

版权声明:本文为CSDN博主「IT狼~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_46582567/article/details/118023247

详解单片机的按键检测与控制

按键在单片机控制系统中起到人机交互的作用,通过按键可以输入数据、命令和各种参数,按键侧键测处理是单片机系统设计和开发中一个重要的内容,关系到整个系统的交互性能和稳定性。按键处理形式在单片机系统中有两种形式:直接按键和矩阵编码键盘,下面分别对这两种按键检测电路的特点及编程思路和方法进行分析和介绍。

按键抖动问题产生的原因及解决方法

按键的抖动问题是指按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象(由按键的机械特性造成,不可避免)。图8-1所示为一次按键的抖动过程,在按键的前沿和后沿都会有5~10ms的抖动。

图8-1 按键抖动示意图

对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式消除抖动。

去除抖动可以采用硬件方式和软件方式。硬件方式一般是在按键与单片机的输入通道上安装硬件去抖电路(如RS触发器)。软件方式的实现方法是:当查询到电路中有按键按下时,先不进行处理,而是先执行10~20ms的延时程序,延时程序结束后,再次查询按键状态,若此时按键仍为按下状态,则视为按键被按下。

按键检测电路及应用

1. 独立式按键

独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态,CPU可直接读取该I/O线的高/低电平状态。这种按键硬件、软件结构简单,判键速度快,使用方便,但占用I/O口线较多,适用于按键数量较少的系统中。

独立连接式键盘连接如图8-2所示。当没有键被按下时,所有的数据输入线均为高电平;当任意一个按键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键被按下。

图8-2 独立式键盘接口设计

【例8-1】 利用单片机的P1.0~P1.34个I/O口检测4个按键的触发信息,以实现不同功能的控制。

硬件电路参见图8-2所示,C51参考程序如下:

2. 矩阵式按键

在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式。例如下例中的16个按键,被排列成了如图8-3所示的4X4矩阵方式。该矩阵式键盘由4根行线和4根列线组成,每个行线和列线的交叉点是一个按键。

【例8-2】 将矩阵式键盘的按键值通过数码管显示出来。

电路连接如图8-3所示(电源和震荡电路未标出)。

图8-3 矩阵式键盘按键显示电路图

如何判断被按下的键值呢?

分析如下:

根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:

a)首先判断是否有按键被按下

本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。

b)按键消抖

当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。

c)按键识别

当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。

C51程序如下:

矩阵式键盘与I/O接口应用

【例8-3】 四位数字密码锁

四位数字密码锁功能:通过键盘输入密码,当输入密码与内置密码相同时,继电器动作,表示密码锁解开。为了简化功能,该密码锁只使用12个键(即4x3键盘),其中S1~S9为1~9数字键,S10为0数字键,S11为“*”键作为确认键使用,而S12为“#”键作为复位键,键盘接口电路如图8-4所示,键值布局如表8-1所示。

图8-4 行列式键盘电路连接图

表8-1 键盘布局表

单片机上电时,数码管显示“0000”,此时输入数字,数码管将显示按键值,数字逐个向左递增,四次输入完毕,四个数码管显示输入的数,此时按“*”号按键将启动比较,若输入数字与内设密码相同,继电器动作。如不同,则系统复位等待重新输入密码。当按“#”号键,系统复位,数码管显示“0000”。

在上面键扫描程序基础上增加的源程序如下:

相关问答

请问 单片机 怎么用独立 键按一下实现一个功能,按另一个按键实现另一个功能,这个代码要怎么写啊?

如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了while(1){while(flag==1){死循环1}while(flag==2){死循环2}}....

单片机 一个 键实现短按,中长按,更长按,也就是三种功能,程序怎么写?

在0.5S的时候做一次判断,如果弹起了则表示短按,没弹起,再经过2.5S再判断次,再经过2s再判断是否弹起,基本能实现在0.5S的时候做一次判断,如果弹起了则表示短按...

单片机 如何实现长 开关机?

长按开关机功能可以通过单片机的外部中断功能实现。在程序中设置一个计时器,当按键被按下时,计时器开始计时,如果计时器超过一定时间,就判断为长按事件,执行...

mcs51指令执行过程分为?

MCS-51单片机的指令如果按功能划分可以分为五类:1,数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。除了奇偶位外,指令的执行对PSW...

单片机 输入1或0时输入的是什么-ZOL问答

是这样的,I/O作输入用时典型的例子就是检测按键是否接通,按键是接在GND和I/O之间的,I/O和VCC之间有一个上拉电阻,这样子当按键没有按下去的时候,I/O接了一个电阻...

为何狂 按单片机按键 单片机会死机-ZOL问答

光耦是用来隔离的。就是说用光耦后,单片机的电路信号与光耦另一边的信号可以完全隔离。好处:继电器在开关过程产生的高压不会影响单片机,一般用在...

51 单片机 控制步进电机,用 键控制 单片机 的运转,按一下走一步停下来,再摁一下再走一步,如此循环?

这个不难的。就一个电机处理程序,一个按键处理程序呗这个不难的。就一个电机处理程序,一个按键处理程序呗

51 单片机按 键切换的三种状态?

分别是短按、长按和组合按。短按是指按下按键,接触时间非常短,一般在几十毫秒到一百多毫秒之间;长按则是按下按键,接触时间比较长,一般在几百毫秒到一秒钟之...

单片机 一键长按与短 按按 键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢?

这……也太乱了吧?你能从这一大堆的逻辑中理出头绪来,我真佩服死你了。你这长按一处理,后面短按马上也生效了,长按跟没有一样。既然都用上定时器了,就别del...

单片机 马达怎么接?

一、第一步是将电机连接到HC6800em3单板注意使用P1端的电缆排列单片机连接到电机控制芯片的输入端(4Pin端口),以确保P1.0-P1.3正常。二、接下来,将电机连接...

猜你喜欢