单片机的 矩阵键盘问题 求讲解!!附程序了
//矩阵键盘行列扫描voidkeyscan(){P1=0xf0;key_l=P1;key_l=key_l&0xf0;if(key_l!=0xf0)//{delay_50u...
//矩阵键盘行列扫描
void keyscan()
{
P1=0xf0;
key_l=P1;
key_l=key_l&0xf0;
if(key_l!=0xf0) //
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0)
{
key_l=key_l&0xf0;
key_l=key_l|0x0f;
P1=key_l;
key_h=P1;
key_h=key_h&0x0f;
key_l=key_l&0xf0;
key=key_h+key_l;
}
}
这一段每句是什么意思?? 展开
void keyscan()
{
P1=0xf0;
key_l=P1;
key_l=key_l&0xf0;
if(key_l!=0xf0) //
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0)
{
key_l=key_l&0xf0;
key_l=key_l|0x0f;
P1=key_l;
key_h=P1;
key_h=key_h&0x0f;
key_l=key_l&0xf0;
key=key_h+key_l;
}
}
这一段每句是什么意思?? 展开
2个回答
展开全部
这程序,逻辑上,是有错的。
------------------
if(key_l!=0xf0) //--不等于则....
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0) //--不等于则....
……
------------------
在延时前、后的两个判断,所用的条件、变量内容,都是完全相同的。
在前面如果满足条件,在后面,就也能满足。
在前面,不满足条件,在后面,也一定不满足。
实际上,后面的这个判断,并无任何用处。
对于消抖,这程序仅仅是进行了延时而已。
采纳答案中,没有指出这个缺点。
http://zhidao.baidu.com/question/509466640.html
这才是正确的程序和正确的解释。
------------------
if(key_l!=0xf0) //--不等于则....
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0) //--不等于则....
……
------------------
在延时前、后的两个判断,所用的条件、变量内容,都是完全相同的。
在前面如果满足条件,在后面,就也能满足。
在前面,不满足条件,在后面,也一定不满足。
实际上,后面的这个判断,并无任何用处。
对于消抖,这程序仅仅是进行了延时而已。
采纳答案中,没有指出这个缺点。
http://zhidao.baidu.com/question/509466640.html
这才是正确的程序和正确的解释。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//矩阵键盘行列扫描
void keyscan()
{
P1=0xf0; //高四位 为 高电平 ,低四位 相当于接地 , 4 X 4 行列矩阵键盘 。
key_l=P1; //保存 P1 口的值
key_l=key_l&0xf0; //将P1 口的值 和 0xf0 与 运算 ,如有 按键按下 ,高四位的某一位 会变成 低电平 0
if(key_l!=0xf0) //有按键按下 就不会 等于 0xf0。
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0)//有按键按下 就不会 等于 0xf0。
{
key_l=key_l&0xf0; //获取 按下按键 所在的 列值 ,对应列的位置是 0
key_l=key_l|0x0f;
P1=key_l;
key_h=P1;
key_h=key_h&0x0f; //获取 按下按键 所在的 行值 ,对应行的位置是 0
key_l=key_l&0xf0;
key=key_h+key_l;//行列合并
}
}
void keyscan()
{
P1=0xf0; //高四位 为 高电平 ,低四位 相当于接地 , 4 X 4 行列矩阵键盘 。
key_l=P1; //保存 P1 口的值
key_l=key_l&0xf0; //将P1 口的值 和 0xf0 与 运算 ,如有 按键按下 ,高四位的某一位 会变成 低电平 0
if(key_l!=0xf0) //有按键按下 就不会 等于 0xf0。
{
delay_50us(800);//键盘消抖
if(key_l!=0xf0)//有按键按下 就不会 等于 0xf0。
{
key_l=key_l&0xf0; //获取 按下按键 所在的 列值 ,对应列的位置是 0
key_l=key_l|0x0f;
P1=key_l;
key_h=P1;
key_h=key_h&0x0f; //获取 按下按键 所在的 行值 ,对应行的位置是 0
key_l=key_l&0xf0;
key=key_h+key_l;//行列合并
}
}
追问
key_l=key_l|0x0f;
P1=key_l;
key_h=P1
是什么意思啊??
追答
key_l=key_l|0x0f; //key_l 低四位 的低电平 置1,为下一条指令 检测行线做准备
P1=key_l;//P1 端口 列线 对应位为低电平,行线是 高电平输入转口状态
key_h=P1;//获取 行线位置 。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询