藍橋杯篇---IAP15F2K61S2矩陣鍵盤


文章目錄

  • 前言
  • 簡介
  • 矩陣鍵盤的工作原理
    • 1.行掃描
    • 2.檢測列狀態
    • 3.按鍵識別
  • 硬件連接
    • 1.行線
    • 2.列線
  • 矩陣鍵盤使用步驟
    • 1.初始化IO口
    • 2.掃描鍵盤
    • 3.消抖處理
    • 4.按鍵識別
  • 示例代碼:4x4矩陣鍵盤掃描
  • 示例代碼:優化后的矩陣鍵盤掃描
  • 注意事項
    • 1.消抖處理
    • 2.掃描頻率
    • 3.IO口配置
    • 4.按鍵映射
  • 總結


前言

本文僅僅簡單介紹了IAP15F2K61S2矩陣鍵盤的使用以及示例代碼。


簡介

矩陣鍵盤是一種常見的輸入設備,通過將按鍵排列成矩陣形式(如4x4、3x3等),可以減少IO口的使用。IAP15F2K61S2 是一款基于8051內核的單片機,可以通過掃描矩陣鍵盤的行和列來檢測按鍵的按下狀態。

矩陣鍵盤的工作原理

1.行掃描

行掃描:將行線設置為輸出,列線設置為輸入

2.檢測列狀態

檢測列狀態:逐行輸出低電平,檢測列線的狀態。

3.按鍵識別

按鍵識別:根據行和列的狀態確定按下的按鍵。

硬件連接

1.行線

行線:連接到單片機的輸出引腳(如P1.0-P1.3)。

2.列線

列線:連接到單片機的輸入引腳(如P1.4-P1.7)。

矩陣鍵盤使用步驟

1.初始化IO口

初始化IO口:設置行線為輸出,列線為輸入

2.掃描鍵盤

掃描鍵盤:逐行輸出低電平,檢測列線的狀態。

3.消抖處理

消抖處理:檢測到按鍵按下后,延時消抖

4.按鍵識別

按鍵識別:根據行和列的狀態確定按下的按鍵。

示例代碼:4x4矩陣鍵盤掃描

