搜索
bottom↓
楼主: zhuhanliang

新型的按键扫描程序,仅三行程序

  [复制链接]

出0入0汤圆

发表于 2014-7-2 14:06:54 | 显示全部楼层
很早以前研究过这种算法,就是在人流量检测的情况下,用来去抖的。但是对高速按键,可能会出问题。

出0入0汤圆

发表于 2014-7-2 15:14:59 | 显示全部楼层
楼主的分享让我眼前一亮,十分感谢!

出0入0汤圆

发表于 2014-7-2 16:22:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-7-2 17:12:12 | 显示全部楼层
看起来很厉害啊

出0入10汤圆

发表于 2014-7-2 20:24:07 | 显示全部楼层
略懂,只是还是很麻烦,如果再封装下就好了,直接使用好像太底层了

出0入0汤圆

发表于 2014-7-3 03:19:48 | 显示全部楼层
新型的按键扫描程序,仅三行程序
很神奇

出0入0汤圆

发表于 2014-7-3 09:39:59 | 显示全部楼层
收藏,学习

出0入0汤圆

发表于 2014-7-3 11:48:10 | 显示全部楼层
共享出来,就是好样的,哪有这么多质疑的声音啊,真是的呵呵。。

出0入0汤圆

发表于 2014-7-3 12:00:25 | 显示全部楼层
谢谢,学习了。

出0入0汤圆

发表于 2014-7-4 09:17:11 | 显示全部楼层
还是状态机应用比较广泛,靠谱

出0入0汤圆

发表于 2014-7-8 18:59:20 | 显示全部楼层
好吧。。。。开始还以为是矩阵键盘的扫描呢,还纳闷说这么牛,三行就能搞定矩阵键盘、独立按键的检测。。。只能说这是一种方法、

出0入0汤圆

发表于 2014-7-8 22:55:59 | 显示全部楼层
标记以方便以后需要了

出0入0汤圆

发表于 2014-7-17 13:23:12 | 显示全部楼层
学习了。
不过wihle 内嵌一个 while 总觉得怪怪的。

出0入0汤圆

发表于 2014-7-17 13:52:39 | 显示全部楼层
好牛叉,学习了,这个一定要记下来

出0入0汤圆

发表于 2014-7-18 12:15:04 | 显示全部楼层
我这次项目里面的按键就用的这种处理方法,确实好用,我也是一个定时器加一个while循环来使用的

出0入0汤圆

发表于 2014-7-26 10:26:38 | 显示全部楼层
粗略地感受了一下语法的精妙

出0入0汤圆

发表于 2014-7-26 22:00:56 来自手机 | 显示全部楼层
学习了……

出0入0汤圆

发表于 2014-7-27 17:11:25 | 显示全部楼层
我感觉是不是抄我的?

出0入0汤圆

发表于 2014-7-27 17:13:22 | 显示全部楼层
贴以前的一个应用

  //-----------------数字滤波------------------------------------------  
  if(Tinput.itemp==Tinput.icmp)
  {
    Tinput.inow = Tinput.itemp;
  }
  else
  {
    Tinput.ixor = Tinput.itemp^Tinput.icmp;
    Tinput.inow = (Tinput.itemp&(~Tinput.ixor))|(Tinput.inow&Tinput.ixor);
    Tinput.icmp = Tinput.itemp;
  }

出0入0汤圆

发表于 2014-7-27 17:14:00 | 显示全部楼层
希望有人看得明

出0入0汤圆

发表于 2014-7-28 00:14:00 | 显示全部楼层
我后面把他改成汇编的一直在用~!不过我多加了一些消抖~!本人水平有限不知是不是不消抖也可以呢~!

出0入0汤圆

发表于 2014-7-28 00:16:36 | 显示全部楼层
本帖最后由 king19871004 于 2014-7-28 00:18 编辑

        mov        a,r_key1                ;ReadData=P?^0xff       
