單片機AT89C51鍵盤掃描識別實驗


      設計一個4X4的矩陣鍵盤,鍵盤的號碼0~15,要求編寫出一個鍵盤輸入掃描程序,要求單片機能根據鍵盤排列順序,能將按下去鍵盤號正確識別出來,並采用兩個數碼管分別鍵盤號碼的個位和十位。

實驗參考電路圖如下:


參考代碼:

#include<reg51.h>   //包含51單片機寄存器定義的頭文件
sbit P14=P1^4;      
sbit P15=P1^5;     
sbit P16=P1^6;      
sbit P17=P1^7;      
unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //數字0~9的段碼
unsigned char keyval;  
 
/**************************************************************
函數功能:數碼管動態掃描延時
**************************************************************/
void led_delay(void)     
 {
   unsigned char j;
for(j=0;j<200;j++)
;
  }


/**************************************************************
函數功能:按鍵值的數碼管顯示子程序
**************************************************************/
 void display(unsigned char k)
{
   P2=0xbf;            
   P0=Tab[k/10];       
   led_delay();       
   P2=0x7f;            
   P0=Tab[k%10];      
led_delay();         
 }


/**************************************************************
函數功能:軟件延時子程序
**************************************************************/
 void delay20ms(void)   
{
   unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
           ;
 }




/**************************************************************
函數功能:主函數
**************************************************************/ 
 void main(void)
 {
   EA=1;                  
ET0=1;                          
TMOD=0x01;            
TH0=(65536-500)/256;  
TL0=(65536-500)%256;  
TR0=1;                
keyval=0x00;         
  
while(1)               
{
 display(keyval);  
}


}


/**************************************************************
函數功能:定時器0的中斷服務子程序,進行鍵盤掃描,判斷鍵位
**************************************************************/ 
  void time0_interserve(void) interrupt 1 using 1   
  {
     TR0=0;                 
     P1=0xf0;                
 if((P1&0xf0)!=0xf0)      
    delay20ms();           
 if((P1&0xf0)!=0xf0)      
   {
      P1=0xfe;            
      if(P14==0)       
             keyval=1;           
           if(P15==0)            
             keyval=2;           
           if(P16==0)             
             keyval=3;          
           if(P17==0)           
             keyval=4;           


           P1=0xfd;             
     if(P14==0)       
             keyval=5;         
           if(P15==0)         
             keyval=6;       
           if(P16==0)     
             keyval=7;        
           if(P17==0)    
             keyval=8;  

           P1=0xfb;      
   if(P14==0)     
             keyval=9;   
           if(P15==0)      
             keyval=10;    
           if(P16==0)    
             keyval=11;       
           if(P17==0)        
             keyval=12;   
    
           P1=0xf7;     
   if(P14==0)         
             keyval=13;          
           if(P15==0)           
             keyval=14;         
           if(P16==0)         
             keyval=15;        
           if(P17==0)          
             keyval=16;        
       }
     TR0=1;                   
     TH0=(65536-500)/256;  
TL0=(65536-500)%256;   
 }

修改實驗電路圖和實驗程序和設計電路,改成靜態顯示


調試后的程序代碼:

#include<reg51.h>   //包含51單片機寄存器定義的頭文件
sbit P14=P1^4;      
sbit P15=P1^5;     
sbit P16=P1^6;      
sbit P17=P1^7;      
unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //數字0~9的段碼
unsigned char keyval;  
 
/**************************************************************
函數功能:數碼管動態掃描延時
**************************************************************/
void led_delay(void)     
 {
   unsigned char j;
for(j=0;j<200;j++)
;
  }


/**************************************************************
函數功能:按鍵值的數碼管顯示子程序
**************************************************************/
 void display(unsigned char k)
{
        
        
   //P2=0x3f;         ///////////////   
P0=Tab[k/10];  
     P3=Tab[k%10];      
    led_delay();         
 }




/**************************************************************
函數功能:軟件延時子程序
**************************************************************/
 void delay20ms(void)   
{
   unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
           ;
 }




/**************************************************************
函數功能:主函數
**************************************************************/ 
 void main(void)
 {
   EA=1;                  
ET0=1;                          
TMOD=0x01;            
TH0=(65536-500)/256;  
TL0=(65536-500)%256;  
TR0=1;                
keyval=0x00;         
  
while(1)               
{
 display(keyval);  
}


}




/**************************************************************
函數功能:定時器0的中斷服務子程序,進行鍵盤掃描,判斷鍵位
**************************************************************/ 


  void time0_interserve(void) interrupt 1 using 1   
  {
     TR0=0;                 
     P1=0xf0;                
 if((P1&0xf0)!=0xf0)      
    delay20ms();           
 if((P1&0xf0)!=0xf0)      
   {
      P1=0xfe;            
      if(P14==0)       
             keyval=1;           
           if(P15==0)            
             keyval=2;           
           if(P16==0)             
             keyval=3;          
           if(P17==0)           
             keyval=4;           


           P1=0xfd;             
     if(P14==0)       
             keyval=5;         
           if(P15==0)         
             keyval=6;       
           if(P16==0)     
             keyval=7;        
           if(P17==0)    
             keyval=8;  

           P1=0xfb;      
   if(P14==0)     
             keyval=9;   
           if(P15==0)      
             keyval=10;    
           if(P16==0)    
             keyval=11;       
           if(P17==0)        
             keyval=12;       
           P1=0xf7;     
   if(P14==0)         
             keyval=13;          
           if(P15==0)           
             keyval=14;         
           if(P16==0)         
             keyval=15;        
           if(P17==0)          
             keyval=16;        
       }
     TR0=1;                   
     TH0=(65536-500)/256;  
 TL0=(65536-500)%256;   
 }



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com