#include "key_driver.h" TrueOrFalse_Flag_Struct_t IsBreakTrig_Flag = FALSE; TrueOrFalse_Flag_Struct_t IsGearSensorTrig_Flag = FALSE;//变速传感器标志 Key_TypeDef Key_Break_Left; Key_TypeDef Key_Break_Right; Key_TypeDef Key_GearSensor; /**********************局部函数定义************************/ void _GPIO_Read(Key_TypeDef* Key, uint8_t TrigNum) { uint8_t ReadData; //读按键状态 if(HAL_GPIO_ReadPin(Key->GPIOx, Key->GPIO_Pin) == GPIO_PIN_RESET) { if(Key->SwitchType == NormallyOpen)//常开型开关 { ReadData = 0x01; } else//常闭型开关 { ReadData = 0x00; } } else { if(Key->SwitchType == NormallyOpen)//常开型开关 { ReadData = 0x00; } else//常闭型开关 { ReadData = 0x01; } } //触发标志 if(TrigNum == 1) //单极触发 { Key->Trg = ReadData & (ReadData ^ (Key->Cont)); } else //双极触发 { Key->Trg = ReadData ^ (Key->Cont); } Key->Cont = ReadData; } void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, uint32_t AutoReleaseDelayTime, FlagStatus UndoReleaseFlag, TrueOrFalse_Flag_Struct_t* Flag) { if(UndoReleaseFlag == RESET) //松开按键不释放信号,等待自动超时释放,此时AutoReleaseDelayTime不能设置为0 { _GPIO_Read(Key, 1); } else //松开按键释放信号 { _GPIO_Read(Key, 2); } if(Key->Trg & 0x01)//表示有触发(下降沿) { Key->PressFlasg = 1; Key->TimeCnt = HAL_GetTick();//计时赋初值 } if(Key->PressFlasg == 1)//被触发一次 { if(Key->Cont == 0x00)//表示松开 { Key->TimeCnt = HAL_GetTick(); Key->AutoReleaseTimeCnt = HAL_GetTick(); Key->PressFlasg = 0; *Flag = FALSE;//松开释放信号 } else { if((HAL_GetTick() - Key->TimeCnt) > DelayTime) { Key->TimeCnt = HAL_GetTick(); Key->PressFlasg = 0; *Flag = TRUE; Key->AutoReleaseTimeCnt = HAL_GetTick();//自动释放计时赋初值 } } } if(*Flag == TRUE)//超时自动释放信号 { if(AutoReleaseDelayTime != 0) //超时设置值为0时不自动释放信号 { if((HAL_GetTick() - Key->AutoReleaseTimeCnt) > AutoReleaseDelayTime) { Key->AutoReleaseTimeCnt = HAL_GetTick(); Key->PressFlasg = 0; *Flag = FALSE;//超时自动释放信号 } } } return; } /*****************************全局函数定义*****************************/ //按键GPIO初始化 void KeyInitial(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); //初始化左刹车 Key_Break_Left.GPIOx = GPIOC; Key_Break_Left.GPIO_Pin = GPIO_PIN_13; GPIO_InitStruct.Pin = Key_Break_Left.GPIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(Key_Break_Left.GPIOx, &GPIO_InitStruct); Key_Break_Left.SwitchType = NormallyOpen; Key_Break_Left.PressFlasg = 0; Key_Break_Left.TimeCnt= 0; Key_Break_Left.Trg =0; Key_Break_Left.Cont =0; //初始化右刹车 Key_Break_Right.GPIOx = GPIOC; Key_Break_Right.GPIO_Pin = GPIO_PIN_14; GPIO_InitStruct.Pin = Key_Break_Right.GPIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(Key_Break_Right.GPIOx, &GPIO_InitStruct); Key_Break_Right.SwitchType = NormallyOpen; Key_Break_Right.PressFlasg = 0; Key_Break_Right.TimeCnt= 0; Key_Break_Right.Trg =0; Key_Break_Right.Cont =0; //初始化GearSensor Key_GearSensor.GPIOx = GPIOC; Key_GearSensor.GPIO_Pin = GPIO_PIN_15; GPIO_InitStruct.Pin = Key_GearSensor.GPIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(Key_GearSensor.GPIOx, &GPIO_InitStruct); Key_GearSensor.SwitchType = NormallyOpen; Key_GearSensor.PressFlasg = 0; Key_GearSensor.TimeCnt= 0; Key_GearSensor.Trg =0; Key_GearSensor.Cont =0; } //刹车检测函数 void Break_Check(TrueOrFalse_Flag_Struct_t* BreakFlag) { static TrueOrFalse_Flag_Struct_t IsBreakTrig_Left_Flag = FALSE;//刹车标志 static TrueOrFalse_Flag_Struct_t IsBreakTrig_Right_Flag = FALSE;//刹车标志 Key_Check(&Key_Break_Left, 10, 0, SET, &IsBreakTrig_Left_Flag); //被长按100ms时认为有效信号,松开时释放 Key_Check(&Key_Break_Right, 10, 0, SET, &IsBreakTrig_Right_Flag); //被长按100ms时认为有效信号,松开时释放 *BreakFlag = (TrueOrFalse_Flag_Struct_t)((uint8_t)IsBreakTrig_Left_Flag & (uint8_t)IsBreakTrig_Right_Flag); #if 0 static uint8_t BreakFlag_Debug; BreakFlag_Debug = (uint8_t)*BreakFlag; #endif } //GearSensor检测函数 void GearSensor_Check(TrueOrFalse_Flag_Struct_t *Flag) { Key_Check(&Key_GearSensor, 10, 1000, SET, Flag);//被长按10ms时认为有效信号,松开时释放或超时1000ms释放 #if 0 static uint8_t GearSensorFlag_Debug; GearSensorFlag_Debug = (uint8_t)*Flag; #endif }