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