请指点一下按键,谢谢大家

2019-03-24 10:46发布




#define  keyin  (P1IN&0xf0)//宏定义   判断按键是否按下,按下为keyin,否则为0xff
uchar keyz;
/****************
  用到的函数
*********************/
void delay(uchar t);
void key_int();
void keyscan();


/*****************
        延  时
***********************/
void delay(uchar t)
{
    uint i,j;
    for(i=0;i<t;i++)
      for(j=0;j<1000;j++);
}


/********************
    键盘初始化
    配置P1引脚,
    关闭中断,
    使用边沿触发中断的模式,用下降沿
************************/
void key_int()
{
  
   P1DIR=0x0f;//高位输入,地位输出
   P1OUT=0xf0;//高四位输出为1,第四位输出为低
     P1IE=0;
     P1IFG=0;
     P1IES=0;
     
     
     P1IE |=BIT4;//允许中断
     P1IES |=BIT4;//下降沿触发
     P1IE |=BIT5;
     P1IES |=BIT5;
     P1IE |=BIT6;
     P1IES |=BIT6;
     P1IE |=BIT7;
     P1IES |=BIT7;

}

/**********************
    键     值
    通过高四位判断键位,低四位判断行
**************************/


void keyscan()

{
  uchar temp;
  P1DIR=0X0f;
  P1OUT=0xfe;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {
          temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xee:keyz=1;break;
            case 0xde:keyz=2;break;
            case 0xbe:keyz=3;break;
            case 0x7e:keyz=4;break;
            }
           while(keyin!=0xf0);
        }
    }
/**************第二行****************/
   P1OUT=0Xfd;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {  temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xed:keyz=5;break;
            case 0xdd:keyz=6;break;
            case 0xbd:keyz=7;break;
            case 0x7d:keyz=8;break;
            }
             while(keyin!=0xf0);
        }
    }
   
    /**************第3行****************/
  P1OUT=0Xfb;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        {
          temp=keyin;
            delay(5);
            switch(temp)
            {
            case 0xeb:keyz=9;break;
            case 0xdb:keyz=10;break;
            case 0xbb:keyz=11;break;
            case 0x7b:keyz=12;break;
            }
            while(keyin!=0xf0);
        }
    }
    /**************第4行****************/
    P1OUT=0Xf7;
   
    if(keyin!=0xf0)
    {
        delay(5);
        if(keyin!=0xf0)
        { delay(5);
          temp=keyin;
           
            switch(temp)
            {
            case 0xe7:keyz=13;break;
            case 0xd7:keyz=14;break;
            case 0xb7:keyz=15;break;
            case 0x77:keyz=16;break;
            }
            while(keyin!=0xf0);
        }
    }

}


不知道为什么这样子写不得,麻烦指点一二,小女子在此谢过了 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
仙猫
2019-03-25 11:57
沫沫律 发表于 2014-11-1 21:20
可是他一旦变低,PIES=1—>下降沿触发,P1IFG置位—>中断产生,我就是利用这个中断来判断按键是否按下的

假如16个键分别接16个引脚,用跃变沿中断的方法或可行,但现在是16个键复用4个引脚,未被监视的行的中断怎么发生呢?
建议贴出电路图来讨论,否则可能大家想的不是同一个讨论点。
而且,楼上提到的上拉没准还真是问题,当然也有可能是你对的,在不看电路图的情况下无法判断。

一周热门 更多>

相关问题

    相关文章