#include "key_driver.h" TrueOrFalse_Flag_Struct_t IsBreakTrig_Flag; 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 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; } } Key->Trg = ReadData & (ReadData ^ (Key->Cont)); Key->Cont = ReadData; } void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, TrueOrFalse_Flag_Struct_t* Flag) { _GPIO_Read(Key); if(Key->Trg & 0x01)//表示有触发(下降沿) { Key->PressFlasg = 1; *Flag = TRUE;//有效信号 Key->TimeCnt = HAL_GetTick();//计时赋初值 } if(Key->PressFlasg == 1)//被触发一次 { if(Key->Cont == 0x00)//表示松开 { Key->TimeCnt = HAL_GetTick(); Key->PressFlasg = 0; *Flag = FALSE;//松开释放信号 } } if(*Flag == 1)//超时自动释放信号 { if(DelayTime != 0) //超时设置值为0时不自动释放信号 { if((HAL_GetTick() - Key->TimeCnt) > DelayTime) { Key->TimeCnt = HAL_GetTick(); Key->PressFlasg = 0; *Flag = FALSE;//超时自动释放信号 } } } else { Key->TimeCnt = HAL_GetTick(); } 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, 0, &IsBreakTrig_Left_Flag); //被触发时认为有效信号,松开时释放 Key_Check(&Key_Break_Right, 0, &IsBreakTrig_Right_Flag); //被触发时认为有效信号,松开时释放 *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, 1000, Flag);//被触发时认为有效信号,松开时释放或超时1000ms释放 #if 0 static uint8_t GearSensorFlag_Debug; GearSensorFlag_Debug = (uint8_t)*Flag; #endif }