按键扫描函数 —— KEY_Scan(u8 mode)`

按键扫描函数 —— KEY_Scan(u8 mode)`

STM32F407

首先强调的是,上键默认为低电平,下键、左键和右键默认为高电平。即上键按下时,默认电平从低电平变为高电平,产生一个上升沿信号,下键、左键和右键任意一个按下时,默认电平从高电平变为低电平,产生一个下降沿信号。

这是为下面程序中if(key_up && (KEY0=0 || KEY1=0 || KEY2=0 || WK_UP=1))为什么这样写做铺垫。

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;   /*按键按松开标志,key_up=1为无按键按下,key_up=0为有按键按下*/
	
	if(mode)key_up=1;    //支持连按		  
	if(key_up && (KEY0==0||KEY1==0||KEY2==0||WK_UP==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(WK_UP==1)return 4;
	}
	else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;  /*还是默认电平,说明无按键按下*/	    
 	return 0;
}

在主函数里,根据 KEY_Scan 函数的返回值,判定哪个按键按下,从而进行下一步操作。

static是静态变量只会执行一次,具有记忆功能。
连按就是一直按的意思,按一下松开不属于连按的意思

if(key_up&&(KEY00||KEY10||KEY20||KEY31))这句意思是如果key_up为1,同时KEY0、KEY1、KEY2、KEY3中有一个按键被按下,那么if为真,执行取值操作,作为返回值赋给主函数,else if(KEY01&&KEY11&&KEY21&&KEY30)key_up=1;这个意思是如果上面的if为假,那么如果KEY0、KEY1、KEY2、KEY3没有一个被按下,那么key_up置1。

1、mode = 0时不支持连按的情况

一开始你没按下按键,那么if(key_up&&(KEY00||KEY10||KEY20||KEY31))为假,则不执行后面的语句,直接执行else if, key_up仍为1,没变过,所以没什么用。
假设你按的是KEY0,那么KEY00||KEY10||KEY20||KEY31为真,执行后面的语句,把key_up置0后,取出按键值,作为函数返回值送会给主函数;如果你继续按着按键,当下次按键扫描时到来时,static u8 key_up=1,这个只执行一次,所以它就不执行了,此时mode又是0,key_up也为0,
然后执行到if(key_up&&(KEY00||KEY10||KEY20||KEY31))这句,由于key_up是0所以不会执行if语句,直接执行else if,但是你此时有一个按键是被按下的,所以else if里的key_up =1也不会被执行,所以else if也是假的,然后返回值是0,代表无按键按下,这就达到了不支持连按的目的。
如果你按过之后,松手了,if(key_up&&(KEY00||KEY10||KEY20||KEY31))这条语句为假,应为key_up为0,执行else if,此时由于你没有继续按下按钮,所以会执行key_up =1这条语句,当下次扫描按钮来临时又恢复到了最初的情况。

2、mode = 1时支持连按的情况

起始是key_up =1,假如按下的是KEY0键,而且是一直按着的,从头开始执行程序时,if(key_up&&(KEY0== 0||KEY1 == 0||KEY2 == 0||KEY3== 1))为真,则执行下面的语句,key_up = 1变为key_up = 0了,而且还会返回1、2、3、4中的一个数值给主函数;由于KEY0== 0,故不满足else if,所以最后返回0。到此,第一次扫描就结束了,该从头开始第二次扫描了,由于mode=1,满足if(mode) key_up=1这个语句,所以key_up 又为1了,这个语句就是与mode=0不支持连按的最大区别。所以key_up=1了,且一直按着按键,故又满足第一次扫描的条件,又给主函数返回一个数值,故一直按着,就会一直起作用,这就是支持连按的现象。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值