amobbs.com 阿莫电子论坛

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

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

  [复制链接]
(303865961)

打赏出0元收入0元

发表于 2010-11-21 18:43:37 | 显示全部楼层
思路好,不知是怎么想出来的。
(303858933)

打赏出0元收入0元

发表于 2010-11-21 20:40:45 | 显示全部楼层
留个记号
(303857486)

打赏出0元收入0元

发表于 2010-11-21 21:04:52 | 显示全部楼层
mark
(303852270)

打赏出0元收入0元

发表于 2010-11-21 22:31:48 | 显示全部楼层
mark
(303849896)

打赏出0元收入0元

发表于 2010-11-21 23:11:22 | 显示全部楼层
mark
(303845751)

打赏出0元收入0元

发表于 2010-11-22 00:20:27 | 显示全部楼层
很好,很强大
(303009430)

打赏出0元收入0元

发表于 2010-12-1 16:39:08 | 显示全部楼层
这个厉害
(303008549)

打赏出0元收入0元

发表于 2010-12-1 16:53:49 | 显示全部楼层
呵呵!我有个仅一行的按键扫描程序,用移位完成的,用在要求不是很高的场合很合适,还能分辨按下和抬起!:)
(303008039)

打赏出0元收入0元

发表于 2010-12-1 17:02:19 | 显示全部楼层
做个记号
(303007276)

打赏出0元收入0元

发表于 2010-12-1 17:15:02 | 显示全部楼层
mark一下,好好学习。
(303006109)

打赏出0元收入0元

发表于 2010-12-1 17:34:29 | 显示全部楼层
mark
(303000842)

打赏出0元收入0元

发表于 2010-12-1 19:02:16 | 显示全部楼层
留下手印,慢慢再看!
(302898309)

打赏出0元收入0元

发表于 2010-12-2 23:31:09 | 显示全部楼层
while(1)
        {

        KeyRead();             // 将每个子程序都扫描一遍
        KeyProc();
        Func1();
        Funt2();

              if (Intrcnt>20)     // 一直在等,直到20ms时间到
              {
                   Intrcnt="0";
                   break;       // 返回主循环
              }
        }

就在这里空等跟delay()有区别吗?
void main(void)
{
       SysInit();
    while(1)           // 每20ms 执行一次大循环
    {
        KeyRead();             // 将每个子程序都扫描一遍
        KeyProc();
        Func1();
        Funt2();
        …
        …
        delay();
       }
}
前者只不过时间更精确而已。
(302812027)

打赏出0元收入0元

发表于 2010-12-3 23:29:11 | 显示全部楼层
的确很有意思,mark下来,对比我的大量if else真是惭愧啊。
(302811436)

打赏出0元收入0元

发表于 2010-12-3 23:39:02 | 显示全部楼层
我以前的按键扫描做法:
1:读端口状态
2:和TEMP(全局变量)比较,如果相等则表示没有按下或持续按下,退出;如果不相等就往下
3:把端口数据送入键码缓存
4:吧端口数据送入TEMP
5:结束。
(302725057)

打赏出0元收入0元

发表于 2010-12-4 23:38:41 | 显示全部楼层
Mark
记号一下,慢慢学习。
(302042207)

打赏出0元收入0元

发表于 2010-12-12 21:19:31 | 显示全部楼层
马克。果然很奇妙!!
(302004084)

打赏出0元收入0元

发表于 2010-12-13 07:54:54 | 显示全部楼层
MARK
(302001733)

打赏出0元收入0元

发表于 2010-12-13 08:34:05 | 显示全部楼层
mark
(302000751)

打赏出0元收入0元

发表于 2010-12-13 08:50:27 | 显示全部楼层
思想不错。比那些用if去处理的好的多。

unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
    unsigned char ReadData = PINB^0xff;   
    Trg = ReadData & (ReadData ^ Cont);      
    Cont = ReadData;                                 
}

这里的unsigned char Cont起名叫unsigned char Hold更好一些吧。
(302000668)

打赏出0元收入0元

发表于 2010-12-13 08:51:50 | 显示全部楼层
不能处理多个按键。。。其实程序还是仔细写,除非在要求比较低和存储器不够 用的情况下。。
(301998739)

打赏出0元收入0元

发表于 2010-12-13 09:23:59 | 显示全部楼层
MARK
(301978445)

打赏出0元收入0元

发表于 2010-12-13 15:02:13 | 显示全部楼层
回复【楼主位】zhuhanliang
也看过不少源程序了,没有发现这种按键处理办法的踪迹,
-----------------------------------------------------------------------
lz的钻研精神可嘉哈!

其实在很多做来换米饭的实际应用里,其中常有(如两键电子钟表为例)至少一个键,是点击(结束时)就确认执行一个常规操作,而长按到特定延时后则进入调节状态,当中就必定要包藏有lz所描述的处理程序。
(301977791)

