• 4x4 Matrix Keypad Interfacing with 8051 Microcontroller

QC

4x4 Matrix Keypad Interfacing with 8051 Microcontroller

 4x4 Matrix Keypad Interfacing with 8051 Microcontroller



Bàn phím là thiết bị đầu vào được sử dụng rộng rãi được sử dụng trong các dự án điện tử và nhúng khác nhau. Chúng được sử dụng để lấy dữ liệu đầu vào dưới dạng số lượng và ô trống, và đưa chúng vào hệ thống để xử lý thêm. Trong hướng dẫn này, chúng ta sẽ giao diện bàn phím ma trận 4x4 với vi điều khiển 8051.

4X4 Matrix Keypad

Trước khi giao diện bàn phím với vi điều khiển, trước tiên chúng ta cần hiểu cách thức hoạt động của nó. Bàn phím ma trận bao gồm một tập hợp các nút Đẩy, được kết nối với nhau. Giống như trong trường hợp của chúng tôi, chúng tôi đang sử dụng bàn phím ma trận 4X4, trong đó có 4 nút nhấn ở mỗi hàng trong số bốn hàng. Và các thiết bị đầu cuối của các nút nhấn được kết nối theo sơ đồ. Trong hàng đầu tiên, một đầu cuối của tất cả 4 nút nhấn được kết nối với nhau và một đầu cuối khác của 4 nút nhấn đại diện cho mỗi cột trong số 4 cột, tương tự với mỗi hàng. Vì vậy, chúng tôi nhận được 8 thiết bị đầu cuối để kết nối với một bộ vi điều khiển.




Interfacing keypad with 8051 microcontroller (AT89S52)





Đầu tiên, chúng ta cần giao diện một mô-đun LCD để hiển thị dữ liệu sẽ được cấp qua KEYPAD, vì vậy vui lòng xem qua bài viết “Giao diện LCD với Vi điều khiển 8051” trước khi giao tiếp KEYPAD.

Như trong sơ đồ mạch trên, để giao diện Bàn phím, chúng ta cần kết nối 8 đầu cuối của bàn phím với bất kỳ cổng nào (8 chân) của vi điều khiển. Giống như chúng tôi đã kết nối các thiết bị đầu cuối của bàn phím với Cổng 1 của 8051. Bất cứ khi nào nhấn bất kỳ nút nào, chúng tôi cần xác định vị trí của nút, có nghĩa là ROW tương ứng không có COLUMN. Khi chúng tôi có được vị trí của nút, chúng tôi có thể in ký tự cho phù hợp.

Bây giờ câu hỏi đặt ra là làm thế nào để lấy được vị trí của nút đã nhấn? Tôi sẽ giải thích điều này trong các bước dưới đây và cũng muốn bạn xem mã:

1. Đầu tiên, chúng ta đã tạo tất cả các Hàng ở mức Logic 0 và tất cả các cột ở mức Logic 1.

2. Bất cứ khi nào chúng ta nhấn một nút, cột và hàng tương ứng với nút đó sẽ bị rút ngắn và làm cho cột tương ứng ở mức logic 0. Bởi vì cột đó được kết nối (bị rút ngắn) với hàng, ở mức Logic 0. Vì vậy, chúng ta nhận được cột số. Xem hàm main ().




3. Bây giờ chúng ta cần tìm Row no., Vì vậy chúng ta đã tạo bốn hàm tương ứng với mỗi cột. Giống như nếu bất kỳ nút nào của cột một được nhấn, chúng tôi gọi hàm row_finder1 (), để tìm hàng không.

4. Trong hàm row_finder1 (), chúng tôi đã đảo ngược các mức logic, có nghĩa là bây giờ tất cả các Hàng là 1 và các cột là 0. Bây giờ Hàng của nút được nhấn phải là 0 vì nó đã được kết nối (bị rút ngắn) với cột có nút được nhấn và tất cả các cột đều ở mức logic 0. Vì vậy, chúng tôi đã quét tất cả các hàng cho 0.


