按键单击与双击

  • 按键的单击与双击与长按短按实现方式相近,以下代码仅供参考,写得不是很好
  • 适用于蓝桥杯开发板
  • 程序扩展性不强,更重要的是思路

io.h

#ifndef _IO_H
#define _IO_H
#include "stm32f10x.h"

#define SingleClick 1
#define DoubleClick 2

#define KEY_B1 1
#define KEY_B2 2
#define KEY_B3 3
#define KEY_B4 4

#define TimeInterval 300 //判断双击与单击时间 

#define keyState1 1
#define keyState2 2
#define keyState3 3
#define keyState4 4

//enum ss{keyState1,keyState2,keyState3,keyState4}keyState;

#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

enum k{key0,key1,key2,key3};

extern void Delay_Ms(u32 nTime);

void RCC_Init(void);
void IO_Init(void);
void LED_Control(u16 nled , u8 flag);

u8 KEY_Scan(void);
void Key_Double(void);

#endif

io.c

u8 KEY_Scan(void)//按键扫描函数,查找键值
{
    static u8 flag = 1;

    if(flag&&(KEY0==0||KEY1==0||KEY2==0||KEY3==0))
    {
        Delay_Ms(10);
        flag = 0;
        if(KEY0==0)return key0;
        else if(KEY1==0)return key1;
        else if(KEY2==0)return key2;
        else if(KEY3==0)return key3;
    }
    else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)flag = 1;

    return 0xff;
}

//单击双击
/*
    1、两次间隔10ms - 300ms以内是双击, 按下第一次开始计时
    2、300ms 之后没有按下第二次就是单击
    3、思路与我按键单击双击的思维在方向上不太一样,这里是直接状态中判断按键
*/
void Key_Double(void)
{
    static u8 key_value = 0xff;
//  static u16 keynum1 = 0,keynum2 = 0;
    static u8 key = 0; //记录第一次按键是谁按下

    switch(keyState)//keyState见宏定义,是按键第一次按下
    {
        case keyState1: key_value = KEY_Scan(); 
                        if(key_value != 0xff){
//                          keynum1 = keyTime;
                            flag_1 = 1;
                            keyState = keyState2;

                            if(key_value==key0)key = 1;
                            else if(key_value==key1)key = 2;
                            else if(key_value==key2)key = 3;
                            else if(key_value==key3)key = 4;
                        }
                        else 
                        {
                            flag_1 = 0;
                            keyState = keyState1;
                        }           
                        break;
        case keyState2: key_value = KEY_Scan();
                        if(keyTime<300)
                        {
                            switch(key)
                            {
                                case 1:if(key_value==key0){
                                            keyDouble = KEY_B1;flag_1 = 0;
                                            keyTime = 0;
                                            keyState = keyState1;
                                        }   break;
                                case 2:if(key_value==key1){
                                            keyDouble = KEY_B2;flag_1 = 0;
                                            keyTime = 0;
                                            keyState = keyState1;
                                        }   break;
                                case 3:if(key_value==key2){
                                            keyDouble = KEY_B3;flag_1 = 0;
                                            keyTime = 0;
                                            keyState = keyState1;
                                        }   
                                        break;
                                case 4:if(key_value==key3){
                                            keyDouble = KEY_B4;flag_1 = 0;
                                            keyTime = 0;
                                            keyState = keyState1;
                                        }   
                                        break;
                            }   
                        }
                        else 
                        {
                            switch(key)
                            {
                                case 1:keySingle = KEY_B1;      break;
                                case 2:keySingle = KEY_B2;      break;
                                case 3:keySingle = KEY_B3;      break;
                                case 4:keySingle = KEY_B4;      break;
                            }
                            flag_1 = 0;
                            keyTime = 0;
                            keyState = keyState1;
                            key = 0;
                        }
                        break;
        case keyState3: 
                        break;
        case keyState4:                             
                        break;
        default:    break;
    }
}

推荐阅读更多精彩内容