c51单片机 4×4矩阵键盘 检测代码 原创

实验板键盘和数码管接法:

实验版键盘和数码管接法

 

/*
c51单片机 4×4矩阵键盘 检测代码 原创
*/
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define keyCtrl P1 //键盘接的控制口

uchar led00[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//共

阳 无小数点
//uchar key;//按键值
void delay(uint ms);
uchar waitingKeyL1();
uchar waitingKeyL2();
uchar waitingKeyL3();
uchar waitingKeyL4();
uchar waitingKeyAll();

void main()
{
 uchar keyVal=15; //让LED不显示
 
 while(1)
 {
  keyVal=waitingKeyAll(); //按键的返回值 0~15
  if(keyVal != 255)
  {
   P2=0x7f;
   P0=led00[keyVal];
  }

 }
}

void delay(uint ms)
{
 uint i;
 for(;ms-- > 0;)
  for(i=125;i-- > 0;);
}

uchar waitingKeyAll()  //检测所有键盘动作
{
 uchar v1,v2,v3,v4;
 v1=waitingKeyL1();
 v2=waitingKeyL2();
 v3=waitingKeyL3();
 v4=waitingKeyL4();

 if(v1!=255)return v1;
 if(v2!=255)return v2;
 if(v3!=255)return v3;
 if(v4!=255)return v4;
 return 255; //无按键动作 返回255
}

/*------------检测第一排键盘动作-------------*/
uchar waitingKeyL1() //检测第一排键盘动作
{
  uchar keyVal=255; //键值 255表示无按键动作
  uchar temp;
  keyCtrl=0xfe;
  temp=keyCtrl;
  temp=temp & 0xf0;

  if(temp != 0xf0)
  {
   delay(15);
   temp=temp>>4;

   switch(temp)
     {
    case 0xe:
     keyVal=0;
     break;
    case 0xd:
     keyVal=1;
     break;
    case 0xb:
     keyVal=2;
     break;
    case 0x7:
     keyVal=3;
     break;
   }
  //释放按键判断
   while(temp != 0xf0)
   {
    temp=keyCtrl & 0xf0;
   }

   }//end if
 return keyVal;
}

/*------------检测第二排键盘动作-------------*/
uchar waitingKeyL2() //检测第二排键盘动作
{
  uchar keyVal=255; //键值 255表示无按键动作
  uchar temp;
  keyCtrl=0xfd;
  temp=keyCtrl;
  temp=temp & 0xf0;

  if(temp != 0xf0)
  {
   delay(15);
   temp=temp>>4;

   switch(temp)
     {
    case 0xe:
     keyVal=4;
     break;
    case 0xd:
     keyVal=5;
     break;
    case 0xb:
     keyVal=6;
     break;
    case 0x7:
     keyVal=7;
     break;
   }
 //释放按键判断
   while(temp != 0xf0)
   {
    temp=keyCtrl & 0xf0;
   }
   }//end if
 return keyVal;
}


/*------------检测第三排键盘动作-------------*/
uchar waitingKeyL3() //检测第三排键盘动作
{
  uchar keyVal=255; //键值 255表示无按键动作
  uchar temp;
  keyCtrl=0xfb;
  temp=keyCtrl;
  temp=temp & 0xf0;

  if(temp != 0xf0)
  {
   delay(15);
   temp=temp>>4;

   switch(temp)
     {
    case 0xe:
     keyVal=8;
     break;
    case 0xd:
     keyVal=9;
     break;
    case 0xb:
     keyVal=10;
     break;
    case 0x7:
     keyVal=11;
     break;
   }

  //释放按键判断
   while(temp != 0xf0)
   {
    temp=keyCtrl & 0xf0;
   }

   }//end if
 return keyVal;
}

/*------------检测第四排键盘动作-------------*/
uchar waitingKeyL4() //检测第四排键盘动作
{
  uchar keyVal=255; //键值 255表示无按键动作
  uchar temp;
  keyCtrl=0xf7;
  temp=keyCtrl;
  temp=temp & 0xf0;

  if(temp != 0xf0)
  {
   delay(15);
   temp=temp>>4;

   switch(temp)
     {
    case 0xe:
     keyVal=12;
     break;
    case 0xd:
     keyVal=13;
     break;
    case 0xb:
     keyVal=14;
     break;
    case 0x7:
     keyVal=15;
     break;
   }

  //释放按键判断
   while(temp != 0xf0)
   {
    temp=keyCtrl & 0xf0;
   }
  }//end if
 return keyVal;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值