#include "global.h"
#define u8 unsigned char
#define u16 unsigned int
#define WaitStatus 0 //按键过程的状态
#define PressStatus 1
#define ReleaseStatus 2
#define IDEStatus 3
#define KeyTime 800 //长按超时时间
#define KEY_TIME 1
#define KEY_UP 2
#define KEY_SWITCH 3
#define KEY_DOWN 4
#define KEY_SLEEP 5
u8 KeyStatus=0;
u16 KeyCnt=0;
u8 KeyVal=0;
u8 KeyPress=0;//1按下,2长按
//获取每个按键的状态
u8 getkey()
{
//DATA_BUF[0]的bit7-bit0 代表触摸按键KEY8-KEY1
//DATA_BUF[1]的bit7-bit0 代表触摸按键KEY16-KEY9
GET_KEY_BITMAP();//将函数库扫描的结果复制到DATA_BUF里
if((DATA_BUF[0]&0x20)==0x20)return 1;//TK1
else if((DATA_BUF[0]&0x01)==0x01)return 2;//TK2
else if((DATA_BUF[0]&0x02)==0x02)return 3;//TK1
else if((DATA_BUF[0]&0x80)==0x80)return 4;//TK4
else if((DATA_BUF[1]&0x01)==0x01)return 5;//TK5
return 0;
}
void keyscan()
{
static u8 i=0;
u8 temp;
temp=getkey();
switch(KeyStatus)
{
case WaitStatus: //等待状态
if(temp!=0x00)
{
if(++i>=3)
{
i=0;
KeyStatus=PressStatus;
}
}
else
{
i=0;
}
break;
case PressStatus: //按下状态
if(temp!=0x00)
{
KeyVal=temp;
KeyStatus=ReleaseStatus;
}
else
{
KeyStatus=WaitStatus;
}
break;
case ReleaseStatus: //等待释放状态
if(temp!=0x00)
{
if(++KeyCnt==KeyTime) //长按检测
{
KeyPress=2;
KeyStatus=IDEStatus;
KeyCnt=0;
}
}
else
{
KeyCnt=0;
KeyStatus=WaitStatus;
KeyPress=1;
}
break;
case IDEStatus:
if(temp==0x00)
{
KeyStatus=WaitStatus;
}
break;
}
}
//#define KEY_TIME 1
//#define KEY_UP 2
//#define KEY_SWITCH 3
//#define KEY_DOWN 4
//#define KEY_SLEEP 5
//函数库的主循环 相当于不用函数库时while(1)里面的循环
void Task_key(void)
{
_BEGIN(100);
keyscan();//按键扫描
if(KeyPress==1)//短按
{
switch(KeyVal)
{
case KEY_TIME:
device_status = SET_TIME_STUTAS;
break;
case KEY_UP:
if(device_status == SET_TIME_STUTAS)
{
set_time ++;
}
else if((device_status == RUN_STATUS)|(device_status == WAIT_STUTAS))
{
set_temperature ++;
device_status = SET_TEM_STUTAS;
}
break;
case KEY_SWITCH:
if(device_status == WAIT_STUTAS)
{
device_status = RUN_STATUS;
}
else if(device_status == RUN_STATUS)
{
device_status = WAIT_STUTAS;
}
break;
case KEY_DOWN:
if(device_status == SET_TIME_STUTAS)
{
set_time --;
}
else if((device_status == RUN_STATUS)|(device_status == WAIT_STUTAS))
{
set_temperature --;
device_status = SET_TEM_STUTAS;
}
break;
case KEY_SLEEP:
break;
}
KeyPress=0;
}
else if(KeyPress==2)//长按
{
switch(KeyVal)
{
case 1:break;
case 2:break;
case 3:break;
case 4:break;
}
KeyPress=0;
}
_END();
}