button.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "button.h"
  2. #include <stdio.h>
  3. but_no_fix_t but_start;
  4. void empty_hendler();
  5. static void but_start_down_handler(void);
  6. //
  7. void but_init(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStruct = {0};
  10. __HAL_RCC_GPIOA_CLK_ENABLE();
  11. GPIO_InitStruct.Pin = GPIO_PIN_4;
  12. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  13. GPIO_InitStruct.Pull = GPIO_NOPULL;
  14. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  15. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  16. but_start.GPIOx = GPIOA;
  17. but_start.GPIO_Pin = GPIO_PIN_4;
  18. but_start.timeDelay = 2;
  19. but_start.pressHandler = but_start_down_handler;
  20. but_start.unpressHandler = empty_hendler;
  21. but_start.counterActivation = 0;
  22. but_start.timeActivation = 40;
  23. but_start.fActivation = false;
  24. but_start.stateOld = but_get_state(&but_start);
  25. }
  26. //
  27. void empty_hendler() {}
  28. //
  29. void button_run(void)
  30. {
  31. bu_no_fix_handler(&but_start);
  32. }
  33. //
  34. void bu_no_fix_handler(but_no_fix_t* button)
  35. {
  36. uint8_t temp;
  37. if (button->stateNew != BUT_NO_DEFINE)
  38. {
  39. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  40. if (temp == 0) // определяем текущее (новое) состояние кнопки
  41. button->stateNew = BUT_ON;
  42. else
  43. button->stateNew = BUT_OFF;
  44. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  45. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  46. }
  47. else
  48. {
  49. button->counterDelay++; // запускаем счетчик на задержку
  50. if (button->counterDelay > button->timeDelay) // задержка закончилась
  51. {
  52. button->counterDelay = 0;
  53. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  54. button->counterActivation = 0;
  55. if (temp == 0) // определяем текущее (новое) состояние кнопки
  56. {
  57. button->stateNew = BUT_ON;
  58. button->unpressHandler();
  59. }
  60. else
  61. {
  62. button->stateNew = BUT_OFF;
  63. button->pressHandler();
  64. }
  65. }
  66. }
  67. button->stateOld = button->stateNew;
  68. }
  69. // Возвращает сотояние ключа
  70. BUTTON_STATE_t but_get_state(but_no_fix_t *button)
  71. {
  72. return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  73. }
  74. static void but_start_down_handler(void)
  75. {
  76. printf("Button\r\n");
  77. }