搜索
bottom↓
回复: 1

求助马老师:按键消抖的理解

[复制链接]

出0入0汤圆

发表于 2011-10-29 01:00:36 | 显示全部楼层 |阅读模式
看了您的学习资料第九章的关于按键消抖的程序块,通过每个固定时间段的定时器中断判断一次按键状态,比如5ms判断读取一次按键的状态,最后函数的返回值为1时为判断一次按键结束的标志。如果我想在判断一次按键动作完成后,使得用于计数的变量cnt自增1,达到记录按键成功按下的次数的记录。中断函数怎么写才正确呢?我写了一个觉得有问题又不知怎么改起,想请教您分析一下。谢谢了!如果有其他学长愿意帮忙也很好啊~~
#define key1_input        PIND &(1<<2)                        // 按键输入口

#define key1_state_0        0
#define key1_state_1        1
#define key1_state_2        2
char        time_counter,key_stime_counter;                // 时间计数单元,
char    key_stime_ok;
void init_key()
{
        SREG = 0x00;//关闭中断
        DDRD = 0xf3;//11110011,即PIN 2 & PIN 3设置为输入,因为用到PD2,PD3口
        PORTD = 0xff;//PD口接全输出
        //**********************************t/c2_init starts*************************
        TCCR2 = 0x00;//stop
        TCNT2 = 0xB9;//5ms为一个中断周期
        TCCR2|= (1<<CS22) | (1<<CS21) | (1<<CS20);//拉高3个引脚,选择1024分频
        TIMSK |= (1<<TOIE2);//拉高bit6,toie2置1,使能t/c2溢出中断

        SREG = 0x80;//使能总中断
}
char read_key1(void)
{
                static char key1_state = 0;
                char key1_press, key1_return = 0;

                key1_press = key1_input;                                // 读pinD.2按键I/O电平,keypress保存刚检测的按键值
                switch (key1_state)
                {
                        case key1_state_0:                                // 按键初始态
                                if (!key1_press) key1_state = key1_state_1;        // 键被按下,状态转换到键确认态
                                break;
                        case key1_state_1:                                // 按键确认态
                                if (!key1_press)
                                {
                                        key1_return = 1;                        // 按键仍按下,按键确认输出为"1"
                                        key1_state = key1_state_2;        // 状态转换到键释放态
                                }
                                else
                                        key1_state = key1_state_0;        // 按键已抬起,转换到按键初始态
                                break;
                        case key1_state_2:
                                if (key1_press) key1_state = key1_state_0;        //按键已释放,转换到按键初始态
                                break;
                }       
            return key1_return;//初始化为0.在状态1中置一,确定输出值
ISR (TIMER2_OVF_vect)
{
        TIFR = 0x40;//tov2重写
        TCNT2 = 0xB9;//5ms
        if (++key_stime_counter >=4)
                {
                        key_stime_counter = 0;
                        key_stime_ok = 1;
                                                // 20ms到
                }

                if (key_stime_ok)                                // 20ms到,键处理
                        {
                                key_stime_ok = 0;
                       
                        if (read_key1())                        // 调用按键接口程序,如果确认按键按下了
                                        {
                                                if(cnt<5)
                                                cnt++;
                                                else
                                                cnt=0;       
                                        }                               
                               
                        }
}

出0入0汤圆

发表于 2011-11-4 12:24:19 | 显示全部楼层
这个先不要考虑程序如何写,而是考虑如何正确的统计按键按下的次数。


一般人只是简单考虑,按键按下一次,加1就可以统计了,其实不是如此。

这个按键次数统计是有条件的;

比如,按键按下的间隔时间在0.5秒,需要统计次数。而超过2秒该键没有被按下,则这个统计次数就应该被清零了。

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

本版积分规则

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

GMT+8, 2024-5-10 23:09

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

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