Tạo bàn phím ma trận bằng Proteus
Trong bài viết này, chúng ta sẽ thảo luận về việc thiết kế bàn phím ma trận và phần lập trình để nhận thông tin về phím được nhấn. Bàn phím ma trận được sử dụng trong các hệ thống/điều khiển nơi Giao diện Máy Người (HMI) là cần thiết để thay đổi các thông số vận hành của một hệ thống/máy. Bàn phím máy tính cũng là một bàn phím ma trận.
Chính tên của nó đã gợi ý rằng nó có một số phím được sắp xếp thành các hàng và cột. Ở đây, sắp xếp các phím không có nghĩa là bố trí của chúng hoặc vị trí vật lý trên mạch điều khiển, mà là các phím được xác định dưới dạng các phần tử của một ma trận như M11, M12, và cứ tiếp tục... lên đến M44 cho một bàn phím ma trận 4x4.
Ưu điểm của các bàn phím ma trận là tất cả các công tắc của ma trận có thể được đọc bằng số lượng ít chân I/O hơn của một bộ xử lý/vi điều khiển. Ví dụ, xem xét một bàn phím ma trận 4x4, chứa 4x4=16 phím. Chúng ta cần 16 chân của vi điều khiển để đọc trạng thái của 16 công tắc/nút nhấn này một cách riêng biệt. Nhưng, bằng cách sử dụng cấu hình ma trận, chỉ cần 8 chân là đủ. Trong trường hợp này, số lượng chân được giảm đôi.
Kết nối nút nhấn theo định dạng của bàn phím ma trận
Hãy lấy bàn phím ma trận 4x4 làm tham chiếu và hiểu về các kết nối. Đối với một bàn phím ma trận 4x4, có tổng cộng 4x4=16 nút nhấn. Để dễ hiểu, hãy sắp xếp 16 nút nhấn này như là các phần tử của một ma trận 4x4, tức là, trong bốn hàng và bốn cột. Các kết nối này được thực hiện điện trị như được hiển thị dưới đây. Vì mỗi nút nhấn có hai chân, chân 1 của mỗi nút trong một hàng được kết nối với các nút nhấn khác. Tương tự, các nút nhấn trong mỗi cột có một trong các chân của chúng được kết nối với các nút nhấn còn lại trong cùng một cột, do đó tạo ra 4 chân đại diện cho bốn hàng và 4 chân đại diện cho bốn cột.
Lập trình vi điều khiển để đọc phím được nhấn
Phím được xác định dưới dạng các hàng và cột. Để làm điều này, chúng ta sẽ kích hoạt từng cột một (bằng cách gửi tín hiệu logic HIGH) và sau đó đọc hàng được kích hoạt do phím được nhấn cho mỗi cột. Nếu không có phím nào được nhấn, tất cả các hàng sẽ được đọc là LOW. Cùng quy trình có thể được thực hiện bằng cách đổi chỗ các hàng và cột.
Bây giờ, hãy đưa logic này vào một chương trình C. Đối với bàn phím ma trận 4x4, trong một vi điều khiển, chúng ta cần 4 chân làm đầu ra để kích hoạt các cột và 4 chân làm đầu vào để đọc các hàng. Biến được đặt tên là 'column' chứa thông tin về cột được kích hoạt. Cùng một dữ liệu được nạp vào PORTC bằng một biến tạm thời. Biến tạm thời này được nạp ban đầu với giá trị '1' và được dịch trái bằng cách nhân với '2' mỗi khi vòng lặp được thực hiện. 'For loop' được khởi động lại với temp=1 và column=1. Vì mỗi hàng chứa 4 công tắc, các công tắc của hàng 1 có thể được giá trị làm cột. Khi một công tắc từ hàng thứ hai được nhấn, vì có 4 công tắc trước hàng 2, nó được giá trị là '4+column'. Do đó, logic của chúng ta được chuyển thành Chương trình C.
Phím được xác định có thể được sử dụng tùy theo ứng dụng cần thiết. Trong chương trình ví dụ này, hãy hiển thị số của phím được nhấn. Để làm điều này, một nhãn switch với 16 trường hợp cho 16 phím được sử dụng để hiển thị giá trị của phím dưới định dạng thập lục phân.
Chống nhấn nút (Key Debounce)
Các công tắc được sử dụng trong bàn phím ma trận có thể thuộc các loại khác nhau. Các bộ phận cơ khí của nút nhấn không thay đổi trạng thái của chúng một cách mượt mà. Chúng tạo ra một đầu ra tạm thời mà vi điều khiển có thể hiểu nhầm như là việc nút được vận hành liên tục. Để tránh hiểu lầm này, một thời gian trễ có thể được thêm vào chương trình sau khi phát hiện phím được nhấn để đảm bảo rằng trạng thái tạm thời được ổn định. Thời gian trễ này có thể được bao gồm trong luồng chương trình trước hoặc sau khi thực hiện chức năng của phím. Con trỏ lệnh thực thi nhãn Switch và sau khi xác định phím, hàm trễ được thực thi. Hàm trễ này được thực thi ngay cả khi không có phím nào được nhấn. Nếu điều này không mong muốn, hàm trễ có thể được bao gồm trong mỗi trường hợp của nhãn switch.
Nếu hệ thống có các đầu ra khác như hiển thị đoạn nhiều lớp hoặc ma trận và cần được cập nhật liên tục, thì thay vì sử dụng hàm trễ, tốt hơn là thực hiện một chu kỳ của việc cập nhật đó. Ví dụ, nếu chúng ta phải hiển thị một giá trị 6 chữ số trên một hiển thị đoạn, thì thay vì sử dụng hàm trễ để loại bỏ hiệu ứng nảy cần của nút, hiển thị có thể được làm mới từ 10 đến 50 lần.
Thay đổi chức năng của phím
Một ma trận 4x4 chứa 16 phím. Số lượng này có thể được kéo dài lên 32 phím bằng cách sử dụng một nút bấm thêm vào ma trận hoặc tăng lên 30 phím bằng cách sử dụng một trong các phím ma trận như một nút chọn tương tự như 'Shift key' trên bàn phím. Điều này hoàn toàn là một phương pháp phần mềm. Nếu người dùng sử dụng nút chọn và nhả nút, sau đó chức năng thay thế được kích hoạt và điều này tiếp tục cho đến khi người dùng kích hoạt nút chọn lần tiếp theo. Điều này giống như một hành động chuyển đổi giữa chức năng bình thường và chức năng thay thế của các phím. Dưới đây là chương trình để chuyển đổi 16 phím thành 30 chức năng. Điều này hữu ích để phát triển các hệ thống đơn giản không yêu cầu hiển thị chữ số để hiển thị tùy chọn Menu.
Bàn phím trong Proteus
Trong phần mềm Proteus có sẵn các bàn phím ma trận tích hợp. Hoạt động của chúng như đã thảo luận cho đến nay. Các bàn phím này có thể được sử dụng khi phát triển phần mô phỏng của một nguyên mẫu. Các bàn phím của điện thoại và máy tính được có sẵn trong phần mềm.
Sử dụng Bàn phím Điện thoại
Bàn phím điện thoại trong phần mềm Proteus có ba cột và bốn hàng. Do đó, chương trình phải được sửa đổi để xác định đúng phím. Biến cột phải chạy từ '1 đến 3' thay vì '1 đến 4' và vì có 3 công tắc phía trên hàng thứ 2, nên phím được đọc là '3+column' thay vì '4+column'.
Nhận dạng khóa điều khiển ngắt
Mã chương trình hiển thị ở trên hoạt động tốt và đáp ứng mục đích. Nó được gọi là kiểu lập trình Polling, tức là CPU phải liên tục đọc các hàng để tìm ra phím đã được nhấn. Điều này thích hợp cho các hệ thống phải thực hiện các nhiệm vụ đơn giản như hiển thị phím đã được nhấn dưới dạng chữ cái hoặc số, hoặc chuyển đổi tải cụ thể, v.v. Tuy nhiên, nếu bộ xử lý phải thực hiện một số công việc khác ngoài các công việc đã nêu trước đó, lập trình dựa trên ngắt là một lựa chọn tốt hơn.
Trong kiểu lập trình này, phần nhận diện phím bắt đầu hoạt động khi người dùng thao tác bất kỳ phím nào. Quá trình nhận diện có thể bắt đầu ngay lập tức với lần nhấn phím đầu tiên hoặc nó có thể được sử dụng như một tín hiệu báo thức trong trường hợp có chế độ ngủ liên quan đến hệ thống. Kết nối mạch cần được sửa đổi cho mục đích này. Vi điều khiển phải có nguồn ngắt bên ngoại. Kết nối mạch để tạo ra một Ngắt cho mỗi lần nhấn phím được hiển thị dưới đây.
Từ hình ảnh trên, rõ ràng rằng khi nhấn một trong các công tắc, trạng thái của chân ngắt, tức là INT0, thay đổi từ thấp (Low) lên cao (High). Do đó, ngắt cụ thể này nên được xác định để tạo ra Ngắt trên sự chuyển động từ thấp lên cao. Mỗi khi một phím được nhấn, một Ngắt được tạo ra. Hàm Nhận diện Phím phải chạy, tức là "vòng lặp for" đã được thảo luận trước đó. Đây là cách chúng ta có thể giảm tải cho bộ xử lý thay vì liên tục làm mới các cột. Dưới đây là mã chương trình được sửa đổi.
Bàn phím Chữ số và Chữ cái
Bàn phím ma trận đã được thảo luận cho đến nay có thể được sử dụng như một bàn phím chữ số và chữ cái bằng cách sửa đổi chương trình. Vì có 16 phím, chúng ta sẽ sử dụng 12 phím cho dữ liệu chữ số và chữ cái tương tự như bàn phím điện thoại di động. Để làm điều này, một bộ đếm thời gian được sử dụng để theo dõi khoảng thời gian giữa một lần nhấn phím đến lần nhấn phím kế tiếp. Nếu khoảng thời gian này đạt đến giá trị được thiết lập trước, thì con trỏ chuyển sang vị trí tiếp theo và dữ liệu ở vị trí trước đó vẫn giữ nguyên như thể hiện. Sơ đồ mạch cho ví dụ bàn phím ma trận chữ số và chữ cái được hiển thị dưới đây.
Mã chương trình dưới đây sử dụng hai biến mới, một là 'roll' để chỉ định xem khoảng thời gian đã đạt được và con trỏ đã được di chuyển hay chưa, và biến còn lại là 'roll_out' để đếm khoảng thời gian, giá trị của nó có thể được biến đổi để thay đổi khoảng thời gian di chuyển con trỏ. Mỗi khi một phím được nhấn, giá trị của phím được kiểm tra xem nó thuộc về ký tự hay các chức năng đặc biệt. Tùy thuộc vào kết quả, các chức năng phím được thực hiện để lưu trữ ký tự vào biến tin nhắn. Dưới đây là biểu đồ luồng của quy trình.
Trong ví dụ này, văn bản đã nhập được hiển thị trên màn hình sau khi nhấn phím 'Enter'. Phím xóa được sử dụng như là phím Backspace. Phím=8 là phím chuyển đổi loại ký tự, chuyển đổi giữa chữ hoa, chữ thường, ký hiệu và số. Khi chạy chức năng phím được thực hiện, ký tự đầu tiên của phím đó được nạp vào biến ký tự[]. Nếu cùng một phím được nhấn liên tục, thì chỉ số của nó được tăng lên để lấy các ký tự còn lại của phím. Đối với các ký hiệu và số, chỉ số này không được tăng lên vì chúng là duy nhất. Tuy nhiên, để bao gồm thêm ký hiệu, chương trình có thể được sửa đổi để tăng chỉ số của ký tự loại ký hiệu.
Hotline: 0979 466 469