搜索
bottom↓
楼主: zhuhanliang

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

  [复制链接]

出0入0汤圆

发表于 2012-4-19 20:56:39 | 显示全部楼层
学习了。高手。

出0入84汤圆

发表于 2012-4-19 21:32:07 | 显示全部楼层
不错 这个方法很好,比我目前用得好多了

出0入0汤圆

发表于 2012-4-19 22:01:51 | 显示全部楼层
top for you

出0入0汤圆

发表于 2012-4-19 22:35:42 | 显示全部楼层
不错

出0入0汤圆

发表于 2012-4-19 22:56:31 | 显示全部楼层
其实就是状态机思想。不过方法倒是真的不错。顶起!

出0入0汤圆

发表于 2012-4-20 10:53:52 | 显示全部楼层
看到能理解,自己需要的时候就又忘了,很是纠结~

出0入0汤圆

发表于 2012-4-22 22:43:54 | 显示全部楼层
顶!好贴,不过还没有尝试过。

出0入0汤圆

发表于 2012-4-23 09:09:52 | 显示全部楼层
标记一下,好好的理解一下

出0入0汤圆

发表于 2012-4-23 13:47:36 | 显示全部楼层
先收藏起来,后面仔细揣摩一下,感谢分享!

出0入0汤圆

发表于 2012-4-23 14:04:59 来自手机 | 显示全部楼层
MARK         
头像被屏蔽

出0入0汤圆

发表于 2012-4-24 19:40:59 | 显示全部楼层
神奇的算法,跟这个5个IO口实现25个按键一样神奇

出0入0汤圆

发表于 2012-4-24 20:14:22 | 显示全部楼层
改天仔细看看。

出0入0汤圆

发表于 2012-4-24 22:17:04 | 显示全部楼层
绝对精华,学习了

出0入0汤圆

发表于 2012-4-28 20:54:46 | 显示全部楼层
这个非常好

出0入0汤圆

发表于 2012-4-28 22:07:14 | 显示全部楼层
好东西得慢慢看

出0入0汤圆

发表于 2012-4-29 00:08:22 | 显示全部楼层
http://blog.chinaunix.net/u1/52089/

出0入0汤圆

发表于 2012-4-29 13:04:02 | 显示全部楼层
非常好,学习学习

出0入0汤圆

发表于 2012-4-30 00:16:04 | 显示全部楼层
学习了,第一次看过

出0入0汤圆

发表于 2012-4-30 11:45:09 | 显示全部楼层
有空试试效果!

出0入0汤圆

发表于 2012-4-30 11:47:50 | 显示全部楼层
有机会试一下

出0入0汤圆

发表于 2012-4-30 14:08:08 | 显示全部楼层
的确好思路!

出0入0汤圆

发表于 2012-4-30 22:14:51 | 显示全部楼层
记号!学习!

出0入0汤圆

发表于 2012-4-30 22:30:50 | 显示全部楼层
packer 发表于 2011-8-2 01:13
回复【481楼】ewindiy 疯沁
工业场合一个按键要读20到50次才能确认,这个方法用只能说是个人思维好,实际上 ...

这是个问题,关注。。。

出0入4汤圆

发表于 2012-5-1 14:48:31 | 显示全部楼层
mark            

出0入0汤圆

发表于 2012-5-1 14:48:33 | 显示全部楼层
本帖最后由 Kidult 于 2012-5-1 14:50 编辑

真是大神,我明白了怎么用软件实现按键扫描了。只是您的帖子中我有一个小问题:

      (3)       PB0按着不松(长按键)的情况
