Подключение матричной клавиатуры к микроконтроллерам AVRПри необходимости использования в устройстве клавиатуры с большим количеством кнопок, например в кодовом замке, очень часто применяют матричную клавиатуру. Если подключить 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];
}
}

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


Архив для статьи "Подключение матричной клавиатуры к микроконтроллерам AVR"
Описание: Проект AVRStudio и Proteus
Размер файла: 37.33 KB Количество загрузок: 2 250 Скачать

Комментарии  

+1 #21 AntonChip 07.07.2015 18:09
В самом верху кода нужно добавить #define F_CPU 8000000
Сообщить модератору
+1 #22 Ксения77 ks77 18.09.2018 08:54
А если в строке зажаты 2 кнопки что будет на входе?
Сообщить модератору
0 #23 Во-Ван 29.04.2022 17:14
Подшаманил я этот код малёха для контроллера ATtiny2313. порты поменялись местами. Теперь порт Д для подключения кравиатуры, а порт Б для индикатора. Кроме того, теперь все конпки используются. "Звездочка выдаёт на индикаторе символ A, решётка выдаёт символ F.

#define F_CPU 1000000UL
#include
#include

unsigned char scan_key(void) // scans keys
{
// sequence of zero for scanning
unsigned char key_tab[4] = {0b01111110, 0b01111101, 0b01111011, 0b01110111};

char key_value=-1;
unsigned char i;

for(i=0; i0) PORTB=num[scan_key()-1];
}
return 0;
}
Сообщить модератору