专栏中心

EEPW首页 > 专栏 > STM32IO按键-长按-短按-双击

STM32IO按键-长按-短按-双击

发布人:我就是我lxw 时间:2013-04-25 来源:工程师 发布文章

#include "delay.h"
#include "sys.h"
#include "Key.h"
#include <stdlib.h>

#define KeyPin PAin(5)
typedef enum
{
 KeyDown,
 KeyUp,
 KeyShort,
 KeyLong
}KEYSTATE;
KEYSTATE KeyState;
void KeyPinInit(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能PB端口时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//KeyPin检测    
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
}
static u16 KeyDownTimes,KeyDoubleTimes;
void PollingKey(void)
{
 static u8 KeyStep;
 
 switch (KeyStep)
 {
  case 0:
  {
   if (!KeyPin)//有键按下
   {
    //printf("\r\n按下");
    KeyState = KeyDown;
    
    if (KeyDoubleTimes > 0)
    {
     KeyStep = 4;//双击
    }
    else
    {
     KeyStep = 2;//不是双击
    }
   }
   else if(KeyDoubleTimes > 0)
   {
    KeyDoubleTimes--;
    if ((KeyDoubleTimes == 0)&&(KeyState == KeyShort))
    {
     printf("\r\n短按处理");
     KeyState = KeyUp;
    }
   }
   
  }
   break;
  case 1://按下
  {
   if (!KeyPin)
   {
    KeyDownTimes++;
    if (KeyDownTimes < 2800)
    {
     KeyState = KeyShort;
    }
    else if(KeyState != KeyLong)
    {
     KeyState = KeyLong;
     printf("\r\n长按处理");
    }
    else if (KeyDownTimes >= 2800)//防止加满溢出
    {
     KeyDownTimes = 2800;
    }
   }
   else
   {
    KeyStep = 2;
   }
  }
   break;
  case 2://
  {
   if (KeyPin)//弹起
   {
    KeyStep = 3;
   }
   else//按下
   {
    KeyStep = 1;
   }
  }
   break;
  case 3://弹起
  {
   if (KeyPin)//弹起
   {
    if (KeyDownTimes < 2800)
    {
     KeyDoubleTimes = 500;
    }
    KeyDownTimes = 0;
    KeyStep = 0;
   }
   else
   {
    KeyStep = 2;
   }
  }
   break;
  case 4:
  {
   if (KeyPin)//如果弹起的话就执行
   {
    KeyState = KeyUp;
    printf("\r\n双击处理");
    KeyStep = 0;
   }
  }
   break;
 default:
  KeyStep = 0;
  break;
 }
 delay_us(100);
}

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

基于S3C44B0的布拉格光纤光栅传感信号处理系统

非人工智能需求疲软,日本一半新晶圆厂尚未开始量产

[Android开发视频教学]代码编写(一)(上)(29)

视频 2010-10-29

MediaTek 9月推首款2nm芯片流片,用于智能手机/NVLink定制ASIC

三星44b0的44bmon程序--使用说明

[Android开发视频教学]Service初步(一)(25)

视频 2010-10-29

驱动程序模型和加载实验源代码

长安马自达将开发基于宁德时代滑板底盘的电动汽车

罗德与施瓦茨携手ADI通过10BASE-T1S解决方案引领汽车以太网技术发展

[Android开发视频教学]代码编写(一)下(29)

视频 2010-10-29

哈佛结构和冯诺依曼结构的区别

苹果公布WWDC25邀请函:6月10日举行 iOS19等系统获更新

ATA-2041高压放大器在CFRP板分层缺陷的空耦超声原位测量中的应用

超声成像系统连续波多普勒设计挑战

谷歌开发者大会亮点:你的Chrome浏览器变AI管家!

[Android开发视频教学]项目详细设计(28)

视频 2010-10-29

另一个Hex转Bin的小程序

资源下载 2007-02-28

西门子收购Excellicon为EDA设计引入先进的时序约束能力

[Android开发视频教学]项目功能分析(27)

视频 2010-10-29

谷歌I/O大会:AI产品“大阅兵”,血战搜索霸权

更多 培训课堂
更多 焦点
更多 视频

技术专区