(软件02)单片机按键处理,区分短按与长按

这篇具有很好参考价值的文章主要介绍了(软件02)单片机按键处理,区分短按与长按。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文目录

  •     本篇前言
  •     代码思路
  •     实操练习

本篇前言

        今天接着上篇与大家继续分享软件方面关于按键事件的处理,上篇软件01篇已提到整个软件框架时基的处理,其中提到了关于按键的处理,这篇将具体地介绍按键处理的思路与实例。

        话不多说,加个封面图直接开始。

(软件02)单片机按键处理,区分短按与长按,嵌入式软硬件知识分享,单片机,嵌入式硬件,mcu,c语言,stm32,51单片机

代码思路

        按键扫描函数思路:

        1.判断GPIO按键按下。

        2.记录按下时间,判断按下时间是否满足按键消抖时间(短按时间)。

        3.满足短按时间后,标记按键按下标志位。

        4.随着按下时长是否满足长按时间,并且按键是首次使用(防止一直进行这长按操作)。

        5.判断按键是否释放,释放后,根据按下标记与按键是否为首次使用标记,是否执行短按操作,接着,重置按下时间、按下标记、按键使用标记。

实操练习

        设计三个按键各自按下的短按(50ms),长按(3s)的处理。

        单片机硬件平台不要求,可移植到任何平台。

        按键扫描函数zj_app_key_scan.c

#define FALSE        0
#define TRUE         0

#define BSP_KEY_1_GPIO_PIN      	    GPIO_PIN_3
#define BSP_KEY_1_GPIO_PORT     	    GPIOB
#define BSP_KEY_1_GET 			    !GPIO_ReadInputDataBit(BSP_KEY_1_GPIO_PORT,BSP_KEY_1_GPIO_PIN)

#define BSP_KEY_2_GPIO_PIN      	    GPIO_PIN_4
#define BSP_KEY_2_GPIO_PORT     	    GPIOB
#define BSP_KEY_2_GET 			    !GPIO_ReadInputDataBit(BSP_KEY_2_GPIO_PORT,BSP_KEY_2_GPIO_PIN)

#define BSP_KEY_3_GPIO_PIN      	    GPIO_PIN_5
#define BSP_KEY_3_GPIO_PORT     	    GPIOB
#define BSP_KEY_3_GET 			    !GPIO_ReadInputDataBit(BSP_KEY_3_GPIO_PORT,BSP_KEY_3_GPIO_PIN)

#define KEY_1_LONG_CHECK_MS      3000
#define KEY_1_SHORT_CHECK_MS     50

#define KEY_2_LONG_CHECK_MS      3000
#define KEY_2_SHORT_CHECK_MS     50

#define KEY_3_LONG_CHECK_MS      3000
#define KEY_3_SHORT_CHECK_MS     50

uint16_t eKey_1_press_time 	    = 0;
uint8_t eKey_1_press_flag 		= 0;
uint8_t eKey_1_used_flag 		= 0;

uint16_t eKey_2_press_time 	    = 0;
uint8_t eKey_2_press_flag 		= 0;
uint8_t eKey_2_used_flag 		= 0;

uint16_t eKey_3_press_time 	    = 0;
uint8_t eKey_3_press_flag 		= 0;
uint8_t eKey_3_used_flag 		= 0;



static void zj_app_key_1_short(void)
{
  //这里写1号按键的短按处理
}

static void zj_app_key_1_long(void)
{
  //这里写1号按键的长按处理
}



static void zj_app_key_2_short(void)
{
  //这里写2号按键的短按处理
}

static void zj_app_key_2_long(void)
{
  //这里写2号按键的长按处理
}



static void zj_app_key_3_short(void)
{
  //这里写3号按键的短按处理
}

static void zj_app_key_3_long(void)
{
  //这里写3号按键的长按处理
}


static void zj_app_key_1_10ms_scan(void)
{	
	if(BSP_KEY_1_GET)
	{
		eKey_1_press_time++;
		if(eKey_1_press_time * 10 >= KEY_1_SHORT_CHECK_MS)  //防抖50ms
			eKey_1_press_flag 	= TRUE; //标记有按下
	}
	else
	{
		//松手处理
		if(eKey_1_press_flag && eKey_1_used_flag == FALSE) //不足长按时间3S
			zj_app_key_1_short(); //短按处理
		//恢复按键
		eKey_1_press_time 		= 0;
		eKey_1_press_flag 		= FALSE;
		eKey_1_used_flag 		= FALSE;
	}
	
	if(eKey_1_press_time * 10 >= KEY_1_LONG_CHECK_MS  && eKey_1_used_flag == FALSE)//满足长按时间3S,只有效一次长按
	{
		zj_app_key_1_long();//长按处理
		eKey_1_used_flag 		= TRUE;
	}
}


static void zj_app_key_2_10ms_scan(void)
{	
	if(BSP_KEY_2_GET)
	{
		eKey_2_press_time++;
		if(eKey_2_press_time * 10 >= KEY_2_SHORT_CHECK_MS)  //防抖50ms
			eKey_2_press_flag 	= TRUE; //标记有按下
	}
	else
	{
		//松手处理
		if(eKey_2_press_flag && eKey_2_used_flag == FALSE) //不足长按时间3S
			zj_app_key_2_short(); //短按处理
		//恢复按键
		eKey_2_press_time 		= 0;
		eKey_2_press_flag 		= FALSE;
		eKey_2_used_flag 		= FALSE;
	}
	
	if(eKey_2_press_time * 10 >= KEY_2_LONG_CHECK_MS  && eKey_2_used_flag == FALSE)//满足长按时间3S,只有效一次长按
	{
		zj_app_key_2_long();//长按处理
		eKey_2_used_flag 		= TRUE;
	}
}


