void main(void)
{
while(1)
{
if(P3_7==0)//判斷是否有按下,為0則按下
{
delay10ms();//延時10MS,去抖動
if(P3_7==0)//再次判斷,如果還為0則真的按下了。
{
count++;//每按下一次就加1
if(count==16)//加到16返回0
{
count=0;
}
P1=~count;//P1口把按下的次數(shù)輸出,如第一次就是11111110,第二次就是11111101:十六進制轉(zhuǎn)成IO口的二進制
while(P3_7==0);//直到按鍵放開才判斷下一次按鍵
}
}
}
當(dāng)鍵盤中按鍵數(shù)量較多時,為了減少對 I/O 口的占用,通常將按鍵排列成矩陣形式,也稱為行列鍵盤,這是一種常見的連接方式。矩陣式鍵盤接口見圖 9-7 所示,它由行線和列線組成,按鍵位于行、列的交叉點上。當(dāng)鍵被按下時,其交點的行線和列線接通,相應(yīng)的行線或列線上的電平發(fā)生變化,MCU 通過檢測行或列線上的電平變化可以確定哪個按鍵被按下。
圖 9-7 為一個 4 x 3 的行列結(jié)構(gòu),可以構(gòu)成 12 個鍵的鍵盤。如果使用 4 x 4 的行列結(jié)構(gòu),就能組成一個 16 鍵的鍵盤。很明顯,在按鍵數(shù)量多的場合,矩陣鍵盤與獨立式按鍵鍵盤相比可以節(jié)省很多的 I/O 口線。
矩陣鍵盤不僅在連接上比單獨式按鍵復(fù)雜,它的按鍵識別方法也比單獨式按鍵復(fù)雜。在矩陣鍵盤的軟件接口程序中,常使用的按鍵識別方法有行掃描法和線反轉(zhuǎn)法。這兩種方法的基本思路是采用循環(huán)查循的方法,反復(fù)查詢按鍵的狀態(tài),因此會大量占用 MCU 的時間,所以較好的方式也是采用狀態(tài)機的方法來設(shè)計,盡量減少鍵盤查詢過程對 MCU 的占用時間。
增加這兩句的目的是當(dāng)按鍵所在端口發(fā)生狀態(tài)改變后執(zhí)行,以提高讀鍵的效率。另外,有些場合是閉合按鍵執(zhí)行,而在松開按鍵執(zhí)行時你提到的多余語句顯得更妙。
比如可以設(shè)計這樣的功能:
1、按下K1——執(zhí)行功能1,舉例:建立一個標(biāo)志。在定時器中斷中調(diào)整初值,輸出頻率不斷增加。
2、松開K1——執(zhí)行功能2,舉例:清除該標(biāo)志,定時器中斷中鎖定初值。
同樣實現(xiàn)上述功能,用問題中給出的程序,只需要掃描一遍P3判斷,2個功能實際只需各執(zhí)行1次條件語句。而按照您的思路,沒有這句話,那么需要主程序反復(fù)遍歷K1按鍵的按下和松開,并且還需另外設(shè)個標(biāo)志,以防止按鍵功能被重復(fù)執(zhí)行。這樣一來,條件語句中的內(nèi)容將會反復(fù)執(zhí)行,效率降低。
當(dāng)然這個參考程序也有去抖動的設(shè)計缺陷。比如,擴展這兩句可以改善:
if(P3!=key_val){ i++;i%=10;if(i==0){key_val=P3;……}}
綜上,該做法可以提高讀鍵效率,更容易識別按鍵的按下和松開時刻。
void main(void){while(1){if(P3_7==0)//判斷是否有按下,為0則按下{delay10ms();//延時10MS,去抖動if(P3_7==0)//再次判斷,如果還為0則真的按下了。
{count++;//每按下一次就加1if(count==16)//加到16返回0{count=0;}P1=~count;//P1口把按下的次數(shù)輸出,如第一次就是11111110,第二次就是11111101:十六進制轉(zhuǎn)成IO口的二進制while(P3_7==0);//直到按鍵放開才判斷下一次按鍵}}}。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時間:3.074秒