51单片机入学第七课——矩阵键盘
文章目錄
- 小介紹
- 矩陣鍵盤電路分析
- 一丟丟的C語(yǔ)言基礎(chǔ)
- 編寫程序
- 總結(jié)
小介紹
在上一課中我學(xué)到了獨(dú)立鍵盤的工作原理和編寫代碼的技巧(如何軟件消抖和按下松手檢測(cè)),并且在上一節(jié)中介紹了獨(dú)立鍵盤和矩陣鍵盤的特點(diǎn)和區(qū)別,這一節(jié)就主要學(xué)習(xí)矩陣鍵盤。
矩陣鍵盤電路分析
矩陣鍵盤相對(duì)于獨(dú)立鍵盤的電路較為復(fù)雜,但是依然有跡可循,電路中將P3組所有IO口分為兩組,可以將其視為四乘四的網(wǎng)格,十六個(gè)按鍵就分布在網(wǎng)格上。
采用列掃描和行掃描可以確定矩陣鍵盤上哪一個(gè)按鍵被按下。具體來(lái)說(shuō),列掃描時(shí)先把接在列上面的所有IO口拉高,接在行上的所有IO置低。當(dāng)其中有一列內(nèi)任何一個(gè)按鍵按下那么整條列線都會(huì)被拉低。這樣,就可以確認(rèn)是那一條列線被觸發(fā),并得到當(dāng)時(shí)P3口的十六進(jìn)制值。緊接著進(jìn)行行掃描,將行的IO拉高,列的置底,再次檢測(cè)到P3口的數(shù)值,由于十六進(jìn)制表現(xiàn)為0x**,進(jìn)行列掃描時(shí)獲得了第一個(gè)*的值,行掃描時(shí)獲取了第二個(gè)*的值,兩者疊加就會(huì)產(chǎn)生十六種獨(dú)一無(wú)二的值,這樣我們得以判斷是那個(gè)按鍵被觸發(fā)。
一丟丟的C語(yǔ)言基礎(chǔ)
C語(yǔ)言三大結(jié)構(gòu)分別為分支,順序,選擇。要想判斷十六個(gè)值,僅用if語(yǔ)句十分麻煩,因此我們采用switch語(yǔ)句
switch (表達(dá)式) {case 常量表達(dá)式1: 語(yǔ)句1break;case 常量表達(dá)式2: 語(yǔ)句2break; ······ ······}語(yǔ)句執(zhí)行的過程是:將switch后面的表達(dá)式的值與case后面的各個(gè)常量表達(dá)式的值逐個(gè)進(jìn)行比較,在遇到匹配時(shí),就執(zhí)行case后面相應(yīng)的語(yǔ)句,然后執(zhí)行break返回。
編寫程序
太長(zhǎng)了,,,懶得解釋了,看注釋吧
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit DU = P2^6;//數(shù)碼管段選 sbit WE = P2^7;//數(shù)碼管段選 uchar num;//數(shù)碼管顯示 uchar keyvalue = 20;//按鍵的值//共陰數(shù)碼管段選表 uchar code tabel[]= { //0 1 2 3 4 5 6 7 8 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, //9 A B C D E F H L 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x76, 0x38, //n u - 熄滅 0x37, 0x3E, 0x40, 0x00 };void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } void keyscan() {//4*4矩陣鍵盤掃描P3 = 0xf0;//列掃描if(P3 != 0xf0){delay(10);if(P3 != 0xf0) {switch(P3){case 0xe0:keyvalue = 0;//第一列按下break;case 0xd0:keyvalue = 1;break;case 0xb0:keyvalue = 2;break;case 0x70:keyvalue = 3;//第四列按下break;}P3 = 0x0f;//行掃描switch(P3){case 0x0e:keyvalue = keyvalue;//第一行按下break;case 0x0d:keyvalue = keyvalue+4;break;case 0x0b:keyvalue = keyvalue+8;break;case 0x07:keyvalue = keyvalue+12;//第四行按下break;}while(P3 != 0x0f);} }P3 = 0XFF;//獨(dú)立按鍵掃描if(P3 != 0XFF){delay(10);//軟件消抖10msif(P3 != 0XFF){switch(P3) //判斷那一行被按下{case 0xfe: keyvalue = 16; break;//S2被按下case 0xfd: keyvalue = 17; break;//S3被按下case 0xfb: keyvalue = 18; break;//S4被按下case 0xf7: keyvalue = 19; break;//S5被按下 }while(P3 != 0XFF);//松手檢測(cè) } } }void main()//main函數(shù)自身會(huì)循環(huán) {WE = 1;//打開位選鎖存器P0 = 0XFE; //1111 1110 選通第一位數(shù)碼管WE = 0;//鎖存位選數(shù)據(jù)DU = 1;//打開段選鎖存器P0 = 0X06;//0000 0110 顯示“1”DU = 0;//鎖存段選數(shù)據(jù)while(1){DU = 1;//打開段選鎖存器P0 = tabel[keyvalue];//0000 0110 顯示“1”DU = 0;//鎖存段選數(shù)據(jù)keyscan();} }總結(jié)
非編碼鍵盤真是麻煩啊,雖然我明白了大概原理,但是他這個(gè)目前只是順序排列,要是想調(diào)整成常用計(jì)算器的左下角為數(shù)字,右側(cè)為符號(hào),那也太麻煩了,,,,,腦闊疼
總結(jié)
以上是生活随笔為你收集整理的51单片机入学第七课——矩阵键盘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue从入门到精通之基础篇(二)组件
- 下一篇: 2021数学建模C题题目