#include "key.h"
#define key_state_0 0 //按键的初始状态
#define key_state_1 1 //按键按下的状态
#define key_state_2 2 //按键长按的状态
#define key_state_3 3 //按键释放的状态
#define KEY_NUM 5
static unsigned char keyStates[KEY_NUM];
unsigned char readKey(unsigned char keyNumber)
{
unsigned int *keyState = &keyStates[keyNumber-1];
unsigned int keyPress; //按键是否被按下
unsigned int keyReturn = 0; //按键返回值
unsigned int flag=0;
switch(keyNumber)
{
case 1:
keyPress = KEY1; // 读按键I/O电
break;
case 2:
keyPress = KEY2;
break;
case 3:
keyPress = KEY3;
break;
case 4:
keyPress = KEY4;
break;
case 5:
keyPress = KEY5;
break;
}
switch (*keyState)
{
case key_state_0: // 按键初始态
if (!keyPress)
{
*keyState = key_state_1;// 键被按下,状态转换到键确认态
}
break;
case key_state_1: // 按键确认态
if (!keyPress)
{
keyReturn = 1; // 按键仍按下,按键确认输出为“1”
*keyState = key_state_2;// 状态转换到键释放态
}
else
{
*keyState = key_state_0; // 按键已抬起,转换到按键初始态
}
break;
case key_state_2:
if (keyPress)
{
*keyState = key_state_0;//按键已释放,转换到按键初始态
}
else
{
flag++;
if(flag>=100)
{
keyReturn = 2;
*keyState = key_state_3;//按键已长按,转换到按键释放态
}
}
break;
case key_state_3:
if (keyPress)
{
*keyState = key_state_0;//按键已释放,转换到按键初始态
}
else
{
keyReturn = 2;
}
break;
}
return keyReturn; //返回按键值
}
void KeyInit()
{
unsigned int i;
for(i=0;i<KEY_NUM;i++)
{
keyStates[i] = key_state_0;
}
}
int KeyScan()
{
unsigned int key=0;
if(readKey(1) == 1) //按键返回值是1,第一个键按下
{
key=1;
}
else if(readKey(2) == 1) //按键返回值是1,第二个键按下
{
key=2;
}
else if(readKey(3) == 1) //按键返回值是1,第三个键按下
{
key=3;
}
else if(readKey(4) == 1) //按键返回值是1,第四个键按下
{
key=4;
}
else if(readKey(5) == 1) //按键返回值是1,第五个键按下
{
key=5;
}
else if(readKey(2) == 2) //按键返回值是2,第二个键长按(+)
{
key=6;
}
else if(readKey(3) == 2) //按键返回值是2,第三个键长按(-)
{
key=7;
}
return key; //以上都不满足则返回0,什么都没按下
}