十分好用的单片机4*4矩阵键盘扫描代码,送给初学单片机的你
花了一段时间整理了一段51的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; } } |