微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 矩阵键盘检测子程序

矩阵键盘检测子程序

时间:10-02 整理:3721RD 点击:
/*常规法*/
uchar keyscan()
{
                        P1=0xfe;
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                                {
                                        delay(5);
                                        temp=P1;
                                        temp=temp&0xf0;
                                        while(temp!=0xf0)
                                        {
                                                temp=P1;
                                        switch(temp)
                                                {
                                                        case 0xee:num=1;
                                                                break;
                                                        case 0xde:num=2;
                                                                break;
                                                        case 0xbe:num=3;
                                                                break;
                                                        case 0x7e:num=4;
                                                                break;
                                                }
                                        while(temp!=0xf0)
                                                {
                                                        temp=P1;
                                                        temp=temp&0xf0;
                                                }
                                        }
                                }
                        P1=0xfd;
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                                {
                                        delay(5);
                                        temp=P1;
                                        temp=temp&0xf0;
                                        while(temp!=0xf0)
                                        {
                                                temp=P1;
                                        switch(temp)
                                                {
                                                        case 0xed:num=5;
                                                                break;
                                                        case 0xdd:num=6;
                                                                break;
                                                        case 0xbd:num=7;
                                                                break;
                                                        case 0x7d:num=8;
                                                                break;
                                                }
                                        while(temp!=0xf0)
                                                {
                                                        temp=P1;
                                                        temp=temp&0xf0;
                                                }
                                        }
                                }

                        P1=0xfb;
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                                {
                                        delay(5);
                                        temp=P1;
                                        temp=temp&0xf0;
                                        while(temp!=0xf0)
                                        {
                                                temp=P1;
                                        switch(temp)
                                                {
                                                        case 0xeb:num=9;
                                                                break;
                                                        case 0xdb:num=10;
                                                                break;
                                                        case 0xbb:num=11;
                                                                break;
                                                        case 0x7b:num=12;
                                                                break;
                                                }
                                        while(temp!=0xf0)
                                                {
                                                        temp=P1;
                                                        temp=temp&0xf0;
                                                }
                                        }
                                }

                        P1=0xf7;
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                                {
                                        delay(5);
                                        temp=P1;
                                        temp=temp&0xf0;
                                        while(temp!=0xf0)
                                        {
                                                temp=P1;
                                        switch(temp)
                                                {
                                                        case 0xe7:num=13;
                                                                break;
                                                        case 0xd7:num=14;
                                                                break;
                                                        case 0xb7:num=15;
                                                                break;
                                                        case 0x77:num=16;
                                                                break;
                                                }
                                        while(temp!=0xf0)
                                                {
                                                        temp=P1;
                                                        temp=temp&0xf0;
                                                }
                                        }
                                }
return num;
}

/**********************************************************
线反转法
**********************************************************/
uchar  keyscan()
{
   uchar  scan1,scan2,keycode,j;
   P1=0xf0;
   scan1=P1;
   if((scan1&0xf0)!=0xf0)           //判键是否按下
   {
     delay1ms(20);                   //延时20ms
     scan1=P1;
     if((scan1&0xf0)!=0xf0)         //二次判键是否按下
     {
        P1=0x0f;  //线反转法的核心
        scan2=P1;
        keycode=scan1|scan2;         //组合成键编码
        for(j=0;j<=15;j++)
        {
           if(keycode== key_code[j])  //查表得键值
           {
              key=j;
              return(key);
           }
        }
     }
   }
   else  
   P1=0xff; //P1口写1 输入状态
   return (16);//"-"
}

学习一下

建议添加按键弹起判断,不然单片机是按连续按下判断的!

学习下  谢谢无私奉献!

谢谢指点

反转好

while((scan&0xf0)!=0xf0); 有的时候不管用

顶我了,多检查几次啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top