51单片机矩阵键盘扫描

矩阵键盘检测之行列扫描法:

对矩阵键盘按1至16的顺序进行编号,通过下面的扫描程序得到返回数值即可确定是哪个键被按下。

我所用开发板的矩阵键盘


矩阵键盘检测原理:
1、查询是否有键按下。
2、键的抖动处理。
3、查询按下键所在行和列位置,得到键值。


先行后列扫描法

#include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define temp P2           //定义按键I/O口
    uchar keyscan()
    {
       uchar num;
       temp=0xf0;
       if(temp!=0xf0)    //检测是否有键按下
       {
          delay_ms(5);    //延时消抖
          if(temp!=0xf0)   //再次检测是否有键按下
          {
             temp=0xf0;     //对应IO口拉高,以便检测
             switch(temp)   //先确定行
             {
                case 0x70: num=1;  break;   //第一行
                case 0xb0: num=5;  break;   //第二行
                case 0xd0: num=9;  break;   //第三行
                case 0xe0: num=13; break;   //第四行
             }
             temp=0x0f;     //对应IO口拉高,以便检测
             switch(temp)   //再确定列
             {
                case 0x07: num=num+0; break;   //第一列
                case 0x0b: num=num+1; break;   //第二列
                case 0x0d: num=num+2; break;   //第三列
                case 0x0e: num=num+3; break;   //第四列
             }
          }
       }
       return num;   //结合行列扫描的值得出按键对应的数值,并返回
    }


先列后行扫描法

#include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define temp P2
    uchar keyscan()
    {
       uchar num;
       temp=0x0f;
       if(temp!=0x0f)   
       {
          delay_ms(5);
          if(temp!=0x0f)
          {
             temp=0x0f;    //先确定列
             switch(temp)
             {
                case 0x07: num=1; break;
                case 0x0b: num=2; break;
                case 0x0d: num=3; break;
                case 0x0e: num=4; break;
             }
             temp=0xf0;   //再确定行
             switch(temp)
             {
                case 0x70: num=num+0;  break;
                case 0xb0: num=num+4;  break;
                case 0xd0: num=num+8;  break;
                case 0xe0: num=num+12; break;
             }
          }
       }
       return num;      
    }

注:这里的行列是相对的,看你自己的接线是怎样的,请自己动手体会,希望能对大家有所帮助!

  • 26
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值