51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能?

51单片机,c语言编程,4*4矩阵键盘如何实现等待按键松开功能?程序如下:ucharkey_scan(){ucharkey_l,key_h;ucharkey;P1=0xf... 51单片机,c语言编程,4*4矩阵键盘如何实现 等待按键松开功能?
程序如下:
uchar key_scan()
{
uchar key_l,key_h;
uchar key;
P1=0xf0;
key_l=P1;
key_l=key_l&0xf0;
key=' ';
if(key_l!=0xf0)
{
delay_nms(5);
key_l=P1;
key_l=key_l&0xf0;
if(key_l!=0xf0)
{
key_l=P1&0xf0; //1110 0000
key_l=key_l|0x0f;//1110 1111
P1=key_l; //1110 1111
key_h=P1; //1110 1110
key_h=key_h&0x0f;//0000 1110 h
key_l=key_l&0xf0;//1110 0000 l
key=key_h+key_l; //1110 1110
}
}
while(P1!=0xf0); //我加了这句话,但不好使!
switch(key)
{
case 0xee:n='0';break;
case 0xde:n='1';break;
case 0xbe:n='2';break;
case 0x7e:n='3';break;

case 0xed:n='4';break;
case 0xdd:n='5';break;
case 0xbd:n='6';break;
case 0x7d:n='7';break;

case 0xeb:n='8';break;
case 0xdb:n='9';break;
case 0xbb:n='+';break;
case 0x7b:n='-';break;

case 0xe7:n='*';break;
case 0xd7:n='/';break;
case 0xb7:n='?';break;
case 0x77:n='!';break;
}
return n;
}
展开
 我来答
tattackor
2015-11-01 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:887万
展开全部

1、在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则的程序就只能执行第一个按键所对应的程序了。这样,就能检测到第二次按键的键值了。


2、例程:

uchar shaomiao()
{
uchar l,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/******关键问题解决如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h*4+l);
}
笔杆子与小尺子
2011-05-25 · TA获得超过751个赞
知道小有建树答主
回答量:357
采纳率:0%
帮助的人:112万
展开全部
uchar shaomiao()
{
uchar l,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case 0xfe:h=0;break;//1111 1110
case 0xfd:h=1;break;
case 0xfb:h=2;break;
case 0xf7:h=3;break;
}
switch(l)
{
case 0xef:l=0;break;//1110 1111
case 0xdf:l=1;break;
case 0xbf:l=2;break;
case 0x7f:l=3;break;
}
P1=0xf0;
/******你说的关键问题解决如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h*4+l);
}
更多追问追答
追问
谢谢你!你的意思是加个去抖就好使了?
追答
/*******等待放开,并防抖动*******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(80);//防止抖动
}
嗯,我的意思你加上如上的防抖动。延时长一点较好,如80ms。一般按键频率要求不是很高的场合,对于放开防抖动,可以适当延时长一点(只要不影响其他进程处理)。对于按下防抖动,不能太长,太长就需要按下一会才有反应,那就不便了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cnnbwhq1972
2015-09-27 · TA获得超过3843个赞
知道小有建树答主
回答量:488
采纳率:83%
帮助的人:241万
展开全部
用定时器监测相应端口电平。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
asd1035517133
2011-05-21
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
.......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式