51單片機的獨立按鍵與矩陣按鍵的使用以及實例分析

IO 的使用–按鍵

本文主要涉及8051單片機的按鍵的使用,包括獨立按鍵與矩陣按鍵。
其中包括實例分析:

  1. 獨立按鍵 K1 控制 D1 指示燈亮滅
  2. 通過數碼管顯示矩陣按鍵 S1-S16 按下后鍵值 0-F

文章目錄

  • IO 的使用--按鍵
    • 一、按鍵消抖
    • 二、獨立按鍵
      • 獨立按鍵 K1 控制 D1 指示燈亮滅
    • 二、 矩陣按鍵
      • 通過數碼管顯示矩陣按鍵 S1-S16 按下后鍵值 0-F

按鍵是一種電子開關,使用時輕輕按開關按鈕就可使開關接通,當松開手時, 開關斷開。

在了解按鍵之前,我們需要先了解一下按鍵消抖

一、按鍵消抖

通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,電壓信號
如下圖所示:
在這里插入圖片描述

由于機械點的彈性作用,按鍵開關在閉合時不會馬上穩定的接通,在斷開時也不會一下子斷開,因而在閉合和斷開的瞬間均伴隨著一連串的抖動。抖動時間的長短由按鍵的機械特性決定的,一般為 5ms 到 10ms。

按鍵消抖有兩種方式,一種是硬件消抖,另一種是軟件消抖。為了使電路更加簡單,通常采用軟件消抖。

常用的軟件去抖動方法:
1,先設置 IO 口為高電平(由于開發板 IO 都有上拉電阻,所以默認 IO 為高
電平)。
2,讀取 IO 口電平確認是否有按鍵按下。
3,如有 IO 電平為低電平后,延時幾個毫秒
4,再讀取該 IO 電平,如果仍然為低電平,說明按鍵按下。
5,執行按鍵控制程序。

二、獨立按鍵

獨立按鍵電路構成是由各個按鍵的一個管腳連接在一起接地,按鍵其他引腳分別接到單片機 IO 口。

獨立按鍵的原理圖如下:
在這里插入圖片描述

從上圖中可以看出,4 個獨立按鍵的控制管腳連接到 51 單片機的 P3.0-P3.3腳上。其中 K1 連接在 P3.1 上,K2 連接在 P3.0 上,K3 連接在 P3.2 上,K4 連接在 P3.3 上。4 個按鍵另一端全部連接在 GND,當按鍵按下后,對應 IO 口即為低電平

獨立按鍵 K1 控制 D1 指示燈亮滅

#include "reg52.h"
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
//定義獨立按鍵控制腳
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
//定義 LED1 控制腳
sbit LED1=P2^0;
//使用宏定義獨立按鍵按下的鍵值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0void delay_10us(u16 ten_us)
{
while(ten_us--);
}u8 key_scan(u8 mode)
{static u8 key=1;if(mode)key=1;//連續掃描按鍵if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按鍵按下{delay_10us(1000);//消抖key=0;if(KEY1==0)return KEY1_PRESS;else if(KEY2==0)return KEY2_PRESS;else if(KEY3==0)return KEY3_PRESS;else if(KEY4==0)return KEY4_PRESS;}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //無按鍵按下{key=1;}return KEY_UNPRESS;
}
void main()
{
u8 key=0;
while(1)
{key=key_scan(0);if(key==KEY1_PRESS)//檢測按鍵 K1 是否按下LED1=!LED1;//LED1 狀態翻轉
}
}

key_scan 函數帶一個形參 mode,該參數用來設定是否連續掃描按鍵,如果mode 為 0只能操作一次按鍵,只有當按鍵松開后才能觸發下次的掃描,這樣做的好處是可以防止按下一次出現多次觸發的情況。如果 mode 為 1,函數是支持連續掃描的,即使按鍵未松開,在函數內部有 if(mode==1)這條判斷語句,因此 key 始終是等于 1 的,所以可以連續掃描按鍵,當按下某個按鍵,會一直返回這 個按鍵的鍵值,這樣做的好處是可以很方便實現連按操作.

二、 矩陣按鍵

