功能:通过定时器的方法用按键开关LED
按键状态机图解:
//
//定义的枚举
typedef enum
{
KEY_UP =1, //按键按下
Edge_Lead=2, //前沿抖动
KEY_DOWN =3, //按键松开
Edge_Back=4, //后沿抖动
} KEY_Status;
主函数:
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer.h"
//定义了按键状态的结构体
KEY_Status KEY2_Status;
//10ms定时开关
uint8_t Timer10ms_Flag=0;
uint8_t cnt=0 ;
int main(void)
{
delay_init(168);
KEY_Init();
MyGPIO_Init();
TIM3_Int_Init(400-1,8400-1);//10ms的定时器
KEY2_Status =KEY_UP ; //按键的初始状态
while(1)
{
//当10ms定时时间到
if(Timer10ms_Flag==1)
{
Timer10ms_Flag=0;
switch(KEY2_Status)
{
case KEY_UP:
if(KEY2==0) KEY2_Status =Edge_Lead;
cnt=0;
break;
case Edge_Lead:
cnt++;
if(KEY2==1) KEY2_Status =KEY_UP;
else if(cnt==2)
{
KEY2_Status =KEY_DOWN;
cnt=0;
}
break;
case KEY_DOWN:
if(KEY2==1)
KEY2_Status =Edge_Back;
cnt=0;
break;
case Edge_Back:
cnt++;
if(KEY2==0) KEY2_Status=KEY_DOWN;
else if(cnt==2)
{
KEY2_Status =KEY_UP;
cnt=0;
}
break;
default :
break;
}
if(KEY2_Status ==KEY_DOWN)
{
LED2_ON();
}
if(KEY2_Status ==KEY_UP)
{
LED2_OFF();
}
}
}
}