单片机_按键——单击,双击,长按

c 复制代码
#define KEY_DOWN_return           1  //单击
#define KEY_Double_return         2  //双击
#define KEY_Long_return           3  //长按
#define KEY_LONG_FREE_return      6  //长按结束

#define double_time_MIN       80  //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX   120  //长按,超过这个时间则认为是长按;
#define Dithering_MIN         5  //消抖值
#define UP_KEY_Count        5  //抬起值

#define KEY_UP      1//按键抬起
#define KEY_Down    0//按键按下

#define KEY_Number_MAX  1 //按键个数,开辟多少字节数组

#define KEY1_adder    0 //按键计数数组地址
//#define KEY2_adder   1 //按键计数数组地址
//#define KEY3_adder   2 //按键计数数组地址

#define  Read_Key1_Value    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)//读取按键1的值

unsigned int  KEY_Count_time[KEY_Number_MAX];//按键计时,调用的时候,要填按键地址,避免重复
unsigned char KEY_up_clsse_time[KEY_Number_MAX];//按键抬起取消计时,
unsigned char KEY_Count_down[KEY_Number_MAX];//按键按下次数
unsigned char KEY_Dithering[KEY_Number_MAX];//按键消抖

unsigned char KEY_event[KEY_Number_MAX];//按键的事件
unsigned char KEY_Read[KEY_Number_MAX];//按键读取状态

/*
    * @name   Button_all_state
    * @brief  MUC按键检测
    * @param
    * @retval None
    * othen: 历遍所有的按键
*/
void  Button_all_state()
{

    KEY_Read[KEY1_adder]=Read_Key1_Value;
    //  KEY_event[KEYX_adder]=Read_KeyX_Value;
}
/*
    * @name   KEY_Detect
    * @brief
    * @param
    * @retval None
    * othen:按键检查函数,传递不同的值,实现不同的按键按下
*/
void  KEY_Detect()
{
    unsigned char i=0;
    Button_all_state();//更新按键状态

   for(i=0;i<KEY_Number_MAX;i++) //历遍
   {
       if(KEY_Read[i]==KEY_Down)//按键按下
       {


           if(KEY_Dithering[i] > Dithering_MIN)//消抖值
           {

               if(KEY_Count_time[i] >= Long_press_time_MAX)
               {
                   KEY_event[i] = KEY_Long_return;
               }
               else
               {
                   KEY_Count_time[i]++;
               }
               if(KEY_up_clsse_time[i] != 0)
               {
                   KEY_up_clsse_time[i] =0;
                   KEY_Count_down[i]++;
               }
           }
           else
           {
               KEY_Dithering[i]++;
               KEY_Read[i]=0;//按键刷新
           }

       }
       else//按键松开
       {

           if( ++KEY_up_clsse_time[i] > UP_KEY_Count) {//按键抬起

               if ((KEY_Count_time[i] < double_time_MIN)&& ( KEY_Count_down[i] >= 2) ) { //双击
                     KEY_event[i] =  KEY_Double_return;
                     KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               else if((KEY_Count_time[i] > 1)&&(KEY_Count_time[i] < Long_press_time_MAX)){ //单击
                     KEY_event[i] = KEY_DOWN_return ;
                     KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               else if(KEY_Count_time[i] > Long_press_time_MAX){ //长按抬起
                   KEY_event[i] = KEY_LONG_FREE_return;
                   KEY_up_clsse_time[i] = UP_KEY_Count;
               }
               KEY_up_clsse_time[i] =0;
               KEY_Count_time[i]= 0;//按键计时更新
               KEY_Dithering[i] = 0;//消抖更新
               KEY_Read[i]=0;//按键刷新
               KEY_Count_down[i]=0;
           }

       }

   }
}

调用

c 复制代码
          KEY_Detect();
          if(KEY_event[KEY1_adder] ==  KEY_DOWN_return )
          {
              printf("单击\r\n");
              KEY_event[KEY1_adder]=0;
          }
          else if(KEY_event[KEY1_adder] ==  KEY_Double_return  )
          {
              printf("双击\r\n");
              KEY_event[KEY1_adder]=0;
          }
          else if(KEY_event[KEY1_adder] ==  KEY_Long_return )
          {
              printf("长按\r\n");
              KEY_event[KEY1_adder]=0;
          }
相关推荐
Groundwork Explorer9 小时前
W5500 网卡编程初始化与使用指南
python·单片机
智闲电子设计11 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen13 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub13 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤13 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀14 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎14 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Be for thing16 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习
郎哥编程课堂17 小时前
单片机零基础训练营第2天:嵌入式开发常用的三种进制
单片机·嵌入式硬件
LCG元17 小时前
STM32 DAC+DMA+定时器触发生成任意波形:数据对齐陷阱、输出缓冲器选型与频率精度实测
stm32·单片机·嵌入式硬件