Print this page

Библиотека для опроса матричной клавиатуры 4x4 и 3х4

13/10/2011 - 05:03

Введение

Написал программный модуль для опроса матричной клавиатуры.

Особенности модуля:

- простая интеграция с готовым проектом
- поддержка всех микроконтроллеров семейства mega
- возможность использования с любым из трех компиляторов CodeVision, IAR, GCC
- поддержка клавиатур 4х4 и 3х4
- поддержка работы на общей шине
- возможность подключения к одному или двумя портами
- программная антидребезговая защита
- возможность установки произвольных кодов кнопок

Подключение модуля

- скачиваем архив с модулем
- переписываем файлы keyboard.h и keyboard.c в папку проекта
- подключаем keyboard.c к проекту внутри среды разработки
- включаем keyboard.h в требуемый файл проекта, например main.c
- настраиваем конфигурацию в файле keyboard.h
- прописываем в свой код вызов пользовательских функций
 
Настройка конфигурации включает в себя несколько шагов.
 
Установка тактовой частоты микроконтроллера
 
#define F_CPU 16000000
 
   При высокой тактовой частоте микроконтроллера логические сигналы, формируемые программным модулем, из-за паразитных емкостей «не успевают» устанавливаться до требуемого уровня. Поэтому в некоторых местах кода используется программная задержка, для вычисления которой требуется значение тактовой частоты.
Установка типа матричной клавиатуры – 4х4 или 3х4
 
#define KEYBOARD_4X4
 
   Если закомментировать это макроопределение будет установлена клавиатура 3х4. 
Тип заданной клавиатуры сообщается пользователю в процессе сборки проекта. Поэтому не удивляйтесь предупреждению в окне Messages. 
 
Установка типа подключения матричной клавиатуры 
 
#define COMMON_BUS
 
   Для подключения клавиатуры и индикаторов часто используют общую шину, что позволяет экономить выводы микроконтроллера. Если это макроопределение не закомментировано, значит, клавиатура подключена именно таким способом.
   В этом случае выводы, используемые клавиатурой, конфигурируются лишь на время ее опроса. А по завершению процедуры опроса состояние выводов восстанавливается.  
   Закомментировав макроопределение, можно сэкономить несколько байт флеш памяти.
 
Установка  портов, к которым подключены строки и столбцы клавиатуры
 
//порт, к которому подключены строки
#define PORTX_ROW PORTA
#define PINX_ROW  PINA
#define DDRX_ROW  DDRA
 
//порт, к которому подключены столбцы
#define PORTX_COL PORTB
#define PINX_COL  PINB
#define DDRX_COL  DDRB
 
   Все строки клавиатуры должны быть подключены к одному порту микроконтроллера. Данный модуль не позволяет подключить, например, одну строку к порту B, а остальные к порту С. Это же относится и к столбцам клавиатуры. 
   При этом группа строк или столбцов клавиатуры может быть подключена как к одному, так и к разным портам микроконтроллера. 
 
Установка  выводов, к которым подключены строки и столбцы клавиатуры
 
//выводы, к которым подключены строки 
#define PIN_ROW1 4
#define PIN_ROW2 5
#define PIN_ROW3 6
#define PIN_ROW4 7
 
//выводы, к которым подключены столбцы
#define PIN_COL1 0
#define PIN_COL2 1
#define PIN_COL3 2
#define PIN_COL4 3
 
   Выводы микроконтроллера, подключенные к строкам и столбцам матричной клавиатуры, не должны совпадать между собой. Это требования должно выполняться, когда клавиатура подключена к двум портам микроконтроллера.
 
Установка кодов кнопок
 
//коды кнопок
#define EVENT_NULL 0
#define EVENT_KEY0 '0'
#define EVENT_KEY1 '1'
#define EVENT_KEY2 '2'
#define EVENT_KEY3 '3'
#define EVENT_KEY4 '4'
#define EVENT_KEY5 '5'
#define EVENT_KEY6 '6'
#define EVENT_KEY7 '7'
#define EVENT_KEY8 '8'
#define EVENT_KEY9 '9'
#define EVENT_KEYA 'A'
#define EVENT_KEYB 'B'
#define EVENT_KEYC 'C'
#define EVENT_KEYD 'D'
#define EVENT_KEYZ '*'
#define EVENT_KEYR '#'
 
   Здесь никаких требований нет. Коды кнопок совершенно произвольные. Можно задать символьные значения, соответствующие кнопкам клавиатуры, как это сделано по умолчанию. А можно задать коды, которые будут использоваться в событийной системе. 

Использование модуля

   В модуле реализовано три пользовательские функции.
 
void KEYB_Init(void) – функция инициализации
void KEYB_ScanKeyboard(void) – функция сканирования клавиатуры
unsigned char KEYB_GetKey(void) – функция проверки буфера
 
KEYB_Init() нужно запускать перед использованием двух других функций. Обычно это делается  в начале main`a.
 
KEYB_ScanKeyboard() – это основная функция, реализующая всю работу модуля. Она требует периодического запуска. Можно вставить ее в обработчик прерывания таймера, а можно вызывать ее из основного цикла программы по его сигналу. Первый вариант более расточителен в плане ресурсов микроконтроллера. 
 
KEYB_GetKey() – эта функция возвращает код кнопки, заданный в заголовочном файле keyboard.h. Если кнопочный буфер пуст – функция возвращает код  EVENT_NULL. Вызываем эту функцию там, где собираемся обрабатывать нажатия кнопок. 

Тестовые проекты

   Как обычно, прилагаю тестовые проекты для трех компиляторов. Все они были проверены в железе. Схема на рисунке ниже.
Для любителей симуляций - проект для Протеуса. Сделан на скорую руку, поэтому отличается от реальной схемы.
 

Файлы

Опрос клавиатуры – IAR
Опрос клавиатуры – WinAVR
Опрос клавиатуры – CodeVision
Драйвер матричной клавиатуры
Проект для Proteus`а

Related items