//        xor        a,#0xff               
        mov        ReadData,a
        ;-----------------------
        mov        a,ReadData                ;Trg=ReadData&(ReadData^Cont)
        xor        a,Cont
        and        a,ReadData
        mov        Trg,a
        ;-----------------------
        mov        a,ReadData                ;Cont=ReadData
        mov        Cont,a

这是汇编 这边只要改 //        xor        a,#0xff        这边就可以实现是要按下就有效还是 松开后才有效  就是要不要取反来得到你想要的效果 大家试一试就知道啦

出0入0汤圆

发表于 2014-7-29 21:08:40 | 显示全部楼层
恩感谢楼主分享,以后仔细研究下

出0入0汤圆

发表于 2014-7-29 22:22:21 | 显示全部楼层
mark先,以后再仔细看

出0入0汤圆

发表于 2014-7-31 00:20:59 | 显示全部楼层
做了个电路和这个功能一样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-7-31 09:04:57 | 显示全部楼层
mark,学习了

出0入0汤圆

发表于 2014-8-4 09:05:59 | 显示全部楼层

出0入0汤圆

发表于 2014-8-4 15:08:32 | 显示全部楼层
你好,看到你的  新型的按键扫描程序,仅三行程序   帖子,觉得挺不错的,有个问题,你的按键怎接的啊??

出0入0汤圆

发表于 2014-8-4 15:08:52 | 显示全部楼层
zxq6 发表于 2010-10-8 13:56
真的有那么神奇?

你好,看到你的  新型的按键扫描程序,仅三行程序   帖子,觉得挺不错的,有个问题,你的按键怎接的啊??

出0入0汤圆

发表于 2014-8-5 15:27:45 | 显示全部楼层
大概看了下,虽然不是特别的神奇,但是还是特别简洁实用的,简单点说就是通过这三行程序做出来两个全局变量,而这两个变量分别存储着按键的实时状态与瞬时状态:Cont就是存储着按键状态,每扫描一次按键Cont就更新一次状态,保持与按键按下的状态一致;而Trg则是存储着瞬时状态,每当检测到按键按下,Trg对应的位就跳变一下,在下次扫描执行该程序时就会立马恢复成初始值,除非再次检测到按键按下,否则不会再跳变;消抖部分就是通过定时轮询的方法了,这个大家都知道;这时候就很好办了,自己程序需要什么样的变量就直接调用什么变量即可,因为一般需要按键的状态无非就是两种情况:①检测到按了一下即可;②检测到按了多长时间才处理;

出0入0汤圆

发表于 2014-8-5 15:35:03 | 显示全部楼层
deadline2012 发表于 2014-7-31 00:20
做了个电路和这个功能一样

基本就是这样,本质上就是提取了两个变量,分别存储实时状态与瞬时状态,
        Trg:瞬时状态,检测到了一次按键按下,跳变一次恢复成初始值;
        Cont:实时状态,每次轮询后均与当时的按键状态相同;

出0入0汤圆

发表于 2014-8-5 17:05:21 | 显示全部楼层
顶楼主,真不错的讲解

出0入0汤圆

发表于 2014-8-8 15:42:07 | 显示全部楼层
认真的看了一次,还有一点和自己基础可能相关的困惑。多谢楼主

出0入0汤圆

发表于 2014-8-8 15:58:08 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2014-8-8 17:09:23 | 显示全部楼层
不错啊,先mark下

出0入0汤圆

发表于 2014-8-8 17:48:35 | 显示全部楼层
好贴就顶一下

出0入0汤圆

发表于 2014-8-8 20:41:14 | 显示全部楼层
这个NB,学习了

出0入0汤圆

发表于 2014-8-8 21:06:32 | 显示全部楼层
Mark,回头仔细研究一下

出0入0汤圆

发表于 2014-8-8 21:12:51 来自手机 | 显示全部楼层
先mark 谢谢分享

出0入0汤圆

发表于 2014-8-9 16:00:49 | 显示全部楼层
不错的帖子

出0入0汤圆

发表于 2014-8-9 22:29:17 | 显示全部楼层
  while(1)
         {
               if (Intrcnt>20)     // 一直在等,直到20ms时间到
              {
                    Intrcnt="0";
                    break;       // 返回主循环
              }
         }