打赏出0元收入0元

发表于 2010-12-13 15:13:07 | 显示全部楼层
mark!!!
(301974933)

打赏出0元收入0元

发表于 2010-12-13 16:00:45 | 显示全部楼层
讲到键盘的刁钻设计,~_~ 话说十多年前偶曾检修过一只俄国佬的电控装置,面板有7个按键而背板是3路独立(估计是调光器般的)输出,解剖开后我就震惊鸟!……内里控制核心就一只8脚IC(MCU)?!其中有2个脚是电源,3个脚驱动3只双向硅,1个脚是过零无疑,1个脚是阻容振荡,最后一个脚就是连接7个按键及其阻容阵列滴!!

当时就是换鸟1只短路掉的双向硅就好啦。匆匆按物主指点接上3个60W灯泡测试,2个+/-按键x3组出来的确实是有调光效果,第7个按键是总的带保持记忆性的软开关,当然还有个拨杆电源开关,再上电后会为软关停,而且导致保持的记忆归中位大概。

图纸是当然有抄画下的,但也当然早已经丢了,对那按键及其阻容阵列的印象就是玩具电子琴样的。

……热切期待有牛人能 解究 重现 神奇 !!!
(301971586)

打赏出0元收入0元

发表于 2010-12-13 16:56:32 | 显示全部楼层
呃。。。接上补充一下:还记得那7个按键,是随意同时按动几个键都只会有一个生效,而且貌似有优先级的排序,7号总软开关按键是最高级最能抢键权的。

……热切期待有牛人能 解究 重现 神奇 !!!


快下班了哈。
(301971210)

打赏出0元收入0元

发表于 2010-12-13 17:02:48 | 显示全部楼层
MARK!!
(301970515)

打赏出0元收入0元

发表于 2010-12-13 17:14:23 | 显示全部楼层
mark!!!
(301970427)

打赏出0元收入0元

发表于 2010-12-13 17:15:51 | 显示全部楼层
好想法,MARK!
(301957171)

打赏出0元收入0元

发表于 2010-12-13 20:56:47 | 显示全部楼层
按键mark
(301957023)

打赏出0元收入0元

发表于 2010-12-13 20:59:15 | 显示全部楼层
一点用也没有。
(301956339)

打赏出0元收入0元

发表于 2010-12-13 21:10:39 | 显示全部楼层
PA_TEM1 = PA_TEM0;
PA_TEM0 = PINA;
PA = PA_TEM0 & PA_TEM1;
(301912889)

打赏出0元收入0元

发表于 2010-12-14 09:14:49 | 显示全部楼层
226楼说的东西会不会是用模拟测量的方法?
(301912760)

打赏出0元收入0元

发表于 2010-12-14 09:16:58 | 显示全部楼层
Mark
记号一下,慢慢学习。
(301907975)

打赏出0元收入0元

发表于 2010-12-14 10:36:43 | 显示全部楼层
mark
(301907588)

打赏出0元收入0元

发表于 2010-12-14 10:43:10 | 显示全部楼层
除了语句精炼之外, 效果比拼,才是看点
(301906359)

打赏出0元收入0元

发表于 2010-12-14 11:03:39 | 显示全部楼层
Mark
(301906279)

打赏出0元收入0元

发表于 2010-12-14 11:04:59 | 显示全部楼层
mark
(301905078)

打赏出0元收入0元

发表于 2010-12-14 11:25:00 | 显示全部楼层
拓宽思路。好帖
(301903294)

打赏出0元收入0元

发表于 2010-12-14 11:54:44 | 显示全部楼层
mark
(301899471)

打赏出0元收入0元

发表于 2010-12-14 12:58:27 | 显示全部楼层
mark
(301887211)

打赏出0元收入0元

发表于 2010-12-14 16:22:47 | 显示全部楼层
mark
(301884536)

打赏出0元收入0元

发表于 2010-12-14 17:07:22 | 显示全部楼层
标记学习
(301719910)

打赏出0元收入0元

发表于 2010-12-16 14:51:08 | 显示全部楼层
思路好,学习
(301717970)

打赏出0元收入0元

发表于 2010-12-16 15:23:28 | 显示全部楼层
在项目中应用,感谢LZ和原创者,不收版权费吧..
(301715756)

打赏出0元收入0元

发表于 2010-12-16 16:00:22 | 显示全部楼层
好贴,很受启发
(301714652)

打赏出0元收入0元

发表于 2010-12-16 16:18:46 | 显示全部楼层
好贴,很受启发
(301714415)

打赏出0元收入0元

发表于 2010-12-16 16:22:43 | 显示全部楼层
感觉没什么神奇的
(301713908)

打赏出0元收入0元

发表于 2010-12-16 16:31:10 | 显示全部楼层
可以的
(301713409)

