Giao tiếp với KeyPad 4×4

1.  Lập trình nhúng – Giao tiếp với KeyPad 4×4

1.1.      Mục tiêu

Nắm được cơ chế hoạt động và thực hiện giao tiếp với phím bấm KeyPad 4×4.

1.2.      Giao tiếp với KeyPad 4×4

1.2.1.     KeyPad 4×4

KeyPad là một thiết bị nhập chứa các nút bấm cho phép người dùng nhập các chữ số, chữ cái hoặc ký tự điều khiển. KeyPad không chứa tất cả bảng mã ASCII như keyboard vì thế nó thường được sử dụng trong các ứng dụng chuyên dụng và tương đối đơn giản, ở đó, số lượng nút nhấn thay đổi phụ thuộc vào ứng dụng.

KeyPad 4×4 là bàn phím gồm 16 nút nhấn, được xếp thành 4 hàng, mỗi hàng gồm 4 phím bấm như hình dưới đây.

Giao tiếp với KeyPad 4x4_Fig1.png

Hình 1: KeyPad 4×4

KeyPad 4×4 được coi là thiết bị đơn giản cho phép người dùng thực hiện thao tác nhập số. Do đó, KeyPad 4×4 được sử dụng khá phổ biến, dưới đây là hình ảnh nguyên lý của KeyPad trong phần mềm mô phỏng Proteus:

Giao tiếp với KeyPad 4x4_Fig2

Hình 2: KeyPad 4×4 trong Proteus

1.2.2.     Cấu tạo và nguyên lý hoạt động

Cấu tạo

KeyPad 4×4 gồm: 8 đầu vào/ra và 16 phím nhấn kết nối theo sơ đồ dưới đây:

Giao tiếp với KeyPad 4x4_Fig3

Hình 3: Cấu tạo của KeyPad 4×4

Các phím bấm được chia thành 4 hàng và 4 cột, 1 đầu của nút bấm được nối với đầu vào cột(C), đầu kia được nối với đầu vào hàng(R).

Nguyên lý hoạt động

Để làm việc với KeyPad 4×4, người lập trình thường sử dụng giải thuật “quét phím”. Giải thuật này yêu cầu VĐK liên tục đưa các tín hiệu đầu ra ở hàng (hoặc cột) và thu lại đầu vào ở cột (hoặc hàng), nếu phím được bấm, đầu phát tín hiệu sẽ được kết nối với đầu thu, từ đó xác định được phím đã bấm.

Việc lựa chọn đầu ra/vào hình thành 2 phương pháp quét phím: theo chiều dọc và theo chiều ngang. Trong báo cáo này, tín hiệu xuất ra ở các hàng và thu lại ở các cột.

Giả sử một nút ‘2’ được nhấn, khi đó đường C và 2 được nối với nhau. Nếu đường C được nối với GND, khi đó, điện áp ở chân số 2 sẽ mang điện áp 0V. Tương tự như thế với các phím cùng hàng C.

Áp dụng thuật toán vào mô hình KeyPad dưới đây:

Giao tiếp với KeyPad 4x4_Fig4

Hình 4: Mô hình KeyPad áp dụng thuật toán “Quét phím”

Thuật toán

Bước 1: set các chân ROW1, ROW2, ROW3, ROW4 như các chân Output và giữ chúng ở mức cao, các chân COL1, COL2, COL3, COL4 như các chân input có điện trở kéo lên.

Bước 2: đưa tín hiệu đầu ra ở các chân ROW1 = 1, ROW2 = 1, ROW3 = 1 và ROW4 =1. Kiểm tra tín hiệu ở các chân COL1, COL2, COL3, COL4 luôn bằng 1 dù có phím nào được nhấn hay không.

Bước 3: đưa tín hiệu đầu ra ở các chân ROW1 = 0, ROW2 = 1, ROW3 = 1 và ROW4 =1.

Kiểm tra COL1, 2, 3 và 4, nếu phím thuộc hàng 1 được nhấn sẽ giá trị COL nhận được bằng 0, ví dụ: ON/C được nhấn, COL1 = 0, COL2, 3, 4 = 1. Nếu phím thuộc các hàng khác (2, 3, 4) được nhấn, các chân COL1, COL2, COL3, COL4 luôn bằng 1.

Bằng thao tác trên, sẽ xác định phím đã được nhấn nếu nó ở hàng 1.

Bước 4: tiếp tục đưa tín hiệu đầu ra ở các chân ROW1 = 1, ROW2 =0, ROW3 = 1, ROW4 = 1 để xác định phím bấm được nhấn nếu nó ở hàng 2.

Bước 5: thực hiện quá trình dịch chân đầu ra mang điện áp mức 0 một cách liên tục và xác định phím được bấm.

1.3.      Giao tiếp với KeyPad 4×4

1.3.1.     Sơ đồ nguyên lý

Để thực hiện quá trình giao tiếp với KeyPad 4×4, ta ghép nối sơ đồ sau:

Hình 5: Sơ đồ nguyên lý mạch giao tiếp KeyPad 4×4

