4*4键盘扫描有什么编程思路?

如题所述

如用51系列P1口做键盘扫描:(当然有的单片机要考虑IO口的输入输出设置,51单片机为准双向IO口所以不需要考虑IO方向的问题)
P1=0XF0;//先设置P1口为四个高电平,四个低电平;
if(P1!=0XF0)//如果P1口的电平发生变化说明有按键键
{
//这里要根据晶振延时,一般延时15MS左右,以消除键下时电平抖动
if((P1&0X80)==0)//p1.7引脚出现低电平,就是跟最高位IO连接的按键动作
{
P1=0X0F;//改变下电平,原先低电平改变为高,原先高电平则低,这是为了找到动作按键另一IO
if((P1&0X1)==0)//是不是P1.0与P1.7交叉按键动作
{
KEY=01;//设定键值
}
else if((P1&0X2)==0)//是不是P1.1与P1.7交叉按键动作
{
KEY=2;//设定键值
}
else if((P1&0X4)==0)//是不是P1.2与P1.7交叉按键动作
{
KEY=3//设定键值
}
else if((P1&0X8)==0)//是不是P1.3与P1.7交叉按键动作
{
KEY=4;//设定键值
}
}
else if((P1&0X40)==0)//P1.6引脚上的按键动作
{
P1=0X0F;//
if((P1&0X1)==0)//
{
KEY=5;//设定键值
}
else if((P1&0X2)==0)//
{
KEY=6;//设定键值
}
else if((P1&0X4)==0)//
{
KEY=7//设定键值
}
else if((P1&0X8)==0)//
{
KEY=8;//设定键值
}
}
else if((P1&0X20)==0)
{
P1=0X0F;//
if((P1&0X1)==0)//
{
KEY=9;//设定键值
}
else if((P1&0X2)==0)//
{
KEY=10;//设定键值
}
else if((P1&0X4)==0)//
{
KEY=11//设定键值
}
else if((P1&0X8)==0)//
{
KEY=12;//设定键值
}
}
else if((P1&0X10)==0)
{
P1=0X0F;//
if((P1&0X1)==0)//
{
KEY=13;//设定键值
}
else if((P1&0X2)==0)//
{
KEY=14;//设定键值
}
else if((P1&0X4)==0)//
{
KEY=15//设定键值
}
else if((P1&0X8)==0)//
{
KEY=16;//设定键值
}
}
}
程序可能不是很严紧,但其本原理就是这样了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-30
void keyscan()//矩阵键盘扫描程序
{
P0=0x0f;
if(P0!=0x0f) //这里条件0,不会执行后面的程序吧
{delay (10);
if(P0!=0x0f)
{
a=P0;
P0=0xf0;
b=P0;
a= a|b;
};
};
}
相似回答