搜索
bottom↓
楼主: stanley.zhao

[转]新型的按键扫描程序

  [复制链接]

出0入0汤圆

发表于 2011-4-2 08:01:44 | 显示全部楼层
牛人

出0入0汤圆

发表于 2011-4-2 08:01:50 | 显示全部楼层

出0入0汤圆

发表于 2011-4-2 08:13:57 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-4-2 11:34:44 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-2 11:47:25 | 显示全部楼层
mark

出50入0汤圆

发表于 2011-4-2 13:07:43 | 显示全部楼层
学习了

出100入0汤圆

发表于 2011-4-2 14:38:28 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-4-2 15:00:22 | 显示全部楼层
算法很精妙。

出0入0汤圆

发表于 2011-4-2 16:34:13 | 显示全部楼层
晕,这么经典,教材上估计再等几个世界都看不到这么精妙的东西,不但要mark ,一定要保存好咯!

出0入0汤圆

发表于 2011-4-3 13:22:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-19 12:30:19 | 显示全部楼层
我只是转的帖子,还没认真去细想
学习了

出0入0汤圆

发表于 2011-4-19 13:46:22 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2011-4-21 18:30:32 | 显示全部楼层
8错,留个爪印

出0入0汤圆

发表于 2011-4-22 17:43:56 | 显示全部楼层
MARK   拜拜

出0入0汤圆

发表于 2011-4-22 18:06:56 | 显示全部楼层
cool!

出0入0汤圆

发表于 2011-4-22 21:20:13 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-4-29 11:22:03 | 显示全部楼层
网站牛人还是挺多的

出0入0汤圆

发表于 2011-5-4 15:28:34 | 显示全部楼层
非常好的思路!

出0入0汤圆

发表于 2011-5-4 16:40:48 | 显示全部楼层
标记一下学习

出0入0汤圆

发表于 2011-5-4 21:34:21 | 显示全部楼层
记下,学习。

出0入0汤圆

发表于 2011-5-6 22:54:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-6 23:11:37 | 显示全部楼层
无敌了~~~~

出0入0汤圆

发表于 2011-5-7 15:49:27 | 显示全部楼层
mark,谢谢!

出0入0汤圆

发表于 2011-5-16 12:22:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-17 10:07:26 | 显示全部楼层
学习

出0入8汤圆

发表于 2011-5-19 00:04:12 | 显示全部楼层
make  楼主的思想很好

出0入0汤圆

发表于 2011-5-19 00:22:02 | 显示全部楼层
要好好学习回报楼主

出0入0汤圆

发表于 2011-6-6 10:51:53 | 显示全部楼层
mark mark!必须MARK

出0入0汤圆

发表于 2011-6-6 17:00:05 | 显示全部楼层
回复【189楼】mojinpan
-----------------------------------------------------------------------

再增加一句可以实现长按的时候不会触发短按事件。

g_PreKey  = g_NowKey;  
g_NowKey  = KeyScan();
g_ShortKeyCode = g_PreKey & (g_NowKey ^ g_PreKey)^g_LongKeyCode;   
if (g_NowKey^g_PreKey^g_NowKey^g_LongKeyCode)
{ if(CntPlus++>LONG_KEY_TIME)//是否符合长按键要求
  { g_LongKeyCode|= g_NowKey;//添加长按键值
  }  
}
else  
{ CntPlus=0;//无新增按键出现,计数归零
  g_LongKeyCode &= g_NowKey; //剔除已释放的按键
}
  g_ShortKeyCode &= ~g_LongKeyCode;      /////////////////////// 避免生成长按事件的时候顺带生成短按事件
}

另外,这个函数本身好像没有短按防抖功能。

出0入0汤圆

发表于 2011-6-12 16:56:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-12 21:05:32 | 显示全部楼层

(原文件名:真值表.jpg)

点击此处下载 ourdev_648094FKFGTM.doc(文件大小:30K) (原文件名:真值表.doc)

出0入0汤圆

发表于 2011-6-14 23:28:28 | 显示全部楼层
确实是相当的强悍,第一次见识,非常佩服。不过消抖确实是没有看到,修改了一下,请各位指点

#define KEYFILTERSET 0x02

unsigned char KeyFilter=0x00;

unsigned char PreReadData;

unsigned char Trg;

unsigned char Cont;

void KeyRead( void )

{

    unsigned char ReadData = PINB^0xff;      // 1
   
    if(ReadData!=PreReadData)  
    {
       PreReadData = ReadData;
       KeyFilterCnt  =0x00;
    }
    else
    {
       KeyFilterCnt++;
       if(KeyFilterCnt>=KEYFILTERSET)
       {
       Trg = ReadData & (ReadData ^ Cont);      // 2

       Cont = ReadData;                         // 3
       }

     }
    }