要是只是这样的话那根直接delay20ms有什么区别呢

出0入0汤圆

发表于 2014-8-11 12:49:19 | 显示全部楼层
用这三行代码怎么实现4*4的矩阵按键呢

出0入0汤圆

发表于 2014-8-11 14:24:33 | 显示全部楼层
这个真心不错!!看一看!!

出0入0汤圆

发表于 2014-8-11 16:12:18 | 显示全部楼层
菜鸟级的看不懂

出0入0汤圆

发表于 2014-8-15 08:15:38 | 显示全部楼层
确实很神奇。

出0入0汤圆

发表于 2014-8-15 10:45:12 | 显示全部楼层
感觉只能算是一种比较简洁的方法而已

出0入0汤圆

发表于 2014-8-15 11:26:30 | 显示全部楼层
mark一下,待会细读啊

出0入0汤圆

发表于 2014-8-15 13:10:56 | 显示全部楼层
学下思路不错噢。。mark

出0入0汤圆

发表于 2014-8-15 22:37:48 | 显示全部楼层
XUE XI YXIA

出0入0汤圆

发表于 2014-8-15 23:58:50 | 显示全部楼层
貌似我的按钮很自然的就是这么做的。但我没意识到它很神奇。

出0入0汤圆

发表于 2014-8-24 18:21:00 | 显示全部楼层
不错,MARK,按键STM32

出0入0汤圆

发表于 2014-8-24 20:49:07 | 显示全部楼层
学习,谢谢分享!

出0入0汤圆

发表于 2014-8-26 15:38:42 | 显示全部楼层
来学习一下~

出0入0汤圆

发表于 2014-8-29 13:42:52 | 显示全部楼层
貌似每次在长按的时候都会先执行一次短按的操作   如何破解

出0入0汤圆

发表于 2014-8-29 13:44:43 | 显示全部楼层
dongfangxuri 发表于 2010-11-7 09:55
先顶上,但是,如果第一次就长按的话,会不会出现误判?第一次按键,不论长按或者短按,它都会按照短按来处 ...

你好   程序验证的确如你所说  不知有办法破解没

出0入0汤圆

发表于 2014-9-1 10:30:23 | 显示全部楼层
消抖的部分怎么没看到啊

出0入0汤圆

发表于 2014-9-1 11:36:36 | 显示全部楼层
学习了,厉害楼主

出0入0汤圆

发表于 2014-9-1 13:20:34 | 显示全部楼层
按键扫描,mark

出0入0汤圆

发表于 2014-9-1 14:16:44 | 显示全部楼层

出0入0汤圆

发表于 2014-9-5 10:03:05 | 显示全部楼层
netting 发表于 2014-7-27 17:14
希望有人看得明

表示看不懂,愿得其祥

出0入0汤圆

发表于 2014-9-5 16:53:23 | 显示全部楼层
楼主v5,真心不错

出0入0汤圆

发表于 2014-9-8 08:58:31 | 显示全部楼层
这个真的很漂亮……

出0入0汤圆

发表于 2014-9-8 12:26:28 | 显示全部楼层
挺牛的嘛!

出0入0汤圆

发表于 2014-9-8 14:04:56 | 显示全部楼层
楼主讲的挺好,20ms的时间也不算太短,没记错的话三菱PLC防抖延时好像默认是10ms。

出0入0汤圆

发表于 2014-9-8 15:54:24 | 显示全部楼层
好东西好东西好东西好东西

出0入0汤圆

发表于 2014-9-10 11:34:58 | 显示全部楼层
很不错,你这个办法很聪明,不过用起来比较费脑子。

出0入0汤圆

发表于 2014-9-12 13:22:18 | 显示全部楼层
顶,支持,谢了!

出0入0汤圆

发表于 2014-9-12 14:43:17 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2014-9-12 15:33:55 | 显示全部楼层
神奇的代码啊,太简洁也太强大了

出0入0汤圆

发表于 2014-9-13 15:36:46 | 显示全部楼层
不错,现在就是用的这个方案,顶一个

