按键原理图:
IO对应关系:
Button1 => PA0
Button2 => PA8
Button3 => PB1
Button4 => PB2
按键检测通过定时器实现消抖和非阻塞,在定时器中断中循环检测IO电平,将持续时间小于50ms的情况排除。
非阻塞式代码:
struct _ButtonType
{
bool Status; //按键状态,1为按下,0为断开
uint32_t Value; //按下时长,长短按用
uint32_t LastTime; //上次按下的时间,双击用
}Button[4];
void Button_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed