4X4矩阵键盘1

最近钻研了一下矩阵键盘,花了很久时间才搞明白是怎么回事,都怪自己太笨
那现在我们就来说说矩阵键盘的检测原理
1.4X4矩阵键盘图如下:
4X4矩阵键盘示意图
2.我采取的是逐行扫描法,依次给每行赋0,然后观察当有按键按下时哪一列的值为0,从而可以确定具体的按键

/*  函数名称:juzhenjianpan.c
    函数实现功能:把键盘值显示到数码管上
    说明:4X4矩阵键盘
    作者;MARKPAIN
    日期:2015.4.11
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_num;                   //定义获取的键盘值
uint shi,ge;                       
uchar code table[]={            //共阴极数码管段选编码
0x3f,0x06,0x5b,0x4f,0x66,       /*0,1,2,3,4*/
0x6d,0x7d,0x07,0x7f,0x6f        /*5,6,7,8,9*/
};
/**********延时函数**********/
void delayms(uint z)            //延时1ms
{
    uint x,y;
    for(x=z;x>0;x--)
       for(y=110;y>0;y--);  
}
/**********显示函数**********/
void display(uchar num)
{
    /*考虑到键盘值的范围为0——16*/
    shi=num/10;
    ge=num%10;

    P2=0xff;
    P0=table[shi];
    P2=0xfd;     //倒数第二位亮
    delayms(1);

    P2=0xff;            //消影不可少
    P0=table[ge];
    P2=0xfe;     //最低位亮
    delayms(1);
}
/***********键盘扫描函数*********/
uchar keyscan(void)
 { 
      uchar n,result=0;  //扫描第一行 
      P1=0xfe; n=P1; n&=0xf0;  
      if(n!=0xf0)
      {    
          delayms(10);   
          P1=0xfe; n=P1; n&=0xf0;   
          if(n!=0xf0)  
          {       
             switch(n)    
             {          
               case(0xe0):result=1;break;       
               case(0xd0):result=2;break;     
               case(0xb0):result=3;break;      
               case(0x70):result=4;break;       
             }      
          }  
     }  
     //扫描第二行  
     P1=0xfd; n=P1;n&=0xf0; 
     if(n!=0xf0)
    {    
        delayms(10);   
        P1=0xfd; n=P1; n&=0xf0;  
        if(n!=0xf0)  
        {      
            switch(n) 
            {   
                case(0xe0):result=5;break;    
                case(0xd0):result=6;break;    
                case(0xb0):result=7;break;      
                case(0x70):result=8;break;     
            }     
        }  
     }  //扫描第三行  
      P1=0xfb; n=P1; n&=0xf0; 
      if(n!=0xf0) 
      {     
         delayms(10);    
         P1=0xfb; n=P1;n&=0xf0; 
         if(n!=0xf0)   
         {      
             switch(n)  
             {      
                 case(0xe0):result=9;break;      
                 case(0xd0):result=10;break;      
                 case(0xb0):result=11;break;     
                 case(0x70):result=12;break;      
             }    
          }   
      } 
       //扫描第四行
      P1=0xf7; n=P1; n&=0xf0;
      if(n!=0xf0) 
      {    
          delayms(10);    
          P1=0xf7; n=P1; n&=0xf0;    
          if(n!=0xf0)   
          {       
             switch(n)    
             {   
                case(0xe0):result=13;break;  
                case(0xd0):result=14;break;      
                case(0xb0):result=15;break;      
                case(0x70):result=16;break;       
             }   
          } 
       }
    return result;
}
/**********主函数**************/
void main()
{
   while(1)
   {
    key_num=keyscan();          //键盘扫描
    display(key_num);   //显示获取的键盘值
    }
}

总之,矩阵键盘只要自己认真地把整个过程想清楚,然后有了思路写代码也就变得比较简单,关键在于要把原理搞懂。
打包文件具体见
[单片机4X4矩阵键盘](http://download.csdn.net/my

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值