回复 21楼 nathenlu 的帖子
共同学习,共同进步
回复 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();
}
回复 24楼 dxstar 的帖子
哈哈 亲历了楼主解决问题的全过程 支持下
我的理解是,按键正常不会为低,只要为低,管它3721,都认为按了键了!为低触发中断,在中断里来个大延时,出来之后保证按键释放了!只要这个人手快不到1秒中来回100次,那么10ms的等待也够了的!
回复 25楼 clark 的帖子
呵呵,那也要感谢你一直以来的关注哦。其实我就觉得吧,有问题在讨论上发了帖子,无论怎么样,你现在的进展如何,是否问题已经解决,都应该有一个回复。这是对论坛,对各位回复你的网友一个交待。呵呵
回复 26楼 feman5012 的帖子
“在中断里来个大延时”?中断里弄延时不是单片机设计里的大大忌吗?(大忌是在主函数延时
)而且消抖的方法有很多啊,我这里只是想看看这个“抖动”,而不是去“消抖”。感觉很多人都误以为我是在讨论“消抖”的方法呢?我觉得我在开头已经说明得很清楚了啊:L
楼主可以考虑用硬件消陡的办法,使用RS触发器来消除抖动
在这个问题上,你最好把按键过程的时序图画一下,然后慢慢分析。
在分析下面问题前我首先要向大家说明一点:抖动时分有效与无效的。
有效地抖动就是说它的抖动幅度很大,会从低电平抖到高电平或从高电平抖到低电平,单片机
能识别;无效的抖动是说它的抖动幅度小,不能被单片机识别,不管它抖不抖单片机都把它视为一种电平。
以下是我对相关问题的看法:
1.按键的抖动可能存在,但根本没有达到5ms-8ms这么长
如果你的开发板的按键是机械式按键那就有按键抖动,但各种按键的抖动
的时间相差很大,有些有20ms,开发板的按键一般比较好,所以抖动
时间一般较短,可能没达到5ms-8ms。
2.因为执行其它的程序也需要时间,这段时间就相当于是给按键消抖了
如果你的程序没有较大的延时程序、定时程序或程序很大的话,程序执行时间是可以
忽略的,因为cpu执行一条指令才1us(12mhz晶振),1ms就一千条指令了。
如果你怕是程序的缘故,那你可以写一个较短的程序试试看看。
3.最重要的一点,如果我想看这按键到底有没有抖动,或者抖动时间有多长,应该怎么来测试?(除了用示波器,因为我没有示波器)
比如写一个什么程序,按一次键会出现数码管显示的值连跳N个值之类的。
用程序测抖动比较难,因为抖动的次数可能很大,当然你可以设置一个上限值
只要抖动次数到了一定时就停止计数。这只能计数到那些有效地抖动,
无效的抖动还是计不到。抖动时间有多长,只能测有效抖动时间的长短。
你可以用定时测,先给抖动时间设置一个上限比如20ms,那么就在20ms
内一直对抖动计时。
下面我来说说我的看法:
1.你先检查一下你的开发板是否有硬件去抖,比如电容之类的。
2.有可能是你的开发板按键的有效抖动较少,按下去后,电平在抖,但
只是在低电平区抖。
3.当然也有可能是你的开发板自身的硬件的电路的去抖作用,比如双面板
的开发板,就很可能自身形成了去抖电容。
这些只是猜测,最好用示波器检测一下。
以上就是我的见解,希望对你有用。
喜好电子DIY的小伙伴可以关注我的微信公众号:电子创客派
回复 板凳 chenzhufly 的帖子
你好,我对按键消抖也处理不好,我用atmega16写了一个计算器的程序,lcd1602总显示不对,我用的晶振是8MHZ,内部时钟1MHZ,用的是ICCAVR6.31,PROTUES7.1,能帮我看看吗代码在我邮箱里644812694@qq,com