|
十分好用的4*4矩陣鍵盤掃描程序,更重要的是程序十分的簡短,幾行代碼就解決了4*4 掃描取鍵值,防抖動 ,此程序運用了一個很巧妙的算法!上程序供大家研究,此程序經過改進,可以實現長按鍵識別 組合按鍵識別。如果有哪里不夠好 也請大家指出。程序算法先自己研究,初學者如果看不明白,貼子頂起來,我給大家解釋!把文本格式奉上 直接復制到你的程序里。
- volatile unsigned char CF[4]; //按鍵觸發標志(表示4列,每一列同一行的
- //值是一樣的但列標不一樣來區分不同列的鍵)
- volatile unsigned char KeyVal;//鍵值
- code unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按輸出端控制
- #define KEY P2 //P2口作為4*4矩陣鍵盤輸入
- /*
- **描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內使用(十分穩定不需要再寫消抖程序)
- **備注:按鍵彈起時 keyVal = 0 單鍵按下 keyVal 有16個值,你自己程序可以針對不同值
- **進行不同程序操作 keyVal單鍵值分別為
- **0x11,0x12,0x14,0x18,
- **0x21,0x22,0x24,0x28,
- **0x31,0x32,0x34,0x38,
- **0x41,0x42,0x44,0x48,
- */
- void Key_Head()
- {
- unsigned char ReadData[4];
- static unsigned char i;
- if(++i>=4)i=0;
- KEY = KeyOut[i]|0x0f; //忽略低4位
- ReadData[i] = (KEY|0xf0)^0xff; //忽略高4位 取反
- CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);
- Cont[i] = ReadData[i];
- //輸出鍵值
- switch(CF[i])//第i列
- {
- case 0x08: KeyVal = (i<<4+8);break;
- case 0x04: KeyVal = (i<<4+4);break;
- case 0x02: KeyVal = (i<<4+2);break;
- case 0x01: KeyVal = (i<<4+1);break;
- default:KeyVal = 0;break;
- }
- }
復制代碼
|
|