⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 按键.txt

📁 按键判断 进行行扫描m表示对应的行数 n表示对应的列数 对应数值亮
💻 TXT
字号:
#include<reg51.h>               //单片机库函数
#include<stdio.h>

sbit key1=P0^4;                 //位定义
sbit key2=P0^5;
sbit key3=P0^6;
sbit key4=P0^7;
sbit led1=P2^4;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;

//延迟函数
void delay(unsigned int i)  //当i为25时约延时10毫秒       
{
 unsigned char j;        //当i为2500时约延时1秒 
  while(i>0)
  {
  i--;
   for(j=0;j<10;j++) ;
  }
} 

//检测键的有无函数、并判断是哪一个键按下
void checkkeys(void)     
{
  unsigned char code a[4]={0xfe,0xfd,0xfb,0xf7};
  unsigned char k,l,m,n,i;
  while(1)
  { 
  P0=0xf0;               //初始化p0
  delay(5);              //延迟抖动
  if(P0!=0xf0)           //假如p0不等于0xf0,则认为有键按下
  {
   for(i=0;i<4;i++)   //扫描第i列
   {
    P0=a[i];
    delay(10);    
    if(P0!=a[i])
    {
     m=P0&0xf0;   //进行行扫描m表示对应的行数
     n=a[i]&0x0f;        //n表示对应的列数
    }
   }
   k=m|n;                     //k表示键码对应的数据
   switch(k)
   { 
    case 0xee:             //第一列的第一个键
    {
     while(1)   //循环闪烁
     {
      P2=0xf0;  //对应数值亮(在这不会亮,主要是为了与后面对应才这样写)
      delay(1500); //持续一会
      P2=0xf0;  //全部熄灭
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break; //如果没键按下,继续闪烁
     }break;
    }
    case 0xde:    //第一列的第二个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x2f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;  //全部熄灭
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xbe:    //第一列的第三个键
    {
     while(1)   //循环闪烁   
     {
      P2=~0x1f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0x7e:    //第一列的第四个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x3f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xed:              //第二列的第一个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x8f;  //对应数值亮 
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xdd:    //第二列的第二个键
    {
     while(1)   //循环闪烁
     {
      P2=~0xaf;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xbd:    //第二列的第三个键 
    {
     while(1)   //循环闪烁
     {
      P2=~0x9f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0x7d:    //第二列的第四个键 
    {
     while(1)   //循环闪烁
     {
      P2=~0xbf;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xeb:              //第三列的第一个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x4f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xdb:    //第三列的第二个键  
    {
     while(1)   //循环闪烁
     {
      P2=~0x6f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xbb:    //第三列的第三个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x5f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0; 
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
      }break;
    }
    case 0x7b:    //第三列的第四个键
    {
     while(1)   //循环闪烁
     {
      P2=~0x7f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xe7:              //第四列的第一个键
    {
     while(1)   //循环闪烁
     {
      P2=~0xcf;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xd7:    //第四列的第二个键
    {
     while(1)   //循环闪烁
     {
      P2=~0xef;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0xb7:    //第四列的第三个键
    {
     while(1)   //循环闪烁
     {
      P2=~0xdf;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
    case 0x77:    //第四列的第四个键
    {
     while(1)   //循环闪烁
     {
      P2=0x0f;  //对应数值亮
      delay(1500); //持续一会
      P2=0xf0;
      delay(1500); //持续一会
      l=0;   //清变量l
      for(i=0;i<4;i++)//判断是否有键按下
      {
       P0=a[i]; //然后比较P0和a[i],只要不等则认为有键按下
       delay(30);        
       if(a[i]!=P0) l++;//有键按下则自增变量l 
      }
      if(l!=0)break;//如果没键按下,继续闪烁
     }break;
    }
   }   
   }
 }
}

//主函数
void main()                  
{ 
  P2=0xf0;        //初始化P2口 
    delay(2500);
 delay(25);
  checkkeys();    //调用函数checkkeys()
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -