Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************
- // button.c
- // Драйвер кнопок
- //
- // ***********************************************************
- #include "button.h"
- #include "../drivers.h"
- // Задержка между нажатиями при зажатой кнопке
- #define DEFAULT_COUNTDOWN 30
- static TButtonHandler button_Handler;
- typedef struct
- {
- TPin Pin;
- bool ActiveLevel; // Активный уровень
- bool PullUp; // Необходима подтяжка внутренняя к питанию?
- } TButtonPin;
- // Где сидят кнопки
- static TButtonPin Buttons[] = {
- {{PE, 7}, true, false}, // button A
- {{PE, 6}, true, false}, // button B
- {{PA, 1}, false, false}, // button C
- };
- // Количество кнопок
- static const int ButtonCount = sizeof(Buttons) / sizeof(Buttons[0]);
- // Счётчики для автоповтора нажатия при удержании
- static int Countdown[sizeof(Buttons) / sizeof(Buttons[0])];
- // Опрос ножки, частота 100 Гц
- static void button_onTimer(void)
- {
- int i;
- for(i = 0; i < ButtonCount; i++)
- {
- if(gpio_Value(&Buttons[i].Pin) == Buttons[i].ActiveLevel)
- {
- // Если нажатие зафиксировано, то считаем
- if(Countdown[i])
- {
- Countdown[i]--;
- }
- else
- {
- // Задержка перед повторным нажатием
- Countdown[i] = DEFAULT_COUNTDOWN;
- // Если есть обработчик - вызовем его
- if(button_Handler) button_Handler(i);
- }
- }
- else
- {
- // Первое нажатие будет фиксироваться сразу
- Countdown[i] = 0;
- }
- }
- }
- // Инициализация драйвера кнопки
- void button_Init(void)
- {
- int i;
- for(i = 0; i < ButtonCount; i++)
- {
- // Вывод в режиме входа
- gpio_Input(&Buttons[i].Pin);
- // Включить подтяжку, если надо
- if(Buttons[i].PullUp) gpio_PullUp(&Buttons[i].Pin);
- // Счётчик, нажатия фиксируются только когда он 0
- Countdown[i] = 0;
- }
- // Запустим процесс опроса кнопки
- timer_AddFunction(100, &button_onTimer);
- }
- // Установить обработчик нажатия
- void button_SetHandler(TButtonHandler Handler)
- {
- button_Handler = Handler;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement