key_driver.c 4.5 KB

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