51单片机如何判断哪个矩阵按钮按下详细解释

2025-12-17 12:59:55

按下矩阵按钮,数码管显示对应的数字0-9、a-f


51单片机如何判断哪个矩阵按钮按下详细解释

51单片机如何判断哪个矩阵按钮按下详细解释

51单片机如何判断哪个矩阵按钮按下详细解释

工具/原料

软件uvision4

stc-isp

方法/步骤

下图是解释

给定P3口的值集合

unsigned char code givenP3Table[]={0xfe,0xfd,0xfb,0xf7};

给定P3口后按下某个按钮响应的值集合


unsigned char code implyP3Table[4][4]=

            {{0xee,0xde,0xbe,0x7e},


            {0xed,0xdd,0xbd,0x7d},
            {0xeb,0xdb,0xbb,0x7b},
            {0xe7,0xd7,0xb7,0x77}};

51单片机如何判断哪个矩阵按钮按下详细解释

#include<reg51.h>

sbit dula=P2^6;


sbit wela=P2^7;
void delay(unsigned char i)
{
 unsigned char j,k;
    for(j=i;j>0;j--)
      for(k=125;k>0;k--);
}
/*****按下了就返回0-15中对应的某个数,没按就返回16***开始*****/
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,   //数码管0,1,2,3,
       0x66,0x6d,0x7d,0x07,   //数码管4,5,6,7,
       0x7f,0x6f,0x77,0x7c,   //数码管8,9,a,b,
       0x39,0x5e,0x79,0x71,}; //数码管c,d,e,f,

给定P3口的值集合

unsigned char code givenP3Table[]={0xfe,0xfd,0xfb,0xf7};

给定P3口后按下某个按钮响应的值集合

unsigned char code implyP3Table[4][4]={{0xee,0xde,0xbe,0x7e},


            {0xed,0xdd,0xbd,0x7d},
            {0xeb,0xdb,0xbb,0x7b},
            {0xe7,0xd7,0xb7,0x77}};
unsigned char code returnNumTable[4][4]={{0,1,2,3},
             {4,5,6,7},
             {8,9,10,11},
             {12,13,14,15}};

unsigned char ScanMatrix()


{
 unsigned char row,column;
 unsigned char key;
 unsigned char temp;

 for(row=0;row<4;row++)


 {
  P3=givenP3Table[row];
     temp=P3;
     temp=temp&0xf0;
  
  if(temp!=0xf0)
     {
       delay(10);
       if(temp!=0xf0)
          {
          temp=P3;
    for(column=0;column<4;column++)
           if(temp==implyP3Table[row][column])
      {
                key=returnNumTable[row][column];
       break;//有键按下就跳出for(column=0;column<4;column++)内循环 
     }    
       }
       while(temp!=0xf0)
       {
         temp=P3;
         temp=temp&0xf0;
       }
    break;//有键按下就跳出for(row=0;row<4;row++)外循环     
      }
   else key=16;
 }
 return key;
}
/*****按下了就返回0-15中对应的某个数,没按就返回16***结束*****/

void display(unsigned char num)


{
     P0=table[num];
     dula=1;
     dula=0;
     P0=0xc0;
     wela=1;
     wela=0;
}
unsigned char ret,tmp;//主函数中不能定义局部变量
void main()
{
  dula=0;//数码管什么都不显示
  wela=0;
  tmp=16;//tmp初始值不能为0-15中某个数,会影响后面的判断
  while(1)
  {
 ret=ScanMatrix();
   if(ret!=tmp&&ret!=16)
 {
   tmp=ret; 
      display(tmp);
 }   
  }
}

51单片机如何判断哪个矩阵按钮按下详细解释

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