#define uint unsigned int
typedef unsigned char uchar8;
//宏定义根据硬件来定义按键按下时的值
#define key_value_1 0xe0
#define key_value_2 0xd0
#define key_value_3 0xb0
#define key_value_4 0x70
#define key_null 0xf0
//定义按下,长按,连发,释放时按键的值
#define key_down 0x08
#define key_long 0x04
#define key_continue 0x02
#define key_up 0x01
//定义按键时间为长短按
#define key_long_num 200
#define key_continue_num 50
//定义按键的六种状态
#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
bit timecount=0;
//定义按键的IO
sbit key_1=P1^4;
sbit key_2=P1^5;
sbit key_3=P1^6;
sbit key_4=P1^7;
//初始化按键IO为读状态
void key_csh(void)
{
key_1=1;
key_2=1;
key_3=1;
key_4=1;
}
//通过按键按下的时候能够获取对应的按键值
static uchar8 getkey_num(void)
{
if(key_1==0) return key_value_1;
if(key_2==0) return key_value_2;
if(key_3==0) return key_value_3;
if(key_4==0) return key_value_4;
return key_null;
}
//判断按键是否为长按,短按,连发释放程序
void key_scan(uint *pkeyvalue)
{
uint temp=key_null;//反馈按键的值
static uint keystate=key_state_init;
static uint keytimecount=0;
static uint keylastnum=key_null;//存储最后的按键值
temp=getkey_num();//获取按键值
switch(keystate)
{
case key_state_init:
{
if(temp!=key_null)
{
keystate=key_state_wobble;
}
}
break;
case key_state_wobble:
keystate=key_state_press;
break;
case key_state_press:
{
if(temp!=key_null)
{
keylastnum=temp;//±
temp|=key_down;//
keystate=key_state_long;
}
else
{
keystate=key_state_init;//′
}
}
break;
case key_state_long:
{
if(temp!=key_null)//
{
if(timecount==1)
{
timecount=0;
if(++keytimecount>key_long_num)
{
keytimecount=0;
temp|=key_long;//3
keystate=key_state_continue;//
}
}
}
else
{
keystate=key_state_release;
}
}
break;
case key_state_continue:
{
if(temp!=key_null)
{
if(timecount==1)
{
if(++keytimecount>key_continue_num)
{
keytimecount=0;
temp|=key_continue;
}
}
}
else
{
keystate=key_state_release;
}
}
break;
case key_state_release:
{
keylastnum|=key_up;
temp=keylastnum;
keystate=key_state_init;
}
break;
default:
break;
}
*pkeyvalue=temp;
//P0=temp;
}
void time0_int() interrupt 1
{
TH0=0xee;
TL0=0x00;
timecount=1;
}
为了减少误解我没有附上主函数,放入每个case中P0=temp,temP的值与按键值或上按键状态值是相等的,但是出了switch *pkeyvalue=temp; P0=temp;temp值就不知道为什么不对了。初来乍到不知道怎么发帖还望多多包涵。 |