amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
楼主: zhuhanliang

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

  [复制链接]
(284427978)

打赏出0元收入0元

发表于 2011-7-4 19:20:42 | 显示全部楼层
好东西,做个标记先……
(284427561)

打赏出0元收入0元

发表于 2011-7-4 19:27:39 | 显示全部楼层
这个算法简单实用。
(284424790)

打赏出0元收入0元

发表于 2011-7-4 20:13:50 | 显示全部楼层
mark
(284424098)

打赏出0元收入0元

发表于 2011-7-4 20:25:22 | 显示全部楼层
好贴一定要顶啊
(284421644)

打赏出0元收入0元

发表于 2011-7-4 21:06:16 | 显示全部楼层
(284421198)

打赏出0元收入0元

发表于 2011-7-4 21:13:42 | 显示全部楼层
mark
(284419560)

打赏出0元收入0元

发表于 2011-7-4 21:41:00 | 显示全部楼层
不错
(284417844)

打赏出0元收入0元

发表于 2011-7-4 22:09:36 | 显示全部楼层
mark,但是消抖有点取巧,不是每个人按键盘时停留的时间都是一样的,以前用的就是这种方式,现在不用了。
(284376405)

打赏出0元收入0元

发表于 2011-7-5 09:40:15 | 显示全部楼层
mark
(284373992)

打赏出0元收入0元

发表于 2011-7-5 10:20:28 | 显示全部楼层
强大。。Mark==
(284372930)

打赏出0元收入0元

发表于 2011-7-5 10:38:10 | 显示全部楼层
看看
(284371470)

打赏出0元收入0元

发表于 2011-7-5 11:02:30 | 显示全部楼层
dddddddddd
(284367869)

打赏出0元收入0元

发表于 2011-7-5 12:02:31 | 显示全部楼层
挺好的,记一下
(284363962)

打赏出0元收入0元

发表于 2011-7-5 13:07:38 | 显示全部楼层
you shijianshishi
(284360780)

打赏出0元收入0元

发表于 2011-7-5 14:00:40 | 显示全部楼层
<font color=yellow>强悍啊!!
(284360012)

打赏出0元收入0元

发表于 2011-7-5 14:13:28 | 显示全部楼层
MARK
(284332410)

打赏出0元收入0元

发表于 2011-7-5 21:53:30 | 显示全部楼层
(284329261)

打赏出0元收入0元

发表于 2011-7-5 22:45:59 | 显示全部楼层
mark
(284289706)

打赏出0元收入0元

发表于 2011-7-6 09:45:14 | 显示全部楼层
好思路,学习
(284287378)

打赏出0元收入0元

发表于 2011-7-6 10:24:02 | 显示全部楼层
感觉 扫描函数 写到中断中比较好,定时20~50ms扫描一次,你主函数中延时20ms,也挺浪费时间的
volatile unsigned char Intrcnt;
void InterruptHandle()    // 中断服务程序
{
       Intrcnt++;          // 1ms 中断1次,可变
       if(Intrcnt>50)     // 50ms
       {
         KeyRead();              
         KeyProc();
         Intrcnt=0;
       }
}
(284067493)

打赏出0元收入0元

发表于 2011-7-8 23:28:47 | 显示全部楼层
收藏了
(284064524)

打赏出0元收入0元

发表于 2011-7-9 00:18:16 | 显示全部楼层
mark
(284043039)

打赏出0元收入0元

发表于 2011-7-9 06:16:21 | 显示全部楼层
还可以吧.........
(284034887)

打赏出0元收入0元

发表于 2011-7-9 08:32:13 | 显示全部楼层
mark
(284027000)

打赏出0元收入0元

发表于 2011-7-9 10:43:40 | 显示全部楼层
对菜鸟来说 帮助很大,感谢楼主的辛勤劳动。顶~~~~
(284025845)

打赏出0元收入0元

发表于 2011-7-9 11:02:55 | 显示全部楼层
mark
(284023348)

打赏出0元收入0元

发表于 2011-7-9 11:44:32 | 显示全部楼层
很老的方法了,最初看到这个还挺稀奇,真正用的时候才知道“坑爹”

动用定时器延时消抖,我多长的代码和你的跑起来速度没差别,单片机都是用兆来算主频的..

你两行扫描 我100行扫描 我的代码能比你的多几百个字节?浪费与不浪费之间没有差别 程序存储器用KB做单位的。,你把扫描写好了,我按键模块早就做完了。

你占用一组io口,我哪给你弄这么多去?,你可以试着把他和3个io口扫描21个按键的程序组合起来,这样我还敢用

