文章目录
- 独立按键原理图
- 三行代码法
- 简单概述
- 代码书写
- 键码推算
- 如何使用
- 短按键
- 长按键
- 状态机法
- 简单概述
- 代码书写
- 键码推算
- 如何使用
- 短按键
- 长按键
- 现象
独立按键原理图
三行代码法
简单概述
代码书写
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
}
}
}
现象
(七)独立按键
----- 如有错误欢迎大家批评指正!!!