無論是獨立鍵盤還是矩陣鍵盤,單片機檢測其是否被按下的依據都是一樣的,也就是檢測與該鍵對應的 I/O 口是否為低電平。獨立鍵盤有一端固定為低電平,此種方式編程比較簡單。 而矩陣鍵盤兩端都與單片機 I/O 口相連,因此在檢測時需編程通過單片機 I/O 口送出低電平。檢測方法有多種,最常用的是行列掃描線翻轉法

行列掃描法檢測時,先送一列為低電平,其余幾列全為高電平(此時我們確定了列數),然后立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電平(這時我們又確定了行數),則我們便可確認當前被按下的鍵是哪一行哪一列的,用同樣方法輪流送各列一次低電平,再輪流檢測一次各行是否變為低電平,這樣即可檢測完所有的按鍵,當有鍵被按下時便可判斷出按下的鍵是哪一個鍵。當然我們也可以將行線置低電平,掃描列是否有低電平。從而達到整個鍵盤的檢測。

線翻轉法,就是使所有行線為低電平時,檢測所有列線是否有低電平,如果有,就記錄列線值;然后再翻轉,使所有列線都為低電平,檢測所有行線的值,由于有按鍵按下,行線的值也會有變化,記錄行線的值。從而就可以檢測到全部按鍵。

在這里插入圖片描述

4*4 矩陣按鍵引出的 8 根控制線直接連接到 51 單片機的P1 口上。電路中的 P17 連接矩陣鍵盤的第 1 行,P13 連接矩陣鍵盤第 1 列

通過數碼管顯示矩陣按鍵 S1-S16 按下后鍵值 0-F

