51單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)_第1頁(yè)
51單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)_第2頁(yè)
51單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)_第3頁(yè)
51單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)_第4頁(yè)
51單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、51 單片機(jī)矩陣鍵盤(pán)線(xiàn)反轉(zhuǎn)法體會(huì)獨(dú)立式鍵盤(pán)掃描只需讀取10 口狀態(tài),而矩陣式鍵盤(pán)描通常有兩種實(shí)現(xiàn)方法:逐行掃描法和線(xiàn)反轉(zhuǎn)法。(1) 逐行掃描法依次從第一至最末行線(xiàn)上發(fā)出低電平信號(hào) ,如果該行線(xiàn)所連接的鍵沒(méi)有按下 的話(huà),則列線(xiàn)所接的端口得到的是全 “1信”號(hào),如果有鍵按下的話(huà) ,則得到非全 “1信” 號(hào)。(2) 線(xiàn)反轉(zhuǎn)法線(xiàn)反轉(zhuǎn)法比行掃描速度快 ,原理是先將行線(xiàn)作為輸出線(xiàn) ,列線(xiàn)作為輸入線(xiàn) ,行線(xiàn) 輸出全 “0信”號(hào),讀入列線(xiàn)的值 ,那么在閉合鍵所在的列線(xiàn)上的值必為0;然后從列線(xiàn)輸出全 “0信”號(hào),再讀取行線(xiàn)的輸入值,閉合鍵所在的行線(xiàn)值必為0。這樣 ,當(dāng)一個(gè)鍵被按下時(shí) ,必定可讀到一對(duì)唯一的行列值

2、。再由這一對(duì)行列值可以求出閉 合鍵所在的位置。/*在TX-1C實(shí)驗(yàn)板上實(shí)現(xiàn)如下描述:實(shí)驗(yàn)板上電時(shí),數(shù)碼管不顯示,順序按下矩陣鍵盤(pán)后,在數(shù)碼管上依次顯 示0F, 6個(gè)數(shù)碼管同時(shí)顯示。這里用 線(xiàn)反轉(zhuǎn)”的方法寫(xiě),可以代替郭天祥書(shū)上 例【4.2.1 】該書(shū)上使用逐行掃描的方式。 */#include#define uchar unsigned char#define uintunsigned intsbit dua n=P2八6;/打開(kāi)位選和段選sbit wei=P2八7;uchar code table=/ 數(shù)碼管顯示數(shù)值表 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x

3、07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71;void delay(uint x)uint i,j;for(i=x;i0;i-)for(j=110;j0;j-);void xianshi(uchar num)P0=tablenum; duan=1;duan=0;uchar keyscan(void)uchar h,l;P3=0x0f;h=P3&0x0f;if(h!=0x0f)delay(10);if(h!=0x0f)h=P3&0x0f;P3=0xf0;l=P3&0xf0;return (h+l);return 0xff;void main()uchar

