Клавиатуры используется как устройство ввода для считывания нажатой пользователем клавиши и ее обработки.
Модуль клавиатура 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);
}



