32单片机按键扫描 实现长短按

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

key.c

/**
 ****************************************************************************************************
 * @file           key.c
 * @author         Kyro Qu
 * @brief          按键驱动代码
 * 实验平台:       STM32G431RB开发板
 ****************************************************************************************************
 */

#include "key.h"
#include "lcd.h"
#include "stdio.h"


typedef struct
{
	GPIO_TypeDef *Key_Port;
	uint16_t Key_Pin;

}Key_GPIO_t;

static Key_GPIO_t g_KeyList[] =
{
	{ KEY_B1_GPIO_Port, KEY_B1_Pin },
	{ KEY_B2_GPIO_Port, KEY_B2_Pin },
	{ KEY_B3_GPIO_Port, KEY_B3_Pin },
	{ KEY_B4_GPIO_Port, KEY_B4_Pin }
    /* add other KEY, ... */
};

#define KEY_NUM_MAX  (sizeof(g_KeyList)/sizeof(g_KeyList[0]))


typedef enum
{
	KEY_RELEASE =0,		 /* 释放松开 */
	KEY_CONFIRM,		 /* 消抖确认 */
	KEY_SHORT_PRESS,	 /* 短按 */
	KEY_LONG_PRESS,		 /* 长按 */

}KEY_STATE;


#define CONFIRM_TIME  10		     /* 消抖时间 ms */
#define LONG_PRESS_TIME  2000		 /* 长按时间窗 ms */


typedef struct
{
	KEY_STATE keyState;			 /* 按键状态 */
	uint32_t  prvTime;			 /* 按键时间 */	

}Key_Info_t;

static Key_Info_t g_Key_Info[KEY_NUM_MAX];


/**
 * @brief       扫描单个按键不同状态函数
 * @param       按键端口号
 * @retval      键值
 */
static uint8_t keyScan(uint8_t keyIndex)
{
	uint8_t keyPress;

	keyPress=HAL_GPIO_ReadPin(g_KeyList[keyIndex].Key_Port,g_KeyList[keyIndex].Key_Pin);

	#if !ElECTRIC_LEVEL
	keyPress=!keyPress;
	#endif

	switch (g_Key_Info[keyIndex].keyState)								    /* 按键状态机 */
	{ 
		case KEY_RELEASE :
				if(keyPress )							            	  /* 如果按下 */													
				{
					g_Key_Info[keyIndex].keyState = KEY_CONFIRM;
					g_Key_Info[keyIndex].prvTime = HAL_GetTick();			/* 获取按下起始时间 */ 
				}
				break;
		case KEY_CONFIRM :
				if(keyPress )
				{
					if(HAL_GetTick()-g_Key_Info[keyIndex].prvTime>CONFIRM_TIME )
					{
						g_Key_Info[keyIndex].keyState = KEY_SHORT_PRESS;
					}
				}
				else
				{
					g_Key_Info[keyIndex].keyState = KEY_RELEASE;
				}
				break;
		case KEY_SHORT_PRESS :
				if(keyPress )
				{
					if(HAL_GetTick()-g_Key_Info[keyIndex].prvTime>LONG_PRESS_TIME )
					{
						g_Key_Info[keyIndex].keyState = KEY_LONG_PRESS;
					}
				}
				else										            	/* 如果松开 */ 
				{
					g_Key_Info[keyIndex].keyState = KEY_RELEASE;
					return (keyIndex+0x01);							/* 返回短按对应码值  0x01 0x02 0x03 .....    */				
				}
				break;
		case KEY_LONG_PRESS :
				if(!keyPress )										    	/* 如果松开 */ 
				{
					g_Key_Info[keyIndex].keyState = KEY_RELEASE;
					return (keyIndex+0x81);							        /* 返回短按对应码值  0x81 0x82 0x83 .....    */				
				} 
				break;
		default:
					g_Key_Info[keyIndex].keyState = KEY_RELEASE;
	}
		return 0;							
}


/**
 * @brief        扫描单个按键 按键的码值
 * @param        无
 * @retval       键值
 */
