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;
}