矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2444|回复: 4

这个按键电路,真的能实现连发,太神奇了

[复制链接]
     
发表于 2019-8-29 19:27:52 | 显示全部楼层 |阅读模式
  今天学到这个电路,那个连发的状态,不仔细试,还真不清楚是怎么实现的。
四个状态,按下,长按,连发和释放
按下,实现有消抖,长按,多按会才行,再多按,就会进入连发功能。本来以为所谓连发,只是给一个信号,要另编程序 实现,没想到,进入这个状态后,它是在连续的赋值,太神奇了。

这个程序要放在中断中,不断扫描才行。

//???????????
#define key_down 0x80  //????
#define key_long 0x40         // ????
#define key_continue 0x20 //????
#define key_up 0x10                 // ???
                                          
void getkeyvalue(uint8 *pkeyvalue)
{
static uint8 keystate=0;
static uint8 timecount=0;
static uint8 lastkey=key_null;           //
uint8 keytemp=key_null;

keytemp=keyscan();

switch(keystate)
{
  case 0:
   {
    if (keytemp!=key_null)
          {
           keystate=1;
          }
         }
        break;

  case 1:                   //????
   {
    keystate=2;
   }
    break;

  case 2:
   {
           if (keytemp!=key_null)
         {
          lastkey=keytemp;  //??????
          keytemp=keytemp|key_down;
          keystate=3;
         }
        else
         {
          keystate=0;
         }
   }
  break;

  case 3:
   {
    if (keytemp!=key_null)                         //长按状态
         {
          if (++timecount>100)          //长按阀值  
           {
            timecount=0;
                keytemp=keytemp|key_long;
                keystate=4;
           }
         }
        else
         {
          keystate=5;
         }
   }
   break;

   case 4:
    {
         if(key_null !=(keytemp))
          {
           if (++timecount>80)                   //进入这个状态后,计数超过80就重新赋值一次
            {
                 timecount=0;
                 keytemp=keytemp|key_continue;
                }
          }
         else
          {
           keystate=5;
          }
        }
   break;

   case 5:              //释放状态
    {
         lastkey=lastkey|key_up;
         keytemp=lastkey;
         keystate=0;
        }
   break;

   default:break;
}

*pkeyvalue=keytemp;
}
     
发表于 2019-8-29 20:10:23 | 显示全部楼层
好,以后有机会试试看。谢谢
回复 支持 反对

使用道具 举报

     
发表于 2019-8-29 22:32:16 来自手机 | 显示全部楼层
本帖最后由 zaq 于 2019-8-29 22:36 编辑

按下和释放消抖是靠扫描频率来的。建议定时器进行++,20ms扫描一次为好。如果直接放入定时器中段或其他中断貌似会出问题。  case1是消抖步骤,其实就是配合扫描间隔做消抖的。   作为按键,这个程序不太严谨,建议搜一下:手把手教你单片机框架。这里的键盘程序值得借鉴,很严谨。有几章内容真心不错。可以看看
回复 支持 反对

使用道具 举报

     
发表于 2019-8-30 08:53:29 | 显示全部楼层
你这是单独按键的,我有个算法,基于时间序列的,可以实现N多个按键(比如标准键盘一百多个按键)的消抖、按键状态(通、断)、事件(按下、释放)、监测(长按:动态阈值)的提取。

连发不算按键的基本信息,是多阈值长按的一个应用而已。

代码需要一定的内存缓冲区,但执行速度极快,代码长度也比你这短很多。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-30 19:05:54 | 显示全部楼层
谢谢各位指点。
我正在学“手把手教你单片机”,就是有些笨,这个假期,看了三遍了,有些还是理解不透
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-1 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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