矩陣按鍵掃瞄的疑惑與解答

2021-08-03 23:51:51 字數 1905 閱讀 8518

最近在學習金沙灘宋老師的微控制器,說實話學著是比較吃力,但是不後悔!老師交給的絕不是僅僅只是「魚」。發現自己的學習態度以及嚴謹程度,真的和一些前輩比起相差甚遠。

下面摘自一位名為「商道」的群友的學習總結,共勉~

關於矩陣按鍵掃瞄消抖的解釋-教材第8章-矩陣按鍵掃瞄例題8.4.5

教材116頁第8章-矩陣按鍵掃瞄例題8.4.5中,中斷函式void interrupttime0() interrupt 1的掃瞄及消抖部分**擷取如下:

擷取函式**如下:

//將一行的4個按鍵值移入緩衝區

keybuf[keyout][0

]=(keybuf[keyout][0

]<<1)

| key_in_1;

keybuf[keyout][1

]=(keybuf[keyout][1

]<<1)

| key_in_2;

keybuf[keyout][2

]=(keybuf[keyout][2

]<<1)

| key_in_3;

keybuf[keyout][3

]=(keybuf[keyout][3

]<<1)

| key_in_4;

//消抖後更新按鍵狀態

for(i=

0; i<

4; i++

)//每行4個按鍵,所以迴圈4次

elseif(

(keybuf[keyout]

[i]&

0x0f)==

0x0f)}

//執行下一次的掃瞄輸出

keyout++

;//輸出索引遞增

keyout = keyout &

0x03

;//索引值加到4即歸零

疑問如下:

for迴圈語句的解釋部分是「每行4個按鍵,所以迴圈4次」;

if條件語句的解釋部分是「//連續4次掃瞄值為0,即4*4ms內都是按下狀態時,可認為按鍵已穩定的按下」;

簡單地說就是,函式每隔1ms中斷一次,並掃瞄按鍵中的1行,掃瞄完成後返回主函式; 第1次中斷時,掃瞄的是第1行的4個按鍵1位; 第二次中斷時掃瞄的是第2行的4個按鍵1位; 依次類推,完成全部按鍵掃瞄需要中斷4次,共掃瞄4行16個按鍵,用時4ms;這是一次(一位)全部按鍵的掃瞄迴圈。 這樣的迴圈要進行4次,才能完成按鍵的掃瞄處理(不能稱為消抖,感覺不太恰當),用時4*4=16ms。

關於第1條疑問的回答:他們不是同一回事。for語句中「每行4個按鍵,所以迴圈4次」, 只是一次中斷,掃瞄的是一行按鍵(共4個按鍵),用時1ms; 而if語句中的「4*4ms」是4次迴圈,共用16次中斷來完成。

假如第4行第4個按鍵有動作,即keyout=3,i=3,keybuf[keyout][i]=keybuf[3][3], 此時的key_in_4=0,中斷函式需要進入第3次中斷時才能發現key_in_4的值為0(第一次中斷只掃瞄第一行,第二次中斷掃瞄第二行,第三次中斷掃瞄第三行,第四次中斷掃瞄第四行,這時才能發現第四行的第四個按鍵有動作), 於是將keybuf[3][3]的最右邊的位由1變為0,然後繼續掃瞄下一行(返回第一行,於此完成所有按鍵的第一位掃瞄); 在第8次中斷掃瞄時,發現key_in_4的值仍然為0,於是將keybuf[3][3]的右邊的第2位由1變為0(此時右邊共有2個0了), 然後繼續掃瞄下一行; 在第12次中斷掃瞄時,發現key_in_4的值仍然為0,於是將keybuf[3][3]的右邊的第3位由1變為0(此時右邊共有3個0了), 然後繼續掃瞄下一行; 在第16次中斷掃瞄時,發現key_in_4的值仍然為0,於是將keybuf[3][3]的右邊的第4位由1變為0(此時右邊共有4個0了), 此刻就完成了4行4次全部按鍵掃瞄的迴圈了,共用時16ms。 此時的keybuf[3][3]右邊四位全部是0,所以判定是按下狀態。其他的以此類推。

矩陣按鍵掃瞄電路

說到鍵盤掃瞄,相信大多數人第一反應就是行列矩陣掃瞄,這樣我們可以用相對有限的io口得到盡可能多的按鍵。鍵盤掃瞄是微控制器技術的一種基本處理方法,學校的微控制器課程都會有相應章節進行闡述,只要按照課本上講述的方法,一般都能設計出比較可靠的鍵盤掃瞄電路與程式。課本上的鍵盤掃瞄方法 見下圖接法二 不能說是...

mybatis的幾點疑惑解答

session 怎麼可以操作user.xml檔案。1.session的 session是我們的sesssionfactiory產生的物件。sessionfactory的 是我們的xml物件。我們將我們的xml變成了流物件來操控他。所謂的對話物件就是我們的乙個操作人。內部所有的資源都可以在我們 的控制...

藍橋杯微控制器矩陣按鍵掃瞄程式設計

藍橋杯的矩陣按鍵的掃瞄,使用reg52.h標頭檔案的時候需要自定義p4介面,因為在該標頭檔案中並沒有定義p4介面。include reg52.h include intrins.h typedef unsigned char u8 typedef unsigned int u16 sfr p4 0x...