51单片机学习之5-独立按键和矩阵键盘
第一步,我们先确定列,给P3口赋值0xF0=11110000,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30都被置0,当S6被按下时,由于S6按钮的一边P31为0,所以跟S6另一边相连的P35被拉低,即等于0。如下图
此时得到列的值P3=11010000=0xD0,在程序中只需要判断P3是否等于0xF0,不等说明有按键按下。
第二步,不改变高四位的状态:1101将低四位全部置1(P3=P3|0x0F)。这时候就变成了11011111,由于单片机扫描列的时候速度非常快,到现在扫描行的时候,按键仍处在按下状态(人的反应没有单片机快)。S6被按下,由于与S6相连的P35为低电平(即0),所以P31由高电平(即1)变成低电平(即0)如下图
此时得到的值为P3=11011101=S6被按下。这就是检测原理。
完整程序:
#include #defineuintunsignedint #defineucharunsignedchar sbitLed=P1^0; sbitLed1=P1^1; voiddelay(uintz); /********主函数********/ voidmain() { ucharKey_Temp; ucharKey;//Key键值 while(1) { Key=0;//清0 P3=0xF0; Key_Temp=P3; Key_Temp&=0xF0;//只取高四位这句需要,因为51IO只是准双向要使其具备输入功能需要用置1 if(0xF0!=Key_Temp)//判断是否有按键按下 { delay(10);//延时一段时间跳过抖动的时间 Key_Temp=P3&0xF0;//先取P3然后和0xF0与运算得到高四位 if(0xF0!=Key_Temp)//再次判断是否确实按下 { P3=Key_Temp|0x0F;//保留高四位将低四位全部置1并输出 Key=P3;//再读入 } } switch(Key) { case0xEE:Led=0;break;//S1 case0xDE:Led1=0;break; case0xBE:break; case0x7E:break; case0xED:break; case0xDD:break; case0xBD:break; case0x7D:break; case0xEB:break; case0xDB:break; case0xBB:break; case0x7B:break; case0xE7:break; case0xD7:break; case0xB7:break; case0x77:break;//S16 default: Led=Led1=1; } } } voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
评论