『壹』 簡述單片機鍵盤掃描工作過程
鍵盤由行線列線交叉而成。列線接有上拉電阻。對第一行的行線置0,然後讀取列線碼,如果所有列線都是1說明買有被按下的鍵,繼續掃描下一行。直到能讀到0為止,讀到0時所掃描的行就是該鍵的行碼,而0所在的位是列碼。一般的鍵盤掃描都做成中斷形式,把列線所有線相與,只要有一個0就輸出0,將這個信號送給中斷,就可以實現在有鍵被按下時開啟掃描了。
『貳』 單片機鍵盤掃描。
兄弟,你好
void key()
{uchar key1,key2,key3; 這條語句後就key1=key2=key3=0了,肯定就一直在key()函數中一直不出來了撒,你的key1等是按鍵,怎麼沒有分配一個IO口呢
你如果這樣的話就可以了
void key()
{uchar key1,key2,key3;
key1=key2=key3=1;這樣的話就不會一直在key()中了
要想達到效果,估計你還的弄幾個按鍵
添幾句
sbit key1=P3^0;
。。。。。。
再把 uchar key1,key2,key3;這一句刪了,
你試一下,祝你成功
『叄』 單片機矩陣鍵盤按鍵行列逐級掃描法
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; }
『肆』 C51單片機按鍵掃描
1.設置一個狀態變數,如flag,定義flag=0為開狀態,flag=1為關狀態。
2.因為是按鍵(不是開關),所以實際上單片機讀取的應該是脈沖形式的輸入。設按鍵接單片機P01引腳,故可採用以下程序實現按鍵掃描
if(P01==0)//按下按鍵,進入下降沿
{
delay2();//20ms延時去按鍵前抖動
while(P01==0);//等待上升沿到
來,即按鍵彈起
flag=~flag;//flag取反,實現狀態切換
}
void
delay2()//20ms延時子程序
{
unsigned
char
i,k;
for(i=0;i<100;i++)
for(k=0;k<100;k++);
}
註:根據按鍵的具體接法,若按下按鍵向單片機輸入低電平,則採用以上程序;若按下按鍵向單片機輸入高電平,則將兩處P01==0均改為P01==1。
『伍』 用單片機編寫的鍵盤掃描程序怎樣編寫它的求鍵號程序
要不要我幫你寫一段,你後面沒掃描,當然無法獲取鍵值
t1:mov
p1,#0fh
;p1介面高4位為0,低4位輸入
mov
a,p1
;讀p1
anl
a,#0fh
;屏蔽高4位
cjne
a,#0fh,t2
;有鍵按下轉t2
sjmp
t1
;無鍵按下轉回
t2:lcall
delay10;延時10ms,去抖
mov
a,p1
;重新掃描p1口
anl
a,#0fh
cjne
a,#0fh,t3
sjmp
t1
t3:mov
r0,#00
;行計數值
mov
r1,#00
;列計數值
mov
r3,#0efh
;掃描初值
t4:mov
a,r3
mov
p1,a;輸出行掃描字
mov
a,p1
mov
r1,a
anl
a,#0fh
cjne
a,#0fh,t5
;該行有鍵按下
inc
r0
;行計數器加1
,掃下一行
MOV
A,R3
RLC
A
MOV
R3,A
MOV
A,R0
CJAE
A,#04H,t4
;掃到最後一行?
t6:
ret
;結束
t5:mov
a,r1
jnb
acc.0,t7
jnb
acc.1,t8
jnb
acc.2,t9
jnb
acc.3,t10
sjmp
t6
t7:
mov
r2,#00
;0列號
sjmp
t11
t8:mov
r2,#01
;1列號
sjmp
t11
t9:mov
r2,#02
;2列號
sjmp
t11
t10:mov
r2,#03
;3列號
t11:mov
a,r0
mov
b,#04
mul
ab
;行號乘4
add
a,r2
;鍵值在A中
ret
『陸』 單片機4*4鍵盤掃描程序時如何開啟的
按照行順序,一行一行的開啟,如下圖:4*4共16鍵,假設P0.0-P0.3為H0-H3,P0.4-P0.7為L0-L3
(列)
L0
L1
L2
L3
(行)
H0
0
1
2
3
H1
4
5
6
7
H2
8
9
A
B
H3
C
D
E
F
首先讓
H0
=
0,然後依次檢測L0-L3,看那個鍵按下了
,則對應的L0-L3為0,這樣第一行檢測結束。比如掃描H0
行時
第一個鍵按下了,則L0=0,獲得的P0=0xee,你也可以返回一個值,比如就是0,來代表第一個鍵(0)被按下,這樣依次檢測就掃描滿16個鍵就行了。
『柒』 單片機矩陣鍵盤按鍵行列逐級掃描法
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;
}
『捌』 單片機匯編矩陣鍵盤實驗(掃描法)
關於掃描按鍵的原理,可以看下面這篇文章。
本文以循序漸進的思路,引導大家思考如何用最少的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*3的鍵盤,太簡單了,不值得用循環,特別是雙重循環。
最簡明、高效的程序如下:
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
char scan_key(void)
{
P13 = 0;
if (!P10) return 0;
if (!P11) return 1;
if (!P12) return 2;
P13 = 1;
P14 = 0;
if (!P10) return 3;
if (!P11) return 4;
if (!P12) return 5;
}
本程序,使用的變數最少,也不涉及其它介面。
代碼最少,執行效率最高。
『拾』 單片機掃描電路原理
單片機行列式鍵盤掃描原理如下:
1、行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全為高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。
2、延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。
3、單片機將P10輸出為低電平,其它P11~P13輸出高電平,此時讀取列線的數據全為高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍為高電平。
4、此時再來讀取列線數據,發現列線讀到的數據有低電平,數值為1011(0x0B),如果我們的鍵盤布局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。
(10)單片機鍵盤掃描操作擴展閱讀
單片機學習方法
1、基礎理論知識學習
基礎理論知識包括模擬電路、數字電路和C語言知識。。在學習單片機之前,覺得模擬電路和數字電路基礎不好的話,不要急著學習單片機,應該先回顧所學過的模擬電路和數字電路知識,為學習單片機加強基礎。
2、單片機實踐
准備一台電腦、一塊單片機開發板、一套視頻教程、一本單片機教材和一本C語言教材。電腦是用來編寫和編譯程序,並將程序代碼下載到單片機上;開發板來運行單片機程序,驗證實際效果。