button.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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_PULLUP;
  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. GPIO_InitStruct.Pin = GPIO_PIN_6;
  27. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  28. GPIO_InitStruct.Pull = GPIO_PULLUP;
  29. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  30. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  31. }
  32. //
  33. void empty_hendler() {}
  34. //
  35. void button_run(void)
  36. {
  37. bu_no_fix_handler(&but_start);
  38. }
  39. //
  40. void bu_no_fix_handler(but_no_fix_t* button)
  41. {
  42. uint8_t temp;
  43. if (button->stateNew != BUT_NO_DEFINE)
  44. {
  45. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  46. if (temp == 0) // определяем текущее (новое) состояние кнопки
  47. button->stateNew = BUT_ON;
  48. else
  49. button->stateNew = BUT_OFF;
  50. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  51. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  52. }
  53. else
  54. {
  55. button->counterDelay++; // запускаем счетчик на задержку
  56. if (button->counterDelay > button->timeDelay) // задержка закончилась
  57. {
  58. button->counterDelay = 0;
  59. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  60. button->counterActivation = 0;
  61. if (temp == 0) // определяем текущее (новое) состояние кнопки
  62. {
  63. button->stateNew = BUT_ON;
  64. button->unpressHandler();
  65. }
  66. else
  67. {
  68. button->stateNew = BUT_OFF;
  69. button->pressHandler();
  70. }
  71. }
  72. }
  73. button->stateOld = button->stateNew;
  74. }
  75. // Возвращает сотояние ключа
  76. BUTTON_STATE_t but_get_state(but_no_fix_t *button)
  77. {
  78. return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  79. }
  80. static void but_start_down_handler(void)
  81. {
  82. // Режим "одиночный"
  83. if (!but_is_string())
  84. {
  85. }
  86. printf("Button\r\n");
  87. }
  88. //
  89. bool but_is_string(void)
  90. {
  91. return (bool)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
  92. }