Ma trận phím là một thiết bị rất hay được sử dụng trong lập trình vi điều khiển, chúng giúp cho việc tiết kiệm chân GPIO của vi điều khiển. Trong bài này chúng ta sẽ học cách quét ma trận, lý thuyết quét này cũng được sử dụng trong các loại led ma trận khác nhau.
Bài này nằm trong Serie Học STM32 từ A tới Z
Ma trận bàn phím (Keypad) là gì?
Ma trận phím là tập hợp các nút nhấn kết nối với nhau theo các hàng và cột. Số nút nhấn tương ứng sẽ là tích của số hàng x số cột.
Ví dụ: Ma trận phím 4×4 sẽ có 4 cột và 4 hàng. Số lượng phím là 16 phím
Để điểu khiển 16 nút nhấn, thông thường chúng ta phải sử dụng 16 GPIO nhưng nếu sử dụng ma trận phím chúng ta chỉ cần sử dụng 8 GPIO.
Các nút nhấn sẽ nối hàng và cột với nhau. Khi nhấn nút 1 dây Hàng (Row) sẽ nối với dây Cột (Colum hay Col). Các nút nhấn tương ứng sẽ có vị trí nối hàng với cột khác nhau.
Ví dụ: Nút dầu tiên trong ma trận được nhấn sẽ nối Cột 1 (C1) với hàng 1(R1), nút liền kề bên phải được nhấn sẽ nối Cột 2(C2) với Hàng 1(R1). Tương tự như vậy với các nút khác.
Quét phím là gì? Hướng dẫn điều khiển ma trận phím
Trong bài về nút nhấn chúng ta đã được học cách đọc trạng thái của 1 chân ( Read Input GPIO), Nút nhấn được nối 1 đầu vào GPIO 1 đầu vào GND hoặc VCC. Khi nhấn nút thì GND hoặc VCC được thông với nút nhấn, vậy nên khi Read sẽ cho kết quả 0 hoặc 1
Ý tưởng quét bàn phím như sau:
Thay vì nối 1 đầu nút nhấn với GND (hoặc VCC) chúng ta nối đầu đó với 1 GPIO khác. Chân GPIO đó chúng ta để là OUTPUT, vậy là chúng ta có thể điều khiển được điện áp trên đầu đó. Khi đó nếu nhấn nút GPIO Input = giá trị GPIO Ouput.
Ở trạng thái bình thường. GPIO Input được để ở chế độ pull down ( khi chưa nhấn nút sẽ có giá trị 0) , GPIO Ouput sẽ ở trạng thái 0 ( Chưa active). Khi đó cho dù chúng ta ấn nút thì GPIO Input cũng sẽ vẫn là gía trị 0.
Khi chúng ta đổi trạng thái GPIO Output sang 1 ( Active), nhấn nút thì GPIO Input sẽ đọc được giá trị 1.
Vậy khi nối nút nhấn thành ma trận 3×4.
Quét phím sẽ diễn ra như sau: Khi quét cột 1, nếu các phím trong cột đó được nhấn, tương ứng trạng thái GPIO của các hàng sẽ thay đổi theo vị trí của nút nhấn. Các nút nhấn trong các cột khác dù được nhấn cũng không có tác dụng gì.
Khi quét đến cột 2,3. cũng tương tự như vậy. Quá trình quét phải sảy ra rất nhanh, để có thể kiểm tra được tất cả các nút trong thời gian nhấn và thả ra.
VD:
Để đọc được giá trị nhấn vi điều khiển sẽ lần lượt ghi mức 1 vào các chân 2 7 6 4 (Quét Hàng). Sau đó sẽ đọc giá trị từ 3 chân 3 1 5.
Nếu khi quét pin 2 mà pin3 có tín hiệu => nút 1 được nhấn.
Tương tự với các nút còn lại.
Cấu tạo của ma trận phím 3×4 (Keypad 3×4)
Bao gồm 3 cột và 4 hàng, sắp xếp theo thứ tự sau
Trong bài viết này chúng ra sẽ sử dụng bàn phím cứng 3×4, Pinout tương tự như bàn phím mềm.
Lập trình STM32 quét ma trận phím 3×4
Cấu hình trong CubeMx
Chọn chip ST32F103C8T6. Cấu hình SYS – Debug – Serial Wire. Thạch anh nội
Trong GPIO chọn PA0 – 3: Input pull up, PA4- 6: Output
Tab Connectivy chọn UART1 Asynch
Đặt tên và Gen Code
Dowload thư viện Keypad
Các bạn truy cập link: Hướng dẫn download tài liệu lập trình STM32
Download thư viện Device, trong đó có file KEYPAD.c và KEYPAD.h, copy file vào thư mục Src và Inc của project.
Click vào Add file, tìm tới File vừa down về. Nhấn Add để thêm file vào Project
Sử dụng thư viện ma trận phím KEYPAD
Sau khi thêm các file vào, chúng ta Include vào file. Tạo một biến Key để lưu trữ phím được đọc ra
Khai báo 1 bàn phím tên là Keypad và một KeyMap ( Kí tự tương ứng với vị trí nút nhấn trên Keypad)
Trước While (1) khởi tạo các Keypad, truyền các tham số KEYMAP, các cột và hàng vào.
Trong While Sử dụng Readkey để đọc phím, sau đó in ra UART1 và delay 1 khoảng thời gian nhỏ.
Nhấn F7 để Build sau đó nạp code.
Sơ đồ phần cứng
3 Cột tương ứng với chân 3,1,5 trên KEYPAD nối với PA4,5,6
4 Hàng tương ứng với chân 2,7,6,4 trên KEYPAD nối với PA0,1,2,3
Giải thích Code ma trận phím
Hàm Init khởi tạo các giá trị như KEYMAP, Vị trí các chân Cột và hàng, được copy vào struct Keypad đã khai báo.
Hàm Readkey, tạo ra vòng lặp. Trong vòng lặp đó ta ghi giá trị vào các cột, sau đó đọc lần lượt các hàng.
Khi thấy sự nút đó được đọc, ta sẽ return giá trị tương ứng trong KEYMAP
Hàm Config sẽ thay đổi KEYMAP, giúp việc chuyển đổi giá trị các nút nhấn trong quá trình code.
Kết
Phương pháp quét Ma trận phím là một phương pháp rất hay khi sử dụng GPIO, nó cũng tương tự khi quét các loại ma trận led hay các phương pháp quét khác. Các bạn có thể tự code theo lý thuyết mình đã nêu ra để hiểu rõ hơn về vấn đề này nhé.
Đừng quên tham gia nhóm Nghiện lập trình, để có thể kết nối với những anh em khác nhé!
Cho mình hỏi đoạn copy giá trị vào keypad là sao vậy, mình chưa hiểu là giá trị gán cho ColPort[0] là ở đâu mà có
Phần đấy được định nghĩa trong Struct Keypad ở file keypad.h bạn nhé.
anh ơi cho em hỏi tại sao em làm theo hướng dẫn thì báo lỗi , mặc dù em đã add đúng , đủ thư viện. Em cảm ơn
part1\part1.axf: Error: L6218E: Undefined symbol KEYPAD3X4_Readkey (referred from main.o).
part1\part1.axf: Error: L6218E: Undefined symbol KEYPAD3X4_Init (referred from main.o).
em chinh duong dan thu vien chua?
Anh ơi code em chạy được nhưng khi bấm phím 4 nó cứ hiện 2 số 14 thì nó bị lỗi gì vậy ạ
xem dây nối vào chân số 1 có chập với số 4 ko
anh ơi em dùng keypad kết hợp i2c lcd 1602 thì khi ấn nó bị loạn ký tự, cả khi mình in thẳng ký tự ra cũng bị sai k có nghĩa.anh chỉ cách fix giúp em với, em cảm ơn anh