野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8432|回复: 1

根据触摸状态机改写的按键状态机

[复制链接]
发表于 2018-6-26 11:46:23 | 显示全部楼层 |阅读模式
/***********************************************头文件**************************************************************/
#ifndef _BSP_KEY_
#define _BSP_KEY_
#include "stm32f10x.h"
typedef enum{
KEY_RESEALE=0,
KEY_WATING,
KEY_PRESSED
}KEY_STATE;
typedef enum{
KEY_NOPRESSED=0,
KEY_DOWN,
KEY_UP,
KEY_SHORTPERSSED,
KEY_LONG_PRESSED
}KEY_RESULT;


void key_config(void);
KEY_RESULT KEY_TouchDetect(void);

#endif /*_BSP_KEY_*/
/**************************************************.c文件****************************************************************/
void key_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStruct);

}

KEY_RESULT KEY_TouchDetect(void)
{
static KEY_STATE key_state =KEY_RESEALE;
KEY_RESULT key_result=KEY_NOPRESSED;
static uint32_t key_count=0;

switch(key_state)
{
  case KEY_RESEALE:
   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
   {
    key_state=KEY_WATING;
    key_result=KEY_NOPRESSED;
   }
   else
   {
    key_state=KEY_RESEALE;
    key_result=KEY_NOPRESSED;
   }
  break;
   
  case KEY_WATING:
   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
   {
    key_count++;
    if(key_count>1000)
    {
     key_count=0;
     key_state=KEY_PRESSED;
     key_result=KEY_DOWN;
    }
    else
    {
     key_state=KEY_RESEALE;
     key_result=KEY_NOPRESSED;
    }
   }
   else
   {
    key_state=KEY_RESEALE;
    key_result=KEY_NOPRESSED;
   }
  break;
   
  case KEY_PRESSED:
   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
   {
    key_count++;
    if(key_count<10000)
    {
     key_state=KEY_PRESSED;
     key_result=KEY_SHORTPERSSED;
    }
    else
    {
     key_state=KEY_PRESSED;
     key_result=KEY_LONG_PRESSED;
    }   
   }
   else
   {
    key_count=0;
    key_state=KEY_RESEALE;
    key_result=KEY_UP;
   }
  break;

}



return key_result;
}



/*******************************************************测试文件****************************************************************/
key_config();

while(1)
{
  res=KEY_TouchDetect();
  if(res==KEY_DOWN) printf("按键按下\n");
  if(res==KEY_SHORTPERSSED) printf("按键短按\n");
  if(res==KEY_LONG_PRESSED) printf("按键长按\n");
  if(res==KEY_UP) printf("按键弹起\n");
}
/******************************************************end of file&#9786;&#9786;&#9786;&#9786;&#9786;************************************************************************/












回复

使用道具 举报

发表于 2018-6-26 13:46:44 | 显示全部楼层
不错,谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-27 03:52 , Processed in 0.032619 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表