C-Pic Counter问题

时间:2014-12-17 15:53:26

标签: c counter microcontroller pic

所以我使用的微型是PIC 18F。

如果 Alarm_Status.bits.b3 设置为基本上只是一个开关,则会创建一个警报。第一段代码按原样运行

BS(TRISB,7);                                // Bund sw port=input.
    DelayMs(2);                                 // will rise is bund SW open
    if(RB7){
        if(Control.bits.BUND_ENABLE){           // if bund alarm enabled
            if(Alarm_Status.bits.b3){           // if  already set
                DU_Reason.bits.EmergencyDialIn=1;   // alarm!
            }
        }
        Alarm_Status.bits.b3=0;                 // Bund Sw Open
    }
    else Alarm_Status.bits.b3=1;                // Bund Sw Closed
    BC(TRISB,7);

但是,我只想在开关设置一段时间而不是直接设置开关时发出警报。此功能每秒调用一次。任何人都可以指出我在出错的方向。

        int count = 0;
        int fixedCount = 20;
        BS(TRISB,7);                            // Bund sw port=input.
        DelayMs(2);                             // will rise is bund SW open
        if(RB7){                                
            if(Control.bits.BUND_ENABLE){       // if bund alarm enabled
                if(Alarm_Status.bits.b3){       // if  already set
                    count +=10;                 //count increased by 10
                }
                    if(count == fixedCount) {
                        DU_Reason.bits.EmergencyDialIn=1;// alarm!
                        count = 0;
                    }
            }
            Alarm_Status.bits.b3=0;             // Bund Sw Open
        }
        else
            count = 0;
            Alarm_Status.bits.b3=1;     // Bund Sw Closed
            BC(TRISB,7);    

1 个答案:

答案 0 :(得分:1)

您可以将count设为静态。当前代码出现问题,在每个实例之后,count会重新初始化为0,因此它永远不会达到fixedCount

如果您将代码修改为:

#define FIXED_COUNT 20    //Why to waste memory??

void PollSwitch()
{
    static int count = 0;

    BS(TRISB,7);                            // Bund sw port=input.
    DelayMs(2);                             // will rise is bund SW open

    if(RB7)
     {                                
       if(Control.bits.BUND_ENABLE){             // if bund alarm enabled
          if(Alarm_Status.bits.b3){       // if  already set
                        count +=10;                 //count increased by 10
             }
            if(count == FIXED_COUNT ) {
                 DU_Reason.bits.EmergencyDialIn=1;// alarm!
                 count = 0;
                 Alarm_Status.bits.b3=0;             //Alarm is raised, Open switch
              }
        }
               // Alarm_Status.bits.b3=0;          // Bund Sw Open <<< NOT NEEDED, IMO
     }
    else
     {
         count = 0;
         Alarm_Status.bits.b3=1;     // Bund Sw Closed
     }
        BC(TRISB,7);    
}