#include "reg52.h"
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
#define KEY_MATRIX_PORT P1 //使用宏定義矩陣按鍵控制口
#define SMG_A_DP_PORT P0 //使用宏定義數碼管段碼口
//共陰極數碼管顯示 0~F 的段碼數據
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay_10us(u16 ten_us)
{while(ten_us--);
}
//行列式掃描方式
u8 key_matrix_ranks_scan(void)
{u8 key_value=0;KEY_MATRIX_PORT=0xf7;//給第一列賦值 0,其余全為 1if(KEY_MATRIX_PORT!=0xf7)//判斷第一列按鍵是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第一列按鍵按下后的鍵值{case 0x77: key_value=1;break;case 0xb7: key_value=5;break;case 0xd7: key_value=9;break;case 0xe7: key_value=13;break;}}while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開KEY_MATRIX_PORT=0xfb;//給第二列賦值 0,其余全為if(KEY_MATRIX_PORT!=0xfb)//判斷第二列按鍵是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第二列按鍵按下后的鍵值{case 0x7b: key_value=2;break;case 0xbb: key_value=6;break;case 0xdb: key_value=10;break;case 0xeb: key_value=14;break;}}while(KEY_MATRIX_PORT!=0xfb);//等待按鍵松開KEY_MATRIX_PORT=0xfd;//給第三列賦值 0,其余全為 1if(KEY_MATRIX_PORT!=0xfd)//判斷第三列按鍵是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第三列按鍵按下后的鍵值{case 0x7d: key_value=3;break;case 0xbd: key_value=7;break;case 0xdd: key_value=11;break;case 0xed: key_value=15;break;}}while(KEY_MATRIX_PORT!=0xfd);//等待按鍵松開KEY_MATRIX_PORT=0xfe;//給第四列賦值 0,其余全為 1if(KEY_MATRIX_PORT!=0xfe)//判斷第四列按鍵是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第四列按鍵按下后的鍵值{case 0x7e: key_value=4;break;case 0xbe: key_value=8;break;case 0xde: key_value=12;break;case 0xee: key_value=16;break;}}while(KEY_MATRIX_PORT!=0xfe);//等待按鍵松開return key_value;
}//線翻轉式掃描方式
u8 key_matrix_flip_scan(void)
{
static u8 key_value=0;
KEY_MATRIX_PORT=0x0f;//給所有行賦值 0,列全為 1
if(KEY_MATRIX_PORT!=0x0f)//判斷按鍵是否按下
{delay_10us(1000);//消抖if(KEY_MATRIX_PORT!=0x0f)
{
//測試列
KEY_MATRIX_PORT=0x0f;
switch(KEY_MATRIX_PORT)//保存行為 0,按鍵按下后的列值
{case 0x07: key_value=1;break;case 0x0b: key_value=2;break;case 0x0d: key_value=3;break;case 0x0e: key_value=4;break;
}
//測試行
KEY_MATRIX_PORT=0xf0;
switch(KEY_MATRIX_PORT)//保存列為 0,按鍵按下后的鍵值
{case 0x70: key_value=key_value;break;case 0xb0: key_value=key_value+4;break;case 0xd0: key_value=key_value+8;break;case 0xe0: key_value=key_value+12;break;
}while(KEY_MATRIX_PORT!=0xf0);//等待按鍵松開}}elsekey_value=0;return key_value;
}void main()
{
u8 key=0;
while(1)
{
key=key_matrix_ranks_scan();
if(key!=0)
SMG_A_DP_PORT=gsmg_code[key-1];//得到的按鍵值減 1 換算成數組下標
對應 0-F 段碼
}
}

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

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

相關文章

IAR嵌入式解決方案發布全新版本,增強云調試和仿真功能,推動下一代嵌入式軟件開發

通過先進的Arm虛擬硬件集成和Linux系統中增強的基于云的協作,賦能下一代嵌入式軟件開發 瑞典烏普薩拉,2023年12月7日 - 嵌入式開發軟件和服務的全球領導者IAR宣布推出旗艦產品IAR Embedded Workbench for Arm及IAR Build Tools for Arm最新9.50版本。此…

vue2+datav可視化數據大屏(3)

接上一節所說,當我們將接口封裝完了后,我們需要給大屏進行內容填充啦 1,新建組件 📓 我們在ser-views文件夾下新建9個vue組件,如下圖所示,我給編號為1到9 📓在組件里寫入內容我是第一塊...一次類推&#x…

AOSP開機動畫調測技術點(基于Android13)

AOSP開機動畫調測技術點(基于Android13) 開機動畫替換 首先,在你的計算機上創建一個名為"bootanimation"的文件夾,并將"part0"、"part1"和"desc.txt"這三個文件復制到該文件夾中。這些文件包含了開機動畫的圖像…

基于深度學習的超分辨率圖像技術一覽

超分辨率(Super-Resolution)即通過硬件或軟件的方法提高原有圖像的分辨率,圖像超分辨率是計算機視覺和圖像處理領域一個非常重要的研究問題,在醫療圖像分析、生物特征識別、視頻監控與安全等實際場景中有著廣泛的應用。 SR取得了顯著進步。一般可以將現有…

【知識分享】SpringBoot自定義bean

在Spring Boot中,可以使用注解和配置來定義自定義的Bean。以下是自定義Bean的詳細講解和代碼示例: 1.使用注解定義自定義Bean: 在你的自定義類上添加Component或其衍生注解(如Service、Repository等),將該…

小機器人,電子鎖,牙刷,表類開關,磁閥開關等一些安防直流驅動的選型介紹分析 5V,大電流,小封裝

安防監控是一門被人們日益重視的新興行業,就目前發展來看,應用普及程度越來越廣,科技含量也越來越高,幾乎所有高新科技都可促進其發展,尤其是信息時代的來臨,更為該行業的發展提供契機。其中安防領域最為典…

docker 容器內數據映射到容器外

es 暴露的端口很多 es 十分的耗內存 es 的數據一般需要放置到安全目錄!掛載 啟動elasticsearch [rootiZbp1guc0wov85gocdqeaiZ home]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:…

【力扣】刷題備忘錄-動歸-62. 不同路徑

62. 不同路徑 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));// 2D vector的標準寫法 有些麻煩for (int i 0; i < m; i) dp[i][0] 1; // 又忘記寫&#xff1b;了。。。for (int j 0; j < …

Python實現的一個簡單的GAN(生成對抗網絡)例子

一個簡單的GAN&#xff08;生成對抗網絡&#xff09;例子 以下是使用Python實現的一個簡單的GAN&#xff08;生成對抗網絡&#xff09;例子&#xff0c;它可以生成手寫數字圖像 python # Importing libraries import numpy as np import matplotlib.pyplot as plt from tenso…

