資源描述:
《51單片機(jī)矩陣鍵盤(pán)C語(yǔ)言編程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、矩陣鍵盤(pán)[例12]根據(jù)原理圖12所示,編寫(xiě)程序?qū)崿F(xiàn)以下功能:用7段數(shù)碼管顯示矩陣非編碼鍵盤(pán)的鍵名。例如,按1鍵則顯示“1”,按2鍵則顯示“2”。RP1+5V87654321LED1P1013973P10P00aAP1123868P11P01bAP123374P12P02cP134362P13P03dP145351GNDP14P04eP156349P15P05fP1673310P16P06gP178U1325P17P07DPAT89C511021+5VP30/RXDP201122P31/TXDP211223C3P32/INT0P2213241uFP33/INT1P2
2、31425RESP34/T0P241526P35/T1P2527R1P26X11928C11KX1P27+5VX131EA/VPP21733pFRD/P37X21816Y1X2WR/P3630C2ALE/PRDG1RES929X2RESETPSEN33pFGNDP14P15P16P170123P104567P1189ABP12CDEFP13原理圖12根據(jù)矩陣非編碼鍵盤(pán)逐行掃描法處理流程,鍵盤(pán)掃描程序應(yīng)包括以下內(nèi)容。(1)查詢是否有鍵被按下。首先單片機(jī)向行掃描口輸出掃描碼F0H,然后從列檢測(cè)口讀取列檢測(cè)信號(hào),只要一列信號(hào)不為“1”,即P1口的值不等于F0H,則表示有
3、鍵被按下;否則表示無(wú)鍵被按下。鍵值譯碼公式如下:(2)查詢閉合鍵所在的行列位置。若有鍵按下,單片機(jī)將等到的列檢測(cè)信號(hào)取反,列檢測(cè)口中為1的位便是閉合鍵所在的列。列號(hào)確定后,還需要進(jìn)行逐行掃描以確定行號(hào)。單片機(jī)首先向行掃描口輸出第1行的掃描碼FEH,按著讀列檢測(cè)口,若列檢測(cè)信號(hào)全為“1”,則表示閉合鍵不在第1行。接著向行掃描口輸出第2行的掃描碼FDH,再讀列檢測(cè)品,……。以此類(lèi)推,直到找到閉合鍵所在的行,并將該行的掃描碼取反保存。如果掃描完所有的行后仍沒(méi)有找到閉合鍵,則結(jié)束行掃描,判斷本次按鍵是誤動(dòng)作。(3)對(duì)得到的行號(hào)和列號(hào)進(jìn)行譯碼,確定鍵值。根據(jù)原理圖12所示,
4、1、2、3、4行的掃描碼分別為0xfe、0xfd、0xeb、0xf7;1、2、3、4列的列檢測(cè)數(shù)據(jù)分別為0xe0、0xd0、0xb0、0x70。設(shè)行掃描碼碼子HSM,列檢測(cè)數(shù)據(jù)為L(zhǎng)JC,則鍵值為KEY,則有______KEY=HSM+LJC
5、0x0f例如,“0”鍵處在第1行第1列,其HSM=0xfe,LJC=0xe0,代入上式,可得“0”鍵的鍵值為____________KEY=HSM+LJC
6、0x0f=0xfe+0xe0
7、0x0f=0x01+0x10=0x11根據(jù)上述計(jì)算方法,可計(jì)算所有按鍵地鍵值,見(jiàn)下表鍵名鍵值鍵名鍵值00x1180x1410x2190x242
8、0x41A0x4430x81B0x8440x12C0x1850x22D0x2860x42E0x4870x82F0x88(4)按鍵防抖動(dòng)處理。當(dāng)用手按下一個(gè)按鍵時(shí),一般會(huì)產(chǎn)生抖動(dòng),即所按下的鍵盤(pán)會(huì)在閉合位置與斷開(kāi)位置之間跳動(dòng)幾下才能達(dá)到穩(wěn)定狀態(tài)。抖動(dòng)持續(xù)的時(shí)間長(zhǎng)短不一,通常10ms。若抖動(dòng)問(wèn)題不解決,就會(huì)導(dǎo)致對(duì)閉合鍵的多次讀入。解決的方法是:在發(fā)現(xiàn)有鍵盤(pán)按下后,延時(shí)10ms再進(jìn)行逐行掃描。因?yàn)殒I被按下時(shí)的閉合時(shí)間遠(yuǎn)遠(yuǎn)大于10ms,所以延時(shí)后再掃描也不遲。[例12]的程序如下:/*********************************************
9、*********************************程序名稱:L12.c程序功能:4×4矩陣非編碼鍵盤(pán)的應(yīng)用******************************************************************************/#include#defineucharunsignedchar#defineuintunsignedintucharHSM,LJC;//定義行掃描碼和列檢測(cè)數(shù)據(jù)uchartmp,keyvalue;//定義接收鍵值和鍵值ucharkeyscan();voiddelay(u
10、intx);/******************************************************************************函數(shù)名稱:main()函數(shù)功能:主函數(shù),鍵值處理******************************************************************************/voidmain(){while(1){tmp=keyscan();switch(tmp){case0x11:P0=0x3f;//0break;case0x21:P0=0x06;//1break
11、;case