static void zj_app_key_3_10ms_scan(void)
{	
	if(BSP_KEY_3_GET)
	{
		eKey_3_press_time++;
		if(eKey_3_press_time * 10 >= KEY_3_SHORT_CHECK_MS)  //防抖50ms
			eKey_3_press_flag 	= TRUE;	//标记有按下
	}
	else
	{
		//松手处理
		if(eKey_3_press_flag && eKey_3_used_flag == FALSE) //不足长按时间3S
			zj_app_key_3_short(); //短按处理
		//恢复按键
		eKey_3_press_time 		= 0;
		eKey_3_press_flag 		= FALSE;
		eKey_3_used_flag 		= FALSE;
	}
	
	if(eKey_3_press_time * 10 >= KEY_3_LONG_CHECK_MS  && eKey_3_used_flag == FALSE)//满足长按时间3S,只有效一次长按
	{
		zj_app_key_3_long();//长按处理
		eKey_3_used_flag 		= TRUE;
	}
}


void zj_app_key_scan_10ms_process(void)
{
	zj_app_key_1_10ms_scan();
	zj_app_key_2_10ms_scan();
	zj_app_key_3_10ms_scan();
}

        代码的移植只需要注意各个单片机的IO初始化,按键判断高低电平以及对应的库函数即可,将zj_app_key_scan_10ms_process(void)声明后放在10ms时基处理调用即可,按键的具体操作在各自的短按处理函数、长按处理函数设计即可。

小弟感谢大家的关注!

      (利他之心,原创分享)文章来源地址https://www.toymoban.com/news/detail-767892.html

到了这里,关于(软件02)单片机按键处理,区分短按与长按的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单个按钮实现长按开关机,短按可以当普通按钮控制单片机

    在看郭天祥老师的课程时学到的电路,之后发现这种控制原理很流行。 核心思路有两个: 1、用两个二极管隔离开q1和io_check,两端都可以响应按钮的状态,从而实现按钮复用。 2、用d2和q2,实现了与的功能,两者任意一个对地短路都可以保持mcu供电。 使用步骤: 1、长按sw

    2024年01月18日
    浏览(38)
  • (软件03)单片机串口处理思路,超时接收的方法

        软件学习前言     代码思路     实操练习         最近写了两篇硬件分享文章,要做的一个通过485串口接收指令,从而控制电机转速的内容。里面涉及到了串口的处理,于是便想写一下关于串口处理的相关经验分享,串口也是非常重要的,不管是printf打印log信息,

    2024年02月01日
    浏览(37)
  • 001_区分单片机、arm、DSP、FPGA(零基础也能区分)

    单片机是指一个集成在一个芯片上的完整计算机系统,最早的单片机由微处理器核心、存储器、输入输出端口和计时电路等基本部分组成。例如,Intel公司推出的第一款单片机是Intel 8048,它于1976年发布,包括一个8位的中央处理器、ROM、RAM、输入输出端口和计时电路等基本模

    2024年02月08日
    浏览(43)
  • 单片机之独立按键(多种按键代码编写)

    单片机之独立按键原理:按键右端接GND,左边接到单片机的IO口,同时接了一个上拉电阻,当按键未按下时,P2.0为高电平(学过模电的人都应该知道为什么吧)当按键按下时,相当于P2.0口与GND相连为 低电平。

    2024年02月03日
    浏览(60)
  • 51单片机 --独立按键

    前言 前几章介绍的都是IO 口输出的使用,这一教程我们通过独立按键实验来介绍IO 口作为输入的使用。开发板上板载8 个独立按键。本教程所要实现的功能是:通过开发板上的独立按键K1 控制D1 指示灯亮灭。大家可以参考前面的实验内容。 一、按键介绍 按键是一种电子开关

    2024年02月06日
    浏览(58)
  • 单片机——矩阵按键模块

    主要目的 学会按键扫描 1.延时函数 延时函数部分详见链接: 单片机控制一盏灯的亮与灭程序解释 这个程序里面的延时函数的目的是按键消抖。 2.按键扫描模块 这是本次实验的重点,将详细介绍。 先来观察矩阵按键模块的连接 总共8个口。 先实现关于列的扫描,设置初始值(

    2024年02月08日
    浏览(39)
  • 单片机按键开关代码

    在单片机的应用程序中,按键开关的使用频率非常高。按键开关可以通过检测用户的操作,实现程序的控制和交互。本文将介绍单片机按键开关的基本原理和如何在程序中实现按键开关的控制。 按键开关的原理基于接通和断开电路之间的变化。当按键按下时,连接到单片机的

    2024年02月02日
    浏览(42)
  • 【51单片机】矩阵按键

    参考:普中 51 单片机开发攻略 main.c 只有第一个数码管量,并且按第几个键,就显示第几(0-F)。

    2024年01月21日
    浏览(61)
  • 蓝桥杯单片机学习4——独立按键&矩阵按键

    上期学习了数码管的静态显示,这次我们来学习独立按键矩阵按键 原理很简单,当作为独立按键使用时, 跳线帽的23接在一起 ,此时按键如果按下,则按键连接的IO口电平会被拉低,通过捕获IO的电平变化,就可以判断按键是否按下。 什么是按键消抖?按键为什么会有抖动?

    2023年04月15日
    浏览(67)
  • 如何使用单片机点亮LED灯,并使用按键控制[51单片机]

    首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同 我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯   那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上, 那么只需要操作这几个接口的高低电频,

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包