1.GPIO口设置成上拉输入(默认为高电平,按下按键时为低电平)
2.基本定时器是TIM6和TIM7,按键设定为10ms扫描一次,PSC设为80,ARR为10000,一定要记得在NVIC里开启中断,同时别忘了中断初始化
Key_State Key[]={0, 0, 0, 0};
uint8_t Key_Num = 0; //长短按键计次
typedef struct{
uint8_t Key_Judge;
bool Key_Sta;
bool Key_Long_Flag;
bool Key_Short_Flag;
}Key_State;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM6)
{
Key[0].Key_Sta = HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin);
Key[1].Key_Sta = HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin);
Key[2].Key_Sta = HAL_GPIO_ReadPin(Key3_GPIO_Port, Key3_Pin);
Key[3].Key_Sta = HAL_GPIO_ReadPin(Key4_GPIO_Port, Key4_Pin);
for(uint8_t i=0; i<4; i++)
{
switch(Key[i].Key_Judge)
{
case 0:
{
if(Key[i].Key_Sta == 0)Key[i].Key_Judge = 1;
}
break;
case 1:
{
if(Key[i].Key_Sta == 0)Key[i].Key_Judge = 2;
else Key[i].Key_Judge = 0;
}
break;
case 2:
{
Key_Num ++;
if(Key[i].Key_Sta == 1)
{
Key[i].Key_Judge = 0; //别漏
if(Key_Num < 100)
{
Key[i].Key_Short_Flag = 1;
Key_Num = 0;
}
if(Key_Num >= 100)
{
Key[i].Key_Long_Flag = 1;
Key_Num = 0;
}
}
}
break;
}
}
}
}