key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f10x.h"
#ifdef KEY_GLOBALS
#define KEY_EXT
#else
#define KEY_EXT extern
#endif
//IO定義
#define down() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) //PA1
KEY_EXT void key_down(void);
#endif
key.c
/****************************************Copyright (c)**************************************************
** 他鄉&學子
**
**
** https://blog.csdn.net/weixin_40779546/article/details/81776171
**
**--------------文件信息--------------------------------------------------------------------------------
**文件名 : key.c
**創 建人 : 他鄉&學子
**創建日期: 2016年6月13日
**描 述 : 按鍵狀態機
**
********************************************************************************************************/
#define KEY_GLOBALS
#include <stdio.h>
#include "key.h"
enum KEY_STATE{KEY_IDLE=10,FILTER,PRESS,RELEASE};
unsigned char key_state = KEY_IDLE;
unsigned char key_state_tick = 0;
void key_down(void)
{
switch(key_state) {
case KEY_IDLE:
if(0 == down()){//有按鍵
key_state = FILTER;
key_state_tick = 0;
}
break;
case FILTER:
if(0 == down()) {//判斷是否爲按鍵
key_state_tick ++;
if(key_state_tick > 3){//按鍵時間大於50ms。
//按鍵按下後的任務處理
key_state = PRESS;
key_state_tick = 0;//記錄處理鍵盤時刻,假設這是第一次。
}
} else {//按鍵的去抖動
key_state = KEY_IDLE;
key_state_tick = 0;
}
break;
case PRESS:
if(0 != down()){ //key release 鬆手
key_state = KEY_IDLE;
}
break;
default:
key_state = FILTER;
break;
}//end swtich;
}