最蛋疼的是,你知道吗?我还得写一个函数帮这个函数将键值转化,,怎么也得转化成1.2.3.4.。。吧 我还得弄一堆switch case ...

其实,时间最重要,运用上面的方法,无非是省了几个字节的ram 几百字节的rom 几十条指令的周期。


本回复仅仅是说该方式弊端,无人身攻击之意
(283940086)

打赏出0元收入0元

发表于 2011-7-10 10:52:14 | 显示全部楼层
学习学习
(283937460)

打赏出0元收入0元

发表于 2011-7-10 11:36:00 | 显示全部楼层
mark
(283936943)

打赏出0元收入0元

发表于 2011-7-10 11:44:37 | 显示全部楼层
mark
(283835582)

打赏出0元收入0元

发表于 2011-7-11 15:53:58 | 显示全部楼层
回复【435楼】electron_love
-----------------------------------------------------------------------

不懂就别瞎评论,那只能证明你很无知
(283041299)

打赏出0元收入0元

发表于 2011-7-20 20:32:01 | 显示全部楼层
mark一下
头像被屏蔽
(283040631)

打赏出0元收入0元

发表于 2011-7-20 20:43:09 | 显示全部楼层
记号,回头再看
(282827236)

打赏出0元收入0元

发表于 2011-7-23 07:59:44 | 显示全部楼层
MAKE
(282826474)

打赏出0元收入0元

发表于 2011-7-23 08:12:26 | 显示全部楼层
mark
(282824205)

打赏出0元收入0元

发表于 2011-7-23 08:50:15 | 显示全部楼层
mark,以后一定用得着,呵呵~
(282807582)

打赏出0元收入0元

发表于 2011-7-23 13:27:18 | 显示全部楼层
几号
(282805090)

打赏出0元收入0元

发表于 2011-7-23 14:08:50 | 显示全部楼层
MARK
(282792877)

打赏出0元收入0元

发表于 2011-7-23 17:32:23 | 显示全部楼层
豁然开朗!!受教了.
(282709678)

打赏出0元收入0元

发表于 2011-7-24 16:39:02 | 显示全部楼层
顶一个,思路蛮好的~~~
(282688071)

打赏出0元收入0元

发表于 2011-7-24 22:39:09 | 显示全部楼层
确实是个好思路,不错
(282686763)

打赏出0元收入0元

发表于 2011-7-24 23:00:57 | 显示全部楼层
mark
(282686356)

打赏出0元收入0元

发表于 2011-7-24 23:07:44 | 显示全部楼层
用到了 再回来看 先MAKE
(282684543)

打赏出0元收入0元

发表于 2011-7-24 23:37:57 | 显示全部楼层
MAKE
(282679800)

打赏出0元收入0元

发表于 2011-7-25 00:57:00 | 显示全部楼层
呵呵,好的算法,学习了哦!呵呵
(282653457)

打赏出0元收入0元

发表于 2011-7-25 08:16:03 | 显示全部楼层
标记下   学习
(282650856)

打赏出0元收入0元

发表于 2011-7-25 08:59:24 | 显示全部楼层
这种算法的话,如果需要检测按键长短按的话,需要用到定时器的把~~
(282631206)

打赏出0元收入0元

发表于 2011-7-25 14:26:54 | 显示全部楼层
状态       (1)  (2)  (3)  (4)
   KReadData   0    1    1    0
   KTrg               0    1         0    0
   KCont       0    1         1    0

这那算作有去抖动能力, 用在输出响声问题不大,用在计钱/计产量则肯定会报大数;问题是开关有时接触不良会计多了次。
去抖动应该连续的2次相同则才能认为有效。 使用 CC5X 内的状态机例子程序来处理按键比较准确。
(282624334)

打赏出0元收入0元

发表于 2011-7-25 16:21:26 | 显示全部楼层
学习了
(282554725)

打赏出0元收入0元

发表于 2011-7-26 11:41:35 | 显示全部楼层
mark
(282552873)

打赏出0元收入0元

发表于 2011-7-26 12:12:27 | 显示全部楼层
很不错的资料,受益匪浅
(282543220)

打赏出0元收入0元

发表于 2011-7-26 14:53:20 | 显示全部楼层
mark
(282541355)

打赏出0元收入0元

发表于 2011-7-26 15:24:25 | 显示全部楼层
MARK
(282219099)

打赏出0元收入0元

发表于 2011-7-30 08:55:21 | 显示全部楼层
对于C语言,我是幼儿园,以后有用。
(282215347)

打赏出0元收入0元

发表于 2011-7-30 09:57:53 | 显示全部楼层
备忘,细读
(282211976)

打赏出0元收入0元

发表于 2011-7-30 10:54:04 | 显示全部楼层
mark
(282203823)

