|
今天学到这个电路,那个连发的状态,不仔细试,还真不清楚是怎么实现的。
四个状态,按下,长按,连发和释放
按下,实现有消抖,长按,多按会才行,再多按,就会进入连发功能。本来以为所谓连发,只是给一个信号,要另编程序 实现,没想到,进入这个状态后,它是在连续的赋值,太神奇了。
这个程序要放在中断中,不断扫描才行。
//???????????
#define key_down 0x80 //????
#define key_long 0x40 // ????
#define key_continue 0x20 //????
#define key_up 0x10 // ???
void getkeyvalue(uint8 *pkeyvalue)
{
static uint8 keystate=0;
static uint8 timecount=0;
static uint8 lastkey=key_null; //
uint8 keytemp=key_null;
keytemp=keyscan();
switch(keystate)
{
case 0:
{
if (keytemp!=key_null)
{
keystate=1;
}
}
break;
case 1: //????
{
keystate=2;
}
break;
case 2:
{
if (keytemp!=key_null)
{
lastkey=keytemp; //??????
keytemp=keytemp|key_down;
keystate=3;
}
else
{
keystate=0;
}
}
break;
case 3:
{
if (keytemp!=key_null) //长按状态
{
if (++timecount>100) //长按阀值
{
timecount=0;
keytemp=keytemp|key_long;
keystate=4;
}
}
else
{
keystate=5;
}
}
break;
case 4:
{
if(key_null !=(keytemp))
{
if (++timecount>80) //进入这个状态后,计数超过80就重新赋值一次
{
timecount=0;
keytemp=keytemp|key_continue;
}
}
else
{
keystate=5;
}
}
break;
case 5: //释放状态
{
lastkey=lastkey|key_up;
keytemp=lastkey;
keystate=0;
}
break;
default:break;
}
*pkeyvalue=keytemp;
} |
|