社区导航

 

搜索
查看: 3253|回复: 4

【求助】帮看看我的键盘程序的问题

[复制链接]

80

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2006-5-12 21:30 | 显示全部楼层 |阅读模式
我用的是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;}
}


}

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2006-5-12 21:50 | 显示全部楼层
矩阵的一般使用查询的

回复

使用道具 举报

105

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2006-5-12 23:20 | 显示全部楼层
你可以设置一个计数器,用于消抖动,无压键时,计数器清除,检测到压键后,计数,并设定在某个计数值时(例如为1)读按键值,并设置按键有效标志和继续计数,此法对消抖动非常有效。希望你能成功。

回复

使用道具 举报

117

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2006-5-13 11:10 | 显示全部楼层
这个思路真好

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

回复

使用道具 举报

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

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-13 22:28 , Processed in 0.209970 second(s), 26 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表