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
**描 述 : 按键状态机
**
********************************************************************************************************/
#define KEY_GLOBALS
#include
#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;
}
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。