出0入0汤圆

发表于 2011-6-20 22:02:08 | 显示全部楼层
mark 按键

出0入0汤圆

发表于 2011-7-5 13:37:54 | 显示全部楼层
收藏

出0入0汤圆

发表于 2011-7-7 15:39:33 | 显示全部楼层
学习了~收藏

出0入0汤圆

发表于 2011-8-2 22:10:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-5 13:12:59 | 显示全部楼层
mark&^^

出0入0汤圆

发表于 2011-8-5 13:16:04 | 显示全部楼层
经典啊~

出0入0汤圆

发表于 2011-8-18 10:04:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-19 11:50:20 | 显示全部楼层
顶了再说,留着下次回来看

出0入0汤圆

发表于 2011-9-9 17:23:35 | 显示全部楼层
学习了,看得非常爽啊!

出0入0汤圆

发表于 2011-9-14 16:58:48 | 显示全部楼层
怎么去抖啊?

出0入0汤圆

发表于 2011-10-19 22:12:11 | 显示全部楼层
正在处理按键,都是一个键 多个怎么处理有人出个高招

出0入0汤圆

发表于 2011-10-19 23:39:11 | 显示全部楼层
留个印
睡觉了

出0入0汤圆

发表于 2011-10-20 12:39:15 | 显示全部楼层
晚上回去慢慢研究

出0入0汤圆

发表于 2011-10-20 14:42:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-20 17:27:47 | 显示全部楼层
研究下

出0入0汤圆

发表于 2011-10-24 16:32:00 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-25 09:12:57 | 显示全部楼层
值得学习了~~~~

出0入0汤圆

发表于 2011-10-28 13:50:09 | 显示全部楼层
好贴,必须顶!感觉加消抖确实麻烦!!

出0入0汤圆

发表于 2011-11-13 15:01:05 | 显示全部楼层
按键 好东西

出0入0汤圆

发表于 2011-11-13 20:07:32 | 显示全部楼层
好贴

出0入0汤圆

发表于 2011-11-26 10:57:52 | 显示全部楼层
MARK,下面是我对程序的心得和总结了
http://blog.csdn.net/xuechaojie/article/details/6761772

出0入0汤圆

发表于 2011-11-29 12:41:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-9 12:58:35 | 显示全部楼层
真好,mark
头像被屏蔽

出0入0汤圆

发表于 2011-12-14 19:36:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2011-12-14 19:37:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-12-24 13:29:46 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-12-25 10:00:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-25 10:52:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-28 21:06:19 | 显示全部楼层
这个东东对于我这个初学者来说一定要学好!顶

出0入0汤圆

发表于 2011-12-31 19:41:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-16 19:32:50 | 显示全部楼层
记号

出0入0汤圆

发表于 2012-1-23 16:35:59 | 显示全部楼层
膜拜中。。。。。顶下

出0入0汤圆

发表于 2012-2-10 14:00:44 | 显示全部楼层
MARK

出110入12汤圆

发表于 2012-2-13 23:25:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-15 16:02:35 | 显示全部楼层
正在学习按键中...谢谢楼主和各位前辈!

出0入0汤圆

发表于 2012-2-17 09:48:33 | 显示全部楼层
不错,有空研究对比一下。

出0入0汤圆

发表于 2012-2-19 17:24:33 | 显示全部楼层
回复【1楼】kevintang
-----------------------------------------------------------------------

不错,简单,但写的不错。

出0入0汤圆

发表于 2012-3-28 14:35:53 | 显示全部楼层
MARK 按键处理

出0入0汤圆

发表于 2012-4-22 23:18:42 | 显示全部楼层
真是太简洁了,好程序!

出0入0汤圆

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

出0入0汤圆

发表于 2012-5-1 23:36:03 | 显示全部楼层
记号学习

出0入0汤圆

发表于 2012-5-13 23:12:35 | 显示全部楼层

void ReadKey(void)
{
    UINT8 readData = NO_PRESS_KEY;
    static UINT8 keyBuff = NO_PRESS_KEY;  //按键寄存器缓存
    if (g_keyDetectionEnable == 1)    //按键扫描使能
    {
        g_keyDetectionEnable = 0;
        readData = ReadKeyPort();
        if(readData == NO_PRESS_KEY || readData == g_keyBuff)
        {
            g_keyTrg = readData & (readData ^ g_keyCont);  //得到按下触发值
            g_keyRelease = readData ^ g_keyTrg ^ g_keyCont;  //得到释放触发值,只有当按键松掉时,值才会为1
            g_keyCont = readData;  //得到所有未释放的键值
        }
        if(g_keyBuff != readData)
        {
            g_keyBuff = readData;
        }
        
    }
}
这是我在这个程序中加的消抖,定时器定时中断使能扫描按键,欢迎大家拍砖,谢谢!