出0入0汤圆

发表于 2014-9-13 15:55:36 | 显示全部楼层
先收藏  后研究

出0入0汤圆

发表于 2014-9-13 15:55:58 | 显示全部楼层
谢谢楼主共享

出0入0汤圆

发表于 2014-9-13 16:06:35 | 显示全部楼层
完全是精髓啊

出0入0汤圆

发表于 2014-9-13 16:40:50 | 显示全部楼层
下次去试试!前几天写个1602的键盘操作,直接上了2k行,好烦。。。

出0入10汤圆

发表于 2014-9-13 17:51:58 | 显示全部楼层
研究研究

出0入0汤圆

发表于 2014-9-13 18:32:00 | 显示全部楼层
学习了                    

出0入0汤圆

发表于 2014-9-13 22:22:15 | 显示全部楼层
学习了                                 

出0入0汤圆

发表于 2014-9-14 09:11:45 | 显示全部楼层
这个贴实用性很强!

出0入0汤圆

发表于 2014-9-14 13:03:14 | 显示全部楼层
暂时没懂   先收藏下

出0入0汤圆

发表于 2014-9-14 14:24:19 | 显示全部楼层
很经典,感谢分享

出0入0汤圆

发表于 2014-9-14 14:31:45 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2014-9-20 01:24:29 | 显示全部楼层
好东西,必须留着

出0入0汤圆

发表于 2014-9-20 07:30:08 | 显示全部楼层
技巧很强

出0入0汤圆

发表于 2014-9-23 11:09:20 | 显示全部楼层
哎哟 不错哦 谢谢楼主分享

出0入0汤圆

发表于 2014-9-25 21:28:05 来自手机 | 显示全部楼层
谢谢现在一直用这种方法

出0入0汤圆

发表于 2014-9-25 22:38:23 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2014-9-26 00:59:17 来自手机 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2014-9-26 07:34:52 | 显示全部楼层
学习下高端的处理

出0入0汤圆

发表于 2014-9-26 14:12:12 | 显示全部楼层
cool,很赞

出0入0汤圆

发表于 2014-9-26 14:31:10 | 显示全部楼层
不怎么样样 感觉

出0入0汤圆

发表于 2014-9-26 23:03:41 | 显示全部楼层
哇塞,10年的帖子哎~~~

出0入0汤圆

发表于 2014-9-28 20:04:12 | 显示全部楼层
看一次学习一次。

出0入0汤圆

发表于 2014-10-8 09:41:44 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2014-10-8 16:00:17 | 显示全部楼层
想发表点意见,刚才在往STM32上移植的时候,出来些问题。第一,这程序一次只能检测单个按键; 第二, 在没有按键按下去的时候,比如端口B,应该是处于0xff的,就51来说, 那么一旦按下某个键,经过运算时可以得到究竟是哪一个按键被按下,比如PINB0,Trg那就是0x01,如果PB7按下的话,Trg 的值就应该为 0x80 。可是在STM32上面,比如GPIOB上面有一个按键,那我在没有按键按下去的时候,端口的值并不是0xffff啊,因为上面还挂了其他外设之类的。比如上面有个SPI设备,且处于正在使用中,它的片选CS一直都被拉低着,那我这个时候,再用这个函数估计就不行了吧。 想问问各位大神,这个问题怎么处理的,或者怎么移植到STM32上面的。

出0入0汤圆

发表于 2014-10-8 16:07:25 | 显示全部楼层
谢谢,我找个时间来验证下

出0入0汤圆

发表于 2014-10-8 16:07:42 | 显示全部楼层
谢谢,我找个时间来验证下

出0入0汤圆

发表于 2014-10-8 16:08:06 | 显示全部楼层
谢谢,我找个时间来验证下

出0入0汤圆

发表于 2014-10-8 16:17:54 | 显示全部楼层
留名

出0入0汤圆

发表于 2014-10-8 16:21:17 | 显示全部楼层
mark2014

出0入0汤圆

发表于 2014-10-8 16:48:42 | 显示全部楼层
这个看过咯
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 03:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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