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

2025-10-23 04:52:15

按下矩阵按钮,数码管显示对应的数字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。
猜你喜欢