找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3331|回复: 10
收起左侧

用扫描法取4×4键盘的键值,是否要考虑按键消抖问题?

[复制链接]
ID:260909 发表于 2017-12-27 23:25 | 显示全部楼层 |阅读模式
      现在本人从网上学到按键扫描法取键值,基本理解了。但是却产生了个疑问:用扫描法判断4×4键盘的键值,是否要考虑按键消抖问题?如果要考虑消抖,那是在按键扫描子程序Key_Get( )里加消抖呢?还是在主程序里加消抖?该如何加呢?望各位大神给支支招!本人没想通就睡不着觉啊~~~

      4×4键盘扫描子程序如下:
...
...
unsigned char Key_Get( )
{
   unsigned char k=255;
   row0=row1=row2=row3=col0=col1=col2=col3=1;
   row0=0;
   if (col0==0)k=7;
   else if (col1==0)k=8;
   else if (col2==0)k=9;
   else if (col3==0)k=15;
   row0=1;
   row1=0;
   if (col0==0)k=4;
   else if (col1==0)k=5;
   else if (col2==0)k=6;
   else if (col3==0)k=14;
   row1=1;
   row2=0;
   if (col0==0)k=1;
   else if (col1==0)k=2;
   else if (col2==0)k=3;
   else if (col3==0)k=13;
   row2=1;
   row3=0;
   if (col0==0)k=0;
   else if (col1==0)k=10;
   else if (col2==0)k=11;
   else if (col3==0)k=12;
   row3=1;
   return k;
}
...
...
回复

使用道具 举报

ID:164602 发表于 2017-12-28 08:20 | 显示全部楼层
当然要消抖了!
不过我的程序或者我看到的程序,可不是你这样的。你这样的效率太低。给你一个高效率的行列扫描法的。
void KeyDown(void)
{
        unsigned char a=0;
        JP=0x0f;//测试列
        if(JP!=0x0f)
        {
                Delay10ms(1);//此处按键消抖
                if(JP!=0x0f)
                {
                        AJ=1;
                        switch(JP)
                        {
                                case(0X07):        JZ=0;break;
                                case(0X0b):        JZ=1;break;
                                case(0X0d):       JZ=2;break;
                                case(0X0e):        JZ=3;break;
                        }
                        JP=0Xf0;
                        switch(JP)
                        {
                                case(0X70):        JZ=JZ;break;
                                case(0Xb0):        JZ=JZ+4;break;
                                case(0Xd0):       JZ=JZ+8;break;
                                case(0Xe0):        JZ=JZ+12;break;
                        }
                        for (a=0;(a<50)&&(JP!=0xf0);a++)//松手消抖
                        {
                                Delay10ms(1);
                        }
                }
        }
}
我的板子的矩阵键盘电路是:
1.jpg

回复

使用道具 举报

ID:258566 发表于 2017-12-28 09:48 | 显示全部楼层
  1. //大小写没跟楼上的一样
  2. //255是key_get()默认无按键返回值。
  3. if((keyval=key_get())!=255){delay10ms();
  4. if(key_get()==keyval)//确认按键}
复制代码

在其他函数中加,还可以不用延时
回复

使用道具 举报

ID:7485 发表于 2017-12-28 10:05 | 显示全部楼层

回帖奖励 +1

肯定需要消抖。
回复

使用道具 举报

ID:268216 发表于 2017-12-28 10:51 | 显示全部楼层
不消抖怎么知道摁了几下
回复

使用道具 举报

ID:268206 发表于 2017-12-28 10:58 | 显示全部楼层
ahshmj 发表于 2017-12-28 10:05
肯定需要消抖。

消抖必须的啊
回复

使用道具 举报

ID:123289 发表于 2017-12-28 22:30 | 显示全部楼层
凡是用硬延时来消抖的都不高效,因为硬延时占用了CPU的时间。
如果怕写消抖程序,就加电容消抖。
回复

使用道具 举报

ID:268648 发表于 2017-12-28 22:38 | 显示全部楼层
在main里利用调度间隔消抖好些
回复

使用道具 举报

ID:268650 发表于 2017-12-28 22:45 | 显示全部楼层
怎么消除震动
回复

使用道具 举报

ID:260909 发表于 2017-12-29 00:02 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-12-28 08:20
当然要消抖了!
不过我的程序或者我看到的程序,可不是你这样的。你这样的效率太低。给你一个高效率的行列 ...

谢谢大神!程序简洁好多,不过我看不太懂那个“JZ”是什么?
回复

使用道具 举报

ID:260909 发表于 2017-12-29 00:06 | 显示全部楼层
lu'din 发表于 2017-12-28 22:38
在main里利用调度间隔消抖好些

能具体说明什么是“利用调度间隔”吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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