導航:首頁 > 操作系統 > 單片機掃描矩形鍵盤

單片機掃描矩形鍵盤

發布時間:2022-08-14 19:39:37

1. 單片機匯編矩陣鍵盤實驗(掃描法)

關於掃描按鍵的原理,可以看下面這篇文章。

本文以循序漸進的思路,引導大家思考如何用最少的IO驅動更多的按鍵,並依次給出5種方案原理圖提供參考。在實際項目中我們經常會遇到有按鍵輸入的需求,但有的時候為了節省資源成本,我們都會選擇在不增加硬體的情況下使用最少的控制器IO驅動更多的按鍵,那麼具體是怎麼做的呢,下面我們就以用5個IO引腳為例,講下怎麼設計可以實現更多的按鍵?共有5種設計思路,下面依次介紹。

思路一

首先通常想到的可能是下面這樣的設計:

這樣我們可以先識別K01、K02、K03、K04、K05,若沒有按鍵按下然後再和思路四的設計一樣去識別其他按鍵。但這樣存在一個問題,如果IO1配置為0,IO5讀到0,那麼怎麼知道是K51按下還是K05按下呢,這里只需要在程序里做下判斷,先判斷下是不是K05按下,若不是就是K51,因為按鍵K01、K02、K03、K04、K05在5個IO口都為讀取的情況下,就可以識別,不需要掃描識別處理,相當於這5個按鍵優先順序高與其他按鍵。

總結

綜合上述,5個IO口最多可以識別25個按鍵,思路五程序上處理比較麻煩,若實際中只按思路四設計,也可識別20個按鍵,那麼如果有N個IO口可識別多少按鍵呢?這里給出如下公式:

假設有N個IO口按照思路三可以識別N*(N-1)/2個;

按照思路四可識別N*(N-1)個;

按照思路5可以識別N*(N-1)+N個。

最後再說下,如果實際設計時,還是按思路四設計好,軟體也沒那麼麻煩。如果是你的話你會選擇哪種方法呢?你還有沒有其他的設計方法呢?

2. 51單片機矩陣鍵盤掃描問題

#include <intrins.h> //_nop_();所需頭文件

/*************鍵盤掃描******錯誤*********/
void scan()
{
unsigned int media;
P2=0x0f;

_nop_(); //在這里延時一個或幾個指令周期試試

P2=P2|0xf0;
key=P2;
}

3. 單片機 矩陣鍵盤 怎麼掃描多個數

將接鍵盤的埠置為讀狀態,例如接在P1口上的4*4鍵盤就寫:MOV
P1,#0F0H
然後讀P1口的狀態,然後消除鍵抖動,在確定有鍵按下的情況下逐個判斷P1.0,P1.1P,P1.2,P1.3的狀態,再逐個判斷P1.4,P1.5,P1.6,P1.7的狀態,最後的鍵值等於行首號加列號。行首號從上到下依次為:0,4,8,C,列號從左到右依次為0,1,2,3,例如第二列第三個數應該為4+2=6,第三行第二個數應為8+1=9,第一個應為8+0=8.4*4鍵盤最後一個數應為第四行初值C+第四列值3=鍵碼F.讓我們共同進步。

4. 51單片機 矩陣鍵盤掃描

bit keyscan()//掃描按鍵函數
{
bit yes=0;
unsigned char temp;
P2=0xfe;//掃描第1行
temp=P2;//讀取埠值,檢測是否有按鍵按下
if(temp!=0xfe)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfe)//再一次判斷,確實有鍵按下再執行
{
yes=1;

while(P2!=0xfe);
delay(15);
while(P2!=0xfe);

switch(temp)//獲取鍵值
{
case 0x7e:NUM=14;break;
case 0xbe:NUM=0;break;
case 0xde:NUM=12;break;
case 0xee:NUM=11;break;
}
}
}

P2=0xfd;//掃描第2行
temp=P2;
if(temp!=0xfd)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfd)
{
yes=1;

while(P2!=0xfd);
delay(15);
while(P2!=0xfd);

switch(temp)
{
case 0x7d:NUM=7;break;
case 0xbd:NUM=8;break;
case 0xdd:NUM=9;break;
case 0xed:NUM=15;break;
}
}
}

P2=0xfb;//掃描第3行
temp=P2;
if(temp!=0xfb)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfb)
{
yes=1;
while(P2!=0xfb);
delay(15);
while(P2!=0xfb);
switch(temp)
{
case 0x7b:NUM=4;break;
case 0xbb:NUM=5;break;
case 0xdb:NUM=6;break;
case 0xeb:NUM=10;break;
}

}
}

