51マクロプロセッサ入門-ボタン駆動プログラム設計実験

5793 ワード

博主福祉:100 G+電子デザイン学習資源バッグ!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU 3 OTczMzk 5 Mg=&hid=7&sn=ad 5 d 0 f 15 df 4 a 92 ebf 72 f 8&scene=18繩wechat_redirect------------------------------------------------------------------------------------------
 
独立したキーの原理は、ボタンが押されていない場合、該当するポートはハイレベルの状態であり、ボタンが押された場合、該当するポートは低レベルである.この現象によって、相応の機能を実現することができます.
もう一つの注意すべき点は、ボタンが閉じている時と切れている時に、接点がぶれます.
 
                                                     51单片机入门 - 按键驱动程序设计实验_第1张图片
 
実際には、安定的に閉じた部分の状態が必要です.だから、この問題を解決するために時間を延長する方法を採用することができます.具体的な過程はボタンが押されているかどうかを見てから、ボタンが押されているかを確認してから、もうしばらく遅らせてください.
この時もボタンがあると本当にキーが押します.
このジッタの時間は大体10 msですので、10 msのサブ関数を使えばいいです.
上のコードの66行目は、ボタンが離すかどうかを判断する必要があります.このプログラムには違いがありますが、要求ボタンを入れて解除してから何かが現れるプログラムがあります.
 
/*******************************************************************************
    :       8       8 LED (     ,      LED )
    :        
*******************************************************************************/
#include 

#define LED_KEY P0   //LED  P0 
#define IO_KEY  P1     //     P1 

void Delay();        //    
unsigned char Key_Scan();     //     

void main()
{
    unsigned char Key_Value, LED_Value;
    
    while(1)
    {
        Key_Value = Key_Scan();
        switch(Key_Value)
        {
            case(0xFE):         //K1  
                LED_Value = 0x01;
                break;
            case(0xFD):         //K2  
                LED_Value = 0x02;
                break;
            case(0xFB):         //K3  
                LED_Value = 0x04;
                break;
            case(0xF7):         //K4  
                LED_Value = 0x08;
                break;
            case(0xEF):         //K5  
                LED_Value = 0x10;
                break;
            case(0xDF):         //K6  
                LED_Value = 0x20;
                break;
            case(0xBF):         //K7  
                LED_Value = 0x40;
                break;
            case(0x7F):         //K8  
                LED_Value = 0x80;
                break;
            default:
                break;
        }
        
        LED_KEY = LED_Value;  //    LED        
    }
}

unsigned char Key_Scan()
{
    unsigned char Key_Value,i;

    if(IO_KEY != 0)
    {
        Delay();            //    

        if(IO_KEY != 0xFF)
        {
            Key_Value = IO_KEY;
            i = 0;
            if((i<50)&&(IO_KEY != 0xFF)) //        
            {
                Delay();
                i++;    
            }
        }
    }
    return Key_Value;
}

void Delay()              //  10ms
{
    unsigned char a,b,c;

    for(c=1;c>0;c--)
    {
        for(b=38;b>0;b--)
        {
            for(a=130;a>0;a--)
            {};
        }
    }
}
 
/*******************************************************************************
*           :    LED   
*                  
*******************************************************************************/
#include 
#include 

//--      IO --//
sbit      K1 = P1^0;       //    K1
sbit     K2 = P1^1;        //    K2
#define  LED_KEY P0    //LED  P0 

//--      --//
void Delay10ms(unsigned int c);   //  10ms
unsigned char Key_Scan();

/*******************************************************************************
*               : main
*                :    
*******************************************************************************/
void main(void)
{
    unsigned char ledValue, keyNum;

    ledValue = 0x01;

    while (1)
    {    
        keyNum = Key_Scan();  //    

        if (keyNum == 1)      //      1
        {
            ledValue = _crol_(ledValue, 1);    //   
        }
        else if (keyNum == 2)
        {
            ledValue = _cror_(ledValue, 1);    //   
        }

        LED_KEY = ledValue;  //  LED 
    }                
}

/*******************************************************************************
*                           : Key_Scan()
*                            :     
*******************************************************************************/

unsigned char Key_Scan()
{
    unsigned char keyValue = 0 , i; //    

    //--    1--//
    if (K1==0)        //    K1    
    {
        Delay10ms(1);    //    

        if (K1==0)    //          
        {
            keyValue = 1;
            i = 0;
            while ((i<50) && (K1==0))     //        
            {
                Delay10ms(1);
                i++;
            }
        }
    }

    //--    2--//
    if (K2==0)        //    K1    
    {
        Delay10ms(1);    //    

        if (K2==0)    //          
        {
            keyValue = 2;
            i = 0;
            while ((i<50) && (K2==0))     //        
            {
                Delay10ms(1);
                i++;
            }
        }
    }

    return keyValue;   //          
}

/*******************************************************************************
*                           : Delay10ms
*                          :     ,  10ms
*******************************************************************************/

void Delay10ms(unsigned int c)   //   0us
{
    unsigned char a, b;

    //--c               ,   for           --//
    for (;c>0;c--)
    {
        for (b=38;b>0;b--)
        {
            for (a=130;a>0;a--);
        }
           
    }       
}