端口数据为0xfe,ReadData读端口并且取反是 0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是连续按下,所以Cont是上次的值,应为为0x01。那么这个式子就变成了 Trg = 0x01 & (0x01^0x01) = 0x00
Cont = ReadData = 0x01;
结果就是:
ReadData = 0x01;
Trg = 0x00;
Cont = 0x01;
因为现在按键是长按着,所以MCU会每个一定时间(20ms左右)不断的执行这个函数那么下次执行的时候情况会是怎么样的呢?
ReadData = 0x01;这个不会变,因为按键没有松开
Trg = ReadData & (ReadData ^ Cont) = 0x01 & (0x01 ^ 0x01) = 0 ,只要按键没有松开,这个Trg值永远为 0 !!!
Cont = 0x01;只要按键没有松开,这个值永远是0x01!!
不明白为什么MCU会每隔20ms执行这个函数?是自己每隔20ms调用它吧??不是自动执行吧?

出0入0汤圆

发表于 2012-5-1 21:26:14 | 显示全部楼层
确实是好东东,要好好消化。

出0入0汤圆

发表于 2012-5-4 21:37:39 | 显示全部楼层
受教了。。。。

出0入0汤圆

发表于 2012-5-4 22:41:02 | 显示全部楼层
先收藏,以后慢慢看,谢谢

出0入0汤圆

发表于 2012-5-5 09:09:41 | 显示全部楼层
LZ说的清晰明了,顶LZ

出0入0汤圆

发表于 2012-5-5 10:33:17 | 显示全部楼层
这个帖子是经久不衰啊

出0入16汤圆

发表于 2012-5-5 11:36:20 来自手机 | 显示全部楼层
应用挺不错

出0入0汤圆

发表于 2012-5-5 11:40:59 | 显示全部楼层
一直在用。。。很爽////

出0入0汤圆

发表于 2012-5-9 21:04:13 | 显示全部楼层
MARK....................

出0入0汤圆

发表于 2012-5-12 11:48:45 | 显示全部楼层
不错,一个按键扫描也可以用算法做得这么精练

出0入0汤圆

发表于 2012-5-13 13:55:24 | 显示全部楼层
能想到,确实难得

出0入0汤圆

发表于 2012-5-13 15:16:50 | 显示全部楼层
看不懂,,,

出0入0汤圆

发表于 2012-5-13 19:01:30 | 显示全部楼层
有空再看。先mark

出0入0汤圆

发表于 2012-5-13 19:33:50 来自手机 | 显示全部楼层
学习了,顶下!

出0入0汤圆

发表于 2012-5-13 19:37:26 | 显示全部楼层
mark,有机会了试试

出0入0汤圆

发表于 2012-5-19 10:54:14 | 显示全部楼层
我把这个算法用到了矩阵键盘上,效果还不错。
但是有一点我不太明白,我在keyscan()后面加了display(),通过判断Trg的值来到达显示键值的目的,但是我实际实验的时候,只要我移植按着键就一直显示对应键值。
  1. void  keyscan(void)
  2. {
  3.         uchar ReadData;uchar i;
  4.         for(i=0;i<4;i++)
  5.         {
  6.                 KeyPort= (0x10<<i)^0xff;
  7.                 ReadData=(KeyPort&0x0f)^0x0f;
  8.                 Trg=(ReadData&(ReadData^count))|((0x10<<i));
  9.                 count=ReadData;
  10.                 if((Trg&0x0f)!=0x00)       
  11.                         break;
  12.                
  13.         }
  14.        
  15. }
复制代码

出0入0汤圆

发表于 2012-5-19 11:00:06 | 显示全部楼层
这个算法的确挺神奇的,我想把他用到矩阵键盘中来,应为在现实的应用中矩阵键盘往往都是采用延时判键的,那么没扫描一行按键就要延时一次,一次20ms四行就会有近100ms,时间比较长。如果是在比较复杂的应用中100ms就会给其他程序带来响应时间的压力。光扫一个按键就占用了100ms,10%的时间在扫描键盘,这个花销有点大。

出0入0汤圆

发表于 2012-5-19 11:21:10 | 显示全部楼层
的确比较精简~

出0入0汤圆

发表于 2012-5-19 11:21:37 | 显示全部楼层
不错,学习了额

出0入0汤圆

发表于 2012-5-25 10:28:23 | 显示全部楼层
流程很经典!

出0入0汤圆

发表于 2012-5-25 11:10:19 | 显示全部楼层
精简,适用于单按键,有创新。

