打印

按键可有**了,能体现一个人的编程水平

[复制链接]
楼主: 戒指320
手机看帖
扫描二维码
随时随地手机跟帖
21
gyc198215| | 2009-7-27 09:09 | 只看该作者 回帖奖励 |倒序浏览

三年前就用时基很好用,一个兄弟写的,非常好。是10ms处理一次只是扫描不延时,扫描到几次连续有效才认为是正确,有效次数可根据自己情况调整。

使用特权

评论回复
22
5880527| | 2009-7-27 09:32 | 只看该作者

做过几个实际的程序后就不会照书本那样消抖了

实际生产中各种抖动都不一样,需要区别对待

使用特权

评论回复
23
bjc125| | 2009-7-27 10:03 | 只看该作者

不同的按键系统应该有些细微的差别吧

我们的产品都是50MS(TCC中断)间隔内连续检测2次,效果还不错,没发现什么误判的

使用特权

评论回复
24
kanprin| | 2009-7-27 10:42 | 只看该作者

10ms时基

定时器10ms时基,第一次初判,第二次确认,按下与释放依次检测。

使用特权

评论回复
25
耕在此行| | 2009-7-27 11:07 | 只看该作者

本人的做法

在一段连续的时间里如果按键 一直被按,则按键有效.否则无效.
程序如下:
// m的大小根据机器周期调整.
void chk_keyon(uchar key)
    {
    bin16 m;
    B_keyon = 1;
    for(m=1000;m!=0;m--)
       {
       if( PTA & key )    // ¼üδ±ÕºÏ£¿
           {
            B_keyon = 0;    // ¼ü±ÕºÏ±êÖ¾Çå0
            break;        // ½áÊø²âINC¼ü
          }
        }
    }

使用特权

评论回复
26
呆板书生| | 2009-7-27 11:41 | 只看该作者

老掉牙问题了

可以参见老hot的零耗时键盘程序

使用特权

评论回复
27
qjy_dali| | 2009-7-27 11:44 | 只看该作者

不管是MCU还是CPLD做按键电路,我和LZ方法相同

  而且,正如上面LZ提到的,不用等到按键松开才处理。

  比如,我以10ms的时基不断采样,当发现按键被按下时,我要连续6次(可以软件调节)都检测到按下状态,才算真的按下,这时,我就可以向其它部分发出“按键按下”事件了。如果此时按键没有弹开,并不影响我对“按键按下”事件的确认。

  按键的弹开事件也可以采用这种机制。

使用特权

评论回复
28
红金龙吸味| | 2009-7-27 12:36 | 只看该作者

这样写不错

我一般是这么处理的。
定时器设置为10ms中断一次,中断中有一个标志bTimeOn
中断发生时 bTimeOn = TRUE ;
主程序中
if(TRUE == bTimeOn )
{
    bTimeOn = FALSE ;
    byKeyTemp = KeyScan() ;
    switch(byKeyState)
    {
        case KEY_WAIT : if( NOKEY != byKeyTemp )
                        {
                             byKeyState = KEY_DOWN ;
                        }
                        else
                        {
                             byKeyState = KEY_WAIT ;
                             byKeyValue = NOKEY ;
                        }
        break ;
        case KEY_DOWN : if( NOKEY != byKeyTemp )
                        {
                             byKeyState = KEY_CONFIRM ;
                        }
                        else
                        {
                             byKeyState = KEY_WAIT ;
                             byKeyValue = NOKEY ;
                        }
        break ;
        case KEY_CONFIRM :if( NOKEY != byKeyTemp )
                        {
                             byKeyState = KEY_DOWN_YES ;
                        }
                        else
                        {
                             byKeyState = KEY_WAIT ;
                             byKeyValue = NOKEY ;
                        }
       break ;
       case KEY_DOWN_YES :if( NOKEY != byKeyTemp )
                        {
                             byKeyValue = byKeyTemp ;
                             byKeyState = KEY_WAIT;
                        }
                        else
                        {
                             byKeyState = KEY_WAIT ;
                             byKeyValue = NOKEY ;
                        }
       break ;
       default : break ;

    }
    return byKeyValue ;
}

使用特权

评论回复
29
oldli| | 2009-7-27 13:35 | 只看该作者

可以设键标志,用一个或数个工作程序段的运行本身作延时

回8楼:这里说的程序段运行时间一般不会很相等。可以评估其时间范围再确定。按键等待时间不要精确,差不多就行。毕竟停顿时间少了许多。

