Печать

Подключение матричной клавиатуры к микроконтроллерам AVR

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 15
ПлохоОтлично 

При необходимости использования в устройстве клавиатуры с большим количеством кнопок, например в кодовом замке, очень часто применяют матричную клавиатуру. Если подключить 12 кнопок обычным способом потребуется 12 выводов микроконтроллера плюс общий провод, в матрице же используется всего один порт контроллера, что способствует экономии выводов контроллера. Кнопки в такой клавиатуре подключаются к общим столбцам и к общим строкам, линии порта микроконтроллера разделяются на ввод PB7-PB4 и вывод PB3-PB0. В каждый момент времени сигнал низкого уровня (логический ноль) подается только на одну строку кнопок, на остальные должна подаваться логическая единица. Это исключит неоднозначность определения номера нажатой кнопки. Двоичные сигналы, присутствующие при этом на столбцах клавиатуры, считываются через порт ввода микроконтроллера.

Подключение матричной клавиатуры к микроконтроллерам AVR

В программе обязательно организовываем бесконечный цикл. В специальной функции производим опрос клавиатуры, анализируем полученные данные и выводим результата на индикатор. Опрос клавиатуры заключается в последовательном сканировании каждой строки, для этого на соответствующую линию порта вывода подается логический ноль (эквивалент общего провода), на остальных строках должен быть высокий уровень, после чего с порта ввода, к которому подключены столбцы, считывается код. Если считаны все единицы, то ни одна из клавиш не нажата, в противном случае код содержит информацию о нажатых клавишах. Стоит заметить, что считанный код содержит не только номер замкнутого контакта, но и информацию о нажатии нескольких кнопок одновременно, поэтому лучше хранить в памяти контроллера непосредственно считанный код, а не готовый номер кнопки. Для хранения считанного кода следует ввести специальный алгоритм и переменные.

Ниже показан пример программы в которой при нажатии определенной клавиши ее значение высвечивается на семисегментном индикаторе. Микроконтроллер Atmega8 работает от внутреннего генератора частотой 8MHz.

/*** Подключение матричной клавиатуры к микроконтроллерам AVR ***/
#include <avr/io.h>
#include <util/delay.h> 
// Массив значений для порта вывода
unsigned char key_tab[4] = {0b11111110,
                            0b11111101,
       			            0b11111011,
			                0b11110111};
// Функция опроса клавиатуры
unsigned char scan_key(void)
{
unsigned char key_value = 0;
unsigned char i;
for(i = 0;i < 4;i++)
{
PORTB = key_tab[i]; // выводим лог. 0 в порт вывода
_delay_us(10);
switch (PINB & 0xF0)
{
case 0b11100000:
key_value = 1 + i * 3;
return (key_value);
case 0b11010000:
key_value = 2 + i * 3;
return (key_value);
case 0b10110000:
key_value = 3 + i * 3;
return (key_value);
default:
break;
}
}
return (key_value);
}
int main(void)
{
// массив цифр для индикатора
unsigned char num[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
DDRB |= (1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0); // Порт вывода
DDRB &= ~(1 << PB7)|(1 << PB6)|(1 << PB5)|(1 << PB4); // Порт ввода
PORTB = 0xF0; // Устанавливаем лог. 1 в порт ввода
DDRD = 0xFF; // Выход на индикатор
PORTD = 0x00;
_delay_ms(10);
while(1)
{
if(scan_key()==1) // Выводим значение нажатой кнопки на индикатор
PORTD = num[1];
if(scan_key()==2)
PORTD = num[2];
if(scan_key()==3)
PORTD = num[3];
if(scan_key()==4)
PORTD = num[4];
if(scan_key()==5)
PORTD = num[5];
if(scan_key()==6)
PORTD = num[6];
if(scan_key()==7)
PORTD = num[7];
if(scan_key()==8)
PORTD = num[8];
if(scan_key()==9)
PORTD = num[9];
if(scan_key()==11)
PORTD = num[0];
}
}

Обсуждение статьи на форуме

Файлы:
Проект AVRStudio и Proteus
Дата 08.12.2012 Размер файла 37.33 KB Закачек 1415

Комментарии  

0 #21 AntonChip 07.07.2015 18:09
В самом верху кода нужно добавить #define F_CPU 8000000
Сообщить модератору

Рекомендуем посмотреть