循环问题,怎么写这个状态循环


oid isr(void) __interrupt(1)

{

    static unsigned int i;
    if(INTFbits.T1IF)
    { 
        //PORTB ^= (1<<0);                    // PB1 Toggle
        INTF= (unsigned char)~(C_INT_TMR1);
    
        if(i>=500)
        {
            PB0 =1; PB1 =0; PB2 =0;
            PB0 =0; PB1 =1; PB2 =0;
            PB0 =0; PB1 =0; PB2 =1;
            i=0
            
            }
        else{
        i=i+1;
        }
     
      
    }

已有三个状态,怎么让它们一次只能有一个状态,之后循环下去?比如(红灯亮了,其余灯就熄灭,之后再到黄灯亮了,其余灯就熄灭,绿灯亮了,其余灯就熄灭,一直循环下去。)

PB0 = i % 3 == 0 ? 1 : 0;
PB1 = (i + 1) % 3 == 0 ? 1 : 0;
PB2 = (i + 2) % 3 == 0 ? 1 : 0;

【以下回答由 GPT 生成】

根据你的描述,你想要实现三个状态之间的循环,并且每次只有一个状态处于激活状态。基于你的代码,下面是一种可能的解决方案:

oid isr(void) __interrupt(1)
{
    static unsigned int i;
    static unsigned char state = 0;

    if (INTFbits.T1IF)
    {
        // 其他代码
        // ...

        switch (state)
        {
            case 0:
                PB0 = 1; PB1 = 0; PB2 = 0;
                break;
            case 1:
                PB0 = 0; PB1 = 1; PB2 = 0;
                break;
            case 2:
                PB0 = 0; PB1 = 0; PB2 = 1;
                break;
        }

        // 切换到下一个状态
        state = (state + 1) % 3;

        // 其他代码
        // ...
    }
}

上述代码使用了一个state变量来记录当前的状态。在每次中断触发时,根据state的值选择相应的状态,并切换到下一个状态。这样就可以实现三个状态之间的循环。

请注意,以上只是一种可能的解决方案,具体的实现方式还取决于你的需求和环境。如果你的问题不仅仅是切换状态,也可能涉及到其他复杂的逻辑处理,你可能需要提供更多关于这个程序的信息,以便我们能够给出更具体的解决方案。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这么写,供参考:

oid isr(void) __interrupt(1)
{
    static unsigned int  i = 0;
    static unsigned char state = 0;
    if(INTFbits.T1IF)
    {
        INTF = (unsigned char)~(C_INT_TMR1);
        i++;
        if(i >= 500) {
            state = (state + 1) % 3;
            i = 0;
        }
        switch (state){
            case 0: PB0 =1; PB1 =0; PB2 =0; break;
            case 1: PB0 =0; PB1 =1; PB2 =0; break;
            case 2: PB0 =0; PB1 =0; PB2 =1; break;
        }
    }
    //...........
}