?? 專欄簡(jiǎn)介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。
?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋。
??專欄目標(biāo):實(shí)現(xiàn)從零基礎(chǔ)入門51單片機(jī)和STM32單片機(jī),力求在玩好單片機(jī)的同時(shí),能夠了解一些計(jì)算機(jī)的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內(nèi)容: 主要學(xué)習(xí)51單片機(jī)的功能、各個(gè)模塊、單片機(jī)的外設(shè)、驅(qū)動(dòng)等,最終玩好單片機(jī)和單片機(jī)的外設(shè),全程手敲代碼,實(shí)現(xiàn)我們所要實(shí)現(xiàn)的功能。
?? 專欄說明 :如果文章知識(shí)點(diǎn)有錯(cuò)誤的地方,歡迎大家隨時(shí)在文章下面評(píng)論,我會(huì)第一時(shí)間改正。讓我們一起學(xué)習(xí),一起進(jìn)步。
??專欄主頁:http://t.csdn.cn/HCD8v
本學(xué)習(xí)過程參考:https://space.bilibili.com/383400717
單片機(jī)安裝軟件、各種資料以及源碼的路徑:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取碼:gdzf
本節(jié)主要介紹LCD1602調(diào)試工具,用于對(duì)調(diào)試代碼進(jìn)行輸出顯示,方便我們對(duì)開發(fā)過程中代碼的調(diào)試工作。本文會(huì)提供LCD1602的使用方法、驅(qū)動(dòng)代碼、以及演示LCD1602調(diào)試過程。
一、矩陣鍵盤介紹和本節(jié)目標(biāo)
1.1 矩陣鍵盤介紹
1.1.1 矩陣鍵盤概念
相較于獨(dú)立按鍵,矩陣鍵盤可以減少i/o口的占用。
獨(dú)立按鍵是每個(gè)按鍵都占用一個(gè)i/o口;而矩陣鍵盤是利用四行四列達(dá)到16個(gè)鍵盤占用8個(gè)i/o口的目的;減少了i/o口的占用。有點(diǎn)類似于利用坐標(biāo)系,用行號(hào)和列號(hào)來定位具體的鍵盤。即采用逐行或逐列的“掃描”,就可以獨(dú)處任何位置按鍵的狀態(tài)。
什么是掃描呢?
1.1.2 矩陣鍵盤原理
矩陣鍵盤的原理圖有下圖所示,左邊是獨(dú)立按鍵的原理圖,右邊是矩陣鍵盤的原理圖,放在一起比較更容易理解。
1.1.2.1掃描過程:
獨(dú)立按鍵是將四個(gè)按鍵公共的一端都接在GND即低電平上,另一端連接在i/o口上;而獨(dú)立按鍵呢,是每一行連接到一個(gè)公共的i/o上,每一列也連接到一個(gè)公共的i/o口上;
我們可以假設(shè),矩陣按鍵第一行的一端都接在GND上,另一端接四列的i/o口,那么此時(shí)就變成和獨(dú)立按鍵一模一樣,如下圖所示:
此時(shí)就成了按行掃描的過程,因?yàn)橐欢艘呀?jīng)接了GND即低電平,那么此時(shí)如果檢測(cè)到P13=0,說明是S1按下了;如果是P12=0,說明是S2按下了;如果是P11=0,說明是S3按下了;如果是P10=0,說明是S4按下了;此時(shí)第一行就掃描結(jié)束了,同時(shí)也得到了S1-S4 4個(gè)按鍵的狀態(tài)。
如果想知道為什么公共端設(shè)置為0,然后檢測(cè)另一端是否為0,來判斷是否按下按鍵,請(qǐng)看第1.1.2.2節(jié)的介紹。
然后就可以判斷第二行了,判斷第二行時(shí),將第一行的公共端(也就是P17口)設(shè)置為1;第二行的公共端(也就是P16口)設(shè)置為0;第三行的公共端(也就是P15)設(shè)置為1;第四行的公共端(也就是P14)設(shè)置為1;總結(jié)一下就是掃描哪一行,哪一行的公共端給0,其他行的公共端給1
;然后判斷P13-P10的值,如果P13=0,說明是S5按下了;如果是P12=0,說明是S6按下了;如果是P11=0,說明是S7按下了;如果是P10=0,說明是S8按下了;此時(shí)第二行就掃描結(jié)束了,同時(shí)也得到了S5-S8 4個(gè)按鍵的狀態(tài)。如下圖:
同理,如果掃描第三行時(shí),將第一行的公共端(也就是P17口)設(shè)置為1;第二行的公共端(也就是P16口)設(shè)置為1;第三行的公共端(也就是P15)設(shè)置為0;第四行的公共端(也就是P14)設(shè)置為1;總結(jié)一下就是掃描哪一行,哪一行的公共端給0,其他行的公共端給1
;然后判斷P13-P10的值,如果P13=0,說明是S9按下了;如果是P12=0,說明是S10按下了;如果是P11=0,說明是S11按下了;如果是P10=0,說明是S12按下了;此時(shí)第三行就掃描結(jié)束了,同時(shí)也得到了S9-S11 4個(gè)按鍵的狀態(tài)。如下圖:
第四行同理,這四行全都掃描完一遍后,16個(gè)按鍵的狀態(tài)也就都得到了。
按列掃描也是同樣的道理,即將P13-P12口賦值0和1,然后分別讀取P17-P14,從而獲得16個(gè)按鍵的狀態(tài)。
由于按行掃描時(shí),P15口會(huì)反復(fù)的給0和給1,而P15口又連接著蜂鳴器,所以如果按行掃描,就會(huì)導(dǎo)致蜂鳴器一直響,且無法關(guān)掉,這是由引腳和外設(shè)的沖突引起的,無法避免;所以建議使用按列臊面來獲得矩陣鍵盤的狀態(tài)。
補(bǔ)充一個(gè)知識(shí)點(diǎn),為什么在掃描具體的某一行時(shí),要使其公共端賦值為低電平0,另外的三個(gè)行的公共端賦值為高電平1呢?這就涉及到了單片機(jī)i/o口的弱上拉模式。
1.1.2.2 單片機(jī)i/o口弱上拉模式
i/o口的弱上拉模式又叫準(zhǔn)雙向口(可以去看51單片機(jī)入門教程資料\課件及程序源碼\相關(guān)資料\STC89C52.pdf
中的第4.1.1節(jié):準(zhǔn)雙向口輸出配置);i/o口即iniput/output,既可以輸入又可以輸出。那i/o是如何達(dá)到輸出和輸入呢?
舉個(gè)例子,如果現(xiàn)在有兩個(gè)i/o口,A口是高電平1,B口是低電平0,將A和B直接連接在一起,有同學(xué)說這不就短路了嘛,確實(shí)像是短路,但是沒有問題;就是因?yàn)閱纹瑱C(jī)是弱上拉模式,即單片機(jī)的上拉能力是弱的;也就是說高電平的驅(qū)動(dòng)能力是有限的,而低電平0的驅(qū)動(dòng)能力是很強(qiáng)的,也可以稱為弱上拉,強(qiáng)下拉
;
更加詳細(xì)的原理解釋,請(qǐng)參考視頻(https://www.bilibili.com/video/BV1Mb411e7re?p=15&vd_source=e2638d12685eef84cda913d9d67be0a9)的17分30秒
總結(jié)下來一句話,弱上拉強(qiáng)下拉就是1弱0強(qiáng);也就是當(dāng)?shù)碗娖?和高電平1同時(shí)出現(xiàn)時(shí),表現(xiàn)的是低電平0
;
所以這里再解釋一遍掃描的原理:
當(dāng)?shù)谝恍械墓捕耍≒17)接了低電平0,那么S1的另一端(P13)在上電時(shí)默認(rèn)是高電平1,所以當(dāng)S1按鍵未按下時(shí),讀取P13的狀態(tài)得到的是高電平1
;當(dāng)S1按下時(shí),P17和P13連接在了一起,P17是低電平,而P13在連接的一瞬間,由于弱上拉強(qiáng)下拉原理(1弱0強(qiáng)),P13也就瞬間從高電平1變成了低電平0;所以,當(dāng)檢測(cè)到P13是0時(shí),也就說明S1按下了(因?yàn)镾1不按下,P13檢測(cè)到的值會(huì)是1)。
1.2 本節(jié)目標(biāo)
目標(biāo)1:讀取矩陣鍵盤每次按下的數(shù)值,并將該數(shù)值顯示在LCD1602上;
例如,當(dāng)按下第一個(gè)矩陣按鍵S1時(shí),LCD1602顯示01;當(dāng)按下第二個(gè)矩陣按鍵S2時(shí),LCD1602顯示02;依次類推,如下圖所示:
當(dāng)按下S1時(shí):
當(dāng)按下S2時(shí):
依次類推。
目標(biāo)2:利用矩陣鍵盤實(shí)現(xiàn)密碼鎖
密碼鎖具體的過程如下,當(dāng)上電后,該密碼鎖在LCD1602上顯示初始值Password:0000
,
然后當(dāng)我們按下S1按鍵時(shí),顯示數(shù)字1,如下:
接著我們按下S2時(shí),顯示數(shù)字2,如下:
接著我們按下S3,顯示數(shù)字3,如下:
最后我們按下S4,顯示數(shù)字4,如下:
最終的結(jié)果是我們輸入了密碼1234,(說明:S1-S9對(duì)應(yīng)著數(shù)字1-9,S10表示數(shù)字0,S11表示“確認(rèn)”,S12表示取消
),然后按下S11確認(rèn),結(jié)果顯示ERR,表示密碼錯(cuò)誤,并將數(shù)字清零,如下:
因?yàn)槲覀冊(cè)O(shè)置的正確密碼是2345,所以輸入2345后,結(jié)果顯示OK,表示密碼正確,如下:
二、讀取并顯示矩陣鍵盤按鍵
代碼路徑:51單片機(jī)入門教程資料\課件及程序源碼\程序源碼\KeilProject\6-1 矩陣鍵盤
具體代碼:
#include <REGX52.H>
#include "Delay.h" //包含Delay頭文件
#include "LCD1602.h" //包含LCD1602頭文件
#include "MatrixKey.h" //包含矩陣鍵盤頭文件
unsigned char KeyNum;
void main()
{
LCD_Init(); //LCD初始化
LCD_ShowString(1,1,"MatrixKey:"); //LCD顯示字符串
while(1)
{
KeyNum=MatrixKey(); //獲取矩陣鍵盤鍵碼
if(KeyNum) //如果有按鍵按下
{
LCD_ShowNum(2,1,KeyNum,2); //LCD顯示鍵碼
}
}
}
代碼解釋:
該代碼中包含的Delay.h
和LCD1602.h
分別用于延時(shí)以及LCD1602的顯示,在前面已經(jīng)進(jìn)行詳細(xì)的介紹。
MatrixKey.h
是矩陣鍵盤頭文件,里面包含了MatrixKey接口,具體代碼如下:
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif
MatrixKey接口的實(shí)現(xiàn)在MatrixKey.c
文件中,如下:
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 矩陣鍵盤讀取按鍵鍵碼
* @param 無
* @retval KeyNumber 按下按鍵的鍵碼值
如果按鍵按下不放,程序會(huì)停留在此函數(shù),松手的一瞬間,返回按鍵鍵碼,沒有按鍵按下時(shí),返回0
整個(gè)函數(shù)實(shí)現(xiàn)的過程就是對(duì)16個(gè)矩陣按鍵掃描了一遍
*/
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
該接口其實(shí)現(xiàn)的功能就是將矩陣鍵盤的16個(gè)按鍵掃描了一遍,返回按下的按鍵的鍵碼;
最終實(shí)現(xiàn)的結(jié)果就是按下某個(gè)按鍵,其表示的鍵碼會(huì)顯示在LCD1602上,即本節(jié)的目標(biāo)1.
三、矩陣鍵盤密碼鎖
代碼路徑:51單片機(jī)入門教程資料\課件及程序源碼\程序源碼\KeilProject\6-2 矩陣鍵盤密碼鎖
具體代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-763136.html
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
unsigned int Password,Count;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Password:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum<=10) //如果S1~S10按鍵按下,輸入密碼
{
if(Count<4) //如果輸入次數(shù)小于4
{
Password*=10; //密碼左移一位
Password+=KeyNum%10; //獲取一位密碼
Count++; //計(jì)次加一
}
LCD_ShowNum(2,1,Password,4); //更新顯示
}
if(KeyNum==11) //如果S11按鍵按下,確認(rèn)
{
if(Password==2345) //如果密碼等于正確密碼
{
LCD_ShowString(1,14,"OK "); //顯示OK
Password=0; //密碼清零
Count=0; //計(jì)次清零
LCD_ShowNum(2,1,Password,4); //更新顯示
}
else //否則
{
LCD_ShowString(1,14,"ERR"); //顯示ERR
Password=0; //密碼清零
Count=0; //計(jì)次清零
LCD_ShowNum(2,1,Password,4); //更新顯示
}
}
if(KeyNum==12) //如果S12按鍵按下,取消
{
Password=0; //密碼清零
Count=0; //計(jì)次清零
LCD_ShowNum(2,1,Password,4); //更新顯示
}
}
}
}
最終實(shí)現(xiàn)的結(jié)果就是本節(jié)的目標(biāo)2。文章來源地址http://www.zghlxwxcb.cn/news/detail-763136.html
到了這里,關(guān)于51單片機(jī)(六)矩陣鍵盤和矩陣鍵盤密碼鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!