本帖最后由 xppx1987 于 2012-12-5 16:43 编辑
ayb_ice 发表于 2012-12-5 15:32 
推荐使用以下方式
换了您这种方法还是只有一个按键有效,现把自己按您说的方式修改的程序贴出来,看到底哪儿出错了?
//端口定义
#define io_key_1 RB0
#define io_key_2 RA1
#define BIT0 0x01
#define BIT1 0x02
//定义长按键的TICK 数,以及连发间隔的TICK 数
#define KEY_LONG_PERIOD 20
#define KEY_CONTINUE_PERIOD 5
//定义按键返回值状态(按下,长按,连发,释放)
#define KEY_DOWN 0x80
#define KEY_LONG 0x40
#define KEY_CONTINUE 0x20
#define KEY_UP 0x10
//定义按键状态
#define KEY_STATE_INIT 0
#define KEY_STATE_WOBBLE 1
#define KEY_STATE_PRESS 2
#define KEY_STATE_LONG 3
#define KEY_STATE_CONTINUE 4
#define KEY_STATE_RELEASE 5
//键值读取函数
static uchar KeyScan(void)
{
uchar k=0;
if(io_key_1 == 0)
{
k|=BIT0;
}
if(io_key_2 == 0)
{
k|=BIT1;
}
return k;
}
//按键操作函数
void GetKey(uchar *pKeyValue)
{
static uchar s_u8KeyState=KEY_STATE_INIT;
static uchar s_u8KeyTimeCount=0;
static uchar s_u8LastKey=KEY_NULL; //保存按键释放时候的键值
uchar KeyTemp=0;
KeyTemp=KeyScan(); //获取键值
switch(s_u8KeyState)
{
case KEY_STATE_INIT :
{
if(KeyTemp!=0)
{
s_u8KeyState=KEY_STATE_WOBBLE ;
}
}
break ;
case KEY_STATE_WOBBLE: //消抖
{
s_u8KeyState=KEY_STATE_PRESS ;
}
break ;
case KEY_STATE_PRESS :
{
if(KeyTemp!=0)
{
s_u8LastKey=KeyTemp ; //保存键值,以便在释放按键状态返回键值
KeyTemp|=KEY_DOWN ; //按键按下
s_u8KeyState=KEY_STATE_LONG ;
}
else
{
s_u8KeyState=KEY_STATE_INIT ;
}
}
break ;
case KEY_STATE_LONG :
{
if(KeyTemp!=0)
{
if(++s_u8KeyTimeCount > KEY_LONG_PERIOD)
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_LONG ; //长按键事件发生
s_u8KeyState = KEY_STATE_CONTINUE ;
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ;
}
}
break ;
case KEY_STATE_CONTINUE :
{
if(KeyTemp!=0)
{
if(++s_u8KeyTimeCount>KEY_CONTINUE_PERIOD)
{
s_u8KeyTimeCount=0;
KeyTemp |= KEY_CONTINUE;
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE;
}
}
break;
case KEY_STATE_RELEASE:
{
s_u8LastKey |= KEY_UP;
KeyTemp = s_u8LastKey;
s_u8KeyState = KEY_STATE_INIT;
}
break;
default: break;
}
*pKeyValue=KeyTemp ; //返回键值
}
void main()///////////函数主程序
{
float i,j;
while(1)
{
if(time10ms_ok==1)
{
time10ms_ok=0;
GetKey(&KeyValue);
if(KeyValue==(BIT0|KEY_DOWN))
{
j++;
}
if(KeyValue==(BIT1|KEY_DOWN))
{
i++;
}
}
}
}
|