找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17195|回复: 12
打印 上一主题 下一主题
收起左侧

比较实用的51矩阵键盘程序解析

  [复制链接]
跳转到指定楼层
楼主
ID:70941 发表于 2015-1-23 04:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


由于单片机I/o口的有限,当需要多个按键的时候,常用矩阵键盘作为输入设备.
由于按键按下后,松开得到的波形实际中不是理想化的方波,会出现机械抖动,对后续单片机检测按键带来麻烦,




一般教材上基本都是利用延时去抖动:基本套路都:
void key()
{
if(k1==0) //如果按键按下
{
delay_10ms();延时去抖动   
if(k1==0)  再次判断
{
你要的功能
}
}
}

由于10ms是理论上人们按键按下后到松手所要的大概时间,由于个体差异,和按键的机械灵活度有差异,导致可能出现按键按太快,没反应,按时间太长导致单片机效率降低等不确定因素.

可以采用判断是否是第一次按下来进行检测,可以大大提高效率,当你按键按了再快也能检测到。
程序如下:

//---------------------------------------------------------------------

#include <reg52.h>

#define key P2
int val;

char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay_10ms();

void key_scan();   //矩阵按键函数声明


void main()
{
        while(1)

        {
        P0=sign[val];
        key_scan();
        }  
}

void key_scan()
{
         static char a,b;  //a用于判断是不是第一次按下,b用于稍微延时
         char state;   //记录键值
         key=0x0f;
         if(key!=0x0f)                 //如果有按键按下
         {
          state=key;   //记录第一次按键状态
                  if(a==0)                //如果第一次按下
                  {
                   b++;                         //略微延时  不需要延时10ms以提高单片机效率
                           if(b>3)
                        {
                                         if(key==state)                //判断键值是否和第一次一致
                                         {
                                            a=1,b=0;    //复位状态值 a==1说明已经按下,等待后续松开
                                           key=0x0f;                 //测试列
                                                           switch(key)
                                                           {
                                                                case (0x07):          val=0;break;
                                                                case (0x0b):          val=1;break;
                                                                case (0x0d):          val=2;break;
                                                                case (0x0e):          val=3;break;
                                                           }
                                   key=0xf0;        // 测试行
                                                           switch(key)
                                                           {
                                                                 case (0x70):         val=val;break;
                                                                 case (0xb0):         val=val+4;break;
                                                                 case (0xd0):    val=val+8;break;
                                                                 case (0xe0):         val=val+12;break;
                                                           }
                                           }
                                }
                   }
          }
       else
           {
                a=b=0;                         //松开后复位状态机
           }                  
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72399 发表于 2015-1-23 16:11 | 只看该作者
矩阵键盘的程序,用到再复制
回复

使用道具 举报

板凳
ID:72399 发表于 2015-1-23 16:11 | 只看该作者
矩阵键盘的程序,用到再复制
回复

使用道具 举报

地板
ID:72399 发表于 2015-1-23 16:11 | 只看该作者
矩阵键盘的程序,用到再复制
回复

使用道具 举报

5#
ID:29438 发表于 2015-2-5 13:33 | 只看该作者
学习了,谢谢!
回复

使用道具 举报

6#
ID:73030 发表于 2015-2-9 07:59 来自手机 | 只看该作者
留着,用的时候再拿,谢谢楼主。
回复

使用道具 举报

7#
ID:20841 发表于 2015-2-22 07:24 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

8#
ID:73002 发表于 2015-3-11 13:19 | 只看该作者
可以学习下。
回复

使用道具 举报

9#
ID:263745 发表于 2017-12-21 17:57 | 只看该作者
多键摁下 怎么处理呢?
回复

使用道具 举报

10#
ID:402000 发表于 2018-9-25 11:26 | 只看该作者
非常感谢,减少了打代码的时间
回复

使用道具 举报

11#
ID:402219 发表于 2018-9-25 16:01 | 只看该作者
感谢  好具体
回复

使用道具 举报

12#
ID:985169 发表于 2021-12-5 20:25 | 只看该作者
如果显示平方数的要怎么修改?
回复

使用道具 举报

13#
ID:66287 发表于 2021-12-6 09:04 | 只看该作者
思路真正对路,修改待验证。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表