key_driver.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. if(Key->SwitchType == NormallyOpen)
  14. {
  15. ReadData = 0x01;
  16. }
  17. else
  18. {
  19. ReadData = 0x00;
  20. }
  21. }
  22. else
  23. {
  24. if(Key->SwitchType == NormallyOpen)
  25. {
  26. ReadData = 0x00;
  27. }
  28. else
  29. {
  30. ReadData = 0x01;
  31. }
  32. }
  33. Key->Trg = ReadData & (ReadData ^ (Key->Cont));
  34. Key->Cont = ReadData;
  35. }
  36. void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, TrueOrFalse_Flag_Struct_t* Flag)
  37. {
  38. _GPIO_Read(Key);
  39. if(Key->Trg & 0x01)//表示有触发(下降沿)
  40. {
  41. Key->PressFlasg = 1;
  42. *Flag = TRUE;//有效信号
  43. Key->TimeCnt = HAL_GetTick();//计时赋初值
  44. }
  45. if(Key->PressFlasg == 1)//被触发一次
  46. {
  47. if(Key->Cont == 0x00)//表示松开
  48. {
  49. Key->TimeCnt = HAL_GetTick();
  50. Key->PressFlasg = 0;
  51. *Flag = FALSE;//松开释放信号
  52. }
  53. }
  54. if(*Flag == 1)//超时自动释放信号
  55. {
  56. if(DelayTime != 0) //超时设置值为0时不自动释放信号
  57. {
  58. if((HAL_GetTick() - Key->TimeCnt) > DelayTime)
  59. {
  60. Key->TimeCnt = HAL_GetTick();
  61. Key->PressFlasg = 0;
  62. *Flag = FALSE;//超时自动释放信号
  63. }
  64. }
  65. }
  66. else
  67. {
  68. Key->TimeCnt = HAL_GetTick();
  69. }
  70. return;
  71. }
  72. /*****************************全局函数定义*****************************/
  73. //按键GPIO初始化
  74. void KeyInitial(void)
  75. {
  76. GPIO_InitTypeDef GPIO_InitStruct;
  77. /* GPIO Ports Clock Enable */
  78. __HAL_RCC_GPIOC_CLK_ENABLE();
  79. //初始化左刹车
  80. Key_Break_Left.GPIOx = GPIOC;
  81. Key_Break_Left.GPIO_Pin = GPIO_PIN_13;
  82. GPIO_InitStruct.Pin = Key_Break_Left.GPIO_Pin;
  83. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  84. GPIO_InitStruct.Pull = GPIO_PULLUP;
  85. HAL_GPIO_Init(Key_Break_Left.GPIOx, &GPIO_InitStruct);
  86. Key_Break_Left.SwitchType = NormallyOpen;
  87. Key_Break_Left.PressFlasg = 0;
  88. Key_Break_Left.TimeCnt= 0;
  89. Key_Break_Left.Trg =0;
  90. Key_Break_Left.Cont =0;
  91. //初始化右刹车
  92. Key_Break_Right.GPIOx = GPIOC;
  93. Key_Break_Right.GPIO_Pin = GPIO_PIN_14;
  94. GPIO_InitStruct.Pin = Key_Break_Right.GPIO_Pin;
  95. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  96. GPIO_InitStruct.Pull = GPIO_PULLUP;
  97. HAL_GPIO_Init(Key_Break_Right.GPIOx, &GPIO_InitStruct);
  98. Key_Break_Right.SwitchType = NormallyOpen;
  99. Key_Break_Right.PressFlasg = 0;
  100. Key_Break_Right.TimeCnt= 0;
  101. Key_Break_Right.Trg =0;
  102. Key_Break_Right.Cont =0;
  103. //初始化GearSensor
  104. Key_GearSensor.GPIOx = GPIOC;
  105. Key_GearSensor.GPIO_Pin = GPIO_PIN_15;
  106. GPIO_InitStruct.Pin = Key_GearSensor.GPIO_Pin;
  107. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  108. GPIO_InitStruct.Pull = GPIO_PULLUP;
  109. HAL_GPIO_Init(Key_GearSensor.GPIOx, &GPIO_InitStruct);
  110. Key_GearSensor.SwitchType = NormallyOpen;
  111. Key_GearSensor.PressFlasg = 0;
  112. Key_GearSensor.TimeCnt= 0;
  113. Key_GearSensor.Trg =0;
  114. Key_GearSensor.Cont =0;
  115. }
  116. //刹车检测函数
  117. void Break_Check(TrueOrFalse_Flag_Struct_t* BreakFlag)
  118. {
  119. static TrueOrFalse_Flag_Struct_t IsBreakTrig_Left_Flag = FALSE;//刹车标志
  120. static TrueOrFalse_Flag_Struct_t IsBreakTrig_Right_Flag = FALSE;//刹车标志
  121. Key_Check(&Key_Break_Left, 0, &IsBreakTrig_Left_Flag); //被触发时认为有效信号,松开时释放
  122. Key_Check(&Key_Break_Right, 0, &IsBreakTrig_Right_Flag); //被触发时认为有效信号,松开时释放
  123. *BreakFlag = (TrueOrFalse_Flag_Struct_t)((uint8_t)IsBreakTrig_Left_Flag & (uint8_t)IsBreakTrig_Right_Flag);
  124. #if 0
  125. static uint8_t BreakFlag_Debug;
  126. BreakFlag_Debug = (uint8_t)*BreakFlag;
  127. #endif
  128. }
  129. //GearSensor检测函数
  130. void GearSensor_Check(TrueOrFalse_Flag_Struct_t *Flag)
  131. {
  132. Key_Check(&Key_GearSensor, 1000, Flag);//被触发时认为有效信号,松开时释放或超时1000ms释放
  133. #if 0
  134. static uint8_t GearSensorFlag_Debug;
  135. GearSensorFlag_Debug = (uint8_t)*Flag;
  136. #endif
  137. }