4、 key;P0=0示 duan=1;duan=0;/ 毫秒級(jí)延時(shí)函數(shù)/ 段選顯示函數(shù)/ 矩陣鍵盤(pán)掃描函數(shù)/ 定義行、列值中間變量/ 列線(xiàn)輸出全為 0/ 讀入行線(xiàn)/ 檢測(cè)有無(wú)按鍵按下/ 延時(shí)去抖/ 如果確實(shí)按下/ 再次讀入行線(xiàn)/ 輸出當(dāng)前列線(xiàn)值,行線(xiàn)反轉(zhuǎn)/ 讀入列線(xiàn)值/ 鍵盤(pán)最后組合編碼值,也就是鍵值/ 其余情況返回該值/ 關(guān)閉所有數(shù)碼管段選,實(shí)驗(yàn)板上電數(shù)碼管不顯PO=OxcO;選中6位數(shù)碼管wei=1;wei=0;while(1)key二keyscan();用 key 讀取 keyscan(的值 switch(key)case 0xee: key=0;while(keyscan()!=0xff

5、); xianshi(key); break;/while(keyscan()!=0xff) 是松手檢測(cè)語(yǔ)句,松手時(shí)檢測(cè) case0xde:key=1;while(keysca n()!=Oxff);xia nshi(key);/keysca n(函數(shù)會(huì)得到返回值 0xff,!=oxff 時(shí)表示按下去了case 0xbe: key=2;while(keyscan()!=0xff); xianshi(key); break;case 0x7e: key=3;while(keyscan()!=0xff); xianshi(key); break;case 0xed: key=4;while(key

6、scan()!=0xff); xianshi(key); break;case 0xdd: key=5;while(keyscan()!=0xff); xianshi(key); break;case 0xbd: key=6;while(keyscan()!=0xff); xianshi(key); break;case 0x7d: key=7;while(keyscan()!=0xff); xianshi(key); break;case 0xeb: key=8;while(keyscan()!=0xff); xianshi(key); break;case 0xdb: key=9;whil

7、e(keyscan()!=0xff); xianshi(key); break;case 0xbb:key=10; while(keyscan()!=0xff); xianshi(key); break; case 0x7b:key=11; while(keyscan()!=0xff); xianshi(key); break;case 0xe7: key=12; while(keyscan()!=0xff); xianshi(key); break;case 0xd7: key=13; while(keyscan()!=0xff); xianshi(key); break;case 0xb7

8、: key=14; while(keyscan()!=0xff); xianshi(key); break;case 0x77: key=15; while(keyscan()!=0xff); xianshi(key); break; default:break;/* 后記 */*剛開(kāi)始寫(xiě)這個(gè)程序時(shí)我把主函數(shù)里面的switch case語(yǔ)句這樣寫(xiě)的,while(1)key二keyscan();用 key 讀取 keyscan()的值 switch(key)case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;brea

9、k;case 0x7e: key=3;break;case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd: key=6;break;case 0x7d: key=7;break;case 0xeb: key=8;break;case 0xdb: key=9;break;case 0xbb: key=10; break;case 0x7b:key=11; break;case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break;case 0x77: ke

10、y=15; break; default:break;xianshi(key);運(yùn)行程序后發(fā)現(xiàn)當(dāng)手按下按鍵時(shí)會(huì)有數(shù)碼的顯示,但是一旦放開(kāi)按鍵數(shù)碼 管就什么都不顯示了。而運(yùn)行剛才上面的程序時(shí),當(dāng)手放開(kāi)以后數(shù)碼管是會(huì)保留剛才按下去時(shí)應(yīng)該顯示的值的。這個(gè)問(wèn)題起初困擾我,后來(lái)發(fā)現(xiàn)原來(lái)是xianshi(key沒(méi)有放在case里面執(zhí)行的原因。1、 在上面那個(gè)程序里面,按下按鍵程序跳到case里面得到相應(yīng)的key并且 執(zhí)行xianshi()函數(shù),當(dāng)松開(kāi)按鍵,在 while(1)循環(huán)里不斷檢測(cè)keyscan(),松開(kāi)按鍵后跳到keyscan(函數(shù)里面后會(huì)得到返回值 0xff 這樣 switch 會(huì)執(zhí)行 default:break;然后再不斷地進(jìn)出keyscan(,而這對(duì)數(shù)碼管的顯示值沒(méi)有影響,故松手以后 保留剛才的顯示值。2、 在下面的這個(gè)程序里面,松開(kāi)手以后,程序再次進(jìn)入keysca n(函數(shù)時(shí)得 到 key=0xff 后,程序跳到 switch 由于不滿(mǎn)足 case條件,執(zhí)行default,break跳出,然后按程序順序執(zhí)行 xianshi(key),這里 key的值已經(jīng)變?yōu)镺xff,所以為xianshi(Oxff),沒(méi)有相應(yīng)的顯示,于是松手后數(shù)碼管沒(méi)有任何顯示。*/*

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論