以下代碼展示了如何在 IAP15F2K61S2 上實現4x4矩陣鍵盤的掃描,并將按鍵值顯示在數碼管上。

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit ROW1 = P1^0;  // 行線
sbit ROW2 = P1^1;
sbit ROW3 = P1^2;
sbit ROW4 = P1^3;sbit COL1 = P1^4;  // 列線
sbit COL2 = P1^5;
sbit COL3 = P1^6;
sbit COL4 = P1^7;uchar code KEY_MAP[4][4] = {  // 按鍵映射表{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}
};void delay_ms(uint ms) {uint i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}uchar Key_Scan() {uchar row, col;ROW1 = 0; ROW2 = 1; ROW3 = 1; ROW4 = 1;  // 掃描第一行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[0][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[0][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[0][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[0][3]; }ROW1 = 1; ROW2 = 0; ROW3 = 1; ROW4 = 1;  // 掃描第二行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[1][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[1][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[1][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[1][3]; }ROW1 = 1; ROW2 = 1; ROW3 = 0; ROW4 = 1;  // 掃描第三行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[2][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[2][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[2][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[2][3]; }ROW1 = 1; ROW2 = 1; ROW3 = 1; ROW4 = 0;  // 掃描第四行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[3][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[3][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[3][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[3][3]; }return 0;  // 無按鍵按下
}void main() {uchar key;while (1) {key = Key_Scan();  // 掃描鍵盤if (key) {P2 = key;  // 將按鍵值輸出到P2口(假設連接數碼管)delay_ms(200);  // 延時消抖}}
}
代碼說明
KEY_MAP:
定義4x4矩陣鍵盤的按鍵映射表。delay_ms:
毫秒級延時函數,用于消抖。Key_Scan:
掃描矩陣鍵盤,返回按下的按鍵值。
逐行輸出低電平,檢測列線的狀態。
如果檢測到按鍵按下,延時消抖后返回按鍵值。main:
循環掃描鍵盤,將按鍵值輸出到P2口(假設連接數碼管)。

示例代碼:優化后的矩陣鍵盤掃描

以下代碼展示了如何通過優化掃描方式減少代碼量。

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit ROW1 = P1^0;  // 行線
sbit ROW2 = P1^1;
sbit ROW3 = P1^2;
sbit ROW4 = P1^3;sbit COL1 = P1^4;  // 列線
sbit COL2 = P1^5;
sbit COL3 = P1^6;
sbit COL4 = P1^7;uchar code KEY_MAP[4][4] = {  // 按鍵映射表{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}
};void delay_ms(uint ms) {uint i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}uchar Key_Scan() {uchar row, col;uchar row_code = 0xFE;  // 行掃描初值(1111 1110)for (row = 0; row < 4; row++) {P1 = row_code;  // 輸出行掃描信號if (!COL1) return KEY_MAP[row][0];if (!COL2) return KEY_MAP[row][1];if (!COL3) return KEY_MAP[row][2];if (!COL4) return KEY_MAP[row][3];row_code = (row_code << 1) | 0x01;  // 左移一位,準備掃描下一行}return 0;  // 無按鍵按下
}void main() {uchar key;while (1) {key = Key_Scan();  // 掃描鍵盤if (key) {P2 = key;  // 將按鍵值輸出到P2口(假設連接數碼管)delay_ms(200);  // 延時消抖}}
}
代碼說明
Key_Scan:
使用循環和位操作優化掃描過程。
逐行輸出低電平,檢測列線的狀態。
如果檢測到按鍵按下,返回按鍵值。main:
循環掃描鍵盤,將按鍵值輸出到P2口。

注意事項

1.消抖處理

消抖處理:按鍵按下時可能會產生抖動,需通過延時或硬件消抖處理。

2.掃描頻率

掃描頻率:掃描頻率不宜過高,否則可能導致檢測不準確

3.IO口配置

IO口配置:確保行線和列線的IO口配置正確。

4.按鍵映射

按鍵映射:根據實際硬件連接調整按鍵映射表

通過以上代碼和說明,你可以在 IAP15F2K61S2 上實現矩陣鍵盤的掃描功能,并將按鍵值用于控制其他外設(如數碼管、LED等)。


總結

以上就是今天要講的內容,本文僅僅簡單介紹了IAP15F2K61S2矩陣鍵盤的使用以及示例代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70381.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析?】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase19 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月19日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-019測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

Vue 3 30天精進之旅:Day 29 - 項目實戰

在學習了近一個月的Vue 3知識后&#xff0c;今天是我們學習旅程的第29天。在這一天&#xff0c;我們將專注于實踐&#xff0c;通過一個小型項目來鞏固之前的學習成果&#xff0c;并為之后的展示做好準備。 一、項目目標 我們將構建一個簡單的個人博客應用&#xff0c;具備以下…

Windows Docker運行Implicit-SVSDF-Planner

Windows Docker運行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 設置環境 我將項目git clone在D:/Github目錄中。 下載ubuntu20.04 noetic鏡像 docker pull osrf/ros:noetic-desktop-full-focal 啟動容器&#xff0c;掛載主機的D:/Github文…

PHP 安全與加密:守護 Web 應用的基石

PHP 學習資料 PHP 學習資料 PHP 學習資料 在當今數字化時代&#xff0c;Web 應用無處不在&#xff0c;而 PHP 作為一種廣泛使用的服務器端腳本語言&#xff0c;承載著無數網站和應用的核心邏輯。然而&#xff0c;隨著網絡攻擊手段日益復雜&#xff0c;PHP 應用面臨著諸多安全…

Qt中使用QPdfWriter類結合QPainter類繪制并輸出PDF文件

一.類的介紹 1.QPdfWriter介紹 Qt中提供了一個直接可以處理PDF的類&#xff0c;這就是QPdfWriter類。 &#xff08;1&#xff09;PDF文件生成 支持創建新的PDF文件或覆蓋已有文件&#xff0c;通過構造函數直接綁定文件路徑或QFile對象&#xff1b; 默認生成矢量圖形PDF&#…

Golang GORM系列:GORM無縫集成web框架

高效的數據管理是每個成功的web應用程序的支柱。GORM是通用的Go對象關系映射庫&#xff0c;它與流行的Go web框架搭配得非常好&#xff0c;提供了無縫集成&#xff0c;簡化了數據交互。本指南將帶你探索GORM和web框架&#xff08;如Gin&#xff0c; Echo和Beego&#xff09;之間…

SAM C++ TensorRT(實時圖像分割)

SPEED SAM C TENSORRT &#x1f310; 1、概述 用于SAM&#xff08;segment anything model分割一切模型&#xff09;的TensorRT和CUDA優化的高表現C實現&#xff0c;特別適用于實時圖像分割任務。 &#x1f4e2; 更新 模型轉換&#xff1a;從ONNX模型構建TensorRT引擎以加速…

【LLAMA】羊駝從LLAMA1到LLAMA3梳理

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 論文&#xff1a; LLaMA: Open and Efficient Foundation Language Models 時間&#xff1a; 2023.02 1.1 前言…

什么是網絡安全?網絡安全防范技術包括哪些?

伴隨著互聯網的發展&#xff0c;它已經成為我們生活中不可或缺的存在&#xff0c;無論是個人還是企業&#xff0c;都離不開互聯網。正因為互聯網得到了重視&#xff0c;網絡安全問題也隨之加劇&#xff0c;給我們的信息安全造成嚴重威脅&#xff0c;而想要有效規避這些風險&…

【從0做項目】Java搜索引擎(7) web模塊

阿華代碼&#xff0c;不是逆風&#xff0c;就是我瘋 你們的點贊收藏是我前進最大的動力&#xff01;&#xff01; 希望本文內容能夠幫助到你&#xff01;&#xff01; 目錄 文章導讀 零&#xff1a;項目結果展示 一&#xff1a;后端web模塊 1&#xff1a;思路 2&#xff1a…

Visual Studio Code 集成 Baidu Comate

文章目錄 安裝Baidu Comate插件 安裝Baidu Comate插件 從左主側欄中 點擊 【擴展】這個圖標&#xff0c;然后在上方輸入欄中輸入 baidu comate —>選中列出的Bai Comate —>點擊 【安裝】按鈕&#xff0c;等待安裝完畢…

WeMos D1+PIR+Android 的小場景制作

最近在做一個有趣的小場景功能&#xff0c;其實已經有成熟產品&#xff0c;但是考慮到沒法實現場景擴展&#xff0c;所以自己開始動手做。 場景描述&#xff1a;玄關人體感應&#xff0c;有人進門&#xff0c;致歡迎詞&#xff0c;有人離開&#xff0c;致歡送詞。 硬件設備&a…

Android ListPreference使用

Android ListPreference使用 參考 添加鏈接描述 導入 androidx.preference.ListPreferenceListPreference是Android中的一個Preference子類,用于顯示一個可選擇的列表,并且可以保存用戶所選擇的值。它繼承自DialogPreference,可以在用戶點擊時彈出一個對話框,顯示可選擇的…

Spring Security實現記住我功能的實戰指南

在現代Web應用中&#xff0c;"記住我"功能是提升用戶體驗的重要特性之一。用戶無需在每次訪問時重新登錄&#xff0c;這不僅方便&#xff0c;還能增強用戶對應用的粘性。今天&#xff0c;我們將通過一個具體的實例&#xff0c;詳細探討如何在Spring Security中實現&q…

用命令模式設計一個JSBridge用于JavaScript與Android交互通信

用命令模式設計一個JSBridge用于JavaScript與Android交互通信 在開發APP的過程中&#xff0c;通常會遇到Android需要與H5頁面互相傳遞數據的情況&#xff0c;而Android與H5交互的容器就是WebView。 因此要想設計一個高可用的 J S B r i d g e JSBridge JSBridge&#xff0c;不…

ModuleNotFoundError: No module named ‘timm.optim.novogr兩種解決方法

運行報錯 from timm.optim.novograd import NovoGradModuleNotFoundError: No module named ‘timm.optim.novograd’。 問題原因 timm版本過高&#xff0c;novograd函數已被拋棄。 解決辦法 方法1&#xff1a;安裝更低版本的timm pip install timm0.4.12方法2&#xff1a…

DeepSeek 本地部署指南:從零開始搭建 AI 搜索工具

1. 引言 背景介紹 DeepSeek 是一款基于 AI 的搜索工具&#xff0c;能夠高效處理海量數據&#xff0c;提供精準的搜索結果。它結合了 Ollama 的模型管理能力&#xff0c;使得部署更加便捷。 為什么選擇本地部署 本地部署可以確保數據隱私&#xff0c;避免云端傳輸的風險&…

昇騰DeepSeek模型部署優秀實踐及FAQ

2024年12月26日&#xff0c;DeepSeek-V3橫空出世&#xff0c;以其卓越性能備受矚目。該模型發布即支持昇騰&#xff0c;用戶可在昇騰硬件和MindIE推理引擎上實現高效推理&#xff0c;但在實際操作中&#xff0c;部署流程與常見問題困擾著不少開發者。本文將為你詳細闡述昇騰 De…

vscode復制到下一行

linux中默認快捷鍵是ctrl shift alt down/up 但是在vscode中無法使用&#xff0c;應該是被其他的東西綁定了&#xff0c;經測試&#xff0c;可以使用windows下的快捷鍵shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…

網絡爬蟲學習:借助DeepSeek完善爬蟲軟件,實現模擬鼠標右鍵點擊,將鏈接另存為本地文件

一、前言 最近幾個月里&#xff0c;我一直在學習網絡爬蟲方面的知識&#xff0c;每有收獲都會將所得整理成文發布&#xff0c;不知不覺已經發了7篇日志了&#xff1a; 網絡爬蟲學習&#xff1a;從百度搜索結果抓取標題、鏈接、內容&#xff0c;并保存到xlsx文件中 網絡爬蟲學…