51单片机 按键,键盘检测

但凡做和51单片机有关的东西,我们组都会用到按键..... 迷之有缘

独立按键的原理很简单,没有按键按下时,全部为高电平,按下时接触地变为地电平,检测是否有低电平来检测按下动作。

矩阵键盘稍微复杂一点,分别检测行,检测列,以此来确定按键位置。

注意的是,按下时会有抖动,因为写程序时,需要消抖。常用的方式是延时函数消抖。



/*        
            独立按键扫描基本程序 @L2  2016/08/03 
                                                    */
#include <reg52.h>
#define GPIO_KEY P1   //按键与P1口相连
void Delay10ms(unsigned int c);
unsigned char Key_Scan();

void main(void)
{
    unsigned char keyNum;
    while (1)
    {    
        keyNum = Key_Scan();  //扫描键盘

        switch (keyNum)
        {
            case(0xFE) :      //返回按键K1的数据                
                break;
            case(0xFD) :      //返回按键K2的数据                
                break;
            case(0xFB) :      //返回按键K3的数据            
                break;
            case(0xF7) :      //返回按键K4的数据
                break;
            case(0xEF) :      //返回按键K5的数据
                break;
            case(0xDF) :      //返回按键K6的数据
                break;
            case(0xBF) :      //返回按键K7的数据
                break;
            case(0x7F) :      //返回按键K8的数据
                break;
            default:
                break;
        }


    }                
}


unsigned char Key_Scan()
{
    unsigned char keyValue = 0 , i; //保存键值

    //--检测按键--//
    if (GPIO_KEY != 0xFF)        //检测按键是否按下          若只连接P10~P13四个按键,则改为(GPIO_KEY | 0xF0)!= 0xFF;等等
    {
        Delay10ms(1);    //消除抖动

        if (GPIO_KEY != 0xFF)    //再次检测按键是否按下
        {
            keyValue = GPIO_KEY;
            i = 0;
            while ((i<50) && (GPIO_KEY != 0xFF))     //检测按键是否松开
            {
                Delay10ms(1);
                i++;
            }
        }
    }

    return keyValue; 
}



void Delay10ms(unsigned int c) 
{
    unsigned char a, b;
    for (;c>0;c--)
    {
        for (b=38;b>0;b--)
        {
            for (a=130;a>0;a--);
        }
           
    }       
}


posted @ 2016-08-06 13:26  Aurora_l  阅读(505)  评论(0编辑  收藏  举报