单片机矩阵键盘扫描

本讲任务:

      了解矩阵键盘检测原理及如何获得键盘扫描值。

逐行扫描:

      我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

例程:

/*************************矩阵键盘扫描**************************

*单片机型号:STC89C52RC

*开发环境:KEIL

*功能:当按下一个按键后,在数码管进行数值的显示

******************************************************************/

#include<reg51.h>

sbit BEEP=P2^3;

sbit LE1=P2^6;

sbit LE2=P2^7;

void delay(int In,int Out);

unsigned char buffer,key_num;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(int In,int Out)                       //定义延时函数 

{

 int i,j;

 for(i=0;i<In;i++)

 {for(j=0;j<Out;j++){;}}

}

void display(unsigned char num)         //数码管显示

{

 P0=table[num];  LE1=1;LE1=0;

 P0=0x00; LE2=1;LE2=0;

}

void main()

{

 LE1=0;LE2=0;

 while(1)

 {

  /**************************************************************/

  P3=0xfe;                                            //扫描S3,S4,S5,S6;

  buffer=P3;          

  buffer=buffer&0xf0; 

  if(buffer!=0xf0)

  {

   delay(5,10);

   if(buffer!=0xf0)

   {

    buffer=P3;               

    switch(buffer)

    {

     case 0xee:{key_num=0;}break;

     case 0xde:{key_num=1;}break;

     case 0xbe:{key_num=2;}break;

     case 0x7e:{key_num=3;}break;

    }

    while(buffer!=0xf0)    

    {

     buffer=P3;          

     buffer=buffer&0xf0;    

     BEEP=0;

    }

    BEEP=1;

    display(key_num);

   }

  }

  /**************************************************************/

  P3=0xfd;                                            //扫描S8,S9,S10,S11

  buffer=P3;

  buffer=buffer&0xf0;

  if(buffer!=0xf0)

  {

   delay(5,10);

   if(buffer!=0xf0)

   {

    buffer=P3;

    switch(buffer)

    {

     case 0xed:{key_num=4;}break;

     case 0xdd:{key_num=5;}break;

     case 0xbd:{key_num=6;}break;

     case 0x7d:{key_num=7;}break;

    }

    while(buffer!=0xf0)

    {

     buffer=P3;

     buffer=buffer&0xf0;

     BEEP=0;

    }

    BEEP=1;

    display(key_num);

   }

  }

  /**************************************************************/

  P3=0xfb;                                             //扫描S13,S14,S15,S16

  buffer=P3;          

  buffer=buffer&0xf0;       

  if(buffer!=0xf0)

  {

   delay(5,10);

   if(buffer!=0xf0)

   {

    buffer=P3;     

    switch(buffer)

    {

     case 0xeb:{key_num=8;}break;

     case 0xdb:{key_num=9;}break;

     case 0xbb:{key_num=10;}break;

     case 0x7b:{key_num=11;}break;

    }

    while(buffer!=0xf0)

    {

     buffer=P3;

     buffer=buffer&0xf0;

     BEEP=0;

    }

    BEEP=1;

    display(key_num);

   }

  }

  /***************************************************************/

  P3=0xf7;                                            //扫描S18,S19,S20,S21

  buffer=P3;

  buffer=buffer&0xf0;

  if(buffer!=0xf0)

  {

   delay(5,10);

   if(buffer!=0xf0)

   {

    buffer=P3;

    switch(buffer)

    {

     case 0xe7:{key_num=12;}break;

     case 0xd7:{key_num=13;}break;

     case 0xb7:{key_num=14;}break;

     case 0x77:{key_num=15;}break;

    }

    while(buffer!=0xf0)

    {

     buffer=P3;

     buffer=buffer&0xf0;

     BEEP=0;

    }

    BEEP=1;

    display(key_num);

   }

  }

 }

}

对应电路图:

最后,求求看到的此文的小伙伴点赞关注支持一下下哦。毕竟,码字不容易哦,您的支持是我最大的动力呀!!!呜呜呜~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式硬件与代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值