一种解决按键开关电平毛刺问题的算法

本文探讨了一种有效解决按键开关产生的电平毛刺问题的算法,该算法能够提高信号的稳定性和准确性,避免因毛刺导致的误触发。通过分析信号特征和设置滤波阈值,实现对毛刺的智能过滤,确保系统在处理按键输入时的可靠性。
摘要由CSDN通过智能技术生成

一种解决按键开关电平毛刺问题的算法


/*
* 通过检测按键开关的相应管脚电平状态来判断按键是否按下,
* 按键未按下时,对应管脚电平的为高,按下之后对应管脚电平变为低电平,
* 松开之后,回复高电平,通过电平变化的上升延来判断按键被按下
* 具体算法:主循环每轮进行一次电平采样,每次采样值保存在1Byte的最低位bit中
* (0:低电平,1:高电平),保存之前左移一位,确保保存的是最后的8次采样结果。
* 当值为0x0F时,认为按键被按下,进行相应的动作。
*
* 为解决电平毛刺问题,改为64bits,最高的16位为0,最低的16为1时,
* 进行相应的动作,中间32位忽略,经测试能较好解决毛刺问题。
*/

uint64_t SwAutoManualFlag = 0xFFFFFFFFFFFFFFFF;	//!!!不能初始化为0,
uint64_t SwPriSecFlag = 0xFFFFFFFFFFFFFFFF;	//线路切换按键,值为0x0000XXXXXXXXFFFF 时切换线路,!!!不能初始化为0,

void Process_Press_Button()		//处理按键开关
{	
	SwAutoManualFlag <<= 1;
	SwPriSecFlag <<= 1;
	
	if ( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_7 ))		//按键开关低电平中断信号,
	{
		SwAutoManualFlag |= 0x01;
	}
	if ( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6 ))		//按键开关低电平中断信号
	{
		SwPriSecFlag |= 0x01;
	}
	
	if ( (SwAutoManualFlag & 0xFFFF000000000000) == 0x0000000000000000
		 && (SwAutoManualFlag & 0x000000000000FFFF) == 0x000000000000FFFF  ) //检测到上升沿
	{
		//按键按下之后的处理函数
		SwAutoManualFlag = 0xFFFFFFFFFFFFFFFF;
	}
		if ( (SwPriSecFlag & 0xFFFF000000000000) == 0x0000000000000000
		&& (SwPriSecFlag & 0x000000000000FFFF) == 0x000000000000FFFF  )	//检测到上升沿
	{
			//按键按下之后的处理函数
			SwPriSecFlag = 0xFFFFFFFFFFFFFFFF;
	}
}
<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值