⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp_button.c

📁 STM32的GPIO口模拟串口通信
💻 C
📖 第 1 页 / 共 2 页
字号:
*/
static void bsp_InitButtonVar(void)
{
	/* 对按键FIFO读写指针清零 */
	s_Key.Read = 0;
	s_Key.Write = 0;

	/* 初始化USER按键变量,支持按下、弹起、长按 */
	s_BtnUser.IsKeyDownFunc = IsKeyDownUser;		/* 判断按键按下的函数 */
	s_BtnUser.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnUser.LongTime = BUTTON_LONG_TIME;			/* 长按时间 */
	s_BtnUser.Count = s_BtnUser.FilterTime / 2;		/* 计数器设置为滤波时间的一半 */
	s_BtnUser.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnUser.KeyCodeDown = KEY_DOWN_USER;			/* 按键按下的键值代码 */
	s_BtnUser.KeyCodeUp = KEY_UP_USER;				/* 按键弹起的键值代码 */
	s_BtnUser.KeyCodeLong = KEY_LONG_USER;			/* 按键被持续按下的键值代码 */
	s_BtnUser.RepeatSpeed = 0;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnUser.RepeatCount = 0;						/* 连发计数器 */		

	/* 初始化TAMPER按键变量,支持按下 */
	s_BtnTamper.IsKeyDownFunc = IsKeyDownTamper;	/* 判断按键按下的函数 */
	s_BtnTamper.FilterTime = BUTTON_FILTER_TIME;	/* 按键滤波时间 */
	s_BtnTamper.LongTime = 0;						/* 长按时间, 0表示不检测 */
	s_BtnTamper.Count = s_BtnTamper.FilterTime / 2;	/* 计数器设置为滤波时间的一半 */
	s_BtnTamper.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnTamper.KeyCodeDown = KEY_DOWN_TAMPER;		/* 按键按下的键值代码 */
	s_BtnTamper.KeyCodeUp = KEY_UP_TAMPER;			/* 按键弹起的键值代码 */
	s_BtnTamper.KeyCodeLong = 0;					/* 按键被持续按下的键值代码 */
	s_BtnTamper.RepeatSpeed = 0;					/* 按键连发的速度,0表示不支持连发 */
	s_BtnTamper.RepeatCount = 0;					/* 连发计数器 */	

	/* 初始化WAKEUP按键变量,支持按下 */
	s_BtnWakeUp.IsKeyDownFunc = IsKeyDownWakeUp;	/* 判断按键按下的函数 */
	s_BtnWakeUp.FilterTime = BUTTON_FILTER_TIME;	/* 按键滤波时间 */
	s_BtnWakeUp.LongTime = 0;						/* 长按时间 */
	s_BtnWakeUp.Count = s_BtnWakeUp.FilterTime / 2;	/* 计数器设置为滤波时间的一半 */
	s_BtnWakeUp.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnWakeUp.KeyCodeDown = KEY_DOWN_WAKEUP;		/* 按键按下的键值代码 */
	s_BtnWakeUp.KeyCodeUp = KEY_UP_WAKEUP;			/* 按键弹起的键值代码,0表示不检测 */
	s_BtnWakeUp.KeyCodeLong = 0;					/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnWakeUp.RepeatSpeed = 0;					/* 按键连发的速度,0表示不支持连发 */
	s_BtnWakeUp.RepeatCount = 0;					/* 连发计数器 */	

	/* 初始化UP按键变量,支持按下、连发(周期10ms) */
	s_BtnUp.IsKeyDownFunc = IsKeyDownUp;			/* 判断按键按下的函数 */
	s_BtnUp.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnUp.LongTime = 20;							/* 长按时间 */
	s_BtnUp.Count = s_BtnUp.FilterTime / 2;			/* 计数器设置为滤波时间的一半 */
	s_BtnUp.State = 0;								/* 按键缺省状态,0为未按下 */
	s_BtnUp.KeyCodeDown = KEY_DOWN_JOY_UP;			/* 按键按下的键值代码 */
	s_BtnUp.KeyCodeUp = 0;							/* 按键弹起的键值代码,0表示不检测 */
	s_BtnUp.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnUp.RepeatSpeed = 2;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnUp.RepeatCount = 0;						/* 连发计数器 */		

	/* 初始化DOWN按键变量,支持按下、连发(周期10ms) */
	s_BtnDown.IsKeyDownFunc = IsKeyDownDown;		/* 判断按键按下的函数 */
	s_BtnDown.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnDown.LongTime = 20;							/* 长按时间 */
	s_BtnDown.Count = s_BtnDown.FilterTime / 2;		/* 计数器设置为滤波时间的一半 */
	s_BtnDown.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnDown.KeyCodeDown = KEY_DOWN_JOY_DOWN;		/* 按键按下的键值代码 */
	s_BtnDown.KeyCodeUp = 0;						/* 按键弹起的键值代码,0表示不检测 */
	s_BtnDown.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnDown.RepeatSpeed = 2;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnDown.RepeatCount = 0;						/* 连发计数器 */		

	/* 初始化LEFT按键变量,支持按下 */
	s_BtnLeft.IsKeyDownFunc = IsKeyDownLeft;		/* 判断按键按下的函数 */
	s_BtnLeft.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnLeft.LongTime = 20;							/* 长按时间 */
	s_BtnLeft.Count = s_BtnLeft.FilterTime / 2;		/* 计数器设置为滤波时间的一半 */
	s_BtnLeft.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnLeft.KeyCodeDown = KEY_DOWN_JOY_LEFT;		/* 按键按下的键值代码 */
	s_BtnLeft.KeyCodeUp = 0;						/* 按键弹起的键值代码,0表示不检测 */
	s_BtnLeft.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnLeft.RepeatSpeed = 2;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnLeft.RepeatCount = 0;						/* 连发计数器 */	

	/* 初始化RIGHT按键变量,支持按下 */
	s_BtnRight.IsKeyDownFunc = IsKeyDownRight;		/* 判断按键按下的函数 */
	s_BtnRight.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnRight.LongTime = 20;						/* 长按时间 */
	s_BtnRight.Count = s_BtnRight.FilterTime / 2;	/* 计数器设置为滤波时间的一半 */
	s_BtnRight.State = 0;							/* 按键缺省状态,0为未按下 */
	s_BtnRight.KeyCodeDown = KEY_DOWN_JOY_RIGHT;	/* 按键按下的键值代码 */
	s_BtnRight.KeyCodeUp = 0;						/* 按键弹起的键值代码,0表示不检测 */
	s_BtnRight.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnRight.RepeatSpeed = 2;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnRight.RepeatCount = 0;						/* 连发计数器 */	

	/* 初始化OK按键变量,支持按下 */
	s_BtnOk.IsKeyDownFunc = IsKeyDownOk;			/* 判断按键按下的函数 */
	s_BtnOk.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnOk.LongTime = 0;							/* 长按时间 */
	s_BtnOk.Count = s_BtnOk.FilterTime / 2;			/* 计数器设置为滤波时间的一半 */
	s_BtnOk.State = 0;								/* 按键缺省状态,0为未按下 */
	s_BtnOk.KeyCodeDown = KEY_DOWN_JOY_OK;			/* 按键按下的键值代码 */
	s_BtnOk.KeyCodeUp = KEY_UP_JOY_OK;				/* 按键弹起的键值代码,0表示不检测 */
	s_BtnOk.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnOk.RepeatSpeed = 0;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnOk.RepeatCount = 0;						/* 连发计数器 */	

	/* 初始化组合按键变量,支持按下 */
	s_BtnUserTamper.IsKeyDownFunc = IsKeyDownUserTamper;	/* 判断按键按下的函数 */
	s_BtnUserTamper.FilterTime = BUTTON_FILTER_TIME;		/* 按键滤波时间 */
	s_BtnUserTamper.LongTime = 0;							/* 长按时间 */
	s_BtnUserTamper.Count = s_BtnUserTamper.FilterTime / 2;	/* 计数器设置为滤波时间的一半 */
	s_BtnUserTamper.State = 0;								/* 按键缺省状态,0为未按下 */
	s_BtnUserTamper.KeyCodeDown = KEY_DOWN_USER_TAMPER;		/* 按键按下的键值代码 */
	s_BtnUserTamper.KeyCodeUp = 0;							/* 按键弹起的键值代码,0表示不检测 */
	s_BtnUserTamper.KeyCodeLong = 0;						/* 按键被持续按下的键值代码,0表示不检测 */
	s_BtnUserTamper.RepeatSpeed = 0;						/* 按键连发的速度,0表示不支持连发 */
	s_BtnUserTamper.RepeatCount = 0;						/* 连发计数器 */
}