打赏出0元收入0元

发表于 2010-12-16 16:39:29 | 显示全部楼层
听上去不错,回头试试
(301712395)

打赏出0元收入0元

发表于 2010-12-16 16:56:23 | 显示全部楼层
简洁,菜鸟学习了!
(301533070)

打赏出0元收入0元

发表于 2010-12-18 18:45:08 | 显示全部楼层
标记一下
(301530608)

打赏出0元收入0元

发表于 2010-12-18 19:26:10 | 显示全部楼层
学习了
(301396558)

打赏出0元收入0元

发表于 2010-12-20 08:40:20 | 显示全部楼层
学习,
(301301119)

打赏出0元收入0元

发表于 2010-12-21 11:10:59 | 显示全部楼层
回复【226楼】et502
-----------------------------------------------------------------------
你这个所说的大概就是AD做按键扫描了,我用的是STC单片机,其中的数据手册有类似与你说的用法
(301297066)

打赏出0元收入0元

发表于 2010-12-21 12:18:32 | 显示全部楼层
mark,后头细看
(301218531)

打赏出0元收入0元

发表于 2010-12-22 10:07:27 | 显示全部楼层
mark~
(301195904)

打赏出0元收入0元

发表于 2010-12-22 16:24:34 | 显示全部楼层
mark
(301127188)

打赏出0元收入0元

发表于 2010-12-23 11:29:50 | 显示全部楼层
有意思
(301081080)

打赏出0元收入0元

发表于 2010-12-24 00:18:18 | 显示全部楼层
我也留个记号
(301025378)

打赏出0元收入0元

发表于 2010-12-24 15:46:40 | 显示全部楼层
mark
(301024588)

打赏出0元收入0元

发表于 2010-12-24 15:59:50 | 显示全部楼层
学习一下
(301023369)

打赏出0元收入0元

发表于 2010-12-24 16:20:09 | 显示全部楼层
我一般不用这种. 按键20MS祛抖动虽然是起到祛抖动作用,但是还是太灵敏,我一直实用100MS采样,25MS采样一次一共4次作为按键按下处理.笔者的思路是好的.但是在实际使用中还是有一些不便. 汇编后的代码可能会比一般的长一点点.
(301022871)

打赏出0元收入0元

发表于 2010-12-24 16:28:27 | 显示全部楼层
这个扫描方法和电话程控交换机的用户摘挂机的扫描算法很相像,估计是从那方面演变而来的。
那个算法简单说明如下:
设挂机输入为"1", 摘机输入为"0",使用C的位运算符;

变化识别= ( ~(本次 xor 前次 ) ) & (前次 xor 前前次)
摘机识别= 变化识别 & (~这次)                       //可以作为按键释放识别
挂机识别=变化识别 & 这次                            //可以作为按键按下识别


我自己使用的也是这种扫描方法,不过又增加了按键按下计时和按键释放延时(某个键被解出码后可以先屏蔽一段时间的按键输入),以及长按的连加连减功能。
(300906446)

打赏出0元收入0元

发表于 2010-12-26 00:48:52 | 显示全部楼层
很受启发啊~~谢谢楼主分享了。。 不过我还有几个疑问,不是关于按键扫描的的,是关于你后面说的去抖的,首先我想问一下,你 KeyProc(); 这个函数是不是保存了上次按键读取值,然后和本次读取值作对比,以达到去抖目的?然后是你说的去抖延时不要用delay()这个死循环,我看你用的是定时器中断记时20ms,不过程序中还是在死循环中等待,没有干其他事,那这和delay()有什么区别呢(前提是没有操作系统的前提下,因为我看你最后这个程序的结构好像是没上操作系统)?
(300831660)

打赏出0元收入0元

发表于 2010-12-26 21:35:18 | 显示全部楼层
受益匪浅
(300827414)

打赏出0元收入0元

发表于 2010-12-26 22:46:04 | 显示全部楼层
学习学习!
(300823413)

打赏出0元收入0元

发表于 2010-12-26 23:52:45 | 显示全部楼层
mark
(299809783)

打赏出0元收入0元

发表于 2011-1-7 17:26:35 | 显示全部楼层
mark
(299807617)

打赏出0元收入0元

发表于 2011-1-7 18:02:41 | 显示全部楼层
太长,我猜测楼主的意思是读端口,和上次读取端口的值,取反,如果不同,就是按键按下!!!

你这样要求很严格,必须,在某个时候,去读。

我一般是在单片机闲暇,没有任务的时候,才去读键盘。
(297207309)

打赏出0元收入0元

发表于 2011-2-6 20:21:09 | 显示全部楼层
mark
(297137974)

打赏出0元收入0元

发表于 2011-2-7 15:36:44 | 显示全部楼层
谢谢!
不错,短小精巧。值得学习。
(296968272)

