Matrậnphím4*4hiệnthịLCD Ngu ồn : biendt.biz Việc có nhiều nút nhấn cũng như tiết kiệm được chân vi điều khiển là một bài toán đặt ra đối với 1 bài tập vi điều khiển lớn. Việc ghép nối giao tiếp với bàn phím với vi xử lý được ghép nối thành 1 matrận hay gọi là matrận phím! Một matrận n hàng và m cột có thể ghép với nhau tối đa m*n phím chức năng. Hôm nay tôi post bài này lên cho các pác tham khảo cách quét matrậnphím đầu vào. 1) Cấu t ạo của 1 matrậnphím 4x4 Nói đến matrận là ai cũng tưởng tưởng đến hàng và cột. Và các pác cũng bít khi đó nó sẽ có lợi như thế nào khi ghép kiểu matrận này! Cấu tạo nó được như hình vẽ dưới: Phím bấm được nối thành matrận 4 hàng x 4cột, các hàng và cột được nối với các chân cổng vào ra của vi điều khiển Psoc. Khi một phím được bấm, nó sẽ nối một hàng và một cột tương ứng.Như vậy ta sẽ có 16 nút nhấn mà chỉ mất có 8 chân vi điều khiển còn muốn tiếp kiệm hơn nữa là các pác dùng còn giải mã 3 >> 8 (74138) hay dùng 74ls154.(Cái này cũng không cần bit đâu vì bài của mình đâu lớn như thế) nên nối trực tiếp vào chân vi điều khiển cho nó nhanh. Khi nút 0 được nhấn thì nó nối giữa cột 1 hàng 1. CÒn nút 1 được nhấn thì cột 2 và hàng 1 được nối hay nút 2 được nhấn thì nối giữa cột 3 và hàng 1 . cứ như vậy đến nút thứ 15! 2) Nguyên lý quét Thuật toán quét phím được sử dụng là lần lượt tìm hàng và tìm cột (hoặc ngược lại) Khi tìm hàng, các hàng sẽ được đặt làm đầu vào,các cột được đặt làm đầu ra mức thấp. Sau đó kiểm tra các hàng xem có hàng nào ở mức thấp hay không (có phím nào bấm gây ra nối với cột hay không)? Sau khi xác định được hàng sẽ đặt các cột làm đầu vào, hàng vừa tìm được làm đầu ra mức thấp. Việc kiểm tra được tiến hành với các cột. Sau khi xác định đượ c hàng và cột sẽ suy ra phím được bấm. Nói thế này cũng khó hiểu nhỉ nhưng mà chỉ cần hiểu sơ qua thuật toán quét LED như thế này: + Đầu tiên cho các hàng ở mức 1 và các cột ở mức 0 + Kiểm tra xem nào hàng nào đựoc nhấn (khi nút được nhấn) tức là đựoc nhận tín hiệu từ các cột + Nếu mà có 1 hàng bất kỳ đựoc nhấn sau đó ta lại chuyển giá trị 0 vào hàng đựoc nhấn và giá trị 1 vào các cột. Khi đó c ột lại nhận nhiệm vụ làm tín hiệu vào. Nếu mà 1 trong các cột đựoc nhấn (Khi nút được nhấn) trong các trường hợp này thì cho ra các giá trị tương ứng. + Việc kiểm tra các hàng khác là tương tự như trên!Ở đây không đề cập đến việc nhiễu phím nút nhấn nên bỏ qua. Cũng khó hiểu. Thôi đến đoạn chương trình sẽ hiểu sâu hơn! 3) Mạch nguyên lý 3) Chương trình: [CODE]/*---------------------------------------------------------------------------- ==========MA TRANPHIM 4X4 HIENTHI LCD======================= Viet boi: biendt - biendt.biendt@gmail.com Dung P2 de noi vao chan cac matranphim + Tu P2_0 den P2_3 duoc noi vao hang + Tu P2_4 den P2_7 duoc noi vao cot + Tat ca P2 duoc dat o che do Strong Dung LCD 16*2 hienthi gia tri ban phim duoc noi vao cong P0 ----------------------------------------------------------------------------*/ #include // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules unsigned char sttphim; //====================Dinh nghia cac gia tri nut nhan========================= #define hang1 (PRT2DR&0x01) #define hang2 (PRT2DR&0x02) #define hang3 (PRT2DR&0x04) #define hang4 (PRT2DR&0x08) #define cot1 (PRT2DR&0x10) #define cot2 (PRT2DR&0x20) #define cot3 (PRT2DR&0x40) #define cot4 (PRT2DR&0x80) //================================Ham hienthi 2 so tren LCD==================== void lcd2digit(unsigned int Data) { LCD_1_WriteData('0'+Data/10); Data=Data%10; LCD_1_WriteData('0'+Data); } // ==============================Ham quet matran phim========================== void quetphim() { PRT2DR=PRT2DR|0x01; //Cho cac hang muc 1 PRT2DR=PRT2DR|0x02; PRT2DR=PRT2DR|0x04; PRT2DR=PRT2DR|0x08; PRT2DR=PRT2DR&0xef; // Cho cac cot muc 0 PRT2DR=PRT2DR&0xdf; PRT2DR=PRT2DR&0xbf; PRT2DR=PRT2DR&0x7f; if((!hang1)|(!hang2)|(!hang3)|(!hang4)) // kiem tra hang dc nhan { if(hang1==0) // neu hang 1 { PRT2DR=PRT2DR|0x10; // cho cac cot muc 1 PRT2DR=PRT2DR|0x20; PRT2DR=PRT2DR|0x40; PRT2DR=PRT2DR|0x80; PRT2DR=PRT2DR&0xfe; // chuyen hang1 ve muc 0 if(!cot1) sttphim=0; if(!cot2) sttphim=1; if(!cot3) sttphim=2; if(!cot4) sttphim=3; } if(hang2==0) { PRT2DR=PRT2DR|0x10; PRT2DR=PRT2DR|0x20; PRT2DR=PRT2DR|0x40; PRT2DR=PRT2DR|0x80; PRT2DR=PRT2DR&0xfd; // chuyen hang2 ve muc 0 if(!cot1) sttphim=4; if(!cot2) sttphim=5; if(!cot3) sttphim=6; if(!cot4) sttphim=7; } if(hang3==0) { PRT2DR=PRT2DR|0x10; PRT2DR=PRT2DR|0x20; PRT2DR=PRT2DR|0x40; PRT2DR=PRT2DR|0x80; PRT2DR=PRT2DR&0xfb; // chuyen hang3 ve muc 0 if(!cot1) sttphim=8; if(!cot2) sttphim=9; if(!cot3) sttphim=10; if(!cot4) sttphim=11; } if(hang4==0) { PRT2DR=PRT2DR|0x10; PRT2DR=PRT2DR|0x20; PRT2DR=PRT2DR|0x40; PRT2DR=PRT2DR|0x80; PRT2DR=PRT2DR&0xf7; // chuyen hang4 ve muc 0 if(!cot1) sttphim=12; if(!cot2) sttphim=13; if(!cot3) sttphim=14; if(!cot4) sttphim=15; } } } void main() { PRT2DR=0xff; LCD_1_Start(); LCD_1_Position(0,0); LCD_1_PrCString("MTPHIM by BIENDT"); LCD_1_Position(1,0); LCD_1_PrCString("PHIM:"); while(1) { quetphim(); LCD_1_Position(1,8); lcd2digit(sttphim); } }[/CODE] . tiếp với bàn phím với vi xử lý được ghép nối thành 1 ma trận hay gọi là ma trận phím! Một ma trận n hàng và m cột có thể ghép với nhau tối đa m*n phím chức. bài này lên cho các pác tham khảo cách quét ma trận phím đầu vào. 1) Cấu t ạo của 1 ma trận phím 4x4 Nói đến ma trận là ai cũng tưởng tưởng đến hàng và cột.