×
单片机 > 单片机程序设计 > 详情

51单片机的4x4矩阵键盘扫描例程(C51)

发布时间:2020-06-18 发布时间:
|

//4x4矩阵键盘扫描例程(C51)
//使用P0口上的LED灯显示4x4键盘扫描得到的键值
//
//广西民大物电学院 李映超 2010.4.19

#include                     //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int 
#define key_4x4_port P3                //定义4x4键盘使用的单片机端口
uchar key;                                        //4x4键盘扫描所得的键值保存到这里
void delayms(uint xms);        //声明延时子函数
void key_4x4_scan();    //声明4x4键盘扫描子函数,得到的键值送至全局变量key
//========================================================
void main()
{
        P0=0xff;  //P0开机初始化
        key=0xff; //键盘值开机初始化为ff(检测到的键值应为0----15)
  while(1)
  {
        key_4x4_scan();//不停调用键盘扫描程序
        P0=key;                //用P0来显示键值
  }
}
//========================================================
void delayms(uint xms)      //延时子函数                        
{        uint i,j;
        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
//---------------------------------------------
void key_4x4_scan()                    //4x4键盘扫描子函数,得到的键值送至全局变量key
{        uchar temp ;
    key_4x4_port=0xfe;           //送出最高位0电平去扫描
    temp=key_4x4_port;           //读出整个口的得到的值
    temp=temp&0xf0;                   //屏蔽低4位
    if(temp!=0xf0)                   //假如高4位不是全1
    { delayms(10);                   //延时消抖再读
          temp=key_4x4_port;
          temp=temp&0xf0;
      if(temp!=0xf0)           //消抖后如果再次确定高4位不是全1
      { temp=key_4x4_port; //读出此次按键的值
        switch(temp)
        { case 0xee:
               key=0; break;
          case 0xde:
               key=1; break;
          case 0xbe:
               key=2; break;
          case 0x7e:
               key=3; break;
         }
         while(temp!=0xf0)          //等待按键放开
         { temp=key_4x4_port;
           temp=temp&0xf0;
         }
      }
    }
    key_4x4_port=0xfd;
    temp=key_4x4_port;
    temp=temp&0xf0;
    if(temp!=0xf0)
    { delayms(10);
      temp=key_4x4_port;
      temp=temp&0xf0;
      if(temp!=0xf0)
      {        temp=key_4x4_port;
        switch(temp)
        { case 0xed:
               key=4; break;
          case 0xdd:
               key=5; break;
          case 0xbd:
               key=6; break;
          case 0x7d:
               key=7; break;
         }
         while(temp!=0xf0)
         { temp=key_4x4_port;
           temp=temp&0xf0;
         }
      }
      }
    key_4x4_port=0xfb;
    temp=key_4x4_port;
    temp=temp&0xf0;
    if(temp!=0xf0)
    { delayms(10);
             temp=key_4x4_port;
      temp=temp&0xf0;
      if(temp!=0xf0)
      { temp=key_4x4_port;
        switch(temp)
        { case 0xeb:
               key=8;  break;
          case 0xdb:
               key=9;  break;
          case 0xbb:
               key=10; break;
          case 0x7b:
               key=11; break;
         }
         while(temp!=0xf0)
         { temp=key_4x4_port;
           temp=temp&0xf0;
         }
      }
      }
    key_4x4_port=0xf7;
    temp=key_4x4_port;
    temp=temp&0xf0;
    if(temp!=0xf0)
    { delayms(10);
      temp=key_4x4_port;
      temp=temp&0xf0;
      if(temp!=0xf0)
      { temp=key_4x4_port;
        switch(temp)
        { case 0xe7:
               key=12; break;
          case 0xd7:
               key=13; break;
          case 0xb7:
               key=14; break;
          case 0x77:
               key=15; break;
         }
         while(temp!=0xf0)
         { temp=key_4x4_port;
           temp=temp&0xf0;
         }
      }
    }
}
//---------------------------------------------

关键字:51单片机  4x4矩阵键盘  C51 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2