×
单片机 > 单片机程序设计 > 详情

STM32按键程序

发布时间:2020-06-05 发布时间:
|
u8 KEY_Scan(u8 mode)
{
			static u8 key_up=1;//按键按松开标志
			if(mode)key_up=1; //支持连按
			if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
		{
				delay_ms(10);//去抖动
				key_up=0;
				if(KEY0==0)return 1;
				else if(KEY1==0)return 2;
				else if(KEY2==0)return 3;
				else if(KEY3==1)return 4;
		}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
		return 0;// 无按键按下
}123456789101112131415

static是静态变量只会执行一次
if(key_up&&(KEY00||KEY10||KEY20||KEY31))这句意思是如果keyup为1,同时key0123中有一个按键被按下,那么if为真,执行取值操作,作为返回值付给主函数的t,
else if(KEY01&&KEY11&&KEY21&&KEY30)key_up=1;这个意思是如果上面的if为假,那么如果key0123没有一个被按下,那么keyup置1,
我们来分析如果不支持连按的情况,mode为0,
一开始你没按按键那么if(key_up&&(KEY00||KEY10||KEY20||KEY31))为假不执行后面的语句执行elseif应为keyup没变过,所以没什么用。
假设你按的是key0,那么KEY00||KEY10||KEY20||KEY31为真,执行后面的语句,把keyup置0后,取出按键值,作为函数返回值送会给t,
如果你继续按着当下次按键扫描时到来时,static u8 key_up=1,这个只执行一次,同时mode又为0,那么keyup还是0,
然后执行到if(key_up&&(KEY00||KEY10||KEY20||KEY31))这句,由于keyup是0所以不会执行if语句,执行elseif,但是你此时有有一个按键是被按下的,所以elseif里的keyup=1也不会被执行,因为elseif也是假的。然后返回值还是0,这就达到了不支持连按的目的
如果你按过之后送手了那么再看,if(key_up&&(KEY00||KEY10||KEY20||KEY31))这条语句为假应为keyup为0执行elseif,此时由于你没有按按钮,所以会执行keyup=1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。
同理可以分析出mode为1时的支持连按的情况





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址