出0入0汤圆

发表于 2012-5-25 14:31:22 | 显示全部楼层
楼主这个程序的精髓就在 Trg = ReadData & (ReadData ^ Cont); 这一句上。 把当前状态与上一次检测的状态进行异或,得到一个上升沿信号。其实就是用异或代替了一些if 语句,精简了程序。我也一直在寻找一种方法来替代一大堆嵌套的if 语句,楼主这个思路很值得借鉴。楼主这个程序这么捕捉释放状态我还是没有想到唉。其实这个功能不一定要在最底层的案件扫描中完成,可以用普通的定时器式扫描进行消抖,得到稳定的输入之后再做逻辑判断

出0入0汤圆

发表于 2012-5-25 23:13:49 | 显示全部楼层
支持  双手赞成  这个更精点

出0入0汤圆

发表于 2012-5-28 13:30:05 | 显示全部楼层
mrf245 发表于 2010-12-3 23:39
我以前的按键扫描做法:
1:读端口状态
2:和TEMP(全局变量)比较,如果相等则表示没有按下或持续按下,退 ...

我以前也是这么做的

出0入0汤圆

发表于 2012-5-28 14:01:39 | 显示全部楼层
不错, MARK下

出0入0汤圆

发表于 2012-5-28 14:33:22 | 显示全部楼层
Kidult 发表于 2012-5-1 14:48
真是大神,我明白了怎么用软件实现按键扫描了。只是您的帖子中我有一个小问题:

      (3)       PB0按 ...

我觉得他每隔20ms去执行一次这个函数是为了消抖,其实他那个PINB是消抖处理后的数据就更方便理解些。个人观点。

出0入0汤圆

发表于 2012-5-29 10:52:44 | 显示全部楼层
顶了 好帖

出0入0汤圆

发表于 2012-5-29 13:07:47 | 显示全部楼层
zxq6 发表于 2010-10-8 13:56
真的有那么神奇?

真的很神奇!!

出0入0汤圆

发表于 2012-5-30 13:14:04 | 显示全部楼层
留名备用

出0入0汤圆

发表于 2012-6-2 14:23:19 | 显示全部楼层
受教了 厉害

出0入0汤圆

发表于 2012-6-7 16:29:30 | 显示全部楼层
Mark, 以后需要在学习!!

出0入0汤圆

发表于 2012-6-8 11:46:00 | 显示全部楼层
经典,mark

出0入0汤圆

发表于 2012-6-8 15:37:24 | 显示全部楼层
很好的思路,3q

出0入0汤圆

发表于 2012-6-13 16:17:51 | 显示全部楼层
标记一哈

出0入0汤圆

发表于 2012-6-13 16:51:38 | 显示全部楼层
后来者学习了

出0入0汤圆

发表于 2012-6-18 16:06:08 | 显示全部楼层
学习了谢谢

出0入0汤圆

发表于 2012-6-19 17:20:47 | 显示全部楼层
mark  marik

出0入0汤圆

发表于 2012-6-19 17:27:39 | 显示全部楼层
mark准备看

出0入0汤圆

发表于 2012-6-20 09:59:30 | 显示全部楼层
不错,学习了

出0入0汤圆

发表于 2012-6-20 21:46:01 | 显示全部楼层
收藏下。。。。

出0入0汤圆

发表于 2012-6-20 22:21:57 | 显示全部楼层
mark 好帖

出0入0汤圆

发表于 2012-6-21 11:46:24 | 显示全部楼层
好东东,收下了

出0入0汤圆

发表于 2012-6-21 12:13:48 | 显示全部楼层
hoo~~  这个帖子火了这么多年,才是神奇呢!好多年都没有用阵列键盘了占太多IO。思路是好,不过真正产品上大多是用AD的。

出0入0汤圆

发表于 2012-6-21 15:56:17 | 显示全部楼层
很不错的想法。。。

了解按键的状态变化。按键扫描不能处理。

感谢楼主的分享。。

出0入0汤圆

