【蓝桥杯嵌入式国赛】按键单击、双击、长按

前言:在之前的博客中,已经发布了按键仅单击判断的程序【蓝桥杯嵌入式】以定时中断的方式处理按键,现通过修改Keyprocess()函数和Key结构体来进行双击和长按的判断

修改struct Key:

struct Keys{
	uint8_t state;
	uint16_t flag;
	uint8_t times;
	uint8_t SingleSignal; //500ms-
	uint8_t DoubleSignal; //500ms wait 200ms
	uint8_t LongSignal;   //500ms+
};

修改KeyProcess():

void KeyProcess(){
	Key[0].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	Key[1].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
	Key[2].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
	Key[3].state = !HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	
	for(int i=0;i < 4;i++){
		//按下
		if(Key[i].state == 1){
			if(Key[i].flag < 50){
				Key[i].flag = 50;
				Key[i].times ++;
			}
			else{
				Key[i].flag ++;
			}
		}
		//抬起
		else{
			//长按判断500ms+
			if(Key[i].flag >= 50 + 50){
				Key[i].flag = 5;         //倒数50ms清除标志位
				Key[i].times = 0;		 //按下次数置0
				Key[i].LongSignal = 1;   //挂起长按标志位
			}
			//短按及等待双击
			else if(Key[i].flag < 50 + 50 && Key[i].flag >= 50){
				Key[i].flag = 20;        //等待200ms内的下次一按下
			}
			//倒计时
			else if(Key[i].flag > 0 && Key[i].flag < 50){
				Key[i].flag --;
			}
			//flag为0时操作
			else{
				//按下次数为1
				if(Key[i].times == 1){
					Key[i].SingleSignal = 1;//
					Key[i].flag = 5;
					Key[i].times = 0;
				}
				//按下次数为2
				else if(Key[i].times == 2){
					Key[i].DoubleSignal = 1;
					Key[i].flag = 5;
					Key[i].times = 0;	
				}
				//各标志位置0
				else{
					Key[i].times = 0;
					Key[i].SingleSignal = 0;
					Key[i].DoubleSignal = 0;
					Key[i].LongSignal = 0;
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值