文章目录
- 独立按键原理图
- 三行代码法
- 简单概述
- 代码书写
- 键码推算
- 如何使用
- 短按键
- 长按键
 
 
- 状态机法
- 简单概述
- 代码书写
- 键码推算
- 如何使用
- 短按键
- 长按键
 
 
- 现象
独立按键原理图

三行代码法
简单概述

代码书写
u8 Trg = 0x00;//短按键
u8 Cont = 0x00;//长按键
void BtnThree(void)
{
	u8 readata = P3^0xff;
	Trg = readata&(readata^Cont);
	Cont = readata;
}
键码推算
键码口诀 “ 从下到上 8421”
比如:没有按键按下
 readata = 0xff ^ 0xff = 0x00;
 Trg = 0x00&(0x00 ^ 0x00) = 0x00;
 Cont = 0x00;
比如:S7按下
 readata = 0xfe ^ 0xff = 0x01;
 Trg = 0x01&(0x01 ^ 0x00) = 0x01;
 Cont = 0x01;
 第一种情况:接着未松手(下一个10ms来了):
 readata = 0xfe ^ 0xff = 0x01;
 Trg = 0x01&(0x01 ^ 0x01) = 0x00;
 Cont = 0x01;
 第二种情况:松手了
 readata = 0xff ^ 0xff = 0x00;
 Trg = 0x00&(0x00 ^ 0x01) = 0x00;
 Cont = 0x00;
因此可以理解:Trg 保存的是短按键状态,Cont保存的是长按键状态
如何使用
短按键
功能:
 s7点亮led1
 s6熄灭led1
 s5点亮led1
 s4熄灭led1
u8 btn_cnt =0 ;
void BtnTask()
{
	if(btn_cnt>=10){
		btn_cnt = 0;
		BtnThree();
		if((Trg&0x01)==0x01){//s7
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if((Trg&0x02)==0x02){//s6
			DeviceCtrl(0x80,0xff);//open led1
		}		
		if((Trg&0x04)==0x04){//s5
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if((Trg&0x08)==0x08){//s4
			DeviceCtrl(0x80,0xff);//open led1
		}		
	}
}
长按键
功能:
 按下s7不送手点亮led1
 松手熄灭led1
u8 btn_cnt =0 ;
void BtnTask()
{
	if(btn_cnt>=10){
		btn_cnt = 0;
		BtnThree();
		if(Cont==0x01){		//s7为长按键
			DeviceCtrl(0x80,0xfe);//按下不松开 open led1
		}
		if((Trg==0x00)&&(Cont==0x00)){	//松手检测
			DeviceCtrl(0x80,0xff);//松手 close led1
		}	
	}
}
状态机法
简单概述

代码书写
u8 BtnState(void)
{
	static u8 keystate = 0;
	u8 keyreturn =0;
	u8 keypress = 0;
	
	keypress = P3&0x0f;
	
	switch(keystate){
		case 0: if(keypress!=0x0f){keystate=1;}break;
		case 1:	if(keypress!=0x0f){//确实有按键按下
							if(keypress==0x07){keyreturn = 4;break;}
							if(keypress==0x0b){keyreturn = 5;break;}
							if(keypress==0x0d){keyreturn = 6;break;}
							if(keypress==0x0e){keyreturn = 7;break;}
							keystate=2;
						}else{	//是抖动
							keystate=0;
						}
						break;
		case 2:if(keypress==0x0f){keystate=0;} break;//等待松手	
	}
	return keyreturn;
}
键码推算
键码口诀 “从下到上 7bde”
 比如:S7被按下
 keypress = 0x0f&0x0e = 0x0e;
如何使用
短按键
功能同三行代码法的短按键一样
u8 btn_val;//缓存键码
u8 btn_cnt =0 ;
void BtnTask()
{
	if(btn_cnt>=10){
		btn_cnt = 0;
		btn_val = BtnState();//获取哪个按键被按下的键码
		if(btn_val==4){
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if(btn_val==5){
			DeviceCtrl(0x80,0xff);//close led1
		}
		if(btn_val==6){
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if(btn_val==7){
			DeviceCtrl(0x80,0xff);//close led1
		}
	}
}
长按键
功能同三行代码法的短按键一样
u8 btn_cnt =0 ;
void BtnTask()
{
	if(btn_cnt>=10){
		btn_cnt = 0;
		btn_val = BtnState();//获取哪个按键被按下的键码
		if(btn_val==7){		// 按下s7没松手
			DeviceCtrl(0x80,0xfe);//open led1
		}else{						//按下 s7 松手了
			DeviceCtrl(0x80,0xff);//close led1
		}
	}
}
现象
(七)独立按键
----- 如有错误欢迎大家批评指正!!!



















