矩陣鍵盤掃描原理詳解——單片機

矩陣鍵盤掃描原理詳解


根據原理圖 
鍵盤掃描方法是:行線P10~P13爲輸出線,列線P14~P17爲輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全爲高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。現在我們以第二行的S5鍵爲例,若按下S5後我們應該怎麼得到這個鍵值呢?當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。首先,單片機將P10輸出爲低電平,其它P11~P13輸出高電平,此時讀取列線的數據全爲高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍爲高電平,此時再來讀取列線數據,發現列線讀到的數據有低電平,數值爲1011(0x0B),如果我們的鍵盤佈局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。

/*  
    功能:矩陣鍵盤掃面,按鍵顯示鍵值程序 
    作者:siriuszxn
                                  */
#include "reg51.h"                                                                                                                
#define KEYPORT = P1                                                                                                   

unsigned char i;                                                                                                                                         
unsigned char Keynum;                                                                                                        
unsigned char Line;                                       //行                                                                 
unsigned char Mask;                                                                                                         
unsigned char Col;                                        //列                                                                      
unsigned char ScanCode;                                                                                              

unsigned char code psegs_table[] =                                                                                            {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};                                                                //共陽極數碼管0-F                                                                                                                                            

void delay_ms(unsigned int t)                      //ms延時程序                                                                      
{                                                                                                                                       
    unsigned char i;                                                                                                                 
     unsigned int x;                                                                                                                  
     x=t;                                                                                                                              
     while(x--)                                                                                                                        
     {                                                                                                                                          
             for(i=0;i<113;i++);                                                                                                              
     }                                                                                                                                           
}                                                                                                                                        
/* 鍵盤掃描程序 */                                                                                                                                        
void keyscan()                                                                                                           
{                                                                                                                                   
    while (1)              //循環掃描鍵盤       
    {                                                                                                                            
       P1 = 0xff;          //開始                                                         
        Line = 1;                                                                                         
        Mask = 0x01;                                                                                         

        for(i = 0; i < 4; i++)                                                                                   
        {                                                                                                                                                                                    
            P1 = ~Mask;                                                                                    

            ScanCode = P1 & 0xf0;                                                                                          

            if (ScanCode != 0xf0)                                                                                         
            {                                                                                                                                                                                    
                delay_ms(5);                                                                               
            }                                                                                                                                                                                    

            ScanCode = P1 & 0xf0;                                                                                          

            switch(ScanCode)                                                
            {                                                                                                                                                                                    
                case 0xe0:Col=1;break;                                                                                          
                case 0xd0:Col=2;break;                                                                   
                case 0xb0:Col=3;break;                                                                          
                case 0x70:Col=4;break;                                                                  
                default  :Col=0;break;                                                                                          
            }                                                                                                                                                                                    

            if (Col > 0)                                                                                                                                           
            {   
                //根據行列計算鍵值                                                                                                                                                         
                Keynum = (Line - 1) * 4 + Col;                                                                  
                //通過P0口接數碼管顯示                                                                                                          
                P0 = psegs_table[Keynum-1];                                                                                          

                while(1)                                                                                           
                {                                                                                
                    ScanCode = P1 & 0xf0;                                                                                
                    if(ScanCode == 0xf0)                                                               
                    {                                                                                                                                              
                        break;                                                    
                    }                                                                                                                       
                }                                                                                
                Mask <<= 1;                                                                                                      
                Line++;                                                                                                 
            }                                                                                                                        
        }                                                                                                                                      
    }  
}                                                                                                                                   

void main()                                                                                         
{                                                                                                                                     
    while(1)                                                                                                                      
    {                                                                                                                                 
        keyscan();                                                                                         
    }                                                                                                                                 
}                                   
--------------------- 
作者:zxnsirius 
來源:CSDN 
原文:https://blog.csdn.net/zxnsirius/article/details/51088946 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章