一、软件消抖:
其实包括课本,很多课外的资料都有些偷工减料的意思,按键消抖消得不科学。仅仅通过间隔一段时间的两次检测一般是无法确定的一个按键确实按下是还是松开了。下面博主贴的软件消抖是通过一段时间内多次持续检测的方法来确定一个键值,这段时间中如果有一次是高电平,就从头开始计,直到记够连续低电平的次数足够才确定按键按下,同样按键松开也是如此。
这个思路新手一般比较困惑,不过等以后遇到这类问题时候就会恍然大悟了。(当然大神们用脚趾头想想就get了。。。说得好像大声脚趾头里有脑袋。。囧。)
下面介绍下编程的思路:
我们写这个按键函数取名为:MnKey(),倘若以后要用到按键的都可以偷懒调用这个按键函数啦~ 这个函数由下面这三个小函数组成:
void KeyIn(void); void KeyChk(void); void KeyCvt(void)
(1)首先在编写程序的时候先定义一个键值:#define KeyTime 10 //防抖定时时间
(2)一些是这三个函数的具体内容及简单介绍:
//=======================
//函数功能:读入按键,并取反;
//输出参数:Keyport;输出参数:KeyInBuff
void KeyIn(void)
{
KeyInBuff = KeyPort;
KeyInBuff ^=0xff;
}
//=======================
//函数功能: 按键防抖;
//输入参数:KeyInBuff;输出参数: KeyCvtBuff
void KeyChk(void)
{
if(KeyInBuff==KeyChkBuff)
{
if(KeyInFlag==0)
return;
else
{
DeKeyTime();
if(KeyTimeBuff!=0)
return;
else
{
KeyInFlag = 0;
KeyCvtBuff = KeyChkBuff;
}
}
}
else
{
KeyChkBuff = KeyInBuff;
KeyTimeBuff = KeyTime;
KeyInFlag = 1;
}
}
//=========================================
//函数功能: 键值转换
//输入参数: KeyCvtBuff;输出参数:EventFIFO
void KeyCvt(void)
{
if(KeyCvtBuff==KeyOldBuff)
return;
else
{
KeyOldBuff = KeyCvtBuff;
//你想做的事,,,yeah~
}
}
//=====================================================
//函 数 名: DeKeyTime()
//功能描述: 按键防抖时间处理函数
void DeKeyTime(void)
{ uchar i;
i=50000;
while(i--)
{
if(KeyTimeBuff!=0)
KeyTimeBuff--;//调整键盘按下有效判定时间
}
}
(3)因此,在按键函数中调用这几个函数就行啦~
//=========================================
void MnKey(void)
{
KeyIn();
KeyChk();
KeyCvt();
}
硬件防抖可以通过触发器和电容。依博主之见:最快捷的办法就是通过电容消抖。
如下图所示:当按键松开的时候,单片机的引脚为高电平,当按键按下时,单片机的引脚为低电平。
和按键并联的电容作用就是消除按键的抖动。画个图来解释下这个电容的巨大的作用,就是:(这个抖动有点豪放,请不要介意,,,)
今天大家抢红包很嗨嘛~
今天本来没想写这,但是被这惹烦了,好几次快完工就莫名其妙刷了,给我一片空白,真是欲哭无泪,难道每次不能默认保存吗。。郁闷啊,是我不会玩还是这个现在有点坑。。囧。。临时换了一篇少点的内容。。写完就去抢红包了。。
明天看星爷的《美人鱼》,主动打个广告。。毕竟我俺心中的永远的男神啊。
祝大家新年快乐!年年有鱼@#¥%…………@@@@#¥¥%词穷中。。。。。囧。总之一切顺心。哈哈哈
用户1868903 2016-2-19 16:32
没有延时啊
用户377235 2016-2-18 19:30
按键延时函数占用mcu时间太多。
用户377235 2016-2-18 19:27