低端单片机处理按键的 单击(短按),长按,双击(无需占用定时器资源)

以下是不使用定时器处理按键的单击双击长按

需要定义一个标志位,和两个变量。

还需要关注短按30ms函数大概执行600次,长按3s 大概60000次,具体次数可以根据硬件和软件做相应修改。

typedef struct
{
        uint8_t KEY_FLAG;
        uint32_t Key_press_cnt;
        uint32_t Key_nopress_cnt;    
} KEY_STR;

KEY_STR  SW1_S;
void KEY_Scan(void)
{
		if(BSP_PB_GetState(SW1)==SET)
		{
				SW1_S.Key_nopress_cnt =0;
				SW1_S.Key_press_cnt ++;
				if(SW1_S.Key_press_cnt >= 600 && SW1_S.Key_press_cnt < 1000)
				{		
						if(SW1_S.KEY_FLAG == 2 ||SW1_S.KEY_FLAG == 3)
						{
								SW1_S.KEY_FLAG = 3;
								SW1_S.Key_nopress_cnt = 0;
						}
						else
						{
								SW1_S.KEY_FLAG = 1;
						}
				}
				else if(SW1_S.Key_press_cnt >= 60000)  //长按处理
				{
						BSP_LED_Toggle(LED1);
						SW1_S.KEY_FLAG = 0;
						SW1_S.Key_press_cnt = 1000;
				}				
		}
		else
		{
				SW1_S.Key_press_cnt =0;
				SW1_S.Key_nopress_cnt ++;
				if(SW1_S.KEY_FLAG == 1)
				{
						SW1_S.KEY_FLAG = 2;
				}
				else if(SW1_S.KEY_FLAG == 2)
				{
						if(SW1_S.Key_nopress_cnt >= 6000) //单击处理
						{
								SW1_S.KEY_FLAG = 0;
								BSP_LED_Toggle(LED3);			
						}
				}
				else if(SW1_S.KEY_FLAG == 3) //双击处理
				{
						BSP_LED_Toggle(LED2);
						SW1_S.KEY_FLAG = 0;
				}
		}
}

低端单片机处理按键的 单击(短按),长按,双击(无需占用定时器资源)工程源码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值