uint8_t GetKeyVal(void)
{
	uint8_t  res = 0; 

	for(uint8_t i=0;i<KEY_NUM_MAX;i++)
	{
		res = keyScan(i);					    /* 临时保存键值 */

		if(res!= 0)							/* 返回键值不为0,则跳出 */
		{
			break;
		}
	}
    return res;  /* 返回键值 */
}



/**
 * @brief        按键处理函数
 * @param        无
 * @retval       无
 */

void KeyHandler(void)
{
	uint8_t KEY_STATE;

	KEY_STATE=GetKeyVal();
	switch(KEY_STATE)
	{
		case B1_SHORT_PRESS:
					break;
		case B1_LONG_PRESS:

					break;
		case B2_SHORT_PRESS:

					break;
		case B2_LONG_PRESS:

					break;
		case B3_SHORT_PRESS:

					break;
		case B3_LONG_PRESS:

					break;
		case B4_SHORT_PRESS:
	
					break;
		case B4_LONG_PRESS:
	
					break;
	}
}







key.h文章来源地址https://www.toymoban.com/news/detail-771908.html

/**
 ****************************************************************************************************
 * @file           key.h
 * @author         Kyro Qu
 * @brief          按键驱动代码
 * 实验平台:       STM32G431RB开发板
 ****************************************************************************************************
 */

#ifndef __KEY_H
#define __KEY_H

#include "main.h"

//按键另一端口的电平  1为高电平   0为低电平
#define   ElECTRIC_LEVEL   0

/* 键值 */
#define B1_SHORT_PRESS 0x01
#define B1_LONG_PRESS  0x81

#define B2_SHORT_PRESS 0x02
#define B2_LONG_PRESS  0x82

#define B3_SHORT_PRESS 0x03
#define B3_LONG_PRESS  0x83

#define B4_SHORT_PRESS 0x04
#define B4_LONG_PRESS  0x84


uint8_t keyScan(uint8_t mode);/* 按键扫描函数 */
uint8_t GetKeyVal(void);
void KeyHandler(void);


#endif











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

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

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

相关文章

  • K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数         1、参数         2、引脚说明 三、驱动说明         TB6612模块驱动说明         对应程序:         ENA ENB输出PWM 四、部分代码说明         接线说明                 1、STC89C52RC+TB6612模块                 2、STM32F

    2024年02月15日
    浏览(37)
  • K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停

    目录 一、资源说明 二、基本参数         参数         引脚说明 三、驱动说明         大功率MOS模块驱动         对应程序: 四、部分代码说明         接线说明                 STC89C52RC+大功率MOS模块                 STM32F103C8T6+大功率MO

    2023年04月26日
    浏览(52)
  • K_A08_005 基于 STM32等单片机驱动XY-160D模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数 四、部分代码说明         接线说明                 1、STC89C52RC+XY-160D模块                  2、STM32F103C8T6+XY-160D模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目所有材料清单 八、注意事项 九

    2024年02月14日
    浏览(71)
  • STM32单片机实现简易声控灯控制

    首先,先分析一下声控灯实现的原理,即当外界发出声音的时候,灯就会被点亮。那是一旦发出声音灯就会被点亮吗?从现时生活中我们可以知道,楼道声控灯并不是只要有声音就会把灯点亮的,当白天光线充足的时候,无论外界有多大的声音,灯都不会被点亮。但是我们知

    2024年02月04日
    浏览(40)
  • 76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

    单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单

    2024年02月12日
    浏览(55)
  • STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年04月11日
    浏览(62)
  • 【单片机毕设选题】stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(60)
  • STM32单片机实现固件在线升级(IAP)

    单片机的固件升级方式有很多种, 1、ICP:In Circuit Programing,简单说就是在单片机开发时使用烧录器升级程序,比如使用J-Link烧录单片机程序。 2、ISP:In System Programing,在单片机内部实现了基于通信接口(如串口、I2C、SPI等等)的FLASH引导程序,配合厂家提供的烧录软件工具

    2024年02月13日
    浏览(56)
  • 单片机项目分享 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(93)
  • stm32毕设分享 stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包