首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

pic单片机有关问题

2013-02-25 
pic单片机问题pic16f1824单片机使用电平变化中断,只设置下降沿中断,结果按下按键和抬起按键都触发了中断,

pic单片机问题
pic16f1824单片机使用电平变化中断,只设置下降沿中断,结果按下按键和抬起按键都触发了中断,求指导!
           TRISB = 0xF0;// 全部配置为输入
        IOCBN = 0xF0;// RB口输入中断
         IOCBP = 0x00;

                if(IOCBF4 == 1)
{
IOCBF4 = 0;
current_key = KEY_UP;
}
else if(IOCBF5 == 1)
{
        IOCBF5 = 0;
current_key = KEY_DOWN;
}
[解决办法]
按下和抬起都要消抖。

最成熟的做法是使用一个变量记录按键的4种状态,再用另一个变量负责计数延时。

默认状态是0:按键没有操作。

1是按键正在被按下
2是按键被稳定按住
3是按键正在抬起

0状态监测到按键被按动则进入1状态。

1状态下,每隔一定的时间扫描一次按键状态,如果是按下的,计数+1。如果每1ms检测一次,那么累加到20左右就认为消抖成功,进入状态2。

如果有一次没有按下,则计数清0,并且退回到0状态。

2状态监测到按键抬起则进入3状态。

3状态进入0状态或者退回到2状态的做法参考1状态,只是电平相反。

这种做法可以把按下和抬起的消抖设置成不同时长。最重要的一点是效率非常高。你不用在一个地方死循环耗费时间。只需要隔一段时间执行几句代码即可。
[解决办法]
中断服务函数:{
中断disable;
清除标志位;
//设置flag;or do something;
适当延时;//很重要
中断enable;
}

热点排行