回20楼:某个程序运行周期内读一下键值,有键按下时设个标志,下个或下几个周期(估计10-20mS左右)后再来读。确认或丢弃。

使用特权

评论回复
30
icecut| | 2009-7-27 18:52 | 只看该作者

用芯片扫

哈哈

使用特权

评论回复
31
tyw| | 2009-7-27 19:28 | 只看该作者

不过话又得说回来

教课书入门书要是上来就跟泥来段定时中断公共时基消抖,刚入门的菜鸟恐怕会更摸不着头脑了,哈哈

使用特权

评论回复
32
程序匠人| | 2009-7-27 20:02 | 只看该作者

活学活用是关键

使用特权

评论回复
33
badbird1234| | 2009-7-28 08:08 | 只看该作者

真是质量低下

不知道为什么高手都到哪去了

使用特权

评论回复
34
冷漠| | 2009-7-28 10:09 | 只看该作者

楼主连键盘扫描为何要延时机制还没搞懂呢。

一个按键的状态变化,称为一个事件。

假定在一个实时系统中发生了一个按键事件,按键中断都被触发了,难道还要在中断处理程序中花费几十ms来确认它的正确性?

LZ真是创世纪的发现:打破40~60年以来世界教材上讲述的按键检测(实际应用技术)方法。

如今真是什么人都想造个“轰动效应”。

中国的教科书确实没有讲清键盘扫描延时机制,去看看国外教材!看完了,弄懂弄清楚了以后再来发表认知。

再看看过去关于键盘延时的争论:开开眼

ayb_ice :“按键扫描延时是为了防止一次按键多次响应。”

这是最简洁明了的说明。假定一个按键关联触发的响应处理程序的运行开销是20ms, 或者10ms/30ms/50ms, 或者100ms,那么当系统检测到一个按键按下(电平状态变化)时,相关处理程序就可以立即触发执行,——不需要任何延时!根本不可能是什么“干扰”,“虚假信号”之类,国外教材上从来没有这种说法。全是中国教授的错误理解,结果写到教材上,误导一代一代学生。

很简单的证明方法:拿一个存储型示波器,接到按键输入端,连续观测一下,有没有干扰脉冲?不可能有!  有位高手说过了:“干扰脉冲没那么大能量!”—— 一个按键要把高电平拉低,至少需要1ma电流,干扰脉冲是电压形式,没有功率,不可能产生电流。这是电路基本原理吧。

所以,第一次检测到按键状态变化时,“它必然是一个真实事件!”相关响应程序可以立即运行。根本不需要延时确认。“没个假的。”

实际物理过程:当按键还在不稳定阶段抖动时,处理程序已经运行。

要防止的,实际是假设处理程序开销在按键抖动时间之内执行完毕,那么第二次扫描此按键时,它还没有稳定下来,仍在抖动,结果可能这时检测到“释放电平”,这是真正的“假信号”。是不希望的。——这才是延时机制的实质。

要看国外教材上怎么讲的,可以推荐一本。现在懒得找啦。

使用特权

评论回复
35
郑成功了| | 2009-7-28 10:44 | 只看该作者

楼主的思想不错

我最近做的项目也用到了这种方法。
检测一个动作,是否在规定的时间内有此动作发生,然后输出判断。
同样的思想。

使用特权

评论回复
36
szjason| | 2009-7-28 10:52 | 只看该作者

触摸感应按键

现在很多家用电器的案件开始使用触摸按键了。万代科技的触摸芯片应用很好的

使用特权

评论回复
37
古道热肠| | 2009-7-28 11:13 | 只看该作者

不全同意34的结论

有位高手说过了:“干扰脉冲没那么大能量!”—— 一个按键要把高电平拉低,至少需要1ma电流,干扰脉冲是电压形式,没有功率,不可能产生电流。这是电路基本原理吧。
这个高手的说法误导人.

使用特权

评论回复
38
古道热肠| | 2009-7-28 11:15 | 只看该作者

瞬间的干扰是存在.

现在很多MCU已在硬件上采取了施密特触发输入和短脉冲丢失的不响应的设计,但软件消干扰措施还是有必要的.

使用特权

评论回复
39
冷血感情信| | 2009-7-28 11:49 | 只看该作者

34楼能不能推荐一本国外教材?

给个链接

使用特权

评论回复
40
zhaolipingyy| | 2009-7-28 12:15 | 只看该作者

定时器和状态机

可以看看马潮老师的《AVR单片机嵌入式系统原理与应用实践》中关于按键处理的程序。其实是有点操作系统任务调度的感觉,按时间片,分时处理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则