/*
*********************************************************************************************************
*	函 数 名: bsp_DetectButton
*	功能说明: 检测一个按键。非阻塞状态,必须被周期性的调用。
*	形    参:按键结构变量指针
*	返 回 值: 无
*********************************************************************************************************
*/
static void bsp_DetectButton(BUTTON_T *_pBtn)
{
	/* 如果没有初始化按键函数,则报错
	if (_pBtn->IsKeyDownFunc == 0)
	{
		printf("Fault : DetectButton(), _pBtn->IsKeyDownFunc undefine");
	}
	*/

	if (_pBtn->IsKeyDownFunc())
	{
		if (_pBtn->Count < _pBtn->FilterTime)
		{
			_pBtn->Count = _pBtn->FilterTime;
		}
		else if(_pBtn->Count < 2 * _pBtn->FilterTime)
		{
			_pBtn->Count++;
		}
		else
		{
			if (_pBtn->State == 0)
			{
				_pBtn->State = 1;

				/* 发送按钮按下的消息 */
				if (_pBtn->KeyCodeDown > 0)
				{
					/* 键值放入按键FIFO */
					bsp_PutKey(_pBtn->KeyCodeDown);
				}
			}

			if (_pBtn->LongTime > 0)
			{
				if (_pBtn->LongCount < _pBtn->LongTime)
				{
					/* 发送按钮持续按下的消息 */
					if (++_pBtn->LongCount == _pBtn->LongTime)
					{
						/* 键值放入按键FIFO */
						bsp_PutKey(_pBtn->KeyCodeLong);						
					}
				}
				else
				{
					if (_pBtn->RepeatSpeed > 0)
					{
						if (++_pBtn->RepeatCount >= _pBtn->RepeatSpeed)
						{
							_pBtn->RepeatCount = 0;
							/* 常按键后,每隔10ms发送1个按键 */
							bsp_PutKey(_pBtn->KeyCodeDown);														
						}
					}
				}
			}
		}
	}
	else
	{
		if(_pBtn->Count > _pBtn->FilterTime)
		{
			_pBtn->Count = _pBtn->FilterTime;
		}
		else if(_pBtn->Count != 0)
		{
			_pBtn->Count--;
		}
		else
		{
			if (_pBtn->State == 1)
			{
				_pBtn->State = 0;

				/* 发送按钮弹起的消息 */
				if (_pBtn->KeyCodeUp > 0)
				{
					/* 键值放入按键FIFO */
					bsp_PutKey(_pBtn->KeyCodeUp);			
				}
			}
		}

		_pBtn->LongCount = 0;
		_pBtn->RepeatCount = 0;
	}
}

/*
*********************************************************************************************************
*	函 数 名: bsp_KeyPro
*	功能说明: 检测所有按键。非阻塞状态,必须被周期性的调用。
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_KeyPro(void)
{
	bsp_DetectButton(&s_BtnUser);		/* USER 键 */
	bsp_DetectButton(&s_BtnTamper);		/* TAMPER 键 */
	bsp_DetectButton(&s_BtnWakeUp);		/* WAKEUP 键 */
	bsp_DetectButton(&s_BtnUp);			/* 摇杆UP键 */
	bsp_DetectButton(&s_BtnDown);		/* 摇杆DOWN键 */
	bsp_DetectButton(&s_BtnLeft);		/* 摇杆LEFT键 */
	bsp_DetectButton(&s_BtnRight);		/* 摇杆RIGHT键 */
	bsp_DetectButton(&s_BtnOk);			/* 摇杆OK键 */
	bsp_DetectButton(&s_BtnUserTamper);	/* 组合键 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -