|
我用的是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;}
}
}
|
|