打赏出0元收入0元

发表于 2011-2-9 14:45:06 | 显示全部楼层
mark
(296958281)

打赏出0元收入0元

发表于 2011-2-9 17:31:37 | 显示全部楼层
mark
(296939574)

打赏出0元收入0元

发表于 2011-2-9 22:43:24 | 显示全部楼层
MARK
(296939473)

打赏出0元收入0元

发表于 2011-2-9 22:45:05 | 显示全部楼层
mark
(296815516)

打赏出0元收入0元

发表于 2011-2-11 09:11:02 | 显示全部楼层
楼主代码写成这样,真神!

用到自己项目中,谢了!
(296811136)

打赏出0元收入0元

发表于 2011-2-11 10:24:02 | 显示全部楼层
早就有了,带消抖的,10ms调用一次

        KeyStat0 = PININ;
        if(KeyStat1!=KeyStat0)                                                     //按键有变化,启动消抖
                {
                KeyStat1 = KeyStat0;
                Key_Delay = 0;
                return;
                }  
        if(Key_Delay<Key_Delay_Time_SET)                                   //消抖确认有效
                {
                Key_Delay++;
                return;
                }
        if(KeyStat2 !=KeyStat1)
                {
                KeyStat3 &= KeyStat1;
                KeyStat3 |=(KeyStat2^KeyStat1)&KeyStat1;                //只读取变化的键
                KeyStat2 = KeyStat1;
                Key_Delay =  -80;
                }
(295765162)

打赏出0元收入0元

发表于 2011-2-23 12:56:56 | 显示全部楼层
晕啊,不能用在矩阵上面?
(295764783)

打赏出0元收入0元

发表于 2011-2-23 13:03:15 | 显示全部楼层
学习
(295711642)

打赏出0元收入0元

发表于 2011-2-24 03:48:56 | 显示全部楼层
mark
(295694878)

打赏出0元收入0元

发表于 2011-2-24 08:28:20 | 显示全部楼层
学习下
(295688047)

打赏出0元收入0元

发表于 2011-2-24 10:22:11 | 显示全部楼层
3Q,mark!
(295682224)

打赏出0元收入0元

发表于 2011-2-24 11:59:14 | 显示全部楼层
确实很好啊!以后就用它了
(295379683)

打赏出0元收入0元

发表于 2011-2-28 00:01:35 | 显示全部楼层
的确够短!思想不错,作为少按键扫描程序不错!
(294777778)

打赏出0元收入0元

发表于 2011-3-6 23:13:20 | 显示全部楼层
回复【279楼】whlz58  
-----------------------------------------------------------------------

回复【楼主位】zhuhanliang  
-----------------------------------------------------------------------

学习了
(292264471)

打赏出0元收入0元

发表于 2011-4-5 01:21:47 | 显示全部楼层
马克之,的确很简洁高效
(292231225)

打赏出0元收入0元

发表于 2011-4-5 10:35:53 | 显示全部楼层
窃以为,对于识别长按键和短按键作用不大。

在极端情况下,“触发”信号可能在两次采样之间消失而被忽略。而且这个“前沿”的准确度太差。因此不要这个“触发”而仅仅用“连续”就足够了。
(292223426)

打赏出0元收入1元

发表于 2011-4-5 12:45:52 | 显示全部楼层
优秀的单击、连击、加速按键处理绝不是这样做的。
(292206997)

打赏出0元收入0元

发表于 2011-4-5 17:19:41 | 显示全部楼层
记号
(292203988)

打赏出0元收入0元

发表于 2011-4-5 18:09:50 | 显示全部楼层
mark
(292202677)

打赏出0元收入0元

发表于 2011-4-5 18:31:41 | 显示全部楼层
找的就是这个
(292198804)

打赏出0元收入0元

发表于 2011-4-5 19:36:14 | 显示全部楼层
mark
(292195076)

打赏出0元收入0元

发表于 2011-4-5 20:38:22 | 显示全部楼层
mark。学习一下
(292194416)

打赏出0元收入0元

发表于 2011-4-5 20:49:22 | 显示全部楼层
觉得蛮好的。各位大侠有更好的贴出来共享啥!别光顾得说不好!
(292120891)

打赏出0元收入0元

发表于 2011-4-6 17:14:47 | 显示全部楼层
mark一下,将来有用
(292107501)

打赏出0元收入0元

发表于 2011-4-6 20:57:57 | 显示全部楼层
mark
(292106956)

打赏出0元收入0元

发表于 2011-4-6 21:07:02 | 显示全部楼层
果断标记,以后会用
(292106044)

打赏出0元收入0元

发表于 2011-4-6 21:22:14 | 显示全部楼层
mark
(292104676)

打赏出0元收入0元

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

本版积分规则

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

GMT+8, 2020-7-8 17:56

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

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