Lập Trình STM32 Quét Ma Trận Phím Keypad 3×4 - Khuê Nguyễn

Chuyển đến nội dung

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

via GIPHY

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.

ma tran phim 4x4 1

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.

mac dinh
Trạng thái mặc định

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.

khi chua nhan nut
Khi chưa nhấn nút
khi nhan nut
Khi nhấn nút

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.

quet phim

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

download
Keypad 3×4 Mềm
ban phim 3x4 cung
Keypad 3×4 Cứng

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

Screenshot 2

Tab Connectivy chọn UART1 Asynch

Screenshot 3

Đặt tên và Gen Code

Screenshot 4

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

Screenshot 5

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

Screenshot 6

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)

Screenshot 7

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.

Screenshot 8

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.

Screenshot 9

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.

Screenshot 10

Khi thấy sự nút đó được đọc, ta sẽ return giá trị tương ứng trong KEYMAP

Screenshot 11

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é!

5/5 - (3 bình chọn)
nguyenkhue2608

7 những suy nghĩ trên “Lập trình STM32 quét ma trận phím Keypad 3×4

  1. Duy nói:

    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ó

    01/07/2021 tại 21:37 Bình luận
    • Khuê Nguyễn nói:

      Phần đấy được định nghĩa trong Struct Keypad ở file keypad.h bạn nhé.

      01/07/2021 tại 22:30 Bình luận
  2. Bao.nguyen nói:

    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).

    25/07/2021 tại 10:04 Bình luận
    • Khuê Nguyễn nói:

      em chinh duong dan thu vien chua?

      25/07/2021 tại 12:11 Bình luận
  3. Chiến nói:

    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 ạ

    13/08/2021 tại 21:36 Bình luận
    • Khuê Nguyễn nói:

      xem dây nối vào chân số 1 có chập với số 4 ko

      14/08/2021 tại 11:34 Bình luận
  4. nói:

    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

    15/08/2021 tại 22:23 Bình luận

Để lại một bình luận Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Bình luận *

Tên *

Email *

Trang web

Lưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.

Δ

Khuê Nguyễn Creator – Học Lập Trình Vi Điều Khiển

Latest Posts
  • 21 Th4 Xuất file Gerber Alltium và đặt hàng gia công PCB tại JLCPCB
  • 15 Th10 Cơ bản về GitFlow, tại sao nó được sử dụng rộng rãi trong phát triển phần mềm 2 Nhận xét
  • 14 Th10 Học Git cơ bản cho người mới bắt đầu
  • 24 Th8 [STM32 – RTOS] Các trạng thái của Task và Task API
  • 28 Th7 [STM32 – RTOS] Bài 1: Tạo Task và Scheduleing task sử dụng STM32 HAL
Tag Cloud8051 Altium biến Blynk bài tập C Cai Dat Cube Cai dat Keil C CubeMX Công tắc WIFI dac esp32 esp32 http esp32 webserver firebase GPIO Hercules Terminal Hoc lap trinh huong dan phan mem Hướng dẫn Học Altium Học lập trình STM32 học stm32 IOT iot platform lập trình Lập trình C lập trình STM32 ngôn ngữ C ngắt nuvoton phím tắt altium rtos STM32 stm32 lcd1602 STM32 Timer stm32 usb stm32 usb hid thiết kế pcb thư viện altium tổng hợp vi điều khiển vs code Vẽ mạch in điện tử điện tử cơ bản Danh mục
  • Chia Sẻ (18)
    • Chuyện Nghề Lập Trình (3)
    • Công cụ lập trình (9)
    • Kinh nghiệm Lập Trình (5)
  • Chưa được phân loại (1)
  • Điện tử và Phần cứng (25)
    • Điện tử cơ bản (15)
    • Mạch điên tử (3)
    • Vẽ Mạch In Trên Altium (7)
  • Hệ điều hành (2)
    • Hệ điều hành RTOS (2)
  • Học lập trình MCU (89)
    • Lập trình 8051 (7)
    • Lập trình Arduino (2)
    • Lập trình ESP32 (23)
    • Lập trình Esp8266 (4)
    • Lập trình Nuvoton (7)
    • Lập trình STM32 (47)
    • Lập trình STM8 (2)
    • Vi điều khiển cơ bản (3)
  • Lập trình IOT (6)
    • Dự án IOT (1)
    • Giao thức IOT (2)
    • IOT Platform (3)
  • Ngôn Ngữ Lập trình (59)
    • Lập trình C (25)
    • Lập trình C++ (15)
    • Lập trình hướng đối tượng (6)
    • Lập trình Python (16)
Quảng cáo
  • Học lập trình MCU
    • Vi điều khiển cơ bản
    • Lập trình STM32
    • Lập trình 8051
    • Lập trình Nuvoton
    • Lập trình Arduino
    • Lập trình STM8
    • Lập trình AVR
    • Lập trình Esp8266
    • Lập trình ESP32
    • Lập trình Raspberry Pi
  • Điện tử và Phần cứng
    • Điện tử cơ bản
    • Mạch điên tử
    • Vẽ Mạch In Trên Altium
  • Lập trình IOT
    • Giao thức IOT
    • IOT Platform
    • Dự án IOT
  • Hệ điều hành
    • Hệ điều hành RTOS
    • Hệ điều hành Linux
    • Xử lý ảnh
  • Automotive
    • Kiến trúc Autosar
    • Giao thức trên Automotive
    • Các tiêu chuẩn trên Automotive
  • Ngôn Ngữ Lập trình
    • Lập trình C
    • Lập trình C++
    • Lập trình Python
    • Lập trình hướng đối tượng
    • Cấu trúc dữ liệu và giải thuật
  • Chia Sẻ
    • Chuyện Nghề Lập Trình
    • Kinh nghiệm Lập Trình
    • Công cụ lập trình
    • Tài liệu
  • Khóa học
  • WooCommerce not Found
  • Newsletter

Từ khóa » Nguyên Lý Quét Bàn Phím