触摸按键程序key.c


#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();
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流动的星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值