Wednesday, 28 November 2018

Giao Tiếp Ma Trận Phím 4x4


Bàn phím 4x4

Giới thiệu

Bàn phím được sử dụng làm thiết bị đầu vào để đọc phím được người dùng nhấn và xử lý nó.
Bàn phím 4x4 bao gồm 4 hàng và 4 cột. Công tắc được đặt giữa các hàng và cột. Một phím bấm thiết lập kết nối giữa hàng và cột tương ứng giữa công tắc được đặt.
Để đọc báo chí chính, chúng ta cần phải cấu hình các hàng như đầu ra và cột làm đầu vào.
Các cột được đọc sau khi áp dụng các tín hiệu cho các hàng để xác định có hay không một phím được nhấn và nếu được bấm, phím nào sẽ được bấm. 
Thí dụ
Ở đây, chúng ta sẽ giao diện bàn phím 4x4 với AT89S52 (8051) và sẽ hiển thị phím bấm trên LCD16x2.

Sơ đồ giao tiếp
Bàn phím interfacing với 8051

eypad giao tiếp với 8051

Chương trình

#include<reg52.h> #include<stdio.h> #include<string.h> #include "LCD_8_bit.h" /* 16x2 LCD header file*/ #define keyport P1 sbit RS = P3^5; /* RS(register select) for LCD16x2 */ sbit RW = P3^6; /* RW(Read/write) for LCD16x2 */ sbit ENABLE = P3^7; /* EN(Enable) pin for LCD16x2*/ unsigned char keypad[4][4] = {{'7','8','9','/'}, {'4','5','6','x'}, {'1','2','3','-'}, {' ','0','=','+'} }; unsigned char colloc, rowloc; unsigned char key_detect() { keyport=0xF0; /*set port direction as input-output*/ do { keyport = 0xF0; colloc = keyport; colloc&= 0xF0; /* mask port for column read only */ }while(colloc != 0xF0); /* read status of column */ do { do { delay(20); /* 20ms key debounce time */ colloc = (keyport & 0xF0); /* read status of column */ }while(colloc == 0xF0); /* check for any key press */ delay(1); colloc = (keyport & 0xF0); }while(colloc == 0xF0); while(1) { /* now check for rows */ keyport= 0xFE; /* check for pressed key in 1st row */ colloc = (keyport & 0xF0); if(colloc != 0xF0) { rowloc = 0; break; } keyport = 0xFD; /* check for pressed key in 2nd row */ colloc = (keyport & 0xF0); if(colloc != 0xF0) { rowloc = 1; break; } keyport = 0xFB; /* check for pressed key in 3rd row */ colloc = (keyport & 0xF0); if(colloc != 0xF0) { rowloc = 2; break; } keyport = 0xF7; /* check for pressed key in 4th row */ colloc = (keyport & 0xF0); if(colloc != 0xF0) { rowloc = 3; break; } } if(colloc == 0xE0) { return(keypad[rowloc][0]); } else if(colloc == 0xD0) { return(keypad[rowloc][1]); } else if(colloc == 0xB0) { return(keypad[rowloc][2]); } else { return(keypad[rowloc][3]); } } int main(void) { LCD_Init(); LCD_String_xy(1,0,"Press a key"); while(1){ LCD_Command(0xc0); LCD_Char(key_detect()); /* Display which key is pressed */ } }

No comments:

Post a Comment