打赏出0元收入0元

发表于 2011-7-30 13:09:57 | 显示全部楼层
mark
(282202733)

打赏出0元收入0元

发表于 2011-7-30 13:28:07 | 显示全部楼层
mark
(282195978)

打赏出0元收入0元

发表于 2011-7-30 15:20:42 | 显示全部楼层
mark
(282169989)

打赏出0元收入0元

发表于 2011-7-30 22:33:51 | 显示全部楼层
mark
(282039887)

打赏出0元收入0元

发表于 2011-8-1 10:42:13 | 显示全部楼层
mark
(282028191)

打赏出0元收入0元

发表于 2011-8-1 13:57:09 | 显示全部楼层
嗷……还是得把译码啥的
(281999014)

打赏出0元收入0元

发表于 2011-8-1 22:03:26 | 显示全部楼层
工业场合一个按键要读20到50次才能确认,这个方法用只能说是个人思维好,实际上用处不大
(281992053)

打赏出0元收入0元

发表于 2011-8-1 23:59:27 | 显示全部楼层
mark
(281987633)

打赏出0元收入0元

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

同意,给新手练练思维是好的,离实际应用还远着呢。
另外,双键就不能实现。同时按下2个键,人手不可能做到完全同时,一般会先按下1个键,然后才是2个键
那么过程为
ReadData=0x01,Trig=0x01,Cont=0x01
ReadData=0x11,Trig=0x11&(0x11^0x01)=0x11&0x10=0x10,Cont=0x11
ReadData=0x11,Trig=0x11&(0x11^0x11)=0x11&0x00=0x00,Cont=0x11
....
trig将不能被置1
(281982378)

打赏出0元收入0元

发表于 2011-8-2 02:40:42 | 显示全部楼层
改天试下瞧瞧.
(281939650)

打赏出0元收入0元

发表于 2011-8-2 14:32:50 | 显示全部楼层
mark
(281937238)

打赏出0元收入0元

发表于 2011-8-2 15:13:02 | 显示全部楼层
详细阅读一下。
(281934887)

打赏出0元收入0元

发表于 2011-8-2 15:52:13 | 显示全部楼层
回复【265楼】infree
这个扫描方法和电话程控交换机的用户摘挂机的扫描算法很相像,估计是从那方面演变而来的。
那个算法简单说明如下:
设挂机输入为"1", 摘机输入为"0",使用c的位运算符;
变化识别= ( ~(本次 xor 前次 ) ) &amp; (前次 xor 前前次)  
摘机识别= 变化识别 &amp; (~这次)                       //可以作为按键释放识别
挂机识别=变化识别 &amp; 这次                            //可以作为按键按下识别
我自己使用的也是这种扫描方法,不过又增加了按键按下计时和按键释放延时(某个键被解出码后可以先屏蔽一段时间的按键输入),以及长按的连加连减功能。
-----------------------------------------------------------------------

上贴有些地方还是可以借鉴和优化:

unsigned char A,B,C;
void KeyProc(void)
{
   B = A;       //B记录前一次的A
   A = get();   //A获得新内容

   B = B ^ A;                  //本次和前次异或,B记录跳变。
   C = C & B;                  //若本次跳变,则保持C
   C = (~B & A) | C;           //若本次非跳变,则保存输入A;或者,若本次跳变,则保持C。
                               //即:记录平稳信号,前后两次不平稳,则C保持不变。
}
(281933352)

打赏出0元收入0元

发表于 2011-8-2 16:17:48 | 显示全部楼层
不错的思想
(281925975)

打赏出0元收入0元

发表于 2011-8-2 18:20:45 | 显示全部楼层
一是没有必要的简单,二是因为简单而引来灾难性的后果。

按键的程序从来不敢做简单,程序移植就看C的功底啦。。。
(281922804)

打赏出0元收入0元

发表于 2011-8-2 19:13:36 | 显示全部楼层
好东西
(281909426)

打赏出0元收入0元

发表于 2011-8-2 22:56:34 | 显示全部楼层
记号
(281873629)

打赏出0元收入0元

发表于 2011-8-3 08:53:11 | 显示全部楼层
思路不错,值得研究和借鉴.顶了!!!
(281844605)

打赏出0元收入0元

发表于 2011-8-3 16:56:55 | 显示全部楼层
不 错!!!!
(281844319)

打赏出0元收入0元

发表于 2011-8-3 17:01:41 | 显示全部楼层
听LZ的讲解好像很好用,实际用过以后才能给正确的评价,先MARK一下!
(281786189)

打赏出0元收入0元

发表于 2011-8-4 09:10:31 | 显示全部楼层
以后慢慢研究下,mark。感谢楼主
(281785338)

