Клавиатуры используется как устройство ввода для считывания нажатой пользователем клавиши и ее обработки.
Модуль клавиатура 4 на 4 состоит из 4 строк и 4 столбцов. Ключи размещаются между строками и столбцами. Нажатие клавиши устанавливает соединение между соответствующей строкой и столбцом, между которыми находится ключ.
Чтобы прочитать нажатие клавиши, нам нужно настроить строки как выходы и столбцы как входы.
Столбцы считываются после применения сигналов к строкам, чтобы определить, нажата ли клавиша, и если нажата, то какая клавиша нажата.
Для получения дополнительной информации о клавиатуре и о том, как ее использовать, обратитесь к статье Клавиатура 4 на 4 в разделе Датчики и модули.
Схема подключения модуля клавиатуры 4 на 4 к PIC18
В качестве примера работы с модулем клавиатуры мы собираемся соединить клавиатуру 4×4 с PIC18F4550 и отобразить нажатую клавишу на LCD16x2.
В данном примере используется LCD16x2 в 4-битном режиме.
Пример кода
/* * Клавиатура 4 на 4 с PIC18F4550 * http://www.rxtx.su * */ #include <pic18f4550.h> #include "Configuration_Header_File.h" #include "16x2_LCD_4bit_File.h" unsigned char keyfind(); /* функция поиска нажатой клавиши */ #define write_port LATB #define read_port PORTB #define Direction_Port TRISB unsigned char col_loc,rowloc,temp_col; unsigned char keypad[4][4]= {'7','8','9','/', '4','5','6','*', '1','2','3','-', ' ','0','=','+'}; void main() { char key; OSCCON = 0x72; RBPU=0; LCD_Init(); /* инициализация LCD16x2 в 4-битном режиме */ LCD_String_xy(0,0,"Press a Key"); LCD_Command(0xC0); /* вывод нажатой клавиши в вторую линию экрана */ while(1) { key = keyfind(); /* клавиша найдена */ LCD_Char(key); /* отображение клавиши на экране LCD16x2 */ } } unsigned char keyfind() { Direction_Port = 0xf0; /* PORTD.0-PORTD.3 выходы PORTD.4-PORTD.7 входы*/ unsigned char temp1; write_port = 0xf0; /* do { do { col_loc = read_port & 0xf0; /* применяем маску и копируем в переменную col_loc */ }while(col_loc!=0xf0); /* проверяем не нажата ли клавиша*/ col_loc = read_port & 0xf0; /* применяем маску и копируем в переменную col_loc */ }while(col_loc!=0xf0); MSdelay(50); write_port = 0xf0; do { do { col_loc = read_port & 0xf0; }while(col_loc==0xf0); /* ожидание нажатия клавиши */ col_loc = read_port & 0xf0; }while(col_loc==0xf0); /* ожидание нажатия клавиши */ MSdelay(20); col_loc = read_port & 0xf0; while(1) { write_port = 0xfe; /* Row 0(D0) подтягиваем к земле а дргие строки (D1-D3) к питанию */ col_loc = read_port & 0xf0; /* читаем состояние порта искомой строки */ temp_col=col_loc; if(col_loc!=0xf0) { rowloc=0; /* если условие выполнено, получаем номер строки */ while(temp_col!=0xf0) /* проверяем порт и ждем кода отпустят кнопку */ { temp_col = read_port & 0xf0; /* проверяем статус порта, в 1 или 0 */ } break; } write_port = 0xfd; /* Row 1(D1) подтягиваем к земле а дргие строки (D1-D3) к питанию */ col_loc = read_port & 0xf0; /* читаем состояние порта искомой строки */ temp_col=col_loc; if(col_loc!=0xf0) { rowloc=1; /* если условие выполнено, получаем номер строки */ while(temp_col!=0xf0) /* проверяем порт и ждем кода отпустят кнопку */ { temp_col = read_port & 0xf0; /* проверяем статус порта, в 1 или 0 } break; } write_port = 0xfb; col_loc = read_port & 0xf0; temp_col=col_loc; if(col_loc!=0xf0) { rowloc=2; /* while(temp_col!=0xf0) { temp_col = read_port & 0xf0; } break; } write_port = 0xf7; col_loc = read_port & 0xf0; temp_col=col_loc; if(col_loc!=0xf0) { rowloc=3; while(temp_col!=0xf0) { temp_col = read_port & 0xf0; } break; } } while(1) { if(col_loc==0xe0) { return keypad[rowloc][0]; /* Возвращаем значение нажатой клавиши*/ } else if(col_loc==0xd0) { return keypad[rowloc][1]; /* Возвращаем значение нажатой клавиши*/ } else if(col_loc==0xb0) { return keypad[rowloc][2]; /* Возвращаем значение нажатой клавиши*/ } else { return keypad[rowloc][3]; /* Возвращаем значение нажатой клавиши*/ } } MSdelay(300); }