- Лоботрясы

Поиск
Перейти к контенту

Главное меню:

Библиотеки для AVR

Читать в Яндекс.Подписках



     Библиотека матричной клавиатуры 3x4 и 4x4 для микроконтроллеров AVR
Просмотров: 5245
     Бесспорно, что основным (а у многих – чуть ли не единственным) способом ввода своих данных в микроконтроллер являются кнопки. Но при создании систем типа кодовый замок, система GSM-сигнализации и других, где требуется организация удобного ввода цифровой информации, трудно обойтись без матричной клавиатуры. Один из примеров применения такой клавиатуры был описан в мой статье домашняя сигнализация на AVR. Однако в данном примере программный код работы рассчитан только на клавиатуру 3х4, да и выполнен он там не в качестве отдельной библиотеки. Поэтому, немного его доработав, выкладываю свой вариант библиотеки для матричных клавиатур 3х4 и 4х4 (для CodeVisionAVR). 
     Библиотека позволяет подключить строки и столбцы клавиатуры как к одному так и к разным портам микроконтроллера, главное условие, чтобы подключены они были к смежным выводам каждого порта (например: строки клавиатуры подключены к выводам 2…5 порта PORTD, а столбцы – к выводам 4…6 порта PORT(рисунок ниже)).
     Библиотека рассчитана на то, что выводы микроконтроллера, подключённые к строкам клавиатуры, будут сконфигурированы на выход, а выводы микроконтроллера, подключённые к столбцам клавиатуры, будут сконфигурированы на вход. Этому соответствует и схема подключения матричной клавиатуры к микроконтроллеру (внешние подтягивающие резисторы к плюсу питания на входах микроконтроллера не показаны, т.к. использованы внутренние подтягивающие резисторы портов мк).
     Способы подключения клавиатуры к микроконтроллеру:
     От резисторов R1-R3 можно отказаться, просто на рисунке они показаны с учётом возможного одновременного подключения к выводам 4…6 PORTдругих устройств. 
     А теперь о библиотеке…
     Код, соответствующий каждой кнопке клавиатуры, хранится в двухмерном массиве в файле keyboard.c
#ifdef KEYBOARD_3х4
flash char keykodes[4][3]={{'1','2','3'},
                                     {'4','5','6'},
                                     {'7','8','9'},
                                     {'*','0','#'}};                           
#else //KEYBOARD_4х4                         
flash char keykodes[4][4]={{'1','2','3','A'},
                                     {'4','5','6','B'},
                                     {'7','8','9','C'},                          
                                     {'*','0','#','D'}};
#endif
     Такой код соответствует матричным клавиатурам, приведённым на рисунках ниже:
     Такие клавиатуры (или же с такой раскладкой клавиш) можно легко найти и заказать на AliExpress (этого добра там навалом).
 
     В заголовочном файле keyboard.h вы можете настроить работу библиотеки под свой проект
#define KEYBOARD_3х4 //Если закомментировано, тогда применяется клавиатура 4х4
#define MAX_VALUE   20 //Антидребезговая выдержка времени   
 
//Подключение столбцов (вход микроконтроллера)
#define COLUMN_PORT           PORTB //Портподключённый к столбцам (ко входу микроконтроллера)      
#define COLUMN_DDR             DDRB
#define KEYPAD_COLUMN        PINB 
#define NUM_COLUMN            3 //Количество столбцов клавиатуры
#define FIRST_BIT_COLUMN    4 //С какого бита подключены столбцы 

//Подключение строк (выход микроконтроллера)
#define ROW_DDR            DDRD
#define KEYPAD_ROW       PORTD //Порт, подключённый к строкам (к выходу)
#define NUM_ROW           //Количество строк клавиатуры
#define FIRST_BIT_ROW   2 //С какого бита подключены строки 
//**************************************************************
//                                           ФУНКЦИИ
//************************************************************** 
//Инициализация клавиатуры
void KeypadInit(void);
 
//Проверка нажатия хотя бы одной кнопки
char KeypadCheck(void);
 
//Запускать функцию в основном цикле
char KeypadRead(void);
 
//Функция сканирования клавиатуры
//Функция работает в прерывании таймера!
void KeypadScan(void);
 
     Пользовательскими являются только функции KeypadInit(), KeypadRead() и KeypadScan()Причём функцию KeypadScan() нужно установить в функцию обработчик прерывания по переполнению (или совпадению – как вашей душе угодно) таймера, а с помощью функции KeypadRead() в основном цикле программы уже получаете результат (код) нажатой кнопки клавиатуры.
     Пример работы данного программного кода вы можете посмотреть в исходнике проекта домашняя сигнализация на AVR.

     Скачать

Опубликовано 4.11.2014
© Igoryosha, 2014
 
 
Назад к содержимому | Назад к главному меню