美文网首页
51单片机之独立键盘,准双向IO口

51单片机之独立键盘,准双向IO口

作者: David_Rao | 来源:发表于2019-09-26 12:34 被阅读0次

    独立键盘工作原理

    编程思路:
    将独立按键连接的IO口设为高电平,持续检查该IO口电平。若按键按下,IO口电平会被拉低。检查到IO口低电平即可判断按键被按下。

    以下是没有按键消抖的程序

    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit DU = P2^6;  //数码管段选
    sbit WE = P2^7;  //数码管位选
    sbit key_s2 = P3^0;  //独立按键s2
    uchar num = 0;  //数码管显示的值
    
    uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
    
    void main() 
    {
        WE = 1;  //打开位选锁存器
        P0 = 0xfe;  //1111 1110
        WE = 0;  //锁存位选数据
    
        while(1)
        {
            if(key_s2 == 0)
            {
                num++;  //当按键按下,数字+1
                if(num == 10)
                    num = 0;  //数字超过10则归0
            }
            DU = 1;  //打开段选锁存器
            P0 = table[num];  //显示对应数字
            DU = 0;  //锁存段选数据
        }
    }
    

    以上程序中,当按下按键时,可能会改变好几次数字,松开按键的时候也可能改变几次数字。
    这是因为按键在按下和松开的过程中存在机械抖动,按键在抖动过程中会反复多次地“闭合”、“断开”、“闭合”、“断开”......单片机抓取了这些抖动信号,以为按键快速地被“按下”、“松开”、“按下”、“松开”......

    加入软件消抖。当按键按下后,数字持续增加

    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit DU = P2^6;  //数码管段选
    sbit WE = P2^7;  //数码管位选
    sbit key_s2 = P3^0;  //独立按键s2
    uchar num = 0;  //数码管显示的值
    
    uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
    
    void delay(unsigned int z)
    {
        unsigned int x, y;
        for(x = z; x > 0; x--)
            for(y = 114; y >0; y--);
    }
    
    void main() 
    {
        WE = 1;  //打开位选锁存器
        P0 = 0xfe;  //1111 1110
        WE = 0;  //锁存位选数据
    
        while(1)
        {
            if(key_s2 == 0)
            {
                delay(20);  //延时20ms,在延时期间按键在抖动,延时结束后按键状态已经平稳
                if(key_s2 == 0)  //确认按键确实是被按下的
                {
                    num++;  //当按键按下,数字+1
                    if(num == 10)
                        num = 0;  //数字超过10则归0
                }
            }
            DU = 1;  //打开段选锁存器
            P0 = table[num];  //显示对应数字
            DU = 0;  //锁存段选数据
        }
    }
    

    加入松手检测。按键按下并松手后才显示加一

    #include <reg52.h>
    #include <intrins.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit DU = P2^6;  //数码管段选
    sbit WE = P2^7;  //数码管位选
    sbit key_s2 = P3^0;  //独立按键s2
    uchar num = 0;  //数码管显示的值
    
    uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;
    
    void delay(unsigned int z)
    {
        unsigned int x, y;
        for(x = z; x > 0; x--)
            for(y = 114; y >0; y--);
    }
    
    void main() 
    {
        WE = 1;  //打开位选锁存器
        P0 = 0xfe;  //1111 1110
        WE = 0;  //锁存位选数据
    
        while(1)
        {
            if(key_s2 == 0)
            {
                delay(20);  //延时20ms,在延时期间按键在抖动,延时结束后按键状态已经平稳
                if(key_s2 == 0)  //确认按键确实是被按下的
                {
                    num++;  //当按键按下,数字+1
                    if(num == 10)
                        num = 0;  //数字超过10则归0
                    while(!key_s2);  //如果按键还没松开,key_s2==0,!key_s2就是非零,程序停留在while循环内,不往下进行
                }
            }
            DU = 1;  //打开段选锁存器
            P0 = table[num];  //显示对应数字
            DU = 0;  //锁存段选数据
        }
    }
    

    相关文章

      网友评论

          本文标题:51单片机之独立键盘,准双向IO口

          本文链接:https://www.haomeiwen.com/subject/eriyyctx.html