5. Vì vậy, bất cứ khi nào chúng ta tìm thấy Hàng ở mức logic 0, có nghĩa là hàng của nút được nhấn. Vì vậy, bây giờ chúng ta có cột không (có ở bước 2) và hàng không., Và chúng ta có thể in không. của nút đó bằng cách sử dụng hàm lcd_data.

Quy trình tương tự được thực hiện cho mỗi lần nhấn nút và chúng tôi đang sử dụng while (1), để liên tục kiểm tra xem nút có được nhấn hay không.

#include<reg51.h>
#define display_port P2      //Data pins connected to port 2 on microcontroller
sbit rs = P3^2;  //RS pin connected to pin 2 of port 3
sbit rw = P3^3;  // RW pin connected to pin 3 of port 3
sbit e =  P3^4;  //E pin connected to pin 4 of port 3

sbit C4 = P1^0;     // Connecting keypad to Port 1
sbit C3 = P1^1;
sbit C2 = P1^2;
sbit C1 = P1^3;
sbit R4 = P1^4;
sbit R3 = P1^5;
sbit R2 = P1^6;
sbit R1 = P1^7;

void msdelay(unsigned int time)  // Function for creating delay in milliseconds.
{
    unsigned i,j ;
    for(i=0;i<time;i++)    
    for(j=0;j<1275;j++);
}
void lcd_cmd(unsigned char command)  //Function to send command instruction to LCD
{
    display_port = command;
    rs= 0;
    rw=0;
    e=1;
    msdelay(1);
    e=0;
}

void lcd_data(unsigned char disp_data)  //Function to send display data to LCD
{
    display_port = disp_data;
    rs= 1;
    rw=0;
    e=1;
    msdelay(1);
    e=0;
}

 void lcd_init()    //Function to prepare the LCD  and get it ready
{
    lcd_cmd(0x38);  // for using 2 lines and 5X7 matrix of LCD
    msdelay(10);
    lcd_cmd(0x0F);  // turn display ON, cursor blinking
    msdelay(10);
    lcd_cmd(0x01);  //clear screen
    msdelay(10);
    lcd_cmd(0x81);  // bring cursor to position 1 of line 1
    msdelay(10);
}

void row_finder1() //Function for finding the row for column 1
{
R1=R2=R3=R4=1;
C1=C2=C3=C4=0;

if(R1==0)
lcd_data('1');
if(R2==0)
lcd_data('4');
if(R3==0)
lcd_data('7');
if(R4==0)
lcd_data('*');
}

void row_finder2() //Function for finding the row for column 2
{
R1=R2=R3=R4=1;
C1=C2=C3=C4=0;

if(R1==0)
lcd_data('2');
if(R2==0)
lcd_data('5');
if(R3==0)
lcd_data('8');
if(R4==0)
lcd_data('0');
}

void row_finder3() //Function for finding the row for column 3
{
R1=R2=R3=R4=1;
C1=C2=C3=C4=0;

if(R1==0)
lcd_data('3');
if(R2==0)
lcd_data('6');
if(R3==0)
lcd_data('9');
if(R4==0)
lcd_data('#');
}

void row_finder4() //Function for finding the row for column 4
{
R1=R2=R3=R4=1;
C1=C2=C3=C4=0;

if(R1==0)
lcd_data('A');
if(R2==0)
lcd_data('B');
if(R3==0)
lcd_data('C');
if(R4==0)
lcd_data('D');
}

void main()
{
    lcd_init();
    while(1)
    {    
        msdelay(30); 
        C1=C2=C3=C4=1;
          R1=R2=R3=R4=0;
          if(C1==0)
          row_finder1();
          else if(C2==0)
           row_finder2();
           else if(C3==0)
        row_finder3();
        else if(C4==0)
        row_finder4();
    }

}








Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...