P2=0xf7;//掃描第4行
temp=P2;
if(temp!=0xf7)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xf7)
{
yes=1;
while(P2!=0xf7);
delay(15);
while(P2!=0xf7);

switch(temp)
{
case 0x77:NUM=1;break;
case 0xb7:NUM=2;break;
case 0xd7:NUM=3;break;
case 0xe7:NUM=13;break;
}

}
}
return yes;
}
其中NUM為全局變數,每次檢測到有按鍵按下時會返回『1』,通過讀取NUM來獲得鍵值,四個switch語句中的NUM值完全取決於你要把該按鍵設定為何值而定的。
本程序的鍵盤掃描的原理就是進行行掃描,每一行先對埠寫行掃描字,然後再讀取埠值,若該行有按鍵按下,則按鍵對應列線被拉為低電平。掃描完四行就可以檢測一遍16個鍵了。

5. 單片機矩陣鍵盤掃描方式

首先單片機引腳默認輸出高電瓶的。令控制某一行(假設第n行)鍵盤的引腳為0,然後按下該行的某一鍵,然後一列一列的檢查低電平(假設檢測出為第m列),由此判斷出按下的為第nm鍵。思路就是令行為低電平,檢查列(當然反之也可以)

6. 初學單片機矩陣鍵盤逐行掃描,問題困擾好久

P3=0x7f;//高4位作為輸出,低4 位為輸入,作為輸入時要先將其置1
每次掃描時高4位中只有一根線是0,如果沒有按鍵按下,高4位中的0就不會傳到低4位上
那麼讀P3的低4位,它將仍保持原狀態4個1(0x0f)
反之,若讀到的不是4個1,說明有按鍵按下了
temp=P3;//將P3口的狀態讀回來
temp=temp&0x0f;//只取低4 位
if(temp!=0x0f)//如果不全為1,說明有按鍵按下
{
Delay1ms(5);//消抖動
temp=P3;//再次將P3口的狀態讀回來
temp=temp&0x0f;//仍然只取低4 位
if(temp!=0x0f)//再次判斷是不是4 個1
{
temp=P3;//是 再次讀回,因高4位送出的是7,讀回也只能是7
switch(temp)//1 根輸出線上(此處是最高位)掛有4 個按鍵,因此讀回的數值只有4 種可能
其它3 根線上也各掛4個按鍵,但你此時按下也不起作用,因它們輸出是1
高4位以很快的速度輪流輸出低電平,且你按任何鍵都要持續幾十到上百ms,因此你按任何鍵都有可被掃描到
7二進制是0111 b二進制是1011 d二進制是1011 e二進制是1110
{
case 0x7e:num=1;xianshi=table[num-1];//num是你自己定義的
break;
case 0x7d:num=2;xianshi=table[num-1];
break;
case 0x7b:num=3;xianshi=table[num-1];
break;
case 0x77:num=4;xianshi=table[num-1];
break;
}

7. 單片機簡答題 以4×4矩陣鍵盤為例,寫出該鍵盤按鍵處理掃描流程

uchar kbscan(void)
{
unsigned char sccode,recode;
P1=0x0f; //發0掃描,列線輸入
if ((P2 & 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P1&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}

8. 單片機矩陣鍵盤按鍵行列逐級掃描法

unsigned
char
KeyScan(void)
//鍵盤掃描函數,使用行列逐級掃描法{
unsigned
char
Val;
KeyPort=0xf0;//這句其實就是整體看看是否有鍵按下,四行全送0,有鍵按下,高四位肯定不為全1
if(KeyPort!=0xf0)//表示有按鍵按下
{
DelayMs(10);
//去抖
if(KeyPort!=0xf0)
{
//表示有按鍵按下
KeyPort=0xfe;
//檢測第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
//相當於檢測到第一行有鍵按下,鍵值=列(高四位)+行(低四位)
while(KeyPort!=0xfe);
DelayMs(10);
//去抖
while(KeyPort!=0xfe);
return
Val;
}

9. 單片機矩陣鍵盤掃描程序

P3=0x7f;
temp=P3;
temp的值是實時的P3口的值,還是等於0x7f?
temp 的值,是 P3 外部引腳輸入的值。
具體是何值?取決於 P3 外接的電路。
如果 P3 外面,八個引腳,都接地,那麼:
temp 就是 0000 0000。

閱讀全文

與單片機掃描矩形鍵盤相關的資料

熱點內容
電腦如何實現跨網段訪問伺服器 瀏覽:549
模塊化網頁源碼位元組跳動 瀏覽:485
梯度下降演算法中遇到的問題 瀏覽:605
伺服器連接電視怎麼接 瀏覽:323
phploop語句 瀏覽:500
交叉編譯工具鏈里的庫在哪 瀏覽:781
安卓手q換號怎麼改綁 瀏覽:399
nba球星加密貨幣 瀏覽:789
命令看網速 瀏覽:124
java堆分配 瀏覽:161
linuxbuiltin 瀏覽:560
cstpdf 瀏覽:941
texstudio編譯在哪 瀏覽:352
國家反詐中心app注冊登記表怎麼注冊 瀏覽:972
加密機默認埠 瀏覽:101
有哪個網站有免費的python源代碼 瀏覽:304
蘋果手機如何導入安卓電話 瀏覽:915
奧利奧雙重解壓 瀏覽:388
安卓賬號怎麼在蘋果手機上玩 瀏覽:798
畫畫用什麼安卓ipad好 瀏覽:693