打印

按键去抖动问题

[复制链接]
6612|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangli222|  楼主 | 2007-1-13 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
有意思| | 2007-1-13 16:16 | 只看该作者

定时器

定时器2ms扫描,如果是低电平有按键,在T0中断中读出IO口为0则Count++;
直到一个值,如50,if(Count == 50)Key = 1;
中间只要有一次为1,则Count = 0;

使用特权

评论回复
板凳
zhangli222|  楼主 | 2007-1-13 16:40 | 只看该作者

多谢

多谢,我再看一下,希望路过的大虾多多指教。

使用特权

评论回复
地板
etual| | 2007-1-13 22:03 | 只看该作者

这个嘛

判断有健 --->  延时>20ms ----> 判断是否有健,有的话操作,没有的话跳出,大概流程是这样 ,延时是肯定要的,具体时间要求不大,大于 10ms都没有什么问题,看个人习惯了 ...... --

最简单的是死循环,用指令来计时,(如果你一条指令 1us 的话,则原地循环  20000 次就OK,时间到),一般是双重循环嵌套来做的。

以上就是所谓的教学,基本上所有的教科书都会那样说,但是,老实话,具体设计的时候这样是行不通的,20ms是很长的时间啊,单片机可以做很多很多东西了 .......不可能用死循环的 .......

使用特权

评论回复
5
hotpower| | 2007-1-13 22:05 | 只看该作者

典型的教条主义~~~

使用特权

评论回复
6
liyong110| | 2007-1-14 11:26 | 只看该作者

很简单的

分时扫描不就行了!!!!!!!!
连续2次得到同样结果就认为有效.不耽误MCU效率!!!!
还能降低功耗!!!!
例如4*4键盘.用标志位2个,寄存器(AUTO)3个!就什么都搞定了!!!!

使用特权

评论回复
7
maychang| | 2007-1-14 12:34 | 只看该作者

hotpower不厚道

说一句就走。

使用特权

评论回复
8
谈的元| | 2007-1-14 13:48 | 只看该作者

就如liyong110说

就如liyong110说 ,


检测到有效时  积储器加一,无效清零。


检测积存器大于等于某值开命令。

程序开始
nop
nop
;;;;;;;;;
if(按键==有效  AND  积存器Q <M);M一般取个3-5就可以了。
积存器Q==积存器+1
if(按键==无效 )
积存器Q==0
;;;;;;;;
;;;;;;;;;
if(积存器Q>=N);;当然你的n要小于m
打开命令
if(积存器Q<N)
关命令

使用特权

评论回复
9
dengm| | 2007-1-14 14:28 | 只看该作者

状态机(ms basic)

    KEY_SCAN = 1
    STATUS   =0

SUB_SCAN:
    KEY = READ_KEY(KEY_SCAN)
    IF KEY_SCAN = KEY_MAX THEN KEY_SCAN =0
    KEY_SCAN = KEY_SCAN + 1
    
    ON STATUS GOTO ST_1, ST_2, ST_3
ST_0:
      IF KEY <> 0 THEN
        KEY_CODE = KEY
        KEY_DELAY = (KEY_MAX + 2) 
        STATUS = 1
      END IF
      EXIT SUB

ST_1:
     IF KEY = KEY_CODE THEN
        KEY_DELAY = KEY_DELAY + KEY_MAX
        IF KEY_DELAY>(KEY_MAX + 10) THEN
          F_KEY_PRESS = TRUE 
          STATUS = 2
        END IF
     ELSE
       KEY_DELAY = KEY_DELAY - 1
       IF KEY_DELAY=0 THEN STATUS =0 
     END IF
     EXIT SUB

ST_2:
     KEY_DELAY=KEY_DELAY-1
     IF KEY_DELAY=0 THEN
          STATUS =3
     END IF
     EXIT SUB

ST_3:
       IF NOT F_KEY_PRESS THEN
          KEY_CODE = 0
          STATUS =0
       END IF
     END SUB

使用特权

评论回复
10
有意思| | 2007-1-14 15:53 | 只看该作者

坚决不用软件延时

2ms定时扫描,有键,cnt++;直到指定次数
中间有一次为无键,cnt=0;
抗干扰

使用特权

评论回复
11
hotpower| | 2007-1-14 16:04 | 只看该作者

倒塌了~~~这个问题确实不想多说了~~~

在21ic这个问题和狗论可能是我灌水最多的...

现在想"吐"~~~倒塌了~~~

看来哪天要来个"键盘论"了~~~
相关链接:http://www.5i51arm.com/viewthread.php?tid=279&extra=page%3D2

使用特权

评论回复
12
lininglive| | 2007-1-14 16:14 | 只看该作者

晕晕乎没有个高手来定论阿!!!

晕晕乎没有个高手来定论阿!!!不要总说理论 有没有实际经验的说一说

使用特权

评论回复
13
有意思| | 2007-1-14 16:20 | 只看该作者

晕死

这个问题........

使用特权

评论回复
14
hotpower| | 2007-1-14 18:44 | 只看该作者

倒塌了~~~匠人数数里面有几个"倒塌键盘"???

哈哈~~~

使用特权

评论回复
15
conwh| | 2007-1-14 19:18 | 只看该作者

高家庄的地道各有各的高招

使用特权

评论回复
16
gezhi| | 2007-1-14 22:07 | 只看该作者

我相信这问题没有权威的解决办法。

这问题应该根据实际应用环境,选择多次读取,或延时确认等。

使用特权

评论回复
17
bird777| | 2007-1-15 00:07 | 只看该作者

玩泡泡

20键以上,hotpower不心痛RAM.我要心痛难过了.1个字节1条命!
一般如果RAM用量过剩,用用hotpower的伪OS比较爽.
事实上,当RAM需求量大时,只有舍弃非典了.
中断+dengm给出状态机思路是永远正确的指导方针,即使非便携式系统(不用省电),键盘扫描工作也要移到中断函数中去管理(不一定要定时中断,只要带周期性的就可以).要好好理解,它的高度相当于系统函数.



使用特权

评论回复
18
yewuyi| | 2007-1-15 08:39 | 只看该作者

给出一段示范代码


                            keyval=disport&keyall;
                            if(keyval==0){keyvalbuf=0x00;keypresscnt=0x00;}    //无键动作
                            else{                                            //有键动作
                                if(keyval==keyvalbuf){maincase=keyact;nullkey30s=1500;}                //输出一次键值
                                else{keypresscnt=0x00;keysingle=0;keycontinue=0;keyvalbuf=keyval;}    //做消抖动作
                                }

使用特权

评论回复
19
xwj| | 2007-1-15 08:50 | 只看该作者

问之前先搜索,再问这种问题先打PP!

使用特权

评论回复
20
yewuyi| | 2007-1-15 08:50 | 只看该作者

说明一下:

KEY复用到disport,有键工作为高电平,否则是低电平。

keyval=0表示所有的键都没有按下。

把这一段加入到周期扫描里面去,具体键值执行则由keyscan()决定,keyact决定执行keyscan()
在keyscan()包含在main里面,所有的键状态在里面解析。


这一段程序最多只支持8键定义,具体多少键有keyall参数决定。
键意解析、键单击、长击、复合键、按下有效、弹起有效等全部在keyscan()里面完成。
如果你看懂了这段示范,要支持更多的键就很容易了……

明白了吗?

:::另一点我不同意在计算类如长击时间时用减法,俺个人认为用加法可以少用很多RAM,并且可以减短代码。

使用特权

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

本版积分规则

3

主题

6

帖子

0

粉丝