打赏出0元收入0元

发表于 2011-8-4 09:24:42 | 显示全部楼层
正在搞按键,希望能好用,先谢谢楼主了
(281775294)

打赏出0元收入0元

发表于 2011-8-4 12:12:06 | 显示全部楼层
mark
(281773565)

打赏出0元收入0元

发表于 2011-8-4 12:40:55 | 显示全部楼层
mark
(281767163)

打赏出0元收入0元

发表于 2011-8-4 14:27:37 | 显示全部楼层
学习了
(281765274)

打赏出0元收入0元

发表于 2011-8-4 14:59:06 | 显示全部楼层
确时是个好思路,有空试试
(281761883)

打赏出0元收入0元

发表于 2011-8-4 15:55:37 | 显示全部楼层
学习了
(281761666)

打赏出0元收入0元

发表于 2011-8-4 15:59:14 | 显示全部楼层
我没看懂,有空再看看.
(281758827)

打赏出0元收入0元

发表于 2011-8-4 16:46:33 | 显示全部楼层
呵呵,楼主错了(没有发现这种按键处理办法的踪迹),这个我们上课就是教这样子的思路了。呵呵!不过我们还做了抖动的处理
(281758740)

打赏出0元收入0元

发表于 2011-8-4 16:48:00 | 显示全部楼层
回复【24楼】mashan75  
-----------------------------------------------------------------------

完全可以用在矩阵键盘上
(281754953)

打赏出0元收入0元

发表于 2011-8-4 17:51:07 | 显示全部楼层
核心算法:
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
    unsigned char ReadData = PINB^0xff;   // 1
    Trg = ReadData & (ReadData ^ Cont);      // 2
    Cont = ReadData;                                // 3
}

必须顶起,确实受教了!
楼主挺厉害的,刚开始看的时候我还担心呢,怎么没有消抖处理?再往下看楼主已经贴出来了,佩服!img src=./emotion/em024.gif>

但是我想说一下不同的做法,我个人觉得消抖时间应该是确定的,放到主程序里面,毕竟每个人的项目大小不同,这样主程序大循环的轮训时间也不确定,这样的话20MS指示大约的做法,我个人还是偏好用定时器中断做,这样,不论程序构架怎么样变化,消抖的时间多少毫秒,都是自己确定了的。可控性比较强也不用占主程序轮训时间。如果程序中有大量的运算的话,用定时器中断消抖的好处就会显现出来了。
void InterruptHandle()    // 中断服务程序
{
       Intrcnt++;          // 1ms 中断1次,可变
      if(Intrcnt>20)//20ms消抖,可变
      {
        KeyRead();
      }
}
(281680699)

打赏出0元收入0元

发表于 2011-8-5 14:28:41 | 显示全部楼层
mark 按键处理
(281679329)

打赏出0元收入0元

发表于 2011-8-5 14:51:31 | 显示全部楼层
查询法也可以同样实现,我都是用的查询法,也没有发现什么郁闷的。很轻松就搞定开关了。
(281679114)

打赏出0元收入0元

发表于 2011-8-5 14:55:06 | 显示全部楼层
mark  有用的时候回来看下
(281669925)

打赏出0元收入0元

发表于 2011-8-5 17:28:15 | 显示全部楼层
算法比较好,只是实用性有很大局限性
(281657991)

打赏出0元收入0元

发表于 2011-8-5 20:47:09 | 显示全部楼层
用5ms扫描的路过....弱弱的
(281593011)

打赏出0元收入0元

发表于 2011-8-6 14:50:09 | 显示全部楼层
mark
(281558541)

打赏出0元收入0元

发表于 2011-8-7 00:24:39 | 显示全部楼层
mark
(281496264)

打赏出0元收入0元

发表于 2011-8-7 17:42:36 | 显示全部楼层
mark
(281491563)

打赏出0元收入0元

发表于 2011-8-7 19:00:57 | 显示全部楼层
回复【楼主位】zhuhanliang  
-----------------------------------------------------------------------

猛一看 我还以为是矩阵键盘的扫描程序只需要三行
(281419768)

打赏出0元收入0元

发表于 2011-8-8 14:57:32 | 显示全部楼层
受用了... 感谢LZ
(281413467)

打赏出0元收入0元

发表于 2011-8-8 16:42:33 | 显示全部楼层
mark
(281241026)

打赏出0元收入0元

发表于 2011-8-10 16:36:34 | 显示全部楼层
连续按,一直用扫描法,时器判断
(281208544)

打赏出0元收入0元

发表于 2011-8-11 01:37:56 | 显示全部楼层
先记号个
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-8 19:07

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

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