Vì cấu tạo KeyPad bao gồm các nút bấm nên không tránh khỏi nhiễu do việc bấm nút, người dùng có thể sử dụng chống nhiễu bằng phần mềm và kết hợp thêm một mạch chống nhiễu đơn giản bằng cách nối đất tụ gồm, giá trị tùy vào điện trở treo (thường là 104) từ các chân COL1, 2, 3 và 4.

1.3.2.     Code chức năng

Để thực hiện chức năng trên, người dùng sử dụng các hàm trong thư viện KeyPad_4x4.

Khai báo trong file.h

#ifndef __KeyPad_4x4__
#define __KeyPad_4x4__


#define ROW1 PIN_C0 
#define ROW2 PIN_C1
#define ROW3 PIN_C2
#define ROW4 PIN_C3

#define COL1 input(PIN_C4)
#define COL2 input(PIN_C5)
#define COL3 input(PIN_C6)
#define COL4 input(PIN_C7)


#define breakNoisyTime 10
static unsigned char KEYS_PAD[16] = { '7', '8' , '9' , '/',
                                                    '4' ,'5' , '6', 'x',
                                                    '1' , '2' , '3', '-',
                                                    '*' , '0', '=' , '+' };

 

KeyPad_Control()

Cú pháp:           KeyPad_Control(int row, int1 state)

Tham số:

  • (int) row: hàng cần scan.
  • (int1) state: trạng thái xuất ra.

Trả về:              không.

Chức năng: ghi trạng thái state tới các đầu ra row tương ứng.

Code:

void KeyPad_Control(int row, int1 state)
{
    int PIN;
    switch(row)
    {
        case 1: PIN = ROW1; break;
        case 2: PIN = ROW2; break;
        case 3: PIN = ROW3; break;
        case 4: PIN = ROW4; break;
    }
    output_bit(PIN, state);
}

 

KeyPad_Init()

Cú pháp:           KeyPad_Init()

Tham số:          không.

Trả về:              không.

Chức năng: chọn PORT C để giao tiếp và cài đặt đầu ra các hàng lên mức điện áp Vcc.

Code:

void KeyPad_Init(void)
{
    // Set TRISC REGISTER
    // PIN C0-C3: output (connect to ROWS)
    // PIN C4-C7: input (connect to COLS)
    set_tris_c(0xF0);       
    for(int i1=0;i1<4;i1++)
    {
         KeyPad_Control(i1, TRUE);
    }
}

 

KeyPad_CheckButton()

Cú pháp:           KeyPad_CheckButton()

Tham số:          không.

Trả về:              (char) mã ASCII của phím được nhấn.

Chức năng: quét phím bấm.

Lưu ý: Hàm này cần được sử dụng liên tục, trong hàm có delay 100 us để tránh nhiễu.

Code:

char KeyPad_CheckButton(void) 
{
   char key = 0;
   for(int i2=0;i2<4;i2++)
   {
       KeyPad_Control(i2+1, FALSE);
       delay_us(50);
       if(COL1==0)
       {
           delay_us(breakNoisyTime);
           if(COL1==0)
           key = 1 + 4*i2; 
       }
       if(COL2==0)
       {
          delay_us(breakNoisyTime);
          if(COL2==0)
          key = 2 + 4*i2; 
       }
 
       if(COL3==0)
       {
           delay_us(breakNoisyTime);
           if(COL3==0)
           key = 3 + 4*i2; 
       } 
 
       if(COL4==0)
       {
           delay_us(breakNoisyTime);
           if(COL4==0)
           key = 4 + 4*i2; 
       }
       KeyPad_Control(i2+1, TRUE); 
    }
 
    if(key != 0)
    {
       return KEYS_PAD[key-1];
    }
    else
    return 0;
}

Để thực hiện chức năng giao tiếp PIC16F877A với Keypad 4×4, hàm main như sau:

 

 // --------------------------------------------------------------------
// ------------------------- KEYPAD 4x4 INTERFACE ---------------------
// --------------------------------------------------------------------
// This main function operate keyPad 4x4 interface and read pushed butt// on
#include <KeyPad_4x4_Interface_v1.h>
#include <lcd16x2.c>
#include <KeyPad_4x4.h>


void main()
{
    unsigned char str[20] = "SIPLAB";
    unsigned char buttonName;
 
    set_tris_b(0x00); 
    LCD_Init();
    LCD_Clear();
    LCD_GotoXY(0,5);
    LCD_Puts(str); 
    KeyPad_Init();
    LCD_GotoXY(1,0);
    sprintf(str,"KeyPad:");
    LCD_Puts(str);
 
    while(TRUE)
    {
        buttonName = KeyPad_CheckButton();
        if(buttonName != 0)
        {
            LCD_GotoXY(1,14);
            LCD_PutChar(buttonName);
            while(KeyPad_CheckButton() == 0);
        }
    }
}

 

1.4.      Kết quả

Phần mềm biên dịch: CCS C Complie.

Phần mềm mô phỏng: Proteus Professional 8.1.

Kết quả thu được khi thực hiện đoạn Code trên:

Giao tiếp với KeyPad 4x4_Fig6

Hình 6: Kết quả mô phỏng

Leave a comment

Create a free website or blog at WordPress.com.

Up ↑