4095|4

54

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】帮看看我的键盘程序的问题 [复制链接]

我用的是P1口中断方式,现在的问题是我按一下某个键,那个键值会重复显示好几次,我觉得问题可能是按键的后沿抖动导致同一次按键产生了多次中断,不知是不是这样?这个问题怎么解决呢?我又不能用判断键释放的那个循环,因为这个循环会影响到我其他模块的运行。

下面是我的P1口中断程序,以及求键值的子程序,其中keycode为键值,p2.0~2.1为行输出线,
p1.0~1.7为列输入线,请各位帮忙看看撒


#pragma vector=PORT1_VECTOR
__interrupt void PORT_ISR(void)
{

Delay();
KeyProcess();
for(i=7;i>0;i--)
{LCD[i]=LCD[i-1];}
LCD[0]=digit[keycode];
Delay(); //我想通过延时消除后沿抖动,还是没有用
P2OUT = 0x00;//恢复以前值。
P1IFG=0;
}

void KeyProcess(void)
{
unsigned char j;
unsigned int S[16];
//P2.0输出低电平
P2OUT=0xFE;
S[0]= P1IN & BIT0;
S[1]= P1IN & BIT1;
S[2]= P1IN & BIT2;
S[3]= P1IN & BIT3;
S[4]= P1IN & BIT4;
S[5]= P1IN & BIT5;
S[6]= P1IN & BIT6;
S[7]= P1IN & BIT7;

//P2.1输出低电平
P2OUT=0xFD;
S[8]= P1IN & BIT0;
S[9]= P1IN & BIT1;
S[10]= P1IN & BIT2;
S[11]= P1IN & BIT3;
S[12]= P1IN & BIT4;
S[13]= P1IN & BIT5;
S[14]= P1IN & BIT6;
S[15]= P1IN & BIT7;
for(j=0;j<16;j++)
{
if(S[j]==0)
{
keycode=j;}
}


}

最新回复

我已经解决了,我还是改成扫描方式了,然后采用魏小龙书上介绍的设两个标志量的方法,分别设了消抖动标志和按键识别完成标志,现在的按键很稳定哦,还是谢谢各位的拔刀相助   详情 回复 发表于 2006-5-13 12:41
 
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
矩阵的一般使用查询的
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你可以设置一个计数器,用于消抖动,无压键时,计数器清除,检测到压键后,计数,并设定在某个计数值时(例如为1)读按键值,并设置按键有效标志和继续计数,此法对消抖动非常有效。希望你能成功。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

4
 
这个思路真好
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
我已经解决了,我还是改成扫描方式了,然后采用魏小龙书上介绍的设两个标志量的方法,分别设了消抖动标志和按键识别完成标志,现在的按键很稳定哦,还是谢谢各位的拔刀相助
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表