发表于 2012-6-22 08:19:08 | 显示全部楼层
谢谢,受教了

出0入0汤圆

发表于 2012-6-22 09:56:33 | 显示全部楼层
好东西,收藏了

出0入0汤圆

发表于 2012-6-22 10:08:46 | 显示全部楼层
回来仔细看

出0入0汤圆

发表于 2012-6-22 11:14:43 来自手机 | 显示全部楼层
学习学习,谢谢

出0入0汤圆

发表于 2012-6-26 18:04:57 | 显示全部楼层
mark!!回去有时间再仔细看看...

出0入0汤圆

发表于 2012-6-27 14:45:50 | 显示全部楼层
谢谢,标记

出0入0汤圆

发表于 2012-6-27 17:05:01 | 显示全部楼层
以前ARV时用过一次

出0入0汤圆

发表于 2012-6-30 19:14:32 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2012-7-2 10:40:11 | 显示全部楼层
lz这个应该不能用在矩阵键盘上把

出0入0汤圆

发表于 2012-7-2 10:57:11 | 显示全部楼层
看不懂,不过我的机顶盒天天都用前面,最近两年也都用扫描方式了,这样可以节约成本;我是做硬件的

出0入0汤圆

发表于 2012-7-3 19:11:05 | 显示全部楼层
好东西啊。。。

出0入0汤圆

发表于 2012-7-4 16:55:20 | 显示全部楼层
没看完,不过先顶吧

出0入0汤圆

发表于 2012-7-5 11:30:06 | 显示全部楼层
这个思路确实还不错~~~

出0入0汤圆

发表于 2012-7-10 15:39:06 | 显示全部楼层
mark,回头细读。。。

出0入0汤圆

发表于 2012-7-10 19:57:44 | 显示全部楼层
牛人啊

出0入0汤圆

发表于 2012-7-10 19:58:51 | 显示全部楼层
颠覆了我以前的按键扫描,同样是节拍法,这样跟爽,不过我一般是用汇编,受教

出0入0汤圆

发表于 2012-7-11 08:39:29 | 显示全部楼层
学习了  好东西

出0入0汤圆

发表于 2012-7-11 10:49:25 | 显示全部楼层
赞,还要细看一下,标记

出0入0汤圆

发表于 2012-7-16 11:40:12 | 显示全部楼层
细看了,很实用

出0入0汤圆

发表于 2012-7-16 11:48:54 | 显示全部楼层
!!

出0入0汤圆

发表于 2012-7-16 12:07:35 | 显示全部楼层
mark一下再细看

出0入0汤圆

发表于 2012-7-16 12:54:55 | 显示全部楼层
看看

出0入0汤圆

发表于 2012-7-16 14:09:24 | 显示全部楼层
Mark 回头细读

出0入0汤圆

发表于 2012-7-16 21:08:32 | 显示全部楼层
有空再仔细看看!!!

出0入0汤圆

发表于 2012-7-17 15:42:40 | 显示全部楼层
我一般不用这样的。

出0入0汤圆

发表于 2012-7-17 15:59:54 | 显示全部楼层
不就是把以前的值的比较,用异或代替了吗?

出0入0汤圆

发表于 2012-7-17 19:13:11 | 显示全部楼层
mark.很有用处,学习了

出0入54汤圆

发表于 2012-7-17 19:28:23 | 显示全部楼层
标记下 等下看啊

出0入0汤圆

发表于 2012-7-17 21:11:59 | 显示全部楼层
解释很详细,辛苦了

出0入0汤圆

发表于 2012-7-17 21:42:03 | 显示全部楼层
读后,受益匪浅!!顶~~

出0入0汤圆

发表于 2012-7-17 23:48:15 | 显示全部楼层
思维与算法的神奇,,,顶

出0入0汤圆

发表于 2012-7-18 19:47:03 | 显示全部楼层
好贴,收藏!~~~~这让我想起了以前做数学题目,我绕了一大圈才解题,老师只用了几个步骤!~~精彩!~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-18 20:16

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

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