51單片機矩陣鍵盤線反轉法體會_第1頁
51單片機矩陣鍵盤線反轉法體會_第2頁
51單片機矩陣鍵盤線反轉法體會_第3頁
51單片機矩陣鍵盤線反轉法體會_第4頁
51單片機矩陣鍵盤線反轉法體會_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、。再由這一對行列值可以求出閉 合鍵所在的位置。/*在TX-1C實驗板上實現(xiàn)如下描述:實驗板上電時,數(shù)碼管不顯示,順序按下矩陣鍵盤后,在數(shù)碼管上依次顯 示0F, 6個數(shù)碼管同時顯示。這里用 線反轉”的方法寫,可以代替郭天祥書上 例【4.2.1 】該書上使用逐行掃描的方式。 */#include#define uchar unsigned char#define uintunsigned intsbit dua n=P2八6;/打開位選和段選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;/ 毫秒級延時函數(shù)/ 段選顯示函數(shù)/ 矩陣鍵盤掃描函數(shù)/ 定義行、列值中間變量/ 列線輸出全為 0/ 讀入行線/ 檢測有無按鍵按下/ 延時去抖/ 如果確實按下/ 再次讀入行線/ 輸出當前列線值,行線反轉/ 讀入列線值/ 鍵盤最后組合編碼值,也就是鍵值/ 其余情況返回該值/ 關閉所有數(shù)碼管段選,實驗板上電數(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) 是松手檢測語句,松手時檢測 case0xde:key=1;while(keysca n()!=Oxff);xia nshi(key);/keysca n(函數(shù)會得到返回值 0xff,!=oxff 時表示按下去了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;/* 后記 */*剛開始寫這個程序時我把主函數(shù)里面的switch case語句這樣寫的,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);運行程序后發(fā)現(xiàn)當手按下按鍵時會有數(shù)碼的顯示,但是一旦放開按鍵數(shù)碼 管就什么都不顯示了。而運行剛才上面的程序時,當手放開以后數(shù)碼管是會保留剛才按下去時應該顯示的值的。這個問題起初困擾我,后來發(fā)現(xiàn)原來是xianshi(key沒有放在case里面執(zhí)行的原因。1、 在上面那個程序里面,按下按鍵程序跳到case里面得到相應的key并且 執(zhí)行xianshi()函數(shù),當松開按鍵,在 while(1)循環(huán)里不斷檢測keyscan(),松開按鍵后跳到keyscan(函數(shù)里面后會得到返回值 0xff 這樣 switch 會執(zhí)行 default:break;然后再不斷地進出keyscan(,而這對數(shù)碼管的顯示值沒有影響,故松手以后 保留剛才的顯示值。2、 在下面的這個程序里面,松開手以后,程序再次進入keysca n(函數(shù)時得 到 key=0xff 后,程序跳到 switch 由于不滿足 case條件,執(zhí)行default,break跳出,然后按程序順序執(zhí)行 xianshi(key),這里 key的值已經變?yōu)镺xff,所以為xianshi(Oxff),沒有相應的顯示,于是松手后數(shù)碼管沒有任何顯示。*/*

溫馨提示

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

評論

0/150

提交評論