开关量扫描处理(消抖)
需要注意的是DI_NUM_CHN不能超过8路
超过8路按照8路一组分开处理
void di_proc ( void ) //每1ms执行一次
{
INT8U i,shift;
INT8U tmp_di;
tmp_di= get_di(); //获取DI状态
shift=0x01; //从低位开始处理
for ( i=0;i<DI_NUM_CHN;i++) // 按照DI数量进行处理
{
if ( (tmp_di ^di[0]) & shift ) //读到的DI状态与保存的不一致,说明DI状态发生变化
{
if ( di_tmr[i]==0)
{
di_tmr[i]=10; //启动DI定时器 10ms
}
}
else //没有变化
{
di_tmr[i]=0;
}
shift <<=1;
}
shift=0x01; //从低位开始处理
for ( i=0;i<DI_NUM_CHN;i++)
{
if ( di_tmr[i] )
{
if (di_tmr[i]==1) //10ms定时到
{
di[0] ^= shift; //更新保存状态 ,这个地方是很巧妙的方法
//直接对相应的位取反就行了(因为有变化,所以取反就更新了变化)
di_tmr[i]=0;
}
else di_tmr[i]--; //定时器 --
}
shift <<=1;
}
}