|
十分好用的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;
- }
- }
复制代码
|
|