u8 getkey2()
{
u8 static key_scaned_times_counter;
u8 static last_key_scan_flags;
u8 key_scan_flags=0,key_return=0;
BitStatus pin_read_result;
KEY_SCAN_STATUS static key_scan_status=NO_KEY_SCANED;
//这里是开始读取key
pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_0);
if(pin_read_result)
{
key_scan_flags|=KEY0_FLAG;
}
//扫描key1,这些都是低有效 youbian pc2
pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_1);
if(!pin_read_result)
{
key_scan_flags|=KEY1_FLAG;
}
//扫描key2 //zuobian pc3
pin_read_result=GPIO_ReadInputPin (KEY_GPIO_PORT,KEY_2);
if(!pin_read_result)
{
key_scan_flags|=KEY2_FLAG;
}
//这里没有扫到按键也是要进入判断程序的
switch(key_scan_status)//使用前面的key_scan_flags数据
{
case NO_KEY_SCANED:
if(key_scan_flags!=0)
{//只有按键按下,才保留前序值。
last_key_scan_flags=key_scan_flags;
key_scaned_times_counter=0;
key_scan_status=KEY_SCANED;
}
break;
case KEY_SCANED:
if(last_key_scan_flags==key_scan_flags)
{
key_scaned_times_counter++;
if(key_scaned_times_counter>250)
key_scaned_times_counter=0;
//如果一直按着建,那么255个重复扫描到长按
if(key_scaned_times_counter==40)
{
switch(key_scan_flags)
{
case KEY0_FLAG:
key_return=KEY_0_LONG_CODE;
break;
case KEY1_FLAG:
key_return=KEY_1_LONG_CODE;
break;
case KEY2_FLAG:
key_return=KEY_2_LONG_CODE;
break;
case KEY3_FLAG:
key_return=KEY_3_LONG_CODE;
break;
}
}
}
else
{//如果按键和前面的不同,但是也不是0,那么什么也不做。不执行这里的任何代码
//只有相同的才能加计数器,只有不同的,但是0,才有机会设置返回值。
//只有相同,才能加计数器,才能返回long,只有按键标记是定义的几个,才能返回真正的值,其他只是加计数器
if( key_scan_flags==0&&
(key_scaned_times_counter<5||
key_scaned_times_counter>30)
)
{//如果松下时间小于5或者大于30,都是取消按键,大于30
//只要在按键按入的情况下,和上次按键不同了,那就不扫描了
key_scan_status=NO_KEY_SCANED;
// last_key_scan_flags=key_scan_flags;
}
if(key_scan_flags==0&&
key_scaned_times_counter>=5&&
key_scaned_times_counter<=30)//30和40之间的,不知道长度,不识别。
{//按下时间大于5,松开时间小于30,则是单击
key_scan_status=NO_KEY_SCANED;
switch(last_key_scan_flags)
{
case KEY0_FLAG:
key_return=KEY_0_CODE;
break;
case KEY1_FLAG:
key_return=KEY_1_CODE;
break;
case KEY2_FLAG:
key_return=KEY_2_CODE;
break;
case KEY3_FLAG:
key_return=KEY_3_CODE;
break;
}
}
}
break;
}
return key_return;
}
|