《上次發過一次,這次程序寫法不同。供大家參考參考》
//希望不要再有不懂裝懂的人再說成逐行掃描,不知道就不要瞎BB (此行為注釋 )
*實現效果16個按鍵數碼管對應顯示0~f
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
程序:
- #include <reg51.h>
- void delay(unsigned int i) //延時函數
- {
- unsigned int k;
- for(k = 0; k < i; k++);
- }
- unsigned char table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管顯示碼0~f
- unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //鍵盤掃描碼
- char keyscan(); //行列反轉法實現的矩陣鍵盤掃描函數
- void main()
- {
- char i;
- P0=0x00;
- while(1)
- {
- i=keyscan();
- if(i!=-1) //當有按鍵被按下
- {
- P0=table[i];
- delay(10000);
- }
- }
-
- }
- char keyscan()
- {
- char scan1,scan2,keycode,j,key;
- key =-1; //按鍵值初值為-1,如果沒有掃描到按鍵,函數返回-1
- P2 =0xf0; //寫:行為全1,列為全0
- scan1 =P2; //讀:行列值
- if(scan1 !=0xf0) //如果讀入值不為0xf0,則表示有按鍵按下
- {
- delay(1200);
- scan1 = P2; //再次讀入
- if(scan1 != 0xf0) //再次判斷是否有按鍵按下,去除抖動
- {
- P2 =0x0f; //行列反轉,寫:行為全0,列為全1
- scan2 =P2; //讀入行列值
- keycode = scan1 | scan2; //合并行列值,得到掃描碼
- for(j=0;j<16;j++) //由掃描碼表得到按鍵值
- {
- if(keycode ==key_code[j])
- {key =j;
- break;
- }
- }
- }
- }
- return (key); //返回按鍵值
- }
復制代碼 全部資料51hei下載地址:
行列反轉法矩陣鍵盤掃描.rar
(83.25 KB, 下載次數: 81)
2019-5-28 17:52 上傳
點擊文件名下載附件
|