学习了
点赞  2010-4-18 10:55
最好把你的程序贴上来
点赞  2010-4-18 11:48

回复 21楼 nathenlu 的帖子

共同学习,共同进步
点赞  2010-4-18 14:57

回复 22楼 zheguzai 的帖子

呵呵,真感谢你的回复,为了把代码贴上来,我重新整理了一下,结果发现的确是自己的显示函数充当了“消抖”功能,现把原程序发上来,大家仔细看看就知道问题出在那里呢:L
#include

#define uchar unsigned char
#define uint unsigned int
#define LED_PORT P0                 //定义数码管输出
bit g_systTime2Ms=0;         //定义时间标志位
bit g_time10Ms=0;
bit flag=0;                        //定义一个按键标志位
sbit io_seg=P2^6;           //段选
sbit io_bit=P2^7;           //位选
sbit key1=P3^4;                   //定义按键
uchar g_num=0;        //定义初始显示值为0
uchar g_dispBuffTemp[6]={0};        //显示缓存区
uchar code g_dispCodeTab[]={   //字符编码
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};

void Display()                   //动态扫描数码管函数
{
        static uchar s_dispCycle=0;
        uchar dispPostTemp[]={1,2,4,8,16,32};
        if(g_systTime2Ms)
        {
                g_systTime2Ms=0;
                io_seg=1;           //送段选
                LED_PORT=g_dispBuffTemp[s_dispCycle];
                io_seg=0;
                LED_PORT=0xff;          //消影
                io_bit=1;            //送位选
                LED_PORT= ~dispPostTemp[s_dispCycle];
                io_bit=0;
       
                if(++s_dispCycle>=6) s_dispCycle=0;       
        }
}

void DispHex(uchar hex,uchar pos)          //给数码管送值函数
{       
        pos=pos%6;
        g_dispBuffTemp[pos]=g_dispCodeTab[hex];
}

void DsipNum()                 //显示数值函数
{
        DispHex(g_num/10,0);
        DispHex(g_num%10,1);
        Display();
}

void Timer0Init()         //中断初始化函数
{
        TMOD=0X01;
        TH0=0XF8;
        TL0=0XCC;
        ET0=1;
        TR0=1;
}

void Timer0() interrupt 1                         //中断函数
{
        static s_countFor10Ms=0;
        TH0=0XF8;
        TL0=0XCC;
        g_systTime2Ms=1;
        if(++s_countFor10Ms>=5)
        {
                s_countFor10Ms=0;
                g_time10Ms=1;
        }       
}

void main()
{
        Timer0Init();
        EA=1;

        while(1)
        {
                if(flag)
                {
                        if(key1==0)
                        {
                                if(++g_num>=100) g_num=0;
                                flag=0;
                        }
                }
                else
                {
                        if(key1==1) flag=1;
                }
        }       
        DsipNum();       

}
点赞  2010-4-18 15:01

回复 24楼 dxstar 的帖子

哈哈 亲历了楼主解决问题的全过程  支持下
DIY是一种信仰~~
点赞  2010-4-19 13:21
我的理解是,按键正常不会为低,只要为低,管它3721,都认为按了键了!为低触发中断,在中断里来个大延时,出来之后保证按键释放了!只要这个人手快不到1秒中来回100次,那么10ms的等待也够了的!
点赞  2010-4-20 21:04

回复 25楼 clark 的帖子

呵呵,那也要感谢你一直以来的关注哦。其实我就觉得吧,有问题在讨论上发了帖子,无论怎么样,你现在的进展如何,是否问题已经解决,都应该有一个回复。这是对论坛,对各位回复你的网友一个交待。呵呵
点赞  2010-4-21 11:04

回复 26楼 feman5012 的帖子

“在中断里来个大延时”?中断里弄延时不是单片机设计里的大大忌吗?(大忌是在主函数延时 )而且消抖的方法有很多啊,我这里只是想看看这个“抖动”,而不是去“消抖”。感觉很多人都误以为我是在讨论“消抖”的方法呢?我觉得我在开头已经说明得很清楚了啊:L
点赞  2010-4-21 11:07
楼主可以考虑用硬件消陡的办法,使用RS触发器来消除抖动
点赞  2010-4-21 16:44
在这个问题上,你最好把按键过程的时序图画一下,然后慢慢分析。

在分析下面问题前我首先要向大家说明一点:抖动时分有效与无效的。
有效地抖动就是说它的抖动幅度很大,会从低电平抖到高电平或从高电平抖到低电平,单片机
能识别;无效的抖动是说它的抖动幅度小,不能被单片机识别,不管它抖不抖单片机都把它视为一种电平。

以下是我对相关问题的看法:
1.按键的抖动可能存在,但根本没有达到5ms-8ms这么长
如果你的开发板的按键是机械式按键那就有按键抖动,但各种按键的抖动
的时间相差很大,有些有20ms,开发板的按键一般比较好,所以抖动
时间一般较短,可能没达到5ms-8ms。

2.因为执行其它的程序也需要时间,这段时间就相当于是给按键消抖了
如果你的程序没有较大的延时程序、定时程序或程序很大的话,程序执行时间是可以
忽略的,因为cpu执行一条指令才1us(12mhz晶振),1ms就一千条指令了。
如果你怕是程序的缘故,那你可以写一个较短的程序试试看看。

3.最重要的一点,如果我想看这按键到底有没有抖动,或者抖动时间有多长,应该怎么来测试?(除了用示波器,因为我没有示波器)
比如写一个什么程序,按一次键会出现数码管显示的值连跳N个值之类的。
用程序测抖动比较难,因为抖动的次数可能很大,当然你可以设置一个上限值
只要抖动次数到了一定时就停止计数。这只能计数到那些有效地抖动,
无效的抖动还是计不到。抖动时间有多长,只能测有效抖动时间的长短。
你可以用定时测,先给抖动时间设置一个上限比如20ms,那么就在20ms
内一直对抖动计时。

下面我来说说我的看法:
1.你先检查一下你的开发板是否有硬件去抖,比如电容之类的。
2.有可能是你的开发板按键的有效抖动较少,按下去后,电平在抖,但
只是在低电平区抖。
3.当然也有可能是你的开发板自身的硬件的电路的去抖作用,比如双面板
的开发板,就很可能自身形成了去抖电容。

这些只是猜测,最好用示波器检测一下。

以上就是我的见解,希望对你有用。
喜好电子DIY的小伙伴可以关注我的微信公众号:电子创客派
点赞  2010-4-22 10:46

回复 板凳 chenzhufly 的帖子

你好,我对按键消抖也处理不好,我用atmega16写了一个计算器的程序,lcd1602总显示不对,我用的晶振是8MHZ,内部时钟1MHZ,用的是ICCAVR6.31,PROTUES7.1,能帮我看看吗代码在我邮箱里644812694@qq,com
点赞  2010-6-13 11:12
12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复