【Docker】Docker的安裝部署及優化詳解

一、部署20版本的docker docker初期版本是1.13(同一版本,開源) ——》分類型 1.15 - 1.17 過程中分成兩種。 開源社區 docker-ce 企業版 docker-ee 目前 Docker 只能支持 64 位系統。 #關閉防火墻 systemctl stop firewalld.service setenforce 0 1.1 安裝依賴包 yum instal…

Blackmagic Design Fusion Studio 18 – 創意視覺特效的全能工具!

無論您是電影制片人、電視廣告創作者還是視覺特效藝術家&#xff0c;Blackmagic Design Fusion Studio 18 都是您的完美選擇。這款全能視覺特效軟件為您提供了無限的創意可能性&#xff0c;助力您打造令人驚嘆的視覺效果。 Blackmagic Design Fusion Studio 18 的卓越功能&…

【PWN】學習筆記(二)【棧溢出基礎】

目錄 課程教學C語言函數調用棧ret2textPWN工具 課程教學 課程鏈接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 課程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取碼: 5rx6 C語言函數調…

Doocker還原容器啟動命令參數

get_command_4_run_container可以還原docker執行命令, 這是個第三方包&#xff0c;需要先安裝&#xff1a; docker pull cucker/get_command_4_run_container 命令格式&#xff1a; docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run…

MISRA C++ 2023:C和C++測試解決方案實現靜態分析

自動化軟件測試解決方案的全球領導者Parasoft今天宣布&#xff0c;隨著Parasoft C/Ctest 2023.2即將發布&#xff0c;全面支持MISRA C 2023。Parasoft針對C和C軟件開發的完全集成測試解決方案計劃于2023年12月發布&#xff0c;可以幫助團隊實現自動化靜態分析和編碼標準合規性&…

git報錯WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

git報錯WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 可能存在的情況是&#xff1a;連接的gitlab服務已經切換物理服務器。除了上述的可能性還可以參考以下 Git Pull FailedWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING …

Windows 安全基礎——NetBIOS篇

Windows 安全基礎——NetBIOS篇 1. NetBIOS簡介 NetBIOS&#xff08;Network Basic Input/Output System, 網絡基本輸入輸出系統&#xff09;是一種接入服務網絡的接口標準。主機系統通過WINS服務、廣播及lmhosts文件多種模式&#xff0c;把NetBIOS名解析對應的IP地址&#xf…

Windows安裝Maven

一、Maven 是什么&#xff1f; Maven 是一個項目管理和整合工具。Maven 為開發者提供了一套完整的構建生命周期框架。開發團隊幾乎不用花多少時間就能夠自動完成工程的基礎構建配置&#xff0c;因為 Maven 使用了一個標準的目錄結構和一個默認的構建生命周期。 在有多個開發團…

AirServer Mac7.27中文破解2024最新圖文安裝激活教程含許可證

AirServer Mac 7.27中文破解是一款便捷式投屏軟件&#xff0c;它的主要功能在于實時地將移動設備上的圖像畫面內容投放到電腦設備上&#xff0c;讓電腦成為iPad、iPhone等iOS系統設備的大屏顯示器。 在設備之間建立局域網內的信號發送與接收通道&#xff0c;確保數據可以穩定安…

pytorch 常用api筆記

view_as()函數 函數定義&#xff1a;view_as(tensor) [參數為一個Tensor張量] 該函數的作用是將調用函數的變量&#xff0c;轉變為同參數tensor同樣的形狀。 例子 data1 [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [10, 11]]] t1 torch.Tensor(data1).long() # size2…

【解刊】IEEE(trans),1區TOP,CCF-B,審稿國人友好,最快僅1個月錄用!值得收藏~

計算機類 ? 好刊解讀 今天小編帶來IEEE旗下計算機領域高分好刊&#xff0c;CCF-B類推薦的期刊解讀&#xff0c;期刊審稿快&#xff0c;投稿友好&#xff0c;如您有投稿需求&#xff0c;可作為重點關注&#xff01;后文有相關領域真實發表案例&#xff0c;供您投稿參考~ 01 期…