Модуль клавиатуры 4 на 4: подключение к PIC18

Модуль клавиатуры 4x4. Описание и принцип работы

Клавиатуры используется как устройство ввода для считывания нажатой пользователем клавиши и ее обработки.

Модуль клавиатура 4 на 4 состоит из 4 строк и 4 столбцов. Ключи размещаются между строками и столбцами. Нажатие клавиши устанавливает соединение между соответствующей строкой и столбцом, между которыми находится ключ.

Чтобы прочитать нажатие клавиши, нам нужно настроить строки как выходы и столбцы как входы.

Столбцы считываются после применения сигналов к строкам, чтобы определить, нажата ли клавиша, и если нажата, то какая клавиша нажата.

Для получения дополнительной информации о клавиатуре и о том, как ее использовать, обратитесь к статье Клавиатура 4 на 4 в разделе Датчики и модули.

Схема подключения модуля клавиатуры 4 на 4 к PIC18

Рисунок 1. Схема подключения клавиатуры к 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);     
 
}
1 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии