Advertisement
teplofizik

button.c (пример)

Mar 25th, 2014
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  1. // ***********************************************************
  2. //  button.c
  3. //  Драйвер кнопок
  4. //
  5. // ***********************************************************
  6.  
  7. #include "button.h"
  8. #include "../drivers.h"
  9.  
  10. // Задержка между нажатиями при зажатой кнопке
  11. #define DEFAULT_COUNTDOWN  30
  12.  
  13. static TButtonHandler button_Handler;
  14.  
  15. typedef struct
  16. {
  17.     TPin Pin;
  18.     bool ActiveLevel; // Активный уровень
  19.     bool PullUp;      // Необходима подтяжка внутренняя к питанию?
  20. } TButtonPin;
  21.  
  22. // Где сидят кнопки
  23. static TButtonPin Buttons[] = {
  24.     {{PE, 7}, true, false},   // button A
  25.     {{PE, 6}, true, false},   // button B
  26.     {{PA, 1}, false, false},  // button C
  27. };
  28.  
  29. // Количество кнопок
  30. static const int ButtonCount = sizeof(Buttons) / sizeof(Buttons[0]);
  31.  
  32. // Счётчики для автоповтора нажатия при удержании
  33. static int Countdown[sizeof(Buttons) / sizeof(Buttons[0])];
  34.  
  35. // Опрос ножки, частота 100 Гц
  36. static void button_onTimer(void)
  37. {
  38.     int i;
  39.    
  40.     for(i = 0; i < ButtonCount; i++)
  41.     {
  42.         if(gpio_Value(&Buttons[i].Pin) == Buttons[i].ActiveLevel)
  43.         {
  44.             // Если нажатие зафиксировано, то считаем
  45.             if(Countdown[i])
  46.             {
  47.                 Countdown[i]--;
  48.             }
  49.             else
  50.             {
  51.                 // Задержка перед повторным нажатием
  52.                 Countdown[i] = DEFAULT_COUNTDOWN;
  53.                 // Если есть обработчик - вызовем его
  54.                 if(button_Handler) button_Handler(i);
  55.             }
  56.         }
  57.         else
  58.         {
  59.             // Первое нажатие будет фиксироваться сразу
  60.             Countdown[i] = 0;
  61.         }
  62.     }
  63. }
  64.  
  65. // Инициализация драйвера кнопки
  66. void button_Init(void)
  67. {
  68.     int i;
  69.    
  70.     for(i = 0; i < ButtonCount; i++)
  71.     {
  72.         // Вывод в режиме входа
  73.         gpio_Input(&Buttons[i].Pin);
  74.        
  75.         // Включить подтяжку, если надо
  76.         if(Buttons[i].PullUp) gpio_PullUp(&Buttons[i].Pin);
  77.        
  78.         // Счётчик, нажатия фиксируются только когда он 0
  79.         Countdown[i] = 0;
  80.     }
  81.    
  82.     // Запустим процесс опроса кнопки
  83.     timer_AddFunction(100, &button_onTimer);
  84. }
  85.  
  86. // Установить обработчик нажатия
  87. void button_SetHandler(TButtonHandler Handler)
  88. {
  89.     button_Handler = Handler;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement