搜索
bottom↓
楼主: zhuhanliang

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

  [复制链接]

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出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();
       }
}
前者只不过时间更精确而已。

出0入0汤圆

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

出0入57汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出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更好一些吧。

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

出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个按键是总的带保持记忆性的软开关,当然还有个拨杆电源开关,再上电后会为软关停,而且导致保持的记忆归中位大概。

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

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

出0入0汤圆

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

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


快下班了哈。

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入8汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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


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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

用到自己项目中,谢了!

出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;
                }

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

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

学习了

出0入0汤圆

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

出0入0汤圆

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

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

出0入20汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入131汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 16:28

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

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