123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #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)
- {
- ReadData = 0x01;
- }
- else
- {
- ReadData = 0x00;
- }
- 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.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.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.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);
- }
- //GearSensor检测函数
- void GearSensor_Check(TrueOrFalse_Flag_Struct_t *Flag)
- {
- Key_Check(&Key_GearSensor, 1000, Flag);//被触发时认为有效信号,松开时释放或超时1000ms释放
- }
|