开关量扫描处理(消抖)
需要注意的是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;
   }
}
  
