经典的矩阵键盘扫描程序.doc
文本预览下载声明
经典的矩阵键盘扫描程序
查找哪个按键被按下的方法为:一个一个地查找。??????? 先第一行输出0,检查列线是否非全高;??????? 否则第二行输出0,检查列线是否非全高;??????? 否则第三行输出0,检查列线是否非全高;??????? 如果某行输出0时,查到列线非全高,则该行有按键按下;??????? 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。
下面是具体程序:
void Check_Key(void){??? unsigned char row,col,tmp1,tmp2;??? tmp1 = 0x10;????? ??????//tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0??? for(row=0;row4;row++)???// 行检测?{??????? P1 = 0x0f;?????? ?????// 先将p1.4~P1.7置高??????? P1 =~tmp1;?????? ?????// 使P1.4~p1.7中有一个为0??????? tmp1*=2;?????? ??????// tmp1左移一位??????? if ((P1 0x0f) 0x0f)????// 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测??{?????tmp2 = 0x01;?????// tmp2用于检测出哪一列为0???for(col =0;col4;col++)???// 列检测???{??????if((P1 tmp2)==0x00)??// 该列如果为低电平则可以判定为该列????{??????key_val =key_Map[ row*4 +col ];?// 获取键值,识别按键;key_Map为按键的定义表?????return;?????// 退出循环????}???tmp2*=2;??????// tmp2左移一位??????????? }??????? }??? }}???? //结束
??????? 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。
4*4矩阵键盘扫描程序/*设置行线为输入线,列线为输出线*/uchar KeyScan();? ? ? ? //按键扫描子程序void delay10ms();? ? ? ? //延时程序uchar key_free();? ? ? ? //等待按键释放程序void key_deal();? ? ? ? //键处理程序//主程序void main(){? ? ? ? while(1)? ? ? ? {? ? ? ? KeyScan();? ? ? ? key_free();? ? ? ? key_deal();? ? ? ? }}//按键扫描子程序uchar KyeScan(){unsigned char key,temp; P1=0xF0;if(P10xF0!=0xF0){? ? ? ? delay10ms();? ? ? ? //延时去抖动? ? ? ? if(P10xF0!=0xF0)? ? ? ? {? ? ? ? P1=0xFE;? ? ? ? //扫描第一列? ? ? ? temp=P1;? ? ? ? temp=temp0xF0;? ? ? ? if(temp!=0xF0)? ? ? ? //如果本列有键按下? ? ? ? {? ? ? ? ? ? ? ? switch(temp)? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? case 0xE0:? ? ? ? //第一行有键按下? ? ? ? ? ? ? ? key=;break;? ? ? ? ? ? ? ? case 0xD0:? ? ? ? //第二行有键按下? ? ? ? ? ? ? ? key=4;break;? ? ? ? ? ? ? ? case 0xB0:? ? ? ? //第三行有键按下? ? ? ? ? ? ? ? key=8;break;? ? ? ? ? ? ? ? case 0x70:? ? ? ? //第四行有键按下? ? ? ? ? ? ? ? key=12;break;? ? ? ? ? ? ? ? }? ? ? ? }? ? ? ? P1=0xFD;? ? ? ? //扫描第二列? ? ? ? temp=P1;? ? ? ? temp=0xF0;? ? ? ? if(temp!=0xF0)? ? ? ? {? ? ? ? ? ? ? ? switch(temp)? ? ? ? ? ?
显示全部