Библиотека для опроса кнопок

Введение

Написал библиотеку для опроса кнопок.

Особенности библиотеки:
• предназначена для AVR
• работает с компиляторами GCC, IAR, CodeVision
• позволяет опрашивать до 32 цифровых входов
• имеет программную защиту от дребезга контактов
• распознает нажатие, удержание, отпускание и двойное нажатие на кнопку
• позволяет индивидуально задавать активный уровень и обрабатываемые события
• зафиксированные события сохраняются в кольцевом буфере
• позволяет отключать неиспользуемые функции
• легко интегрируется в готовый проект

Состав библиотеки

buttons.h - заголовочный файл библиотеки, в котором задаются настройки
buttons.c - файл реализация функций

Подключение к проекту

1. Копируем все файлы в папку проекта.
2. Подключаем buttons.c к проекту.
3. Инклюдим заголовочный файл buttons.h к сишному файлу, в котором будут использоваться функции библиотеки.
4. Настраиваем конфигурацию и подключения в файле buttons.h
5. Прописываем в код вызов функций библиотеки.

Настройка библиотеки

Настройка конфигурации состоит из следующий шагов.

1. Задаем количество кнопок. Эта настройка может принимать значения от 1 до 32.

#define BUT_AMOUNT 4


2. Задаем сколько циклов опроса должна удерживаться кнопка, чтобы она считалась нажатой. Число должно быть меньше BUT_COUNT_HELD (смотри ниже).

#define BUT_COUNT_THR 10


3. Задаем количество циклов опроса, в течении которых должно произойти второе нажатие на кнопку, чтобы было зафиксировано событие "двойной клик". Желательно задавать это значение до 250, если задать выше, код будет занимать больше памяти. Если эта функция не используется, настройку можно пропустить.

#define BUT_COUNT_THR_2 100


4. Задаем количество циклов опроса, в течении которых должна удерживаться кнопка, чтобы было зафиксировано событие "длительное удержание". По сути - это время удержания кнопки. Желательно задавать это значение до 250, если задать выше, код будет требовать больше RAM и Flash памяти. Значение должно быть больше BUT_COUNT_THR (смотри выше).

#define BUT_COUNT_HELD 250


5. Задаем размер буфера событий. Его значение должно быть кратно степени двойки (2, 4, 8, 16...).

#define BUT_SIZE_BUF 8


6. Задаем тип опроса.
0 - полный опрос. За один вызов функции BUT_Poll() выполняется один цикл опроса всех кнопок. 1 - циклический опрос. За один вызов BUT_Poll() выполняется один цикл опроса одной кнопки. Если кнопок мало, задавайте 0.

#define BUT_POLL_ROTATION 0


7. Задаем события, которые будут регистрироваться. 0 - событие не регистрируется, 1 - событие будет регистрироваться, если задана индивидуальная настройка кнопки. Библиотека может регистрировать следующие события:

• нажатие на кнопку
• удержание кнопки
• отпускание кнопки после короткого удержания
• отпускание кнопки после длительного удержания
• быстрое двойное нажатие на кнопку

Исключив ненужные события, можно сэкономить немного памяти и времени микроконтроллера.

#define BUT_PRESSED_EN  1
#define BUT_HELD_EN  1
#define BUT_RELEASED_EN  1
#define BUT_RELEASE_LONG_EN  1
#define BUT_DOUBLE_CLICK_EN  1


8. Если нужно, задаем коды кнопок. Эти коды будут сохранятся в буфере событий, когда зафиксировано соответствующее событие. Коды могут принимать значения от 1 до 255. Можно задать всем событиям одинаковый код.

#define BUT_PRESSED_CODE   1
#define BUT_HELD_CODE   2 
#define BUT_RELEASED_CODE   3
#define BUT_RELEASED_LONG_CODE   4
#define BUT_DOUBLE_CLICK_CODE   5


9. Задаем конфигурацию кнопок. Конфигурация кнопки включает в себя:

• Идентификационный номер - BUT_N_ID. Где N - это число от 1 до 32. Задается по порядку - 1, 2, 3 ... 32. Без пропусков!

• Порт направления - BUT_N_DDRX

• Порт подтягивающих резисторов - BUT_N_PORTX

• Порт состояния пина микроконтроллера - BUT_N_PINX

• Номер пина микроконтроллера - BUT_N_PIN

• Активный уровень кнопки - BUT_N_LEV. Если кнопка замыкается на землю - активный уровень 0. Если она замыкается на плюс питания - активный уровень 1.

• Активация pull-up резистора - BUT_N_PULL. 0 - не включать, 1 - включать подтягивающий резистор.

• Список регистрируемых событий - BUT_N_EVEN. Это события, которые будут заноситься в буфер, если они разрешены глобальными настройками. Задаются в скобках через оператор побитового ИЛИ. Список событий такой - BUT_EV_PRESSED, BUT_EV_HELD, BUT_EV_RELEASED, BUT_EV_RELEASED_LONG, BUT_EV_DOUBLE_CLICK ,BUT_EV_ALL.

Пример настройки кнопки, подключенной к 0 выводу порта C. Кнопка замыкает вывод на землю, включен подтягивающий резистор и регистрируются события "отпускание кнопки" и "длительное удержание".

#define BUT_1_ID         1
#define BUT_1_DDRX      DDRC
#define BUT_1_PORTX    PORTC
#define BUT_1_PINX      PINC
#define BUT_1_PIN        0
#define BUT_1_LEV        0
#define BUT_1_PULL       1
#define BUT_1_EVENT   (BUT_EV_HELD |BUT_EV_RELEASED)

Использование библиотеки

Библиотека содержит три пользовательские функции.

void BUT_Init(void) - инициализирует внутренние переменные, настраивает кнопки. Эту функцию нужно вызывать в начале main`a.

void BUT_Poll(void) - выполняет опрос кнопок. Функция должна вызываться с периодом от 1 до нескольких десятков миллисекунд. Лучше не "совать" ее в прерывание, а вызывать ее из основного цикла программы.

В зависимости от настройки BUT_POLL_ROTATION, функция может выполнять опрос всех кнопок за раз или по одной кнопке за вызов. Если используется циклический опрос, то частота опроса кнопок будет в N раз меньше частоты вызова функции BUT_Poll(), где N - количество кнопок. Это нужно учитывать при задании настроек BUT_COUNT_THR, BUT_COUNT_THR_2, BUT_COUNT_HELD.

uint8_t BUT_GetBut(void) - возвращает событие из буфера. Функцию нужно вызывать два раза. Первый раз - возвращается код кнопки, второй раз - код события. Если буфер пустой, функция возвращает 0.

Пример использования:

...
uint8_t but = 0;
uint8_t code = 0;

int main( void )
{

   BUT_Init();
   ...
   __enable_interrupt(); 
   while(1){
      delay_ms(2);

      /*опрос кнопок*/
      BUT_Poll();

      /*проверка буфера*/
      but = BUT_GetBut();

      /*если зафиксировано событие*/
      if (but){

         /*берем код события*/
         code = BUT_GetBut(); 
         
         /*обрабатываем but и code*/
         ....

      }
   }

 return 0;
}

Файлы

buttons-lib.rar - библиотека опроса кнопок для AVR

Писал для себя. Не проверена на 100%. Поставляется как есть.

Другие материалы в этой категории: « Работа с SD картой. Воспроизведение wav файла. Ч3

У вас недостаточно прав для комментирования.