key_driver.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "key_driver.h"
  2. TrueOrFalse_Flag_Struct_t IsBreakTrig_Flag;
  3. TrueOrFalse_Flag_Struct_t IsGearSensorTrig_Flag = FALSE;//变速传感器标志
  4. Key_TypeDef Key_Break_Left;
  5. Key_TypeDef Key_Break_Right;
  6. Key_TypeDef Key_GearSensor;
  7. /**********************局部函数定义************************/
  8. void _GPIO_Read(Key_TypeDef* Key)
  9. {
  10. uint8_t ReadData;
  11. if(HAL_GPIO_ReadPin(Key->GPIOx, Key->GPIO_Pin) == GPIO_PIN_RESET)
  12. {
  13. ReadData = 0x01;
  14. }
  15. else
  16. {
  17. ReadData = 0x00;
  18. }
  19. Key->Trg = ReadData & (ReadData ^ (Key->Cont));
  20. Key->Cont = ReadData;
  21. }
  22. void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, TrueOrFalse_Flag_Struct_t* Flag)
  23. {
  24. _GPIO_Read(Key);
  25. if(Key->Trg & 0x01)//表示有触发(下降沿)
  26. {
  27. Key->PressFlasg = 1;
  28. *Flag = TRUE;//有效信号
  29. Key->TimeCnt = HAL_GetTick();//计时赋初值
  30. }
  31. if(Key->PressFlasg == 1)//被触发一次
  32. {
  33. if(Key->Cont == 0x00)//表示松开
  34. {
  35. Key->TimeCnt = HAL_GetTick();
  36. Key->PressFlasg = 0;
  37. *Flag = FALSE;//松开释放信号
  38. }
  39. }
  40. if(*Flag == 1)//超时自动释放信号
  41. {
  42. if(DelayTime != 0) //超时设置值为0时不自动释放信号
  43. {
  44. if((HAL_GetTick() - Key->TimeCnt) > DelayTime)
  45. {
  46. Key->TimeCnt = HAL_GetTick();
  47. Key->PressFlasg = 0;
  48. *Flag = FALSE;//超时自动释放信号
  49. }
  50. }
  51. }
  52. else
  53. {
  54. Key->TimeCnt = HAL_GetTick();
  55. }
  56. return;
  57. }
  58. /*****************************全局函数定义*****************************/
  59. //按键GPIO初始化
  60. void KeyInitial(void)
  61. {
  62. GPIO_InitTypeDef GPIO_InitStruct;
  63. /* GPIO Ports Clock Enable */
  64. __HAL_RCC_GPIOC_CLK_ENABLE();
  65. //初始化左刹车
  66. Key_Break_Left.GPIOx = GPIOC;
  67. Key_Break_Left.GPIO_Pin = GPIO_PIN_13;
  68. GPIO_InitStruct.Pin = Key_Break_Left.GPIO_Pin;
  69. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  70. GPIO_InitStruct.Pull = GPIO_PULLUP;
  71. HAL_GPIO_Init(Key_Break_Left.GPIOx, &GPIO_InitStruct);
  72. Key_Break_Left.PressFlasg = 0;
  73. Key_Break_Left.TimeCnt= 0;
  74. Key_Break_Left.Trg =0;
  75. Key_Break_Left.Cont =0;
  76. //初始化右刹车
  77. Key_Break_Right.GPIOx = GPIOC;
  78. Key_Break_Right.GPIO_Pin = GPIO_PIN_14;
  79. GPIO_InitStruct.Pin = Key_Break_Right.GPIO_Pin;
  80. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  81. GPIO_InitStruct.Pull = GPIO_PULLUP;
  82. HAL_GPIO_Init(Key_Break_Right.GPIOx, &GPIO_InitStruct);
  83. Key_Break_Right.PressFlasg = 0;
  84. Key_Break_Right.TimeCnt= 0;
  85. Key_Break_Right.Trg =0;
  86. Key_Break_Right.Cont =0;
  87. //初始化GearSensor
  88. Key_GearSensor.GPIOx = GPIOC;
  89. Key_GearSensor.GPIO_Pin = GPIO_PIN_15;
  90. GPIO_InitStruct.Pin = Key_GearSensor.GPIO_Pin;
  91. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  92. GPIO_InitStruct.Pull = GPIO_PULLUP;
  93. HAL_GPIO_Init(Key_GearSensor.GPIOx, &GPIO_InitStruct);
  94. Key_GearSensor.PressFlasg = 0;
  95. Key_GearSensor.TimeCnt= 0;
  96. Key_GearSensor.Trg =0;
  97. Key_GearSensor.Cont =0;
  98. }
  99. //刹车检测函数
  100. void Break_Check(TrueOrFalse_Flag_Struct_t* BreakFlag)
  101. {
  102. static TrueOrFalse_Flag_Struct_t IsBreakTrig_Left_Flag = FALSE;//刹车标志
  103. static TrueOrFalse_Flag_Struct_t IsBreakTrig_Right_Flag = FALSE;//刹车标志
  104. Key_Check(&Key_Break_Left, 0, &IsBreakTrig_Left_Flag); //被触发时认为有效信号,松开时释放
  105. Key_Check(&Key_Break_Right, 0, &IsBreakTrig_Right_Flag); //被触发时认为有效信号,松开时释放
  106. *BreakFlag = (TrueOrFalse_Flag_Struct_t)((uint8_t)IsBreakTrig_Left_Flag & (uint8_t)IsBreakTrig_Right_Flag);
  107. }
  108. //GearSensor检测函数
  109. void GearSensor_Check(TrueOrFalse_Flag_Struct_t *Flag)
  110. {
  111. Key_Check(&Key_GearSensor, 1000, Flag);//被触发时认为有效信号,松开时释放或超时1000ms释放
  112. }