出0入0汤圆

发表于 2012-5-31 08:48:40 | 显示全部楼层
正需要这种按键。

出0入0汤圆

发表于 2012-6-8 14:15:09 | 显示全部楼层
回贴中很多能人呀

出0入0汤圆

发表于 2012-6-9 11:36:50 | 显示全部楼层
学习了!!!!!!!!!!!!!!!!!!!!!1

出0入0汤圆

发表于 2012-6-9 12:01:00 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2012-6-9 13:21:42 | 显示全部楼层
记号,,,,,,,,,

出0入0汤圆

发表于 2012-6-10 10:01:01 | 显示全部楼层
在这个帖子学了很多东西,支持楼主分享!讲解很透彻,对我这样的新手帮助很大!

出0入0汤圆

发表于 2012-6-10 15:37:01 | 显示全部楼层
下面是程序解释:

Trg(triger) 代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

LZ的  unsigned char ReadData = PINB^0xff;      // 1

这句里读端口数据后事与0xff异或后送到ReadData 临时变量里面保存起来吧

出0入0汤圆

发表于 2012-6-10 16:02:39 | 显示全部楼层
LZ的基本思想是:判断是否有高低电平就给个触发信号!哈!

出0入0汤圆

发表于 2012-6-10 19:39:00 | 显示全部楼层
XA144F 发表于 2010-3-29 11:33
我想我的方法也差不多,只不过是在定时器中断中使用的:定时器中断时间为10ms,即10ms检查一次按键。按键在 ...

太牛了,mark!

出0入0汤圆

发表于 2012-6-16 08:30:53 | 显示全部楼层
好东西,我正好用得到.

出0入0汤圆

发表于 2012-6-18 15:46:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-20 15:35:21 | 显示全部楼层
提点意见和改进!
我使用了楼主的算法,但是出现一个问题!
我的项目是存在数码管扫描显示和按键扫描,io是复用的
具体现象是:数码管会闪烁,大约400ms一次
经过1整天的分析查找问题,最后将问题决定在Trg = ReadData & (ReadData ^ Cont); 这句上面,把这句话取消,显示就正常!
于是改为Trg = ReadData & (~Cont); 实现的功能是一样的,但是运算速度快了,更容易理解了
我怀疑keilc对异或运算有BUG,这只是猜测!

改后算法:
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{
     unsigned char ReadData = PINB^0xff;      // 1
     Trg = ReadData & (~Cont);      // 2
     Cont = ReadData;                         // 3
}

出0入0汤圆

发表于 2012-6-29 08:52:33 | 显示全部楼层
mark~~~~~~~~~~

出0入0汤圆

发表于 2012-6-30 22:13:13 | 显示全部楼层
记下,学习。

出0入0汤圆

发表于 2012-7-1 13:47:45 | 显示全部楼层
顶顶顶~~果断收藏了~~谢谢分享~

出0入0汤圆

发表于 2012-7-1 22:23:11 | 显示全部楼层
Mark,多谢分享

出0入0汤圆

发表于 2012-7-9 09:51:54 | 显示全部楼层
确实是很牛

出0入0汤圆

发表于 2012-7-9 11:34:58 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2012-7-20 01:10:25 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-7-30 10:29:34 | 显示全部楼层
收藏,学习。。

出0入0汤圆

发表于 2012-7-30 16:38:29 | 显示全部楼层
mark                           

出0入0汤圆

发表于 2012-7-30 22:09:32 | 显示全部楼层
mark,跟帖改进的很多,先实现楼主的算法再看~~

出0入0汤圆

发表于 2012-8-7 09:00:14 | 显示全部楼层
都是牛人啊!!

出0入0汤圆

发表于 2012-8-7 18:53:05 | 显示全部楼层
mark,这个方法太好了,受教了

出0入0汤圆

发表于 2012-8-21 16:06:35 | 显示全部楼层
去抖动的方法并不可靠。
如果按键IO口受干扰比较严重或按键接触不良的情况下,可能在按键没有按下时也会产生一个负脉冲,或在按键按下稳定的过程中出现一个正脉冲。这样的脉冲可能不是很宽,但是一旦被检测被程序的20ms定时采样采到,就会引起一个误触发操作,增大采样时间可以减小几率,但不能避免。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-19 07:46

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

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