【藍橋杯單片機05】獨立按鍵的基本操作


【藍橋杯單片機05】獨立按鍵的基本操作
廣東職業技術學院 歐浩源

    按鍵設計一般分為兩種:獨立按鍵和矩陣鍵盤。按鍵數量較少的用前者,按鍵數量較多的用后者。雖然兩種設計都是操作按鍵,但是其鍵盤掃描方式和程序的設計思路是截然不同的。獨立按鍵簡單很多,矩陣鍵盤雖然復雜,只要掌握了本質思路,也沒有什么困難之處。

1、獨立按鍵的處理思路
    一般情況下,獨立按鍵有兩個引腳,其中一個通過上拉電阻接到單片機的I/O端口,另外一端接地。也就是說,平時按鍵沒有動作的時候,輸出的是高電平,如果有按下動作發生,則輸出的是低電平。那么,我們在程序設計的時候,只要掃描跟按鍵引腳相連的I/O端口,如果發現有低電平產生,則判定該按鍵處於按下狀態。有些時候,電路或者外圍有電磁干擾,也會使單片機的I/O端口產生低電平,這種干擾信號會讓單片機誤認為是按鍵動作。所以,在掃描按鍵的時候應該做去抖動處理,把干擾信號過濾掉,從而獲得准確的按鍵狀態信號。

2、單元實訓題目

3、實現源碼參考

#include "reg52.h"  

sbit HC138_A = P2^5;        
sbit HC138_B = P2^6;        
sbit HC138_C = P2^7;        

sbit S7 = P3^0;        
sbit S6 = P3^1;        
sbit S5 = P3^2;        
sbit S4 = P3^3;        

unsigned char code SMG_NoDot[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

void Delay(unsigned char t)
{
        while(t--);
}

void Init74HC138(unsigned char n)
{
        switch(n)
        {
                case 4:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 5:
                        HC138_A = 1;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 6:
                        HC138_A = 0;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 7:
                        HC138_A = 1;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 8:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 0;
                        break;
        }
}

void ShowKeyNum(unsigned char value)
{
        Init74HC138(6);
        P0 = 0x01;
        Init74HC138(7);
        P0 = value;
}

void ScanKeys()
{
        if(S7 == 0)
        {
                Delay(200);
                if(S7 == 0)
                {
                        while(S7 == 0);
                        ShowKeyNum(SMG_NoDot[1]);
                }
        }
        if(S6 == 0)
        {
                Delay(200);
                if(S6 == 0)
                {
                        while(S6 == 0);
                        ShowKeyNum(SMG_NoDot[2]);
                }
        }
        if(S5 == 0)
        {
                Delay(200);
                if(S5 == 0)
                {
                        while(S5 == 0);
                        ShowKeyNum(SMG_NoDot[3]);
                }
        }
        if(S4 == 0)
        {
                Delay(200);
                if(S4 == 0)
                {
                        while(S4 == 0);
                        ShowKeyNum(SMG_NoDot[4]);
                }
        }
}
                          
void main()
{
        while(1)
        {
                ScanKeys();
        }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM