单片机独立按键代码

单片机处理独立按键

    • 原理
    • 关键代码

原理

按键开关的原理基于接通和断开电路之间的变化。当按键按下时,连接到单片机的输入口将会产生一个低电平信号,表示按键被按下;当按键弹起时,该输入口会产生一个高电平信号,表示按键被松开。因此,单片机可以通过检测输入口的电平变化来判断用户是否按下了按键。

按键开关的原理基于接通和断开电路之间的变化。当按键按下时,连接到单片机的输入口将会产生一个低电平信号,表示按键被按下;当按键弹起时,该输入口会产生一个高电平信号,表示按键被松开。因此,单片机可以通过检测输入口的电平变化来判断用户是否按下了按键。

一般人的代码处理思路是先检测按键按下的电平,然后延时等待,这样做容易浪费资源,假设按键一直处于按下状态,单片机会无法及时响应其它处理。

关键代码

key.h文件

#ifndef __KEY_H
#define __KEY_H
#include "stm32f1xx_hal.h"

#define  DMaxKeyNum  		5   //需要检测的按键数量
#define  DDebounceTimes   1500  //去抖动用到的程序循环圈数

#define     _KEY_NO             0  //定义按下了哪个键值
#define     _ESC_KEY            1
#define     _RIGHT_KEY          2
#define     _MENU_KEY           3
#define     _DOWN_KEY           4
#define     _ENT_KEY            5


typedef struct
{	
	unsigned char chKeyStatus;//按键的键值
	unsigned int nDebounceTimes;//去抖动的圈数
	GPIO_TypeDef *GPIOx;//用到的检测IO
	uint16_t GPIO_Pin;//用到的检测IO
}SKeyMsg;

void IntalKey(void);//初始化按键
unsigned char GetKeyValue(void);//获取按键键值


#endif

key.c文件

#include "key.h"

SKeyMsg g_stKeyMsgBuf[DMaxKeyNum] = {	
	{_ENT_KEY,0,GPIOA,GPIO_PIN_4},
	{_DOWN_KEY,0,GPIOA,GPIO_PIN_5},
	{_MENU_KEY,0,GPIOA,GPIO_PIN_6},
	{_RIGHT_KEY,0,GPIOA,GPIO_PIN_7},	
	{_ESC_KEY,0,GPIOA,GPIO_PIN_8},
};//需要处理的按键数组


void IntalKey(void)//按键初始化函数
{
	for(int i = 0;i<DMaxKeyNum;i++)
	{
		g_stKeyMsgBuf[i].nDebounceTimes = 0;
	}
}

unsigned char GetKeyValue(void)//获取按键键值
{
	unsigned char chStatus = _KEY_NO;
  for(int i = 0;i<DMaxKeyNum;i++)
	{		
		if(HAL_GPIO_ReadPin(g_stKeyMsgBuf[i].GPIOx,g_stKeyMsgBuf[i].GPIO_Pin) == GPIO_PIN_SET)
		{		  
			 if(g_stKeyMsgBuf[i].nDebounceTimes >= DDebounceTimes)
			 {				
				 g_stKeyMsgBuf[i].nDebounceTimes = 0;				 
				 chStatus = g_stKeyMsgBuf[i].chKeyStatus;
				 break;
			 }			
			 g_stKeyMsgBuf[i].nDebounceTimes = 0;				
		}
		else
		{
			if(g_stKeyMsgBuf[i].nDebounceTimes < (DDebounceTimes + DDebounceTimes))
			{
				g_stKeyMsgBuf[i].nDebounceTimes++;
			}			
		}		
	}
	return chStatus;
}

main.c

while(1)
{
	switch(GetKeyValue())
	{
	case  _ESC_KEY:
		dosomething1();
		break;
	case  _RIGHT_KEY:
		dosomething2();
		break;
	case  _MENU_KEY:
		dosomething3();
		break;
	case  _DOWN_KEY:'
		dosomething4();
		break;
	case  _ENT_KEY:
		dosomething5();
		break;
	}
}

你可能感兴趣的:(单片机,嵌入式硬件)